mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
triangles
This commit is contained in:
parent
9f6922221d
commit
f2e3476741
2 changed files with 16 additions and 12 deletions
|
@ -41,7 +41,7 @@ void IndexGenerator::AddPrim(int prim, int vertexCount, bool clockwise) {
|
|||
case GE_PRIM_POINTS: AddPoints(vertexCount); break;
|
||||
case GE_PRIM_LINES: AddLineList(vertexCount); break;
|
||||
case GE_PRIM_LINE_STRIP: AddLineStrip(vertexCount); break;
|
||||
case GE_PRIM_TRIANGLES: AddList(vertexCount); break;
|
||||
case GE_PRIM_TRIANGLES: AddList(vertexCount, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_STRIP: AddStrip(vertexCount, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: AddFan(vertexCount, clockwise); break;
|
||||
case GE_PRIM_RECTANGLES: AddRectangles(vertexCount); break; // Same
|
||||
|
@ -61,13 +61,15 @@ void IndexGenerator::AddPoints(int numVerts) {
|
|||
seenPrims_ |= 1 << GE_PRIM_POINTS;
|
||||
}
|
||||
|
||||
void IndexGenerator::AddList(int numVerts) {
|
||||
void IndexGenerator::AddList(int numVerts, bool clockwise) {
|
||||
u16 *outInds = inds_;
|
||||
const int startIndex = index_;
|
||||
const int v1 = clockwise ? 1 : 2;
|
||||
const int v2 = clockwise ? 2 : 1;
|
||||
for (int i = 0; i < numVerts; i += 3) {
|
||||
*outInds++ = startIndex + i;
|
||||
*outInds++ = startIndex + i + 1;
|
||||
*outInds++ = startIndex + i + 2;
|
||||
*outInds++ = startIndex + i + v1;
|
||||
*outInds++ = startIndex + i + v2;
|
||||
}
|
||||
inds_ = outInds;
|
||||
// ignore overflow verts
|
||||
|
@ -212,7 +214,7 @@ void IndexGenerator::TranslateLineStrip(int numInds, const ITypeLE *inds, int in
|
|||
}
|
||||
|
||||
template <class ITypeLE, int flag>
|
||||
void IndexGenerator::TranslateList(int numInds, const ITypeLE *inds, int indexOffset) {
|
||||
void IndexGenerator::TranslateList(int numInds, const ITypeLE *inds, int indexOffset, bool clockwise) {
|
||||
indexOffset = index_ - indexOffset;
|
||||
// We only bother doing this minor optimization in triangle list, since it's by far the most
|
||||
// common operation that can benefit.
|
||||
|
@ -224,10 +226,12 @@ void IndexGenerator::TranslateList(int numInds, const ITypeLE *inds, int indexOf
|
|||
u16 *outInds = inds_;
|
||||
int numTris = numInds / 3; // Round to whole triangles
|
||||
numInds = numTris * 3;
|
||||
const int v1 = clockwise ? 1 : 2;
|
||||
const int v2 = clockwise ? 2 : 1;
|
||||
for (int i = 0; i < numInds; i += 3) {
|
||||
*outInds++ = indexOffset + inds[i];
|
||||
*outInds++ = indexOffset + inds[i + 1];
|
||||
*outInds++ = indexOffset + inds[i + 2];
|
||||
*outInds++ = indexOffset + inds[i + v1];
|
||||
*outInds++ = indexOffset + inds[i + v2];
|
||||
}
|
||||
inds_ = outInds;
|
||||
count_ += numInds;
|
||||
|
@ -295,7 +299,7 @@ void IndexGenerator::TranslatePrim(int prim, int numInds, const u8 *inds, int in
|
|||
case GE_PRIM_POINTS: TranslatePoints<u8, SEEN_INDEX8>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_LINES: TranslateLineList<u8, SEEN_INDEX8>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_LINE_STRIP: TranslateLineStrip<u8, SEEN_INDEX8>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_TRIANGLES: TranslateList<u8, SEEN_INDEX8>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_TRIANGLES: TranslateList<u8, SEEN_INDEX8>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_STRIP: TranslateStrip<u8, SEEN_INDEX8>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: TranslateFan<u8, SEEN_INDEX8>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_RECTANGLES: TranslateRectangles<u8, SEEN_INDEX8>(numInds, inds, indexOffset); break; // Same
|
||||
|
@ -307,7 +311,7 @@ void IndexGenerator::TranslatePrim(int prim, int numInds, const u16_le *inds, in
|
|||
case GE_PRIM_POINTS: TranslatePoints<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_LINES: TranslateLineList<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_LINE_STRIP: TranslateLineStrip<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_TRIANGLES: TranslateList<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_TRIANGLES: TranslateList<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_STRIP: TranslateStrip<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: TranslateFan<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_RECTANGLES: TranslateRectangles<u16_le, SEEN_INDEX16>(numInds, inds, indexOffset); break; // Same
|
||||
|
@ -319,7 +323,7 @@ void IndexGenerator::TranslatePrim(int prim, int numInds, const u32_le *inds, in
|
|||
case GE_PRIM_POINTS: TranslatePoints<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_LINES: TranslateLineList<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_LINE_STRIP: TranslateLineStrip<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_TRIANGLES: TranslateList<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset); break;
|
||||
case GE_PRIM_TRIANGLES: TranslateList<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_STRIP: TranslateStrip<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: TranslateFan<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_RECTANGLES: TranslateRectangles<u32_le, SEEN_INDEX32>(numInds, inds, indexOffset); break; // Same
|
||||
|
|
|
@ -75,7 +75,7 @@ private:
|
|||
// Points (why index these? code simplicity)
|
||||
void AddPoints(int numVerts);
|
||||
// Triangles
|
||||
void AddList(int numVerts);
|
||||
void AddList(int numVerts, bool clockwise);
|
||||
void AddStrip(int numVerts, bool clockwise);
|
||||
void AddFan(int numVerts, bool clockwise);
|
||||
// Lines
|
||||
|
@ -88,7 +88,7 @@ private:
|
|||
template <class ITypeLE, int flag>
|
||||
void TranslatePoints(int numVerts, const ITypeLE *inds, int indexOffset);
|
||||
template <class ITypeLE, int flag>
|
||||
void TranslateList(int numVerts, const ITypeLE *inds, int indexOffset);
|
||||
void TranslateList(int numVerts, const ITypeLE *inds, int indexOffset, bool clockwise);
|
||||
template <class ITypeLE, int flag>
|
||||
inline void TranslateLineList(int numVerts, const ITypeLE *inds, int indexOffset);
|
||||
template <class ITypeLE, int flag>
|
||||
|
|
Loading…
Add table
Reference in a new issue