From 6af9aa71a85def3d1a1f13c879b2bf37ae057516 Mon Sep 17 00:00:00 2001 From: Cameron Reikes Date: Thu, 9 Feb 2023 14:56:52 -0800 Subject: [PATCH] Animated --- .gitignore | 3 + build_desktop_debug.bat | 2 +- main.c | 51 ++++++- quad-sapp.glsl.h | 304 ++++++++++++++++++++++++++-------------- quad.glsl | 15 +- 5 files changed, 255 insertions(+), 120 deletions(-) diff --git a/.gitignore b/.gitignore index c6127b3..256dca7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# debugging config +desktop.rdbg + # Prerequisites *.d diff --git a/build_desktop_debug.bat b/build_desktop_debug.bat index 5eb53ae..3b6f5fd 100644 --- a/build_desktop_debug.bat +++ b/build_desktop_debug.bat @@ -3,7 +3,7 @@ @REM https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category?view=msvc-170 call shadergen.bat || goto :error -cl /Ithirdparty /W3 /WX main.c || goto :error +cl /Ithirdparty /W3 /Zi /WX main.c || goto :error goto :EOF :error diff --git a/main.c b/main.c index bd5310e..764739a 100644 --- a/main.c +++ b/main.c @@ -4,11 +4,14 @@ #endif #include "sokol_app.h" #include "sokol_gfx.h" +#include "sokol_time.h" #include "sokol_glue.h" #include "quad-sapp.glsl.h" #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" +#include + static struct { sg_pass_action pass_action; sg_pipeline pip; @@ -16,14 +19,14 @@ static struct { } state; - void init(void) { + stm_setup(); sg_setup(&(sg_desc){ .context = sapp_sgcontext() }); // load the image - state.bind.fs_images[SLOT_tex] = sg_alloc_image(); + state.bind.fs_images[SLOT_quad_tex] = sg_alloc_image(); int png_width, png_height, num_channels; const int desired_channels = 4; stbi_uc* pixels = stbi_load( @@ -35,8 +38,8 @@ void init(void) { .width = png_width, .height = png_height, .pixel_format = SG_PIXELFORMAT_RGBA8, - .min_filter = SG_FILTER_LINEAR, - .mag_filter = SG_FILTER_LINEAR, + .min_filter = SG_FILTER_NEAREST, + .mag_filter = SG_FILTER_NEAREST, .data.subimage[0][0] = { .ptr = pixels, .size = (size_t)(png_width * png_height * 4), @@ -68,7 +71,7 @@ void init(void) { /* a shader (use separate shader sources here */ - sg_shader shd = sg_make_shader(quad_shader_desc(sg_query_backend())); + sg_shader shd = sg_make_shader(quad_program_shader_desc(sg_query_backend())); /* a pipeline state object */ state.pip = sg_make_pipeline(&(sg_pipeline_desc){ @@ -76,8 +79,8 @@ void init(void) { .index_type = SG_INDEXTYPE_UINT16, .layout = { .attrs = { - [ATTR_vs_position].format = SG_VERTEXFORMAT_FLOAT2, - [ATTR_vs_texcoord0].format = SG_VERTEXFORMAT_FLOAT2, + [ATTR_quad_vs_position].format = SG_VERTEXFORMAT_FLOAT2, + [ATTR_quad_vs_texcoord0].format = SG_VERTEXFORMAT_FLOAT2, } }, .label = "quad-pipeline" @@ -89,10 +92,44 @@ void init(void) { }; } +double time = 0.0; +uint64_t last_frame_time; void frame(void) { + // time + { + double dt = stm_sec(stm_diff(stm_now(), last_frame_time)); + time += dt; + last_frame_time = stm_now(); + } + sg_begin_default_pass(&state.pass_action, sapp_width(), sapp_height()); sg_apply_pipeline(state.pip); sg_apply_bindings(&state.bind); + int index = (int)floor(time/0.3); + + // need to compute upper_left and lower_right still or nothing will display + sg_image img = state.bind.fs_images[0]; + sg_image_info info = sg_query_image_info(img); + + quad_fs_params_t params = { + .tint = {1.0, 1.0, 1.0, 1.0}, + .upper_left = {0.5, 0.0}, + .lower_right = {1.0, 1.0}, + }; + int cell_size = 110; + assert(info.width % cell_size == 0); + int upper_left = (index % (info.width/cell_size)) * cell_size; + params.upper_left[0] = (float)upper_left; + params.lower_right[0] = params.upper_left[0] + (float)cell_size; + params.lower_right[1] = (float)cell_size; + + // transform from pixels to uv space + params.upper_left[0] /= (float)info.width; + params.lower_right[0] /= (float)info.width; + params.upper_left[1] /= (float)info.height; + params.lower_right[1] /= (float)info.height; + + sg_apply_uniforms(SG_SHADERSTAGE_FS, SLOT_quad_fs_params, &SG_RANGE(params)); sg_draw(0, 6, 1); sg_end_pass(); sg_commit(); diff --git a/quad-sapp.glsl.h b/quad-sapp.glsl.h index 530d87c..16554c1 100644 --- a/quad-sapp.glsl.h +++ b/quad-sapp.glsl.h @@ -8,37 +8,49 @@ Overview: - Shader program 'quad': - Get shader desc: quad_shader_desc(sg_query_backend()); + Shader program 'program': + Get shader desc: quad_program_shader_desc(sg_query_backend()); Vertex shader: vs Attribute slots: - ATTR_vs_position = 0 - ATTR_vs_texcoord0 = 1 + ATTR_quad_vs_position = 0 + ATTR_quad_vs_texcoord0 = 1 Fragment shader: fs + Uniform block 'fs_params': + C struct: quad_fs_params_t + Bind slot: SLOT_quad_fs_params = 0 Image 'tex': Type: SG_IMAGETYPE_2D Component Type: SG_SAMPLERTYPE_FLOAT - Bind slot: SLOT_tex = 0 + Bind slot: SLOT_quad_tex = 0 Shader descriptor structs: - sg_shader quad = sg_make_shader(quad_shader_desc(sg_query_backend())); + sg_shader program = sg_make_shader(quad_program_shader_desc(sg_query_backend())); Vertex attribute locations for vertex shader 'vs': sg_pipeline pip = sg_make_pipeline(&(sg_pipeline_desc){ .layout = { .attrs = { - [ATTR_vs_position] = { ... }, - [ATTR_vs_texcoord0] = { ... }, + [ATTR_quad_vs_position] = { ... }, + [ATTR_quad_vs_texcoord0] = { ... }, }, }, ...}); Image bind slots, use as index in sg_bindings.vs_images[] or .fs_images[] - SLOT_tex = 0; + SLOT_quad_tex = 0; + + Bind slot and C-struct for uniform block 'fs_params': + + quad_fs_params_t fs_params = { + .tint = ...; + .upper_left = ...; + .lower_right = ...; + }; + sg_apply_uniforms(SG_SHADERSTAGE_[VS|FS], SLOT_quad_fs_params, &SG_RANGE(fs_params)); */ #include @@ -52,9 +64,17 @@ #define SOKOL_SHDC_ALIGN(a) __attribute__((aligned(a))) #endif #endif -#define ATTR_vs_position (0) -#define ATTR_vs_texcoord0 (1) -#define SLOT_tex (0) +#define ATTR_quad_vs_position (0) +#define ATTR_quad_vs_texcoord0 (1) +#define SLOT_quad_tex (0) +#define SLOT_quad_fs_params (0) +#pragma pack(push,1) +SOKOL_SHDC_ALIGN(16) typedef struct quad_fs_params_t { + float tint[4]; + float upper_left[2]; + float lower_right[2]; +} quad_fs_params_t; +#pragma pack(pop) /* #version 330 @@ -69,7 +89,7 @@ } */ -static const char vs_source_glsl330[189] = { +static const char quad_vs_source_glsl330[189] = { 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x6c,0x61, 0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, 0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x6f,0x73,0x69,0x74, @@ -86,28 +106,37 @@ static const char vs_source_glsl330[189] = { /* #version 330 + uniform vec4 fs_params[2]; uniform sampler2D tex; - layout(location = 0) out vec4 frag_color; in vec2 uv; + layout(location = 0) out vec4 frag_color; void main() { - frag_color = texture(tex, uv); + frag_color = texture(tex, vec2(mix(fs_params[1].x, fs_params[1].z, uv.x), mix(fs_params[1].y, fs_params[1].w, uv.y))) * fs_params[0]; } */ -static const char fs_source_glsl330[146] = { +static const char quad_fs_source_glsl330[276] = { 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e, - 0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20, - 0x74,0x65,0x78,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63, - 0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76, - 0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a, - 0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x0a,0x76,0x6f,0x69, - 0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x74, - 0x75,0x72,0x65,0x28,0x74,0x65,0x78,0x2c,0x20,0x75,0x76,0x29,0x3b,0x0a,0x7d,0x0a, - 0x0a,0x00, + 0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x73,0x5f,0x70,0x61, + 0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x3b,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d, + 0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x74,0x65,0x78,0x3b,0x0a, + 0x0a,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79, + 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30, + 0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f, + 0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69, + 0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, + 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74, + 0x65,0x78,0x2c,0x20,0x76,0x65,0x63,0x32,0x28,0x6d,0x69,0x78,0x28,0x66,0x73,0x5f, + 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2e,0x78,0x2c,0x20,0x66,0x73,0x5f, + 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2e,0x7a,0x2c,0x20,0x75,0x76,0x2e, + 0x78,0x29,0x2c,0x20,0x6d,0x69,0x78,0x28,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, + 0x73,0x5b,0x31,0x5d,0x2e,0x79,0x2c,0x20,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, + 0x73,0x5b,0x31,0x5d,0x2e,0x77,0x2c,0x20,0x75,0x76,0x2e,0x79,0x29,0x29,0x29,0x20, + 0x2a,0x20,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x3b,0x0a, + 0x7d,0x0a,0x0a,0x00, }; /* static float4 gl_Position; @@ -147,7 +176,7 @@ static const char fs_source_glsl330[146] = { return stage_output; } */ -static const char vs_source_hlsl5[728] = { +static const char quad_vs_source_hlsl5[728] = { 0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x6c, 0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69, 0x63,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f, @@ -196,11 +225,18 @@ static const char vs_source_hlsl5[728] = { 0x70,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x00, }; /* + cbuffer fs_params : register(b0) + { + float4 _15_tint : packoffset(c0); + float2 _15_upper_left : packoffset(c1); + float2 _15_lower_right : packoffset(c1.z); + }; + Texture2D tex : register(t0); SamplerState _tex_sampler : register(s0); - static float4 frag_color; static float2 uv; + static float4 frag_color; struct SPIRV_Cross_Input { @@ -212,11 +248,12 @@ static const char vs_source_hlsl5[728] = { float4 frag_color : SV_Target0; }; - #line 13 "quad.glsl" + #line 18 "quad.glsl" void frag_main() { - #line 13 "quad.glsl" - frag_color = tex.Sample(_tex_sampler, uv); + #line 18 "quad.glsl" + #line 19 "quad.glsl" + frag_color = tex.Sample(_tex_sampler, float2(lerp(_15_upper_left.x, _15_lower_right.x, uv.x), lerp(_15_upper_left.y, _15_lower_right.y, uv.y))) * _15_tint; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) @@ -228,43 +265,62 @@ static const char vs_source_hlsl5[728] = { return stage_output; } */ -static const char fs_source_hlsl5[569] = { - 0x54,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x44,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x34, - 0x3e,0x20,0x74,0x65,0x78,0x20,0x3a,0x20,0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72, - 0x28,0x74,0x30,0x29,0x3b,0x0a,0x53,0x61,0x6d,0x70,0x6c,0x65,0x72,0x53,0x74,0x61, - 0x74,0x65,0x20,0x5f,0x74,0x65,0x78,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20, - 0x3a,0x20,0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x28,0x73,0x30,0x29,0x3b,0x0a, - 0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66, - 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69, - 0x63,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x75,0x76,0x3b,0x0a,0x0a,0x73,0x74, - 0x72,0x75,0x63,0x74,0x20,0x53,0x50,0x49,0x52,0x56,0x5f,0x43,0x72,0x6f,0x73,0x73, - 0x5f,0x49,0x6e,0x70,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x32,0x20,0x75,0x76,0x20,0x3a,0x20,0x54,0x45,0x58,0x43,0x4f,0x4f,0x52, - 0x44,0x30,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x53, - 0x50,0x49,0x52,0x56,0x5f,0x43,0x72,0x6f,0x73,0x73,0x5f,0x4f,0x75,0x74,0x70,0x75, - 0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66, - 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3a,0x20,0x53,0x56,0x5f,0x54, - 0x61,0x72,0x67,0x65,0x74,0x30,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x23,0x6c,0x69,0x6e, - 0x65,0x20,0x31,0x33,0x20,0x22,0x71,0x75,0x61,0x64,0x2e,0x67,0x6c,0x73,0x6c,0x22, - 0x0a,0x76,0x6f,0x69,0x64,0x20,0x66,0x72,0x61,0x67,0x5f,0x6d,0x61,0x69,0x6e,0x28, - 0x29,0x0a,0x7b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x33,0x20,0x22,0x71,0x75, - 0x61,0x64,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61, - 0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x2e,0x53,0x61, - 0x6d,0x70,0x6c,0x65,0x28,0x5f,0x74,0x65,0x78,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65, - 0x72,0x2c,0x20,0x75,0x76,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x53,0x50,0x49,0x52,0x56, - 0x5f,0x43,0x72,0x6f,0x73,0x73,0x5f,0x4f,0x75,0x74,0x70,0x75,0x74,0x20,0x6d,0x61, - 0x69,0x6e,0x28,0x53,0x50,0x49,0x52,0x56,0x5f,0x43,0x72,0x6f,0x73,0x73,0x5f,0x49, - 0x6e,0x70,0x75,0x74,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74, - 0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x73,0x74,0x61, - 0x67,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74,0x2e,0x75,0x76,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x66,0x72,0x61,0x67,0x5f,0x6d,0x61,0x69,0x6e,0x28,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x53,0x50,0x49,0x52,0x56,0x5f,0x43,0x72,0x6f,0x73,0x73,0x5f,0x4f,0x75, - 0x74,0x70,0x75,0x74,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x6f,0x75,0x74,0x70,0x75, - 0x74,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x6f,0x75,0x74, - 0x70,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d, - 0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x6f,0x75, - 0x74,0x70,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x00, +static const char quad_fs_source_hlsl5[871] = { + 0x63,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, + 0x73,0x20,0x3a,0x20,0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x28,0x62,0x30,0x29, + 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x31, + 0x35,0x5f,0x74,0x69,0x6e,0x74,0x20,0x3a,0x20,0x70,0x61,0x63,0x6b,0x6f,0x66,0x66, + 0x73,0x65,0x74,0x28,0x63,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x32,0x20,0x5f,0x31,0x35,0x5f,0x75,0x70,0x70,0x65,0x72,0x5f,0x6c,0x65, + 0x66,0x74,0x20,0x3a,0x20,0x70,0x61,0x63,0x6b,0x6f,0x66,0x66,0x73,0x65,0x74,0x28, + 0x63,0x31,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20, + 0x5f,0x31,0x35,0x5f,0x6c,0x6f,0x77,0x65,0x72,0x5f,0x72,0x69,0x67,0x68,0x74,0x20, + 0x3a,0x20,0x70,0x61,0x63,0x6b,0x6f,0x66,0x66,0x73,0x65,0x74,0x28,0x63,0x31,0x2e, + 0x7a,0x29,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x54,0x65,0x78,0x74,0x75,0x72,0x65,0x32, + 0x44,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x3e,0x20,0x74,0x65,0x78,0x20,0x3a,0x20, + 0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x28,0x74,0x30,0x29,0x3b,0x0a,0x53,0x61, + 0x6d,0x70,0x6c,0x65,0x72,0x53,0x74,0x61,0x74,0x65,0x20,0x5f,0x74,0x65,0x78,0x5f, + 0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20,0x3a,0x20,0x72,0x65,0x67,0x69,0x73,0x74, + 0x65,0x72,0x28,0x73,0x30,0x29,0x3b,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x75,0x76,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69, + 0x63,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, + 0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x53,0x50,0x49, + 0x52,0x56,0x5f,0x43,0x72,0x6f,0x73,0x73,0x5f,0x49,0x6e,0x70,0x75,0x74,0x0a,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x75,0x76,0x20,0x3a, + 0x20,0x54,0x45,0x58,0x43,0x4f,0x4f,0x52,0x44,0x30,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, + 0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x53,0x50,0x49,0x52,0x56,0x5f,0x43,0x72,0x6f, + 0x73,0x73,0x5f,0x4f,0x75,0x74,0x70,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, + 0x72,0x20,0x3a,0x20,0x53,0x56,0x5f,0x54,0x61,0x72,0x67,0x65,0x74,0x30,0x3b,0x0a, + 0x7d,0x3b,0x0a,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x38,0x20,0x22,0x71,0x75, + 0x61,0x64,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x76,0x6f,0x69,0x64,0x20,0x66,0x72, + 0x61,0x67,0x5f,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x23,0x6c,0x69,0x6e, + 0x65,0x20,0x31,0x38,0x20,0x22,0x71,0x75,0x61,0x64,0x2e,0x67,0x6c,0x73,0x6c,0x22, + 0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x39,0x20,0x22,0x71,0x75,0x61,0x64,0x2e, + 0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, + 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x2e,0x53,0x61,0x6d,0x70,0x6c, + 0x65,0x28,0x5f,0x74,0x65,0x78,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x2c,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x6c,0x65,0x72,0x70,0x28,0x5f,0x31,0x35,0x5f, + 0x75,0x70,0x70,0x65,0x72,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x78,0x2c,0x20,0x5f,0x31, + 0x35,0x5f,0x6c,0x6f,0x77,0x65,0x72,0x5f,0x72,0x69,0x67,0x68,0x74,0x2e,0x78,0x2c, + 0x20,0x75,0x76,0x2e,0x78,0x29,0x2c,0x20,0x6c,0x65,0x72,0x70,0x28,0x5f,0x31,0x35, + 0x5f,0x75,0x70,0x70,0x65,0x72,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x79,0x2c,0x20,0x5f, + 0x31,0x35,0x5f,0x6c,0x6f,0x77,0x65,0x72,0x5f,0x72,0x69,0x67,0x68,0x74,0x2e,0x79, + 0x2c,0x20,0x75,0x76,0x2e,0x79,0x29,0x29,0x29,0x20,0x2a,0x20,0x5f,0x31,0x35,0x5f, + 0x74,0x69,0x6e,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x53,0x50,0x49,0x52,0x56,0x5f,0x43, + 0x72,0x6f,0x73,0x73,0x5f,0x4f,0x75,0x74,0x70,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e, + 0x28,0x53,0x50,0x49,0x52,0x56,0x5f,0x43,0x72,0x6f,0x73,0x73,0x5f,0x49,0x6e,0x70, + 0x75,0x74,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74,0x29,0x0a, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x20,0x3d,0x20,0x73,0x74,0x61,0x67,0x65, + 0x5f,0x69,0x6e,0x70,0x75,0x74,0x2e,0x75,0x76,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x72,0x61,0x67,0x5f,0x6d,0x61,0x69,0x6e,0x28,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x53,0x50,0x49,0x52,0x56,0x5f,0x43,0x72,0x6f,0x73,0x73,0x5f,0x4f,0x75,0x74,0x70, + 0x75,0x74,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x6f,0x75,0x74,0x70,0x75,0x74,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x6f,0x75,0x74,0x70,0x75, + 0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66, + 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6e,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x6f,0x75,0x74,0x70, + 0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x00, }; /* #include @@ -296,7 +352,7 @@ static const char fs_source_hlsl5[569] = { } */ -static const char vs_source_metal_macos[500] = { +static const char quad_vs_source_metal_macos[500] = { 0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f, 0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65, 0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a, @@ -336,6 +392,13 @@ static const char vs_source_metal_macos[500] = { using namespace metal; + struct fs_params + { + float4 tint; + float2 upper_left; + float2 lower_right; + }; + struct main0_out { float4 frag_color [[color(0)]]; @@ -346,50 +409,68 @@ static const char vs_source_metal_macos[500] = { float2 uv [[user(locn0)]]; }; - #line 13 "quad.glsl" - fragment main0_out main0(main0_in in [[stage_in]], texture2d tex [[texture(0)]], sampler texSmplr [[sampler(0)]]) + #line 18 "quad.glsl" + fragment main0_out main0(main0_in in [[stage_in]], constant fs_params& _15 [[buffer(0)]], texture2d tex [[texture(0)]], sampler texSmplr [[sampler(0)]]) { main0_out out = {}; - #line 13 "quad.glsl" - out.frag_color = tex.sample(texSmplr, in.uv); + #line 18 "quad.glsl" + #line 19 "quad.glsl" + out.frag_color = tex.sample(texSmplr, float2(mix(_15.upper_left.x, _15.lower_right.x, in.uv.x), mix(_15.upper_left.y, _15.lower_right.y, in.uv.y))) * _15.tint; return out; } */ -static const char fs_source_metal_macos[443] = { +static const char quad_fs_source_metal_macos[704] = { 0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f, 0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65, 0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a, 0x75,0x73,0x69,0x6e,0x67,0x20,0x6e,0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20, - 0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d, - 0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72, - 0x20,0x5b,0x5b,0x63,0x6f,0x6c,0x6f,0x72,0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d, - 0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f, - 0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20, - 0x75,0x76,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29, - 0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x33, - 0x20,0x22,0x71,0x75,0x61,0x64,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x66,0x72,0x61, - 0x67,0x6d,0x65,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20, - 0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69, - 0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20, - 0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e, - 0x20,0x74,0x65,0x78,0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x30, - 0x29,0x5d,0x5d,0x2c,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20,0x74,0x65,0x78, - 0x53,0x6d,0x70,0x6c,0x72,0x20,0x5b,0x5b,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x28, - 0x30,0x29,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e, - 0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a, - 0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x33,0x20,0x22,0x71,0x75,0x61,0x64,0x2e,0x67, - 0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61, - 0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x2e,0x73,0x61, - 0x6d,0x70,0x6c,0x65,0x28,0x74,0x65,0x78,0x53,0x6d,0x70,0x6c,0x72,0x2c,0x20,0x69, - 0x6e,0x2e,0x75,0x76,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x66, + 0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x34,0x20,0x74,0x69,0x6e,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x75,0x70,0x70,0x65,0x72,0x5f,0x6c,0x65,0x66, + 0x74,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x6c,0x6f, + 0x77,0x65,0x72,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73, + 0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,0x72,0x61, + 0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x5b,0x5b,0x63,0x6f,0x6c,0x6f,0x72,0x28, + 0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74, + 0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x75,0x76,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72, + 0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x23, + 0x6c,0x69,0x6e,0x65,0x20,0x31,0x38,0x20,0x22,0x71,0x75,0x61,0x64,0x2e,0x67,0x6c, + 0x73,0x6c,0x22,0x0a,0x66,0x72,0x61,0x67,0x6d,0x65,0x6e,0x74,0x20,0x6d,0x61,0x69, + 0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69, + 0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65, + 0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20, + 0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x26,0x20,0x5f,0x31,0x35,0x20,0x5b, + 0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65, + 0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x74, + 0x65,0x78,0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x30,0x29,0x5d, + 0x5d,0x2c,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20,0x74,0x65,0x78,0x53,0x6d, + 0x70,0x6c,0x72,0x20,0x5b,0x5b,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x28,0x30,0x29, + 0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f, + 0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a,0x23,0x6c, + 0x69,0x6e,0x65,0x20,0x31,0x38,0x20,0x22,0x71,0x75,0x61,0x64,0x2e,0x67,0x6c,0x73, + 0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x39,0x20,0x22,0x71,0x75,0x61, + 0x64,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e, + 0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78, + 0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x74,0x65,0x78,0x53,0x6d,0x70,0x6c,0x72, + 0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x6d,0x69,0x78,0x28,0x5f,0x31,0x35, + 0x2e,0x75,0x70,0x70,0x65,0x72,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x78,0x2c,0x20,0x5f, + 0x31,0x35,0x2e,0x6c,0x6f,0x77,0x65,0x72,0x5f,0x72,0x69,0x67,0x68,0x74,0x2e,0x78, + 0x2c,0x20,0x69,0x6e,0x2e,0x75,0x76,0x2e,0x78,0x29,0x2c,0x20,0x6d,0x69,0x78,0x28, + 0x5f,0x31,0x35,0x2e,0x75,0x70,0x70,0x65,0x72,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x79, + 0x2c,0x20,0x5f,0x31,0x35,0x2e,0x6c,0x6f,0x77,0x65,0x72,0x5f,0x72,0x69,0x67,0x68, + 0x74,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x2e,0x75,0x76,0x2e,0x79,0x29,0x29,0x29,0x20, + 0x2a,0x20,0x5f,0x31,0x35,0x2e,0x74,0x69,0x6e,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + }; #if !defined(SOKOL_GFX_INCLUDED) #error "Please include sokol_gfx.h before quad-sapp.glsl.h" #endif -static inline const sg_shader_desc* quad_shader_desc(sg_backend backend) { +static inline const sg_shader_desc* quad_program_shader_desc(sg_backend backend) { if (backend == SG_BACKEND_GLCORE33) { static sg_shader_desc desc; static bool valid; @@ -397,14 +478,19 @@ static inline const sg_shader_desc* quad_shader_desc(sg_backend backend) { valid = true; desc.attrs[0].name = "position"; desc.attrs[1].name = "texcoord0"; - desc.vs.source = vs_source_glsl330; + desc.vs.source = quad_vs_source_glsl330; desc.vs.entry = "main"; - desc.fs.source = fs_source_glsl330; + desc.fs.source = quad_fs_source_glsl330; desc.fs.entry = "main"; + desc.fs.uniform_blocks[0].size = 32; + desc.fs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; + desc.fs.uniform_blocks[0].uniforms[0].name = "fs_params"; + desc.fs.uniform_blocks[0].uniforms[0].type = SG_UNIFORMTYPE_FLOAT4; + desc.fs.uniform_blocks[0].uniforms[0].array_count = 2; desc.fs.images[0].name = "tex"; desc.fs.images[0].image_type = SG_IMAGETYPE_2D; desc.fs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; - desc.label = "quad_shader"; + desc.label = "quad_program_shader"; } return &desc; } @@ -417,16 +503,18 @@ static inline const sg_shader_desc* quad_shader_desc(sg_backend backend) { desc.attrs[0].sem_index = 0; desc.attrs[1].sem_name = "TEXCOORD"; desc.attrs[1].sem_index = 1; - desc.vs.source = vs_source_hlsl5; + desc.vs.source = quad_vs_source_hlsl5; desc.vs.d3d11_target = "vs_5_0"; desc.vs.entry = "main"; - desc.fs.source = fs_source_hlsl5; + desc.fs.source = quad_fs_source_hlsl5; desc.fs.d3d11_target = "ps_5_0"; desc.fs.entry = "main"; + desc.fs.uniform_blocks[0].size = 32; + desc.fs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; desc.fs.images[0].name = "tex"; desc.fs.images[0].image_type = SG_IMAGETYPE_2D; desc.fs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; - desc.label = "quad_shader"; + desc.label = "quad_program_shader"; } return &desc; } @@ -435,14 +523,16 @@ static inline const sg_shader_desc* quad_shader_desc(sg_backend backend) { static bool valid; if (!valid) { valid = true; - desc.vs.source = vs_source_metal_macos; + desc.vs.source = quad_vs_source_metal_macos; desc.vs.entry = "main0"; - desc.fs.source = fs_source_metal_macos; + desc.fs.source = quad_fs_source_metal_macos; desc.fs.entry = "main0"; + desc.fs.uniform_blocks[0].size = 32; + desc.fs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; desc.fs.images[0].name = "tex"; desc.fs.images[0].image_type = SG_IMAGETYPE_2D; desc.fs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; - desc.label = "quad_shader"; + desc.label = "quad_program_shader"; } return &desc; } diff --git a/quad.glsl b/quad.glsl index 809e2ba..30b20a3 100644 --- a/quad.glsl +++ b/quad.glsl @@ -1,4 +1,5 @@ -/* quad vertex shader */ +@module quad + @vs vs in vec2 position; in vec2 texcoord0; @@ -10,18 +11,22 @@ void main() { } @end -/* quad fragment shader */ @fs fs uniform sampler2D tex; +uniform fs_params { + vec4 tint; + vec2 upper_left; + vec2 lower_right; +}; in vec2 uv; out vec4 frag_color; void main() { - frag_color = texture(tex, uv); + vec2 actual_position = vec2(mix(upper_left.x, lower_right.x, uv.x), mix(upper_left.y, lower_right.y, uv.y)); + frag_color = texture(tex, actual_position) * tint; } @end -/* quad shader program */ -@program quad vs fs +@program program vs fs