Spinning cube. Very fragile, don't touch

This commit is contained in:
jesse 2026-02-23 15:36:52 -08:00
parent b497d1b34c
commit 9ddaff5ad5
7 changed files with 853 additions and 101 deletions

29
source/basic.glsl Normal file
View file

@ -0,0 +1,29 @@
@vs vs
in vec4 pos;
in vec4 vcolor;
out vec4 color;
layout(binding = 0) uniform UBO {
mat4 model;
mat4 view;
mat4 proj;
} ubo;
void main() {
color = vcolor;
mat4 mvp = ubo.model*ubo.view*ubo.proj;
gl_Position = ubo.model*ubo.view*ubo.proj*vec4(pos.xyz, 1.0);
}
@end
@fs fs
in vec4 color;
out vec4 frag_color;
void main() {
frag_color = color;
}
@end
@program basic vs fs
// thirdparty\sokol\sokol-shdc-windows.exe --input source\basic.glsl --output source\basic.glsl.h --slang glsl430:hlsl5:metal_macos

451
source/basic.glsl.h Normal file
View file

@ -0,0 +1,451 @@
#pragma once
/*
#version:1# (machine generated, don't edit!)
Generated by sokol-shdc (https://github.com/floooh/sokol-tools)
Cmdline:
sokol-shdc --input source\basic.glsl --output source\basic.glsl.h --slang glsl430:hlsl5:metal_macos
Overview:
=========
Shader program: 'basic':
Get shader desc: basic_shader_desc(sg_query_backend());
Vertex Shader: vs
Fragment Shader: fs
Attributes:
ATTR_basic_pos => 0
ATTR_basic_vcolor => 1
Bindings:
Uniform block 'UBO':
C struct: UBO_t
Bind slot: UB_UBO => 0
*/
#if !defined(SOKOL_GFX_INCLUDED)
#error "Please include sokol_gfx.h before basic.glsl.h"
#endif
#if !defined(SOKOL_SHDC_ALIGN)
#if defined(_MSC_VER)
#define SOKOL_SHDC_ALIGN(a) __declspec(align(a))
#else
#define SOKOL_SHDC_ALIGN(a) __attribute__((aligned(a)))
#endif
#endif
#define ATTR_basic_pos (0)
#define ATTR_basic_vcolor (1)
#define UB_UBO (0)
#pragma pack(push,1)
SOKOL_SHDC_ALIGN(16) typedef struct UBO_t {
float model[16];
float view[16];
float proj[16];
} UBO_t;
#pragma pack(pop)
/*
#version 430
uniform vec4 UBO[12];
layout(location = 0) out vec4 color;
layout(location = 1) in vec4 vcolor;
layout(location = 0) in vec4 pos;
void main()
{
color = vcolor;
gl_Position = ((mat4(UBO[0], UBO[1], UBO[2], UBO[3]) * mat4(UBO[4], UBO[5], UBO[6], UBO[7])) * mat4(UBO[8], UBO[9], UBO[10], UBO[11])) * vec4(pos.xyz, 1.0);
}
*/
static const uint8_t vs_source_glsl430[344] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x75,0x6e,
0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x55,0x42,0x4f,0x5b,0x31,
0x32,0x5d,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,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,
0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,
0x20,0x76,0x65,0x63,0x34,0x20,0x76,0x63,0x6f,0x6c,0x6f,0x72,0x3b,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,0x34,0x20,0x70,0x6f,0x73,0x3b,0x0a,
0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,
0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x63,0x6f,0x6c,0x6f,
0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,
0x6f,0x6e,0x20,0x3d,0x20,0x28,0x28,0x6d,0x61,0x74,0x34,0x28,0x55,0x42,0x4f,0x5b,
0x30,0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x31,0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,
0x32,0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x6d,0x61,
0x74,0x34,0x28,0x55,0x42,0x4f,0x5b,0x34,0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x35,
0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x36,0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x37,
0x5d,0x29,0x29,0x20,0x2a,0x20,0x6d,0x61,0x74,0x34,0x28,0x55,0x42,0x4f,0x5b,0x38,
0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x39,0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x31,
0x30,0x5d,0x2c,0x20,0x55,0x42,0x4f,0x5b,0x31,0x31,0x5d,0x29,0x29,0x20,0x2a,0x20,
0x76,0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,
0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
/*
#version 430
layout(location = 0) out vec4 frag_color;
layout(location = 0) in vec4 color;
void main()
{
frag_color = color;
}
*/
static const uint8_t fs_source_glsl430[135] = {
0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,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,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,
0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,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,0x34,0x20,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,0x63,0x6f,0x6c,0x6f,
0x72,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
/*
cbuffer UBO : register(b0)
{
row_major float4x4 ubo_model : packoffset(c0);
row_major float4x4 ubo_view : packoffset(c4);
row_major float4x4 ubo_proj : packoffset(c8);
};
static float4 gl_Position;
static float4 color;
static float4 vcolor;
static float4 pos;
struct SPIRV_Cross_Input
{
float4 pos : TEXCOORD0;
float4 vcolor : TEXCOORD1;
};
struct SPIRV_Cross_Output
{
float4 color : TEXCOORD0;
float4 gl_Position : SV_Position;
};
void vert_main()
{
color = vcolor;
gl_Position = mul(float4(pos.xyz, 1.0f), mul(ubo_proj, mul(ubo_view, ubo_model)));
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
vcolor = stage_input.vcolor;
pos = stage_input.pos;
vert_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_Position = gl_Position;
stage_output.color = color;
return stage_output;
}
*/
static const uint8_t vs_source_hlsl5[869] = {
0x63,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x55,0x42,0x4f,0x20,0x3a,0x20,0x72,0x65,
0x67,0x69,0x73,0x74,0x65,0x72,0x28,0x62,0x30,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,
0x20,0x72,0x6f,0x77,0x5f,0x6d,0x61,0x6a,0x6f,0x72,0x20,0x66,0x6c,0x6f,0x61,0x74,
0x34,0x78,0x34,0x20,0x75,0x62,0x6f,0x5f,0x6d,0x6f,0x64,0x65,0x6c,0x20,0x3a,0x20,
0x70,0x61,0x63,0x6b,0x6f,0x66,0x66,0x73,0x65,0x74,0x28,0x63,0x30,0x29,0x3b,0x0a,
0x20,0x20,0x20,0x20,0x72,0x6f,0x77,0x5f,0x6d,0x61,0x6a,0x6f,0x72,0x20,0x66,0x6c,
0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x75,0x62,0x6f,0x5f,0x76,0x69,0x65,0x77,0x20,
0x3a,0x20,0x70,0x61,0x63,0x6b,0x6f,0x66,0x66,0x73,0x65,0x74,0x28,0x63,0x34,0x29,
0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x6f,0x77,0x5f,0x6d,0x61,0x6a,0x6f,0x72,0x20,
0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x75,0x62,0x6f,0x5f,0x70,0x72,0x6f,
0x6a,0x20,0x3a,0x20,0x70,0x61,0x63,0x6b,0x6f,0x66,0x66,0x73,0x65,0x74,0x28,0x63,
0x38,0x29,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x0a,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,
0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x73,
0x74,0x61,0x74,0x69,0x63,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x6f,0x73,
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,0x34,0x20,0x70,0x6f,0x73,0x20,0x3a,0x20,0x54,
0x45,0x58,0x43,0x4f,0x4f,0x52,0x44,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,
0x6f,0x61,0x74,0x34,0x20,0x76,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3a,0x20,0x54,0x45,
0x58,0x43,0x4f,0x4f,0x52,0x44,0x31,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,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3a,0x20,0x54,0x45,0x58,0x43,
0x4f,0x4f,0x52,0x44,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,
0x34,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3a,0x20,
0x53,0x56,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x7d,0x3b,0x0a,
0x0a,0x76,0x6f,0x69,0x64,0x20,0x76,0x65,0x72,0x74,0x5f,0x6d,0x61,0x69,0x6e,0x28,
0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,
0x76,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,
0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x28,0x66,0x6c,
0x6f,0x61,0x74,0x34,0x28,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,
0x30,0x66,0x29,0x2c,0x20,0x6d,0x75,0x6c,0x28,0x75,0x62,0x6f,0x5f,0x70,0x72,0x6f,
0x6a,0x2c,0x20,0x6d,0x75,0x6c,0x28,0x75,0x62,0x6f,0x5f,0x76,0x69,0x65,0x77,0x2c,
0x20,0x75,0x62,0x6f,0x5f,0x6d,0x6f,0x64,0x65,0x6c,0x29,0x29,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,0x76,
0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,
0x70,0x75,0x74,0x2e,0x76,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,
0x70,0x6f,0x73,0x20,0x3d,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x70,0x75,
0x74,0x2e,0x70,0x6f,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x72,0x74,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,0x67,0x6c,
0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x50,
0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x74,0x61,
0x67,0x65,0x5f,0x6f,0x75,0x74,0x70,0x75,0x74,0x2e,0x63,0x6f,0x6c,0x6f,0x72,0x20,
0x3d,0x20,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 float4 frag_color;
static float4 color;
struct SPIRV_Cross_Input
{
float4 color : TEXCOORD0;
};
struct SPIRV_Cross_Output
{
float4 frag_color : SV_Target0;
};
void frag_main()
{
frag_color = color;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
color = stage_input.color;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.frag_color = frag_color;
return stage_output;
}
*/
static const uint8_t fs_source_hlsl5[435] = {
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,0x34,0x20,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,0x34,0x20,0x63,0x6f,0x6c,0x6f,0x72,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,0x76,0x6f,0x69,0x64,0x20,0x66,0x72,0x61,0x67,0x5f,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,0x63,0x6f,0x6c,0x6f,0x72,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,0x63,0x6f,0x6c,0x6f,
0x72,0x20,0x3d,0x20,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74,0x2e,
0x63,0x6f,0x6c,0x6f,0x72,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 <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct UBO
{
float4x4 model;
float4x4 view;
float4x4 proj;
};
struct main0_out
{
float4 color [[user(locn0)]];
float4 gl_Position [[position]];
};
struct main0_in
{
float4 pos [[attribute(0)]];
float4 vcolor [[attribute(1)]];
};
vertex main0_out main0(main0_in in [[stage_in]], constant UBO& ubo [[buffer(0)]])
{
main0_out out = {};
out.color = in.vcolor;
out.gl_Position = ((ubo.model * ubo.view) * ubo.proj) * float4(in.pos.xyz, 1.0);
return out;
}
*/
static const uint8_t vs_source_metal_macos[572] = {
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,0x55,
0x42,0x4f,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,
0x34,0x20,0x6d,0x6f,0x64,0x65,0x6c,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,
0x61,0x74,0x34,0x78,0x34,0x20,0x76,0x69,0x65,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,
0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x70,0x72,0x6f,0x6a,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,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,
0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,
0x74,0x34,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b,
0x5b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,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,0x34,0x20,0x70,0x6f,
0x73,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x30,0x29,
0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,
0x63,0x6f,0x6c,0x6f,0x72,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,
0x65,0x28,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x76,0x65,0x72,0x74,
0x65,0x78,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,0x55,0x42,0x4f,0x26,0x20,0x75,0x62,0x6f,0x20,0x5b,
0x5b,0x62,0x75,0x66,0x66,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,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,
0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x76,0x63,0x6f,0x6c,0x6f,
0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,
0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x28,0x28,0x75,0x62,0x6f,0x2e,0x6d,
0x6f,0x64,0x65,0x6c,0x20,0x2a,0x20,0x75,0x62,0x6f,0x2e,0x76,0x69,0x65,0x77,0x29,
0x20,0x2a,0x20,0x75,0x62,0x6f,0x2e,0x70,0x72,0x6f,0x6a,0x29,0x20,0x2a,0x20,0x66,
0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x2e,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,
0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,
0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
/*
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct main0_out
{
float4 frag_color [[color(0)]];
};
struct main0_in
{
float4 color [[user(locn0)]];
};
fragment main0_out main0(main0_in in [[stage_in]])
{
main0_out out = {};
out.frag_color = in.color;
return out;
}
*/
static const uint8_t fs_source_metal_macos[315] = {
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,0x34,0x20,
0x63,0x6f,0x6c,0x6f,0x72,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,
0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,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,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,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,
0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x69,0x6e,0x2e,
0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,
0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00,
};
static inline const sg_shader_desc* basic_shader_desc(sg_backend backend) {
if (backend == SG_BACKEND_GLCORE) {
static sg_shader_desc desc;
static bool valid;
if (!valid) {
valid = true;
desc.vertex_func.source = (const char*)vs_source_glsl430;
desc.vertex_func.entry = "main";
desc.fragment_func.source = (const char*)fs_source_glsl430;
desc.fragment_func.entry = "main";
desc.attrs[0].base_type = SG_SHADERATTRBASETYPE_FLOAT;
desc.attrs[0].glsl_name = "pos";
desc.attrs[1].base_type = SG_SHADERATTRBASETYPE_FLOAT;
desc.attrs[1].glsl_name = "vcolor";
desc.uniform_blocks[0].stage = SG_SHADERSTAGE_VERTEX;
desc.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140;
desc.uniform_blocks[0].size = 192;
desc.uniform_blocks[0].glsl_uniforms[0].type = SG_UNIFORMTYPE_FLOAT4;
desc.uniform_blocks[0].glsl_uniforms[0].array_count = 12;
desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "UBO";
desc.label = "basic_shader";
}
return &desc;
}
if (backend == SG_BACKEND_D3D11) {
static sg_shader_desc desc;
static bool valid;
if (!valid) {
valid = true;
desc.vertex_func.source = (const char*)vs_source_hlsl5;
desc.vertex_func.d3d11_target = "vs_5_0";
desc.vertex_func.entry = "main";
desc.fragment_func.source = (const char*)fs_source_hlsl5;
desc.fragment_func.d3d11_target = "ps_5_0";
desc.fragment_func.entry = "main";
desc.attrs[0].base_type = SG_SHADERATTRBASETYPE_FLOAT;
desc.attrs[0].hlsl_sem_name = "TEXCOORD";
desc.attrs[0].hlsl_sem_index = 0;
desc.attrs[1].base_type = SG_SHADERATTRBASETYPE_FLOAT;
desc.attrs[1].hlsl_sem_name = "TEXCOORD";
desc.attrs[1].hlsl_sem_index = 1;
desc.uniform_blocks[0].stage = SG_SHADERSTAGE_VERTEX;
desc.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140;
desc.uniform_blocks[0].size = 192;
desc.uniform_blocks[0].hlsl_register_b_n = 0;
desc.label = "basic_shader";
}
return &desc;
}
if (backend == SG_BACKEND_METAL_MACOS) {
static sg_shader_desc desc;
static bool valid;
if (!valid) {
valid = true;
desc.vertex_func.source = (const char*)vs_source_metal_macos;
desc.vertex_func.entry = "main0";
desc.fragment_func.source = (const char*)fs_source_metal_macos;
desc.fragment_func.entry = "main0";
desc.attrs[0].base_type = SG_SHADERATTRBASETYPE_FLOAT;
desc.attrs[1].base_type = SG_SHADERATTRBASETYPE_FLOAT;
desc.uniform_blocks[0].stage = SG_SHADERSTAGE_VERTEX;
desc.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140;
desc.uniform_blocks[0].size = 192;
desc.uniform_blocks[0].msl_buffer_n = 0;
desc.label = "basic_shader";
}
return &desc;
}
return 0;
}

View file

@ -4,15 +4,15 @@
#include <assert.h> #include <assert.h>
#ifdef PLATFORM_WINDOWS #ifdef PLATFORM_WINDOWS
#define SOKOL_D3D11 #define SOKOL_D3D11
#elifdef PLATFORM_MACOS #elifdef PLATFORM_MACOS
#define SOKOL_METAL #define SOKOL_METAL
#elifdef PLATFORM_LINUX #elifdef PLATFORM_LINUX
#define SOKOL_GLCORE #define SOKOL_GLCORE
#elifdef PLATFORM_WASM #elifdef PLATFORM_WASM
#define SOKOL_GLES3 #define SOKOL_GLES3
#else #else
#error "unsupported platform" #error "unsupported platform"
#endif #endif
#define SOKOL_IMPL #define SOKOL_IMPL
@ -24,136 +24,206 @@
#include "base.c" #include "base.c"
#include "arena.c" #include "arena.c"
#include "math.c"
#include "basic.glsl.h"
typedef struct {
Matrix model;
Matrix view;
Matrix proj;
} UBO;
sg_pass_action pass_action; sg_pass_action pass_action;
sg_bindings g_bind;
sg_pipeline g_pipeline;
s64 g_frame = 0;
UBO g_ubo;
Matrix g_proj;
Vec3 g_camera;
static void static void
init(void) { init(void) {
scope_exit { scope_exit {
printf("leaving init...\n"); printf("leaving init...\n");
}; };
sg_setup(&(sg_desc){ sg_setup(&(sg_desc){
.environment = sglue_environment(), .environment = sglue_environment(),
.logger.func = slog_func, .logger.func = slog_func,
}); });
pass_action = (sg_pass_action) { g_proj = make_proj_matrix(90, 1280, 720, 0.01, 100.0);
.colors[0] = { g_camera = (Vec3){0, 0, -1.0};
.load_action = SG_LOADACTION_CLEAR,
.clear_value = { 1.0f, 0.0f, 0.0f, 1.0f }
}
};
sdtx_setup(&(sdtx_desc_t){ float vertices[] = {
.fonts = { -0.5, 0.5, -0.5, 1.0, 1.0, 1.0, 1.0,
[0] = sdtx_font_kc853(), -0.5, -0.5, -0.5, 1.0, 0.0, 1.0, 1.0,
[1] = sdtx_font_kc854(), 0.5, 0.5, -0.5, 0.0, 0.0, 1.0, 1.0,
[2] = sdtx_font_z1013(), 0.5, -0.5, -0.5, 1.0, 0.0, 1.0, 1.0,
[3] = sdtx_font_cpc(),
[4] = sdtx_font_c64(),
[5] = sdtx_font_oric(),
},
});
// c23 tests -0.5, 0.5, 0.5, 1.0, 0.0, 0.0, 1.0,
capture auto x = 0; -0.5, -0.5, 0.5, 1.0, 1.0, 0.0, 1.0,
auto inc = persist(^{ 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0,
x += 1; 0.5, -0.5, 0.5, 0.0, 1.0, 0.0, 1.0
}); };
printf("x = %d (before)\n", x); u32 indices[] = {
for (uword i = 0; i < 10; i += 1) { 0, 2, 1, 1, 2, 3, // back
inc(); 0, 1, 4, 4, 1, 5, // left
} 3, 2, 6, 6, 7, 3, // right
printf("x = %d (after)\n", x); 2, 0, 6, 6, 0, 4, // top
1, 3, 7, 7, 5, 1, // bot
4, 5, 6, 6, 5, 7, // front
};
auto arena = Logger(Linear(1024 * 1024)); g_bind.vertex_buffers[0] = sg_make_buffer(&(sg_buffer_desc){
scope_exit { arena_release(arena); }; .usage = {.dynamic_update = true},
.size = 1024,
.label = "cube vertices",
});
g_bind.index_buffer = sg_make_buffer(&(sg_buffer_desc){
.data = SG_RANGE(indices),
.usage = {.index_buffer = true},
.label = "cube indices",
});
sword* a = arena_new(arena, sword); sg_shader shader = sg_make_shader(basic_shader_desc(sg_query_backend()));
sword* b = arena_new(arena, sword);
{ g_pipeline = sg_make_pipeline(&(sg_pipeline_desc){
auto region = Region(arena); .shader = shader,
scope_exit { arena_reset(region); }; .layout = {
.attrs = {
[ATTR_basic_pos].format = SG_VERTEXFORMAT_FLOAT3,
[ATTR_basic_vcolor].format = SG_VERTEXFORMAT_FLOAT4,
},
},
.cull_mode = SG_CULLMODE_BACK,
.index_type = SG_INDEXTYPE_UINT32,
.label = "cube pipeline",
});
arena_make(region, 10, sword); pass_action = (sg_pass_action) {
arena_make(region, 10, f32); .colors[0] = {
arena_make(region, 10, bool); .load_action = SG_LOADACTION_CLEAR,
} .clear_value = { 1.0f, 0.0f, 0.0f, 1.0f }
}
};
sword* c = arena_new(arena, sword); sdtx_setup(&(sdtx_desc_t){
.fonts = {
*a = 1024; [0] = sdtx_font_kc853(),
*b = 2048; [1] = sdtx_font_kc854(),
*c = 4096; [2] = sdtx_font_z1013(),
[3] = sdtx_font_cpc(),
printf("%d (%p)\n", cast(int, *a), a); [4] = sdtx_font_c64(),
printf("%d (%p)\n", cast(int, *b), b); [5] = sdtx_font_oric(),
printf("%d (%p)\n", cast(int, *c), c); },
});
arena_reset(arena);
c = arena_new(arena, sword);
b = arena_new(arena, sword);
a = arena_new(arena, sword);
printf("%d (%p)\n", cast(int, *a), a);
printf("%d (%p)\n", cast(int, *b), b);
printf("%d (%p)\n", cast(int, *c), c);
} }
static void static void
frame(void) { frame(void) {
sg_begin_pass(&(sg_pass){ sg_begin_pass(&(sg_pass){
.action.colors[0] = { .action.colors[0] = {
.load_action = SG_LOADACTION_CLEAR, .load_action = SG_LOADACTION_CLEAR,
.clear_value = { 0.10f, 0.10f, 0.10f, 1.0f }, .clear_value = { 0.10f, 0.10f, 0.10f, 1.0f },
}, },
.swapchain = sglue_swapchain(), .swapchain = sglue_swapchain(),
}); });
sdtx_origin(0, 0); sdtx_origin(0, 0);
sdtx_canvas(sapp_widthf(), sapp_heightf()); sdtx_canvas(sapp_widthf(), sapp_heightf());
sdtx_font(3); sdtx_font(3);
sdtx_pos(1, 1); sdtx_pos(1, 1);
sdtx_color3b(0, 0xFF, 0); sdtx_color3b(0, 0xFF, 0);
sdtx_puts("press escape to quit"); sdtx_puts("press escape to quit");
sdtx_draw();
sdtx_draw(); float vertices[] = {
sg_end_pass(); -0.5, 0.5, -0.5, 1.0, 1.0, 1.0, 1.0,
sg_commit(); -0.5, -0.5, -0.5, 1.0, 0.0, 1.0, 1.0,
0.5, 0.5, -0.5, 0.0, 1.0, 1.0, 1.0,
0.5, -0.5, -0.5, 0.0, 0.0, 1.0, 1.0,
-0.5, 0.5, 0.5, 1.0, 1.0, 0.0, 1.0,
-0.5, -0.5, 0.5, 1.0, 0.0, 0.0, 1.0,
0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0,
0.5, -0.5, 0.5, 0.0, 0.0, 0.0, 1.0
};
// get angle from frame number
// wrap to angle
s64 rate = 333;
s64 wframe = g_frame;
if(wframe >= TAU32*rate)
wframe -= TAU32*rate;
float angle = (f32)wframe/rate;
Matrix rot = make_rotation((Vec3){0.0, 1.0, 0.0}, angle);
Vec3 p;
for(int i = 0;
i < 8;
++i) {
int vertex = i*7;
p = (Vec3){vertices[vertex + 0], vertices[vertex + 1], vertices[vertex + 2]};
p = m4v3_mul(rot, p);
vertices[vertex + 0] = p.x;
vertices[vertex + 1] = p.y;
vertices[vertex + 2] = p.z;
}
sg_update_buffer(g_bind.vertex_buffers[0], &SG_RANGE(vertices));
sg_apply_pipeline(g_pipeline);
sg_apply_bindings(&g_bind);
Matrix model = make_translation((Vec3){0, 0, 0});
Matrix lookat = make_lookat(g_camera, (Vec3){0, 0, 0}, (Vec3){0, 1, 0});
g_ubo.model = model;
g_ubo.view = lookat;
g_ubo.proj = g_proj;
sg_apply_uniforms(UB_UBO, &SG_RANGE(g_ubo));
sg_draw(0, 36, 1);
sg_end_pass();
sg_commit();
g_frame += 1;
} }
static void static void
cleanup(void) { cleanup(void) {
sdtx_shutdown(); sdtx_shutdown();
sg_shutdown(); sg_shutdown();
} }
static void static void
event(const sapp_event* event) { event(const sapp_event* event) {
if (event->type == SAPP_EVENTTYPE_KEY_DOWN) { if (event->type == SAPP_EVENTTYPE_KEY_DOWN) {
if (event->key_code == SAPP_KEYCODE_ESCAPE) { if (event->key_code == SAPP_KEYCODE_ESCAPE) {
sapp_request_quit(); sapp_request_quit();
} }
} }
} }
sapp_desc sapp_desc
sokol_main(int argc, char* argv[]) { sokol_main(int argc, char* argv[]) {
return (sapp_desc) { return (sapp_desc) {
.init_cb = init, .init_cb = init,
.frame_cb = frame, .frame_cb = frame,
.cleanup_cb = cleanup, .cleanup_cb = cleanup,
.event_cb = event, .event_cb = event,
.logger.func = slog_func, .logger.func = slog_func,
.width = 1280, .width = 1280,
.height = 720, .height = 720,
.window_title = "hello, world", .window_title = "hello, world",
}; };
} }

202
source/math.c Normal file
View file

@ -0,0 +1,202 @@
#if !defined(MATH)
#define MATH
#import <math.h>
#define PI32 3.141592653589
#define TAU32 6.28318530718
typedef struct {
float _00, _01, _02, _03;
float _10, _11, _12, _13;
float _20, _21, _22, _23;
float _30, _31, _32, _33;
} Matrix;
typedef struct {
float x,y,z;
} Vec3;
typedef struct {
float x,y,z,w;
} Vec4;
Matrix mat_identity = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
Matrix
mat_scale(f32 amnt) {
Matrix r = {0};
r._00 = amnt;
r._11 = amnt;
r._22 = amnt;
r._33 = amnt;
return r;
}
Matrix
make_proj_matrix(f32 fov, int width, int height, f32 near_plane, f32 far_plane) {
Matrix r = {0};
bool depth_01 = false;
f32 aspect = (f32)height/(f32)width;
// Y up, X right, -Z forward
f32 fov_part = 1.0/tan(fov*0.5*PI32/180.0);
f32 denom = far_plane - near_plane;
r._00 = fov_part;
r._11 = fov_part/aspect;
r._22 = (far_plane + near_plane)/denom;
r._23 = 2.0*far_plane*near_plane/denom;
r._32 = 1.0;
r._33 = 1.0;
if(depth_01) {
// VULKAN?
// Makes depth range from 0 to 1
// To map -1,1 depth range to 0,1 we transform z as follows: z' = z * 0.5 + 0.5
r._22 = r._22 * 0.5 + r._32 * 0.5;
r._23 = r._23 * 0.5 + r._33 * 0.5;
}
return r;
}
Matrix
make_translation(Vec3 v) {
Matrix r;
r = mat_identity;
r._03 = v.x;
r._13 = v.y;
r._23 = v.z;
return r;
}
Vec3
v3_normalize(Vec3 v) {
f32 inv_denom = 1.0/sqrtf(v.x*v.x + v.y*v.y + v.z*v.z);
v.x *= inv_denom;
v.y *= inv_denom;
v.z *= inv_denom;
return v;
}
Matrix
make_rotation(Vec3 axis, f32 angle) {
Matrix r = mat_identity;
Vec3 a = v3_normalize(axis);
f32 sin_theta = sin(angle);
f32 cos_theta = cos(angle);
f32 inv_cos = 1.0 - cos_theta;
// Contributors to vector's X
r._00 = (a.x*a.x*inv_cos) + cos_theta;
r._01 = (a.x*a.y*inv_cos) + (a.z*sin_theta);
r._02 = (a.x*a.z*inv_cos) - (a.y*sin_theta);
// Contributors to vector's Y
r._10 = (a.y*a.x*inv_cos) - (a.z*sin_theta);
r._11 = (a.y*a.y*inv_cos) + cos_theta;
r._12 = (a.y*a.z*inv_cos) + (a.x*sin_theta);
// Contributors to vector's Z
r._20 = (a.z*a.x*inv_cos) + (a.y*sin_theta);
r._21 = (a.z*a.y*inv_cos) - (a.x*sin_theta);
r._22 = (a.z*a.z*inv_cos) + cos_theta;
return r;
}
Matrix
translate(Matrix from, Vec3 with) {
Matrix r;
r = from;
r._03 += with.x*r._00 + with.y*r._01 + with.z*r._02;
r._13 += with.x*r._10 + with.y*r._11 + with.z*r._12;
r._23 += with.x*r._20 + with.y*r._21 + with.z*r._22;
return r;
}
Vec3
cross(Vec3 a, Vec3 b) {
Vec3 r;
r.x = a.y*b.z - a.z*b.y;
r.y = a.z*b.x - a.x*b.z;
r.z = a.x*b.y - a.y*b.x;
return r;
}
Matrix
make_lookat(Vec3 camera, Vec3 at, Vec3 up_vector) {
Vec3 forward, right, up;
Matrix look_at;
// Z forward, Y up, X right
forward.x = at.x - camera.x;
forward.y = at.y - camera.y;
forward.z = at.z - camera.z;
forward = v3_normalize(forward);
right = v3_normalize(cross(up_vector, forward)); // up_vector
up = v3_normalize(cross(forward, right));
memset(&look_at, 0x00, sizeof(Matrix)); // Todo: zero subroutine
look_at._00 = right.x;
look_at._01 = right.y;
look_at._02 = right.z;
look_at._10 = up.x;
look_at._11 = up.y;
look_at._12 = up.z;
look_at._20 = forward.x;
look_at._21 = forward.y;
look_at._22 = forward.z;
look_at._33 = 1;
camera.x = -camera.x;
camera.y = -camera.y;
camera.z = -camera.z;
look_at = translate(look_at, camera);
return look_at;
}
Matrix
mat_mul(Matrix a, Matrix b) {
Matrix r;
r._00 = a._00*b._00 + a._01*b._10 + a._02*b._20 + a._03*b._30;
r._01 = a._00*b._01 + a._01*b._11 + a._02*b._21 + a._03*b._31;
r._02 = a._00*b._02 + a._01*b._12 + a._02*b._22 + a._03*b._32;
r._03 = a._00*b._03 + a._01*b._13 + a._02*b._23 + a._03*b._33;
r._10 = a._10*b._00 + a._11*b._10 + a._12*b._20 + a._13*b._30;
r._11 = a._10*b._01 + a._11*b._11 + a._12*b._21 + a._13*b._31;
r._12 = a._10*b._02 + a._11*b._12 + a._12*b._22 + a._13*b._32;
r._13 = a._10*b._03 + a._11*b._13 + a._12*b._23 + a._13*b._33;
r._20 = a._20*b._00 + a._21*b._10 + a._22*b._20 + a._23*b._30;
r._21 = a._20*b._01 + a._21*b._11 + a._22*b._21 + a._23*b._31;
r._22 = a._20*b._02 + a._21*b._12 + a._22*b._22 + a._23*b._32;
r._23 = a._20*b._03 + a._21*b._13 + a._22*b._23 + a._23*b._33;
r._30 = a._30*b._00 + a._31*b._10 + a._32*b._20 + a._33*b._30;
r._31 = a._30*b._01 + a._31*b._11 + a._32*b._21 + a._33*b._31;
r._32 = a._30*b._02 + a._31*b._12 + a._32*b._22 + a._33*b._32;
r._33 = a._30*b._03 + a._31*b._13 + a._32*b._23 + a._33*b._33;
return r;
}
Vec3
m4v3_mul(Matrix m, Vec3 v) {
Vec3 result;
result.x = m._00*v.x + m._01*v.y + m._02*v.z;
result.y = m._10*v.x + m._11*v.y + m._12*v.z;
result.z = m._20*v.x + m._21*v.y + m._22*v.z;
return result;
}
void
transpose(Matrix *m) {
#define SWAP(a, b) {f32 _t = a; a = b; b = _t;}
SWAP(m->_01, m->_10);
SWAP(m->_02, m->_20);
SWAP(m->_03, m->_30);
SWAP(m->_12, m->_21);
SWAP(m->_13, m->_31);
SWAP(m->_23, m->_32);
#undef SWAP
}
#endif

BIN
thirdparty/sokol/sokol-shdc-darwin vendored Normal file

Binary file not shown.

BIN
thirdparty/sokol/sokol-shdc-linux vendored Normal file

Binary file not shown.

BIN
thirdparty/sokol/sokol-shdc-windows.exe vendored Normal file

Binary file not shown.