diff --git a/src/renderer/renderer2D.cpp b/src/renderer/renderer2D.cpp index a645e10..a16cf26 100644 --- a/src/renderer/renderer2D.cpp +++ b/src/renderer/renderer2D.cpp @@ -39,12 +39,29 @@ namespace lunarium { mpCamera = nullptr; + u32* indices = new u32[mQuadData.MaxIndices]; + // Need to adjust the set of indices because they reference verts deeper into the buffer + // See Hazel for example of this + int offset = 0; + for (int i = 0; i < mQuadData.MaxIndices; i+=6) + { + for ( int j = 0; j < 6; j++) + { + indices[i + j] = mQuadData.indices[(i + j) % 6] + offset; + } + offset += 4; + } + // INIT QUAD DATA mQuadData.mBufferLayout.PushVertexAttribute(VertexAttribute { VertexAttributeType::FLOAT32, 3 }); // Position mQuadData.mBufferLayout.PushVertexAttribute(VertexAttribute { VertexAttributeType::FLOAT32, 2 }); // Tex_coords mQuadData.mBufferLayout.PushVertexAttribute(VertexAttribute { VertexAttributeType::FLOAT32, 4 }); // Color mQuadData.mBufferLayout.PushVertexAttribute(VertexAttribute { VertexAttributeType::INT32, 1 }); // Texture Sampler Index - mQuadData.mVertexBuffer = VertexBuffer::Create(mQuadData.mBufferLayout, mQuadData.MaxVertices, nullptr, mQuadData.MaxIndices, nullptr); + mQuadData.mVertexBuffer = VertexBuffer::Create(mQuadData.mBufferLayout, mQuadData.MaxVertices, nullptr, mQuadData.MaxIndices, indices); + + // RAW VERTEX BUFFER + mQuadData.mRawVertexBuffer = new QuadData::Vertex[mQuadData.MaxVertices]; + mQuadData.mRawBufferIndex = 0; //mQuadData.mIndexBuffer = new IndexBuffer(mQuadData.MaxIndices * sizeof(u32)); @@ -246,25 +263,108 @@ namespace lunarium v4.tex_slot = texture_slot; memcpy(vertices_wl, &v4, vert_size); - if (!mQuadData.mVertexBuffer->PushVertices(vertices, 4)) + if (mQuadData.mRawBufferIndex + 4 > mQuadData.MaxVertices) { - Logger::Info(LogCategory::GRAPHICS, "Quad VertexBuffer is full, flushing and retrying"); Flush(); - DrawQuad(quad, color, texture); } + memcpy(mQuadData.mRawVertexBuffer + mQuadData.mRawBufferIndex, vertices, sizeof(QuadData::Vertex) * 4); + mQuadData.mRawBufferIndex += 4; + + // if (!mQuadData.mVertexBuffer->PushVertices(vertices, 4)) + // { + // //Logger::Info(LogCategory::GRAPHICS, "Quad VertexBuffer is full, flushing and retrying"); + // Flush(); + // DrawQuad(quad, color, texture); + // } + // INDICES - if (!mQuadData.mVertexBuffer->PushIndices(mQuadData.indices, 6)) - { - Logger::Error(LogCategory::GRAPHICS, "Quad IndexBuffer is full - This shouldn't happen because the VertexBuffer should fill up first!"); - return; - } + // if (!mQuadData.mVertexBuffer->PushIndices(mQuadData.indices, 6)) + // { + // Logger::Error(LogCategory::GRAPHICS, "Quad IndexBuffer is full - This shouldn't happen because the VertexBuffer should fill up first!"); + // return; + // } mQuadData.mNumQuads++; mFrameStats.NumTris += 2; } + + void Renderer2D::DrawQuads(Rectangle* quads, u32 num_quads, Color* pColors) + { + for (int i = 0; i < num_quads; i++) + { + float vertices[40]; + unsigned char* vertices_wl = (unsigned char*)vertices; // vertices write location pointer + + // glm::mat4 model(1.0f); + // model = glm::translate(model, glm::vec3(quad.CenterPoint().x, quad.CenterPoint().y, 0.0f)); + // model = glm::rotate(model, angle, glm::vec3(0.0f, 0.0f, 1.0f)); + + glm::mat4 model = glm::mat4(1.0f); + model = glm::translate(model, glm::vec3(quads[i].X, quads[i].Y, 0.0f)); + model = glm::rotate(model, 1.0f, glm::vec3(0.0f, 0.0f, 1.0f)); + model = glm::scale(model, glm::vec3(quads[i].HalfWidth * 2, quads[i].HalfHeight * 2, 1.0f)); + + // FIRST + QuadData::Vertex v1; + int vert_size = sizeof(QuadData::Vertex); + v1.pos = model * mQuadData.vert_pos[0]; + v1.tex_coord = mQuadData.vert_tex[0]; + v1.color = pColors[i]; + v1.tex_slot = 0; + memcpy(vertices_wl, &v1, vert_size); + vertices_wl += vert_size; + + // SECOND + QuadData::Vertex v2; + v2.pos = model * mQuadData.vert_pos[1]; + v2.tex_coord = mQuadData.vert_tex[1]; + v2.color = pColors[i]; + v2.tex_slot = 0; + memcpy(vertices_wl, &v2, vert_size); + vertices_wl += vert_size; + + // THIRD + QuadData::Vertex v3; + v3.pos =model * mQuadData.vert_pos[2]; + v3.tex_coord = mQuadData.vert_tex[2]; + v3.color = pColors[i]; + v3.tex_slot = 0; + memcpy(vertices_wl, &v3, vert_size); + vertices_wl += vert_size; + + // FOURTH + QuadData::Vertex v4; + v4.pos = model * mQuadData.vert_pos[3]; + v4.tex_coord = mQuadData.vert_tex[3]; + v4.color = pColors[i]; + v4.tex_slot = 0; + memcpy(vertices_wl, &v4, vert_size); + + if (!mQuadData.mVertexBuffer->PushVertices(vertices, 4)) + { + //Logger::Info(LogCategory::GRAPHICS, "Quad VertexBuffer is full, flushing and retrying"); + Flush(); + i--; + continue; + } + + // INDICES + // if (!mQuadData.mVertexBuffer->PushIndices(mQuadData.indices, 6)) + // { + // Logger::Error(LogCategory::GRAPHICS, "Quad IndexBuffer is full - This shouldn't happen because the VertexBuffer should fill up first!"); + // return; + // } + + mQuadData.mNumQuads++; + mFrameStats.NumTris += 2; + } + + } + + void Renderer2D::DrawSprite(Texture& image, glm::vec2 position, Color color, float angle) { @@ -323,6 +423,12 @@ namespace lunarium { if (mQuadData.mNumQuads > 0) { + if (!mQuadData.mVertexBuffer->PushVertices(mQuadData.mRawVertexBuffer, mQuadData.mNumQuads * 4)) + { + Logger::Error(LogCategory::GRAPHICS, "Could not push verts into the quad buffer!"); + return; + } + //mQuadData.mIndexBuffer->Bind(); mQuadData.mQuadShader->Use(); for (int i = 0; i < mLoadedTextures.size(); i++) @@ -357,6 +463,7 @@ namespace lunarium mQuadData.mVertexBuffer->Clear(); //mQuadData.mIndexBuffer->Clear(); mQuadData.mNumQuads = 0; + mQuadData.mRawBufferIndex = 0; // TODO: Add the debug texture back to the map mLoadedTextures.push_back(mpDebugTexture); diff --git a/src/renderer/renderer2D.h b/src/renderer/renderer2D.h index 4bdc7b0..fc989c7 100644 --- a/src/renderer/renderer2D.h +++ b/src/renderer/renderer2D.h @@ -41,6 +41,7 @@ namespace lunarium // Draw methods void DrawQuad(Rectangle quad, Color color, Texture* texture = nullptr, float angle = 0.0f); + void DrawQuads(Rectangle* quads, u32 num_quads, Color* pColors); void DrawSprite(Texture& image, glm::vec2 position, Color color = {1.0f, 1.0f, 1.0f, 1.0f}, float angle = 0); void DrawSprite(Texture& image, Rectangle source, Rectangle destination, Color color = {1.0f, 1.0f, 1.0f, 1.0f}, float angle = 0); void DrawString(const char* string, Rectangle boundingArea, Color color = {1.0f, 1.0f, 1.0f, 1.0f}, float scale = 1.0f, int font = 0); @@ -99,6 +100,9 @@ namespace lunarium //const u32 indices[6] = { 0, 1, 2, 0, 2, 3 }; const u32 indices[6] = { 0, 1, 2, 2, 3, 0 }; + Vertex* mRawVertexBuffer; + int mRawBufferIndex; + BufferLayout mBufferLayout; VertexBuffer* mVertexBuffer; //IndexBuffer* mIndexBuffer; diff --git a/src/renderer/vertex_buffer.cpp b/src/renderer/vertex_buffer.cpp index e33e377..390615b 100644 --- a/src/renderer/vertex_buffer.cpp +++ b/src/renderer/vertex_buffer.cpp @@ -182,7 +182,7 @@ namespace lunarium if (mIndex + data_size > mSize) { // Vertices do not fit into the buffer - Logger::Warn(LogCategory::GRAPHICS, "Cannot push vertices into buffer - not enough space left! Space left: %d, data size: %d", mSize - mIndex, data_size); + // Logger::Warn(LogCategory::GRAPHICS, "Cannot push vertices into buffer - not enough space left! Space left: %d, data size: %d", mSize - mIndex, data_size); return false; } @@ -208,7 +208,7 @@ namespace lunarium if (mEBOIndex + data_size > mEBOSize) { // Indices do not fit into the buffer - Logger::Warn(LogCategory::GRAPHICS, "Cannot push indices into buffer - not enough space left! Space left: %d, data size: %d", mEBOSize - mEBOIndex, data_size); + //Logger::Warn(LogCategory::GRAPHICS, "Cannot push indices into buffer - not enough space left! Space left: %d, data size: %d", mEBOSize - mEBOIndex, data_size); return false; } diff --git a/src/run_modes/testbed/scenes/simple_render_scene.cpp b/src/run_modes/testbed/scenes/simple_render_scene.cpp index 16e38ef..b5fd776 100644 --- a/src/run_modes/testbed/scenes/simple_render_scene.cpp +++ b/src/run_modes/testbed/scenes/simple_render_scene.cpp @@ -18,12 +18,15 @@ #include #include +#include +#include + namespace lunarium { SimpleRenderScene::SimpleRenderScene(uint32_t logCat) : BaseScene(logCat) { - + srand((u32)time(0)); } SimpleRenderScene::~SimpleRenderScene() @@ -59,6 +62,27 @@ namespace lunarium // mSrcWidth = w; // mSrcHeight = h; + mQuads = new Rectangle[NUM_QUADS]; + for (int i = 0; i < NUM_QUADS; i++) + { + float x = (rand() % 1000); + float y = (rand() % 600); + float w = (rand() % 200) + 10; + float h = (rand() % 200) + 10; + + mQuads[i] = Rectangle(x, y, w, h); + } + + mQuadColors = new Color[NUM_QUADS]; + + for (int i = 0; i < NUM_QUADS; i++) + { + mQuadColors[i].R = ((float)(rand() % 10000)) / 10000.0f; + mQuadColors[i].G = ((float)(rand() % 10000)) / 10000.0f; + mQuadColors[i].B = ((float)(rand() % 10000)) / 10000.0f; + mQuadColors[i].A = 1.0f; + } + angle = 0.0f; box_angle = 0.0f; } @@ -199,14 +223,25 @@ namespace lunarium //g.DrawQuad(Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mImageSize.Width, (float)mImageSize.Height), Color(1.0f, 1.0f, 0.0f, 1.0f), nullptr, angle); - g.DrawQuad(Rectangle(200, 200, 128.0f, 128.0f), Color(0.0f, 1.0f, 0.0f, 1.0f));//, nullptr, box_angle); - g.DrawQuad(Rectangle(400, 300, 64.0f, 64.0f), Color(0.0f, 1.0f, 1.0f, 1.0f), nullptr, box_angle); + // g.DrawQuad(Rectangle(200, 200, 128.0f, 128.0f), Color(0.0f, 1.0f, 0.0f, 1.0f));//, nullptr, box_angle); + // g.DrawQuad(Rectangle(400, 300, 64.0f, 64.0f), Color(0.0f, 1.0f, 1.0f, 1.0f), nullptr, box_angle); + // g.DrawQuad(Rectangle(600, 300, 100.0f, 100.0f), Color::Blue(), nullptr, 45.0f); + // g.DrawQuad(Rectangle(500, 600, 100.0f, 100.0f), Color(0.25f, 0.75f, 0.8f), nullptr, 65.0f); + // g.DrawQuad(Rectangle(800, 500, 100.0f, 100.0f), Color(0.75f, 0.5f, 0.425f), nullptr, 90.0f); + // g.DrawQuad(Rectangle(300, 400, 64.0f, 64.0f), Color(0.25f, 0.5f, 1.0f, 1.0f), nullptr, box_angle * -1); + + for (int i = 0; i < NUM_QUADS; i++) + { + g.DrawQuad(mQuads[i], mQuadColors[i], nullptr, box_angle + (i % 360)); + } + + //g.DrawQuads(mQuads, NUM_QUADS, mQuadColors); //g->DrawImage(*mpTestImageLoad, glm::vec2(0.0f, 0.0f), Color::White()); //Rectangle src = Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mpTestImageLoad->GetWidth(), (float)mpTestImageLoad->GetHeight()); //Rectangle src = Rectangle::MakeFromTopLeft(0.0f, 0.0f, mSrcWidth, mSrcHeight); - Rectangle src = Rectangle::MakeFromTopLeft(0.0f, 0.0f, 16, 16); - Rectangle dest = Rectangle::MakeFromTopLeft(100.0f, 100.0f, 512.0f, 512.0f); + // Rectangle src = Rectangle::MakeFromTopLeft(0.0f, 0.0f, 16, 16); + // Rectangle dest = Rectangle::MakeFromTopLeft(100.0f, 100.0f, 512.0f, 512.0f); //g.DrawImage(*mpTestImageLoad, src, dest, Color(1.0f, 1.0f, 1.0f, 0.9f)); // g->DrawImage(*mpTestImageLoad, src, diff --git a/src/run_modes/testbed/scenes/simple_render_scene.h b/src/run_modes/testbed/scenes/simple_render_scene.h index 12da618..c83cb59 100644 --- a/src/run_modes/testbed/scenes/simple_render_scene.h +++ b/src/run_modes/testbed/scenes/simple_render_scene.h @@ -43,6 +43,10 @@ namespace lunarium Renderer2D::FrameStats mRenderStats; + const int NUM_QUADS = 5000; + Color* mQuadColors; + Rectangle* mQuads; + struct GridTestObj { int X;