Add in texel size quality support.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
pull/1/head
Nic0Nic0Nii 3 years ago
parent 984b0c4282
commit 9bba62bd7a
  1. 2
      src/sig/Panel.java
  2. 6
      src/sig/SigRenderer.java
  3. 90
      src/sig/utils/DrawUtils.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());
}

@ -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);

@ -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 (y2<y1) {float t=y1;y1=y2;y2=t;t=x1;x1=x2;x2=t;float u=u1;u1=u2;u2=u;float v=v1;v1=v2;v2=v;float w=w1;w1=w2;w2=w;}
if (y3<y1) {float t=y1;y1=y3;y3=t;t=x1;x1=x3;x3=t;float u=u1;u1=u3;u3=u;float v=v1;v1=v3;v3=v;float w=w1;w1=w3;w3=w;}
@ -63,7 +70,7 @@ public class DrawUtils {
if (dy2!=0) {dw2_step=dw2/(Math.abs(dy2));}
if (dy1!=0) {
for (float i=y1;i<=y2;i++) {
for (float i=y1;i<=y2-texelSize+1;i+=texelSize) {
float ax=x1+(i-y1)*dax_step;
float bx=x1+(i-y1)*dbx_step;
@ -88,40 +95,40 @@ public class DrawUtils {
float tstep = 1.0f/(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;
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<texelSize;x++) {
for (int y=0;y<texelSize;y++) {
if (tex_w<=buffer[pixelIndex+y*SigRenderer.SCREEN_WIDTH+x]) {
return false;
}
}
}
return true;
}
private static void setArrayTexels(float[] buffer, int pixelIndex,float value,int texelSize) {
for (int x=0;x<texelSize;x++) {
for (int y=0;y<texelSize;y++) {
buffer[pixelIndex+y*SigRenderer.SCREEN_WIDTH+x]=value;
}
}
}
private static void setArrayTexels(Triangle[] buffer, int pixelIndex,Triangle value,int texelSize) {
for (int x=0;x<texelSize;x++) {
for (int y=0;y<texelSize;y++) {
buffer[pixelIndex+y*SigRenderer.SCREEN_WIDTH+x]=value;
}
}
}
private static void setArrayTexels(boolean[] buffer, int pixelIndex,boolean value,int texelSize) {
for (int x=0;x<texelSize;x++) {
for (int y=0;y<texelSize;y++) {
buffer[pixelIndex+y*SigRenderer.SCREEN_WIDTH+x]=value;
}
}
}
public static void FillTriangle(int[] canvas,int x1, int y1, int x2, int y2, int x3, int y3, int col)
{

Loading…
Cancel
Save