diff --git a/PCK-Studio/Extensions/OpenTkMatrixExtensions.cs b/PCK-Studio/Extensions/OpenTkMatrixExtensions.cs new file mode 100644 index 00000000..312cce34 --- /dev/null +++ b/PCK-Studio/Extensions/OpenTkMatrixExtensions.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK; + +namespace PckStudio.Extensions +{ + internal static class OpenTkMatrixExtensions + { + internal static Matrix4 Pivoted(this Matrix4 target, Vector3 translation, Vector3 pivot) + { + var model = Matrix4.CreateTranslation(translation); + model *= Matrix4.CreateTranslation(pivot); + model *= target; + model *= Matrix4.CreateTranslation(pivot).Inverted(); + return model; + } + } +} diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 48bbb803..58cb2466 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -134,6 +134,7 @@ + diff --git a/PCK-Studio/Rendering/CubeGroupMesh.cs b/PCK-Studio/Rendering/CubeGroupMesh.cs index 10f76c49..b14948b6 100644 --- a/PCK-Studio/Rendering/CubeGroupMesh.cs +++ b/PCK-Studio/Rendering/CubeGroupMesh.cs @@ -136,12 +136,12 @@ namespace PckStudio.Rendering } } - private Matrix4 Transform + internal Matrix4 Transform { - get => Matrix4.CreateTranslation(Translation) * Matrix4.CreateTranslation(Pivot * 2); + get => Matrix4.Identity.Pivoted(Translation - Offset, Pivot + Offset); } - internal Vector3 GetWorldPosition(Vector3 localPosition) => Vector3.TransformPosition(localPosition, Transform); + internal Vector3 GetWorldPosition(Vector3 localPosition) => (Matrix4.CreateTranslation(localPosition) * Transform).Inverted().ExtractTranslation(); internal Vector3 GetCenter(int index) { @@ -157,14 +157,15 @@ namespace PckStudio.Rendering throw new IndexOutOfRangeException(); CubeMesh cube = cubes[index]; - return cube.GetBoundingBox(Transform); + var bb = cube.GetBoundingBox(); + return new BoundingBox(GetWorldPosition(bb.Start.ToOpenTKVector() * new Vector3(1, -1, -1)).ToNumericsVector(), GetWorldPosition(bb.End.ToOpenTKVector() * new Vector3(1, -1, -1)).ToNumericsVector()); } internal Vector3 GetFaceCenter(int index, Cube.Face face) { if (!cubes.IndexInRange(index)) throw new IndexOutOfRangeException(); - return GetWorldPosition(cubes[index].GetFaceCenter(face)); + return GetWorldPosition(cubes[index].GetFaceCenter(face) * new Vector3(1,-1,-1)); } internal void SetEnabled(int index, bool enable) diff --git a/PCK-Studio/Rendering/SkinRenderer.cs b/PCK-Studio/Rendering/SkinRenderer.cs index e48de7f8..42a44c9f 100644 --- a/PCK-Studio/Rendering/SkinRenderer.cs +++ b/PCK-Studio/Rendering/SkinRenderer.cs @@ -1040,7 +1040,8 @@ namespace PckStudio.Rendering { if (ANIM.GetFlag(SkinAnimFlag.DINNERBONE)) { - transform = Pivot(head.GetFaceCenter(0, Cube.Face.Top), Vector3.UnitY * 12f, transform * Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(-180f))); + transform *= Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(-180f)); + transform = transform.Pivoted(head.GetFaceCenter(0, Cube.Face.Top), Vector3.UnitY * 12f); } if (!ANIM.GetFlag(SkinAnimFlag.STATIC_ARMS)) @@ -1165,10 +1166,10 @@ namespace PckStudio.Rendering { case "ARM0": case "SLEEVE0": - return RightArmMatrix * armRightMatrix; + return armRightMatrix; case "ARM1": case "SLEEVE1": - return LeftArmMatrix * armLeftMatrix; + return armLeftMatrix; case "LEG0": case "PANTS0": return legRightMatrix; @@ -1181,9 +1182,7 @@ namespace PckStudio.Rendering } transform *= GetGroupTransform(box.Type); - Vector3 translation = cubeMesh.Translation - cubeMesh.Offset; - Vector3 pivot = cubeMesh.Pivot + cubeMesh.Offset; - transform = Pivot(translation, pivot, transform); + transform *= cubeMesh.Transform; GL.BlendFunc(BlendingFactor.DstAlpha, BlendingFactor.OneMinusSrcAlpha); DrawBoundingBox(transform, cubeBoundingBox, HighlightlingColor); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); @@ -1293,23 +1292,13 @@ namespace PckStudio.Rendering private void RenderPart(ShaderProgram shader, CubeGroupMesh cubeMesh, Matrix4 partMatrix, Matrix4 globalMatrix) { - Vector3 translation = cubeMesh.Translation - cubeMesh.Offset; - Vector3 pivot = cubeMesh.Pivot + cubeMesh.Offset; - Matrix4 transform = Pivot(translation, pivot, partMatrix); + Matrix4 transform = partMatrix; + transform *= cubeMesh.Transform; transform *= globalMatrix; shader.SetUniformMat4("u_Transform", ref transform); cubeMesh.Draw(shader); } - private static Matrix4 Pivot(Vector3 translation, Vector3 pivot, Matrix4 target) - { - var model = Matrix4.CreateTranslation(translation); - model *= Matrix4.CreateTranslation(pivot); - model *= target; - model *= Matrix4.CreateTranslation(pivot).Inverted(); - return model; - } - protected override void OnUpdate(object sender, TimestepEventArgs e) { base.OnUpdate(sender, e);