Batch render testing working

Still need to implement textures
master
Joey Pollack 3 years ago
parent 12168850d5
commit 223c7a9468

@ -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,26 +263,109 @@ 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))
// 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)
{
Logger::Error(LogCategory::GRAPHICS, "Quad IndexBuffer is full - This shouldn't happen because the VertexBuffer should fill up first!");
return;
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)
{
Logger::Warn(LogCategory::GRAPHICS, "Renderer2D::DrawSprite is not yet implemented");
@ -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);

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

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

@ -18,12 +18,15 @@
#include <utils/stb/std_image_write.h>
#include <utils/stb/stb_image.h>
#include <cstdlib>
#include <ctime>
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,

@ -43,6 +43,10 @@ namespace lunarium
Renderer2D::FrameStats mRenderStats;
const int NUM_QUADS = 5000;
Color* mQuadColors;
Rectangle* mQuads;
struct GridTestObj
{
int X;

Loading…
Cancel
Save