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); } } }
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); } } }
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(); }