very evil shit

This commit is contained in:
Arisotura 2019-05-01 23:35:48 +02:00
parent 88bc765455
commit 8c2b4b4813
1 changed files with 103 additions and 55 deletions

View File

@ -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);