summaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/dev/figboot/cuberender/state/BlendMode.java6
-rw-r--r--src/main/java/dev/figboot/cuberender/state/Texture.java4
-rw-r--r--src/main/java/dev/figboot/cuberender/test/GraphicsPanel.java65
-rw-r--r--src/main/java/dev/figboot/cuberender/test/TestWindow.java12
-rw-r--r--src/main/resources/cape.pngbin616 -> 1105 bytes
-rw-r--r--src/main/resources/translucent.pngbin441 -> 982 bytes
6 files changed, 60 insertions, 27 deletions
diff --git a/src/main/java/dev/figboot/cuberender/state/BlendMode.java b/src/main/java/dev/figboot/cuberender/state/BlendMode.java
index 0c30998..1c1acf4 100644
--- a/src/main/java/dev/figboot/cuberender/state/BlendMode.java
+++ b/src/main/java/dev/figboot/cuberender/state/BlendMode.java
@@ -12,9 +12,9 @@ public enum BlendMode {
float pAlphaFactor = prev.w * (1 - inOutColor.w);
float aOut = inOutColor.w + pAlphaFactor;
- inOutColor.x = (inOutColor.x + prev.x * pAlphaFactor) / aOut;
- inOutColor.y = (inOutColor.y + prev.y * pAlphaFactor) / aOut;
- inOutColor.z = (inOutColor.z + prev.z * pAlphaFactor) / aOut;
+ inOutColor.x = (inOutColor.x * inOutColor.w + prev.x * pAlphaFactor) / aOut;
+ inOutColor.y = (inOutColor.y * inOutColor.w + prev.y * pAlphaFactor) / aOut;
+ inOutColor.z = (inOutColor.z * inOutColor.w + prev.z * pAlphaFactor) / aOut;
inOutColor.w = aOut;
});
diff --git a/src/main/java/dev/figboot/cuberender/state/Texture.java b/src/main/java/dev/figboot/cuberender/state/Texture.java
index 843638d..70e66b2 100644
--- a/src/main/java/dev/figboot/cuberender/state/Texture.java
+++ b/src/main/java/dev/figboot/cuberender/state/Texture.java
@@ -11,4 +11,8 @@ public class Texture {
this.width = image.getWidth();
this.height = image.getHeight();
}
+
+ public float calcAspect() {
+ return (float)width / height;
+ }
}
diff --git a/src/main/java/dev/figboot/cuberender/test/GraphicsPanel.java b/src/main/java/dev/figboot/cuberender/test/GraphicsPanel.java
index fa5d954..872b2f9 100644
--- a/src/main/java/dev/figboot/cuberender/test/GraphicsPanel.java
+++ b/src/main/java/dev/figboot/cuberender/test/GraphicsPanel.java
@@ -21,14 +21,16 @@ public class GraphicsPanel extends JPanel {
private Framebuffer framebuffer;
private final EnumMap<BodyPart, Mesh<?>> meshes = new EnumMap<>(BodyPart.class);
- private float xRot = 0, yRot = 0;
+ private float xRot = 0, yRot = 0, capeRot = 0;
private long[] clrTime = new long[32];
private long[] meshTime = new long[32];
private int tidx = 0;
boolean rollOver = false;
- private static void addCuboid(Mesh.Builder mb, float x1, float y1, float z1, float x2, float y2, float z2, float tx, float ty, float tspanX, float tspanY, float tspanZ, int ibase) {
+ private Matrix4f defaultTransform, capeTransform;
+
+ private static void addCuboid(Mesh.Builder mb, float x1, float y1, float z1, float x2, float y2, float z2, float tx, float ty, float tspanX, float tspanY, float tspanZ, float aspect, int ibase) {
mb.vertex(new Vector4f(x1, y1, z2), /* front */
new Vector4f(x1, y2, z2),
new Vector4f(x2, y2, z2),
@@ -98,9 +100,9 @@ public class GraphicsPanel extends JPanel {
new Vector2f(tx, ty + tspanZ),
new Vector2f(tx, ty),
new Vector2f(tx + tspanX, ty),
- new Vector2f(tx + tspanX, ty + tspanZ),
+ new Vector2f(tx + tspanX, ty + (tspanZ / aspect)),
- new Vector2f(tx + tspanX, ty + tspanZ),
+ new Vector2f(tx + tspanX, ty + (tspanZ / aspect)),
new Vector2f(tx + tspanX, ty),
new Vector2f(tx + 2 * tspanX, ty),
new Vector2f(tx + 2 * tspanX, ty + tspanZ))
@@ -139,6 +141,7 @@ public class GraphicsPanel extends JPanel {
// TODO: this is incomplete. the actual game mirrors the arm (so there is always an "inside" and an "outside")
copyLimbFlipped(bi.getSubimage(0, 16, 16, 16), realBI.getSubimage(16, 48, 16, 16));
copyLimbFlipped(bi.getSubimage(40, 16, 16, 16), realBI.getSubimage(32, 48, 16, 16));
+ g2d.dispose();
try {
ImageIO.write(realBI, "PNG", new File("test.png"));
@@ -163,7 +166,7 @@ public class GraphicsPanel extends JPanel {
});
BufferedImage bi;
- try (InputStream is = getClass().getResourceAsStream("/skin2.png")) {
+ try (InputStream is = getClass().getResourceAsStream("/translucent.png")) {
bi = ImageIO.read(is);
} catch (IOException e) {
throw new RuntimeException(e);
@@ -187,6 +190,7 @@ public class GraphicsPanel extends JPanel {
// TODO: slim model
boolean slim = false;
float overlayOffset = 1/64f;
+ float aspect = tex.calcAspect();
int idxbase = -24;
// head
@@ -194,38 +198,38 @@ public class GraphicsPanel extends JPanel {
-4 / 16f, -16 / 16f, -4 / 16f,
4 / 16f, -8 / 16f, 4 / 16f,
1 / 8f, 7 / 8f,
- 1 / 8f, 1 / 8f, 1 / 8f, idxbase += 24);
+ 1 / 8f, 1 / 8f, 1 / 8f, aspect, idxbase += 24);
// torso
addCuboid(bodyBuilder,
-4 / 16f, -8 / 16f, -2 / 16f,
4 / 16f, 4 / 16f, 2 / 16f,
5 / 16f, 11 / 16f,
- 1 / 8f, 3 / 16f, 1 / 16f, idxbase += 24);
+ 1 / 8f, 3 / 16f, 1 / 16f, aspect, idxbase += 24);
// left+right arm
addCuboid(bodyBuilder,
(slim ? -7 : -8) / 16f, -8 / 16f, -2 / 16f,
-4 / 16f, 4 / 16f, 2 / 16f,
11 / 16f, 11 / 16f,
- (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, idxbase += 24);
+ (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, aspect, idxbase += 24);
addCuboid(bodyBuilder,
4 / 16f, -8 / 16f, -2 / 16f,
(slim ? 7 : 8) / 16f, 4 / 16f, 2 / 16f,
9 / 16f, 3 / 16f,
- (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, idxbase += 24);
+ (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, aspect, idxbase += 24);
// left+right leg
addCuboid(bodyBuilder,
-4 / 16f, 4 / 16f, -2 / 16f,
0 / 16f, 16 / 16f, 2 / 16f,
1 / 16f, 11 / 16f,
- 1 / 16f, 3 / 16f, 1 / 16f, idxbase += 24);
+ 1 / 16f, 3 / 16f, 1 / 16f, aspect, idxbase += 24);
addCuboid(bodyBuilder,
0 / 16f, 4 / 16f, -2 / 16f,
4 / 16f, 16 / 16f, 2 / 16f,
5 / 16f, 3 / 16f,
- 1 / 16f, 3 / 16f, 1 / 16f, idxbase += 24);
+ 1 / 16f, 3 / 16f, 1 / 16f, aspect, idxbase += 24);
meshes.put(BodyPart.MAIN, bodyBuilder.build());
Mesh.Builder hatBuilder = defaultBuilder().texture(tex);
@@ -233,7 +237,7 @@ public class GraphicsPanel extends JPanel {
-4 / 16f - overlayOffset, -16 / 16f - overlayOffset, -4 / 16f - overlayOffset,
4 / 16f + overlayOffset, -8 / 16f + overlayOffset, 4 / 16f + overlayOffset,
5 / 8f, 7 / 8f,
- 1 / 8f, 1 / 8f, 1 / 8f, 0);
+ 1 / 8f, 1 / 8f, 1 / 8f, aspect, 0);
meshes.put(BodyPart.HAT, hatBuilder.build());
@@ -243,7 +247,7 @@ public class GraphicsPanel extends JPanel {
-4 / 16f - overlayOffset, -8 / 16f - overlayOffset, -2 / 16f - overlayOffset,
4 / 16f + overlayOffset, 4 / 16f + overlayOffset, 2 / 16f + overlayOffset,
5 / 16f, 7 / 16f,
- 1 / 8f, 3 / 16f, 1 / 16f, 0);
+ 1 / 8f, 3 / 16f, 1 / 16f, aspect, 0);
meshes.put(BodyPart.TORSO_OVERLAY, torsoBuilder.build());
@@ -253,7 +257,7 @@ public class GraphicsPanel extends JPanel {
(slim ? -7 : -8) / 16f - overlayOffset, -8 / 16f - overlayOffset, -2 / 16f - overlayOffset,
-4 / 16f + overlayOffset, 4 / 16f + overlayOffset, 2 / 16f + overlayOffset,
13 / 16f, 3 / 16f,
- (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, 0);
+ (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, aspect, 0);
meshes.put(BodyPart.LEFT_ARM_OVERLAY, leftArmBuilder.build());
@@ -262,7 +266,7 @@ public class GraphicsPanel extends JPanel {
4 / 16f - overlayOffset, -8 / 16f - overlayOffset, -2 / 16f - overlayOffset,
(slim ? 7 : 8) / 16f + overlayOffset, 4 / 16f + overlayOffset, 2 / 16f + overlayOffset,
11 / 16f, 7 / 16f,
- (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, 0);
+ (slim ? 3 / 64f : 1 / 16f), 3 / 16f, 1 / 16f, aspect, 0);
meshes.put(BodyPart.RIGHT_ARM_OVERLAY, rightArmBuilder.build());
@@ -272,7 +276,7 @@ public class GraphicsPanel extends JPanel {
-4 / 16f - overlayOffset, 4 / 16f - overlayOffset, -2 / 16f - overlayOffset,
0 / 16f + overlayOffset, 16 / 16f + overlayOffset, 2 / 16f + overlayOffset,
1 / 16f, 7 / 16f,
- 1 / 16f, 3 / 16f, 1 / 16f, 0);
+ 1 / 16f, 3 / 16f, 1 / 16f, aspect, 0);
meshes.put(BodyPart.LEFT_LEG_OVERLAY, leftLegBuilder.build());
overlayOffset /= 1.01f;
@@ -281,16 +285,18 @@ public class GraphicsPanel extends JPanel {
0 / 16f - overlayOffset, 4 / 16f - overlayOffset, -2 / 16f - overlayOffset,
4 / 16f + overlayOffset, 16 / 16f + overlayOffset, 2 / 16f + overlayOffset,
1 / 16f, 3 / 16f,
- 1 / 16f, 3 / 16f, 1 / 16f, 0);
+ 1 / 16f, 3 / 16f, 1 / 16f, aspect, 0);
meshes.put(BodyPart.RIGHT_LEG_OVERLAY, rightLegBuilder.build());
- Mesh.Builder capeBuilder = defaultBuilder().texture(new Texture(capeBI));
+ Texture capeTex = new Texture(capeBI);
+
+ Mesh.Builder capeBuilder = defaultBuilder().texture(capeTex);
addCuboid(capeBuilder,
- 0 / 16f - overlayOffset, 4 / 16f - overlayOffset, -2 / 16f - overlayOffset,
- 4 / 16f + overlayOffset, 16 / 16f + overlayOffset, 2 / 16f + overlayOffset,
- 1 / 16f, 3 / 16f,
- 1 / 16f, 3 / 16f, 1 / 16f, 0);
- meshes.put(BodyPart.RIGHT_LEG_OVERLAY, rightLegBuilder.build());
+ -4/16f, 0, 0,
+ 4/16f, 16/16f, 1/16f,
+ 1/64f, 31/32f,
+ 10/64f, 16/32f, 1/64f, capeTex.calcAspect(), 0);
+ meshes.put(BodyPart.CAPE, capeBuilder.build());
}
private void handleResize(int width, int height) {
@@ -299,7 +305,8 @@ public class GraphicsPanel extends JPanel {
}
private void updateTransform() {
- framebuffer.setTransform(Matrix4f.rotateY(yRot).times(Matrix4f.rotateX(xRot)).times(Matrix4f.scale(0.5f)));
+ defaultTransform = Matrix4f.rotateY(yRot).times(Matrix4f.rotateX(xRot)).times(Matrix4f.scale(0.75f));
+ capeTransform = new Matrix4f(defaultTransform).times(Matrix4f.scale(-1, 1, -1)).times(Matrix4f.translate(0, -8/16f, 2/16f)).times(Matrix4f.rotateX(capeRot));
}
@Override
@@ -310,6 +317,11 @@ public class GraphicsPanel extends JPanel {
framebuffer.setBlendMode(BlendMode.DISABLE);
framebuffer.clear(Framebuffer.FB_CLEAR_COLOR | Framebuffer.FB_CLEAR_DEPTH, 0xFF000000);
long t1 = System.nanoTime();
+
+ framebuffer.setTransform(capeTransform);
+ framebuffer.drawMesh(meshes.get(BodyPart.CAPE));
+
+ framebuffer.setTransform(defaultTransform);
framebuffer.setDepthMode(Framebuffer.FB_DEPTH_COMMIT | Framebuffer.FB_DEPTH_USE);
framebuffer.drawMesh(meshes.get(BodyPart.MAIN));
@@ -372,6 +384,11 @@ public class GraphicsPanel extends JPanel {
updateTransform();
}
+ public void setCapeRot(float rad) {
+ this.capeRot = rad;
+ updateTransform();
+ }
+
public enum BodyPart {
MAIN,
HAT,
diff --git a/src/main/java/dev/figboot/cuberender/test/TestWindow.java b/src/main/java/dev/figboot/cuberender/test/TestWindow.java
index fc768a3..770648f 100644
--- a/src/main/java/dev/figboot/cuberender/test/TestWindow.java
+++ b/src/main/java/dev/figboot/cuberender/test/TestWindow.java
@@ -13,6 +13,7 @@ public class TestWindow extends JFrame {
JPanel panel = new JPanel();
JSlider sliderY = new JSlider();
JSlider sliderX = new JSlider();
+ JSlider sliderCape = new JSlider();
GraphicsPanel gp = new GraphicsPanel();
sliderY.setMinimum(-180);
@@ -22,13 +23,19 @@ public class TestWindow extends JFrame {
sliderX.setMaximum(180);
sliderX.setOrientation(JSlider.VERTICAL);
+ sliderCape.setMinimum(-180);
+ sliderCape.setMaximum(180);
+ sliderCape.setOrientation(JSlider.VERTICAL);
+
sliderX.setValue(0);
sliderY.setValue(0);
+ sliderCape.setValue(0);
panel.setLayout(new BorderLayout());
panel.add(gp, BorderLayout.CENTER);
panel.add(sliderY, BorderLayout.SOUTH);
panel.add(sliderX, BorderLayout.EAST);
+ panel.add(sliderCape, BorderLayout.WEST);
setContentPane(panel);
@@ -41,6 +48,11 @@ public class TestWindow extends JFrame {
gp.setXRot((float)Math.toRadians(sliderX.getValue()));
gp.repaint();
});
+
+ sliderCape.addChangeListener(e -> {
+ gp.setCapeRot((float)Math.toRadians(sliderCape.getValue()));
+ gp.repaint();
+ });
}
public static void main(String[] args) {
diff --git a/src/main/resources/cape.png b/src/main/resources/cape.png
index 9a3c129..5e05cf7 100644
--- a/src/main/resources/cape.png
+++ b/src/main/resources/cape.png
Binary files differ
diff --git a/src/main/resources/translucent.png b/src/main/resources/translucent.png
index 8649f7c..ee98c3f 100644
--- a/src/main/resources/translucent.png
+++ b/src/main/resources/translucent.png
Binary files differ