Add in texel size quality support.
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
984b0c4282
commit
9bba62bd7a
@ -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,46 +172,75 @@ 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)
|
||||
{
|
||||
int t1x=0, t2x=0, y=0, minx=0, maxx=0, t1xp=0, t2xp=0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user