diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj
index fd0e175f..87b8a761 100644
--- a/PCK-Studio/PckStudio.csproj
+++ b/PCK-Studio/PckStudio.csproj
@@ -212,7 +212,7 @@
-
+
diff --git a/PCK-Studio/Rendering/Cube.cs b/PCK-Studio/Rendering/Cube.cs
index eb932933..24523120 100644
--- a/PCK-Studio/Rendering/Cube.cs
+++ b/PCK-Studio/Rendering/Cube.cs
@@ -18,26 +18,25 @@
using System;
using OpenTK;
using PckStudio.Extensions;
-using PckStudio.Internal;
using PckStudio.Internal.Skin;
namespace PckStudio.Rendering
{
- internal class Cube
+ internal sealed class Cube
{
- internal Vector3 Position { get; set; }
+ internal Vector3 Position { get; }
- internal Vector3 Size { get; set; }
+ internal Vector3 Size { get; }
- internal Vector3 Rotation { get; set; }
+ internal Vector3 Rotation { get; }
- internal Vector2 Uv { get; set; }
+ internal Vector2 Uv { get; }
- internal float Inflate { get; set; }
+ internal float Inflate { get; }
- internal bool MirrorTexture { get; set; }
+ internal bool MirrorTexture { get; }
- internal bool FlipZMapping { get; set; }
+ internal bool FlipZMapping { get; }
internal Vector3 Center => Position + Size / 2f;
@@ -51,12 +50,10 @@ namespace PckStudio.Rendering
Right
}
- internal static Cube FromSkinBox(SkinBOX skinBOX)
- {
- return new Cube(skinBOX.Pos.ToOpenTKVector(), skinBOX.Size.ToOpenTKVector(), skinBOX.UV.ToOpenTKVector(), skinBOX.Scale, skinBOX.Mirror, false);
- }
+ internal static Cube FromSkinBox(SkinBOX skinBOX) => FromSkinBox(skinBOX, 0f);
- public Cube() { }
+ internal static Cube FromSkinBox(SkinBOX skinBOX, float inflate, bool flipZMapping = false)
+ => new Cube(skinBOX.Pos.ToOpenTKVector(), skinBOX.Size.ToOpenTKVector(), skinBOX.UV.ToOpenTKVector(), skinBOX.Scale + inflate, skinBOX.Mirror, flipZMapping);
public Cube(Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping)
{
diff --git a/PCK-Studio/Rendering/CubeMesh.cs b/PCK-Studio/Rendering/CubeMesh.cs
index 4a021ea1..8ac26996 100644
--- a/PCK-Studio/Rendering/CubeMesh.cs
+++ b/PCK-Studio/Rendering/CubeMesh.cs
@@ -22,16 +22,17 @@ using System.Drawing;
using System.Linq;
using OpenTK;
using PckStudio.Extensions;
-using PckStudio.Internal;
-using PckStudio.Internal.Skin;
-
namespace PckStudio.Rendering
{
- internal class CubeMesh : Cube
+ internal class CubeMesh : GenericMesh
{
- internal bool ShouldRender { get; set; } = true;
+ internal bool ShouldRender { get; } = true;
- private static int[] indicesData = [
+ private Cube _cube;
+
+ public Vector3 Center => _cube.Center;
+
+ internal static int[] IndicesData { get; } = [
// Face 1 (Back)
0, 1, 2,
2, 3, 0,
@@ -48,93 +49,94 @@ namespace PckStudio.Rendering
16, 17, 18,
18, 19, 16,
// Face 6 (Right)
- 20, 21, 22,
+ 20, 21, 22,
22, 23, 20
];
- private TextureVertex[] vertices;
-
- ///
- ///
- ///
- ///
- ///
- /// Flips the bottom face mapping of the uv mapping
- public CubeMesh(bool enabled, Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping)
- : base(position, size, uv, inflate, mirrorTexture, flipZMapping)
- {
- ShouldRender = enabled;
- Update();
- }
-
- 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, true)
{
}
- public CubeMesh(Cube cube)
- : this(cube.Position, cube.Size, cube.Uv, cube.Inflate, cube.MirrorTexture, cube.FlipZMapping)
+ private CubeMesh(Cube cube, bool visible)
+ : base(nameof(CubeMesh), OpenTK.Graphics.OpenGL.PrimitiveType.Triangles)
{
+ ShouldRender = visible;
+ _cube = cube;
+ indices.AddRange(IndicesData);
+ transform = Matrix4.Identity;
+ SetData();
}
+ public CubeMesh SetCube(Cube cube)
+ {
+ _ = cube ?? throw new ArgumentNullException(nameof(cube));
+ return new CubeMesh(cube, ShouldRender);
+ }
+
+ public CubeMesh SetVisible(bool visible) => new CubeMesh(_cube, visible);
+
+ public Cube GetCube() => _cube;
+
private TextureVertex[] GetCubeVertexData()
{
- int mirror = MirrorTexture ? 1 : 0;
+ int mirror = Convert.ToInt32(_cube.MirrorTexture);
List vertices = new List();
- Vector2 uv = Uv;
+ Vector2 uv = _cube.Uv;
- BoundingBox boundingBox = GetBoundingBox();
+ BoundingBox boundingBox = _cube.GetBoundingBox();
Vector3 from = boundingBox.Start.ToOpenTKVector();
Vector3 to = boundingBox.End.ToOpenTKVector();
- var back = new TextureVertex[]
+ Vector3 size = _cube.Size;
+
+ var back = new TextureVertex[4]
{
// Back
- new TextureVertex(new Vector3(from.X, to.Y, to.Z), new Vector2(uv.X + Size.Z * 2 + Size.X + Size.X * (1 - mirror), uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3( to.X, to.Y, to.Z), new Vector2(uv.X + Size.Z * 2 + Size.X + Size.X * mirror, uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3( to.X, from.Y, to.Z), new Vector2(uv.X + Size.Z * 2 + Size.X + Size.X * mirror, uv.Y + Size.Z)),
- new TextureVertex(new Vector3(from.X, from.Y, to.Z), new Vector2(uv.X + Size.Z * 2 + Size.X + Size.X * (1 - mirror), uv.Y + Size.Z))
+ new TextureVertex(new Vector3(from.X, to.Y, to.Z), new Vector2(uv.X + size.Z * 2 + size.X + size.X * (1 - mirror), uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3( to.X, to.Y, to.Z), new Vector2(uv.X + size.Z * 2 + size.X + size.X * mirror, uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3( to.X, from.Y, to.Z), new Vector2(uv.X + size.Z * 2 + size.X + size.X * mirror, uv.Y + size.Z)),
+ new TextureVertex(new Vector3(from.X, from.Y, to.Z), new Vector2(uv.X + size.Z * 2 + size.X + size.X * (1 - mirror), uv.Y + size.Z))
};
- var front = new TextureVertex[]
+ var front = new TextureVertex[4]
{
// Front
- new TextureVertex(new Vector3(from.X, to.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X * mirror, uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3( to.X, to.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X * (1 - mirror), uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3( to.X, from.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X * (1 - mirror), uv.Y + Size.Z)),
- new TextureVertex(new Vector3(from.X, from.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X * mirror, uv.Y + Size.Z)),
+ new TextureVertex(new Vector3(from.X, to.Y, from.Z), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3( to.X, to.Y, from.Z), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3( to.X, from.Y, from.Z), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y + size.Z)),
+ new TextureVertex(new Vector3(from.X, from.Y, from.Z), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y + size.Z)),
};
- var top = new TextureVertex[]
+ var top = new TextureVertex[4]
{
// Top
- new TextureVertex(new Vector3(from.X, from.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X * mirror, uv.Y + Size.Z)),
- new TextureVertex(new Vector3(from.X, from.Y, to.Z), new Vector2(uv.X + Size.Z + Size.X * mirror, uv.Y)),
- new TextureVertex(new Vector3( to.X, from.Y, to.Z), new Vector2(uv.X + Size.Z + Size.X * (1 - mirror), uv.Y)),
- new TextureVertex(new Vector3( to.X, from.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X * (1 - mirror), uv.Y + Size.Z)),
+ new TextureVertex(new Vector3(from.X, from.Y, from.Z), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y + size.Z)),
+ new TextureVertex(new Vector3(from.X, from.Y, to.Z), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y)),
+ new TextureVertex(new Vector3( to.X, from.Y, to.Z), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y)),
+ new TextureVertex(new Vector3( to.X, from.Y, from.Z), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y + size.Z)),
};
- var bottom = new TextureVertex[]
+ var bottom = new TextureVertex[4]
{
// Bottom
- new TextureVertex(new Vector3( to.X, to.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X + Size.X * (1 - mirror), uv.Y + (FlipZMapping ? Size.Z : 0))),
- new TextureVertex(new Vector3( to.X, to.Y, to.Z), new Vector2(uv.X + Size.Z + Size.X + Size.X * (1 - mirror), uv.Y + (!FlipZMapping ? Size.Z : 0))),
- new TextureVertex(new Vector3(from.X, to.Y, to.Z), new Vector2(uv.X + Size.Z + Size.X + Size.X * mirror, uv.Y + (!FlipZMapping ? Size.Z : 0))),
- new TextureVertex(new Vector3(from.X, to.Y, from.Z), new Vector2(uv.X + Size.Z + Size.X + Size.X * mirror, uv.Y + (FlipZMapping ? Size.Z : 0))),
+ new TextureVertex(new Vector3( to.X, to.Y, from.Z), new Vector2(uv.X + size.Z + size.X + size.X * (1 - mirror), uv.Y + (_cube.FlipZMapping ? size.Z : 0))),
+ new TextureVertex(new Vector3( to.X, to.Y, to.Z), new Vector2(uv.X + size.Z + size.X + size.X * (1 - mirror), uv.Y + (!_cube.FlipZMapping ? size.Z : 0))),
+ new TextureVertex(new Vector3(from.X, to.Y, to.Z), new Vector2(uv.X + size.Z + size.X + size.X * mirror, uv.Y + (!_cube.FlipZMapping ? size.Z : 0))),
+ new TextureVertex(new Vector3(from.X, to.Y, from.Z), new Vector2(uv.X + size.Z + size.X + size.X * mirror, uv.Y + (_cube.FlipZMapping ? size.Z : 0))),
};
- var left = new TextureVertex[]
+ var left = new TextureVertex[4]
{
// Left
- new TextureVertex(new Vector3(MirrorTexture ? from.X : to.X, from.Y, from.Z), new Vector2(uv.X + Size.X + Size.Z, uv.Y + Size.Z)),
- new TextureVertex(new Vector3(MirrorTexture ? from.X : to.X, to.Y , from.Z), new Vector2(uv.X + Size.X + Size.Z, uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3(MirrorTexture ? from.X : to.X, to.Y , to.Z), new Vector2(uv.X + Size.X + Size.Z * 2, uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3(MirrorTexture ? from.X : to.X, from.Y, to.Z), new Vector2(uv.X + Size.X + Size.Z * 2, uv.Y + Size.Z)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? from.X : to.X, from.Y, from.Z), new Vector2(uv.X + size.X + size.Z, uv.Y + size.Z)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? from.X : to.X, to.Y , from.Z), new Vector2(uv.X + size.X + size.Z, uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? from.X : to.X, to.Y , to.Z), new Vector2(uv.X + size.X + size.Z * 2, uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? from.X : to.X, from.Y, to.Z), new Vector2(uv.X + size.X + size.Z * 2, uv.Y + size.Z)),
};
- var right = new TextureVertex[]
+ var right = new TextureVertex[4]
{
// Right
- new TextureVertex(new Vector3(MirrorTexture ? to.X : from.X, from.Y, from.Z), new Vector2(uv.X + Size.Z, uv.Y + Size.Z)),
- new TextureVertex(new Vector3(MirrorTexture ? to.X : from.X, to.Y, from.Z), new Vector2(uv.X + Size.Z, uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3(MirrorTexture ? to.X : from.X, to.Y, to.Z), new Vector2(uv.X, uv.Y + Size.Z + Size.Y)),
- new TextureVertex(new Vector3(MirrorTexture ? to.X : from.X, from.Y, to.Z), new Vector2(uv.X, uv.Y + Size.Z)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? to.X : from.X, from.Y, from.Z), new Vector2(uv.X + size.Z, uv.Y + size.Z)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? to.X : from.X, to.Y , from.Z), new Vector2(uv.X + size.Z, uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? to.X : from.X, to.Y , to.Z), new Vector2(uv.X, uv.Y + size.Z + size.Y)),
+ new TextureVertex(new Vector3(_cube.MirrorTexture ? to.X : from.X, from.Y, to.Z), new Vector2(uv.X, uv.Y + size.Z)),
};
vertices.AddRange(back);
@@ -147,24 +149,10 @@ namespace PckStudio.Rendering
return vertices.ToArray();
}
- internal void Update()
+ internal override void SetData()
{
- vertices = GetCubeVertexData();
- }
-
- internal TextureVertex[] GetVertices()
- {
- return vertices;
- }
-
- internal int[] GetIndices()
- {
- return indicesData;
- }
-
- internal static CubeMesh Create(SkinBOX skinBox)
- {
- return new CubeMesh(FromSkinBox(skinBox));
+ vertices.Clear();
+ vertices.AddRange(GetCubeVertexData());
}
}
}
\ No newline at end of file
diff --git a/PCK-Studio/Rendering/CubeGroupMesh.cs b/PCK-Studio/Rendering/CubeMeshCollection.cs
similarity index 67%
rename from PCK-Studio/Rendering/CubeGroupMesh.cs
rename to PCK-Studio/Rendering/CubeMeshCollection.cs
index ddd95f59..3af16c93 100644
--- a/PCK-Studio/Rendering/CubeGroupMesh.cs
+++ b/PCK-Studio/Rendering/CubeMeshCollection.cs
@@ -26,7 +26,7 @@ using PckStudio.Internal.Skin;
namespace PckStudio.Rendering
{
- internal class CubeGroupMesh : GenericMesh
+ internal class CubeMeshCollection : GenericMesh
{
private List cubes;
@@ -36,26 +36,43 @@ namespace PckStudio.Rendering
set
{
_flipZMapping = value;
- UpdateCollection();
+ //foreach (Cube cube in cubes)
+ //{
+ // cube.FlipZMapping = FlipZMapping;
+ //}
}
}
public Vector3 Translation { get; }
public Vector3 Pivot { get; }
- public Vector3 Offset { get; set; } = Vector3.Zero;
+ private Vector3 _offset { get; set; } = Vector3.Zero;
+ public Vector3 Offset
+ {
+ get => _offset;
+ set
+ {
+ if (value != _offset)
+ {
+ _offset = value;
+ transform = Matrix4.CreateTranslation(Translation + _offset) * Matrix4.CreateScale(1f, -1f, -1f);
+ }
+ }
+ }
private bool _flipZMapping = false;
- internal CubeGroupMesh(string name) : base(name, PrimitiveType.Triangles)
+ internal CubeMeshCollection(string name) : base(name, PrimitiveType.Triangles)
{
cubes = new List(5);
+ transform = Matrix4.CreateTranslation(Vector3.Zero) * Matrix4.CreateScale(1f, -1f, -1f);
}
- internal CubeGroupMesh(string name, Vector3 translation, Vector3 pivot)
+ internal CubeMeshCollection(string name, Vector3 translation, Vector3 pivot)
: this(name)
{
Translation = translation;
Pivot = pivot;
+ transform = Matrix4.CreateTranslation(Translation) * Matrix4.CreateScale(1f, -1f, -1f);
}
public static VertexBufferLayout GetLayout()
@@ -68,10 +85,14 @@ namespace PckStudio.Rendering
internal void AddSkinBox(SkinBOX skinBox, float inflate = 0f)
{
- var cube = CubeMesh.Create(skinBox);
- cube.FlipZMapping = FlipZMapping;
- cube.Inflate += inflate;
- cubes.Add(cube);
+ var cube = Cube.FromSkinBox(skinBox, inflate, FlipZMapping);
+ cubes.Add(new CubeMesh(cube));
+ }
+
+ private void ResetBuffers()
+ {
+ vertices.Clear();
+ indices.Clear();
}
internal void ClearData()
@@ -83,18 +104,17 @@ namespace PckStudio.Rendering
///
/// Uploads vertex data
///
- // TODO: rename function
- internal void UploadData()
+ internal override void SetData()
{
ResetBuffers();
+ int indicesOffset = 0;
+ IEnumerable indexStorage = CubeMesh.IndicesData;
foreach (CubeMesh cube in cubes)
{
if (!cube.ShouldRender)
continue;
- cube.Update();
- TextureVertex[] cubeVertices = cube.GetVertices();
+ TextureVertex[] cubeVertices = cube.GetVertices().ToArray();
vertices.AddRange(cubeVertices);
- var indexStorage = cube.GetIndices();
indices.AddRange(indexStorage.Select(n => n + indicesOffset));
indicesOffset += cubeVertices.Length;
}
@@ -103,8 +123,8 @@ namespace PckStudio.Rendering
internal void AddCube(Vector3 position, Vector3 size, Vector2 uv, float inflate = 0f, bool mirrorTexture = false)
{
- var cube = new CubeMesh(position, size, uv, inflate, mirrorTexture, FlipZMapping);
- cubes.Add(cube);
+ var cube = new Cube(position, size, uv, inflate, mirrorTexture, FlipZMapping);
+ cubes.Add(new CubeMesh(cube));
}
internal void RemoveCube(int index)
@@ -113,7 +133,7 @@ namespace PckStudio.Rendering
throw new IndexOutOfRangeException();
cubes.RemoveAt(index);
- UploadData();
+ SetData();
}
internal void ReplaceCube(int index, Vector3 position, Vector3 size, Vector2 uv, float inflate = 0f, bool mirrorTexture = false)
@@ -121,26 +141,7 @@ namespace PckStudio.Rendering
if (!cubes.IndexInRange(index))
throw new IndexOutOfRangeException();
- CubeMesh cube = cubes[index];
- cube.Position = position;
- cube.Size = size;
- cube.Uv = uv;
- cube.Inflate = inflate;
- cube.MirrorTexture = mirrorTexture;
- cube.Update();
- }
-
- private void UpdateCollection()
- {
- foreach (CubeMesh cube in cubes)
- {
- cube.FlipZMapping = FlipZMapping;
- }
- }
-
- internal Matrix4 Transform
- {
- get => Matrix4.CreateTranslation(Translation + Offset) * Matrix4.CreateScale(1f, -1f, -1f);
+ cubes[index] = cubes[index].SetCube(new Cube(position, size, uv, inflate, mirrorTexture, false));
}
internal Vector3 GetCenter(int index)
@@ -148,7 +149,7 @@ namespace PckStudio.Rendering
if (!cubes.IndexInRange(index))
throw new IndexOutOfRangeException();
- return (Transform * Matrix4.CreateTranslation(cubes[index].Center)).ExtractTranslation();
+ return Vector3.TransformPosition(cubes[index].Center, Transform);
}
internal BoundingBox GetCubeBoundingBox(int index)
@@ -156,7 +157,7 @@ namespace PckStudio.Rendering
if (!cubes.IndexInRange(index))
throw new IndexOutOfRangeException();
- CubeMesh cube = cubes[index];
+ Cube cube = cubes[index].GetCube();
return cube.GetBoundingBox(Transform);
}
@@ -164,15 +165,16 @@ namespace PckStudio.Rendering
{
if (!cubes.IndexInRange(index))
throw new IndexOutOfRangeException();
- return Vector3.TransformPosition(cubes[index].GetFaceCenter(face), Transform);
+ Cube cube = cubes[index].GetCube();
+ return Vector3.TransformPosition(cube.GetFaceCenter(face), Transform);
}
- internal void SetEnabled(int index, bool enable)
+ internal void SetVisible(int index, bool visible)
{
if (!cubes.IndexInRange(index))
throw new IndexOutOfRangeException();
- cubes[index].ShouldRender = enable;
+ cubes[index] = cubes[index].SetVisible(visible);
}
}
}
diff --git a/PCK-Studio/Rendering/GenericMesh.cs b/PCK-Studio/Rendering/GenericMesh.cs
index d1a218d3..e3da373b 100644
--- a/PCK-Studio/Rendering/GenericMesh.cs
+++ b/PCK-Studio/Rendering/GenericMesh.cs
@@ -18,30 +18,32 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
-using System.Runtime.InteropServices;
+using OpenTK;
using OpenTK.Graphics.OpenGL;
using PckStudio.Rendering.Shader;
namespace PckStudio.Rendering
{
- internal class GenericMesh where T : struct
+ internal abstract class GenericMesh where T : struct
{
internal string Name { get; }
protected List vertices { get; }
protected List indices { get; }
- protected int indicesOffset;
+ protected Matrix4 transform { get; set; }
+ public Matrix4 Transform => transform;
- private VertexArray vertexArray;
- private IndexBuffer indexBuffer;
- private readonly PrimitiveType drawType;
- private DrawContext drawContext;
+ /* + ---------------------------------------------- + */
+ /* | */ private VertexArray vertexArray; /* | */
+ /* | */ private IndexBuffer indexBuffer; /* | */
+ /* | */ private readonly PrimitiveType drawType; /* | */
+ /* | */ private DrawContext drawContext; /* | */
+ /* + ---------------------------------------------- + */
protected GenericMesh(string name, PrimitiveType type)
{
Name = name;
drawType = type;
- indicesOffset = 0;
vertices = new List(10);
indices = new List(10);
}
@@ -54,12 +56,9 @@ namespace PckStudio.Rendering
drawContext = new DrawContext(vertexArray, indexBuffer, drawType);
}
- protected void ResetBuffers()
- {
- indicesOffset = 0;
- vertices.Clear();
- indices.Clear();
- }
+ internal abstract void SetData();
+
+ internal IEnumerable GetVertices() => vertices;
protected void Submit()
{
diff --git a/PCK-Studio/Rendering/IndexBuffer.cs b/PCK-Studio/Rendering/IndexBuffer.cs
index e446caff..84c74b6c 100644
--- a/PCK-Studio/Rendering/IndexBuffer.cs
+++ b/PCK-Studio/Rendering/IndexBuffer.cs
@@ -40,6 +40,7 @@ namespace PckStudio.Rendering
if (_size < size)
{
GL.BufferData(BufferTarget.ElementArrayBuffer, size, indicies, BufferUsageHint.StaticDraw);
+ _size = size;
return;
}
GL.BufferSubData(BufferTarget.ElementArrayBuffer, IntPtr.Zero, size, indicies);
diff --git a/PCK-Studio/Rendering/SkinRenderer.cs b/PCK-Studio/Rendering/SkinRenderer.cs
index b9062896..2ab11a88 100644
--- a/PCK-Studio/Rendering/SkinRenderer.cs
+++ b/PCK-Studio/Rendering/SkinRenderer.cs
@@ -222,17 +222,17 @@ namespace PckStudio.Rendering
private DrawContext _skyboxRenderBuffer;
private CubeTexture _skyboxTexture;
- private Dictionary meshStorage;
- private Dictionary offsetSpecificMeshStorage;
+ private Dictionary meshStorage;
+ private Dictionary offsetSpecificMeshStorage;
- private CubeGroupMesh cape;
+ private CubeMeshCollection cape;
- private CubeGroupMesh head;
- private CubeGroupMesh body;
- private CubeGroupMesh rightArm;
- private CubeGroupMesh leftArm;
- private CubeGroupMesh rightLeg;
- private CubeGroupMesh leftLeg;
+ private CubeMeshCollection head;
+ private CubeMeshCollection body;
+ private CubeMeshCollection rightArm;
+ private CubeMeshCollection leftArm;
+ private CubeMeshCollection rightLeg;
+ private CubeMeshCollection leftLeg;
private float animationCurrentRotationAngle;
private float animationRotationSpeed = 16f;
@@ -266,7 +266,7 @@ namespace PckStudio.Rendering
{
InitializeSkinData();
InitializeCapeData();
- meshStorage = new Dictionary()
+ meshStorage = new Dictionary()
{
{ "HEAD", head },
{ "BODY", body },
@@ -301,19 +301,19 @@ namespace PckStudio.Rendering
MakeCurrent();
InitializeShaders();
Renderer.SetClearColor(BackColor);
- VertexBufferLayout layout = CubeGroupMesh.GetLayout();
- foreach (CubeGroupMesh cubeMesh in meshStorage?.Values)
+ VertexBufferLayout layout = CubeMeshCollection.GetLayout();
+ foreach (CubeMeshCollection cubeMesh in meshStorage?.Values)
{
cubeMesh.Initialize(layout);
}
UploadMeshData();
- foreach (CubeGroupMesh cubeMesh in offsetSpecificMeshStorage?.Values)
+ foreach (CubeMeshCollection cubeMesh in offsetSpecificMeshStorage?.Values)
{
cubeMesh.Initialize(layout);
- cubeMesh.UploadData();
+ cubeMesh.SetData();
}
cape.Initialize(layout);
- cape.UploadData();
+ cape.SetData();
GLErrorCheck();
base.Initialize();
GLErrorCheck();
@@ -329,38 +329,38 @@ namespace PckStudio.Rendering
private void InitializeSkinData()
{
- head ??= new CubeGroupMesh("Head") { FlipZMapping = true };
+ head ??= new CubeMeshCollection("Head") { FlipZMapping = true };
head.AddCube(new(-4, -8, -4), new(8, 8, 8), new(0, 0));
head.AddCube(new(-4, -8, -4), new(8, 8, 8), new(32, 0), OverlayScale * 2);
- body ??= new CubeGroupMesh("Body");
+ body ??= new CubeMeshCollection("Body");
body.AddCube(new(-4, 0, -2), new(8, 12, 4), new(16, 16));
body.AddCube(new(-4, 0, -2), new(8, 12, 4), new(16, 32), OverlayScale);
ModelPartSpecifics.PositioningInfo rightArmInfo = ModelPartSpecifics.GetPositioningInfo("ARM0");
- rightArm ??= new CubeGroupMesh("Right Arm", rightArmInfo.Translation.ToOpenTKVector(), rightArmInfo.Pivot.ToOpenTKVector());
+ rightArm ??= new CubeMeshCollection("Right Arm", rightArmInfo.Translation.ToOpenTKVector(), rightArmInfo.Pivot.ToOpenTKVector());
rightArm.AddCube(new(-3, -2, -2), new(4, 12, 4), new(40, 16));
rightArm.AddCube(new(-3, -2, -2), new(4, 12, 4), new(40, 32), OverlayScale);
ModelPartSpecifics.PositioningInfo leftArmInfo = ModelPartSpecifics.GetPositioningInfo("ARM1");
- leftArm ??= new CubeGroupMesh("Left Arm", leftArmInfo.Translation.ToOpenTKVector(), leftArmInfo.Pivot.ToOpenTKVector());
+ leftArm ??= new CubeMeshCollection("Left Arm", leftArmInfo.Translation.ToOpenTKVector(), leftArmInfo.Pivot.ToOpenTKVector());
leftArm.AddCube(new(-1, -2, -2), new(4, 12, 4), new(32, 48));
leftArm.AddCube(new(-1, -2, -2), new(4, 12, 4), new(48, 48), inflate: OverlayScale);
ModelPartSpecifics.PositioningInfo rightLegInfo = ModelPartSpecifics.GetPositioningInfo("LEG0");
- rightLeg ??= new CubeGroupMesh("Right Leg", rightLegInfo.Translation.ToOpenTKVector(), rightLegInfo.Pivot.ToOpenTKVector());
+ rightLeg ??= new CubeMeshCollection("Right Leg", rightLegInfo.Translation.ToOpenTKVector(), rightLegInfo.Pivot.ToOpenTKVector());
rightLeg.AddCube(new(-2, 0, -2), new(4, 12, 4), new(0, 16));
rightLeg.AddCube(new(-2, 0, -2), new(4, 12, 4), new(0, 32), OverlayScale);
ModelPartSpecifics.PositioningInfo leftLegInfo = ModelPartSpecifics.GetPositioningInfo("LEG1");
- leftLeg ??= new CubeGroupMesh("Left Leg", leftLegInfo.Translation.ToOpenTKVector(), leftLegInfo.Pivot.ToOpenTKVector());
+ leftLeg ??= new CubeMeshCollection("Left Leg", leftLegInfo.Translation.ToOpenTKVector(), leftLegInfo.Pivot.ToOpenTKVector());
leftLeg.AddCube(new(-2, 0, -2), new(4, 12, 4), new(16, 48));
leftLeg.AddCube(new(-2, 0, -2), new(4, 12, 4), new(0, 48), OverlayScale);
}
private void InitializeCapeData()
{
- cape ??= new CubeGroupMesh("Cape");
+ cape ??= new CubeMeshCollection("Cape");
cape.AddCube(new(-5, 0, -3), new(10, 16, 1), new(0, 0));
}
@@ -368,34 +368,34 @@ namespace PckStudio.Rendering
{
const float armorInflation = 0.75f;
- var helmet = new CubeGroupMesh("HELMET");
+ var helmet = new CubeMeshCollection("HELMET");
helmet.AddCube(new(-4, -8, -4), new(8, 8, 8), new(0, 0), inflate: armorInflation);
- var chest = new CubeGroupMesh("CHEST");
+ var chest = new CubeMeshCollection("CHEST");
chest.AddCube(new(-4, 0, -2), new(8, 12, 4), new(16, 16), inflate: armorInflation + 0.01f);
- var shoulder0 = new CubeGroupMesh("SHOULDER0", rightArm.Translation, rightArm.Pivot);
+ var shoulder0 = new CubeMeshCollection("SHOULDER0", rightArm.Translation, rightArm.Pivot);
shoulder0.AddCube(new(-3, -2, -2), new(4, 12, 4), new(40, 16), inflate: armorInflation);
- var shoulder1 = new CubeGroupMesh("SHOULDER1", leftArm.Translation, leftArm.Pivot);
+ var shoulder1 = new CubeMeshCollection("SHOULDER1", leftArm.Translation, leftArm.Pivot);
shoulder1.AddCube(new(-1, -2, -2), new(4, 12, 4), new(40, 16), inflate: armorInflation, mirrorTexture: true);
- var waist = new CubeGroupMesh("WAIST");
+ var waist = new CubeMeshCollection("WAIST");
waist.AddCube(new(-4, 0, -2), new(8, 12, 4), new(16, 48), inflate: armorInflation);
- var pants0 = new CubeGroupMesh("PANTS0", rightLeg.Translation, rightLeg.Pivot);
+ var pants0 = new CubeMeshCollection("PANTS0", rightLeg.Translation, rightLeg.Pivot);
pants0.AddCube(new(-2, 0, -2), new(4, 12, 4), new(0, 48), inflate: armorInflation);
- var pants1 = new CubeGroupMesh("PANTS1", leftLeg.Translation, leftLeg.Pivot);
+ var pants1 = new CubeMeshCollection("PANTS1", leftLeg.Translation, leftLeg.Pivot);
pants1.AddCube(new(-2, 0, -2), new(4, 12, 4), new(0, 48), inflate: armorInflation, mirrorTexture: true);
- var boot0 = new CubeGroupMesh("BOOT0", rightLeg.Translation, rightLeg.Pivot);
+ var boot0 = new CubeMeshCollection("BOOT0", rightLeg.Translation, rightLeg.Pivot);
boot0.AddCube(new(-2, 0, -2), new(4, 12, 4), new(0, 16), inflate: armorInflation + 0.25f);
- var boot1 = new CubeGroupMesh("BOOT1", leftLeg.Translation, leftLeg.Pivot);
+ var boot1 = new CubeMeshCollection("BOOT1", leftLeg.Translation, leftLeg.Pivot);
boot1.AddCube(new(-2, 0, -2), new(4, 12, 4), new(0, 16), inflate: armorInflation + 0.25f, mirrorTexture: true);
- offsetSpecificMeshStorage = new Dictionary
+ offsetSpecificMeshStorage = new Dictionary
{
{ helmet.Name, helmet },
{ chest.Name, chest },
@@ -649,7 +649,7 @@ namespace PckStudio.Rendering
{
if (!meshStorage.ContainsKey(name))
return;
- meshStorage[name]?.UploadData();
+ meshStorage[name]?.SetData();
}
private void UploadMeshData()
@@ -710,12 +710,12 @@ namespace PckStudio.Rendering
internal IEnumerable GetOffsets()
{
- foreach (KeyValuePair mesh in meshStorage)
+ foreach (KeyValuePair mesh in meshStorage)
{
if (SkinPartOffset.ValidModelOffsetTypes.Contains(mesh.Key) && mesh.Value.Offset.Y != 0f)
yield return new SkinPartOffset(mesh.Key, mesh.Value.Offset.Y);
}
- foreach (KeyValuePair offsetmesh in offsetSpecificMeshStorage)
+ foreach (KeyValuePair offsetmesh in offsetSpecificMeshStorage)
{
if (offsetmesh.Value.Offset.Y != 0f)
yield return new SkinPartOffset(offsetmesh.Key, offsetmesh.Value.Offset.Y);
@@ -757,20 +757,20 @@ namespace PckStudio.Rendering
return;
}
- CubeGroupMesh cubeMesh = meshStorage[skinBox.Type];
+ CubeMeshCollection cubeMesh = meshStorage[skinBox.Type];
cubeMesh.AddSkinBox(skinBox, autoInflateOverlayParts && skinBox.IsOverlayPart() ? skinBox.Type == "HEADWEAR" ? OverlayScale * 2 : OverlayScale : 0f);
}
private void OnANIMUpdate()
{
- head.SetEnabled(0, !ANIM.GetFlag(SkinAnimFlag.HEAD_DISABLED));
- head.SetEnabled(1, !ANIM.GetFlag(SkinAnimFlag.HEAD_OVERLAY_DISABLED));
+ head.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.HEAD_DISABLED));
+ head.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.HEAD_OVERLAY_DISABLED));
- body.SetEnabled(0, !ANIM.GetFlag(SkinAnimFlag.BODY_DISABLED));
- rightArm.SetEnabled(0, !ANIM.GetFlag(SkinAnimFlag.RIGHT_ARM_DISABLED));
- leftArm.SetEnabled(0, !ANIM.GetFlag(SkinAnimFlag.LEFT_ARM_DISABLED));
- rightLeg.SetEnabled(0, !ANIM.GetFlag(SkinAnimFlag.RIGHT_LEG_DISABLED));
- leftLeg.SetEnabled(0, !ANIM.GetFlag(SkinAnimFlag.LEFT_LEG_DISABLED));
+ body.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.BODY_DISABLED));
+ rightArm.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.RIGHT_ARM_DISABLED));
+ leftArm.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.LEFT_ARM_DISABLED));
+ rightLeg.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.RIGHT_LEG_DISABLED));
+ leftLeg.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.LEFT_LEG_DISABLED));
bool slim = ANIM.GetFlag(SkinAnimFlag.SLIM_MODEL);
@@ -778,11 +778,11 @@ namespace PckStudio.Rendering
if (slim || ANIM.GetFlag(SkinAnimFlag.RESOLUTION_64x64))
{
TextureSize = new Size(64, 64);
- body.SetEnabled(1, !ANIM.GetFlag(SkinAnimFlag.BODY_OVERLAY_DISABLED));
- rightArm.SetEnabled(1, !ANIM.GetFlag(SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED));
- leftArm.SetEnabled(1, !ANIM.GetFlag(SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED));
- rightLeg.SetEnabled(1, !ANIM.GetFlag(SkinAnimFlag.RIGHT_LEG_OVERLAY_DISABLED));
- leftLeg.SetEnabled(1, !ANIM.GetFlag(SkinAnimFlag.LEFT_LEG_OVERLAY_DISABLED));
+ body.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.BODY_OVERLAY_DISABLED));
+ rightArm.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED));
+ leftArm.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED));
+ rightLeg.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.RIGHT_LEG_OVERLAY_DISABLED));
+ leftLeg.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.LEFT_LEG_OVERLAY_DISABLED));
int slimValue = slim ? 3 : 4;
rightArm.ReplaceCube(0, new(slim ? -2 : -3, -2, -2), new(slimValue, 12, 4), new(40, 16));
@@ -798,19 +798,19 @@ namespace PckStudio.Rendering
TextureSize = new Size(64, 32);
- body.SetEnabled(1, false);
+ body.SetVisible(1, false);
head.FlipZMapping = false;
rightArm.ReplaceCube(0, new(-3, -2, -2), new(4, 12, 4), new(40, 16));
- rightArm.SetEnabled(1, false);
+ rightArm.SetVisible(1, false);
leftArm.ReplaceCube(0, new(-1, -2, -2), new(4, 12, 4), new(40, 16), mirrorTexture: true);
- leftArm.SetEnabled(1, false);
+ leftArm.SetVisible(1, false);
rightLeg.ReplaceCube(0, new(-2, 0, -2), new(4, 12, 4), new(0, 16));
- rightLeg.SetEnabled(1, false);
+ rightLeg.SetVisible(1, false);
leftLeg.ReplaceCube (0, new(-2, 0, -2), new(4, 12, 4), new(0, 16), mirrorTexture: true);
- leftLeg.SetEnabled(1, false);
+ leftLeg.SetVisible(1, false);
}
protected override bool ProcessDialogKey(Keys keyData)
@@ -851,7 +851,7 @@ namespace PckStudio.Rendering
return;
}
- CubeGroupMesh cubeMesh = meshStorage[skinBox.Type];
+ CubeMeshCollection cubeMesh = meshStorage[skinBox.Type];
Vector3 center = Cube.FromSkinBox(skinBox).Center;
Matrix4 camMat = (Matrix4.CreateTranslation(cubeMesh.Translation) * Matrix4.CreateTranslation(center) * Matrix4.CreateScale(-1, 1, 1));
Vector3 camPos = camMat.ExtractTranslation();
@@ -1025,7 +1025,7 @@ namespace PckStudio.Rendering
if (ShowGuideLines)
{
GL.DepthFunc(DepthFunction.Always);
- GL.BlendFunc(BlendingFactor.DstAlpha, BlendingFactor.OneMinusSrcAlpha);
+ GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
lineShader.Bind();
lineShader.SetUniformMat4("ViewProjection", ref viewProjection);
lineShader.SetUniformMat4("Transform", ref transform);
@@ -1034,7 +1034,6 @@ namespace PckStudio.Rendering
Renderer.SetLineWidth(2.5f);
Renderer.Draw(lineShader, GetGuidelineDrawContext());
Renderer.SetLineWidth(1f);
- GL.BlendFunc(BlendingFactor.DstAlpha, BlendingFactor.OneMinusSrcAlpha);
GL.DepthFunc(DepthFunction.Less);
}
@@ -1042,15 +1041,14 @@ namespace PckStudio.Rendering
{
SkinBOX box = ModelData[SelectedIndex];
- Cube cube = Cube.FromSkinBox(box);
+ float inflate = autoInflateOverlayParts && box.IsOverlayPart() ? box.Type == "HEADWEAR" ? OverlayScale * 2 : OverlayScale : 0f;
+ Cube cube = Cube.FromSkinBox(box, inflate);
- cube.Inflate = autoInflateOverlayParts && box.IsOverlayPart() ? box.Type == "HEADWEAR" ? OverlayScale * 2 : OverlayScale : 0f;
-
BoundingBox cubeBoundingBox = cube.GetBoundingBox();
if (meshStorage.ContainsKey(box.Type))
{
- CubeGroupMesh cubeMesh = meshStorage[box.Type];
+ CubeMeshCollection cubeMesh = meshStorage[box.Type];
Matrix4 GetGroupTransform(string type)
{
@@ -1076,7 +1074,7 @@ namespace PckStudio.Rendering
Matrix4 bbTransform = GetGroupTransform(box.Type);
bbTransform *= cubeMesh.Transform;
bbTransform *= transform;
- GL.BlendFunc(BlendingFactor.DstAlpha, BlendingFactor.OneMinusSrcAlpha);
+ GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.SrcColor);
DrawBoundingBox(bbTransform, cubeBoundingBox, HighlightlingColor);
GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
}
@@ -1174,7 +1172,7 @@ namespace PckStudio.Rendering
}
}
- private void RenderPart(ShaderProgram shader, CubeGroupMesh cubeMesh, Matrix4 partMatrix, Matrix4 globalMatrix)
+ private void RenderPart(ShaderProgram shader, CubeMeshCollection cubeMesh, Matrix4 partMatrix, Matrix4 globalMatrix)
{
Matrix4 transform = partMatrix;
transform *= cubeMesh.Transform;
@@ -1198,7 +1196,7 @@ namespace PckStudio.Rendering
private void ReInitialzeSkinData()
{
- foreach (CubeGroupMesh mesh in meshStorage.Values)
+ foreach (CubeMeshCollection mesh in meshStorage.Values)
{
mesh.ClearData();
}