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