Removed command recorder
This commit is contained in:
parent
ee8da4db09
commit
2a0d014356
@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
Created on 19.06.18.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <freetype-gl.h>
|
|
||||||
#include <glez/font.hpp>
|
|
||||||
#include <glez/glez.hpp>
|
|
||||||
#include <glez/texture.hpp>
|
|
||||||
#include <vector>
|
|
||||||
#include <vertex-buffer.h>
|
|
||||||
|
|
||||||
namespace glez::detail::record {
|
|
||||||
|
|
||||||
class RecordedCommands {
|
|
||||||
public:
|
|
||||||
struct segment {
|
|
||||||
std::size_t start { 0 };
|
|
||||||
std::size_t size { 0 };
|
|
||||||
glez::texture* texture { nullptr };
|
|
||||||
glez::font* font { nullptr };
|
|
||||||
};
|
|
||||||
|
|
||||||
RecordedCommands();
|
|
||||||
~RecordedCommands();
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
void store(glez::vertex* vertices, size_t vcount,
|
|
||||||
uint32_t* indices, size_t icount);
|
|
||||||
void bindTexture(glez::texture* tx);
|
|
||||||
void bindFont(glez::font* font);
|
|
||||||
void render();
|
|
||||||
void end();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void cutSegment();
|
|
||||||
|
|
||||||
ftgl::vertex_buffer_t* vertex_buffer {};
|
|
||||||
std::vector<segment> segments {};
|
|
||||||
segment current {};
|
|
||||||
};
|
|
||||||
|
|
||||||
extern RecordedCommands* currentRecord;
|
|
||||||
extern bool isReplaying;
|
|
||||||
|
|
||||||
} // namespace glez::detail::record
|
|
@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
Created on 19.06.18.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace glez::detail::record {
|
|
||||||
class RecordedCommands;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace glez::record {
|
|
||||||
|
|
||||||
class Record {
|
|
||||||
public:
|
|
||||||
Record();
|
|
||||||
~Record();
|
|
||||||
|
|
||||||
void begin();
|
|
||||||
void end();
|
|
||||||
void replay();
|
|
||||||
|
|
||||||
detail::record::RecordedCommands* commands { nullptr };
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace glez::record
|
|
@ -4,5 +4,4 @@ target_sources(glez PRIVATE
|
|||||||
"${CMAKE_CURRENT_LIST_DIR}/font.cpp"
|
"${CMAKE_CURRENT_LIST_DIR}/font.cpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/texture.cpp")
|
"${CMAKE_CURRENT_LIST_DIR}/texture.cpp")
|
||||||
|
|
||||||
add_subdirectory(detail)
|
|
||||||
add_subdirectory(picopng)
|
add_subdirectory(picopng)
|
@ -1,2 +0,0 @@
|
|||||||
target_sources(glez PRIVATE
|
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/record.cpp")
|
|
@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
Created on 19.06.18.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
#include <cstring>
|
|
||||||
#include <glez/detail/record.hpp>
|
|
||||||
#include <glez/glez.hpp>
|
|
||||||
#include <glez/record.hpp>
|
|
||||||
|
|
||||||
namespace glez::detail::record {
|
|
||||||
|
|
||||||
void RecordedCommands::render() {
|
|
||||||
isReplaying = true;
|
|
||||||
vertex_buffer_render_setup(vertex_buffer, GL_TRIANGLES);
|
|
||||||
for (const auto& i : segments) {
|
|
||||||
if (i.texture) {
|
|
||||||
i.texture->bind();
|
|
||||||
} else if (i.font) {
|
|
||||||
if (i.font->atlas->id == 0) {
|
|
||||||
glGenTextures(1, &i.font->atlas->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
glez::bind(i.font->atlas->id);
|
|
||||||
|
|
||||||
if (i.font->atlas->dirty) {
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, i.font->atlas->width,
|
|
||||||
i.font->atlas->height, 0, GL_RED, GL_UNSIGNED_BYTE,
|
|
||||||
i.font->atlas->data);
|
|
||||||
i.font->atlas->dirty = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
glDrawElements(GL_TRIANGLES, i.size, GL_UNSIGNED_INT, (void*)(i.start * 4));
|
|
||||||
}
|
|
||||||
vertex_buffer_render_finish(vertex_buffer);
|
|
||||||
isReplaying = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RecordedCommands::store(glez::vertex* vertices, size_t vcount, uint32_t* indices, size_t icount) {
|
|
||||||
vertex_buffer_push_back(vertex_buffer, vertices, vcount, indices, icount);
|
|
||||||
}
|
|
||||||
|
|
||||||
RecordedCommands::RecordedCommands() {
|
|
||||||
vertex_buffer = vertex_buffer_new("vertex:2f,tex_coord:2f,color:4f,drawmode:1i");
|
|
||||||
}
|
|
||||||
|
|
||||||
RecordedCommands::~RecordedCommands() {
|
|
||||||
vertex_buffer_delete(vertex_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RecordedCommands::reset() {
|
|
||||||
vertex_buffer_clear(vertex_buffer);
|
|
||||||
segments.clear();
|
|
||||||
memset(¤t, 0, sizeof(current));
|
|
||||||
}
|
|
||||||
|
|
||||||
void RecordedCommands::bindTexture(glez::texture* tx) {
|
|
||||||
if (current.texture != tx) {
|
|
||||||
cutSegment();
|
|
||||||
current.texture = tx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RecordedCommands::bindFont(glez::font* font) {
|
|
||||||
if (current.font != font) {
|
|
||||||
cutSegment();
|
|
||||||
current.font = font;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RecordedCommands::cutSegment() {
|
|
||||||
current.size = vertex_buffer->indices->size - current.start;
|
|
||||||
if (current.size)
|
|
||||||
segments.push_back(current);
|
|
||||||
memset(¤t, 0, sizeof(segment));
|
|
||||||
current.start = vertex_buffer->indices->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RecordedCommands::end() {
|
|
||||||
cutSegment();
|
|
||||||
}
|
|
||||||
|
|
||||||
RecordedCommands* currentRecord { nullptr };
|
|
||||||
bool isReplaying { false };
|
|
||||||
|
|
||||||
} // namespace glez::detail::record
|
|
||||||
|
|
||||||
glez::record::Record::Record() {
|
|
||||||
commands = new glez::detail::record::RecordedCommands {};
|
|
||||||
}
|
|
||||||
|
|
||||||
glez::record::Record::~Record() {
|
|
||||||
delete commands;
|
|
||||||
}
|
|
||||||
|
|
||||||
void glez::record::Record::begin() {
|
|
||||||
detail::record::currentRecord = commands;
|
|
||||||
commands->reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void glez::record::Record::end() {
|
|
||||||
commands->end();
|
|
||||||
detail::record::currentRecord = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void glez::record::Record::replay() {
|
|
||||||
commands->render();
|
|
||||||
}
|
|
24
src/draw.cpp
24
src/draw.cpp
@ -6,7 +6,6 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <glez/detail/record.hpp>
|
|
||||||
#include <glez/draw.hpp>
|
#include <glez/draw.hpp>
|
||||||
#include <glez/font.hpp>
|
#include <glez/font.hpp>
|
||||||
#include <glez/glez.hpp>
|
#include <glez/glez.hpp>
|
||||||
@ -27,9 +26,6 @@ void internal_draw_string(float x, float y, const std::string& string,
|
|||||||
float pen_y = y + fnt->height / 1.5f;
|
float pen_y = y + fnt->height / 1.5f;
|
||||||
float size_y = 0;
|
float size_y = 0;
|
||||||
|
|
||||||
if (glez::detail::record::currentRecord) {
|
|
||||||
glez::detail::record::currentRecord->bindFont(&font);
|
|
||||||
} else {
|
|
||||||
if (fnt->atlas->id == 0)
|
if (fnt->atlas->id == 0)
|
||||||
glGenTextures(1, &fnt->atlas->id);
|
glGenTextures(1, &fnt->atlas->id);
|
||||||
|
|
||||||
@ -45,7 +41,6 @@ void internal_draw_string(float x, float y, const std::string& string,
|
|||||||
fnt->atlas->data);
|
fnt->atlas->data);
|
||||||
fnt->atlas->dirty = 0;
|
fnt->atlas->dirty = 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const char* sstring = string.c_str();
|
const char* sstring = string.c_str();
|
||||||
|
|
||||||
@ -96,9 +91,6 @@ void internal_draw_string(float x, float y, const std::string& string,
|
|||||||
if (glyph->height > size_y)
|
if (glyph->height > size_y)
|
||||||
size_y = glyph->height;
|
size_y = glyph->height;
|
||||||
|
|
||||||
if (glez::detail::record::currentRecord)
|
|
||||||
glez::detail::record::currentRecord->store(vertices, 4, indices::rectangle, 6);
|
|
||||||
else
|
|
||||||
vertex_buffer_push_back(glez::buffer, vertices, 4, indices::rectangle, 6);
|
vertex_buffer_push_back(glez::buffer, vertices, 4, indices::rectangle, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,10 +143,6 @@ void line(float x, float y, float dx, float dy, rgba color, float thickness) {
|
|||||||
vertices[3].position = { ex + nx + px, ey + ny + py };
|
vertices[3].position = { ex + nx + px, ey + ny + py };
|
||||||
vertices[0].position = { ex + nx - px, ey + ny - py };
|
vertices[0].position = { ex + nx - px, ey + ny - py };
|
||||||
|
|
||||||
if (detail::record::currentRecord)
|
|
||||||
detail::record::currentRecord->store(vertices, 4, indices::rectangle,
|
|
||||||
6);
|
|
||||||
else
|
|
||||||
ftgl::vertex_buffer_push_back(buffer, vertices, 4,
|
ftgl::vertex_buffer_push_back(buffer, vertices, 4,
|
||||||
indices::rectangle, 6);
|
indices::rectangle, 6);
|
||||||
}
|
}
|
||||||
@ -172,9 +160,6 @@ void rect(float x, float y, float w, float h, rgba color) {
|
|||||||
vertices[2].position = { x + w, y + h };
|
vertices[2].position = { x + w, y + h };
|
||||||
vertices[3].position = { x + w, y };
|
vertices[3].position = { x + w, y };
|
||||||
|
|
||||||
if (detail::record::currentRecord)
|
|
||||||
detail::record::currentRecord->store(vertices, 4, indices::rectangle, 6);
|
|
||||||
else
|
|
||||||
ftgl::vertex_buffer_push_back(buffer, vertices, 4, indices::rectangle, 6);
|
ftgl::vertex_buffer_push_back(buffer, vertices, 4, indices::rectangle, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,9 +175,6 @@ void triangle(float x, float y, float x2, float y2, float x3, float y3, rgba col
|
|||||||
vertices[1].position = { x2, y2 };
|
vertices[1].position = { x2, y2 };
|
||||||
vertices[2].position = { x3, y3 };
|
vertices[2].position = { x3, y3 };
|
||||||
|
|
||||||
if (detail::record::currentRecord)
|
|
||||||
detail::record::currentRecord->store(vertices, 3, indices::rectangle, 3);
|
|
||||||
else
|
|
||||||
ftgl::vertex_buffer_push_back(buffer, vertices, 3, indices::rectangle, 3);
|
ftgl::vertex_buffer_push_back(buffer, vertices, 3, indices::rectangle, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,9 +225,6 @@ void rect_textured(float x, float y, float w, float h, rgba color, texture& text
|
|||||||
// if (!texture.canLoad())
|
// if (!texture.canLoad())
|
||||||
// return;
|
// return;
|
||||||
|
|
||||||
if (glez::detail::record::currentRecord)
|
|
||||||
glez::detail::record::currentRecord->bindTexture(&texture);
|
|
||||||
else
|
|
||||||
texture.bind();
|
texture.bind();
|
||||||
|
|
||||||
vertex vertices[4];
|
vertex vertices[4];
|
||||||
@ -283,9 +262,6 @@ void rect_textured(float x, float y, float w, float h, rgba color, texture& text
|
|||||||
vertices[2].uv = { s1, t1 };
|
vertices[2].uv = { s1, t1 };
|
||||||
vertices[3].uv = { s1, t0 };
|
vertices[3].uv = { s1, t0 };
|
||||||
|
|
||||||
if (detail::record::currentRecord)
|
|
||||||
detail::record::currentRecord->store(vertices, 4, indices::rectangle, 6);
|
|
||||||
else
|
|
||||||
ftgl::vertex_buffer_push_back(buffer, vertices, 4, indices::rectangle, 6);
|
ftgl::vertex_buffer_push_back(buffer, vertices, 4, indices::rectangle, 6);
|
||||||
}
|
}
|
||||||
} // namespace glez::draw
|
} // namespace glez::draw
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <freetype-gl.h>
|
#include <freetype-gl.h>
|
||||||
#include <glez/detail/record.hpp>
|
|
||||||
#include <glez/font.hpp>
|
#include <glez/font.hpp>
|
||||||
#include <glez/glez.hpp>
|
#include <glez/glez.hpp>
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
@ -169,10 +168,8 @@ void end() {
|
|||||||
|
|
||||||
void bind(GLuint texture) {
|
void bind(GLuint texture) {
|
||||||
if (current_texture != texture) {
|
if (current_texture != texture) {
|
||||||
if (!detail::record::isReplaying) {
|
|
||||||
vertex_buffer_render(buffer, GL_TRIANGLES);
|
vertex_buffer_render(buffer, GL_TRIANGLES);
|
||||||
ftgl::vertex_buffer_clear(buffer);
|
ftgl::vertex_buffer_clear(buffer);
|
||||||
}
|
|
||||||
current_texture = texture;
|
current_texture = texture;
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user