mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
triangle fan
This commit is contained in:
parent
51388ded22
commit
d029bbacc7
3 changed files with 26 additions and 17 deletions
|
@ -520,7 +520,12 @@ void DrawEngineCommon::DecodeVertsStep(u8 *dest, int &i, int &decodedVerts) {
|
|||
dec_->DecodeVerts(dest + decodedVerts * (int)dec_->GetDecVtxFmt().stride,
|
||||
dc.verts, indexLowerBound, indexUpperBound);
|
||||
decodedVerts += indexUpperBound - indexLowerBound + 1;
|
||||
indexGen.AddPrim(dc.prim, dc.vertexCount);
|
||||
|
||||
bool clockwise = true;
|
||||
if (dc.cullMode != -1 && gstate.isCullEnabled() && gstate.getCullMode() != dc.cullMode) {
|
||||
clockwise = false;
|
||||
}
|
||||
indexGen.AddPrim(dc.prim, dc.vertexCount, clockwise);
|
||||
} else {
|
||||
// It's fairly common that games issue long sequences of PRIM calls, with differing
|
||||
// inds pointer but the same base vertex pointer. We'd like to reuse vertices between
|
||||
|
|
|
@ -36,14 +36,14 @@ void IndexGenerator::Setup(u16 *inds) {
|
|||
Reset();
|
||||
}
|
||||
|
||||
void IndexGenerator::AddPrim(int prim, int vertexCount) {
|
||||
void IndexGenerator::AddPrim(int prim, int vertexCount, bool clockwise) {
|
||||
switch (prim) {
|
||||
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_TRIANGLE_STRIP: AddStrip(vertexCount); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: AddFan(vertexCount); 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
|
||||
}
|
||||
}
|
||||
|
@ -77,8 +77,8 @@ void IndexGenerator::AddList(int numVerts) {
|
|||
seenPrims_ |= 1 << GE_PRIM_TRIANGLES;
|
||||
}
|
||||
|
||||
void IndexGenerator::AddStrip(int numVerts) {
|
||||
int wind = 1;
|
||||
void IndexGenerator::AddStrip(int numVerts, bool clockwise) {
|
||||
int wind = clockwise ? 1 : 2;
|
||||
const int numTris = numVerts - 2;
|
||||
u16 *outInds = inds_;
|
||||
int ibase = index_;
|
||||
|
@ -105,14 +105,16 @@ void IndexGenerator::AddStrip(int numVerts) {
|
|||
}
|
||||
}
|
||||
|
||||
void IndexGenerator::AddFan(int numVerts) {
|
||||
void IndexGenerator::AddFan(int numVerts, bool clockwise) {
|
||||
const int numTris = numVerts - 2;
|
||||
u16 *outInds = inds_;
|
||||
const int startIndex = index_;
|
||||
const int v1 = clockwise ? 1 : 2;
|
||||
const int v2 = clockwise ? 2 : 1;
|
||||
for (int i = 0; i < numTris; i++) {
|
||||
*outInds++ = startIndex;
|
||||
*outInds++ = startIndex + i + 1;
|
||||
*outInds++ = startIndex + i + 2;
|
||||
*outInds++ = startIndex + i + v1;
|
||||
*outInds++ = startIndex + i + v2;
|
||||
}
|
||||
inds_ = outInds;
|
||||
index_ += numVerts;
|
||||
|
@ -253,11 +255,13 @@ void IndexGenerator::TranslateStrip(int numInds, const ITypeLE *inds, int indexO
|
|||
}
|
||||
|
||||
template <class ITypeLE, int flag>
|
||||
void IndexGenerator::TranslateFan(int numInds, const ITypeLE *inds, int indexOffset) {
|
||||
void IndexGenerator::TranslateFan(int numInds, const ITypeLE *inds, int indexOffset, bool clockwise) {
|
||||
if (numInds <= 0) return;
|
||||
indexOffset = index_ - indexOffset;
|
||||
int numTris = numInds - 2;
|
||||
u16 *outInds = inds_;
|
||||
const int v1 = clockwise ? 1 : 2;
|
||||
const int v2 = clockwise ? 2 : 1;
|
||||
for (int i = 0; i < numTris; i++) {
|
||||
*outInds++ = indexOffset + inds[0];
|
||||
*outInds++ = indexOffset + inds[i + 1];
|
||||
|
@ -293,7 +297,7 @@ void IndexGenerator::TranslatePrim(int prim, int numInds, const u8 *inds, int in
|
|||
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_TRIANGLE_STRIP: TranslateStrip<u8, SEEN_INDEX8>(numInds, inds, indexOffset, clockwise); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: TranslateFan<u8, SEEN_INDEX8>(numInds, inds, indexOffset); 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
|
||||
}
|
||||
}
|
||||
|
@ -305,7 +309,7 @@ void IndexGenerator::TranslatePrim(int prim, int numInds, const u16_le *inds, in
|
|||
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_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); 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
|
||||
}
|
||||
}
|
||||
|
@ -317,7 +321,7 @@ void IndexGenerator::TranslatePrim(int prim, int numInds, const u32_le *inds, in
|
|||
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_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); 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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ public:
|
|||
|
||||
GEPrimitiveType Prim() const { return prim_; }
|
||||
|
||||
void AddPrim(int prim, int vertexCount);
|
||||
void AddPrim(int prim, int vertexCount, bool clockwise = true);
|
||||
void TranslatePrim(int prim, int numInds, const u8 *inds, int indexOffset, bool clockwise);
|
||||
void TranslatePrim(int prim, int numInds, const u16_le *inds, int indexOffset, bool clockwise);
|
||||
void TranslatePrim(int prim, int numInds, const u32_le *inds, int indexOffset, bool clockwise);
|
||||
|
@ -76,8 +76,8 @@ private:
|
|||
void AddPoints(int numVerts);
|
||||
// Triangles
|
||||
void AddList(int numVerts);
|
||||
void AddStrip(int numVerts);
|
||||
void AddFan(int numVerts);
|
||||
void AddStrip(int numVerts, bool clockwise);
|
||||
void AddFan(int numVerts, bool clockwise);
|
||||
// Lines
|
||||
void AddLineList(int numVerts);
|
||||
void AddLineStrip(int numVerts);
|
||||
|
@ -97,7 +97,7 @@ private:
|
|||
template <class ITypeLE, int flag>
|
||||
void TranslateStrip(int numVerts, const ITypeLE *inds, int indexOffset, bool clockwise);
|
||||
template <class ITypeLE, int flag>
|
||||
void TranslateFan(int numVerts, const ITypeLE *inds, int indexOffset);
|
||||
void TranslateFan(int numVerts, const ITypeLE *inds, int indexOffset, bool clockwise);
|
||||
|
||||
template <class ITypeLE, int flag>
|
||||
inline void TranslateRectangles(int numVerts, const ITypeLE *inds, int indexOffset);
|
||||
|
|
Loading…
Add table
Reference in a new issue