public override BoundingBox GetBoundingBox(GameObject parent, Matrix localTransformations, Matrix worldTransformations) { Vector3 min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); Vector3 max = new Vector3(float.MinValue, float.MinValue, float.MinValue); Matrix[] boneTransforms = new Matrix[bones.Count]; for (int i = 0; i < bones.Count; ++i) { Bone bone = bones[i]; bone.ComputeAbsoluteTransform(); boneTransforms[i] = bone.AbsoluteTransform; } Matrix[] skeleton = new Matrix[modelExtra.Skeleton.Count]; for (int i = 0; i < modelExtra.Skeleton.Count; ++i) { Bone bone = bones[modelExtra.Skeleton[i]]; skeleton[i] = bone.SkinTransform * bone.AbsoluteTransform; } Matrix[] transforms = new Matrix[model.Bones.Count]; //System.Diagnostics.Debug.WriteLine(model.Bones.Count); model.CopyAbsoluteBoneTransformsTo(transforms); int count = 0; foreach (ModelMesh mesh in model.Meshes) { foreach (ModelMeshPart meshPart in mesh.MeshParts) { int vertexStride = meshPart.VertexBuffer.VertexDeclaration.VertexStride; int vertexBufferSize = meshPart.NumVertices * vertexStride; float[] vertexData = new float[vertexBufferSize / sizeof(float)]; meshPart.VertexBuffer.GetData <float>(vertexData); for (int i = 0; i < vertexBufferSize / sizeof(float); i += vertexStride / sizeof(float)) { Vector3 currPosition = new Vector3(vertexData[i], vertexData[i + 1], vertexData[i + 2]); if (isColliderDynamicUpdateEnabled) { currPosition = Vector3.Transform(currPosition, skeleton[count] * worldTransformations); } else { currPosition = Vector3.Transform(currPosition, worldTransformations * transforms[mesh.ParentBone.Index]); } min = Vector3.Min(min, currPosition); max = Vector3.Max(max, currPosition); } } count++; } return(new BoundingBox(min, max)); }
public override void Draw(GameObject parent, Camera camera, Matrix localTransformations, Matrix worldTransformations, bool createShadowMap = false) { if (model == null) { return; } Matrix[] boneTransforms = new Matrix[bones.Count]; for (int i = 0; i < bones.Count; ++i) { Bone bone = bones[i]; bone.ComputeAbsoluteTransform(); boneTransforms[i] = bone.AbsoluteTransform; } Matrix[] skeleton = new Matrix[modelExtra.Skeleton.Count]; for (int i = 0; i < modelExtra.Skeleton.Count; ++i) { Bone bone = bones[modelExtra.Skeleton[i]]; skeleton[i] = bone.SkinTransform * bone.AbsoluteTransform; } string techniqueName = createShadowMap ? "CreateShadowMap" : "Draw"; foreach (ModelMesh modelMesh in model.Meshes) { foreach (ModelMeshPart part in modelMesh.MeshParts) { part.Effect = modelEffect; modelEffect.CurrentTechnique = modelEffect.Techniques[techniqueName]; modelEffect.Parameters["World"].SetValue(worldTransformations); modelEffect.Parameters["View"].SetValue(camera.ViewMatrix); modelEffect.Parameters["Projection"].SetValue(camera.ProjectionMatrix); modelEffect.Parameters["WorldInverseTranspose"].SetValue(Matrix.Transpose(Matrix.Invert(worldTransformations))); modelEffect.Parameters["Bones"].SetValue(skeleton); modelEffect.Parameters["ViewVector"].SetValue(camera.GetViewVector()); SetShadingParameters(createShadowMap); } modelMesh.Draw(); DrawBoundingBox(parent, localTransformations, worldTransformations, camera); } }
/// <summary> /// Draw the model /// </summary> public void Draw(Matrix world, Matrix view, Matrix viewProjection, Vector3 cameraPosition, AnimatedModelShader _skinnedShader, AnimatedModelShader.EffectPasses pass, bool computeTransform) { if (model == null) { return; } // // Compute all of the bone absolute transforms // if (modelExtra != null && hasSkinnedVertexType && hasNormals && hasTexCoords) { if (computeTransform) { for (int i = 0; i < bones.Count; i++) { Bone bone = bones[i]; bone.ComputeAbsoluteTransform(); boneTransforms[i] = bone.AbsoluteTransform; } for (int s = 0; s < modelExtra.Skeleton.Count; s++) { Bone bone = bones[modelExtra.Skeleton[s]]; skeleton[s] = bone.SkinTransform * bone.AbsoluteTransform; } } if (bones.Count > 1) { switch (pass) { case AnimatedModelShader.EffectPasses.Unskinned: pass = AnimatedModelShader.EffectPasses.Skinned; break; case AnimatedModelShader.EffectPasses.UnskinnedNormalMapped: pass = AnimatedModelShader.EffectPasses.SkinnedNormalMapped; break; case AnimatedModelShader.EffectPasses.UnskinnedDepth: pass = AnimatedModelShader.EffectPasses.SkinnedDepth; break; } } _skinnedShader.DrawMesh(model, world, view, viewProjection, cameraPosition, pass, skeleton); } else { if (!hasNormals) { pass = AnimatedModelShader.EffectPasses.NoNormalUnskinned; } if (!hasTexCoords) { pass = AnimatedModelShader.EffectPasses.NoNormalNoTexUnskinned; } _skinnedShader.DrawMesh(model, world, view, viewProjection, cameraPosition, pass, null); } //// Draw the model. //foreach (ModelMesh modelMesh in model.Meshes) //{ // foreach (Effect effect in modelMesh.Effects) // { // if (effect is BasicEffect) // { // BasicEffect beffect = effect as BasicEffect; // beffect.World = boneTransforms[modelMesh.ParentBone.Index] * world; // beffect.View = camera.View; // beffect.Projection = camera.Projection; // beffect.EnableDefaultLighting(); // beffect.PreferPerPixelLighting = true; // } // if (effect is SkinnedEffect) // { // SkinnedEffect seffect = effect as SkinnedEffect; // seffect.World = boneTransforms[modelMesh.ParentBone.Index] * world; // seffect.View = camera.View; // seffect.Projection = camera.Projection; // seffect.EnableDefaultLighting(); // seffect.PreferPerPixelLighting = true; // seffect.SetBoneTransforms(skeleton); // } // } // modelMesh.Draw(); //} }