Skip to content
This repository was archived by the owner on Nov 24, 2024. It is now read-only.

Commit 02d3bdb

Browse files
committed
Better player animations
1 parent 6fe8276 commit 02d3bdb

File tree

16 files changed

+237
-87
lines changed

16 files changed

+237
-87
lines changed

client/src/main/java/io/bluestaggo/voxelthing/Game.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ private void update(double delta) {
106106
}
107107

108108
world.partialTick = (tickTime % TICK_RATE) / TICK_RATE;
109-
renderer.camera.setPosition((float) player.getRenderX(), (float) (player.getRenderY() + player.height - 0.3), (float) player.getRenderZ());
109+
renderer.camera.setPosition((float) player.getPartialX(), (float) (player.getPartialY() + player.height - 0.3), (float) player.getPartialZ());
110110
renderer.camera.setRotation((float) player.rotYaw, (float) player.rotPitch);
111111

112112
if (thirdPerson) {
@@ -169,6 +169,10 @@ public String getSkin() {
169169
return "/assets/entities/" + SKINS[currentSkin] + ".png";
170170
}
171171

172+
public boolean showThirdPerson() {
173+
return thirdPerson;
174+
}
175+
172176
public boolean showDebug() {
173177
return debugMenu;
174178
}

client/src/main/java/io/bluestaggo/voxelthing/renderer/MainRenderer.java

Lines changed: 54 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44
import io.bluestaggo.voxelthing.assets.FontManager;
55
import io.bluestaggo.voxelthing.assets.Texture;
66
import io.bluestaggo.voxelthing.assets.TextureManager;
7-
import io.bluestaggo.voxelthing.renderer.draw.Billboard;
87
import io.bluestaggo.voxelthing.renderer.draw.Draw2D;
98
import io.bluestaggo.voxelthing.renderer.draw.Draw3D;
10-
import io.bluestaggo.voxelthing.renderer.draw.Quad;
119
import io.bluestaggo.voxelthing.renderer.screen.Screen;
1210
import io.bluestaggo.voxelthing.renderer.shader.*;
1311
import io.bluestaggo.voxelthing.renderer.world.BlockRenderer;
1412
import io.bluestaggo.voxelthing.renderer.world.Camera;
13+
import io.bluestaggo.voxelthing.renderer.world.EntityRenderer;
1514
import io.bluestaggo.voxelthing.renderer.world.WorldRenderer;
16-
import io.bluestaggo.voxelthing.window.Window;
1715
import org.joml.Matrix4f;
1816
import org.joml.Vector3f;
1917
import org.joml.Vector4f;
@@ -37,6 +35,7 @@ public class MainRenderer {
3735
public final Draw3D draw3D;
3836
public final WorldRenderer worldRenderer;
3937
public final BlockRenderer blockRenderer;
38+
public final EntityRenderer entityRenderer;
4039

4140
public final Draw2D draw2D;
4241

@@ -64,6 +63,7 @@ public MainRenderer(Game game) {
6463
draw3D = new Draw3D(this);
6564
worldRenderer = new WorldRenderer(this);
6665
blockRenderer = new BlockRenderer();
66+
entityRenderer = new EntityRenderer(this);
6767

6868
draw2D = new Draw2D(this);
6969

@@ -87,10 +87,16 @@ public void draw() {
8787
glClearColor(skyColor.x, skyColor.y, skyColor.z, skyColor.w);
8888
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
8989

90+
draw3D.setup();
91+
92+
render3D();
93+
render2D();
94+
}
95+
96+
private void render3D() {
9097
Matrix4f view = camera.getView();
9198
Matrix4f proj = camera.getProj();
9299
Matrix4f viewProj = proj.mul(view, new Matrix4f());
93-
draw3D.setup();
94100

95101
try (var state = new GLState()) {
96102
state.enable(GL_CULL_FACE);
@@ -107,89 +113,57 @@ public void draw() {
107113

108114
setupWorldShader(viewProj);
109115
textures.getWorldTexture("/assets/blocks.png").use();
110-
glActiveTexture(GL_TEXTURE1);
111-
glBindTexture(GL_TEXTURE_2D, skyFramebuffer.getTexture());
112-
glActiveTexture(GL_TEXTURE0);
116+
useSkyTexture(1);
113117
worldRenderer.draw();
114118

119+
state.disable(GL_CULL_FACE);
120+
115121
String skin = game.getSkin();
116-
Texture skinTex = textures.getTexture(skin);
117-
int frame = skin.contains("floof") || skin.contains("talon") ? (int) (Window.getTimeElapsed() * 8.0D) % 8
118-
: skin.contains("staggo") || skin.contains("talon") ? 1 : 0;
119-
double walk = skin.contains("staggo") || skin.contains("talon") ? Math.sin(Window.getTimeElapsed() * 8.0D) : 0.0;
120-
float minX = frame < 5 ? skinTex.uCoord(32) : skinTex.uCoord(64);
121-
float maxX = frame < 5 ? skinTex.uCoord(64) : skinTex.uCoord(32);
122-
float minY = frame < 5 ? skinTex.vCoord(frame * 32) : skinTex.vCoord((8 - frame) * 32);
123-
float maxY = minY + skinTex.vCoord(32);
124-
125-
if (walk > 0.2) {
126-
minX += skinTex.uCoord(32);
127-
maxX += skinTex.uCoord(32);
128-
} else if (walk < -0.2) {
129-
minX -= skinTex.uCoord(32);
130-
maxX -= skinTex.uCoord(32);
122+
game.player.setTexture(skin);
123+
if (game.showThirdPerson()) {
124+
entityRenderer.renderEntity(game.player);
131125
}
132126

133127
Texture.stop();
128+
Shader.stop();
129+
}
130+
}
134131

135-
try (var billboardState = new GLState(state)) {
136-
billboardState.disable(GL_CULL_FACE);
137-
draw3D.drawBillboard(new Billboard()
138-
.at((float) game.player.getRenderX(), (float) (game.player.getRenderY() + Math.abs(walk / 2.0)), (float) game.player.getRenderZ())
139-
.scale(2.0f, 2.0f)
140-
.align(0.5f, 0.0f)
141-
.setSpherical(false)
142-
.withTexture(skinTex)
143-
.withUV(minX, minY, maxX, maxY));
144-
}
132+
private void render2D() {
133+
screenShader.use();
134+
screenShader.mvp.set(screen.getViewProj());
145135

146-
Texture.stop();
147-
Shader.stop();
136+
fonts.outlined.print("§00ffffVOXEL THING §00ff00" + Game.VERSION, 5, 5, 1.0f, 1.0f, 1.0f);
148137

149-
screenShader.use();
150-
screenShader.mvp.set(screen.getViewProj());
138+
if (game.showDebug()) {
139+
long freeMB = Runtime.getRuntime().freeMemory() / 1000000L;
140+
long totalMB = Runtime.getRuntime().totalMemory() / 1000000L;
141+
long maxMB = Runtime.getRuntime().maxMemory() / 1000000L;
151142

152-
state.disable(GL_CULL_FACE);
153-
state.disable(GL_DEPTH_TEST);
154-
155-
Quad quad = new Quad();
156-
draw2D.drawQuad(quad.clear().at(0, screen.getHeight() - 32 - (float) Math.abs(walk / 2.0) * 16.0f)
157-
.size(32, 32)
158-
.withTexture(skinTex)
159-
.withUV(minX, minY, maxX, maxY));
160-
161-
fonts.outlined.print("§00ffffVOXEL THING §00ff00" + Game.VERSION, 5, 5, 1.0f, 1.0f, 1.0f);
162-
163-
if (game.showDebug()) {
164-
long freeMB = Runtime.getRuntime().freeMemory() / 1000000L;
165-
long totalMB = Runtime.getRuntime().totalMemory() / 1000000L;
166-
long maxMB = Runtime.getRuntime().maxMemory() / 1000000L;
167-
168-
String[] lines = {
169-
"Speed", (int)(game.window.getDeltaTime() * 1000.0D) + "ms",
170-
"Memory", (totalMB - freeMB) + " / " + maxMB + " MB",
171-
"Render Distance", String.valueOf(worldRenderer.renderDistance),
172-
"GUI Scale", String.valueOf(screen.scale <= 0.0f ? "auto" : screen.scale)
173-
};
174-
175-
StringBuilder debugBuilder = new StringBuilder();
176-
177-
for (int i = 0; i < lines.length / 2; i++) {
178-
String label = lines[i * 2];
179-
String value = lines[i * 2 + 1];
180-
181-
if (!debugBuilder.isEmpty()) {
182-
debugBuilder.append('\n');
183-
}
184-
185-
debugBuilder.append("§ffff7f");
186-
debugBuilder.append(label);
187-
debugBuilder.append(": §ffffff");
188-
debugBuilder.append(value);
143+
String[] lines = {
144+
"Speed", (int)(game.window.getDeltaTime() * 1000.0D) + "ms",
145+
"Memory", (totalMB - freeMB) + " / " + maxMB + " MB",
146+
"Render Distance", String.valueOf(worldRenderer.renderDistance),
147+
"GUI Scale", String.valueOf(screen.scale <= 0.0f ? "auto" : screen.scale)
148+
};
149+
150+
StringBuilder debugBuilder = new StringBuilder();
151+
152+
for (int i = 0; i < lines.length / 2; i++) {
153+
String label = lines[i * 2];
154+
String value = lines[i * 2 + 1];
155+
156+
if (!debugBuilder.isEmpty()) {
157+
debugBuilder.append('\n');
189158
}
190159

191-
fonts.shadowed.print(debugBuilder.toString(), 5, 15);
160+
debugBuilder.append("§ffff7f");
161+
debugBuilder.append(label);
162+
debugBuilder.append(": §ffffff");
163+
debugBuilder.append(value);
192164
}
165+
166+
fonts.shadowed.print(debugBuilder.toString(), 5, 15);
193167
}
194168
}
195169

@@ -214,6 +188,12 @@ public void setupFogShader(BaseFogShader shader) {
214188
camera.getFar());
215189
}
216190

191+
public void useSkyTexture(int i) {
192+
glActiveTexture(GL_TEXTURE0 + i);
193+
glBindTexture(GL_TEXTURE_2D, skyFramebuffer.getTexture());
194+
glActiveTexture(GL_TEXTURE0);
195+
}
196+
217197
public void unload() {
218198
textures.clear();
219199

client/src/main/java/io/bluestaggo/voxelthing/renderer/draw/Billboard.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.joml.Vector4f;
99

1010
public class Billboard {
11+
private static final Billboard shared = new Billboard();
1112
private final Vector3f position = new Vector3f();
1213
private final Vector2f size = new Vector2f();
1314
private final Vector2f align = new Vector2f();
@@ -26,9 +27,15 @@ public Billboard clear() {
2627
align.set(0.5f, 0.5f);
2728
color.set(1.0f, 1.0f, 1.0f, 1.0f);
2829
uv.set(0.0f, 1.0f, 1.0f, 0.0f);
30+
texture = null;
31+
spherical = false;
2932
return this;
3033
}
3134

35+
public static Billboard shared() {
36+
return shared.clear();
37+
}
38+
3239
public Billboard at(float x, float y, float z) {
3340
position.set(x, y, z);
3441
return this;
@@ -86,6 +93,7 @@ public void applyToShader(BillboardShader shader, Matrix4f view) {
8693
}
8794

8895
shader.modelView.set(modelView);
96+
shader.position.set(position);
8997
shader.size.set(size);
9098
shader.align.set(align);
9199
shader.hasTex.set(texture != null);

client/src/main/java/io/bluestaggo/voxelthing/renderer/draw/Quad.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.joml.Vector4f;
88

99
public class Quad {
10+
private static final Quad shared = new Quad();
1011
private final Vector2f position = new Vector2f();
1112
private final Vector2f size = new Vector2f();
1213
private final Vector4f color = new Vector4f();
@@ -22,9 +23,14 @@ public Quad clear() {
2223
size.set(1.0f, 1.0f);
2324
color.set(1.0f, 1.0f, 1.0f, 1.0f);
2425
uv.set(0.0f, 1.0f, 1.0f, 0.0f);
26+
texture = null;
2527
return this;
2628
}
2729

30+
public static Quad shared() {
31+
return shared.clear();
32+
}
33+
2834
public Quad at(float x, float y) {
2935
position.set(x, y);
3036
return this;

client/src/main/java/io/bluestaggo/voxelthing/renderer/shader/BillboardShader.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
public class BillboardShader extends Shader implements BaseFogShader {
1212
public final ShaderUniform<Matrix4f> modelView;
1313
public final ShaderUniform<Matrix4f> proj;
14+
public final ShaderUniform<Vector3f> position;
1415
public final ShaderUniform<Vector2f> align;
1516
public final ShaderUniform<Vector2f> size;
1617
public final ShaderUniform<Vector4f> uvRange;
@@ -26,9 +27,11 @@ public class BillboardShader extends Shader implements BaseFogShader {
2627

2728
public BillboardShader() throws IOException {
2829
super("/assets/shaders/billboard");
30+
use();
2931

3032
modelView = getUniformMatrix4fv("modelView");
3133
proj = getUniformMatrix4fv("proj");
34+
position = getUniform3f("position");
3235
size = getUniform2f("size");
3336
align = getUniform2f("align");
3437
uvRange = getUniform4f("uvRange");
@@ -41,6 +44,8 @@ public BillboardShader() throws IOException {
4144
skyHeight = getUniform1f("skyHeight");
4245
camPos = getUniform3f("camPos");
4346
camFar = getUniform1f("camFar");
47+
48+
stop();
4449
}
4550

4651
@Override

client/src/main/java/io/bluestaggo/voxelthing/renderer/shader/QuadShader.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class QuadShader extends Shader {
1919

2020
public QuadShader() throws IOException {
2121
super("/assets/shaders/quad");
22+
use();
2223

2324
viewProj = getUniformMatrix4fv("viewProj");
2425
size = getUniform2f("size");
@@ -28,5 +29,7 @@ public QuadShader() throws IOException {
2829
(tex = getUniform1i("tex")).set(0);
2930
hasTex = getUniform1b("hasTex");
3031
color = getUniform4f("color");
32+
33+
stop();
3134
}
3235
}

client/src/main/java/io/bluestaggo/voxelthing/renderer/shader/ScreenShader.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ public class ScreenShader extends Shader {
1313

1414
public ScreenShader() throws IOException {
1515
super("/assets/shaders/screen");
16+
use();
1617

1718
mvp = getUniformMatrix4fv("mvp");
1819

1920
(tex = getUniform1i("tex")).set(0);
2021
hasTex = getUniform1b("hasTex");
22+
23+
stop();
2124
}
2225
}

client/src/main/java/io/bluestaggo/voxelthing/renderer/world/Camera.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ public void setPosition(float x, float y, float z) {
5151
}
5252

5353
public void setRotation(float yaw, float pitch) {
54-
this.yaw = yaw;
55-
this.pitch = pitch;
54+
this.yaw = MathUtil.floorMod(yaw, 360.0f);
5655
this.pitch = MathUtil.clamp(pitch, -89.0f, 89.0f);
5756
updateVectors();
5857
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.bluestaggo.voxelthing.renderer.world;
2+
3+
import io.bluestaggo.voxelthing.assets.Texture;
4+
import io.bluestaggo.voxelthing.renderer.MainRenderer;
5+
import io.bluestaggo.voxelthing.renderer.draw.Billboard;
6+
import io.bluestaggo.voxelthing.world.entity.Entity;
7+
8+
public class EntityRenderer {
9+
private final MainRenderer renderer;
10+
11+
public EntityRenderer(MainRenderer renderer) {
12+
this.renderer = renderer;
13+
}
14+
15+
public void renderEntity(Entity entity) {
16+
Texture texture = renderer.textures.getTexture(entity.getTexture());
17+
18+
int rotation = entity.getRenderRotation(renderer.camera.getYaw());
19+
boolean flip = rotation > 4;
20+
21+
float minX = texture.uCoord(entity.getRenderFrame() * 32 + (flip ? 32 : 0));
22+
float minY = texture.vCoord(flip ? 96 - rotation * 32 : rotation * 32);
23+
float maxX = minX + texture.uCoord(flip ? -32 : 32);
24+
float maxY = minY + texture.vCoord(32);
25+
26+
renderer.draw3D.drawBillboard(Billboard.shared()
27+
.at(entity.getRenderX(), entity.getRenderY(), entity.getRenderZ())
28+
.scale(entity.getRenderWidth(), entity.getRenderHeight())
29+
.align(0.5f, 0.0f)
30+
.withTexture(texture)
31+
.withUV(minX, minY, maxX, maxY)
32+
);
33+
}
34+
}
247 Bytes
Loading

client/src/main/resources/assets/shaders/billboard.fsh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ float doFog(float fog) {
2121
}
2222

2323
void main() {
24-
if (texture(tex, uv).a < 0.5) discard;
24+
if (texture(tex, uv).a == 0.0) discard;
2525
float fog = clamp(distance(fPos, camPos) / camFar, 0.0, 1.0);
2626
fog = clamp(doFog(fog), 0.0, 1.0);
2727

0 commit comments

Comments
 (0)