Action::ResultE CPUSkinningAlgorithm::renderEnter(Action *action) { Action::ResultE res = Action::Continue; SkinnedGeometry *skinGeo = getSkin (); Skeleton *skel = getSkeleton(); RenderAction *ract = boost::polymorphic_downcast<RenderAction *>(action); OSG_ASSERT(skinGeo != NULL); OSG_ASSERT(skel != NULL); CPUSkinningDataAttachmentUnrecPtr data = getCPUSkinningData(skinGeo); if(data == NULL) { data = CPUSkinningDataAttachment::create(); skinGeo->addAttachment(data); } skel->renderEnter(action, skinGeo); if(data->getDataValid() == false) { transformGeometry(skinGeo, skel, data); data->setDataValid(true); } renderGeometry(ract, skinGeo, data); return res; }
Action::ResultE SkeletonSkinningAlgorithm::renderEnter(Action *action) { Action::ResultE res = Action::Continue; RenderAction *ract = boost::polymorphic_downcast<RenderAction *>(action); SkinnedGeometry *skinGeo = getSkin(); Skeleton *skel = skinGeo->getSkeleton(); skel->renderEnter(action, skinGeo); const Skeleton::MFJointsType *joints = skel->getMFJoints(); const Skeleton::MFParentJointsType *parentJoints = skel->getMFParentJoints(); const Skeleton::MFJointMatricesType *jointMats = skel->getMFJointMatrices(); UInt32 numJoints = joints->size32(); #ifndef OSG_SKELETON_SKINNING_ALGO_DRAW_AXIS _mfDrawPositions.resize(numJoints); _mfDrawIndex .clear ( ); for(UInt32 i = 0; i < numJoints; ++i) { (*jointMats)[i].mult(Pnt3f(0.f, 0.f, 0.f), _mfDrawPositions[i] ); if((*parentJoints)[i] != NULL) { _mfDrawIndex.push_back(i ); _mfDrawIndex.push_back((*parentJoints)[i]->getJointId()); } } #else Real32 axisLen = 1.f; _mfDrawPositions.resize(4 * numJoints); _mfDrawIndex .clear ( ); for(UInt32 i = 0; i < numJoints; ++i) { (*jointMats)[i].mult(Pnt3f(0.f, 0.f, 0.f), _mfDrawPositions[4 * i + 0]); if((*parentJoints)[i] != NULL) { _mfDrawIndex.push_back(4 * i + 0); _mfDrawIndex.push_back(4 * (*parentJoints)[i]->getJointId() + 0); Vec3f vec = _mfDrawPositions[4 * i + 0] - _mfDrawPositions[4 * (*parentJoints)[i]->getJointId() + 0]; axisLen = 0.2f * vec.length(); axisLen = 1.f; } else { axisLen = 1.f; } (*jointMats)[i].mult( Pnt3f(axisLen, 0.f, 0.f ), _mfDrawPositions[4 * i + 1]); (*jointMats)[i].mult( Pnt3f(0.f, axisLen, 0.f ), _mfDrawPositions[4 * i + 2]); (*jointMats)[i].mult( Pnt3f(0.f, 0.f, axisLen), _mfDrawPositions[4 * i + 3]); _mfDrawIndex.push_back(4 * i + 0); _mfDrawIndex.push_back(4 * i + 1); _mfDrawIndex.push_back(4 * i + 0); _mfDrawIndex.push_back(4 * i + 2); _mfDrawIndex.push_back(4 * i + 0); _mfDrawIndex.push_back(4 * i + 3); } #endif // #ifndef OSG_SKELETON_SKINNING_ALGO_DRAW_AXIS DrawEnv::DrawFunctor drawFuncSkinAlgo = boost::bind(&SkeletonSkinningAlgorithm::drawFunc, this, _1); PrimeMaterial *skelMat = getDefaultUnlitMaterial(); State *state = skelMat->getState (); ract->dropFunctor(drawFuncSkinAlgo, state, skelMat->getSortKey()); return res; }
Action::ResultE GPUSkinningAlgorithm::renderEnter(Action *action) { Action::ResultE res = Action::Continue; SkinnedGeometry *skinGeo = getSkin (); Skeleton *skel = getSkeleton(); RenderAction *ract = boost::polymorphic_downcast<RenderAction *>(action); OSG_ASSERT(skinGeo != NULL); OSG_ASSERT(skel != NULL); GPUSkinningDataAttachmentUnrecPtr data = getGPUSkinningData(skel); if(data == NULL) { data = GPUSkinningDataAttachment::create(); skel->addAttachment(data); } skel->renderEnter(action, skinGeo); ShaderProgramChunkUnrecPtr shCode = data->getShaderCode(); if(shCode == NULL) { shCode = ShaderProgramChunk::create(); data->setShaderCode(shCode); ShaderProgramUnrecPtr vp = ShaderProgram::createVertexShader(); vp->setProgram(_vpVertexSkinning); shCode->addShader(vp); vp->addUniformVariable( "matJoints", (*skel->getMFJointMatrices())); vp->addUniformVariable( "matBindShape", skinGeo->getBindShapeMatrix()); } else if(data->getDataValid() == false) { ShaderProgram *vp = shCode->getVertexShader(0); OSG_ASSERT(vp != NULL); vp->updateUniformVariable( "matJoints", (*skel->getMFJointMatrices())); vp->updateUniformVariable( "matBindShape", skinGeo->getBindShapeMatrix()); data->setDataValid(true); } ract->pushState(); { ract->addOverride(ShaderProgramChunk::getStaticClassId(), shCode ); res = skinGeo->SkinnedGeometry::Inherited::renderEnter(ract); } ract->popState (); return res; }