summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2023-03-24 03:18:42 -0400
committerrealtradam <[email protected]>2023-03-24 03:18:42 -0400
commitb2fdd29e4965b096e285a17162b268710077ea04 (patch)
tree449f4d5fc1cad055d4e5f50a1af7c7f3d16689c5 /src
parent632619168ddbe7707d4b47bf2ffcc972df7a20ea (diff)
downloadRodeoKit-b2fdd29e4965b096e285a17162b268710077ea04.tar.gz
RodeoKit-b2fdd29e4965b096e285a17162b268710077ea04.zip
texture rendering prototype
Diffstat (limited to 'src')
-rw-r--r--src/rodeo.c115
-rw-r--r--src/rodeo_internal.h15
-rw-r--r--src/rodeo_internal_types.h8
-rw-r--r--src/shaders/simple.fragment.sc6
-rw-r--r--src/shaders/simple.vertex.sc5
-rw-r--r--src/shaders/varying.def.sc2
6 files changed, 131 insertions, 20 deletions
diff --git a/src/rodeo.c b/src/rodeo.c
index 24c6a4d..3720e10 100644
--- a/src/rodeo.c
+++ b/src/rodeo.c
@@ -1,8 +1,8 @@
// -- internal --
-// public internal
+// public
#include "rodeo.h"
#include "rodeo_types.h"
-// private internal
+// private
#include "rodeo_internal.h"
#include "rodeo_internal_types.h"
@@ -21,6 +21,18 @@
// -- system --
#include <time.h>
+bgfx_texture_handle_t
+rodeo_texture_2d_create_default(void);
+
+static const unsigned char defaultTxData[] =
+{
+ 0xff, 0xff, 0xff, 0xff // 1x1 WHITE dot
+};
+
+static bgfx_texture_handle_t texture;
+static bgfx_uniform_handle_t sampler;
+
+
static irodeo_state_t state = {0};
void
@@ -141,10 +153,15 @@ rodeo_window_init(
0
);
bgfx_set_view_rect(0, 0, 0, state.screen_width, state.screen_height);
- bgfx_vertex_layout_begin(&state.vertex_layout, bgfx_get_renderer_type());
- bgfx_vertex_layout_add(&state.vertex_layout, BGFX_ATTRIB_POSITION, 3, BGFX_ATTRIB_TYPE_FLOAT, false, false);
- bgfx_vertex_layout_add(&state.vertex_layout, BGFX_ATTRIB_COLOR0, 4, BGFX_ATTRIB_TYPE_UINT8, true, false);
- bgfx_vertex_layout_end(&state.vertex_layout);
+
+ rodeo_log(rodeo_loglevel_info, "Setting up default render pipeline...");
+ // set up vertex layout
+ mrodeo_bgfx_vertex_layout_do(&state.vertex_layout)
+ {
+ bgfx_vertex_layout_add(&state.vertex_layout, BGFX_ATTRIB_POSITION, 3, BGFX_ATTRIB_TYPE_FLOAT, false, false);
+ bgfx_vertex_layout_add(&state.vertex_layout, BGFX_ATTRIB_COLOR0, 4, BGFX_ATTRIB_TYPE_UINT8, true, false);
+ bgfx_vertex_layout_add(&state.vertex_layout, BGFX_ATTRIB_TEXCOORD0, 2, BGFX_ATTRIB_TYPE_FLOAT, true, false);
+ }
state.vertex_buffer_handle = bgfx_create_dynamic_vertex_buffer(mrodeo_vertex_size_max, &state.vertex_layout, BGFX_BUFFER_NONE);
@@ -156,7 +173,7 @@ rodeo_window_init(
case BGFX_RENDERER_TYPE_NOOP:
rodeo_log(
rodeo_loglevel_error,
- "BGFX failed to get determine an appropriate renderer."
+ "BGFX failed to get determine an appropriate renderer"
);
exit(EXIT_FAILURE);
case BGFX_RENDERER_TYPE_OPENGLES:
@@ -174,7 +191,7 @@ rodeo_window_init(
default:
rodeo_log(
rodeo_loglevel_error,
- "No shaders implemented for BGFX renderer chosen."
+ "No shaders implemented for BGFX renderer chosen"
);
exit(EXIT_FAILURE);
}
@@ -197,6 +214,17 @@ rodeo_window_init(
state.fragment_shader,
true
);
+ rodeo_log(
+ rodeo_loglevel_info,
+ "Default render pipeline finished setup"
+ );
+
+ //bgfx_texture_handle_t default_texture = rodeo_texture_2d_create_default();
+
+ sampler = bgfx_create_uniform("s_texColor", BGFX_UNIFORM_TYPE_SAMPLER, 1);
+
+ rodeo_texture_2d_create_default();
+
state.end_frame = SDL_GetPerformanceCounter();
}
@@ -310,6 +338,7 @@ rodeo_renderer_name_get(void)
void
rodeo_renderer_flush(void)
{
+ bgfx_set_texture(0, sampler, texture, UINT32_MAX);
if(state.vertex_size > 0)
{
// upload remaining batched vertices
@@ -354,25 +383,37 @@ rodeo_rectangle_draw(
state.batched_vertices[state.vertex_size] =
(rodeo_vertex_t)
{
- rectangle.width + rectangle.x, rectangle.height + rectangle.y, 0.0f, abgr
+ .x = rectangle.width + rectangle.x,
+ .y = rectangle.height + rectangle.y,
+ //.z = 0.0f,
+ .abgr = abgr
};
state.vertex_size += 1;
state.batched_vertices[state.vertex_size] =
(rodeo_vertex_t)
{
- rectangle.width + rectangle.x, rectangle.y, 0.0f, abgr
+ .x = rectangle.width + rectangle.x,
+ .y = rectangle.y,
+ //.z = 0.0f,
+ .abgr = abgr
};
state.vertex_size += 1;
state.batched_vertices[state.vertex_size] =
(rodeo_vertex_t)
{
- rectangle.x, rectangle.y, 0.0f, abgr
+ .x = rectangle.x,
+ .y = rectangle.y,
+ //.z = 0.0f,
+ .abgr = abgr
};
state.vertex_size += 1;
state.batched_vertices[state.vertex_size] =
(rodeo_vertex_t)
{
- rectangle.x, rectangle.height + rectangle.y, 0.0f, abgr
+ .x = rectangle.x,
+ .y = rectangle.height + rectangle.y,
+ //.z = 0.0f,
+ .abgr = abgr
};
state.vertex_size += 1;
@@ -404,6 +445,56 @@ rodeo_rectangle_draw(
}
}
+bgfx_texture_handle_t
+rodeo_texture_2d_create_default(
+ void
+ //uint32_t width,
+ //uint32_t height,
+ //char *memory
+)
+{
+ //uint32_t one_pixel = UINT32_MAX;//0xFFFFFFFF;
+ const bgfx_memory_t* txMem = bgfx_make_ref(defaultTxData, 4);
+ texture = bgfx_create_texture_2d(
+ 1,
+ 1,
+ false,
+ 0,
+ BGFX_TEXTURE_FORMAT_RGBA8,
+ 0,
+ txMem
+ );
+ return texture;
+}
+
+void
+rodeo_texture_2d_draw(
+ //rodeo_rectangle_t source,
+ //rodeo_rectangle_t destination,
+ //rodeo_rgba_t color,
+ //rodeo_texture_2d_p texture
+ void
+)
+{
+ // gonna need to change the shader pipeline
+ // to also accept textures
+}
+
+
+/*
+rodeo_texture_2d_p
+rodeo_texture_2d_create_from_path(rodeo_string_t path)
+{
+ // call load file into data
+ // then call create_from_data variant
+}
+
+void
+rodeo_texture_2d_destroy(rodeo_texture_2d_t *texture)
+{
+
+}
+*/
bgfx_shader_handle_t
irodeo_shader_load(const rodeo_string_t path)
{
diff --git a/src/rodeo_internal.h b/src/rodeo_internal.h
index 576bc9b..4939edd 100644
--- a/src/rodeo_internal.h
+++ b/src/rodeo_internal.h
@@ -1,7 +1,20 @@
-// private internal
+// -- internal --
+// public
+#include "rodeo.h"
+// private
#include "rodeo_internal_types.h"
+#define \
+mrodeo_bgfx_vertex_layout_do(vertex_layout) \
+ mrodeo_defer_do( \
+ bgfx_vertex_layout_begin( \
+ vertex_layout, \
+ bgfx_get_renderer_type() \
+ ), \
+ bgfx_vertex_layout_end(vertex_layout) \
+ )
+
bgfx_shader_handle_t
irodeo_\
shader_load(const rodeo_string_t path);
diff --git a/src/rodeo_internal_types.h b/src/rodeo_internal_types.h
index 82a3140..174f6b1 100644
--- a/src/rodeo_internal_types.h
+++ b/src/rodeo_internal_types.h
@@ -1,12 +1,13 @@
#pragma once
-// public internal
+// -- internal --
+// public
#include "rodeo_config.h"
#include "rodeo_types.h"
-// system
+// -- system --
#if __EMSCRIPTEN__
-#include <emscripten/emscripten.h>
+ #include <emscripten/emscripten.h>
#endif
#include "SDL2/SDL.h"
#include "SDL2/SDL_syswm.h"
@@ -30,6 +31,7 @@ typedef struct
uint16_t index_count;
uint16_t index_size;
uint16_t batched_indices[(mrodeo_vertex_size_max / 4) * 6];
+ uint16_t active_texture_id;
bgfx_shader_handle_t vertex_shader;
bgfx_shader_handle_t fragment_shader;
bgfx_program_handle_t program_shader;
diff --git a/src/shaders/simple.fragment.sc b/src/shaders/simple.fragment.sc
index 3a58d8d..72973ee 100644
--- a/src/shaders/simple.fragment.sc
+++ b/src/shaders/simple.fragment.sc
@@ -1,8 +1,10 @@
-$input v_color0
+$input v_color0, v_texcoord0
#include <bgfx_shader.sh>
+SAMPLER2D(s_texColor, 0);
+
void main()
{
- gl_FragColor = v_color0;
+ gl_FragColor = v_color0 * texture2D(s_texColor, v_texcoord0);
}
diff --git a/src/shaders/simple.vertex.sc b/src/shaders/simple.vertex.sc
index 56b8736..b90a0c7 100644
--- a/src/shaders/simple.vertex.sc
+++ b/src/shaders/simple.vertex.sc
@@ -1,5 +1,5 @@
-$input a_position, a_color0
-$output v_color0
+$input a_position, a_color0, a_texcoord0
+$output v_color0, v_texcoord0
#include <bgfx_shader.sh>
@@ -7,4 +7,5 @@ void main()
{
gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0));
v_color0 = a_color0;
+ v_texcoord0 = a_texcoord0;
}
diff --git a/src/shaders/varying.def.sc b/src/shaders/varying.def.sc
index 2ae9226..fccdc90 100644
--- a/src/shaders/varying.def.sc
+++ b/src/shaders/varying.def.sc
@@ -1,6 +1,8 @@
// outputs;
vec4 v_color0 : COLOR0;
+vec2 v_texcoord0 : TEXCOORD0;
// inputs;
vec3 a_position : POSITION;
vec4 a_color0 : COLOR0;
+vec2 a_texcoord0 : TEXCOORD0;