diff options
Diffstat (limited to 'src/GPU3D.cpp')
-rw-r--r-- | src/GPU3D.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp index 98aa6eb..c94d363 100644 --- a/src/GPU3D.cpp +++ b/src/GPU3D.cpp @@ -539,6 +539,11 @@ void DoSavestate(Savestate* file) file->Var32((u32*)&poly->IsShadowMask); file->Var32((u32*)&poly->IsShadow); + if (file->IsAtleastVersion(4, 1)) + file->Var32((u32*)&poly->Type); + else + poly->Type = 0; + file->Var32(&poly->VTop); file->Var32(&poly->VBottom); file->Var32((u32*)&poly->YTop); @@ -1017,6 +1022,14 @@ int ClipPolygon(Vertex* vertices, int nverts, int clipstart) return nverts; } +bool ClipCoordsEqual(Vertex* a, Vertex* b) +{ + return a->Position[0] == b->Position[0] && + a->Position[1] == b->Position[1] && + a->Position[2] == b->Position[2] && + a->Position[3] == b->Position[3]; +} + void SubmitPolygon() { Vertex clippedvertices[10]; @@ -1038,13 +1051,15 @@ void SubmitPolygon() // TODO: work out how it works on the real thing // the normalization part is a wild guess - Vertex *v0, *v1, *v2; + Vertex *v0, *v1, *v2, *v3; s64 normalX, normalY, normalZ; s64 dot; v0 = &TempVertexBuffer[0]; v1 = &TempVertexBuffer[1]; v2 = &TempVertexBuffer[2]; + v3 = &TempVertexBuffer[3]; + normalX = ((s64)(v0->Position[1]-v1->Position[1]) * (v2->Position[3]-v1->Position[3])) - ((s64)(v0->Position[3]-v1->Position[3]) * (v2->Position[1]-v1->Position[1])); normalY = ((s64)(v0->Position[3]-v1->Position[3]) * (v2->Position[0]-v1->Position[0])) @@ -1170,6 +1185,7 @@ void SubmitPolygon() poly->TexPalette = TexPalette; poly->Degenerate = false; + poly->Type = 0; poly->FacingView = facingview; @@ -1182,6 +1198,22 @@ void SubmitPolygon() if (!poly->Translucent) NumOpaquePolygons++; + if (ClipCoordsEqual(v0, v1) || + ClipCoordsEqual(v0, v2) || + ClipCoordsEqual(v1, v2)) + { + poly->Type = 1; + } + else if (nverts == 4) + { + if (ClipCoordsEqual(v0, v3) || + ClipCoordsEqual(v1, v3) || + ClipCoordsEqual(v2, v3)) + { + poly->Type = 1; + } + } + if (LastStripPolygon && clipstart > 0) { if (nverts == lastpolyverts) |