public void Draw(ref Matrix[] transformMatrices, ref SkinnedEffect skinnedEffect)
        {
            int totalInstances = transformMatrices.Length;
            BasicEffect effect = (BasicEffect)originalModel.Meshes[0].MeshParts[0].Effect;
            skinnedEffect.Texture = effect.Texture;

            graphicsDevice.SetVertexBuffer(instancedVertexBuffer);
            graphicsDevice.Indices = instancedIndexBuffer;

            for (int i = 0; i < totalInstances; i += maxInstances)
            {
                // How many instances can we fit into this batch?
                int instanceCount = totalInstances - i;

                if (instanceCount > maxInstances)
                    instanceCount = maxInstances;

                // Upload transform matrices as shader constants.
                Array.Copy(transformMatrices, i, tempMatrices, 0, instanceCount);

                // *transformMatrices[i];
                skinnedEffect.SetBoneTransforms(tempMatrices);

                foreach (EffectPass pass in skinnedEffect.CurrentTechnique.Passes)
                {
                    pass.Apply();

                    graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
                        instanceCount * originalVertexCount, 0, instanceCount * originalIndexCount / 3);
                }
            }
        }
示例#2
0
        public void Draw(Matrix[] transformMatrices, int totalInstances, SkinnedEffect skinnedEffect, Matrix view, Matrix proj, Texture2D skin)
        {
            skinnedEffect.EnableDefaultLighting();
            skinnedEffect.Texture = skin;
            skinnedEffect.View = view;
            skinnedEffect.Projection = proj;

            graphicsDevice.SetVertexBuffer(instancedVertexBuffer);
            graphicsDevice.Indices = instancedIndexBuffer;

            for (int i = 0; i < totalInstances; i += maxInstances)
            {
                // How many instances can we fit into this batch?
                int instanceCount = totalInstances - i;

                if (instanceCount > maxInstances)
                    instanceCount = maxInstances;

                // Upload transform matrices as shader constants.
                for (int copyIndex = 0; copyIndex < instanceCount; copyIndex++)
                    Utilities.CopyMatrix(ref transformMatrices[i + copyIndex], ref tempMatrices[copyIndex]);

                skinnedEffect.SetBoneTransforms(tempMatrices);

                foreach (EffectPass pass in skinnedEffect.CurrentTechnique.Passes)
                {
                    pass.Apply();
                    graphicsDevice.DrawIndexedPrimitives(
                        PrimitiveType.TriangleList,
                        0,
                        0,
                        instanceCount * originalVertexCount,
                        0,
                        instanceCount * originalIndexCount / 3);
                }
            }
        }
示例#3
0
 private void ApplyPerInstanceSkinned(SkinnedRenderable3D r, SkinnedEffect effect)
 {
     if (r.GetSkinTransforms() != null)
     {
         Matrix[] bones = r.GetSkinTransforms();
         effect.SetBoneTransforms(bones);
     }
     effect.View = RenderState.m_currentView.Peek();
     effect.Projection = RenderState.m_currentProj.Peek();
 }