summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2013-02-21 21:01:53 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2013-02-21 21:02:49 -0600
commitf16dcfe6f69c0cb8ba89ea6611157c8c2eab3dad (patch)
tree069db7bdcce27bf3b30b41d935bf87a1bc1246fe /Source/Core
parent368c78dd5c167208454c8c9ac8f458130f23740b (diff)
Remove logic from IndexGenerator which does not seem to match that of Video Software.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoCommon/Src/IndexGenerator.cpp172
-rw-r--r--Source/Core/VideoCommon/Src/IndexGenerator.h4
2 files changed, 36 insertions, 140 deletions
diff --git a/Source/Core/VideoCommon/Src/IndexGenerator.cpp b/Source/Core/VideoCommon/Src/IndexGenerator.cpp
index edcf93d6bd..a7d073890f 100644
--- a/Source/Core/VideoCommon/Src/IndexGenerator.cpp
+++ b/Source/Core/VideoCommon/Src/IndexGenerator.cpp
@@ -29,16 +29,16 @@ QUAD simulator
*/
//Init
-u16 *IndexGenerator::Tptr = 0;
-u16 *IndexGenerator::BASETptr = 0;
-u16 *IndexGenerator::Lptr = 0;
-u16 *IndexGenerator::BASELptr = 0;
-u16 *IndexGenerator::Pptr = 0;
-u16 *IndexGenerator::BASEPptr = 0;
-u32 IndexGenerator::numT = 0;
-u32 IndexGenerator::numL = 0;
-u32 IndexGenerator::numP = 0;
-u32 IndexGenerator::index = 0;
+u16 *IndexGenerator::Tptr;
+u16 *IndexGenerator::BASETptr;
+u16 *IndexGenerator::Lptr;
+u16 *IndexGenerator::BASELptr;
+u16 *IndexGenerator::Pptr;
+u16 *IndexGenerator::BASEPptr;
+u32 IndexGenerator::numT;
+u32 IndexGenerator::numL;
+u32 IndexGenerator::numP;
+u32 IndexGenerator::index;
void IndexGenerator::Start(u16* Triangleptr, u16* Lineptr, u16* Pointptr)
{
@@ -58,13 +58,13 @@ void IndexGenerator::AddIndices(int primitive, u32 numVerts)
{
//switch (primitive)
//{
- //case GX_DRAW_QUADS: IndexGenerator::AddQuads(numVertices); break;
- //case GX_DRAW_TRIANGLES: IndexGenerator::AddList(numVertices); break;
- //case GX_DRAW_TRIANGLE_STRIP: IndexGenerator::AddStrip(numVertices); break;
- //case GX_DRAW_TRIANGLE_FAN: IndexGenerator::AddFan(numVertices); break;
- //case GX_DRAW_LINES: IndexGenerator::AddLineList(numVertices); break;
- //case GX_DRAW_LINE_STRIP: IndexGenerator::AddLineStrip(numVertices); break;
- //case GX_DRAW_POINTS: IndexGenerator::AddPoints(numVertices); break;
+ //case GX_DRAW_QUADS: IndexGenerator::AddQuads(numVerts); break;
+ //case GX_DRAW_TRIANGLES: IndexGenerator::AddList(numVerts); break;
+ //case GX_DRAW_TRIANGLE_STRIP: IndexGenerator::AddStrip(numVerts); break;
+ //case GX_DRAW_TRIANGLE_FAN: IndexGenerator::AddFan(numVerts); break;
+ //case GX_DRAW_LINES: IndexGenerator::AddLineList(numVerts); break;
+ //case GX_DRAW_LINE_STRIP: IndexGenerator::AddLineStrip(numVerts); break;
+ //case GX_DRAW_POINTS: IndexGenerator::AddPoints(numVerts); break;
//}
static void (*const primitive_table[])(u32) =
@@ -89,152 +89,48 @@ void IndexGenerator::WriteTriangle(u32 index1, u32 index2, u32 index3)
*Tptr++ = index1;
*Tptr++ = index2;
*Tptr++ = index3;
-
+
++numT;
}
void IndexGenerator::AddList(u32 const numVerts)
-{
+{
auto const numTris = numVerts / 3;
- if (!numTris)
- {
- if (2 == numVerts)
- {
- // We have two verts. Render a degenerated triangle.
- WriteTriangle(index, index + 1, index);
- }
- }
- else
+ for (u32 i = 0; i != numTris; ++i)
{
- for (u32 i = 0; i != numTris; ++i)
- {
- WriteTriangle(index + i * 3, index + i * 3 + 1, index + i * 3 + 2);
- }
-
- auto const base_remaining_verts = numTris * 3;
- switch (numVerts % 3)
- {
- case 2:
- // We have 2 remaining verts. Use strip method
- WriteTriangle(
- index + base_remaining_verts - 1,
- index + base_remaining_verts,
- index + base_remaining_verts + 1);
-
- break;
-
- case 1:
- // We have 1 remaining vert. Use strip method this is only a conjeture
- WriteTriangle(
- index + base_remaining_verts - 2,
- index + base_remaining_verts - 1,
- index + base_remaining_verts);
- break;
-
- default:
- break;
- };
+ WriteTriangle(index + i * 3, index + i * 3 + 1, index + i * 3 + 2);
}
}
void IndexGenerator::AddStrip(u32 const numVerts)
{
- if (numVerts < 3)
- {
- if (2 == numVerts)
- {
- // We have two verts. Render a degenerated triangle.
- WriteTriangle(index, index + 1, index);
- }
- }
- else
+ bool wind = false;
+ for (u32 i = 2; i < numVerts; ++i)
{
- bool wind = false;
- for (u32 i = 2; i < numVerts; ++i)
- {
- WriteTriangle(
- index + i - 2,
- index + i - !wind,
- index + i - wind);
-
- wind ^= true;
- }
+ WriteTriangle(
+ index + i - 2,
+ index + i - !wind,
+ index + i - wind);
+
+ wind ^= true;
}
}
void IndexGenerator::AddFan(u32 numVerts)
{
- if (numVerts < 3)
- {
- if (2 == numVerts)
- {
- // We have two verts. Render a degenerated triangle.
- WriteTriangle(index, index + 1, index);
- }
- }
- else
+ for (u32 i = 2; i < numVerts; ++i)
{
- for (u32 i = 2; i < numVerts; ++i)
- {
- WriteTriangle(index, index + i - 1, index + i);
- }
+ WriteTriangle(index, index + i - 1, index + i);
}
}
void IndexGenerator::AddQuads(u32 numVerts)
{
auto const numQuads = numVerts / 4;
- if (!numQuads)
- {
- if (2 == numVerts)
- {
- // We have two verts. Render a degenerated triangle.
- WriteTriangle(index, index + 1, index);
- }
- else if (3 == numVerts);
- {
- // We have 3 verts. Render a full triangle.
- WriteTriangle(index, index + 1, index + 2);
- }
- }
- else
+ for (u32 i = 0; i != numQuads; ++i)
{
- for (u32 i = 0; i != numQuads; ++i)
- {
- WriteTriangle(index + i * 4, index + i * 4 + 1, index + i * 4 + 2);
- WriteTriangle(index + i * 4, index + i * 4 + 2, index + i * 4 + 3);
- }
-
- auto const base_remaining_verts = numQuads * 4;
- switch (numVerts % 4)
- {
- case 3:
- // We have 3 remaining verts. Use strip method.
- WriteTriangle(
- index + base_remaining_verts,
- index + base_remaining_verts + 1,
- index + base_remaining_verts + 2);
- break;
-
- case 2:
- // We have 3 remaining verts. Use strip method.
- WriteTriangle(
- index + base_remaining_verts - 1,
- index + base_remaining_verts,
- index + base_remaining_verts + 1);
- break;
-
- case 1:
- // We have 1 remaining verts use strip method. This is only a conjeture.
- WriteTriangle(
- base_remaining_verts - 2,
- index + base_remaining_verts - 1,
- index + base_remaining_verts);
- break;
-
- default:
- break;
- };
+ WriteTriangle(index + i * 4, index + i * 4 + 1, index + i * 4 + 2);
+ WriteTriangle(index + i * 4, index + i * 4 + 2, index + i * 4 + 3);
}
}
diff --git a/Source/Core/VideoCommon/Src/IndexGenerator.h b/Source/Core/VideoCommon/Src/IndexGenerator.h
index 5c6b7a5273..400d252bf8 100644
--- a/Source/Core/VideoCommon/Src/IndexGenerator.h
+++ b/Source/Core/VideoCommon/Src/IndexGenerator.h
@@ -57,8 +57,6 @@ private:
static void AddFan(u32 numVerts);
static void AddQuads(u32 numVerts);
- static void WriteTriangle(u32 index1, u32 index2, u32 index3);
-
// Lines
static void AddLineList(u32 numVerts);
static void AddLineStrip(u32 numVerts);
@@ -66,6 +64,8 @@ private:
// Points
static void AddPoints(u32 numVerts);
+ static void WriteTriangle(u32 index1, u32 index2, u32 index3);
+
static u16 *Tptr;
static u16 *BASETptr;
static u16 *Lptr;