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