Skip to content

Commit

Permalink
Add VoxelShape
Browse files Browse the repository at this point in the history
  • Loading branch information
squid233 committed Jul 27, 2024
1 parent f693b27 commit 14f1c44
Show file tree
Hide file tree
Showing 33 changed files with 603 additions and 377 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@
import freeworld.client.render.screen.ingame.CreativeTabScreen;
import freeworld.client.render.screen.ingame.PauseScreen;
import freeworld.client.render.screen.Screen;
import freeworld.client.render.world.HitResult;
import freeworld.client.render.world.BlockHitResult;
import freeworld.client.render.world.WorldRenderer;
import freeworld.core.registry.Registries;
import freeworld.math.Vector2d;
import freeworld.math.Vector3d;
import freeworld.math.Vector3i;
import freeworld.util.Direction;
import freeworld.util.Logging;
import freeworld.util.math.MathUtil;
Expand Down Expand Up @@ -296,24 +297,25 @@ private void tick() {
MathUtil.moveRelative(xo, 0.0, zo, player.getComponent(EntityComponents.ROTATION).y(), speed));

if (blockDestroyTimer >= 2) {
final HitResult hitResult = gameRenderer.hitResult();
final BlockHitResult hitResult = gameRenderer.hitResult();
if (!hitResult.missed() &&
glfw.getMouseButton(window, GLFW.MOUSE_BUTTON_LEFT) == GLFW.PRESS) {
world.setBlockType(hitResult.x(), hitResult.y(), hitResult.z(), BlockTypes.AIR);
blockDestroyTimer = 0;
}
}
if (blockPlaceTimer >= 2) {
final HitResult hitResult = gameRenderer.hitResult();
final BlockHitResult hitResult = gameRenderer.hitResult();
if (!hitResult.missed() &&
glfw.getMouseButton(window, GLFW.MOUSE_BUTTON_RIGHT) == GLFW.PRESS) {
final Direction face = hitResult.face();
final BlockType type = hotBar[hotBarSelection];
if (!type.air()) {
Vector3i axis = face.axis();
world.setBlockType(
hitResult.x() + face.axisX(),
hitResult.y() + face.axisY(),
hitResult.z() + face.axisZ(),
hitResult.x() + axis.x(),
hitResult.y() + axis.y(),
hitResult.z() + axis.z(),
type
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@
import freeworld.client.render.texture.TextureAtlas;
import freeworld.client.render.texture.TextureManager;
import freeworld.client.render.world.BlockRenderer;
import freeworld.client.render.world.HitResult;
import freeworld.client.render.world.BlockHitResult;
import freeworld.client.render.world.WorldRenderer;
import freeworld.client.world.chunk.ClientChunk;
import freeworld.core.Identifier;
import freeworld.core.ModelResourcePath;
import freeworld.core.math.AABBox;
import freeworld.math.Matrix4f;
import freeworld.util.Direction;
import freeworld.util.Logging;
import freeworld.util.math.Lined;
import freeworld.world.entity.Entity;
import org.slf4j.Logger;
import overrungl.opengl.GL10C;
Expand All @@ -58,7 +58,7 @@ public final class GameRenderer implements GLResource {
private HudRenderer hudRenderer;
private BlockRenderer blockRenderer;
private WorldRenderer worldRenderer;
private HitResult hitResult = new HitResult(true, null, 0, 0, 0, Direction.SOUTH);
private BlockHitResult hitResult = new BlockHitResult(true, null, 0, 0, 0, Direction.SOUTH);

public GameRenderer(Freeworld client) {
this.client = client;
Expand Down Expand Up @@ -157,40 +157,33 @@ public void render(GLStateMgr gl, double partialTick) {
final List<ClientChunk> chunks = worldRenderer.renderingChunks(player);
worldRenderer.compileChunks(chunks);

hitResult = worldRenderer.selectBlock(player);

RenderSystem.bindTexture2D(textureManager.getTexture(TextureManager.BLOCK_ATLAS));
if (!hitResult.missed()) {
gl.enablePolygonOffsetFill();
gl.setPolygonOffset(1.0f, 1.0f);
gl.setLineWidth(2.0f);
}
worldRenderer.renderChunks(gl, chunks);
if (!hitResult.missed()) {
gl.disablePolygonOffsetFill();
gl.setLineWidth(1.0f);
}

hitResult = worldRenderer.selectBlock(player);
if (!hitResult.missed()) {
final AABBox box = hitResult.blockType().outlineShape().move(hitResult.x(), hitResult.y(), hitResult.z());
final float minX = (float) box.minX();
final float minY = (float) box.minY();
final float minZ = (float) box.minZ();
final float maxX = (float) box.maxX();
final float maxY = (float) box.maxY();
final float maxZ = (float) box.maxZ();
final float offset = 0.005f;
var lines = hitResult.blockType().outlineShape().toLines(Direction.LIST);
Matrix4f mat = Matrix4f.translation(hitResult.x(), hitResult.y(), hitResult.z());
RenderSystem.bindTexture2D(null);
RenderSystem.useProgram(positionColorProgram);
RenderSystem.updateMatrices();
final Tessellator tessellator = Tessellator.getInstance();
tessellator.begin(GLDrawMode.LINES);
// -x
tessellator.indices(0, 1, 0, 2, 1, 3, 2, 3);
// +x
tessellator.indices(4, 5, 4, 6, 5, 7, 6, 7);
// -z
tessellator.indices(0, 4, 2, 6);
// +z
tessellator.indices(1, 5, 3, 7);
tessellator.position(minX - offset, minY - offset, minZ - offset).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(minX - offset, minY - offset, maxZ + offset).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(minX - offset, maxY + offset, minZ - offset).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(minX - offset, maxY + offset, maxZ + offset).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(maxX + offset, minY - offset, minZ - offset).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(maxX + offset, minY - offset, maxZ + offset).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(maxX + offset, maxY + offset, minZ - offset).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(maxX + offset, maxY + offset, maxZ + offset).color(0, 0, 0).texCoord(0f, 0f).emit();
for (Lined line : lines) {
tessellator.indices(0, 1);
tessellator.position(mat, line.from().toVector3f()).color(0, 0, 0).texCoord(0f, 0f).emit();
tessellator.position(mat, line.to().toVector3f()).color(0, 0, 0).texCoord(0f, 0f).emit();
}
tessellator.end(gl);
}

Expand Down Expand Up @@ -262,7 +255,7 @@ public BlockRenderer blockRenderer() {
return blockRenderer;
}

public HitResult hitResult() {
public BlockHitResult hitResult() {
return hitResult;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import freeworld.client.render.model.vertex.VertexLayout;
import freeworld.client.render.model.vertex.VertexLayouts;
import freeworld.math.Matrix4f;
import freeworld.math.Vector3f;
import overrungl.opengl.GL10C;
import overrungl.opengl.GL15C;

Expand Down Expand Up @@ -62,6 +63,12 @@ public Tessellator position(Matrix4f positionMatrix, float x, float y, float z)
return this;
}

@Override
public Tessellator position(Matrix4f positionMatrix, Vector3f v) {
VertexBuilder.super.position(positionMatrix, v);
return this;
}

@Override
public Tessellator color(int red, int green, int blue, int alpha) {
vertexBuilder.color(red, green, blue, alpha);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import freeworld.client.render.model.vertex.VertexFormat;
import freeworld.client.render.model.vertex.VertexLayout;
import freeworld.math.Matrix4f;
import freeworld.math.Vector3f;
import freeworld.util.Logging;
import org.slf4j.Logger;

Expand Down Expand Up @@ -116,6 +117,12 @@ public DefaultVertexBuilder position(Matrix4f positionMatrix, float x, float y,
return this;
}

@Override
public DefaultVertexBuilder position(Matrix4f positionMatrix, Vector3f v) {
VertexBuilder.super.position(positionMatrix, v);
return this;
}

@Override
public DefaultVertexBuilder color(int red, int green, int blue, int alpha) {
VertexBuilder.super.color(red, green, blue, alpha);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import freeworld.client.render.model.vertex.VertexLayout;
import freeworld.math.Matrix4f;
import freeworld.math.Vector3f;
import freeworld.math.Vector4f;

import java.lang.foreign.MemorySegment;
Expand Down Expand Up @@ -42,6 +43,10 @@ default VertexBuilder position(Matrix4f positionMatrix, float x, float y, float
return position(v.x(), v.y(), v.z());
}

default VertexBuilder position(Matrix4f positionMatrix, Vector3f v) {
return position(positionMatrix, v.x(), v.y(), v.z());
}

default VertexBuilder color(int red, int green, int blue, int alpha) {
nextElement((byte) red);
nextElement((byte) green);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ public abstract class GLStateMgr implements GL {
private int currentProgram = 0;
private int depthFunc = LESS;
private boolean depthTest = false;
private float lineWidth = 1.0f;
private boolean polygonOffsetFill = false;
private float polygonOffsetFactor = 0.0f;
private float polygonOffsetUnits = 0.0f;
private int textureBinding2D = 0;
private int vertexArrayBinding = 0;

Expand Down Expand Up @@ -174,6 +178,60 @@ public boolean depthTest() {
return depthTest;
}

@Skip
public void setLineWidth(float width) {
if (this.lineWidth != width) {
this.lineWidth = width;
lineWidth(width);
}
}

@Skip
public float lineWidth() {
return lineWidth;
}

@Skip
public void enablePolygonOffsetFill() {
if (!this.polygonOffsetFill) {
this.polygonOffsetFill = true;
enable(POLYGON_OFFSET_FILL);
}
}

@Skip
public void disablePolygonOffsetFill() {
if (this.polygonOffsetFill) {
this.polygonOffsetFill = false;
disable(POLYGON_OFFSET_FILL);
}
}

@Skip
public boolean polygonOffsetFill() {
return polygonOffsetFill;
}

@Skip
public void setPolygonOffset(float factor, float units) {
if (this.polygonOffsetFactor != factor ||
this.polygonOffsetUnits != units) {
this.polygonOffsetFactor = factor;
this.polygonOffsetUnits = units;
polygonOffset(factor, units);
}
}

@Skip
public float polygonOffsetFactor() {
return polygonOffsetFactor;
}

@Skip
public float polygonOffsetUnits() {
return polygonOffsetUnits;
}

@Skip
public void setTextureBinding2D(int textureBinding2D) {
if (this.textureBinding2D != textureBinding2D) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* License as published by the Free Software Foundation;
* only version 2.1 of the License.
*/

package freeworld.client.render.world;
Expand All @@ -17,7 +17,7 @@
* @author squid233
* @since 0.1.0
*/
public record HitResult(
public record BlockHitResult(
boolean missed,
BlockType blockType,
int x,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
import freeworld.math.Matrix4f;
import freeworld.math.Vector2f;
import freeworld.math.Vector3f;
import freeworld.math.Vector4i;
import freeworld.util.Direction;
import freeworld.util.math.AABBox;

import java.util.function.Predicate;

Expand All @@ -38,51 +40,18 @@ public BlockRenderer(TextureManager textureManager) {

private void emitVertices(VertexBuilder builder, Matrix4f matrix, Vector3f from, Vector3f to, Vector2f uvFrom, Vector2f uvTo, Direction direction) {
// TODO: 2024/7/6 squid233: color
float color;
switch (direction) {
case WEST -> {
color = 0.7f;
builder.position(matrix, from.x(), to.y(), from.z()).color(color, color, color).texCoord(uvFrom.x(), uvFrom.y()).emit();
builder.position(matrix, from.x(), from.y(), from.z()).color(color, color, color).texCoord(uvFrom.x(), uvTo.y()).emit();
builder.position(matrix, from.x(), from.y(), to.z()).color(color, color, color).texCoord(uvTo.x(), uvTo.y()).emit();
builder.position(matrix, from.x(), to.y(), to.z()).color(color, color, color).texCoord(uvTo.x(), uvFrom.y()).emit();
}
case EAST -> {
color = 1.0f;
builder.position(matrix, to.x(), to.y(), to.z()).color(color, color, color).texCoord(uvFrom.x(), uvFrom.y()).emit();
builder.position(matrix, to.x(), from.y(), to.z()).color(color, color, color).texCoord(uvFrom.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), from.y(), from.z()).color(color, color, color).texCoord(uvTo.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), to.y(), from.z()).color(color, color, color).texCoord(uvTo.x(), uvFrom.y()).emit();
}
case DOWN -> {
color = 0.6f;
builder.position(matrix, from.x(), from.y(), to.z()).color(color, color, color).texCoord(uvFrom.x(), uvFrom.y()).emit();
builder.position(matrix, from.x(), from.y(), from.z()).color(color, color, color).texCoord(uvFrom.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), from.y(), from.z()).color(color, color, color).texCoord(uvTo.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), from.y(), to.z()).color(color, color, color).texCoord(uvTo.x(), uvFrom.y()).emit();
}
case UP -> {
color = 0.9f;
builder.position(matrix, from.x(), to.y(), from.z()).color(color, color, color).texCoord(uvFrom.x(), uvFrom.y()).emit();
builder.position(matrix, from.x(), to.y(), to.z()).color(color, color, color).texCoord(uvFrom.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), to.y(), to.z()).color(color, color, color).texCoord(uvTo.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), to.y(), from.z()).color(color, color, color).texCoord(uvTo.x(), uvFrom.y()).emit();
}
case NORTH -> {
color = 0.8f;
builder.position(matrix, to.x(), to.y(), from.z()).color(color, color, color).texCoord(uvFrom.x(), uvFrom.y()).emit();
builder.position(matrix, to.x(), from.y(), from.z()).color(color, color, color).texCoord(uvFrom.x(), uvTo.y()).emit();
builder.position(matrix, from.x(), from.y(), from.z()).color(color, color, color).texCoord(uvTo.x(), uvTo.y()).emit();
builder.position(matrix, from.x(), to.y(), from.z()).color(color, color, color).texCoord(uvTo.x(), uvFrom.y()).emit();
}
case SOUTH -> {
color = 0.8f;
builder.position(matrix, from.x(), to.y(), to.z()).color(color, color, color).texCoord(uvFrom.x(), uvFrom.y()).emit();
builder.position(matrix, from.x(), from.y(), to.z()).color(color, color, color).texCoord(uvFrom.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), from.y(), to.z()).color(color, color, color).texCoord(uvTo.x(), uvTo.y()).emit();
builder.position(matrix, to.x(), to.y(), to.z()).color(color, color, color).texCoord(uvTo.x(), uvFrom.y()).emit();
}
}
float color = switch (direction) {
case WEST -> 0.7f;
case EAST -> 1.0f;
case DOWN -> 0.6f;
case UP -> 0.9f;
case NORTH, SOUTH -> 0.8f;
};
Vector4i vertexIndices = direction.vertexIndices();
builder.position(matrix, AABBox.getPoint(from, to, vertexIndices.x())).color(color, color, color).texCoord(uvFrom.x(), uvFrom.y()).emit();
builder.position(matrix, AABBox.getPoint(from, to, vertexIndices.y())).color(color, color, color).texCoord(uvFrom.x(), uvTo.y()).emit();
builder.position(matrix, AABBox.getPoint(from, to, vertexIndices.z())).color(color, color, color).texCoord(uvTo.x(), uvTo.y()).emit();
builder.position(matrix, AABBox.getPoint(from, to, vertexIndices.w())).color(color, color, color).texCoord(uvTo.x(), uvFrom.y()).emit();
}

public void renderBlockModel(VertexBuilder builder, BlockModel model, Matrix4f matrix, int x, int y, int z, Predicate<Direction> shouldCullFace) {
Expand Down
Loading

0 comments on commit 14f1c44

Please sign in to comment.