void DiInstanceBatch::Update(DiCamera* camera) { mCurrentCamera = camera; mDirtyAnimation = false; UpdateVisibility(); mPrimitiveCount = mMeshReference->GetSubMesh(mCreator->mSubMeshIdx)->GetPrimitiveCount(); mPrimitiveCount *= GetModelNums(); if (mVisible) { if (HasSkeleton()) { auto itor = mInstancedModels.begin(); auto end = mInstancedModels.end(); while (itor != end) { mDirtyAnimation |= (*itor)->UpdateAnimation(); ++itor; } } mAddToBatch = true; } mVisible = true; }
void DiInstanceBatch::CullingUpdate( DiRenderBatchGroup* group, DiCamera* ) { mDirtyAnimation = false; UpdateVisibility(); mPrimitiveCount = mMeshReference->GetSubMesh(mCreator->mSubMeshIdx)->GetPrimitiveCount(); mPrimitiveCount *= GetModelNums(); if( mVisible ) { if (HasSkeleton()) { InstancedModelVec::const_iterator itor = mInstancedModels.begin(); InstancedModelVec::const_iterator end = mInstancedModels.end(); while( itor != end ) { mDirtyAnimation |= (*itor)->UpdateAnimation(); ++itor; } } group->AddRenderUnit( this ); } mVisible = true; }
void DiInstanceBatchShader::BuildFrom( const DiSubMesh *baseSubMesh ) { if( HasSkeleton() ) { m_usNumWorldMatrices = mInstancesPerBatch * baseSubMesh->GetBlendIndexToBoneIndexMap().size(); } DiInstanceBatch::BuildFrom( baseSubMesh ); }
DiSkeleton* DiInstanceBatch::GetSkeleton() { if (!HasSkeleton()) { return NULL; } return mMotionReference->GetSkeleton(); }
uint32 DiInstanceBatchShader::CalculateMaxNumInstances( const DiSubMesh *baseSubMesh ) const { uint32 numBones = 1; if (HasSkeleton()) { numBones = DiMath::Max( 1, mMotionReference->GetSkeleton()->GetNumBones()); } return MAX_BONE_NUM / numBones; }
void DiInstanceBatchShader::SetupVertices( const DiSubMesh* baseSubMesh ) { mRemoveOwnVertexData = true; mVerticesNum = baseSubMesh->GetVerticeNum() * mInstancesPerBatch; if( HasSkeleton() ) { SetupHardwareSkinned( baseSubMesh ); } else { SetupNoSkinned( baseSubMesh ); } }
DiSkeleton* DiInstanceBatch::GetSkeleton() { return HasSkeleton()? mMotionReference->GetSkeleton():nullptr; }