Added other EtcObj types

This commit is contained in:
korenkonder
2023-12-28 02:32:17 +03:00
parent ef1c83da89
commit 20b87a510c
9 changed files with 265 additions and 96 deletions
+241 -23
View File
@@ -841,8 +841,89 @@ namespace mdl {
gl_state_bind_element_array_buffer(0);
}
static size_t gen_grid_vertices(std::vector<float_t>& data,
int32_t w, int32_t h, int32_t ws, int32_t hs) {
const int32_t ws_half = ws / 2;
const int32_t hs_half = hs / 2;
const float_t w_flt = (float_t)w;
const float_t h_flt = (float_t)h;
const float_t width = w_flt * 0.5f;
const float_t height = h_flt * 0.5f;
data.reserve(6ULL * 2 * ws * 2);
for (int32_t i = 0; i <= ws; i++) {
if (i == ws_half)
continue;
const float_t w = (float_t)i * (w_flt / ((float_t)ws_half * 2.0f)) - width;
data.push_back(w);
data.push_back(0.0f);
data.push_back(-height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(w);
data.push_back(0.0f);
data.push_back(height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
}
data.reserve(6ULL * 2 * hs * 2);
for (int32_t i = 0; i <= hs; i++) {
if (i == hs_half)
continue;
const float_t h = (float_t)i * (h_flt / ((float_t)hs_half * 2.0f)) - height;
data.push_back(-width);
data.push_back(0.0f);
data.push_back(h);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(width);
data.push_back(0.0f);
data.push_back(h);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
}
size_t center_offset = data.size();
data.reserve(6ULL * 2 * 2 * 2);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-width);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(width);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
return center_offset;
}
static void gen_cube_vertices(std::vector<float_t>& data) {
data.resize(sizeof(vec3) * 2 * 4 * 6);
data.resize(6ULL * 2 * 4 * 6);
vec3* vtx = (vec3*)data.data();
*vtx++ = { -1.0f, -1.0f, -1.0f };
@@ -932,7 +1013,7 @@ namespace mdl {
if (slices < 2 || stacks < 2)
return;
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(radius);
@@ -950,7 +1031,7 @@ namespace mdl {
float_t xz = cosf(stack_angle);
float_t y = sinf(stack_angle);
data.reserve(sizeof(vec3) * 2 * slices);
data.reserve(6ULL * 2 * slices);
for (int32_t j = 0; j < slices; j++) {
float_t slice_angle = (float_t)((double_t)j * slice_step);
@@ -968,7 +1049,7 @@ namespace mdl {
}
}
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(-radius);
@@ -1098,6 +1179,114 @@ namespace mdl {
return wire_offset;
}
static void gen_plane_vertices(std::vector<float_t>& data) {
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
}
static void gen_line_vertices(std::vector<float_t>& data, float_t length) {
length *= 0.5f;
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(length);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-length);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
}
static void gen_cross_vertices(std::vector<float_t>& data) {
data.reserve(6ULL * 2 * 6);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
}
static void gen_capsule_vertices(std::vector<float_t>& data,
int32_t slices, int32_t stacks, float_t length, float_t radius) {
if (slices < 2 || stacks < 2)
@@ -1112,7 +1301,7 @@ namespace mdl {
length *= 0.5f;
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(radius + length);
@@ -1130,7 +1319,7 @@ namespace mdl {
float_t xz = cosf(stack_angle);
float_t y = sinf(stack_angle);
data.reserve(sizeof(vec3) * 2 * slices);
data.reserve(6ULL * 2 * slices);
for (int32_t j = 0; j < slices; j++) {
float_t slice_angle = (float_t)((double_t)j * slice_step);
@@ -1153,7 +1342,7 @@ namespace mdl {
float_t xz = cosf(stack_angle);
float_t y = sinf(stack_angle);
data.reserve(sizeof(vec3) * 2 * slices);
data.reserve(6ULL * 2 * slices);
for (int32_t j = 0; j < slices; j++) {
float_t slice_angle = (float_t)((double_t)j * slice_step);
@@ -1171,7 +1360,7 @@ namespace mdl {
}
}
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(-radius - length);
@@ -1320,7 +1509,7 @@ namespace mdl {
length *= 0.5f;
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(radius + length);
@@ -1340,7 +1529,7 @@ namespace mdl {
float_t y_n = y;
y *= radius + length;
data.reserve(sizeof(vec3) * 2 * slices);
data.reserve(6ULL * 2 * slices);
for (int32_t j = 0; j < slices; j++) {
float_t slice_angle = (float_t)((double_t)j * slice_step);
@@ -1358,7 +1547,7 @@ namespace mdl {
}
}
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(-radius - length);
@@ -1383,7 +1572,7 @@ namespace mdl {
if (slices < 2 || stacks < 0)
return;
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(half_height);
@@ -1400,7 +1589,7 @@ namespace mdl {
float_t y = lerp_def(half_height, -half_height, (float_t)i / (float_t)stacks);
float_t radius = lerp_def(top, base, (float_t)i / (float_t)stacks);
data.reserve(sizeof(vec3) * 2 * slices);
data.reserve(6ULL * 2 * slices);
for (int32_t j = 0; j < slices; j++) {
float_t slice_angle = (float_t)((double_t)j * slice_step);
@@ -1418,7 +1607,7 @@ namespace mdl {
}
}
data.reserve(sizeof(vec3) * 2);
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(-half_height);
@@ -1584,6 +1773,20 @@ namespace mdl {
case mdl::ETC_OBJ_LINE: {
EtcObjLine& line = etc->data.line;
vec3 origin = (line.pos[0] + line.pos[1]) * 0.5f;
mat4_add_translate(&mat, &origin, &mat);
vec3 dir = vec3::normalize(line.pos[1] - line.pos[0]);
vec3 up = { 0.0f, 1.0f, 0.0f };
vec3 axis;
float_t angle;
Glitter::axis_angle_from_vectors(&axis, &angle, &up, &dir);
mat4 m = mat4_identity;
mat4_mul_rotation(&m, &axis, angle, &m);
mat4_mul(&m, &mat, &mat);
length = vec3::distance(line.pos[0], line.pos[1]);
} break;
case mdl::ETC_OBJ_CROSS: {
EtcObjCross& cross = etc->data.cross;
@@ -1658,6 +1861,7 @@ namespace mdl {
&& fabsf(i.data.cone.base - etc->data.cone.base) < 0.00001f
&& fabsf(i.data.cone.height - etc->data.cone.height) < 0.00001f
|| type == mdl::ETC_OBJ_LINE
&& fabsf(vec3::distance(i.data.line.pos[0], i.data.line.pos[1]) - length) < 0.00001f
|| type == mdl::ETC_OBJ_CROSS
|| type == mdl::ETC_OBJ_CAPSULE // Added
&& i.data.capsule.slices == etc->data.capsule.slices
@@ -1742,7 +1946,10 @@ namespace mdl {
case mdl::ETC_OBJ_GRID: {
EtcObjGrid& grid = etc->data.grid;
etc_vertex_array->count = (GLsizei)(vtx_data.size() / 6);
size_t center_offset = gen_grid_vertices(vtx_data, grid.w, grid.h, grid.ws, grid.hs);
etc_vertex_array->offset = 0;
etc_vertex_array->count = (GLsizei)(center_offset / 6);
} break;
case mdl::ETC_OBJ_CUBE: {
EtcObjCube& cube = etc->data.cube;
@@ -1769,6 +1976,8 @@ namespace mdl {
case mdl::ETC_OBJ_PLANE: {
EtcObjPlane& plane = etc->data.plane;
gen_plane_vertices(vtx_data);
etc_vertex_array->count = (GLsizei)(vtx_data.size() / 6);
} break;
case mdl::ETC_OBJ_CONE: {
@@ -1779,11 +1988,15 @@ namespace mdl {
case mdl::ETC_OBJ_LINE: {
EtcObjLine& line = etc->data.line;
gen_line_vertices(vtx_data, length);
etc_vertex_array->count = (GLsizei)(vtx_data.size() / 6);
} break;
case mdl::ETC_OBJ_CROSS: {
EtcObjCross& cross = etc->data.cross;
gen_cross_vertices(vtx_data);
etc_vertex_array->count = (GLsizei)(vtx_data.size() / 6);
} break;
case mdl::ETC_OBJ_CAPSULE: { // Added
@@ -1976,7 +2189,7 @@ namespace mdl {
mat4 mat;
mat4_translate(&i, &mat);
mdl::DispManager::entry_obj_etc(&mat, &etc);
entry_obj_etc(&mat, &etc);
}
if (show_mat_center && type == OBJ_TYPE_TRANSLUCENT)
@@ -1990,7 +2203,7 @@ namespace mdl {
mat4 mat;
mat4_translate(&i, &mat);
mdl::DispManager::entry_obj_etc(&mat, &etc);
entry_obj_etc(&mat, &etc);
}
}
@@ -2836,12 +3049,12 @@ namespace mdl {
return entry_obj_by_object_info(mat, obj_info, blend_color, 0, 0, 0, 0, false, local);
}
bool mdl::DispManager::entry_obj_by_object_info_instanced(object_info obj_info,
bool DispManager::entry_obj_by_object_info_instanced(object_info obj_info,
const std::vector<mat4>& instances, float_t alpha) {
return entry_obj_by_object_info_instanced(obj_info, instances, 1.0, 1.0, 1.0, alpha);
}
bool mdl::DispManager::entry_obj_by_object_info_instanced(object_info obj_info,
bool DispManager::entry_obj_by_object_info_instanced(object_info obj_info,
const std::vector<mat4>& instances, float_t r, float_t g, float_t b, float_t a) {
const vec4 blend_color = { r, g, b, a };
if (!instances.size())
@@ -2921,11 +3134,11 @@ namespace mdl {
data->init_etc(this, mat, etc);
if (etc->color.a == 0xFF) {
if (!local && (obj_flags & OBJ_SHADOW))
mdl::DispManager::entry_list((mdl::ObjType)(OBJ_TYPE_SHADOW_CHARA + shadow_type), data);
mdl::DispManager::entry_list(local ? OBJ_TYPE_OPAQUE_LOCAL : OBJ_TYPE_OPAQUE, data);
entry_list((mdl::ObjType)(OBJ_TYPE_SHADOW_CHARA + shadow_type), data);
entry_list(local ? OBJ_TYPE_OPAQUE_LOCAL : OBJ_TYPE_OPAQUE, data);
}
else
mdl::DispManager::entry_list(local ? OBJ_TYPE_TRANSLUCENT_LOCAL : OBJ_TYPE_TRANSLUCENT, data);
entry_list(local ? OBJ_TYPE_TRANSLUCENT_LOCAL : OBJ_TYPE_TRANSLUCENT, data);
}
void DispManager::entry_obj_user(const mat4* mat, UserArgsFunc func, void* data, ObjType type) {
@@ -2996,7 +3209,10 @@ namespace mdl {
case mdl::ETC_OBJ_SPHERE:
case mdl::ETC_OBJ_PLANE:
case mdl::ETC_OBJ_CONE:
break;
case mdl::ETC_OBJ_LINE:
length = vec3::distance(etc->data.line.pos[0], etc->data.line.pos[1]);
break;
case mdl::ETC_OBJ_CROSS:
break;
case mdl::ETC_OBJ_CAPSULE: // Added
@@ -3040,7 +3256,9 @@ namespace mdl {
return i.vertex_array;
break;
case mdl::ETC_OBJ_LINE:
return i.vertex_array;
if (fabsf(vec3::distance(i.data.line.pos[0], i.data.line.pos[1]) - length) < 0.00001f)
return i.vertex_array;
break;
case mdl::ETC_OBJ_CROSS:
return i.vertex_array;
case mdl::ETC_OBJ_CAPSULE: // Added
+5 -1
View File
@@ -122,7 +122,11 @@ namespace mdl {
shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, 0);
break;
case mdl::ETC_OBJ_GRID:
glLineWidth(0.2f);
shaders_ft.draw_arrays(GL_LINES, 0, etc->count);
glLineWidth(2.0f);
shaders_ft.draw_arrays(GL_LINES, (GLint)etc->count, 4);
glLineWidth(1.0f);
break;
case mdl::ETC_OBJ_CUBE:
if (etc->data.sphere.wire)
@@ -137,7 +141,7 @@ namespace mdl {
shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset);
break;
case mdl::ETC_OBJ_PLANE:
shaders_ft.draw_arrays(GL_TRIANGLES, 0, etc->count);
shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, etc->count);
break;
case mdl::ETC_OBJ_CONE:
if (etc->data.cone.wire)
-6
View File
@@ -837,12 +837,6 @@ namespace rndr {
Glitter::glt_particle_manager->DispScenes(Glitter::DISP_OPAQUE);
extern bool draw_grid_3d;
if (draw_grid_3d) {
extern void draw_pass_3d_grid(render_context * rctx);
draw_pass_3d_grid(rctx);
}
gl_state_enable_depth_test();
gl_state_set_depth_mask(GL_TRUE);
if (draw_pass_3d[DRAW_PASS_3D_TRANSPARENT])
-27
View File
@@ -25,30 +25,14 @@ static const int32_t glitter_particle_wireframe_fpt_unival_max[] = {
-1,
};
static const int32_t grid_vpt_unival_max[] = {
-1,
};
static const int32_t grid_fpt_unival_max[] = {
-1,
};
static const uniform_name GLITTER_PT_WIREFRAME_uniform[] = {
U_INVALID,
};
static const uniform_name GRID_uniform[] = {
U_INVALID,
};
static const bool GLITTER_PT_WIREFRAME_permut[] = {
false,
};
static const bool GRID_permut[] = {
false,
};
static const shader_sub_table GLITTER_PT_WIREFRAME_table[] = {
{
SHADER_DEV_SUB_GLITTER_PT_WIREFRAME,
@@ -59,16 +43,6 @@ static const shader_sub_table GLITTER_PT_WIREFRAME_table[] = {
},
};
static const shader_sub_table GRID_table[] = {
{
SHADER_DEV_SUB_GRID,
grid_vpt_unival_max,
grid_fpt_unival_max,
"grid",
"grid",
},
};
#define shader_table_struct(n) \
{ \
#n, \
@@ -90,7 +64,6 @@ const shader_table shader_dev_table[] = {
0,
0,
},
shader_table_struct(GRID),
shader_table_struct(GLITTER_PT_WIREFRAME),
};
-1
View File
@@ -12,7 +12,6 @@
enum shader_dev_enum {
SHADER_DEV_FFP = 0,
SHADER_DEV_GLITTER_PT_WIREFRAME,
SHADER_DEV_GRID,
SHADER_DEV_END,
SHADER_DEV_MAX,
};
+1 -2
View File
@@ -54,7 +54,6 @@ extern int32_t height;
extern render_context* rctx_ptr;
extern bool input_reset;
extern bool input_locked;
extern bool draw_grid_3d;
TaskDataTestGlitterParticle::TaskDataTestGlitterParticle() : hash(), dw(),
frame(), auto_and_repeat(), reload(), pv_mode(), show_grid(), rebuild_geff() {
@@ -173,7 +172,7 @@ bool TaskDataTestGlitterParticle::dest() {
void TaskDataTestGlitterParticle::disp() {
if (show_grid) {
mdl::EtcObj etc(mdl::ETC_OBJ_GRID);
etc.color = 0xFF000000;
etc.color = color_black;
etc.data.grid.w = 50;
etc.data.grid.h = 50;
etc.data.grid.ws = 50;
+16 -10
View File
@@ -73,7 +73,6 @@ extern vec2i internal_2d_res;
extern vec2i internal_3d_res;
extern bool input_reset;
extern bool input_locked;
extern bool draw_grid_3d;
extern bool close;
extern bool global_context_menu;
@@ -340,10 +339,10 @@ void GlitterEditor::CurveEditor::SetFlag(const Glitter::CurveTypeFlags type_flag
GlitterEditor::GlitterEditor() : test(), create_popup(), load(), load_wait(), load_data(), load_data_wait(),
load_popup(), load_data_popup(), load_error_list_popup(), save(), save_popup(), save_compress(), save_encrypt(),
close(), close_editor(), input_play(), input_reload(), input_pause(), input_pause_temp(), input_reset(),
effect_group_add(), draw_flags(), resource_flags(), effect_flags(), emitter_flags(), particle_flags(),
load_glt_type(), save_glt_type(), load_data_type(), frame_counter(), old_frame_counter(),
start_frame(), end_frame(), counter(), effect_group(), scene(), hash(), selected_type(),
selected_resource(), selected_effect(), selected_emitter(), selected_particle(),
effect_group_add(), show_grid(), draw_flags(), resource_flags(), effect_flags(), emitter_flags(),
particle_flags(), load_glt_type(), save_glt_type(), load_data_type(), frame_counter(),
old_frame_counter(), start_frame(), end_frame(), counter(), effect_group(), scene(), hash(),
selected_type(), selected_resource(), selected_effect(), selected_emitter(), selected_particle(),
selected_edit_resource(), selected_edit_effect(), selected_edit_emitter(), selected_edit_particle() {
}
@@ -364,7 +363,6 @@ bool GlitterEditor::init() {
Glitter::glt_particle_manager->emission = 1.0f;
Glitter::glt_particle_manager->draw_all = true;
Glitter::glt_particle_manager->draw_all_mesh = true;
draw_grid_3d = true;
reset();
dtm_stg_load(0);
@@ -1166,8 +1164,6 @@ bool GlitterEditor::dest() {
dtm_stg_unload();
Glitter::glt_particle_manager->FreeSceneEffect(scene_counter);
Glitter::glt_particle_manager->UnloadEffectGroup(hash);
draw_grid_3d = false;
return true;
}
@@ -1177,6 +1173,16 @@ void GlitterEditor::disp() {
if (draw_flags & GLITTER_EDITOR_DISP_EMITTER_TYPE)
glitter_editor_draw_emitter_type(this);
if (show_grid) {
mdl::EtcObj etc(mdl::ETC_OBJ_GRID);
etc.color = color_black;
etc.data.grid.w = 50;
etc.data.grid.h = 50;
etc.data.grid.ws = 50;
etc.data.grid.hs = 50;
rctx_ptr->disp_manager->entry_obj_etc(&mat4_identity, &etc);
}
}
void GlitterEditor::window() {
@@ -2415,7 +2421,7 @@ static void glitter_editor_test_window(GlitterEditor* glt_edt) {
ImGui::Separator();
ImGui::CheckboxEnterKeyPressed("Show Grid", &draw_grid_3d);
ImGui::CheckboxEnterKeyPressed("Show Grid", &glt_edt->show_grid);
ImGui::CheckboxEnterKeyPressed("Draw All", &Glitter::glt_particle_manager->draw_all);
@@ -3107,7 +3113,7 @@ static void glitter_editor_play_manager(GlitterEditor* glt_edt) {
ImGui::Separator();
ImGui::CheckboxEnterKeyPressed("Grid", &draw_grid_3d);
ImGui::CheckboxEnterKeyPressed("Show Grid", &glt_edt->show_grid);
ImGui::CheckboxEnterKeyPressed("Draw All", &Glitter::glt_particle_manager->draw_all);
+1
View File
@@ -93,6 +93,7 @@ public:
bool input_pause_temp;
bool input_reset;
bool effect_group_add;
bool show_grid;
glitter_editor_disp_flags draw_flags;
glitter_editor_flags resource_flags;
glitter_editor_flags effect_flags;
+1 -26
View File
@@ -120,8 +120,7 @@ render_data* render;
ImFont* imgui_font_arial;
bool draw_imgui = true;
bool draw_grid_3d = false;
bool draw_imgui = true;
const double_t render_scale_table[] = {
1.0 / 4.0, // 25%
@@ -334,30 +333,6 @@ void render_set_scale_index(int32_t index) {
scale_index = index >= 0 && index < RENDER_SCALE_MAX ? index : RENDER_SCALE_100;
}
void draw_pass_3d_grid(render_context* rctx) {
rctx->camera->update_data();
mat4 view_projection;
mat4_transpose(&rctx->camera->view_projection, &view_projection);
render->grid_ubo.WriteMemory(view_projection);
gl_state_enable_blend();
gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
gl_state_set_blend_equation(GL_FUNC_ADD);
gl_state_enable_depth_test();
gl_state_set_depth_mask(GL_TRUE);
shaders_dev.set(SHADER_DEV_GRID);
render->grid_ubo.Bind(0);
gl_state_bind_vertex_array(render->grid_vao);
shaders_dev.draw_arrays(GL_LINES, 0, (GLsizei)grid_vertex_count);
gl_state_use_program(0);
gl_state_disable_depth_test();
gl_state_set_depth_mask(GL_FALSE);
gl_state_disable_blend();
}
float_t rob_frame = 0.0f;
render_data::render_data() : grid_vao() {