Merge pull request #2600 from secondlife/brad/1016-cherry-pick

cherry-pick viewer#1016 Incorrect behavior of Physics Shapes rendering
meow-7.2.2
Brad Linden 2024-09-18 13:44:22 -07:00 committed by GitHub
commit 1dcbae822d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 10 deletions

View File

@ -9,3 +9,5 @@ a0b3021bdcf76859054fda8e30abb3ed47749e83
1b67dd855c41f5a0cda7ec2a68d98071986ca703
6cc7dd09d5e69cf57e6de7fb568a0ad2693f9c9a
e2e37cced861b98de8c1a7c9c0d3a50d2d90e433
# multiple problems
5370a6d323e14d7b4e32a3f41ef78f7744e361c5

View File

@ -28,6 +28,26 @@
#include "llphysicsshapebuilderutil.h"
#include "llmeshrepository.h"
bool LLPhysicsVolumeParams::hasDecomposition() const
{
if (!isMeshSculpt())
{
return false;
}
LLUUID mesh_id = getSculptID();
if (mesh_id.isNull())
{
return false;
}
LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
return decomp != NULL;
}
/* static */
void LLPhysicsShapeBuilderUtil::determinePhysicsShape( const LLPhysicsVolumeParams& volume_params, const LLVector3& scale, PhysicsShapeSpecification& specOut)
{
@ -200,19 +220,32 @@ void LLPhysicsShapeBuilderUtil::determinePhysicsShape( const LLPhysicsVolumePara
{
specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
}
else if (volume_params.isMeshSculpt() &&
// Check overall dimensions, not individual triangles.
(scale.mV[0] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE ||
scale.mV[1] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE ||
scale.mV[2] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
) )
else if (volume_params.isMeshSculpt())
{
// Server distinguishes between user-specified or default convex mesh, vs server's thin-triangle override, but we don't.
specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
// Check overall dimensions, not individual triangles.
if (scale.mV[0] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
|| scale.mV[1] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
|| scale.mV[2] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
)
{
if (volume_params.hasDecomposition())
{
specOut.mType = PhysicsShapeSpecification::USER_MESH;
}
else
{
// Server distinguishes between user-specified or default convex mesh, vs server's thin-triangle override, but we don't.
specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
}
}
else
{
specOut.mType = PhysicsShapeSpecification::USER_MESH;
}
}
else if ( volume_params.isSculpt() ) // Is a sculpt of any kind (mesh or legacy)
else if ( volume_params.isSculpt() )
{
specOut.mType = volume_params.isMeshSculpt() ? PhysicsShapeSpecification::USER_MESH : PhysicsShapeSpecification::SCULPT;
specOut.mType = PhysicsShapeSpecification::SCULPT;
}
else // Resort to mesh
{

View File

@ -79,6 +79,8 @@ public:
bool shouldForceConvex() const { return mForceConvex; }
bool hasDecomposition() const;
private:
bool mForceConvex;
};