very evil shit
This commit is contained in:
parent
88bc765455
commit
8c2b4b4813
|
@ -365,22 +365,52 @@ void main()
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
|
||||||
const char* kRenderFS_Z = R"(
|
const char* kRenderFS_ZO = R"(
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
oColor = FinalColor();
|
vec4 col = FinalColor();
|
||||||
|
if (col.a < 31.0/255.0) discard;
|
||||||
|
|
||||||
|
oColor = col;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
const char* kRenderFS_W = R"(
|
const char* kRenderFS_WO = R"(
|
||||||
|
|
||||||
smooth in float fZ;
|
smooth in float fZ;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
oColor = FinalColor();
|
vec4 col = FinalColor();
|
||||||
|
if (col.a < 31.0/255.0) discard;
|
||||||
|
|
||||||
|
oColor = col;
|
||||||
|
gl_FragDepth = fZ;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
const char* kRenderFS_ZT = R"(
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 col = FinalColor();
|
||||||
|
if (col.a > 30.0/255.0) discard;
|
||||||
|
|
||||||
|
oColor = col;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
const char* kRenderFS_WT = R"(
|
||||||
|
|
||||||
|
smooth in float fZ;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 col = FinalColor();
|
||||||
|
if (col.a > 30.0/255.0) discard;
|
||||||
|
|
||||||
|
oColor = col;
|
||||||
gl_FragDepth = fZ;
|
gl_FragDepth = fZ;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
@ -389,11 +419,23 @@ void main()
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
RenderFlag_WBuffer = 0x01,
|
RenderFlag_WBuffer = 0x01,
|
||||||
|
RenderFlag_Trans = 0x02,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
GLuint RenderShader[16][3];
|
GLuint RenderShader[16][3];
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Polygon* PolyData;
|
||||||
|
|
||||||
|
u16* Indices;
|
||||||
|
u32 RenderKey;
|
||||||
|
|
||||||
|
} RendererPolygon;
|
||||||
|
|
||||||
|
RendererPolygon PolygonList[2048];
|
||||||
|
|
||||||
// vertex buffer
|
// vertex buffer
|
||||||
// * XYZW: 4x16bit
|
// * XYZW: 4x16bit
|
||||||
// * RGBA: 4x8bit
|
// * RGBA: 4x8bit
|
||||||
|
@ -422,8 +464,6 @@ GLuint FramebufferID, PixelbufferID;
|
||||||
u8 Framebuffer[256*192*4];
|
u8 Framebuffer[256*192*4];
|
||||||
u8 CurLine[256*4];
|
u8 CurLine[256*4];
|
||||||
|
|
||||||
GLuint AuxBufferID;
|
|
||||||
|
|
||||||
|
|
||||||
bool InitGLExtensions()
|
bool InitGLExtensions()
|
||||||
{
|
{
|
||||||
|
@ -620,8 +660,14 @@ bool Init()
|
||||||
|
|
||||||
//if (!BuildShaderProgram(kRenderVS, kRenderFS, RenderShader, "RenderShader"))
|
//if (!BuildShaderProgram(kRenderVS, kRenderFS, RenderShader, "RenderShader"))
|
||||||
// return false;
|
// return false;
|
||||||
if (!BuildRenderShader(0, kRenderVS_Z, kRenderFS_Z)) return false;
|
if (!BuildRenderShader(0,
|
||||||
if (!BuildRenderShader(RenderFlag_WBuffer, kRenderVS_W, kRenderFS_W)) return false;
|
kRenderVS_Z, kRenderFS_ZO)) return false;
|
||||||
|
if (!BuildRenderShader(RenderFlag_WBuffer,
|
||||||
|
kRenderVS_W, kRenderFS_WO)) return false;
|
||||||
|
if (!BuildRenderShader(RenderFlag_Trans,
|
||||||
|
kRenderVS_Z, kRenderFS_ZT)) return false;
|
||||||
|
if (!BuildRenderShader(RenderFlag_Trans | RenderFlag_WBuffer,
|
||||||
|
kRenderVS_W, kRenderFS_WT)) return false;
|
||||||
|
|
||||||
|
|
||||||
glGenBuffers(1, &VertexBufferID);
|
glGenBuffers(1, &VertexBufferID);
|
||||||
|
@ -697,8 +743,43 @@ void Reset()
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
//u64 texpool1[1024]; u32 texpool2[1024];
|
|
||||||
void BuildPolygons(Polygon** polygons, int npolys)
|
void SetupPolygon(RendererPolygon* rp, Polygon* polygon)
|
||||||
|
{
|
||||||
|
rp->PolyData = polygon;
|
||||||
|
|
||||||
|
// render key: depending on what we're drawing
|
||||||
|
// opaque polygons:
|
||||||
|
// - depthfunc
|
||||||
|
// -- alpha=0
|
||||||
|
// regular translucent polygons:
|
||||||
|
// - depthfunc
|
||||||
|
// -- depthwrite
|
||||||
|
// --- polyID
|
||||||
|
// shadow mask polygons:
|
||||||
|
// - depthfunc?????
|
||||||
|
// shadow polygons:
|
||||||
|
// - depthfunc
|
||||||
|
// -- depthwrite
|
||||||
|
// --- polyID
|
||||||
|
|
||||||
|
rp->RenderKey = (polygon->Attr >> 14) & 0x1; // bit14 - depth func
|
||||||
|
if (!polygon->IsShadowMask)
|
||||||
|
{
|
||||||
|
if (polygon->Translucent)
|
||||||
|
{
|
||||||
|
rp->RenderKey |= (polygon->Attr >> 10) & 0x2; // bit11 - depth write
|
||||||
|
rp->RenderKey |= (polygon->Attr & 0x3F000000) >> 16; // polygon ID
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((polygon->Attr & 0x001F0000) == 0)
|
||||||
|
rp->RenderKey |= 0x2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BuildPolygons(RendererPolygon* polygons, int npolys)
|
||||||
{
|
{
|
||||||
u32* vptr = &VertexBuffer[0];
|
u32* vptr = &VertexBuffer[0];
|
||||||
u32 vidx = 0;
|
u32 vidx = 0;
|
||||||
|
@ -706,39 +787,12 @@ void BuildPolygons(Polygon** polygons, int npolys)
|
||||||
u16* iptr = &IndexBuffer[0];
|
u16* iptr = &IndexBuffer[0];
|
||||||
u32 numtriangles = 0;
|
u32 numtriangles = 0;
|
||||||
|
|
||||||
/*memset(texpool1, 0, 1024*8);
|
|
||||||
memset(texpool2, 0, 1024*4);
|
|
||||||
u32 texcount1 = 0, texcount2 = 0;
|
|
||||||
|
|
||||||
u32 texsizecnt[64];
|
|
||||||
memset(texsizecnt, 0, 64*4);*/
|
|
||||||
|
|
||||||
for (int i = 0; i < npolys; i++)
|
for (int i = 0; i < npolys; i++)
|
||||||
{
|
{
|
||||||
Polygon* poly = polygons[i];
|
RendererPolygon* rp = &polygons[i];
|
||||||
if (poly->Degenerate) continue;
|
Polygon* poly = rp->PolyData;
|
||||||
|
|
||||||
/*u32 tid1 = -1, tid2 = -1;
|
rp->Indices = iptr;
|
||||||
for (int k = 0; k < 1024; k++)
|
|
||||||
{
|
|
||||||
if (texpool1[k] == ((u64)poly->TexParam | ((u64)poly->TexPalette << 32)))
|
|
||||||
{
|
|
||||||
tid1 = k;
|
|
||||||
}
|
|
||||||
if (texpool2[k] == poly->TexParam)
|
|
||||||
{
|
|
||||||
tid2 = k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tid1 == -1)
|
|
||||||
{
|
|
||||||
texpool1[texcount1++] = ((u64)poly->TexParam | ((u64)poly->TexPalette << 32));
|
|
||||||
}
|
|
||||||
if (tid2 == -1)
|
|
||||||
{
|
|
||||||
texpool2[texcount2++] = poly->TexParam;
|
|
||||||
texsizecnt[(poly->TexParam >> 20) & 0x3F]++;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
u32 vidx_first = vidx;
|
u32 vidx_first = vidx;
|
||||||
|
|
||||||
|
@ -792,17 +846,6 @@ void BuildPolygons(Polygon** polygons, int npolys)
|
||||||
|
|
||||||
NumTriangles = numtriangles;
|
NumTriangles = numtriangles;
|
||||||
NumVertices = vidx;
|
NumVertices = vidx;
|
||||||
/*printf("polygons done: %d | textures by attr+pal: %d | textures by attr: %d\n", RenderNumPolygons, texcount1, texcount2);
|
|
||||||
printf("texture sizes: ");
|
|
||||||
for (int s = 0; s < 64; s++)
|
|
||||||
{
|
|
||||||
u32 n = texsizecnt[s];
|
|
||||||
if (!n) continue;
|
|
||||||
int sizes = 8 << (s & 0x7);
|
|
||||||
int sizet = 8 << (s >> 3);
|
|
||||||
printf("%dx%d: %d, ", sizes, sizet, n);
|
|
||||||
}
|
|
||||||
printf("\n");*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -856,16 +899,21 @@ void RenderFrame()
|
||||||
// render shit here
|
// render shit here
|
||||||
u32 flags = 0;
|
u32 flags = 0;
|
||||||
if (RenderPolygonRAM[0]->WBuffer) flags |= RenderFlag_WBuffer;
|
if (RenderPolygonRAM[0]->WBuffer) flags |= RenderFlag_WBuffer;
|
||||||
UseRenderShader(flags);
|
|
||||||
|
|
||||||
//glBindTexture(GL_TEXTURE_2D, AuxBufferID);
|
int npolys = 0;
|
||||||
//glBindImageTexture(0, AuxBufferID, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RG32UI);
|
for (int i = 0; i < RenderNumPolygons; i++)
|
||||||
|
{
|
||||||
|
if (RenderPolygonRAM[i]->Degenerate) continue;
|
||||||
|
SetupPolygon(&PolygonList[npolys++], RenderPolygonRAM[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
UseRenderShader(flags);
|
||||||
|
|
||||||
// zorp
|
// zorp
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glDepthFunc(GL_LESS);
|
glDepthFunc(GL_LESS);
|
||||||
|
|
||||||
BuildPolygons(&RenderPolygonRAM[0], RenderNumPolygons);
|
BuildPolygons(&PolygonList[0], npolys);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
|
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
|
||||||
glBufferSubData(GL_ARRAY_BUFFER, 0, NumVertices*7*4, VertexBuffer);
|
glBufferSubData(GL_ARRAY_BUFFER, 0, NumVertices*7*4, VertexBuffer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue