Exemple #1
0
        public static void Freeze(ModelMesh model, FreezeComponents flags)
        {
            bool freezePos = flags.HasFlag(FreezeComponents.Position);
            bool freezeRot = flags.HasFlag(FreezeComponents.Rotation);
            bool freezeSca = flags.HasFlag(FreezeComponents.Scale);

            Matrix4D mPosition = Matrix4D.CreateTranslation(model.Parent.Transform.ExtractTranslation());
            Matrix4D mRotation = Matrix4D.CreateFromQuaternion(model.Parent.Transform.ExtractRotation());
            Matrix4D mScale    = Matrix4D.CreateScale(model.Parent.Transform.ExtractScale());

            if (freezePos)
            {
                model.Parent.Transform = model.Parent.Transform.ClearTranslation();
            }
            if (freezeRot)
            {
                model.Parent.Transform = model.Parent.Transform.ClearRotation();
            }
            if (freezeSca)
            {
                model.Parent.Transform = model.Parent.Transform.ClearScale();
            }

            foreach (ModelMeshPart meshpart in model.MeshParts)
            {
                for (int i = 0; i < meshpart.VertexCount; i++)
                {
                    if (freezePos)
                    {
                        meshpart.VertexBuffer.ModifyVertexPosition(i, Vector3.TransformVector(meshpart.VertexBuffer.Data[i].Position, mPosition));
                    }

                    if (freezeRot)
                    {
                        meshpart.VertexBuffer.ModifyVertexPosition(i, Vector3.TransformVector(meshpart.VertexBuffer.Data[i].Position, mRotation));
                        meshpart.VertexBuffer.ModifyVertexNormal(i, Vector3.TransformNormal(meshpart.VertexBuffer.Data[i].Normal, mRotation));
                    }

                    if (freezeSca)
                    {
                        meshpart.VertexBuffer.ModifyVertexPosition(i, Vector3.TransformVector(meshpart.VertexBuffer.Data[i].Position, mScale));
                    }
                }

                meshpart.VertexBuffer.Initialise();
            }

            model.BoundingBox.Calculate(model);
        }
        public static void Freeze(ModelMesh model, FreezeComponents flags)
        {
            bool bFreezePos = ((flags & FreezeComponents.Position) == FreezeComponents.Position);
            bool bFreezeRot = ((flags & FreezeComponents.Rotation) == FreezeComponents.Rotation);
            bool bFreezeSca = ((flags & FreezeComponents.Scale) == FreezeComponents.Scale);

            var mPosition = Matrix4.CreateTranslation(model.Parent.Transform.ExtractTranslation());
            var mRotation = Matrix4.CreateFromQuaternion(model.Parent.Transform.ExtractRotation());
            var mScale = Matrix4.CreateScale(model.Parent.Transform.ExtractScale());

            if (bFreezePos) { model.Parent.Transform = model.Parent.Transform.ClearTranslation(); }
            if (bFreezeRot) { model.Parent.Transform = model.Parent.Transform.ClearRotation(); }
            if (bFreezeSca) { model.Parent.Transform = model.Parent.Transform.ClearScale(); }

            foreach (var meshpart in model.MeshParts)
            {
                for (int i = 0; i < meshpart.VertexCount; i++)
                {
                    if (bFreezePos) { meshpart.VertexBuffer.ModifyVertexPosition(i, Vector3.Transform(meshpart.VertexBuffer.Data[i].Position, mPosition)); }
                    if (bFreezeRot)
                    {
                        meshpart.VertexBuffer.ModifyVertexPosition(i, Vector3.Transform(meshpart.VertexBuffer.Data[i].Position, mRotation));
                        meshpart.VertexBuffer.ModifyVertexNormal(i, Vector3.TransformNormal(meshpart.VertexBuffer.Data[i].Normal, mRotation));
                    }
                    if (bFreezeSca) { meshpart.VertexBuffer.ModifyVertexPosition(i, Vector3.Transform(meshpart.VertexBuffer.Data[i].Position, mScale)); }
                }

                meshpart.VertexBuffer.Initialise();
            }

            model.BoundingBox.Calculate(model);
        }