Exemple #1
0
    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;
    }
Exemple #2
0
    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 );
 }
Exemple #4
0
 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 );
        }
    }
Exemple #7
0
 DiSkeleton* DiInstanceBatch::GetSkeleton()
 {
     return HasSkeleton()? mMotionReference->GetSkeleton():nullptr;
 }