From 80873eec27a474e27625e808e3190378ce82cb60 Mon Sep 17 00:00:00 2001 From: "sigonasr2, Sig, Sigo" Date: Mon, 8 Nov 2021 06:12:29 +0000 Subject: [PATCH] Change the front facing direction of a block programmatically. Co-authored-by: sigonasr2 --- src/sig/Block.java | 37 +++++++++++++++++++++++++++++++++++- src/sig/FacingDirection.java | 16 ++++++++++++++++ src/sig/SigRenderer.java | 7 +++++-- 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/sig/FacingDirection.java diff --git a/src/sig/Block.java b/src/sig/Block.java index a828b18..e9e1929 100644 --- a/src/sig/Block.java +++ b/src/sig/Block.java @@ -4,10 +4,17 @@ import java.util.ArrayList; import java.util.List; public class Block { + final static int CLOCKWISE = 1; + final static int COUNTER_CLOCKWISE = -1; + final static int SOUTH = 0; + final static int WEST = 1; + final static int NORTH = 2; + final static int EAST = 3; Vector pos; Mesh block; FaceList neighbors; - Block(Vector pos,Mesh block) { + private FacingDirection facingDir; + Block(Vector pos,Mesh block,FacingDirection facingDir) { this.neighbors=new FaceList(); this.pos=pos; List newTris = new ArrayList<>(); @@ -17,6 +24,34 @@ public class Block { newTris.add(newT); } this.block=new Mesh(newTris); + this.facingDir=facingDir; + } + private void updateFacingDirection(FacingDirection targetDirection) { + while (facingDir!=targetDirection) { + Texture t1 = block.triangles.get(0).tex; + Texture t2 = block.triangles.get(1).tex; + block.triangles.get(0).tex=block.triangles.get(2).tex; + block.triangles.get(1).tex=block.triangles.get(3).tex; + block.triangles.get(2).tex=block.triangles.get(4).tex; + block.triangles.get(3).tex=block.triangles.get(5).tex; + block.triangles.get(4).tex=block.triangles.get(6).tex; + block.triangles.get(5).tex=block.triangles.get(7).tex; + block.triangles.get(6).tex=t1; + block.triangles.get(7).tex=t2; + facingDir=facingDir.clockwise(); + } + } + public void setFacingDirection(FacingDirection direction) { + updateFacingDirection(direction); + } + public FacingDirection getFacingDirection() { + return facingDir; + } + public void rotateClockwise() { + updateFacingDirection(facingDir.clockwise()); + } + public void rotateCounterClockwise() { + updateFacingDirection(facingDir.counterClockwise()); } public void updateFaces() { if (SigRenderer.blockGrid.containsKey(pos.x+"_"+(pos.y+1)+"_"+pos.z)) { diff --git a/src/sig/FacingDirection.java b/src/sig/FacingDirection.java new file mode 100644 index 0000000..d2a4eaf --- /dev/null +++ b/src/sig/FacingDirection.java @@ -0,0 +1,16 @@ +package sig; + +public enum FacingDirection { + SOUTH, + WEST, + NORTH, + EAST; + + static FacingDirection[] orderList = new FacingDirection[]{SOUTH,WEST,NORTH,EAST}; + FacingDirection clockwise() { + return orderList[(this.ordinal()+1)%orderList.length]; + } + FacingDirection counterClockwise() { + return orderList[Math.floorMod((this.ordinal()-1),orderList.length)]; + } +} diff --git a/src/sig/SigRenderer.java b/src/sig/SigRenderer.java index 0c3e44e..40b7e74 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -115,6 +115,9 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene }break; } } else + if (answer.e.getButton()==MouseEvent.BUTTON2) { + answer.t.b.rotateClockwise(); + } else if (answer.e.getButton()==MouseEvent.BUTTON3) { removeBlock(answer.t.b.pos); } @@ -123,7 +126,7 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene } public static void addBlock(Vector pos,BlockType type) { - Block b = new Block(pos,new Cube(type)); + Block b = new Block(pos,new Cube(type),FacingDirection.SOUTH); blockGrid.put(pos.x+"_"+pos.y+"_"+pos.z,b); b.updateFaces(); } @@ -170,7 +173,7 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene if (x%8>2&&x%8<6&&y>1&&y<4) { addBlock(new Vector(x,y,16),BlockType.GLASS); } else { - addBlock(new Vector(x,y,16),BlockType.ICE); + addBlock(new Vector(x,y,16),BlockType.FURNACE); } } }