mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-06 05:38:02 +03:00
gl_rend_state massive overhaul. Created render_data_context
This commit is contained in:
+91
-81
@@ -12,6 +12,8 @@
|
||||
#include "data.hpp"
|
||||
#include "file_handler.hpp"
|
||||
#include "gl.hpp"
|
||||
#include "gl_state.hpp"
|
||||
#include "render_context.hpp"
|
||||
#include "shader_ft.hpp"
|
||||
#include "texture.hpp"
|
||||
|
||||
@@ -158,7 +160,8 @@ namespace spr {
|
||||
uint32_t AddSetModern();
|
||||
void AddSprSets(const sprite_database* spr_db);
|
||||
void Clear();
|
||||
void Draw(int32_t index, bool font, texture* overlay_tex, const mat4& vp);
|
||||
void Draw(render_data_context& rend_data_ctx,
|
||||
int32_t index, bool font, texture* overlay_tex, const mat4& vp);
|
||||
SprSet* GetSet(uint32_t index);
|
||||
bool GetSetReady(uint32_t index);
|
||||
uint32_t GetSetSpriteNum(uint32_t index);
|
||||
@@ -187,12 +190,14 @@ namespace spr {
|
||||
static void add_draw_sprite(spr::SprArgs** args_array, int32_t count, bool font,
|
||||
spr::SprArgsInner& args_inner, std::vector<sprite_draw_param>& draw_param_buffer,
|
||||
std::vector<sprite_draw_vertex>& vertex_buffer, std::vector<uint32_t>& index_buffer);
|
||||
static void draw_sprite(spr::SpriteManager* sprite_manager, render_context* rctx, const SprArgs& args,
|
||||
static void draw_sprite(render_data_context& rend_data_ctx,
|
||||
spr::SpriteManager* sprite_manager, const SprArgs& args,
|
||||
const mat4& mat, int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex);
|
||||
static void draw_sprite_begin(render_context* rctx);
|
||||
static void draw_sprite_copy_overlay_texture(render_context* rctx, const SprArgs& args, const mat4& mat,
|
||||
const vec3* vtx, int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max);
|
||||
static void draw_sprite_end();
|
||||
static void draw_sprite_begin(render_data_context& rend_data_ctx);
|
||||
static void draw_sprite_copy_overlay_texture(
|
||||
render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3* vtx,
|
||||
int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max);
|
||||
static void draw_sprite_end(render_data_context& rend_data_ctx);
|
||||
static void draw_sprite_scale(spr::SprArgs* args);
|
||||
}
|
||||
|
||||
@@ -476,8 +481,9 @@ void sprite_manager_clear() {
|
||||
sprite_manager->Clear();
|
||||
}
|
||||
|
||||
void sprite_manager_draw(int32_t index, bool font, texture* overlay_tex, const mat4& vp) {
|
||||
sprite_manager->Draw(index, font, overlay_tex, vp);
|
||||
void sprite_manager_draw(render_data_context& rend_data_ctx,
|
||||
int32_t index, bool font, texture* overlay_tex, const mat4& vp) {
|
||||
sprite_manager->Draw(rend_data_ctx, index, font, overlay_tex, vp);
|
||||
}
|
||||
|
||||
int32_t sprite_manager_get_index() {
|
||||
@@ -607,14 +613,14 @@ void sprite_manager_free() {
|
||||
namespace spr {
|
||||
SpriteManager::RenderData::RenderData() : vao() {
|
||||
glGenVertexArrays(1, &vao);
|
||||
glBindVertexArray(vao);
|
||||
gl_state.bind_vertex_array(vao);
|
||||
|
||||
vbo_vertex_count = 4096;
|
||||
|
||||
static const GLsizei buffer_size = sizeof(sprite_draw_vertex);
|
||||
|
||||
vbo.Create(buffer_size * vbo_vertex_count);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
vbo.Create(gl_state, buffer_size * vbo_vertex_count);
|
||||
gl_state.bind_array_buffer(vbo);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size,
|
||||
@@ -628,12 +634,12 @@ namespace spr {
|
||||
|
||||
ebo_index_count = 4096;
|
||||
|
||||
ebo.Create(sizeof(uint32_t) * ebo_index_count);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
||||
ebo.Create(gl_state, sizeof(uint32_t) * ebo_index_count);
|
||||
gl_state.bind_element_array_buffer(ebo);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindVertexArray(0);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
gl_state.bind_array_buffer(0);
|
||||
gl_state.bind_vertex_array(0);
|
||||
gl_state.bind_element_array_buffer(0);
|
||||
}
|
||||
|
||||
SpriteManager::RenderData::~RenderData() {
|
||||
@@ -661,10 +667,10 @@ namespace spr {
|
||||
|
||||
vbo.Destroy();
|
||||
|
||||
glBindVertexArray(vao);
|
||||
gl_state.bind_vertex_array(vao);
|
||||
|
||||
vbo.Create(buffer_size * vbo_vertex_count);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
vbo.Create(gl_state, buffer_size * vbo_vertex_count);
|
||||
gl_state.bind_array_buffer(vbo);
|
||||
|
||||
glBufferSubData(GL_ARRAY_BUFFER, 0, (GLsizeiptr)(buffer_size
|
||||
* vertex_buffer.size()), vertex_buffer.data());
|
||||
@@ -679,11 +685,11 @@ namespace spr {
|
||||
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, buffer_size,
|
||||
(void*)offsetof(sprite_draw_vertex, uv));
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindVertexArray(0);
|
||||
gl_state.bind_array_buffer(0);
|
||||
gl_state.bind_vertex_array(0);
|
||||
}
|
||||
else
|
||||
vbo.WriteMemory(0, buffer_size * vertex_buffer.size(), vertex_buffer.data());
|
||||
vbo.WriteMemory(gl_state, 0, buffer_size * vertex_buffer.size(), vertex_buffer.data());
|
||||
|
||||
if (ebo_index_count < index_buffer.size()) {
|
||||
while (ebo_index_count < index_buffer.size())
|
||||
@@ -691,19 +697,19 @@ namespace spr {
|
||||
|
||||
ebo.Destroy();
|
||||
|
||||
glBindVertexArray(vao);
|
||||
gl_state.bind_vertex_array(vao);
|
||||
|
||||
ebo.Create(sizeof(uint32_t) * ebo_index_count);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
||||
ebo.Create(gl_state, sizeof(uint32_t) * ebo_index_count);
|
||||
gl_state.bind_element_array_buffer(ebo);
|
||||
|
||||
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, (GLsizeiptr)(sizeof(uint32_t)
|
||||
* index_buffer.size()), index_buffer.data());
|
||||
|
||||
glBindVertexArray(0);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
gl_state.bind_vertex_array(0);
|
||||
gl_state.bind_element_array_buffer(0);
|
||||
}
|
||||
else
|
||||
ebo.WriteMemory(0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data());
|
||||
ebo.WriteMemory(gl_state, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data());
|
||||
}
|
||||
|
||||
SpriteManager::SpriteManager() : aspect(), index(), set_counter() {
|
||||
@@ -777,15 +783,16 @@ namespace spr {
|
||||
render_data.Clear();
|
||||
}
|
||||
|
||||
void SpriteManager::Draw(int32_t index, bool font, texture* overlay_tex, const mat4& vp) {
|
||||
void SpriteManager::Draw(render_data_context& rend_data_ctx,
|
||||
int32_t index, bool font, texture* overlay_tex, const mat4& vp) {
|
||||
render_context* rctx = rctx_ptr;
|
||||
draw_sprite_begin(rctx);
|
||||
draw_sprite_begin(rend_data_ctx);
|
||||
|
||||
::resolution_mode mode = res_window_get()->resolution_mode;
|
||||
if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX)
|
||||
res_window_get()->resolution_mode = resolution_mode;
|
||||
|
||||
gl_rend_state_rect viewport_rect = gl_rend_state.get_viewport();
|
||||
gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport();
|
||||
|
||||
for (int32_t i = 0; i < 2; i++) {
|
||||
auto reqlist = this->reqlist[index][i];
|
||||
@@ -826,7 +833,7 @@ namespace spr {
|
||||
y_min = (int32_t)min.y;
|
||||
x_max = (int32_t)(max.x - min.x);
|
||||
y_max = (int32_t)(max.y - min.y);
|
||||
gl_rend_state.set_viewport(x_min, y_min, x_max, y_max);
|
||||
rend_data_ctx.state.set_viewport(x_min, y_min, x_max, y_max);
|
||||
}
|
||||
else {
|
||||
view_projection = vp;
|
||||
@@ -858,21 +865,21 @@ namespace spr {
|
||||
1.0f / (float_t)overlay_tex->height, 0.0f, 0.0f
|
||||
};
|
||||
mat4_transpose(&view_projection, &shader_data.g_transform);
|
||||
rctx->sprite_scene_ubo.WriteMemory(shader_data);
|
||||
rctx->sprite_scene_ubo.Bind(0);
|
||||
rctx->sprite_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data);
|
||||
rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->sprite_scene_ubo);
|
||||
|
||||
gl_rend_state.bind_vertex_array(render_data.vao);
|
||||
rend_data_ctx.state.bind_vertex_array(render_data.vao);
|
||||
for (uint32_t j = SPR_PRIO_MAX; j; j--, reqlist++)
|
||||
for (SprArgs& k : *reqlist)
|
||||
if (k.sprite_draw_param_index >= 0)
|
||||
draw_sprite(this, rctx, k, mat, x_min, y_min, x_max, y_max, overlay_tex);
|
||||
gl_rend_state.bind_vertex_array(0);
|
||||
draw_sprite(rend_data_ctx, this, k, mat, x_min, y_min, x_max, y_max, overlay_tex);
|
||||
rend_data_ctx.state.bind_vertex_array(0);
|
||||
}
|
||||
|
||||
if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX)
|
||||
res_window_get()->resolution_mode = mode;
|
||||
|
||||
draw_sprite_end();
|
||||
draw_sprite_end(rend_data_ctx);
|
||||
}
|
||||
|
||||
SprSet* SpriteManager::GetSet(uint32_t index) {
|
||||
@@ -1788,7 +1795,8 @@ namespace spr {
|
||||
args_array[i]->sprite_draw_param_index = -1;
|
||||
}
|
||||
|
||||
static void draw_sprite(spr::SpriteManager* sprite_manager, render_context* rctx, const SprArgs& args,
|
||||
static void draw_sprite(render_data_context& rend_data_ctx,
|
||||
spr::SpriteManager* sprite_manager, const SprArgs& args,
|
||||
const mat4& mat, int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex) {
|
||||
sprite_draw_param& draw_param
|
||||
= sprite_manager->render_data.draw_param_buffer.data()[args.sprite_draw_param_index];
|
||||
@@ -1796,8 +1804,9 @@ namespace spr {
|
||||
int32_t combiner = 0;
|
||||
if (draw_param.attrib.m.enable_blend) {
|
||||
if (draw_param.attrib.m.blend == 5) {
|
||||
gl_rend_state.active_bind_texture_2d(7, overlay_tex->glid);
|
||||
draw_sprite_copy_overlay_texture(rctx, args, mat, draw_param.vtx, x_min, y_min, x_max, y_max);
|
||||
rend_data_ctx.state.active_bind_texture_2d(7, overlay_tex->glid);
|
||||
draw_sprite_copy_overlay_texture(rend_data_ctx,
|
||||
args, mat, draw_param.vtx, x_min, y_min, x_max, y_max);
|
||||
combiner = 2;
|
||||
}
|
||||
else
|
||||
@@ -1805,11 +1814,11 @@ namespace spr {
|
||||
|
||||
const GLenum* blend = spr_blend_param[draw_param.attrib.m.blend];
|
||||
|
||||
gl_rend_state.enable_blend();
|
||||
gl_rend_state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]);
|
||||
rend_data_ctx.state.enable_blend();
|
||||
rend_data_ctx.state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]);
|
||||
}
|
||||
else
|
||||
gl_rend_state.disable_blend();
|
||||
rend_data_ctx.state.disable_blend();
|
||||
|
||||
if (draw_param.shader == SHADER_FT_SPRITE) {
|
||||
int32_t tex_0_type = 0;
|
||||
@@ -1832,49 +1841,50 @@ namespace spr {
|
||||
}
|
||||
}
|
||||
|
||||
uniform_value[U_TEX_0_TYPE] = tex_0_type;
|
||||
uniform_value[U_TEX_1_TYPE] = tex_1_type;
|
||||
uniform_value[U_COMBINER] = combiner;
|
||||
rend_data_ctx.shader_flags.arr[U_TEX_0_TYPE] = tex_0_type;
|
||||
rend_data_ctx.shader_flags.arr[U_TEX_1_TYPE] = tex_1_type;
|
||||
rend_data_ctx.shader_flags.arr[U_COMBINER] = combiner;
|
||||
}
|
||||
|
||||
if (draw_param.textures[0]) {
|
||||
gl_rend_state.active_bind_texture_2d(0, draw_param.textures[0]->glid);
|
||||
gl_rend_state.bind_sampler(0, rctx->sprite_samplers[draw_param.attrib.m.sampler]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, draw_param.textures[0]->glid);
|
||||
rend_data_ctx.state.bind_sampler(0, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]);
|
||||
|
||||
if (draw_param.textures[1]) {
|
||||
gl_rend_state.active_bind_texture_2d(1, draw_param.textures[1]->glid);
|
||||
gl_rend_state.bind_sampler(1, rctx->sprite_samplers[draw_param.attrib.m.sampler]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, draw_param.textures[1]->glid);
|
||||
rend_data_ctx.state.bind_sampler(1, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]);
|
||||
}
|
||||
else if (!gl_rend_state.texture_binding_2d[1])
|
||||
gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
|
||||
else
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid);
|
||||
}
|
||||
else {
|
||||
if (!gl_rend_state.texture_binding_2d[0])
|
||||
gl_rend_state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid);
|
||||
if (!gl_rend_state.texture_binding_2d[1])
|
||||
gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid);
|
||||
}
|
||||
|
||||
shaders_ft.set(draw_param.shader);
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, draw_param.shader);
|
||||
if (draw_param.attrib.m.primitive != GL_TRIANGLES)
|
||||
shaders_ft.draw_arrays(draw_param.attrib.m.primitive, draw_param.first, draw_param.count);
|
||||
rend_data_ctx.state.draw_arrays(
|
||||
draw_param.attrib.m.primitive, draw_param.first, draw_param.count);
|
||||
else
|
||||
shaders_ft.draw_range_elements(draw_param.attrib.m.primitive, draw_param.start, draw_param.end,
|
||||
rend_data_ctx.state.draw_range_elements(
|
||||
draw_param.attrib.m.primitive, draw_param.start, draw_param.end,
|
||||
draw_param.count, GL_UNSIGNED_INT, (void*)draw_param.offset);
|
||||
}
|
||||
|
||||
static void draw_sprite_begin(render_context* rctx) {
|
||||
gl_rend_state.disable_blend();
|
||||
gl_rend_state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid);
|
||||
gl_rend_state.bind_sampler(0, 0);
|
||||
gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
|
||||
gl_rend_state.bind_sampler(1, 0);
|
||||
gl_rend_state.bind_sampler(7, 0);
|
||||
gl_rend_state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
static void draw_sprite_begin(render_data_context& rend_data_ctx) {
|
||||
rend_data_ctx.state.disable_blend();
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid);
|
||||
rend_data_ctx.state.bind_sampler(0, 0);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid);
|
||||
rend_data_ctx.state.bind_sampler(1, 0);
|
||||
rend_data_ctx.state.bind_sampler(7, 0);
|
||||
rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
}
|
||||
|
||||
static void draw_sprite_copy_overlay_texture(render_context* rctx, const SprArgs& args, const mat4& mat,
|
||||
const vec3* vtx, int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max) {
|
||||
static void draw_sprite_copy_overlay_texture(
|
||||
render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3* vtx,
|
||||
int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max) {
|
||||
if (args.num_vertex || args.kind != SPR_KIND_NORMAL)
|
||||
return;
|
||||
|
||||
@@ -1929,21 +1939,21 @@ namespace spr {
|
||||
const int32_t width = x_max - x_min + 1;
|
||||
const int32_t height = y_max - y_min + 1;
|
||||
if (width * height > 0) {
|
||||
gl_rend_state.active_texture(7);
|
||||
rend_data_ctx.state.active_texture(7);
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, x_min, y_min, x_min, y_min, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_sprite_end() {
|
||||
gl_rend_state.disable_blend();
|
||||
gl_rend_state.active_bind_texture_2d(0, 0);
|
||||
gl_rend_state.bind_sampler(0, 0);
|
||||
gl_rend_state.active_bind_texture_2d(1, 0);
|
||||
gl_rend_state.bind_sampler(1, 0);
|
||||
gl_rend_state.active_bind_texture_2d(7, 0);
|
||||
gl_rend_state.bind_sampler(7, 0);
|
||||
gl_rend_state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
shader::unbind();
|
||||
static void draw_sprite_end(render_data_context& rend_data_ctx) {
|
||||
rend_data_ctx.state.disable_blend();
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, 0);
|
||||
rend_data_ctx.state.bind_sampler(0, 0);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, 0);
|
||||
rend_data_ctx.state.bind_sampler(1, 0);
|
||||
rend_data_ctx.state.active_bind_texture_2d(7, 0);
|
||||
rend_data_ctx.state.bind_sampler(7, 0);
|
||||
rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
}
|
||||
|
||||
static void draw_sprite_scale(spr::SprArgs* args) {
|
||||
|
||||
Reference in New Issue
Block a user