mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-26 02:19:24 +01:00
update vbo only if needed
This commit is contained in:
parent
d36d432c1a
commit
9127c431ec
172
src/render.c
172
src/render.c
@ -83,6 +83,9 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
tex_width = tex_width > tex_height ? tex_width : tex_height;
|
tex_width = tex_width > tex_height ? tex_width : tex_height;
|
||||||
|
|
||||||
|
float scale_w = (float)ddraw->width / tex_width;
|
||||||
|
float scale_h = (float)ddraw->height / tex_height;
|
||||||
|
|
||||||
int tex_size = tex_width * tex_height * sizeof(int);
|
int tex_size = tex_width * tex_height * sizeof(int);
|
||||||
int *tex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tex_size);
|
int *tex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tex_size);
|
||||||
|
|
||||||
@ -159,20 +162,31 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
glGenBuffers(3, mainVbos);
|
glGenBuffers(3, mainVbos);
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[0]);
|
|
||||||
if (scaleProgram)
|
if (scaleProgram)
|
||||||
{
|
{
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[0]);
|
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[0]);
|
||||||
static const GLfloat vertexCoordPal[] = {
|
static const GLfloat vertexCoord[] = {
|
||||||
-1.0f, -1.0f,
|
-1.0f, -1.0f,
|
||||||
-1.0f, 1.0f,
|
-1.0f, 1.0f,
|
||||||
1.0f, 1.0f,
|
1.0f, 1.0f,
|
||||||
1.0f, -1.0f,
|
1.0f, -1.0f,
|
||||||
};
|
};
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoordPal), vertexCoordPal, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[1]);
|
||||||
|
GLfloat texCoord[] = {
|
||||||
|
0.0f, 0.0f,
|
||||||
|
0.0f, scale_h,
|
||||||
|
scale_w, scale_h,
|
||||||
|
scale_w, 0.0f,
|
||||||
|
};
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[0]);
|
||||||
static const GLfloat vertexCoord[] = {
|
static const GLfloat vertexCoord[] = {
|
||||||
-1.0f, 1.0f,
|
-1.0f, 1.0f,
|
||||||
1.0f, 1.0f,
|
1.0f, 1.0f,
|
||||||
@ -180,9 +194,19 @@ DWORD WINAPI render_main(void)
|
|||||||
-1.0f,-1.0f,
|
-1.0f,-1.0f,
|
||||||
};
|
};
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
|
||||||
}
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[1]);
|
||||||
|
GLfloat texCoord[] = {
|
||||||
|
0.0f, 0.0f,
|
||||||
|
scale_w, 0.0f,
|
||||||
|
scale_w, scale_h,
|
||||||
|
0.0f, scale_h,
|
||||||
|
};
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
glGenVertexArrays(1, &mainVao);
|
glGenVertexArrays(1, &mainVao);
|
||||||
glBindVertexArray(mainVao);
|
glBindVertexArray(mainVao);
|
||||||
|
|
||||||
@ -191,6 +215,11 @@ DWORD WINAPI render_main(void)
|
|||||||
glEnableVertexAttribArray(vertexCoordAttrLoc);
|
glEnableVertexAttribArray(vertexCoordAttrLoc);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[1]);
|
||||||
|
glVertexAttribPointer(mainTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
|
glEnableVertexAttribArray(mainTexCoordAttrLoc);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mainVbos[2]);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mainVbos[2]);
|
||||||
static const GLushort indices[] =
|
static const GLushort indices[] =
|
||||||
{
|
{
|
||||||
@ -241,6 +270,16 @@ DWORD WINAPI render_main(void)
|
|||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, scaleVbos[1]);
|
||||||
|
GLfloat texCoord[] = {
|
||||||
|
0.0f, 0.0f,
|
||||||
|
scale_w, 0.0f,
|
||||||
|
scale_w, scale_h,
|
||||||
|
0.0f, scale_h,
|
||||||
|
};
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
glGenVertexArrays(1, &scaleVao);
|
glGenVertexArrays(1, &scaleVao);
|
||||||
glBindVertexArray(scaleVao);
|
glBindVertexArray(scaleVao);
|
||||||
|
|
||||||
@ -249,6 +288,11 @@ DWORD WINAPI render_main(void)
|
|||||||
glEnableVertexAttribArray(vertexCoordAttrLoc);
|
glEnableVertexAttribArray(vertexCoordAttrLoc);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, scaleVbos[1]);
|
||||||
|
glVertexAttribPointer(scaleTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
|
glEnableVertexAttribArray(scaleTexCoordAttrLoc);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, scaleVbos[2]);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, scaleVbos[2]);
|
||||||
static const GLushort indices[] =
|
static const GLushort indices[] =
|
||||||
{
|
{
|
||||||
@ -340,8 +384,8 @@ DWORD WINAPI render_main(void)
|
|||||||
frame_count++;
|
frame_count++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
float scale_w = (float)ddraw->width / tex_width;
|
scale_w = (float)ddraw->width / tex_width;
|
||||||
float scale_h = (float)ddraw->height / tex_height;
|
scale_h = (float)ddraw->height / tex_height;
|
||||||
|
|
||||||
if (maxfps > 0)
|
if (maxfps > 0)
|
||||||
tick_start = timeGetTime();
|
tick_start = timeGetTime();
|
||||||
@ -350,19 +394,79 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
if (ddraw->primary && ddraw->primary->palette)
|
if (ddraw->primary && ddraw->primary->palette)
|
||||||
{
|
{
|
||||||
|
BOOL scaleChanged = FALSE;
|
||||||
|
|
||||||
if (ddraw->vhack && detect_cutscene())
|
if (ddraw->vhack && detect_cutscene())
|
||||||
{
|
{
|
||||||
scale_w *= (float)CUTSCENE_WIDTH / ddraw->width;
|
scale_w *= (float)CUTSCENE_WIDTH / ddraw->width;
|
||||||
scale_h *= (float)CUTSCENE_HEIGHT / ddraw->height;
|
scale_h *= (float)CUTSCENE_HEIGHT / ddraw->height;
|
||||||
|
|
||||||
if (!ddraw->incutscene)
|
if (!ddraw->incutscene)
|
||||||
|
{
|
||||||
|
scaleChanged = TRUE;
|
||||||
ddraw->incutscene = TRUE;
|
ddraw->incutscene = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ddraw->incutscene)
|
if (ddraw->incutscene)
|
||||||
|
{
|
||||||
|
scaleChanged = TRUE;
|
||||||
ddraw->incutscene = FALSE;
|
ddraw->incutscene = FALSE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scaleChanged)
|
||||||
|
{
|
||||||
|
if (scaleProgram && paletteConvProgram)
|
||||||
|
{
|
||||||
|
glBindVertexArray(mainVao);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[1]);
|
||||||
|
GLfloat texCoordPal[] = {
|
||||||
|
0.0f, 0.0f,
|
||||||
|
0.0f, scale_h,
|
||||||
|
scale_w, scale_h,
|
||||||
|
scale_w, 0.0f,
|
||||||
|
};
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoordPal), texCoordPal, GL_STATIC_DRAW);
|
||||||
|
glVertexAttribPointer(mainTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
|
glEnableVertexAttribArray(mainTexCoordAttrLoc);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
|
||||||
|
glBindVertexArray(scaleVao);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, scaleVbos[1]);
|
||||||
|
GLfloat texCoord[] = {
|
||||||
|
0.0f, 0.0f,
|
||||||
|
scale_w, 0.0f,
|
||||||
|
scale_w, scale_h,
|
||||||
|
0.0f, scale_h,
|
||||||
|
};
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW);
|
||||||
|
glVertexAttribPointer(scaleTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
|
glEnableVertexAttribArray(scaleTexCoordAttrLoc);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
else if (got30 && paletteConvProgram)
|
||||||
|
{
|
||||||
|
glBindVertexArray(mainVao);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[1]);
|
||||||
|
GLfloat texCoord[] = {
|
||||||
|
0.0f, 0.0f,
|
||||||
|
scale_w, 0.0f,
|
||||||
|
scale_w, scale_h,
|
||||||
|
0.0f, scale_h,
|
||||||
|
};
|
||||||
|
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW);
|
||||||
|
glVertexAttribPointer(mainTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
|
glEnableVertexAttribArray(mainTexCoordAttrLoc);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (paletteConvProgram)
|
if (paletteConvProgram)
|
||||||
{
|
{
|
||||||
@ -422,30 +526,14 @@ DWORD WINAPI render_main(void)
|
|||||||
|
|
||||||
glViewport(0, 0, ddraw->width, ddraw->height);
|
glViewport(0, 0, ddraw->width, ddraw->height);
|
||||||
|
|
||||||
glBindVertexArray(mainVao);
|
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
|
glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[1]);
|
glBindVertexArray(mainVao);
|
||||||
|
|
||||||
GLfloat texCoordPal[] = {
|
|
||||||
0.0f, 0.0f,
|
|
||||||
0.0f, scale_h,
|
|
||||||
scale_w, scale_h,
|
|
||||||
scale_w, 0.0f,
|
|
||||||
};
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoordPal), texCoordPal, GL_STATIC_DRAW);
|
|
||||||
glVertexAttribPointer(mainTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
|
||||||
glEnableVertexAttribArray(mainTexCoordAttrLoc);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
glBindVertexArray(0);
|
|
||||||
|
|
||||||
glViewport(
|
glViewport(
|
||||||
ddraw->render.viewport.x, ddraw->render.viewport.y,
|
ddraw->render.viewport.x, ddraw->render.viewport.y,
|
||||||
ddraw->render.viewport.width, ddraw->render.viewport.height);
|
ddraw->render.viewport.width, ddraw->render.viewport.height);
|
||||||
@ -456,23 +544,6 @@ DWORD WINAPI render_main(void)
|
|||||||
// apply filter
|
// apply filter
|
||||||
|
|
||||||
glUseProgram(scaleProgram);
|
glUseProgram(scaleProgram);
|
||||||
|
|
||||||
glBindVertexArray(scaleVao);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, scaleVbos[1]);
|
|
||||||
|
|
||||||
GLfloat texCoord[] = {
|
|
||||||
0.0f, 0.0f,
|
|
||||||
scale_w, 0.0f,
|
|
||||||
scale_w, scale_h,
|
|
||||||
0.0f, scale_h,
|
|
||||||
};
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW);
|
|
||||||
glVertexAttribPointer(scaleTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
|
||||||
glEnableVertexAttribArray(scaleTexCoordAttrLoc);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glBindTexture(GL_TEXTURE_2D, frameBufferTexId);
|
glBindTexture(GL_TEXTURE_2D, frameBufferTexId);
|
||||||
@ -482,31 +553,14 @@ DWORD WINAPI render_main(void)
|
|||||||
if (frameCountUniLoc != -1)
|
if (frameCountUniLoc != -1)
|
||||||
glUniform1i(frameCountUniLoc, frames++);
|
glUniform1i(frameCountUniLoc, frames++);
|
||||||
|
|
||||||
|
glBindVertexArray(scaleVao);
|
||||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
else if (got30 && paletteConvProgram)
|
else if (got30 && paletteConvProgram)
|
||||||
{
|
{
|
||||||
glBindVertexArray(mainVao);
|
glBindVertexArray(mainVao);
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, mainVbos[1]);
|
|
||||||
|
|
||||||
GLfloat texCoord[] = {
|
|
||||||
0.0f, 0.0f,
|
|
||||||
scale_w, 0.0f,
|
|
||||||
scale_w, scale_h,
|
|
||||||
0.0f, scale_h,
|
|
||||||
};
|
|
||||||
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW);
|
|
||||||
glVertexAttribPointer(mainTexCoordAttrLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
|
||||||
glEnableVertexAttribArray(mainTexCoordAttrLoc);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user