From 984b0c4282088d53b6e20840f9fe4c0e094023b7 Mon Sep 17 00:00:00 2001 From: Nic0Nic0Nii Date: Wed, 1 Dec 2021 01:16:29 +0000 Subject: [PATCH] Preparations for optimizations. Co-authored-by: sigonasr2 --- src/sig/Panel.java | 10 +-- src/sig/SigRenderer.java | 3 +- src/sig/utils/DrawUtils.java | 155 ++++++++++++++++++----------------- 3 files changed, 86 insertions(+), 82 deletions(-) diff --git a/src/sig/Panel.java b/src/sig/Panel.java index fe38e44..bd6c24b 100644 --- a/src/sig/Panel.java +++ b/src/sig/Panel.java @@ -9,19 +9,15 @@ import java.awt.Color; import java.awt.Image; import java.awt.image.MemoryImageSource; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; import java.awt.image.ColorModel; import java.awt.GraphicsEnvironment; import java.awt.GraphicsConfiguration; import java.awt.Toolkit; -import java.util.Queue; public class Panel extends JPanel implements Runnable { long startTime = System.nanoTime(); @@ -270,9 +266,9 @@ public class Panel extends JPanel implements Runnable { } SigRenderer.temp_request=SigRenderer.request; 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, - (int)tt.C.x,(int)tt.C.y,tt.V.u,tt.V.v,tt.V.w, + tt.A.x,tt.A.y,tt.T.u,tt.T.v,tt.T.w, + tt.B.x,tt.B.y,tt.U.u,tt.U.v,tt.U.w, + tt.C.x,tt.C.y,tt.V.u,tt.V.v,tt.V.w, tt.tex,(tt.col&0xFF0000)>>16,tt); } else { DrawUtils.FillTriangle(p,(int)tt.A.x,(int)tt.A.y,(int)tt.B.x,(int)tt.B.y,(int)tt.C.x,(int)tt.C.y,tt.getColor()); diff --git a/src/sig/SigRenderer.java b/src/sig/SigRenderer.java index 00a7db6..ab6ba4f 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -402,6 +402,7 @@ public class SigRenderer implements WindowFocusListener,KeyListener,MouseListene for (int x=0;x<64;x++) { for (int z=0;z<64;z++) { addBlock(new Vector(x,0,z),Cube.class,BlockType.SOIL_WET,FacingDirection.SOUTH); + addBlock(new Vector(x,1,z),Plant.class,BlockType.valueOf("WHEAT_"+(r.nextInt(7))),FacingDirection.SOUTH); //addBlock(new Vector(x,1,z),Staircase.class,BlockType.JUNGLE_PLANK,FacingDirection.SOUTH); //addBlock(new Vector(x,2,z),Staircase.class,BlockType.SPRUCE_PLANK,FacingDirection.SOUTH); /*for (int y=1;ybx) { - int t=ax;ax=bx;bx=t; + float t=ax;ax=bx;bx=t; float u=tex_su;tex_su=tex_eu;tex_eu=u; float v=tex_sv;tex_sv=tex_ev;tex_ev=v; float w=tex_sw;tex_sw=tex_ew;tex_ew=w; @@ -85,37 +85,38 @@ public class DrawUtils { tex_v=tex_sv; tex_w=tex_sw; - float tstep = 1.0f/(float)(bx-ax); + float tstep = 1.0f/(bx-ax); float t=0.0f; - for (int j=ax;j<=bx;j++) { + for (float j=ax;j<=bx;j++) { tex_u=(1.0f-t)*tex_su+t*tex_eu; tex_v=(1.0f-t)*tex_sv+t*tex_ev; tex_w=(1.0f-t)*tex_sw+t*tex_ew; + int pixelIndex = (int)(i*SigRenderer.SCREEN_WIDTH+j); if (SigRenderer.temp_request!=null) { - if (tex_w>SigRenderer.depthBuffer_noTransparency[i*SigRenderer.SCREEN_WIDTH+j]) { - SigRenderer.depthBuffer_noTransparency[i*SigRenderer.SCREEN_WIDTH+j]=tex_w; + if (tex_w>SigRenderer.depthBuffer_noTransparency[pixelIndex]) { + SigRenderer.depthBuffer_noTransparency[pixelIndex]=tex_w; if (j==SigRenderer.temp_request.getX()&&i==SigRenderer.temp_request.getY()) { SigRenderer.tempAnswer=new MouseHandler(SigRenderer.temp_request,ref); } } } - if (tex_w>SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j]) { + if (tex_w>SigRenderer.depthBuffer[pixelIndex]) { int col = texture.getColor(tex_u/tex_w,tex_v/tex_w,colorMult/255f); if (((col&0xFF000000)>>>24)!=0) { if (((col&0xFF000000)>>>24)!=255) { if (rendering_state==TRANSLUCENT_ONLY_RENDERING|| rendering_state==NORMAL_RENDERING) { - Draw(canvas,j,i,col); - SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; - SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; - SigRenderer.translucencyBuffer[i*SigRenderer.SCREEN_WIDTH+j] = true; + Draw(canvas,pixelIndex,col); + SigRenderer.depthBuffer[pixelIndex] = tex_w; + SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; + SigRenderer.translucencyBuffer[pixelIndex] = true; } } else { if (rendering_state!=TRANSLUCENT_ONLY_RENDERING) { - Draw(canvas,j,i,col); - SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; - SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; + Draw(canvas,pixelIndex,col); + SigRenderer.depthBuffer[pixelIndex] = tex_w; + SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; } } } @@ -130,28 +131,28 @@ public class DrawUtils { dv1=v3-v2; du1=u3-u2; dw1=w3-w2; - if (dy1!=0) {dax_step=dx1/((float)Math.abs(dy1));} - if (dy2!=0) {dbx_step=dx2/((float)Math.abs(dy2));} + if (dy1!=0) {dax_step=dx1/(Math.abs(dy1));} + if (dy2!=0) {dbx_step=dx2/(Math.abs(dy2));} du1_step=0f; dv1_step=0f; - if (dy1!=0) {du1_step=du1/((float)Math.abs(dy1));} - if (dy1!=0) {dv1_step=dv1/((float)Math.abs(dy1));} - if (dy1!=0) {dw1_step=dw1/((float)Math.abs(dy1));} + if (dy1!=0) {du1_step=du1/(Math.abs(dy1));} + if (dy1!=0) {dv1_step=dv1/(Math.abs(dy1));} + if (dy1!=0) {dw1_step=dw1/(Math.abs(dy1));} if (dy1!=0) { - for (int i=y2;i<=y3;i++) { - int ax=(int)(x2+((float)(i-y2))*dax_step); - int bx=(int)(x1+((float)(i-y1))*dbx_step); + for (float i=y2;i<=y3;i++) { + float ax=x2+(i-y2)*dax_step; + float bx=x1+(i-y1)*dbx_step; - float tex_su=u2+((float)(i-y2))*du1_step; - float tex_sv=v2+((float)(i-y2))*dv1_step; - float tex_sw=w2+((float)(i-y2))*dw1_step; - float tex_eu=u1+((float)(i-y1))*du2_step; - float tex_ev=v1+((float)(i-y1))*dv2_step; - float tex_ew=w1+((float)(i-y1))*dw2_step; + float tex_su=u2+(i-y2)*du1_step; + float tex_sv=v2+(i-y2)*dv1_step; + float tex_sw=w2+(i-y2)*dw1_step; + float tex_eu=u1+(i-y1)*du2_step; + float tex_ev=v1+(i-y1)*dv2_step; + float tex_ew=w1+(i-y1)*dw2_step; if (ax>bx) { - int t=ax;ax=bx;bx=t; + float t=ax;ax=bx;bx=t; float u=tex_su;tex_su=tex_eu;tex_eu=u; float v=tex_sv;tex_sv=tex_ev;tex_ev=v; float w=tex_sw;tex_sw=tex_ew;tex_ew=w; @@ -164,36 +165,37 @@ public class DrawUtils { float tstep = 1.0f/(float)(bx-ax); float t=0.0f; - for (int j=ax;j<=bx;j++) { + for (float j=ax;j<=bx;j++) { tex_u=(1.0f-t)*tex_su+t*tex_eu; tex_v=(1.0f-t)*tex_sv+t*tex_ev; tex_w=(1.0f-t)*tex_sw+t*tex_ew; + int pixelIndex = (int)(i*SigRenderer.SCREEN_WIDTH+j); if (SigRenderer.temp_request!=null) { - if (tex_w>SigRenderer.depthBuffer_noTransparency[i*SigRenderer.SCREEN_WIDTH+j]) { - SigRenderer.depthBuffer_noTransparency[i*SigRenderer.SCREEN_WIDTH+j]=tex_w; + if (tex_w>SigRenderer.depthBuffer_noTransparency[pixelIndex]) { + SigRenderer.depthBuffer_noTransparency[pixelIndex]=tex_w; if (j==SigRenderer.temp_request.getX()&&i==SigRenderer.temp_request.getY()) { SigRenderer.tempAnswer=new MouseHandler(SigRenderer.temp_request,ref); } } } - if (tex_w>SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j]) { + if (tex_w>SigRenderer.depthBuffer[pixelIndex]) { int col = texture.getColor(tex_u/tex_w,tex_v/tex_w,colorMult/255f); if (((col&0xFF000000)>>>24)!=0) { if (((col&0xFF000000)>>>24)!=255) { if (rendering_state==TRANSLUCENT_ONLY_RENDERING|| rendering_state==NORMAL_RENDERING) { - Draw(canvas,j,i,col); - SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; + Draw(canvas,pixelIndex,col); + SigRenderer.depthBuffer[pixelIndex] = tex_w; if (rendering_state!=TRANSLUCENT_ONLY_RENDERING) { - SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; + SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; } - SigRenderer.translucencyBuffer[i*SigRenderer.SCREEN_WIDTH+j] = true; + SigRenderer.translucencyBuffer[pixelIndex] = true; } } else { if (rendering_state!=TRANSLUCENT_ONLY_RENDERING) { - Draw(canvas,j,i,col); - SigRenderer.depthBuffer[i*SigRenderer.SCREEN_WIDTH+j] = tex_w; - SigRenderer.depthBuffer_tri[i*SigRenderer.SCREEN_WIDTH+j] = ref.unmodifiedTri; + Draw(canvas,pixelIndex,col); + SigRenderer.depthBuffer[pixelIndex] = tex_w; + SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; } } } @@ -391,13 +393,13 @@ public class DrawUtils { } } } - public static void Draw(int[] canvas,int x,int y,int col) { - if (x>=0&&y>=0&&x0&&pixelIndex>>24; if (alpha>0&&alpha<255) { float ratio = alpha/255f; - int prev_col = canvas[x+y*SigRenderer.SCREEN_WIDTH]; + int prev_col = canvas[pixelIndex]; int prev_r=(prev_col&0xFF),prev_g=(prev_col&0xFF00)>>>8,prev_b=(prev_col&0xFF0000)>>>16; int r=(col&0xFF),g=(col&0xFF00)>>>8,b=(col&0xFF0000)>>>16; @@ -405,10 +407,15 @@ public class DrawUtils { int new_g=(int)(ratio*g+(1-ratio)*prev_g); int new_b=(int)(ratio*b+(1-ratio)*prev_b); - canvas[x+y*SigRenderer.SCREEN_WIDTH]=new_r+(new_g<<8)+(new_b<<16)+(col&0xFF000000); + canvas[pixelIndex]=new_r+(new_g<<8)+(new_b<<16)+(col&0xFF000000); } else { - canvas[x+y*SigRenderer.SCREEN_WIDTH]=col; + canvas[pixelIndex]=col; } } } + public static void Draw(int[] canvas,int x,int y,int col) { + if (x>=0&&y>=0&&x