diff options
author | StapleButter <thetotalworm@gmail.com> | 2017-02-28 00:50:54 +0100 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2017-02-28 00:50:54 +0100 |
commit | f16d2aec61efecbc82d516b12ac77a3a0341cf51 (patch) | |
tree | d550c648bfbe6175e1431f036007d7260863e040 | |
parent | fb9dddc360506352769efbc009b60e9471a609bf (diff) |
calculate texture coordinates
-rw-r--r-- | GPU3D.cpp | 37 | ||||
-rw-r--r-- | GPU3D.h | 1 | ||||
-rw-r--r-- | GPU3D_Soft.cpp | 2 | ||||
-rw-r--r-- | NDS.cpp | 3 | ||||
-rw-r--r-- | melonDS.depend | 10 |
5 files changed, 48 insertions, 5 deletions
@@ -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; @@ -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); @@ -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" |