convert triangle_fan to triangle_strip
This commit is contained in:
parent
cf98ef8cf3
commit
80b56ddd17
|
@ -21,15 +21,6 @@
|
||||||
#include "VideoConfig.h"
|
#include "VideoConfig.h"
|
||||||
#include "IndexGenerator.h"
|
#include "IndexGenerator.h"
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
QUAD simulator
|
|
||||||
|
|
||||||
0 1 4 5
|
|
||||||
3 2 7 6
|
|
||||||
012023 147172 ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Init
|
//Init
|
||||||
u16 *IndexGenerator::Tptr;
|
u16 *IndexGenerator::Tptr;
|
||||||
u16 *IndexGenerator::BASETptr;
|
u16 *IndexGenerator::BASETptr;
|
||||||
|
@ -130,24 +121,80 @@ void IndexGenerator::AddStrip(u32 const numVerts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FAN simulator:
|
||||||
|
*
|
||||||
|
* 2---3
|
||||||
|
* / \ / \
|
||||||
|
* 1---0---4
|
||||||
|
*
|
||||||
|
* would generate this triangles:
|
||||||
|
* 012, 023, 034
|
||||||
|
*
|
||||||
|
* rotated (for better striping):
|
||||||
|
* 120, 302, 034
|
||||||
|
*
|
||||||
|
* as odd ones have to winded, following strip is fine:
|
||||||
|
* 12034
|
||||||
|
*
|
||||||
|
* so we use 6 indices for 3 triangles
|
||||||
|
*/
|
||||||
|
|
||||||
void IndexGenerator::AddFan(u32 numVerts)
|
void IndexGenerator::AddFan(u32 numVerts)
|
||||||
{
|
{
|
||||||
for (u32 i = 2; i < numVerts; ++i)
|
ERROR_LOG(VIDEO, "addfan: %d vertices", numVerts);
|
||||||
|
u32 i = 2;
|
||||||
|
|
||||||
|
if(g_Config.backend_info.bSupportsPrimitiveRestart) {
|
||||||
|
for(; i<=numVerts-3; i+=3) {
|
||||||
|
*Tptr++ = index + i - 1;
|
||||||
|
*Tptr++ = index + i + 0;
|
||||||
|
*Tptr++ = index;
|
||||||
|
*Tptr++ = index + i + 1;
|
||||||
|
*Tptr++ = index + i + 2;
|
||||||
|
*Tptr++ = 65535;
|
||||||
|
numT += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(; i<=numVerts-2; i+=2) {
|
||||||
|
*Tptr++ = index + i - 1;
|
||||||
|
*Tptr++ = index + i + 0;
|
||||||
|
*Tptr++ = index;
|
||||||
|
*Tptr++ = index + i + 1;
|
||||||
|
*Tptr++ = 65535;
|
||||||
|
numT += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i < numVerts; ++i)
|
||||||
{
|
{
|
||||||
WriteTriangle(index, index + i - 1, index + i);
|
WriteTriangle(index, index + i - 1, index + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* QUAD simulator
|
||||||
|
*
|
||||||
|
* 0---1 4---5
|
||||||
|
* |\ | |\ |
|
||||||
|
* | \ | | \ |
|
||||||
|
* | \| | \|
|
||||||
|
* 3---2 7---6
|
||||||
|
*
|
||||||
|
* 012,023, 456,467 ...
|
||||||
|
* or 120,302, 564,746
|
||||||
|
* or as strip: 1203, 5647
|
||||||
|
*/
|
||||||
void IndexGenerator::AddQuads(u32 numVerts)
|
void IndexGenerator::AddQuads(u32 numVerts)
|
||||||
{
|
{
|
||||||
auto const numQuads = numVerts / 4;
|
auto const numQuads = numVerts / 4;
|
||||||
for (u32 i = 0; i != numQuads; ++i)
|
for (u32 i = 0; i != numQuads; ++i)
|
||||||
{
|
{
|
||||||
if(g_Config.backend_info.bSupportsPrimitiveRestart) {
|
if(g_Config.backend_info.bSupportsPrimitiveRestart) {
|
||||||
*Tptr++ = index + i * 4 + 0;
|
|
||||||
*Tptr++ = index + i * 4 + 1;
|
*Tptr++ = index + i * 4 + 1;
|
||||||
*Tptr++ = index + i * 4 + 3;
|
|
||||||
*Tptr++ = index + i * 4 + 2;
|
*Tptr++ = index + i * 4 + 2;
|
||||||
|
*Tptr++ = index + i * 4 + 0;
|
||||||
|
*Tptr++ = index + i * 4 + 3;
|
||||||
*Tptr++ = 65535;
|
*Tptr++ = 65535;
|
||||||
numT += 2;
|
numT += 2;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue