コード例 #1
0
ファイル: ModelAnimatedComponent.cs プロジェクト: Kasyene/PBL
        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));
        }
コード例 #2
0
ファイル: ModelAnimatedComponent.cs プロジェクト: Kasyene/PBL
        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);
            }
        }
コード例 #3
0
ファイル: AnimatedModel.cs プロジェクト: yivoDev/Modelviewer
        /// <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();
            //}
        }