From 9bba62bd7acfe797398333a2024f470b38b5c853 Mon Sep 17 00:00:00 2001 From: Nic0Nic0Nii Date: Wed, 1 Dec 2021 03:23:21 +0000 Subject: [PATCH] Add in texel size quality support. Co-authored-by: sigonasr2 --- src/sig/Panel.java | 2 +- src/sig/SigRenderer.java | 6 +-- src/sig/utils/DrawUtils.java | 90 +++++++++++++++++++++++++----------- 3 files changed, 67 insertions(+), 31 deletions(-) diff --git a/src/sig/Panel.java b/src/sig/Panel.java index bd6c24b..be326d7 100644 --- a/src/sig/Panel.java +++ b/src/sig/Panel.java @@ -269,7 +269,7 @@ public class Panel extends JPanel implements Runnable { 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); + tt.tex,(tt.col&0xFF0000)>>16,tt,1); } 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 ab6ba4f..543c8b3 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -57,7 +57,7 @@ public class SigRenderer implements WindowFocusListener,KeyListener,MouseListene public static float fAspectRatio = (float)SCREEN_HEIGHT/SCREEN_WIDTH; public static Matrix matProj = Matrix.MakeProjection(fFov,fAspectRatio,fNear,fFar); - public static Vector vCamera = new Vector(31.5f,20f,31.5f); + public static Vector vCamera = new Vector(7.5f,20f,7.5f); public static final float cameraCollisionPadding = 0.2f; public static final float cameraHeight = 1.75f; @@ -399,8 +399,8 @@ public class SigRenderer implements WindowFocusListener,KeyListener,MouseListene SigRenderer.frame=f; //cube = new Mesh(OBJReader.ReadOBJFile("teapot.obj",false)); Random r = new Random(438107); - for (int x=0;x<64;x++) { - for (int z=0;z<64;z++) { + for (int x=0;x<16;x++) { + for (int z=0;z<16;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); diff --git a/src/sig/utils/DrawUtils.java b/src/sig/utils/DrawUtils.java index 2cead4f..293e924 100644 --- a/src/sig/utils/DrawUtils.java +++ b/src/sig/utils/DrawUtils.java @@ -23,14 +23,21 @@ public class DrawUtils { float x2, float y2, float u2,float v2,float w2, float x3, float y3, float u3,float v3,float w3, Texture texture, int colorMult,Triangle ref) { - TexturedTriangle(canvas,x1,y1,u1,v1,w1,x2,y2,u2,v2,w2,x3,y3,u3,v3,w3,texture,colorMult,ref,NORMAL_RENDERING); + TexturedTriangle(canvas,x1,y1,u1,v1,w1,x2,y2,u2,v2,w2,x3,y3,u3,v3,w3,texture,colorMult,ref,NORMAL_RENDERING,1); + } + public static void TexturedTriangle(int[] canvas, + float x1, float y1, float u1,float v1,float w1, + float x2, float y2, float u2,float v2,float w2, + float x3, float y3, float u3,float v3,float w3, + Texture texture, int colorMult,Triangle ref,int texelSize) { + TexturedTriangle(canvas,x1,y1,u1,v1,w1,x2,y2,u2,v2,w2,x3,y3,u3,v3,w3,texture,colorMult,ref,NORMAL_RENDERING,texelSize); } public static void TexturedTriangle(int[] canvas, float x1, float y1, float u1,float v1,float w1, float x2, float y2, float u2,float v2,float w2, float x3, float y3, float u3,float v3,float w3, Texture texture, int colorMult,Triangle ref, - int rendering_state + int rendering_state,int texelSize ) { if (y2SigRenderer.depthBuffer_noTransparency[pixelIndex]) { - SigRenderer.depthBuffer_noTransparency[pixelIndex]=tex_w; + if (CheckAllTexels(tex_w,SigRenderer.depthBuffer_noTransparency,pixelIndex,texelSize)) { + setArrayTexels(SigRenderer.depthBuffer_noTransparency,pixelIndex,tex_w,texelSize); if (j==SigRenderer.temp_request.getX()&&i==SigRenderer.temp_request.getY()) { SigRenderer.tempAnswer=new MouseHandler(SigRenderer.temp_request,ref); } } } - if (tex_w>SigRenderer.depthBuffer[pixelIndex]) { + if (CheckAllTexels(tex_w,SigRenderer.depthBuffer,pixelIndex,texelSize)) { 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,pixelIndex,col); - SigRenderer.depthBuffer[pixelIndex] = tex_w; - SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; - SigRenderer.translucencyBuffer[pixelIndex] = true; + setArrayTexels(SigRenderer.depthBuffer,pixelIndex,tex_w,texelSize); + setArrayTexels(SigRenderer.depthBuffer_tri,pixelIndex,ref.unmodifiedTri,texelSize); + setArrayTexels(SigRenderer.translucencyBuffer,pixelIndex,true,texelSize); } } else { if (rendering_state!=TRANSLUCENT_ONLY_RENDERING) { Draw(canvas,pixelIndex,col); - SigRenderer.depthBuffer[pixelIndex] = tex_w; - SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; + setArrayTexels(SigRenderer.depthBuffer,pixelIndex,tex_w,texelSize); + setArrayTexels(SigRenderer.depthBuffer_tri,pixelIndex,ref.unmodifiedTri,texelSize); } } } } - t+=tstep; + t+=tstep*texelSize; } } } @@ -140,7 +147,7 @@ public class DrawUtils { if (dy1!=0) {dw1_step=dw1/(Math.abs(dy1));} if (dy1!=0) { - for (float i=y2;i<=y3;i++) { + for (float i=y2;i<=y3-texelSize+1;i+=texelSize) { float ax=x2+(i-y2)*dax_step; float bx=x1+(i-y1)*dbx_step; @@ -165,45 +172,74 @@ public class DrawUtils { float tstep = 1.0f/(float)(bx-ax); float t=0.0f; - for (float j=ax;j<=bx;j++) { + for (float j=ax;j<=bx-texelSize+1;j+=texelSize) { 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[pixelIndex]) { - SigRenderer.depthBuffer_noTransparency[pixelIndex]=tex_w; + if (CheckAllTexels(tex_w,SigRenderer.depthBuffer_noTransparency,pixelIndex,texelSize)) { + setArrayTexels(SigRenderer.depthBuffer_noTransparency,pixelIndex,tex_w,texelSize); if (j==SigRenderer.temp_request.getX()&&i==SigRenderer.temp_request.getY()) { SigRenderer.tempAnswer=new MouseHandler(SigRenderer.temp_request,ref); } } } - if (tex_w>SigRenderer.depthBuffer[pixelIndex]) { + if (CheckAllTexels(tex_w,SigRenderer.depthBuffer,pixelIndex,texelSize)) { 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,pixelIndex,col); - SigRenderer.depthBuffer[pixelIndex] = tex_w; - if (rendering_state!=TRANSLUCENT_ONLY_RENDERING) { - SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; - } - SigRenderer.translucencyBuffer[pixelIndex] = true; + setArrayTexels(SigRenderer.depthBuffer,pixelIndex,tex_w,texelSize); + setArrayTexels(SigRenderer.depthBuffer_tri,pixelIndex,ref.unmodifiedTri,texelSize); + setArrayTexels(SigRenderer.translucencyBuffer,pixelIndex,true,texelSize); } } else { if (rendering_state!=TRANSLUCENT_ONLY_RENDERING) { Draw(canvas,pixelIndex,col); - SigRenderer.depthBuffer[pixelIndex] = tex_w; - SigRenderer.depthBuffer_tri[pixelIndex] = ref.unmodifiedTri; + setArrayTexels(SigRenderer.depthBuffer,pixelIndex,tex_w,texelSize); + setArrayTexels(SigRenderer.depthBuffer_tri,pixelIndex,ref.unmodifiedTri,texelSize); } } } - } - t+=tstep; + } + t+=tstep*texelSize; + } + } + } + } + private static boolean CheckAllTexels(float tex_w, float[] buffer, int pixelIndex, int texelSize) { + for (int x=0;x