aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-02-28 00:50:54 +0100
committerStapleButter <thetotalworm@gmail.com>2017-02-28 00:50:54 +0100
commitf16d2aec61efecbc82d516b12ac77a3a0341cf51 (patch)
treed550c648bfbe6175e1431f036007d7260863e040
parentfb9dddc360506352769efbc009b60e9471a609bf (diff)
calculate texture coordinates
-rw-r--r--GPU3D.cpp37
-rw-r--r--GPU3D.h1
-rw-r--r--GPU3D_Soft.cpp2
-rw-r--r--NDS.cpp3
-rw-r--r--melonDS.depend10
5 files changed, 48 insertions, 5 deletions
diff --git a/GPU3D.cpp b/GPU3D.cpp
index bb428cb..d743819 100644
--- a/GPU3D.cpp
+++ b/GPU3D.cpp
@@ -169,10 +169,14 @@ void UpdateClipMatrix();
u32 PolygonMode;
s16 CurVertex[3];
u8 VertexColor[3];
+s16 TexCoords[2];
u32 PolygonAttr;
u32 CurPolygonAttr;
+u32 TexParam;
+u32 TexPalette;
+
Vertex TempVertexBuffer[4];
u32 VertexNum;
u32 VertexNumInPoly;
@@ -410,6 +414,9 @@ void ClipSegment(Vertex* outbuf, Vertex* vout, Vertex* vin)
INTERPOLATE(Color[1]);
INTERPOLATE(Color[2]);
+ INTERPOLATE(TexCoords[0]);
+ INTERPOLATE(TexCoords[1]);
+
mid.Clipped = true;
mid.ViewportTransformDone = false;
@@ -798,6 +805,17 @@ void SubmitVertex()
vertextrans->Color[1] = (VertexColor[1] << 12) + 0xFFF;
vertextrans->Color[2] = (VertexColor[2] << 12) + 0xFFF;
+ if ((TexParam >> 30) == 3)
+ {
+ vertextrans->TexCoords[0] = (CurVertex[0]*TexMatrix[0] + CurVertex[1]*TexMatrix[4] + CurVertex[2]*TexMatrix[8] + 0x1000*TexCoords[0]) >> 12;
+ vertextrans->TexCoords[1] = (CurVertex[0]*TexMatrix[1] + CurVertex[1]*TexMatrix[5] + CurVertex[2]*TexMatrix[9] + 0x1000*TexCoords[1]) >> 12;
+ }
+ else
+ {
+ vertextrans->TexCoords[0] = TexCoords[0];
+ vertextrans->TexCoords[1] = TexCoords[1];
+ }
+
vertextrans->Clipped = false;
vertextrans->ViewportTransformDone = false;
@@ -1219,6 +1237,17 @@ void ExecuteCommand()
case 0x21:
// TODO: more cycles if lights are enabled
+ // TODO also texcoords if needed
+ break;
+
+ case 0x22: // texcoord
+ TexCoords[0] = ExecParams[0] & 0xFFFF;
+ TexCoords[1] = ExecParams[1] >> 16;
+ if ((TexParam >> 30) == 1)
+ {
+ TexCoords[0] = (TexCoords[0]*TexMatrix[0] + TexCoords[1]*TexMatrix[4] + TexMatrix[8] + TexMatrix[12]) >> 12;
+ TexCoords[1] = (TexCoords[0]*TexMatrix[1] + TexCoords[1]*TexMatrix[5] + TexMatrix[9] + TexMatrix[13]) >> 12;
+ }
break;
case 0x23: // full vertex
@@ -1264,6 +1293,14 @@ void ExecuteCommand()
PolygonAttr = ExecParams[0];
break;
+ case 0x2A: // texture param
+ TexParam = ExecParams[0];
+ break;
+
+ case 0x2B: // texture palette
+ TexPalette = ExecParams[0] & 0x1FFF;
+ break;
+
case 0x40:
PolygonMode = ExecParams[0] & 0x3;
VertexNum = 0;
diff --git a/GPU3D.h b/GPU3D.h
index d683cbe..939e3e9 100644
--- a/GPU3D.h
+++ b/GPU3D.h
@@ -26,6 +26,7 @@ typedef struct
{
s32 Position[4];
s32 Color[3];
+ s16 TexCoords[2];
bool Clipped;
diff --git a/GPU3D_Soft.cpp b/GPU3D_Soft.cpp
index c7bb2c0..4549d4d 100644
--- a/GPU3D_Soft.cpp
+++ b/GPU3D_Soft.cpp
@@ -333,6 +333,8 @@ void RenderPolygon(Polygon* polygon)
perspfactor2 = 0;
}
+ //z = 0x1000000 / (perspfactor1 + perspfactor2);
+
// possible optimization: only do color interpolation if the depth test passes
u32 vr = ((perspfactor1 * rl) + (perspfactor2 * rr)) / (perspfactor1 + perspfactor2);
u32 vg = ((perspfactor1 * gl) + (perspfactor2 * gr)) / (perspfactor1 + perspfactor2);
diff --git a/NDS.cpp b/NDS.cpp
index c50b13c..0bba278 100644
--- a/NDS.cpp
+++ b/NDS.cpp
@@ -776,6 +776,9 @@ void debug(u32 param)
{
printf("ARM9 PC=%08X LR=%08X %08X\n", ARM9->R[15], ARM9->R[14], ARM9->R_IRQ[1]);
printf("ARM7 PC=%08X LR=%08X %08X\n", ARM7->R[15], ARM7->R[14], ARM7->R_IRQ[1]);
+
+ for (int i = 0; i < 9; i++)
+ printf("VRAM %c: %02X\n", 'A'+i, GPU::VRAMCNT[i]);
}
diff --git a/melonDS.depend b/melonDS.depend
index 17a4aea..f479ee8 100644
--- a/melonDS.depend
+++ b/melonDS.depend
@@ -10,7 +10,7 @@
1481161027 c:\documents\sources\melonds\types.h
-1488227258 source:c:\documents\sources\melonds\nds.cpp
+1488237361 source:c:\documents\sources\melonds\nds.cpp
<stdio.h>
<string.h>
"NDS.h"
@@ -119,7 +119,7 @@
1487305393 c:\documents\sources\melonds\dma.h
"types.h"
-1488226688 source:c:\documents\sources\melonds\gpu.cpp
+1488227337 source:c:\documents\sources\melonds\gpu.cpp
<stdio.h>
<string.h>
"NDS.h"
@@ -146,16 +146,16 @@
"NDS.h"
"NDSCart.h"
-1487610598 c:\documents\sources\melonds\gpu3d.h
+1488238607 c:\documents\sources\melonds\gpu3d.h
-1487681103 source:c:\documents\sources\melonds\gpu3d.cpp
+1488239360 source:c:\documents\sources\melonds\gpu3d.cpp
<stdio.h>
<string.h>
"NDS.h"
"GPU.h"
"FIFO.h"
-1488214777 source:c:\documents\sources\melonds\gpu3d_soft.cpp
+1488237540 source:c:\documents\sources\melonds\gpu3d_soft.cpp
<stdio.h>
<string.h>
"NDS.h"