diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 736edec3..35e5d6a6 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -152,7 +152,8 @@ - + + diff --git a/PCK-Studio/Rendering/Cube.cs b/PCK-Studio/Rendering/Cube.cs new file mode 100644 index 00000000..d41d2386 --- /dev/null +++ b/PCK-Studio/Rendering/Cube.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ICSharpCode.SharpZipLib.Zip.Compression; +using OpenTK; +using PckStudio.Extensions; +using PckStudio.Internal; + +namespace PckStudio.Rendering +{ + internal class Cube + { + internal Vector3 Position + { + get => _position; + set => _position = value; + } + + internal Vector3 Size + { + get => _size; + set => _size = value; + } + + internal Vector2 Uv + { + get => _uv; + set => _uv = value; + } + + internal float Inflate + { + get => _inflate; + set => _inflate = value; + } + + internal bool MirrorTexture + { + get => _mirrorTexture; + set => _mirrorTexture = value; + } + + internal bool FlipZMapping + { + get => _flipZMapping; + set => _flipZMapping = value; + } + + public Vector3 Center => Position + Size / 2f; + + internal enum Face + { + Back, + Front, + Top, + Bottom, + Left, + Right + } + + internal static Cube FromSkinBox(SkinBOX skinBOX) + { + return new Cube(skinBOX.Pos.ToOpenTKVector(), skinBOX.Size.ToOpenTKVector(), skinBOX.UV.ToOpenTKVector(), skinBOX.Scale, skinBOX.Mirror, skinBOX.Type == "HEAD" || skinBOX.Type == "HEADWEAR"); + } + + public Cube() { } + + public Cube(Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping) + { + _position = position; + _size = size; + _uv = uv; + _inflate = inflate; + _mirrorTexture = mirrorTexture; + _flipZMapping = flipZMapping; + } + + public Vector3 GetFaceCenter(Face face) + { + var result = Center; + switch (face) + { + case Face.Top: + result.Y -= Size.Y / 2f; + return result; + case Face.Bottom: + result.Y += Size.Y / 2f; + return result; + case Face.Back: + result.Z -= Size.Z / 2f; + return result; + case Face.Front: + result.Z += Size.Z / 2f; + return result; + case Face.Left: + result.X -= Size.X / 2f; + return result; + case Face.Right: + result.X += Size.X / 2f; + return result; + default: + return result; + } + } + + public BoundingBox GetBoundingBox() + { + Vector3 halfSize = Size / 2f; + Vector3 halfSizeInflated = halfSize + new Vector3(Inflate); + Vector3 start = Center - halfSizeInflated; + Vector3 end = Center + halfSizeInflated; + return new BoundingBox(start, end); + } + + + protected Vector3 _position = Vector3.Zero; + protected Vector3 _size = Vector3.One; + protected Vector2 _uv = Vector2.Zero; + protected float _inflate = 0f; + protected bool _mirrorTexture = false; + protected bool _flipZMapping = false; + } +} diff --git a/PCK-Studio/Rendering/CubeGroupMesh.cs b/PCK-Studio/Rendering/CubeGroupMesh.cs index 19b70319..6beb3ef9 100644 --- a/PCK-Studio/Rendering/CubeGroupMesh.cs +++ b/PCK-Studio/Rendering/CubeGroupMesh.cs @@ -27,7 +27,7 @@ namespace PckStudio.Rendering { internal class CubeGroupMesh : GenericMesh { - private List cubes; + private List cubes; public float Inflate { get; set; } = 0f; public Vector3 Translation { get; set; } = Vector3.Zero; @@ -36,7 +36,7 @@ namespace PckStudio.Rendering internal CubeGroupMesh(string name) : base(name, PrimitiveType.Triangles) { - cubes = new List(5); + cubes = new List(5); } internal CubeGroupMesh(string name, float inflate) @@ -47,9 +47,7 @@ namespace PckStudio.Rendering internal void AddSkinBox(SkinBOX skinBox) { - AddCube(skinBox.Pos.ToOpenTKVector(), skinBox.Size.ToOpenTKVector(), skinBox.UV.ToOpenTKVector(), skinBox.Scale + Inflate, skinBox.Mirror, - skinBox.Type == "HEAD" || - skinBox.Type == "HEADWEAR"); + cubes.Add(CubeMesh.Create(skinBox)); } internal void ClearData() @@ -61,6 +59,7 @@ namespace PckStudio.Rendering /// /// Uploads MeshData /// + // TODO: rename function internal void UploadData() { ResetBuffers(); @@ -80,10 +79,19 @@ namespace PckStudio.Rendering internal void AddCube(Vector3 position, Vector3 size, Vector2 uv, float inflate = 0f, bool mirrorTexture = false, bool flipZMapping = false) { - var cube = new CubeData(position, size, uv, Inflate + inflate, mirrorTexture, flipZMapping); + var cube = new CubeMesh(position, size, uv, Inflate + inflate, mirrorTexture, flipZMapping); cubes.Add(cube); } + internal void RemoveCube(int index) + { + if (!cubes.IndexInRange(index)) + throw new IndexOutOfRangeException(); + + cubes.RemoveAt(index); + UploadData(); + } + internal void ReplaceCube(int index, Vector3 position, Vector3 size, Vector2 uv, float inflate = 0f, bool mirrorTexture = false) { if (!cubes.IndexInRange(index)) @@ -113,7 +121,7 @@ namespace PckStudio.Rendering if (!cubes.IndexInRange(index)) throw new IndexOutOfRangeException(); - return cubes[index].Center + Transform; + return cubes[index].Center + Transform + Offset; } internal OutlineDefinition GetOutline(int index) @@ -121,13 +129,13 @@ namespace PckStudio.Rendering if (!cubes.IndexInRange(index)) throw new IndexOutOfRangeException(); - CubeData cube = cubes[index]; + CubeMesh cube = cubes[index]; OutlineDefinition outline = cube.GetOutline(); outline.verticies = outline.verticies.Select(pos => pos + Transform).ToArray(); return outline; } - internal Vector3 GetFaceCenter(int index, CubeData.CubeFace face) + internal Vector3 GetFaceCenter(int index, Cube.Face face) { if (!cubes.IndexInRange(index)) throw new IndexOutOfRangeException(); diff --git a/PCK-Studio/Rendering/CubeData.cs b/PCK-Studio/Rendering/CubeMesh.cs similarity index 84% rename from PCK-Studio/Rendering/CubeData.cs rename to PCK-Studio/Rendering/CubeMesh.cs index c09dc402..77c05996 100644 --- a/PCK-Studio/Rendering/CubeData.cs +++ b/PCK-Studio/Rendering/CubeMesh.cs @@ -21,14 +21,16 @@ using System.Diagnostics; using System.Drawing; using System.Linq; using OpenTK; +using PckStudio.Extensions; +using PckStudio.Internal; namespace PckStudio.Rendering { - internal class CubeData + internal class CubeMesh : Cube { internal bool ShouldRender { get; set; } = true; - internal Vector3 Position + internal new Vector3 Position { get => _position; set @@ -41,7 +43,7 @@ namespace PckStudio.Rendering } } - internal Vector3 Size + internal new Vector3 Size { get => _size; set @@ -54,7 +56,7 @@ namespace PckStudio.Rendering } } - internal Vector2 Uv + internal new Vector2 Uv { get => _uv; set @@ -67,7 +69,7 @@ namespace PckStudio.Rendering } } - internal float Inflate + internal new float Inflate { get => _inflate; set @@ -80,7 +82,7 @@ namespace PckStudio.Rendering } } - internal bool MirrorTexture + internal new bool MirrorTexture { get => _mirrorTexture; set @@ -93,7 +95,7 @@ namespace PckStudio.Rendering } } - internal bool FlipZMapping + internal new bool FlipZMapping { get => _flipZMapping; set @@ -106,46 +108,6 @@ namespace PckStudio.Rendering } } - internal Vector3 Center => Position + Size / 2f; - - internal enum CubeFace - { - Back, - Front, - Top, - Bottom, - Left, - Right - } - - internal Vector3 GetFaceCenter(CubeFace face) - { - var result = Center; - switch (face) - { - case CubeFace.Top: - result.Y -= Size.Y / 2f; - return result; - case CubeFace.Bottom: - result.Y += Size.Y / 2f; - return result; - case CubeFace.Back: - result.Z -= Size.Z / 2f; - return result; - case CubeFace.Front: - result.Z += Size.Z / 2f; - return result; - case CubeFace.Left: - result.X -= Size.X / 2f; - return result; - case CubeFace.Right: - result.X += Size.X / 2f; - return result; - default: - return result; - } - } - internal OutlineDefinition GetOutline() { List verts = new List(); @@ -193,18 +155,6 @@ namespace PckStudio.Rendering return outline; } - private void UpdateVertices() - { - vertices = GetCubeVertexData(); - } - - private Vector3 _position = Vector3.Zero; - private Vector3 _size = Vector3.One; - private Vector2 _uv = Vector2.Zero; - private float _inflate = 0f; - private bool _mirrorTexture = false; - private bool _flipZMapping = false; - private static int[] indicesData = [ // Face 1 (Back) 0, 1, 2, @@ -228,16 +178,14 @@ namespace PckStudio.Rendering private TextureVertex[] vertices; - /// - /// - /// /// /// /// /// /// /// Flips the bottom face mapping of the uv mapping - public CubeData(bool enabled, Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping) + public CubeMesh(bool enabled, Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping) + : base() { ShouldRender = enabled; Position = position; @@ -258,11 +206,16 @@ namespace PckStudio.Rendering /// /// /// Flips the bottom face mapping of the uv mapping - public CubeData(Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping) + public CubeMesh(Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping) : this(true, position, size, uv, inflate, mirrorTexture, flipZMapping) { } + public CubeMesh(Cube cube) + : this(cube.Position, cube.Size, cube.Uv, cube.Inflate, cube.MirrorTexture, cube.FlipZMapping) + { + } + private TextureVertex[] GetCubeVertexData() { int mirror = MirrorTexture ? 1 : 0; @@ -270,11 +223,9 @@ namespace PckStudio.Rendering Vector2 uv = Uv; - Vector3 halfSize = Size / 2f; - Vector3 halfSizeInflated = halfSize + new Vector3(Inflate); - - Vector3 from = Center - halfSizeInflated; - Vector3 to = Center + halfSizeInflated; + BoundingBox boundingBox = GetBoundingBox(); + Vector3 from = boundingBox.Start; + Vector3 to = boundingBox.End; var back = new TextureVertex[] { @@ -335,6 +286,11 @@ namespace PckStudio.Rendering return vertices.ToArray(); } + private void UpdateVertices() + { + vertices = GetCubeVertexData(); + } + internal TextureVertex[] GetVertices() { return vertices; @@ -344,5 +300,10 @@ namespace PckStudio.Rendering { return indicesData; } + + internal static CubeMesh Create(SkinBOX skinBox) + { + return new CubeMesh(FromSkinBox(skinBox)); + } } } \ No newline at end of file diff --git a/PCK-Studio/Rendering/SkinRenderer.cs b/PCK-Studio/Rendering/SkinRenderer.cs index 83a91fdf..ddfe9342 100644 --- a/PCK-Studio/Rendering/SkinRenderer.cs +++ b/PCK-Studio/Rendering/SkinRenderer.cs @@ -546,27 +546,27 @@ namespace PckStudio.Rendering // Skeleton draw context { VertexArray lineVAO = new VertexArray(); - Vector3 bodyCenterTop = body.GetFaceCenter(0, CubeData.CubeFace.Top); - Vector3 bodyCenterBottom = body.GetFaceCenter(0, CubeData.CubeFace.Bottom); + Vector3 bodyCenterTop = body.GetFaceCenter(0, Cube.Face.Top); + Vector3 bodyCenterBottom = body.GetFaceCenter(0, Cube.Face.Bottom); ColorVertex[] data = [ - new ColorVertex(head.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), + new ColorVertex(head.GetFaceCenter(0, Cube.Face.Top), lineColor), new ColorVertex(bodyCenterBottom, lineColor), - new ColorVertex(rightArm.GetFaceCenter(0, CubeData.CubeFace.Bottom), lineColor), - new ColorVertex(rightArm.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), - new ColorVertex(rightArm.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), - new ColorVertex(leftArm.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), + new ColorVertex(rightArm.GetFaceCenter(0, Cube.Face.Bottom), lineColor), + new ColorVertex(rightArm.GetFaceCenter(0, Cube.Face.Top), lineColor), + new ColorVertex(rightArm.GetFaceCenter(0, Cube.Face.Top), lineColor), + new ColorVertex(leftArm.GetFaceCenter(0, Cube.Face.Top), lineColor), - new ColorVertex(leftArm.GetFaceCenter(0, CubeData.CubeFace.Bottom), lineColor), - new ColorVertex(leftArm.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), + new ColorVertex(leftArm.GetFaceCenter(0, Cube.Face.Bottom), lineColor), + new ColorVertex(leftArm.GetFaceCenter(0, Cube.Face.Top), lineColor), - new ColorVertex(rightLeg.GetFaceCenter(0, CubeData.CubeFace.Bottom), lineColor), - new ColorVertex(rightLeg.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), - new ColorVertex(rightLeg.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), - new ColorVertex(leftLeg.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), + new ColorVertex(rightLeg.GetFaceCenter(0, Cube.Face.Bottom), lineColor), + new ColorVertex(rightLeg.GetFaceCenter(0, Cube.Face.Top), lineColor), + new ColorVertex(rightLeg.GetFaceCenter(0, Cube.Face.Top), lineColor), + new ColorVertex(leftLeg.GetFaceCenter(0, Cube.Face.Top), lineColor), - new ColorVertex(leftLeg.GetFaceCenter(0, CubeData.CubeFace.Bottom), lineColor), - new ColorVertex(leftLeg.GetFaceCenter(0, CubeData.CubeFace.Top), lineColor), + new ColorVertex(leftLeg.GetFaceCenter(0, Cube.Face.Bottom), lineColor), + new ColorVertex(leftLeg.GetFaceCenter(0, Cube.Face.Top), lineColor), ]; VertexBuffer buffer = new VertexBuffer(); buffer.SetData(data);