@ -26,8 +26,8 @@
# if defined(__EMSCRIPTEN__)
# if defined(__EMSCRIPTEN__)
# define WEB
# define WEB
# define SOKOL_GLES 2
# define SOKOL_GLES 3
# define SAMPLE_COUNT 1 // bumping this back to 4 is troublesome for web, because there's a mismatch in sample counts. Perhaps we must upgrade to gles3, in doing so, we should upgrade to the newest sokol gfx.
# define SAMPLE_COUNT 4
# endif
# endif
# define DRWAV_ASSERT game_assert
# define DRWAV_ASSERT game_assert
@ -58,11 +58,7 @@ __declspec(dllexport) uint32_t AmdPowerXpressRequestHighPerformance = 0x00000001
# pragma warning(push)
# pragma warning(push)
# pragma warning(disable : 4191) // unsafe function calling
# pragma warning(disable : 4191) // unsafe function calling
# ifdef WEB
# ifdef WEB
# ifndef GL_EXT_PROTOTYPES
# include <GLES3 / gl3.h>
# define GL_GLEXT_PROTOTYPES
# endif
# include <GLES2 / gl2.h>
# include <GLES2 / gl2ext.h>
# undef glGetError
# undef glGetError
# define glGetError() (GL_NO_ERROR)
# define glGetError() (GL_NO_ERROR)
# endif
# endif
@ -843,18 +839,15 @@ sg_image load_image(MD_String8 path)
{
{
. width = png_width ,
. width = png_width ,
. height = png_height ,
. height = png_height ,
. pixel_format = SG_PIXELFORMAT_RGBA8 ,
. pixel_format = sapp_sgcontext ( ) . color_format ,
. min_filter = SG_FILTER_LINEAR ,
. num_mipmaps = 1 ,
. num_mipmaps = 1 ,
. wrap_u = SG_WRAP_CLAMP_TO_EDGE ,
. wrap_v = SG_WRAP_CLAMP_TO_EDGE ,
. mag_filter = SG_FILTER_LINEAR ,
. data . subimage [ 0 ] [ 0 ] =
. data . subimage [ 0 ] [ 0 ] =
{
{
. ptr = pixels ,
. ptr = pixels ,
. size = ( size_t ) ( png_width * png_height * num_channels ) ,
. size = ( size_t ) ( png_width * png_height * num_channels ) ,
}
}
} ) ;
} ) ;
loaded - > image = to_return ;
loaded - > image = to_return ;
MD_ReleaseScratch ( scratch ) ;
MD_ReleaseScratch ( scratch ) ;
return to_return ;
return to_return ;
@ -1233,14 +1226,6 @@ Armature load_armature(MD_Arena *arena, MD_String8 binary_file, MD_String8 armat
. width = to_return . bones_texture_width ,
. width = to_return . bones_texture_width ,
. height = to_return . bones_texture_height ,
. height = to_return . bones_texture_height ,
. pixel_format = SG_PIXELFORMAT_RGBA8 ,
. pixel_format = SG_PIXELFORMAT_RGBA8 ,
. min_filter = SG_FILTER_NEAREST ,
. mag_filter = SG_FILTER_NEAREST ,
// for webgl NPOT texures https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL
. wrap_u = SG_WRAP_CLAMP_TO_EDGE ,
. wrap_v = SG_WRAP_CLAMP_TO_EDGE ,
. wrap_w = SG_WRAP_CLAMP_TO_EDGE ,
. usage = SG_USAGE_STREAM ,
. usage = SG_USAGE_STREAM ,
} ) ;
} ) ;
@ -2662,26 +2647,34 @@ Shadow_State init_shadow_state();
static struct
static struct
{
{
sg_pass_action clear_everything_pass_action ;
sg_pass_action clear_everything_pass_action ;
sg_pass_action threedee_msaa_pass_action ;
sg_pass_action clear_depth_buffer_pass_action ;
sg_pass_action clear_depth_buffer_pass_action ;
sg_pipeline twodee_pip ;
sg_pipeline twodee_pip ;
sg_bindings bind ;
sg_bindings bind ;
sg_pipeline threedee_pip ;
sg_pipeline threedee_pip ;
sg_pipeline threedee_alpha_blended_pip ;
sg_pipeline armature_pip ;
sg_pipeline armature_pip ;
sg_bindings threedee_bind ;
sg_bindings threedee_bind ;
sg_image outline_pass_image ;
sg_image outline_pass_image ;
sg_image outline_pass_resolve_image ;
sg_pass outline_pass ;
sg_pass outline_pass ;
sg_pipeline outline_mesh_pip ;
sg_pipeline outline_mesh_pip ;
sg_pipeline outline_armature_pip ;
sg_pipeline outline_armature_pip ;
sg_pass threedee_pass ; // is a pass so I can do post processing in a shader
sg_pass threedee_pass ; // is a pass so I can do post processing in a shader
sg_image threedee_pass_image ;
sg_image threedee_pass_image ;
sg_image threedee_pass_resolve_image ;
sg_image threedee_pass_depth_image ;
sg_image threedee_pass_depth_image ;
sg_pipeline twodee_outline_pip ;
sg_pipeline twodee_outline_pip ;
sg_pipeline twodee_colorcorrect_pip ;
sg_pipeline twodee_colorcorrect_pip ;
sg_sampler sampler_linear ;
sg_sampler sampler_linear_border ;
sg_sampler sampler_nearest ;
Shadow_State shadows ;
Shadow_State shadows ;
} state ;
} state ;
@ -2696,7 +2689,9 @@ void create_screenspace_gfx_state()
MAYBE_DESTROY ( state . threedee_pass , sg_destroy_pass ) ;
MAYBE_DESTROY ( state . threedee_pass , sg_destroy_pass ) ;
MAYBE_DESTROY ( state . outline_pass_image , sg_destroy_image ) ;
MAYBE_DESTROY ( state . outline_pass_image , sg_destroy_image ) ;
MAYBE_DESTROY ( state . outline_pass_resolve_image , sg_destroy_image ) ;
MAYBE_DESTROY ( state . threedee_pass_image , sg_destroy_image ) ;
MAYBE_DESTROY ( state . threedee_pass_image , sg_destroy_image ) ;
MAYBE_DESTROY ( state . threedee_pass_resolve_image , sg_destroy_image ) ;
MAYBE_DESTROY ( state . threedee_pass_depth_image , sg_destroy_image ) ;
MAYBE_DESTROY ( state . threedee_pass_depth_image , sg_destroy_image ) ;
# undef MAYBE_DESTROY
# undef MAYBE_DESTROY
@ -2766,35 +2761,41 @@ void create_screenspace_gfx_state()
. render_target = true ,
. render_target = true ,
. width = sapp_width ( ) ,
. width = sapp_width ( ) ,
. height = sapp_height ( ) ,
. height = sapp_height ( ) ,
. pixel_format = SG_PIXELFORMAT_RGBA8 ,
. pixel_format = sapp_sgcontext ( ) . color_format ,
. min_filter = SG_FILTER_LINEAR ,
. mag_filter = SG_FILTER_LINEAR ,
. wrap_u = SG_WRAP_CLAMP_TO_BORDER ,
. wrap_v = SG_WRAP_CLAMP_TO_BORDER ,
. border_color = SG_BORDERCOLOR_OPAQUE_WHITE ,
. sample_count = SAMPLE_COUNT ,
. label = " outline-pass-render-target " ,
. label = " outline-pass-render-target " ,
} ;
} ;
desc . sample_count = SAMPLE_COUNT ;
state . outline_pass_image = sg_make_image ( & desc ) ;
state . outline_pass_image = sg_make_image ( & desc ) ;
desc . sample_count = 1 ;
state . outline_pass_resolve_image = sg_make_image ( & desc ) ;
state . outline_pass = sg_make_pass ( & ( sg_pass_desc ) {
state . outline_pass = sg_make_pass ( & ( sg_pass_desc ) {
. color_attachments [ 0 ] . image = state . outline_pass_image ,
. color_attachments [ 0 ] . image = state . outline_pass_image ,
. resolve_attachments [ 0 ] . image = state . outline_pass_resolve_image ,
. depth_stencil_attachment = {
. depth_stencil_attachment = {
0
0
} ,
} ,
. label = " outline-pass " ,
. label = " outline-pass " ,
} ) ;
} ) ;
desc . sample_count = SAMPLE_COUNT ;
desc . sample_count = 1 ;
desc . label = " threedee-pass-render-target " ;
desc . label = " threedee-pass-render-target " ;
desc . sample_count = SAMPLE_COUNT ;
state . threedee_pass_image = sg_make_image ( & desc ) ;
state . threedee_pass_image = sg_make_image ( & desc ) ;
desc . label = " threedee-pass-resolve-render-target " ;
desc . sample_count = 1 ;
state . threedee_pass_resolve_image = sg_make_image ( & desc ) ;
desc . label = " threedee-pass-depth-render-target " ;
desc . label = " threedee-pass-depth-render-target " ;
desc . pixel_format = sapp_depth_format ( ) ;
desc . pixel_format = SG_PIXELFORMAT_DEPTH ;
desc . sample_count = SAMPLE_COUNT ;
state . threedee_pass_depth_image = sg_make_image ( & desc ) ;
state . threedee_pass_depth_image = sg_make_image ( & desc ) ;
state . threedee_pass = sg_make_pass ( & ( sg_pass_desc ) {
state . threedee_pass = sg_make_pass ( & ( sg_pass_desc ) {
. color_attachments [ 0 ] . image = state . threedee_pass_image ,
. color_attachments [ 0 ] . image = state . threedee_pass_image ,
. resolve_attachments [ 0 ] . image = state . threedee_pass_resolve_image ,
. depth_stencil_attachment = ( sg_pass_attachment_desc ) {
. depth_stencil_attachment = ( sg_pass_attachment_desc ) {
. image = state . threedee_pass_depth_image ,
. image = state . threedee_pass_depth_image ,
. mip_level = 0 ,
. mip_level = 0 ,
@ -3014,8 +3015,8 @@ Color blendalpha(Color c, float alpha)
// in pixels
// in pixels
Vec2 img_size ( sg_image img )
Vec2 img_size ( sg_image img )
{
{
sg_image_ info info = sg_query_image_info ( img ) ;
sg_image_ desc desc = sg_query_image_desc ( img ) ;
return V2 ( ( float ) info. width , ( float ) info . height ) ;
return V2 ( ( float ) desc. width , ( float ) desc . height ) ;
}
}
# ifdef DEVTOOLS
# ifdef DEVTOOLS
@ -3137,8 +3138,6 @@ LoadedFont load_font(MD_Arena *arena, MD_String8 font_filepath, float font_size)
. width = font_bitmap_width ,
. width = font_bitmap_width ,
. height = font_bitmap_width ,
. height = font_bitmap_width ,
. pixel_format = SG_PIXELFORMAT_RGBA8 ,
. pixel_format = SG_PIXELFORMAT_RGBA8 ,
. min_filter = SG_FILTER_LINEAR ,
. mag_filter = SG_FILTER_LINEAR ,
. data . subimage [ 0 ] [ 0 ] =
. data . subimage [ 0 ] [ 0 ] =
{
{
. ptr = font_bitmap_rgba ,
. ptr = font_bitmap_rgba ,
@ -3215,6 +3214,7 @@ void init(void)
sg_setup ( & ( sg_desc ) {
sg_setup ( & ( sg_desc ) {
. context = sapp_sgcontext ( ) ,
. context = sapp_sgcontext ( ) ,
. buffer_pool_size = 512 ,
. buffer_pool_size = 512 ,
. logger . func = slog_func ,
} ) ;
} ) ;
stm_setup ( ) ;
stm_setup ( ) ;
saudio_setup ( & ( saudio_desc ) {
saudio_setup ( & ( saudio_desc ) {
@ -3375,29 +3375,38 @@ void init(void)
assert ( desc ) ;
assert ( desc ) ;
shd = sg_make_shader ( desc ) ;
shd = sg_make_shader ( desc ) ;
state . threedee_pip = sg_make_pipeline ( & ( sg_pipeline_desc ) {
{
. shader = shd ,
sg_pipeline_desc threedee_pip_desc = {
. layout = { . attrs = {
. shader = shd ,
[ ATTR_threedee_vs_pos_in ] . format = SG_VERTEXFORMAT_FLOAT3 ,
. layout = { . attrs = {
[ ATTR_threedee_vs_uv_in ] . format = SG_VERTEXFORMAT_FLOAT2 ,
[ ATTR_threedee_vs_pos_in ] . format = SG_VERTEXFORMAT_FLOAT3 ,
} } ,
[ ATTR_threedee_vs_uv_in ] . format = SG_VERTEXFORMAT_FLOAT2 ,
. depth = {
} } ,
. pixel_format = sapp_depth_format ( ) ,
. depth = {
. compare = SG_COMPAREFUNC_LESS_EQUAL ,
. pixel_format = SG_PIXELFORMAT_DEPTH ,
. write_enabled = true ,
. compare = SG_COMPAREFUNC_LESS_EQUAL ,
} ,
. write_enabled = true ,
. colors [ 0 ] . blend = ( sg_blend_state ) {
} ,
. alpha_to_coverage_enabled = true ,
. sample_count = SAMPLE_COUNT ,
. colors [ 0 ] . blend . enabled = false ,
. label = " threedee " ,
} ;
state . threedee_pip = sg_make_pipeline ( & threedee_pip_desc ) ;
threedee_pip_desc . depth . write_enabled = false ;
threedee_pip_desc . alpha_to_coverage_enabled = false ;
threedee_pip_desc . colors [ 0 ] . blend = ( sg_blend_state ) {
// allow transparency
// allow transparency
. enabled = true ,
. enabled = true ,
. src_factor_rgb = SG_BLENDFACTOR_SRC_ALPHA ,
. src_factor_rgb = SG_BLENDFACTOR_SRC_ALPHA ,
. dst_factor_rgb = SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA ,
. dst_factor_rgb = SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA ,
. op_rgb = SG_BLENDOP_ADD ,
. op_rgb = SG_BLENDOP_ADD ,
. src_factor_alpha = SG_BLENDFACTOR_ONE ,
. src_factor_alpha = SG_BLENDFACTOR_ SRC_ALPHA ,
. dst_factor_alpha = SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA ,
. dst_factor_alpha = SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA ,
. op_alpha = SG_BLENDOP_ADD ,
. op_alpha = SG_BLENDOP_ADD ,
} ,
} ,
. label = " threedee " ,
state . threedee_alpha_blended_pip = sg_make_pipeline ( & threedee_pip_desc ) ;
} ) ;
}
desc = threedee_armature_shader_desc ( sg_query_backend ( ) ) ;
desc = threedee_armature_shader_desc ( sg_query_backend ( ) ) ;
assert ( desc ) ;
assert ( desc ) ;
@ -3407,10 +3416,11 @@ void init(void)
{
{
. shader = shd ,
. shader = shd ,
. depth = {
. depth = {
. pixel_format = sapp_depth_format ( ) ,
. pixel_format = SG_PIXELFORMAT_DEPTH ,
. compare = SG_COMPAREFUNC_LESS_EQUAL ,
. compare = SG_COMPAREFUNC_LESS_EQUAL ,
. write_enabled = true
. write_enabled = true
} ,
} ,
. sample_count = SAMPLE_COUNT ,
. layout = {
. layout = {
. attrs =
. attrs =
{
{
@ -3434,11 +3444,45 @@ void init(void)
state . clear_depth_buffer_pass_action = ( sg_pass_action )
state . clear_depth_buffer_pass_action = ( sg_pass_action )
{
{
. colors [ 0 ] = { . action = SG_ ACTION_LOAD } ,
. colors [ 0 ] = { . load_ action = SG_ LOAD ACTION_LOAD } ,
. depth = { . action = SG_ ACTION_CLEAR, . value = 1.0f } ,
. depth = { . load_ action = SG_ LOAD ACTION_CLEAR, . clear_ value = 1.0f } ,
} ;
} ;
state . clear_everything_pass_action = state . clear_depth_buffer_pass_action ;
state . clear_everything_pass_action = state . clear_depth_buffer_pass_action ;
state . clear_everything_pass_action . colors [ 0 ] = ( sg_color_attachment_action ) { . action = SG_ACTION_CLEAR , . value = { clearcol . r , clearcol . g , clearcol . b , 1.0f } } ;
state . clear_everything_pass_action . colors [ 0 ] = ( sg_color_attachment_action ) { . load_action = SG_LOADACTION_CLEAR , . clear_value = { clearcol . r , clearcol . g , clearcol . b , 1.0f } } ;
state . threedee_msaa_pass_action = state . clear_everything_pass_action ;
state . threedee_msaa_pass_action . colors [ 0 ] . load_action = SG_LOADACTION_CLEAR ;
state . threedee_msaa_pass_action . colors [ 0 ] . store_action = SG_STOREACTION_DONTCARE ;
state . sampler_linear = sg_make_sampler ( & ( sg_sampler_desc ) {
. min_filter = SG_FILTER_LINEAR ,
. mag_filter = SG_FILTER_LINEAR ,
// .mipmap_filter = SG_FILTER_LINEAR,
. wrap_u = SG_WRAP_CLAMP_TO_EDGE ,
. wrap_v = SG_WRAP_CLAMP_TO_EDGE ,
// .max_anisotropy = 16,
. label = " sampler-linear " ,
} ) ;
state . sampler_linear_border = sg_make_sampler ( & ( sg_sampler_desc ) {
. min_filter = SG_FILTER_LINEAR ,
. mag_filter = SG_FILTER_LINEAR ,
. wrap_u = SG_WRAP_CLAMP_TO_BORDER ,
. wrap_v = SG_WRAP_CLAMP_TO_BORDER ,
. border_color = SG_BORDERCOLOR_OPAQUE_WHITE ,
. label = " sampler-linear-border " ,
} ) ;
state . sampler_nearest = sg_make_sampler ( & ( sg_sampler_desc ) {
. min_filter = SG_FILTER_NEAREST ,
. mag_filter = SG_FILTER_NEAREST ,
// for webgl NPOT texures https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL
. wrap_u = SG_WRAP_CLAMP_TO_EDGE ,
. wrap_v = SG_WRAP_CLAMP_TO_EDGE ,
. wrap_w = SG_WRAP_CLAMP_TO_EDGE ,
. label = " sampler-nearest " ,
} ) ;
}
}
Vec2 screen_size ( )
Vec2 screen_size ( )
@ -3729,9 +3773,16 @@ void flush_quad_batch()
state . bind . vertex_buffer_offsets [ 0 ] = sg_append_buffer ( state . bind . vertex_buffers [ 0 ] , & ( sg_range ) { cur_batch_data , cur_batch_data_index * sizeof ( * cur_batch_data ) } ) ;
state . bind . vertex_buffer_offsets [ 0 ] = sg_append_buffer ( state . bind . vertex_buffers [ 0 ] , & ( sg_range ) { cur_batch_data , cur_batch_data_index * sizeof ( * cur_batch_data ) } ) ;
state . bind . fs_images [ SLOT_threedee_twodee_tex ] = cur_batch_image ;
state . bind . fs . images [ SLOT_threedee_twodee_tex ] = cur_batch_image ; // NOTE that this might get FUCKED if a custom pipeline is provided with more/less texture slots!!!
state . bind . fs . samplers [ SLOT_threedee_fs_twodee_smp ] = state . sampler_linear ; // NOTE that this might get FUCKED if a custom pipeline is provided with more/less sampler slots!!!
sg_apply_bindings ( & state . bind ) ;
sg_apply_bindings ( & state . bind ) ;
cur_batch_params . tex_size = img_size ( cur_batch_image ) ;
cur_batch_params . tex_size = img_size ( cur_batch_image ) ;
cur_batch_params . screen_size = screen_size ( ) ;
# if defined(SOKOL_GLCORE33) || defined(SOKOL_GLES3)
cur_batch_params . flip_and_swap_rgb = 0 ;
# else
cur_batch_params . flip_and_swap_rgb = 1 ;
# endif
sg_apply_uniforms ( SG_SHADERSTAGE_FS , SLOT_threedee_twodee_fs_params , & SG_RANGE ( cur_batch_params ) ) ;
sg_apply_uniforms ( SG_SHADERSTAGE_FS , SLOT_threedee_twodee_fs_params , & SG_RANGE ( cur_batch_params ) ) ;
cur_batch_params . tex_size = V2 ( 0 , 0 ) ; // unsure if setting the tex_size to something nonzero fucks up the batching so I'm just resetting it back here
cur_batch_params . tex_size = V2 ( 0 , 0 ) ; // unsure if setting the tex_size to something nonzero fucks up the batching so I'm just resetting it back here
assert ( cur_batch_data_index % FLOATS_PER_VERTEX = = 0 ) ;
assert ( cur_batch_data_index % FLOATS_PER_VERTEX = = 0 ) ;
@ -4840,8 +4891,8 @@ Shadow_State init_shadow_state() {
shadows . pass_action = ( sg_pass_action ) {
shadows . pass_action = ( sg_pass_action ) {
. colors [ 0 ] = {
. colors [ 0 ] = {
. action = SG_ ACTION_CLEAR,
. load_ action = SG_ LOAD ACTION_CLEAR,
. value = { 1.0f , 1.0f , 1.0f , 1.0f }
. clear_ value = { 1.0f , 1.0f , 1.0f , 1.0f }
}
}
} ;
} ;
@ -4851,18 +4902,14 @@ Shadow_State init_shadow_state() {
be pertinent to just dig into sokol and add the functionality we want later ,
be pertinent to just dig into sokol and add the functionality we want later ,
but as a first pass , we will just do as the romans do . I . e . have both a colour
but as a first pass , we will just do as the romans do . I . e . have both a colour
and depth component . - Canada Day 2023.
and depth component . - Canada Day 2023.
TODO : with GLES3 , depth only rendering passes are now supported
*/
*/
sg_image_desc img_desc = {
sg_image_desc img_desc = {
. render_target = true ,
. render_target = true ,
. width = SHADOW_MAP_DIMENSION ,
. width = SHADOW_MAP_DIMENSION ,
. height = SHADOW_MAP_DIMENSION ,
. height = SHADOW_MAP_DIMENSION ,
. pixel_format = SG_PIXELFORMAT_RGBA8 ,
. pixel_format = sapp_sgcontext ( ) . color_format ,
. min_filter = SG_FILTER_LINEAR ,
. sample_count = 1 ,
. mag_filter = SG_FILTER_LINEAR ,
. wrap_u = SG_WRAP_CLAMP_TO_BORDER ,
. wrap_v = SG_WRAP_CLAMP_TO_BORDER ,
. border_color = SG_BORDERCOLOR_OPAQUE_WHITE ,
. sample_count = SAMPLE_COUNT ,
. label = " shadow-map-color-image "
. label = " shadow-map-color-image "
} ;
} ;
shadows . color_img = sg_make_image ( & img_desc ) ;
shadows . color_img = sg_make_image ( & img_desc ) ;
@ -4886,13 +4933,13 @@ Shadow_State init_shadow_state() {
. shader = sg_make_shader ( threedee_mesh_shadow_mapping_shader_desc ( sg_query_backend ( ) ) ) ,
. shader = sg_make_shader ( threedee_mesh_shadow_mapping_shader_desc ( sg_query_backend ( ) ) ) ,
// Cull front faces in the shadow map pass
// Cull front faces in the shadow map pass
// .cull_mode = SG_CULLMODE_BACK,
// .cull_mode = SG_CULLMODE_BACK,
. sample_count = SAMPLE_COUNT ,
. sample_count = 1 ,
. depth = {
. depth = {
. pixel_format = SG_PIXELFORMAT_DEPTH ,
. pixel_format = SG_PIXELFORMAT_DEPTH ,
. compare = SG_COMPAREFUNC_LESS_EQUAL ,
. compare = SG_COMPAREFUNC_LESS_EQUAL ,
. write_enabled = true ,
. write_enabled = true ,
} ,
} ,
. colors [ 0 ] . pixel_format = SG_PIXELFORMAT_RGBA8 ,
. colors [ 0 ] . pixel_format = sapp_sgcontext ( ) . color_format ,
. label = " shadow-map-pipeline "
. label = " shadow-map-pipeline "
} ;
} ;
@ -4900,7 +4947,7 @@ Shadow_State init_shadow_state() {
desc . label = " armature-shadow-map-pipeline " ;
desc . label = " armature-shadow-map-pipeline " ;
desc . shader = sg_make_shader ( threedee_armature_shadow_mapping_shader_desc ( sg_query_backend ( ) ) ) ;
desc . shader = sg_make_shader ( threedee_armature_shadow_mapping_shader_desc ( sg_query_backend ( ) ) ) ;
sg_vertex_attr_ desc skeleton_vertex_attrs [ ] = {
sg_vertex_attr_ state skeleton_vertex_attrs [ ] = {
[ ATTR_threedee_vs_skeleton_pos_in ] . format = SG_VERTEXFORMAT_FLOAT3 ,
[ ATTR_threedee_vs_skeleton_pos_in ] . format = SG_VERTEXFORMAT_FLOAT3 ,
[ ATTR_threedee_vs_skeleton_uv_in ] . format = SG_VERTEXFORMAT_FLOAT2 ,
[ ATTR_threedee_vs_skeleton_uv_in ] . format = SG_VERTEXFORMAT_FLOAT2 ,
[ ATTR_threedee_vs_skeleton_indices_in ] . format = SG_VERTEXFORMAT_USHORT4N ,
[ ATTR_threedee_vs_skeleton_indices_in ] . format = SG_VERTEXFORMAT_USHORT4N ,
@ -5100,12 +5147,22 @@ void actually_draw_thing(DrawnThing *it, Mat4 light_space_matrix, bool for_outli
{
{
if ( for_outline )
if ( for_outline )
sg_apply_pipeline ( state . outline_mesh_pip ) ;
sg_apply_pipeline ( state . outline_mesh_pip ) ;
else if ( it - > alpha_blend )
sg_apply_pipeline ( state . threedee_alpha_blended_pip ) ;
else
else
sg_apply_pipeline ( state . threedee_pip ) ;
sg_apply_pipeline ( state . threedee_pip ) ;
sg_bindings bindings = { 0 } ;
sg_bindings bindings = { 0 } ;
bindings . fs_images [ SLOT_threedee_tex ] = it - > mesh - > image ;
bindings . fs . images [ SLOT_threedee_tex ] = it - > mesh - > image ;
if ( ! for_outline )
if ( for_outline )
bindings . fs_images [ SLOT_threedee_shadow_map ] = state . shadows . color_img ;
{
bindings . fs . samplers [ SLOT_threedee_fs_outline_smp ] = state . sampler_linear ;
}
else
{
bindings . fs . images [ SLOT_threedee_shadow_map ] = state . shadows . color_img ;
bindings . fs . samplers [ SLOT_threedee_fs_shadow_smp ] = state . sampler_linear_border ;
bindings . fs . samplers [ SLOT_threedee_fs_smp ] = state . sampler_linear ;
}
bindings . vertex_buffers [ 0 ] = it - > mesh - > loaded_buffer ;
bindings . vertex_buffers [ 0 ] = it - > mesh - > loaded_buffer ;
sg_apply_bindings ( & bindings ) ;
sg_apply_bindings ( & bindings ) ;
@ -5131,10 +5188,19 @@ void actually_draw_thing(DrawnThing *it, Mat4 light_space_matrix, bool for_outli
else
else
sg_apply_pipeline ( state . armature_pip ) ;
sg_apply_pipeline ( state . armature_pip ) ;
sg_bindings bindings = { 0 } ;
sg_bindings bindings = { 0 } ;
bindings . vs_images [ SLOT_threedee_bones_tex ] = it - > armature - > bones_texture ;
bindings . vs . images [ SLOT_threedee_bones_tex ] = it - > armature - > bones_texture ;
bindings . fs_images [ SLOT_threedee_tex ] = it - > armature - > image ;
bindings . vs . samplers [ SLOT_threedee_vs_skeleton_smp ] = state . sampler_nearest ;
if ( ! for_outline )
bindings . fs . images [ SLOT_threedee_tex ] = it - > armature - > image ;
bindings . fs_images [ SLOT_threedee_shadow_map ] = state . shadows . color_img ;
if ( for_outline )
{
bindings . fs . samplers [ SLOT_threedee_fs_outline_smp ] = state . sampler_linear ;
}
else
{
bindings . fs . images [ SLOT_threedee_shadow_map ] = state . shadows . color_img ;
bindings . fs . samplers [ SLOT_threedee_fs_shadow_smp ] = state . sampler_linear_border ;
bindings . fs . samplers [ SLOT_threedee_fs_smp ] = state . sampler_linear ;
}
bindings . vertex_buffers [ 0 ] = it - > armature - > loaded_buffer ;
bindings . vertex_buffers [ 0 ] = it - > armature - > loaded_buffer ;
sg_apply_bindings ( & bindings ) ;
sg_apply_bindings ( & bindings ) ;
@ -5278,7 +5344,8 @@ void flush_all_drawn_things(Vec3 light_dir, Vec3 cam_pos, Vec3 cam_facing, Vec3
if ( it - > mesh )
if ( it - > mesh )
{
{
sg_bindings bindings = { 0 } ;
sg_bindings bindings = { 0 } ;
bindings . fs_images [ SLOT_threedee_tex ] = it - > mesh - > image ;
bindings . fs . images [ SLOT_threedee_tex ] = it - > mesh - > image ;
bindings . fs . samplers [ SLOT_threedee_fs_shadow_mapping_smp ] = state . sampler_linear ;
bindings . vertex_buffers [ 0 ] = it - > mesh - > loaded_buffer ;
bindings . vertex_buffers [ 0 ] = it - > mesh - > loaded_buffer ;
sg_apply_bindings ( & bindings ) ;
sg_apply_bindings ( & bindings ) ;
@ -5303,8 +5370,10 @@ void flush_all_drawn_things(Vec3 light_dir, Vec3 cam_pos, Vec3 cam_facing, Vec3
if ( it - > armature )
if ( it - > armature )
{
{
sg_bindings bindings = { 0 } ;
sg_bindings bindings = { 0 } ;
bindings . vs_images [ SLOT_threedee_bones_tex ] = it - > armature - > bones_texture ;
bindings . vs . images [ SLOT_threedee_bones_tex ] = it - > armature - > bones_texture ;
bindings . fs_images [ SLOT_threedee_tex ] = it - > armature - > image ;
bindings . vs . samplers [ SLOT_threedee_vs_skeleton_smp ] = state . sampler_nearest ;
bindings . fs . images [ SLOT_threedee_tex ] = it - > armature - > image ;
bindings . fs . samplers [ SLOT_threedee_fs_shadow_mapping_smp ] = state . sampler_linear ;
bindings . vertex_buffers [ 0 ] = it - > armature - > loaded_buffer ;
bindings . vertex_buffers [ 0 ] = it - > armature - > loaded_buffer ;
sg_apply_bindings ( & bindings ) ;
sg_apply_bindings ( & bindings ) ;
@ -5330,8 +5399,8 @@ void flush_all_drawn_things(Vec3 light_dir, Vec3 cam_pos, Vec3 cam_facing, Vec3
{
{
sg_begin_pass ( state . outline_pass , & ( sg_pass_action ) {
sg_begin_pass ( state . outline_pass , & ( sg_pass_action ) {
. colors [ 0 ] = {
. colors [ 0 ] = {
. action = SG_ ACTION_CLEAR,
. load_ action = SG_ LOAD ACTION_CLEAR,
. value = { 0.0f , 0.0f , 0.0f , 0.0f } ,
. clear_ value = { 0.0f , 0.0f , 0.0f , 0.0f } ,
}
}
} ) ;
} ) ;
@ -5348,7 +5417,7 @@ void flush_all_drawn_things(Vec3 light_dir, Vec3 cam_pos, Vec3 cam_facing, Vec3
// actually draw, IMPORTANT after this drawn_this_frame is zeroed out!
// actually draw, IMPORTANT after this drawn_this_frame is zeroed out!
{
{
sg_begin_pass ( state . threedee_pass , & state . clear_everything _pass_action) ;
sg_begin_pass ( state . threedee_pass , & state . threedee_msaa _pass_action) ;
// draw meshes
// draw meshes
SLICE_ITER ( DrawnThing , drawn_this_frame )
SLICE_ITER ( DrawnThing , drawn_this_frame )
@ -5689,8 +5758,8 @@ void frame(void)
flush_all_drawn_things ( light_dir , cam_pos , facing , right ) ;
flush_all_drawn_things ( light_dir , cam_pos , facing , right ) ;
// draw the 3d render
// draw the 3d render
draw_quad ( ( DrawParams ) { quad_at ( V2 ( 0.0 , screen_size ( ) . y ) , screen_size ( ) ) , IMG ( state . threedee_pass_ image) , WHITE , . layer = LAYER_WORLD , . custom_pipeline = state . twodee_colorcorrect_pip } ) ;
draw_quad ( ( DrawParams ) { quad_at ( V2 ( 0.0 , screen_size ( ) . y ) , screen_size ( ) ) , IMG ( state . threedee_pass_ resolve_ image) , WHITE , . layer = LAYER_WORLD , . custom_pipeline = state . twodee_colorcorrect_pip } ) ;
draw_quad ( ( DrawParams ) { quad_at ( V2 ( 0.0 , screen_size ( ) . y ) , screen_size ( ) ) , IMG ( state . outline_pass_ image) , WHITE , . custom_pipeline = state . twodee_outline_pip , . layer = LAYER_UI } ) ;
draw_quad ( ( DrawParams ) { quad_at ( V2 ( 0.0 , screen_size ( ) . y ) , screen_size ( ) ) , IMG ( state . outline_pass_ resolve_ image) , WHITE , . custom_pipeline = state . twodee_outline_pip , . layer = LAYER_UI } ) ;
// 2d drawing TODO move this to when the drawing is flushed.
// 2d drawing TODO move this to when the drawing is flushed.
sg_begin_default_pass ( & state . clear_depth_buffer_pass_action , sapp_width ( ) , sapp_height ( ) ) ;
sg_begin_default_pass ( & state . clear_depth_buffer_pass_action , sapp_width ( ) , sapp_height ( ) ) ;
@ -7031,7 +7100,7 @@ ISANERROR("Don't know how to do this stuff on this platform.")
{
{
Vec2 depth_size = V2 ( 200.0f , 200.0f ) ;
Vec2 depth_size = V2 ( 200.0f , 200.0f ) ;
draw_quad ( ( DrawParams ) { quad_at ( V2 ( screen_size ( ) . x - depth_size . x , screen_size ( ) . y ) , depth_size ) , IMG ( state . shadows . color_img ) , WHITE , . layer = LAYER_UI_FG } ) ;
draw_quad ( ( DrawParams ) { quad_at ( V2 ( screen_size ( ) . x - depth_size . x , screen_size ( ) . y ) , depth_size ) , IMG ( state . shadows . color_img ) , WHITE , . layer = LAYER_UI_FG } ) ;
draw_quad ( ( DrawParams ) { quad_at ( V2 ( 0.0 , screen_size ( ) . y / 2.0f ) , MulV2F ( screen_size ( ) , 0.1f ) ) , IMG ( state . outline_pass_ image) , WHITE , . layer = LAYER_UI_FG } ) ;
draw_quad ( ( DrawParams ) { quad_at ( V2 ( 0.0 , screen_size ( ) . y / 2.0f ) , MulV2F ( screen_size ( ) , 0.1f ) ) , IMG ( state . outline_pass_ resolve_ image) , WHITE , . layer = LAYER_UI_FG } ) ;
Vec3 view_cam_pos = MulM4V4 ( InvGeneralM4 ( view ) , V4 ( 0 , 0 , 0 , 1 ) ) . xyz ;
Vec3 view_cam_pos = MulM4V4 ( InvGeneralM4 ( view ) , V4 ( 0 , 0 , 0 , 1 ) ) . xyz ;
//if(view_cam_pos.y >= 4.900f) // causes nan if not true... not good...
//if(view_cam_pos.y >= 4.900f) // causes nan if not true... not good...
@ -7134,6 +7203,7 @@ ISANERROR("Don't know how to do this stuff on this platform.")
Vec2 * points = d . quad . points ;
Vec2 * points = d . quad . points ;
threedee_twodee_fs_params_t params = {
threedee_twodee_fs_params_t params = {
. tint = d . tint ,
. tint = d . tint ,
. time = ( float ) fmod ( elapsed_time , 100 ) ,
} ;
} ;
params . alpha_clip_threshold = d . alpha_clip_threshold ;
params . alpha_clip_threshold = d . alpha_clip_threshold ;
if ( d . do_clipping )
if ( d . do_clipping )
@ -7192,10 +7262,10 @@ ISANERROR("Don't know how to do this stuff on this platform.")
} ;
} ;
// convert to uv space
// convert to uv space
sg_image_ info info = sg_query_image_info ( d . image ) ;
sg_image_ desc desc = sg_query_image_desc ( d . image ) ;
for ( int i = 0 ; i < 4 ; i + + )
for ( int i = 0 ; i < 4 ; i + + )
{
{
tex_coords [ i ] = DivV2 ( tex_coords [ i ] , V2 ( ( float ) info. width , ( float ) info . height ) ) ;
tex_coords [ i ] = DivV2 ( tex_coords [ i ] , V2 ( ( float ) desc. width , ( float ) desc . height ) ) ;
}
}
for ( int i = 0 ; i < 4 ; i + + )
for ( int i = 0 ; i < 4 ; i + + )
{
{
@ -7563,13 +7633,13 @@ sapp_desc sokol_main(int argc, char* argv[])
. frame_cb = frame ,
. frame_cb = frame ,
. cleanup_cb = cleanup ,
. cleanup_cb = cleanup ,
. event_cb = event ,
. event_cb = event ,
. sample_count = SAMPLE_COUNT ,
. sample_count = 1 ,
. width = 800 ,
. width = 800 ,
. height = 600 ,
. height = 600 ,
//.gl_force_gles2 = true, not sure why this was here in example, look into
. window_title = " Dante's Cowboy " ,
. window_title = " Dante's Cowboy " ,
. win32_console_attach = true ,
. win32_console_attach = true ,
. win32_console_create = true ,
. win32_console_create = true ,
. icon . sokol_default = true ,
. icon . sokol_default = true ,
. logger . func = slog_func ,
} ;
} ;
}
}