From 5d6c8de3b5cc0f5d205d78f8c27b74326874aa36 Mon Sep 17 00:00:00 2001 From: Joshua Sigona Date: Sun, 7 Nov 2021 23:43:26 +0900 Subject: [PATCH] Transparent texture rendering handling. --- SigRenderer-0-jar-with-dependencies.jar | Bin 0 -> 50133 bytes cube.obj | 24 +++++++------- pom.xml | 6 ---- src/sig/Block.java | 42 ++++++++++++++++++++---- src/sig/Panel.java | 24 +++++++++++--- src/sig/SigRenderer.java | 30 ++++++++++------- src/sig/Texture.java | 10 +++++- src/sig/Triangle.java | 1 + src/sig/utils/DrawUtils.java | 22 +++++++++---- 9 files changed, 111 insertions(+), 48 deletions(-) create mode 100644 SigRenderer-0-jar-with-dependencies.jar diff --git a/SigRenderer-0-jar-with-dependencies.jar b/SigRenderer-0-jar-with-dependencies.jar new file mode 100644 index 0000000000000000000000000000000000000000..ea1f23304aa24933fd1e07bb1a359c714f258562 GIT binary patch literal 50133 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 pH2<7){f_>9Sn)TSy5*nfzXlny5`VPfKWt{0K - - - org.jogamp.jogl - jogl-all-main - 2.3.2 - diff --git a/src/sig/Block.java b/src/sig/Block.java index cd47902..4085c40 100644 --- a/src/sig/Block.java +++ b/src/sig/Block.java @@ -21,27 +21,57 @@ public class Block { public void updateFaces() { if (SigRenderer.blockGrid.containsKey(pos.x+"_"+(pos.y+1)+"_"+pos.z)) { neighbors.UP=true; - SigRenderer.blockGrid.get(pos.x+"_"+(pos.y+1)+"_"+pos.z).neighbors.DOWN=true; + if (block.triangles.get(Texture.TOP).tex.hasTransparency==SigRenderer.blockGrid.get(pos.x+"_"+(pos.y+1)+"_"+pos.z).block.triangles.get(Texture.BOTTOM).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y+1)+"_"+pos.z).neighbors.DOWN=true; + } else + if (block.triangles.get(Texture.TOP).tex.hasTransparency&&!SigRenderer.blockGrid.get(pos.x+"_"+(pos.y+1)+"_"+pos.z).block.triangles.get(Texture.BOTTOM).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y+1)+"_"+pos.z).neighbors.DOWN=false; + } } if (SigRenderer.blockGrid.containsKey(pos.x+"_"+(pos.y-1)+"_"+pos.z)) { neighbors.DOWN=true; - SigRenderer.blockGrid.get(pos.x+"_"+(pos.y-1)+"_"+pos.z).neighbors.UP=true; + if (block.triangles.get(Texture.BOTTOM).tex.hasTransparency==SigRenderer.blockGrid.get(pos.x+"_"+(pos.y-1)+"_"+pos.z).block.triangles.get(Texture.TOP).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y-1)+"_"+pos.z).neighbors.UP=true; + } else + if (block.triangles.get(Texture.BOTTOM).tex.hasTransparency&&!SigRenderer.blockGrid.get(pos.x+"_"+(pos.y-1)+"_"+pos.z).block.triangles.get(Texture.TOP).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y-1)+"_"+pos.z).neighbors.UP=false; + } } if (SigRenderer.blockGrid.containsKey((pos.x-1)+"_"+(pos.y)+"_"+pos.z)) { neighbors.LEFT=true; - SigRenderer.blockGrid.get((pos.x-1)+"_"+(pos.y)+"_"+pos.z).neighbors.RIGHT=true; + if (block.triangles.get(Texture.WEST).tex.hasTransparency==SigRenderer.blockGrid.get((pos.x-1)+"_"+(pos.y)+"_"+pos.z).block.triangles.get(Texture.EAST).tex.hasTransparency) { + SigRenderer.blockGrid.get((pos.x-1)+"_"+(pos.y)+"_"+pos.z).neighbors.RIGHT=true; + } else + if (block.triangles.get(Texture.WEST).tex.hasTransparency&&!SigRenderer.blockGrid.get((pos.x-1)+"_"+(pos.y)+"_"+pos.z).block.triangles.get(Texture.EAST).tex.hasTransparency) { + SigRenderer.blockGrid.get((pos.x-1)+"_"+(pos.y)+"_"+pos.z).neighbors.RIGHT=false; + } } if (SigRenderer.blockGrid.containsKey((pos.x+1)+"_"+(pos.y)+"_"+pos.z)) { neighbors.RIGHT=true; - SigRenderer.blockGrid.get((pos.x+1)+"_"+(pos.y)+"_"+pos.z).neighbors.LEFT=true; + if (block.triangles.get(Texture.EAST).tex.hasTransparency==SigRenderer.blockGrid.get((pos.x+1)+"_"+(pos.y)+"_"+pos.z).block.triangles.get(Texture.WEST).tex.hasTransparency) { + SigRenderer.blockGrid.get((pos.x+1)+"_"+(pos.y)+"_"+pos.z).neighbors.LEFT=true; + } else + if (block.triangles.get(Texture.EAST).tex.hasTransparency&&!SigRenderer.blockGrid.get((pos.x+1)+"_"+(pos.y)+"_"+pos.z).block.triangles.get(Texture.WEST).tex.hasTransparency) { + SigRenderer.blockGrid.get((pos.x+1)+"_"+(pos.y)+"_"+pos.z).neighbors.LEFT=false; + } } if (SigRenderer.blockGrid.containsKey(pos.x+"_"+(pos.y)+"_"+(pos.z+1))) { neighbors.FORWARD=true; - SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z+1)).neighbors.BACKWARD=true; + if (block.triangles.get(Texture.SOUTH).tex.hasTransparency==SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z+1)).block.triangles.get(Texture.NORTH).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z+1)).neighbors.BACKWARD=true; + } else + if (block.triangles.get(Texture.SOUTH).tex.hasTransparency&&!SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z+1)).block.triangles.get(Texture.NORTH).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z+1)).neighbors.BACKWARD=false; + } } if (SigRenderer.blockGrid.containsKey(pos.x+"_"+(pos.y)+"_"+(pos.z-1))) { neighbors.BACKWARD=true; - SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z-1)).neighbors.FORWARD=true; + if (block.triangles.get(Texture.NORTH).tex.hasTransparency==SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z-1)).block.triangles.get(Texture.SOUTH).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z-1)).neighbors.FORWARD=true; + } else + if (block.triangles.get(Texture.NORTH).tex.hasTransparency&&!SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z-1)).block.triangles.get(Texture.SOUTH).tex.hasTransparency) { + SigRenderer.blockGrid.get(pos.x+"_"+(pos.y)+"_"+(pos.z-1)).neighbors.FORWARD=false; + } } } @Override diff --git a/src/sig/Panel.java b/src/sig/Panel.java index 603eec6..a6e5ed8 100644 --- a/src/sig/Panel.java +++ b/src/sig/Panel.java @@ -9,6 +9,7 @@ import java.awt.Color; import java.awt.Image; import java.awt.image.MemoryImageSource; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; @@ -176,7 +177,12 @@ public class Panel extends JPanel implements Runnable { SigRenderer.tempAnswer=null; long totalTime=0; long startTime2=0; - ConcurrentLinkedQueue currentRender = (renderFirst)?accumulatedTris1:accumulatedTris2; + Collection currentRender = (renderFirst)?accumulatedTris1:accumulatedTris2; + List newTris = new ArrayList<>(); + for (Triangle t:currentRender) { + prepareTriForRender(matWorld, matView, t.unmodifiedTri, newTris, true); + } + currentRender=newTris; for (Triangle t : currentRender) { Triangle[] clipped = new Triangle[]{new Triangle(),new Triangle()}; List triList = new ArrayList<>(); @@ -206,7 +212,11 @@ public class Panel extends JPanel implements Runnable { } for (Triangle tt : triList) { if (tt.tex!=null) { - //tt.unmodifiedTri.nextRenderTime=System.currentTimeMillis()+200; + if (renderFirst) { + tt.unmodifiedTri.nextRenderTime=System.currentTimeMillis()+200; + } else { + tt.unmodifiedTri.nextRenderTime2=System.currentTimeMillis()+200; + } DrawUtils.TexturedTriangle(p, (int)tt.A.x,(int)tt.A.y,tt.T.u,tt.T.v,tt.T.w, (int)tt.B.x,(int)tt.B.y,tt.U.u,tt.U.v,tt.U.w, @@ -228,7 +238,7 @@ public class Panel extends JPanel implements Runnable { for (int y=0;y accumulatedTris) { + prepareTriForRender(matWorld,matView,t,accumulatedTris,false); + } - private void prepareTriForRender(Matrix matWorld, Matrix matView, Triangle t, ConcurrentLinkedQueue accumulatedTris) { - if (t.nextRenderTime<=System.currentTimeMillis()) { + private void prepareTriForRender(Matrix matWorld, Matrix matView, Triangle t, Collection accumulatedTris, boolean buffer) { + if (!buffer||(buffer&&t.nextRenderTime<=System.currentTimeMillis())) { Triangle triProjected = new Triangle(),triTransformed=new Triangle(),triViewed=new Triangle(); if (t.b!=null) { diff --git a/src/sig/SigRenderer.java b/src/sig/SigRenderer.java index 89f20a4..52352a5 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -2,8 +2,6 @@ package sig; import javax.imageio.ImageIO; import javax.swing.JFrame; -import sig.utils.OBJReader; - import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -13,14 +11,10 @@ import java.io.File; import java.io.IOException; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; import java.awt.Toolkit; import java.awt.BorderLayout; @@ -110,13 +104,21 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene SigRenderer(JFrame f) { //cube = new Mesh(OBJReader.ReadOBJFile("teapot.obj",false)); Random r = new Random(438107); - for (int x=0;x<256;x++) { - for (int z=0;z<256;z++) { + for (int x=0;x<64;x++) { + for (int z=0;z<64;z++) { + addBlock(new Vector(x,0,z),BlockType.DIRT); + /* if (Math.random()<=0.5) { - addBlock(new Vector(x,0,z),BlockType.DIRT); + addBlock(new Vector(x,y,z),BlockType.GLASS); } else { - addBlock(new Vector(x,0,z),BlockType.SNOW_DIRT); - } + addBlock(new Vector(x,y,z),BlockType.SNOW_DIRT); + }*/ + } + } + + for (int x=0;x<64;x++) { + for (int y=0;y<5;y++) { + addBlock(new Vector(x,y,16),BlockType.GLASS); } } @@ -169,15 +171,19 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene WritableRaster r = img.getRaster(); for (TextureType tt : TextureType.values()) { int[] pixelData = new int[tt.texWidth*BLOCK_WIDTH*tt.texHeight*BLOCK_HEIGHT]; + Texture tex = new Texture(pixelData,tt.texWidth*BLOCK_WIDTH,tt.texHeight*BLOCK_HEIGHT); int startX=tt.texX*BLOCK_WIDTH; int startY=tt.texY*BLOCK_HEIGHT; for (int x=0;x>8)*mult)<<8) + ((int)(((tex[indice]&0xFF0000)>>16)*mult)<<16); + return (int)((tex[indice]&0xFF)*mult) + ((int)(((tex[indice]&0xFF00)>>>8)*mult)<<8) + ((int)(((tex[indice]&0xFF0000)>>>16)*mult)<<16) + ((((tex[indice]&0xFF000000)>>>24))<<24); /*Color newCol = new Color(tex.getRGB(sx,sy)); return new Color((newCol.getRed()/255f)*mult,(newCol.getGreen()/255f)*mult,(newCol.getBlue()/255f)*mult);*/ } diff --git a/src/sig/Triangle.java b/src/sig/Triangle.java index fdd8de5..cb95c9b 100644 --- a/src/sig/Triangle.java +++ b/src/sig/Triangle.java @@ -8,6 +8,7 @@ public class Triangle { public Block b = null; public Texture tex = null; public long nextRenderTime = -1l; + public long nextRenderTime2 = -1l; public Triangle unmodifiedTri; public Triangle() { this(new Vector(),new Vector(),new Vector()); diff --git a/src/sig/utils/DrawUtils.java b/src/sig/utils/DrawUtils.java index 5449a3e..324563f 100644 --- a/src/sig/utils/DrawUtils.java +++ b/src/sig/utils/DrawUtils.java @@ -84,9 +84,14 @@ public class DrawUtils { if (SigRenderer.request!=null&&j==SigRenderer.request.getX()&&i==SigRenderer.request.getY()) { SigRenderer.tempAnswer=ref.b; } - Draw(canvas,j,i,texture.getColor(tex_u/tex_w,tex_v/tex_w,colorMult/255f)); - SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; - SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; + int col = texture.getColor(tex_u/tex_w,tex_v/tex_w,colorMult/255f); + if (((col&0xFF000000)>>>24)!=0) { + Draw(canvas,j,i,col); + } + if (((col&0xFF000000)>>>24)==255) { + SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; + SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; + } } t+=tstep; } @@ -140,9 +145,14 @@ public class DrawUtils { if (SigRenderer.request!=null&&j==SigRenderer.request.getX()&&i==SigRenderer.request.getY()) { SigRenderer.tempAnswer=ref.b; } - Draw(canvas,j,i,texture.getColor(tex_u/tex_w,tex_v/tex_w,colorMult/255f)); - SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; - SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; + int col = texture.getColor(tex_u/tex_w,tex_v/tex_w,colorMult/255f); + if (((col&0xFF000000)>>>24)!=0) { + Draw(canvas,j,i,col); + } + if (((col&0xFF000000)>>>24)==255) { + SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; + SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; + } } t+=tstep; }