Minor refactoring

This commit is contained in:
Vladislav Khorev 2025-02-22 21:04:23 +03:00
parent c792e50f1b
commit 21301652ce
5 changed files with 67 additions and 73 deletions

View File

@ -26,16 +26,16 @@ namespace ZL
std::shared_ptr<Texture> pipeTexturePtr; std::shared_ptr<Texture> pipeTexturePtr;
std::shared_ptr<Texture> gameOverTexturePtr; std::shared_ptr<Texture> gameOverTexturePtr;
VertexDataStruct birdMesh; VertexRenderStruct birdMesh;
VertexDataStruct backgroundMesh; VertexRenderStruct backgroundMesh;
VertexDataStruct pipeMesh; VertexRenderStruct pipeMesh;
VertexDataStruct gameOverMesh; VertexRenderStruct gameOverMesh;
VertexDataStruct colorCubeMesh; VertexDataStruct colorCubeMesh;
VertexDataStruct colorCubeMeshMutable; VertexRenderStruct colorCubeMeshMutable;
} }

10
Game.h
View File

@ -98,15 +98,15 @@ namespace ZL
extern std::shared_ptr<Texture> pipeTexturePtr; extern std::shared_ptr<Texture> pipeTexturePtr;
extern std::shared_ptr<Texture> gameOverTexturePtr; extern std::shared_ptr<Texture> gameOverTexturePtr;
extern VertexDataStruct birdMesh; extern VertexRenderStruct birdMesh;
extern VertexDataStruct backgroundMesh; extern VertexRenderStruct backgroundMesh;
extern VertexDataStruct pipeMesh; extern VertexRenderStruct pipeMesh;
extern VertexDataStruct gameOverMesh; extern VertexRenderStruct gameOverMesh;
extern VertexDataStruct colorCubeMesh; extern VertexDataStruct colorCubeMesh;
extern VertexDataStruct colorCubeMeshMutable; extern VertexRenderStruct colorCubeMeshMutable;
} }
} }

View File

@ -72,8 +72,6 @@ namespace ZL {
result.TexCoordData.push_back(texCoordPos4); result.TexCoordData.push_back(texCoordPos4);
result.TexCoordData.push_back(texCoordPos1); result.TexCoordData.push_back(texCoordPos1);
result.RefreshVBO();
return result; return result;
} }
@ -115,8 +113,6 @@ namespace ZL {
} }
result.RefreshVBO();
return result; return result;
} }
@ -192,12 +188,10 @@ namespace ZL {
result.ColorData.push_back(cubeColors[i]); result.ColorData.push_back(cubeColors[i]);
} }
result.RefreshVBO();
return result; return result;
} }
void VertexDataStruct::RefreshVBO() void VertexRenderStruct::RefreshVBO()
{ {
//Check if main thread, check if data is not empty... //Check if main thread, check if data is not empty...
@ -216,9 +210,9 @@ namespace ZL {
glBindBuffer(GL_ARRAY_BUFFER, positionVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, positionVBO->getBuffer());
glBufferData(GL_ARRAY_BUFFER, PositionData.size() * 12, &PositionData[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, data.PositionData.size() * 12, &data.PositionData[0], GL_STATIC_DRAW);
if (TexCoordData.size() > 0) if (data.TexCoordData.size() > 0)
{ {
if (!texCoordVBO) if (!texCoordVBO)
{ {
@ -227,11 +221,11 @@ namespace ZL {
glBindBuffer(GL_ARRAY_BUFFER, texCoordVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, texCoordVBO->getBuffer());
glBufferData(GL_ARRAY_BUFFER, TexCoordData.size() * 8, &TexCoordData[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, data.TexCoordData.size() * 8, &data.TexCoordData[0], GL_STATIC_DRAW);
} }
if (NormalData.size() > 0) if (data.NormalData.size() > 0)
{ {
if (!normalVBO) if (!normalVBO)
{ {
@ -240,10 +234,10 @@ namespace ZL {
glBindBuffer(GL_ARRAY_BUFFER, normalVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, normalVBO->getBuffer());
glBufferData(GL_ARRAY_BUFFER, NormalData.size() * 12, &NormalData[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, data.NormalData.size() * 12, &data.NormalData[0], GL_STATIC_DRAW);
} }
if (TangentData.size() > 0) if (data.TangentData.size() > 0)
{ {
if (!tangentVBO) if (!tangentVBO)
{ {
@ -252,10 +246,10 @@ namespace ZL {
glBindBuffer(GL_ARRAY_BUFFER, tangentVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, tangentVBO->getBuffer());
glBufferData(GL_ARRAY_BUFFER, TangentData.size() * 12, &TangentData[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, data.TangentData.size() * 12, &data.TangentData[0], GL_STATIC_DRAW);
} }
if (BinormalData.size() > 0) if (data.BinormalData.size() > 0)
{ {
if (!binormalVBO) if (!binormalVBO)
{ {
@ -264,10 +258,10 @@ namespace ZL {
glBindBuffer(GL_ARRAY_BUFFER, binormalVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, binormalVBO->getBuffer());
glBufferData(GL_ARRAY_BUFFER, BinormalData.size() * 12, &BinormalData[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, data.BinormalData.size() * 12, &data.BinormalData[0], GL_STATIC_DRAW);
} }
if (ColorData.size() > 0) if (data.ColorData.size() > 0)
{ {
if (!colorVBO) if (!colorVBO)
{ {
@ -276,45 +270,40 @@ namespace ZL {
glBindBuffer(GL_ARRAY_BUFFER, colorVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, colorVBO->getBuffer());
glBufferData(GL_ARRAY_BUFFER, ColorData.size() * 12, &ColorData[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, data.ColorData.size() * 12, &data.ColorData[0], GL_STATIC_DRAW);
} }
} }
void VertexDataStruct::RotateByMatrix(Matrix3f m) void VertexRenderStruct::RotateByMatrix(Matrix3f m)
{ {
for (int i = 0; i < PositionData.size(); i++) for (int i = 0; i < data.PositionData.size(); i++)
{ {
PositionData[i] = MultVectorMatrix(PositionData[i], m); data.PositionData[i] = MultVectorMatrix(data.PositionData[i], m);
} }
for (int i = 0; i < NormalData.size(); i++) for (int i = 0; i < data.NormalData.size(); i++)
{ {
NormalData[i] = MultVectorMatrix(NormalData[i], m); data.NormalData[i] = MultVectorMatrix(data.NormalData[i], m);
} }
for (int i = 0; i < TangentData.size(); i++) for (int i = 0; i < data.TangentData.size(); i++)
{ {
TangentData[i] = MultVectorMatrix(TangentData[i], m); data.TangentData[i] = MultVectorMatrix(data.TangentData[i], m);
} }
for (int i = 0; i < BinormalData.size(); i++) for (int i = 0; i < data.BinormalData.size(); i++)
{ {
BinormalData[i] = MultVectorMatrix(BinormalData[i], m); data.BinormalData[i] = MultVectorMatrix(data.BinormalData[i], m);
} }
RefreshVBO(); RefreshVBO();
} }
void VertexDataStruct::AssignFrom(const VertexDataStruct& v) void VertexRenderStruct::AssignFrom(const VertexDataStruct& v)
{ {
PositionData = v.PositionData; data = v;
NormalData = v.NormalData;
TangentData = v.TangentData;
BinormalData = v.BinormalData;
TexCoordData = v.TexCoordData;
ColorData = v.ColorData;
RefreshVBO(); RefreshVBO();
} }
@ -600,7 +589,7 @@ namespace ZL {
glVertexAttribPointer(shader->attribList[attribName], 3, GL_FLOAT, GL_FALSE, stride, pointer); glVertexAttribPointer(shader->attribList[attribName], 3, GL_FLOAT, GL_FALSE, stride, pointer);
} }
void Renderer::DrawVertexDataStruct(const VertexDataStruct& vertexDataStruct) void Renderer::DrawVertexRenderStruct(const VertexRenderStruct& VertexRenderStruct)
{ {
static const std::string vNormal("vNormal"); static const std::string vNormal("vNormal");
static const std::string vTangent("vTangent"); static const std::string vTangent("vTangent");
@ -610,36 +599,36 @@ namespace ZL {
static const std::string vPosition("vPosition"); static const std::string vPosition("vPosition");
//Check if main thread, check if data is not empty... //Check if main thread, check if data is not empty...
if (vertexDataStruct.NormalData.size() > 0) if (VertexRenderStruct.data.NormalData.size() > 0)
{ {
glBindBuffer(GL_ARRAY_BUFFER, vertexDataStruct.normalVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.normalVBO->getBuffer());
VertexAttribPointer3fv(vNormal, 0, NULL); VertexAttribPointer3fv(vNormal, 0, NULL);
} }
if (vertexDataStruct.TangentData.size() > 0) if (VertexRenderStruct.data.TangentData.size() > 0)
{ {
glBindBuffer(GL_ARRAY_BUFFER, vertexDataStruct.tangentVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.tangentVBO->getBuffer());
VertexAttribPointer3fv(vTangent, 0, NULL); VertexAttribPointer3fv(vTangent, 0, NULL);
} }
if (vertexDataStruct.BinormalData.size() > 0) if (VertexRenderStruct.data.BinormalData.size() > 0)
{ {
glBindBuffer(GL_ARRAY_BUFFER, vertexDataStruct.binormalVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.binormalVBO->getBuffer());
VertexAttribPointer3fv(vBinormal, 0, NULL); VertexAttribPointer3fv(vBinormal, 0, NULL);
} }
if (vertexDataStruct.ColorData.size() > 0) if (VertexRenderStruct.data.ColorData.size() > 0)
{ {
glBindBuffer(GL_ARRAY_BUFFER, vertexDataStruct.colorVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.colorVBO->getBuffer());
VertexAttribPointer3fv(vColor, 0, NULL); VertexAttribPointer3fv(vColor, 0, NULL);
} }
if (vertexDataStruct.TexCoordData.size() > 0) if (VertexRenderStruct.data.TexCoordData.size() > 0)
{ {
glBindBuffer(GL_ARRAY_BUFFER, vertexDataStruct.texCoordVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.texCoordVBO->getBuffer());
VertexAttribPointer2fv(vTexCoord, 0, NULL); VertexAttribPointer2fv(vTexCoord, 0, NULL);
} }
glBindBuffer(GL_ARRAY_BUFFER, vertexDataStruct.positionVBO->getBuffer()); glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.positionVBO->getBuffer());
VertexAttribPointer3fv(vPosition, 0, NULL); VertexAttribPointer3fv(vPosition, 0, NULL);
glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(vertexDataStruct.PositionData.size())); glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(VertexRenderStruct.data.PositionData.size()));
} }

View File

@ -48,7 +48,11 @@ namespace ZL {
std::vector<Vector3f> TangentData; std::vector<Vector3f> TangentData;
std::vector<Vector3f> BinormalData; std::vector<Vector3f> BinormalData;
std::vector<Vector3f> ColorData; std::vector<Vector3f> ColorData;
};
struct VertexRenderStruct
{
VertexDataStruct data;
std::shared_ptr<VAOHolder> vao; std::shared_ptr<VAOHolder> vao;
std::shared_ptr<VBOHolder> positionVBO; std::shared_ptr<VBOHolder> positionVBO;
@ -113,7 +117,7 @@ namespace ZL {
void VertexAttribPointer3fv(const std::string& attribName, int stride, const char* pointer); void VertexAttribPointer3fv(const std::string& attribName, int stride, const char* pointer);
void DrawVertexDataStruct(const VertexDataStruct& vertexDataStruct); void DrawVertexRenderStruct(const VertexRenderStruct& VertexRenderStruct);
}; };

View File

@ -45,7 +45,7 @@ namespace ZL
glBindTexture(GL_TEXTURE_2D, GameObjects::backgroundTexturePtr->getTexID()); glBindTexture(GL_TEXTURE_2D, GameObjects::backgroundTexturePtr->getTexID());
renderer.DrawVertexDataStruct(GameObjects::backgroundMesh); renderer.DrawVertexRenderStruct(GameObjects::backgroundMesh);
renderer.PopMatrix(); renderer.PopMatrix();
} }
@ -64,7 +64,7 @@ namespace ZL
glBindTexture(GL_TEXTURE_2D, GameObjects::birdTexturePtr->getTexID()); glBindTexture(GL_TEXTURE_2D, GameObjects::birdTexturePtr->getTexID());
renderer.DrawVertexDataStruct(GameObjects::birdMesh); renderer.DrawVertexRenderStruct(GameObjects::birdMesh);
renderer.PopMatrix(); renderer.PopMatrix();
} }
@ -83,7 +83,7 @@ namespace ZL
renderer.TranslateMatrix({ (pipePair.xPos), pipePair.bottomPipeVShift, 0.f }); renderer.TranslateMatrix({ (pipePair.xPos), pipePair.bottomPipeVShift, 0.f });
renderer.DrawVertexDataStruct(GameObjects::pipeMesh); renderer.DrawVertexRenderStruct(GameObjects::pipeMesh);
//Draw top pipe: //Draw top pipe:
@ -94,7 +94,7 @@ namespace ZL
renderer.ScaleMatrix({ 1.f, -1.f, 1.f }); renderer.ScaleMatrix({ 1.f, -1.f, 1.f });
renderer.DrawVertexDataStruct(GameObjects::pipeMesh); renderer.DrawVertexRenderStruct(GameObjects::pipeMesh);
renderer.PopMatrix(); renderer.PopMatrix();
} }
@ -110,7 +110,7 @@ namespace ZL
glBindTexture(GL_TEXTURE_2D, GameObjects::gameOverTexturePtr->getTexID()); glBindTexture(GL_TEXTURE_2D, GameObjects::gameOverTexturePtr->getTexID());
renderer.DrawVertexDataStruct(GameObjects::gameOverMesh); renderer.DrawVertexRenderStruct(GameObjects::gameOverMesh);
renderer.PopMatrix(); renderer.PopMatrix();
} }
@ -158,7 +158,7 @@ namespace ZL
GameObjects::colorCubeMeshMutable.AssignFrom(GameObjects::colorCubeMesh); GameObjects::colorCubeMeshMutable.AssignFrom(GameObjects::colorCubeMesh);
GameObjects::colorCubeMeshMutable.RotateByMatrix(QuatToMatrix(QuatFromRotateAroundZ(gs.rotateTimer * M_PI / 3.0))); GameObjects::colorCubeMeshMutable.RotateByMatrix(QuatToMatrix(QuatFromRotateAroundZ(gs.rotateTimer * M_PI / 3.0)));
renderer.DrawVertexDataStruct(GameObjects::colorCubeMeshMutable); renderer.DrawVertexRenderStruct(GameObjects::colorCubeMeshMutable);
renderer.PopMatrix(); renderer.PopMatrix();
@ -242,33 +242,34 @@ namespace ZL
CheckGlError(); CheckGlError();
//Create bird mesh //Create bird mesh
GameObjects::birdMesh = CreateRect2D({ 0.f, 0.f }, { GameConsts::birdScale * BIRD_WIDTH, GameConsts::birdScale * BIRD_HEIGHT }, 0); GameObjects::birdMesh.data = CreateRect2D({ 0.f, 0.f }, { GameConsts::birdScale * BIRD_WIDTH, GameConsts::birdScale * BIRD_HEIGHT }, 0);
GameObjects::birdMesh.RefreshVBO();
float backgroundTextureScale = Env::height / static_cast<float>(BACKGROUND_HEIGHT); float backgroundTextureScale = Env::height / static_cast<float>(BACKGROUND_HEIGHT);
//Create pipe mesh //Create pipe mesh
GameObjects::pipeMesh = CreateRect2D({ PIPE_WIDTH * GameConsts::pipeScale * (-0.5f), Env::getActualClientHeight() * 0.5f + PIPE_HEIGHT * GameConsts::pipeScale * (-0.5f) }, { PIPE_WIDTH * GameConsts::pipeScale * 0.5f, PIPE_HEIGHT * GameConsts::pipeScale * 0.5f }, 0); GameObjects::pipeMesh.data = CreateRect2D({ PIPE_WIDTH * GameConsts::pipeScale * (-0.5f), Env::getActualClientHeight() * 0.5f + PIPE_HEIGHT * GameConsts::pipeScale * (-0.5f) }, { PIPE_WIDTH * GameConsts::pipeScale * 0.5f, PIPE_HEIGHT * GameConsts::pipeScale * 0.5f }, 0);
GameObjects::pipeMesh.RefreshVBO();
//Create background mesh depending on screen size //Create background mesh depending on screen size
Env::backgroundSectionWidth = BACKGROUND_WIDTH * backgroundTextureScale; Env::backgroundSectionWidth = BACKGROUND_WIDTH * backgroundTextureScale;
GameObjects::backgroundMesh = CreateRectHorizontalSections2D({ BACKGROUND_WIDTH * backgroundTextureScale * (0.5f), BACKGROUND_HEIGHT * backgroundTextureScale * (0.5f) }, { BACKGROUND_WIDTH * backgroundTextureScale * 0.5f, BACKGROUND_HEIGHT * backgroundTextureScale * 0.5f }, -0.5, 2); GameObjects::backgroundMesh.data = CreateRectHorizontalSections2D({ BACKGROUND_WIDTH * backgroundTextureScale * (0.5f), BACKGROUND_HEIGHT * backgroundTextureScale * (0.5f) }, { BACKGROUND_WIDTH * backgroundTextureScale * 0.5f, BACKGROUND_HEIGHT * backgroundTextureScale * 0.5f }, -0.5, 2);
GameObjects::backgroundMesh.RefreshVBO();
CheckGlError(); CheckGlError();
//Create Game Over UI mesh depending on screen size //Create Game Over UI mesh depending on screen size
float gameOverTextureScale = Env::height / static_cast<float>(GAMEOVER_HEIGHT); float gameOverTextureScale = Env::height / static_cast<float>(GAMEOVER_HEIGHT);
GameObjects::gameOverMesh = CreateRect2D({ GAMEOVER_WIDTH * gameOverTextureScale * 0.5f, GAMEOVER_HEIGHT * gameOverTextureScale * 0.5f }, { GAMEOVER_WIDTH * gameOverTextureScale * 0.5f, GAMEOVER_HEIGHT * gameOverTextureScale * 0.5f }, 0.1f); GameObjects::gameOverMesh.data = CreateRect2D({ GAMEOVER_WIDTH * gameOverTextureScale * 0.5f, GAMEOVER_HEIGHT * gameOverTextureScale * 0.5f }, { GAMEOVER_WIDTH * gameOverTextureScale * 0.5f, GAMEOVER_HEIGHT * gameOverTextureScale * 0.5f }, 0.1f);
GameObjects::gameOverMesh.RefreshVBO();
GameObjects::colorCubeMesh = CreateCube3D(5.0); GameObjects::colorCubeMesh = CreateCube3D(5.0);
GameObjects::colorCubeMeshMutable = CreateCube3D(5.0); GameObjects::colorCubeMeshMutable.data = CreateCube3D(5.0);
GameObjects::colorCubeMeshMutable.RefreshVBO();
//Set some game values //Set some game values
Env::birdStartPos = { Env::width * 0.2f, Env::getActualClientHeight() * 0.5f }; Env::birdStartPos = { Env::width * 0.2f, Env::getActualClientHeight() * 0.5f };