diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 8deecd2126..375647c9a8 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -148,7 +148,7 @@ bool LLVisualParamHint::needsRender() void LLVisualParamHint::preRender(bool clear_depth) { - LLViewerWearable* wearable = (LLViewerWearable*)mWearablePtr; + LLViewerWearable* wearable = dynamic_cast(mWearablePtr); if (wearable) { wearable->setVolatile(true); @@ -264,7 +264,7 @@ bool LLVisualParamHint::render() // [Legacy Bake] //mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight, false); - LLViewerWearable* wearable = (LLViewerWearable*)mWearablePtr; + LLViewerWearable* wearable = dynamic_cast(mWearablePtr); if (wearable) { wearable->setVolatile(false); diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 45f96efffe..7e36cec6c3 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -95,10 +95,10 @@ const S32 NUM_AXES = 3; // rotation Z 0-n // pivot parent 0-n -- child = n+1 -static LLMatrix4 gJointMatUnaligned[32]; -static LLMatrix4a gJointMatAligned[32]; -static LLMatrix3 gJointRotUnaligned[32]; -static LLVector4 gJointPivot[32]; +static LLMatrix4 gJointMatUnaligned[LL_CHARACTER_MAX_JOINTS_PER_MESH]; +static LLMatrix4a gJointMatAligned[LL_CHARACTER_MAX_JOINTS_PER_MESH]; +static LLMatrix3 gJointRotUnaligned[LL_CHARACTER_MAX_JOINTS_PER_MESH]; +static LLVector4 gJointPivot[LL_CHARACTER_MAX_JOINTS_PER_MESH]; //----------------------------------------------------------------------------- // uploadJointMatrices() @@ -111,7 +111,8 @@ void LLViewerJointMesh::uploadJointMatrices() bool hardware_skinning = (poolp && poolp->getShaderLevel() > 0); //calculate joint matrices - for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.size(); joint_num++) + size_t num_joints = llmin(reference_mesh->mJointRenderData.size(), LL_CHARACTER_MAX_JOINTS_PER_MESH); + for (joint_num = 0; joint_num < num_joints; joint_num++) { LLMatrix4 joint_mat = *reference_mesh->mJointRenderData[joint_num]->mWorldMatrix; @@ -137,12 +138,20 @@ void LLViewerJointMesh::uploadJointMatrices() LLVector4 parent_pivot(sj->mRootToParentJointSkinOffset); parent_pivot.mV[VW] = 0.f; gJointPivot[j++] = parent_pivot; + if (j >= LL_CHARACTER_MAX_JOINTS_PER_MESH) + { + break; + } } LLVector4 child_pivot(sj->mRootToJointSkinOffset); child_pivot.mV[VW] = 0.f; gJointPivot[j++] = child_pivot; + if (j >= LL_CHARACTER_MAX_JOINTS_PER_MESH) + { + break; + } last_pivot_uploaded = true; } @@ -167,7 +176,7 @@ void LLViewerJointMesh::uploadJointMatrices() GLfloat mat[45*4]; memset(mat, 0, sizeof(GLfloat)*45*4); - for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.size(); joint_num++) + for (joint_num = 0; joint_num < num_joints; joint_num++) { gJointMatUnaligned[joint_num].transpose(); @@ -188,7 +197,7 @@ void LLViewerJointMesh::uploadJointMatrices() else { //load gJointMatUnaligned into gJointMatAligned - for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.size(); ++joint_num) + for (joint_num = 0; joint_num < num_joints; ++joint_num) { gJointMatAligned[joint_num].loadu(gJointMatUnaligned[joint_num]); } @@ -222,6 +231,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, bool first_pass, bool is_dummy) if (!mValid || !mMesh || !mFace || !mVisible || !mFace->getVertexBuffer() || mMesh->getNumFaces() == 0 || + mMesh->mFaceVertexCount == 0 || LLGLSLShader::sCurBoundShaderPtr == NULL) { return 0; @@ -293,7 +303,8 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, bool first_pass, bool is_dummy) if (mMesh->hasWeights()) { - if ((mFace->getPool()->getShaderLevel() > 0)) + LLDrawPool* poolp = mFace->getPool(); + if (poolp && (poolp->getShaderLevel() > 0)) { if (first_pass) {