examples: fix rt_glsl.v

pull/8805/head
Alexander Medvednikov 2021-02-17 06:57:25 +01:00
parent ba131ce914
commit 023f6829a1
1 changed files with 260 additions and 236 deletions

View File

@ -35,12 +35,10 @@
import gg import gg
import gg.m4 import gg.m4
import gx import gx
//import math // import math
import sokol.sapp import sokol.sapp
import sokol.gfx import sokol.gfx
import sokol.sgl import sokol.sgl
import time import time
// GLSL Include and functions // GLSL Include and functions
@ -48,7 +46,9 @@ import time
#flag -I @VROOT/. #flag -I @VROOT/.
#include "rt_glsl_march.h" #Please use sokol-shdc to generate the necessary rt_glsl_march.h file from rt_glsl_march.glsl (see the instructions at the top of this file) #include "rt_glsl_march.h" #Please use sokol-shdc to generate the necessary rt_glsl_march.h file from rt_glsl_march.glsl (see the instructions at the top of this file)
#include "rt_glsl_puppy.h" #Please use sokol-shdc to generate the necessary rt_glsl_puppy.h file from rt_glsl_puppy.glsl (see the instructions at the top of this file) #include "rt_glsl_puppy.h" #Please use sokol-shdc to generate the necessary rt_glsl_puppy.h file from rt_glsl_puppy.glsl (see the instructions at the top of this file)
fn C.rt_march_shader_desc() &C.sg_shader_desc fn C.rt_march_shader_desc() &C.sg_shader_desc
fn C.rt_puppy_shader_desc() &C.sg_shader_desc fn C.rt_puppy_shader_desc() &C.sg_shader_desc
const ( const (
@ -59,24 +59,20 @@ const (
struct App { struct App {
mut: mut:
gg &gg.Context gg &gg.Context
texture C.sg_image texture C.sg_image
init_flag bool init_flag bool
frame_count int frame_count int
mouse_x int = -1
mouse_x int = -1 mouse_y int = -1
mouse_y int = -1 mouse_down bool
mouse_down bool
// glsl // glsl
cube_pip_glsl C.sg_pipeline cube_pip_glsl C.sg_pipeline
cube_bind C.sg_bindings cube_bind C.sg_bindings
pipe map[string]C.sg_pipeline
pipe map[string]C.sg_pipeline bind map[string]C.sg_bindings
bind map[string]C.sg_bindings
// time // time
ticks i64 ticks i64
} }
/****************************************************************************** /******************************************************************************
@ -84,23 +80,23 @@ mut:
* Texture functions * Texture functions
* *
******************************************************************************/ ******************************************************************************/
fn create_texture(w int, h int, buf byteptr) C.sg_image{ fn create_texture(w int, h int, buf byteptr) C.sg_image {
sz := w * h * 4 sz := w * h * 4
mut img_desc := C.sg_image_desc{ mut img_desc := C.sg_image_desc{
width: w width: w
height: h height: h
num_mipmaps: 0 num_mipmaps: 0
min_filter: .linear min_filter: .linear
mag_filter: .linear mag_filter: .linear
//usage: .dynamic // usage: .dynamic
wrap_u: .clamp_to_edge wrap_u: .clamp_to_edge
wrap_v: .clamp_to_edge wrap_v: .clamp_to_edge
label: &byte(0) label: &byte(0)
d3d11_texture: 0 d3d11_texture: 0
} }
// comment if .dynamic is enabled // comment if .dynamic is enabled
img_desc.content.subimage[0][0] = C.sg_subimage_content{ img_desc.content.subimage[0][0] = C.sg_subimage_content{
ptr: buf ptr: buf
size: sz size: sz
} }
@ -108,15 +104,15 @@ fn create_texture(w int, h int, buf byteptr) C.sg_image{
return sg_img return sg_img
} }
fn destroy_texture(sg_img C.sg_image){ fn destroy_texture(sg_img C.sg_image) {
C.sg_destroy_image(sg_img) C.sg_destroy_image(sg_img)
} }
// Use only if usage: .dynamic is enabled // Use only if usage: .dynamic is enabled
fn update_text_texture(sg_img C.sg_image, w int, h int, buf byteptr){ fn update_text_texture(sg_img C.sg_image, w int, h int, buf byteptr) {
sz := w * h * 4 sz := w * h * 4
mut tmp_sbc := C.sg_image_content{} mut tmp_sbc := C.sg_image_content{}
tmp_sbc.subimage[0][0] = C.sg_subimage_content { tmp_sbc.subimage[0][0] = C.sg_subimage_content{
ptr: buf ptr: buf
size: sz size: sz
} }
@ -129,7 +125,7 @@ fn update_text_texture(sg_img C.sg_image, w int, h int, buf byteptr){
* *
******************************************************************************/ ******************************************************************************/
/* /*
Cube vertex buffer with packed vertex formats for color and texture coords. Cube vertex buffer with packed vertex formats for color and texture coords.
Note that a vertex format which must be portable across all Note that a vertex format which must be portable across all
backends must only use the normalized integer formats backends must only use the normalized integer formats
(BYTE4N, UBYTE4N, SHORT2N, SHORT4N), which can be converted (BYTE4N, UBYTE4N, SHORT2N, SHORT4N), which can be converted
@ -140,252 +136,274 @@ fn update_text_texture(sg_img C.sg_image, w int, h int, buf byteptr){
*/ */
struct Vertex_t { struct Vertex_t {
x f32 x f32
y f32 y f32
z f32 z f32
color u32 color u32
// u u16 // for compatibility with D3D11
//u u16 // for compatibility with D3D11 // v u16 // for compatibility with D3D11
//v u16 // for compatibility with D3D11 u f32
u f32 v f32
v f32
} }
// march shader init // march shader init
fn init_cube_glsl_m(mut app App) { fn init_cube_glsl_m(mut app App) {
/* cube vertex buffer */ // cube vertex buffer
//d := u16(32767) // for compatibility with D3D11, 32767 stand for 1 // d := u16(32767) // for compatibility with D3D11, 32767 stand for 1
d := f32(1.0) d := f32(1.0)
c := u32(0xFFFFFF_FF) // color RGBA8 c := u32(0xFFFFFF_FF) // color RGBA8
vertices := [ vertices := [
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{1.0, -1.0, -1.0, c, d, 0},
Vertex_t{ 1.0, -1.0, -1.0, c, d, 0}, Vertex_t{1.0, 1.0, -1.0, c, d, d},
Vertex_t{ 1.0, 1.0, -1.0, c, d, d}, Vertex_t{-1.0, 1.0, -1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, 0, d}, Vertex_t{-1.0, -1.0, 1.0, c, 0, 0},
Vertex_t{1.0, -1.0, 1.0, c, d, 0},
Vertex_t{-1.0, -1.0, 1.0, c, 0, 0}, Vertex_t{1.0, 1.0, 1.0, c, d, d},
Vertex_t{ 1.0, -1.0, 1.0, c, d, 0}, Vertex_t{-1.0, 1.0, 1.0, c, 0, d},
Vertex_t{ 1.0, 1.0, 1.0, c, d, d}, Vertex_t{-1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, 1.0, 1.0, c, 0, d}, Vertex_t{-1.0, 1.0, -1.0, c, d, 0},
Vertex_t{-1.0, 1.0, 1.0, c, d, d},
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{-1.0, -1.0, 1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, d, 0}, Vertex_t{1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, 1.0, 1.0, c, d, d}, Vertex_t{1.0, 1.0, -1.0, c, d, 0},
Vertex_t{-1.0, -1.0, 1.0, c, 0, d}, Vertex_t{1.0, 1.0, 1.0, c, d, d},
Vertex_t{1.0, -1.0, 1.0, c, 0, d},
Vertex_t{ 1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{-1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{ 1.0, 1.0, -1.0, c, d, 0}, Vertex_t{-1.0, -1.0, 1.0, c, d, 0},
Vertex_t{ 1.0, 1.0, 1.0, c, d, d}, Vertex_t{1.0, -1.0, 1.0, c, d, d},
Vertex_t{ 1.0, -1.0, 1.0, c, 0, d}, Vertex_t{1.0, -1.0, -1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{-1.0, 1.0, 1.0, c, d, 0},
Vertex_t{-1.0, -1.0, 1.0, c, d, 0}, Vertex_t{1.0, 1.0, 1.0, c, d, d},
Vertex_t{ 1.0, -1.0, 1.0, c, d, d}, Vertex_t{1.0, 1.0, -1.0, c, 0, d},
Vertex_t{ 1.0, -1.0, -1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, 1.0, 1.0, c, d, 0},
Vertex_t{ 1.0, 1.0, 1.0, c, d, d},
Vertex_t{ 1.0, 1.0, -1.0, c, 0, d},
] ]
mut vert_buffer_desc := C.sg_buffer_desc{} mut vert_buffer_desc := C.sg_buffer_desc{}
unsafe {C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc))} unsafe { C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc)) }
vert_buffer_desc.size = vertices.len * int(sizeof(Vertex_t)) vert_buffer_desc.size = vertices.len * int(sizeof(Vertex_t))
vert_buffer_desc.content = byteptr(vertices.data) vert_buffer_desc.content = byteptr(vertices.data)
vert_buffer_desc.@type = .vertexbuffer vert_buffer_desc.@type = .vertexbuffer
vert_buffer_desc.label = "cube-vertices".str vert_buffer_desc.label = 'cube-vertices'.str
vbuf := gfx.make_buffer(&vert_buffer_desc) vbuf := gfx.make_buffer(&vert_buffer_desc)
/* create an index buffer for the cube */ // create an index buffer for the cube
indices := [ indices := [
u16(0), 1, 2, 0, 2, 3, u16(0),
6, 5, 4, 7, 6, 4, 1,
8, 9, 10, 8, 10, 11, 2,
/* 0,
u16(14), 13, 12, 15, 14, 12, 2,
3,
6,
5,
4,
7,
6,
4,
8,
9,
10,
8,
10,
11,
/*
u16(14), 13, 12, 15, 14, 12,
16, 17, 18, 16, 18, 19, 16, 17, 18, 16, 18, 19,
22, 21, 20, 23, 22, 20 22, 21, 20, 23, 22, 20
*/ */
] ]
mut index_buffer_desc := C.sg_buffer_desc{} mut index_buffer_desc := C.sg_buffer_desc{}
unsafe {C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc))} unsafe { C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc)) }
index_buffer_desc.size = indices.len * int(sizeof(u16)) index_buffer_desc.size = indices.len * int(sizeof(u16))
index_buffer_desc.content = byteptr(indices.data) index_buffer_desc.content = byteptr(indices.data)
index_buffer_desc.@type = .indexbuffer index_buffer_desc.@type = .indexbuffer
index_buffer_desc.label = "cube-indices".str index_buffer_desc.label = 'cube-indices'.str
ibuf := gfx.make_buffer(&index_buffer_desc) ibuf := gfx.make_buffer(&index_buffer_desc)
/* create shader */ // create shader
shader := gfx.make_shader(C.rt_march_shader_desc()) shader := gfx.make_shader(C.rt_march_shader_desc())
mut pipdesc := C.sg_pipeline_desc{} mut pipdesc := C.sg_pipeline_desc{}
unsafe {C.memset(&pipdesc, 0, sizeof(pipdesc))} unsafe { C.memset(&pipdesc, 0, sizeof(pipdesc)) }
pipdesc.layout.buffers[0].stride = int(sizeof(Vertex_t)) pipdesc.layout.buffers[0].stride = int(sizeof(Vertex_t))
// the constants [C.ATTR_vs_m_pos, C.ATTR_vs_m_color0, C.ATTR_vs_m_texcoord0] are generated by sokol-shdc // the constants [C.ATTR_vs_m_pos, C.ATTR_vs_m_color0, C.ATTR_vs_m_texcoord0] are generated by sokol-shdc
pipdesc.layout.attrs[C.ATTR_vs_m_pos ].format = .float3 // x,y,z as f32 pipdesc.layout.attrs[C.ATTR_vs_m_pos].format = .float3 // x,y,z as f32
pipdesc.layout.attrs[C.ATTR_vs_m_color0 ].format = .ubyte4n // color as u32 pipdesc.layout.attrs[C.ATTR_vs_m_color0].format = .ubyte4n // color as u32
pipdesc.layout.attrs[C.ATTR_vs_m_texcoord0].format = .float2 // u,v as f32 pipdesc.layout.attrs[C.ATTR_vs_m_texcoord0].format = .float2 // u,v as f32
//pipdesc.layout.attrs[C.ATTR_vs_m_texcoord0].format = .short2n // u,v as u16 // pipdesc.layout.attrs[C.ATTR_vs_m_texcoord0].format = .short2n // u,v as u16
pipdesc.shader = shader pipdesc.shader = shader
pipdesc.index_type = .uint16 pipdesc.index_type = .uint16
pipdesc.depth_stencil = C.sg_depth_stencil_state{ pipdesc.depth_stencil = C.sg_depth_stencil_state{
depth_write_enabled: true depth_write_enabled: true
depth_compare_func : gfx.CompareFunc(C.SG_COMPAREFUNC_LESS_EQUAL) depth_compare_func: gfx.CompareFunc(C.SG_COMPAREFUNC_LESS_EQUAL)
} }
pipdesc.rasterizer = C.sg_rasterizer_state { pipdesc.rasterizer = C.sg_rasterizer_state{
cull_mode: .back cull_mode: .back
} }
pipdesc.label = "glsl_shader pipeline".str pipdesc.label = 'glsl_shader pipeline'.str
mut bind := C.sg_bindings{} mut bind := C.sg_bindings{}
unsafe {C.memset(&bind, 0, sizeof(bind))} unsafe { C.memset(&bind, 0, sizeof(bind)) }
bind.vertex_buffers[0] = vbuf bind.vertex_buffers[0] = vbuf
bind.index_buffer = ibuf bind.index_buffer = ibuf
bind.fs_images[C.SLOT_tex] = app.texture bind.fs_images[C.SLOT_tex] = app.texture
app.bind['march'] = bind app.bind['march'] = bind
app.pipe['march'] = gfx.make_pipeline(&pipdesc) app.pipe['march'] = gfx.make_pipeline(&pipdesc)
println("GLSL March init DONE!") println('GLSL March init DONE!')
} }
// putty shader init // putty shader init
fn init_cube_glsl_p(mut app App) { fn init_cube_glsl_p(mut app App) {
/* cube vertex buffer */ // cube vertex buffer
//d := u16(32767) // for compatibility with D3D11, 32767 stand for 1 // d := u16(32767) // for compatibility with D3D11, 32767 stand for 1
d := f32(1.0) d := f32(1.0)
c := u32(0xFFFFFF_FF) // color RGBA8 c := u32(0xFFFFFF_FF) // color RGBA8
vertices := [ vertices := [
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{1.0, -1.0, -1.0, c, d, 0},
Vertex_t{ 1.0, -1.0, -1.0, c, d, 0}, Vertex_t{1.0, 1.0, -1.0, c, d, d},
Vertex_t{ 1.0, 1.0, -1.0, c, d, d}, Vertex_t{-1.0, 1.0, -1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, 0, d}, Vertex_t{-1.0, -1.0, 1.0, c, 0, 0},
Vertex_t{1.0, -1.0, 1.0, c, d, 0},
Vertex_t{-1.0, -1.0, 1.0, c, 0, 0}, Vertex_t{1.0, 1.0, 1.0, c, d, d},
Vertex_t{ 1.0, -1.0, 1.0, c, d, 0}, Vertex_t{-1.0, 1.0, 1.0, c, 0, d},
Vertex_t{ 1.0, 1.0, 1.0, c, d, d}, Vertex_t{-1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, 1.0, 1.0, c, 0, d}, Vertex_t{-1.0, 1.0, -1.0, c, d, 0},
Vertex_t{-1.0, 1.0, 1.0, c, d, d},
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{-1.0, -1.0, 1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, d, 0}, Vertex_t{1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, 1.0, 1.0, c, d, d}, Vertex_t{1.0, 1.0, -1.0, c, d, 0},
Vertex_t{-1.0, -1.0, 1.0, c, 0, d}, Vertex_t{1.0, 1.0, 1.0, c, d, d},
Vertex_t{1.0, -1.0, 1.0, c, 0, d},
Vertex_t{ 1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{-1.0, -1.0, -1.0, c, 0, 0},
Vertex_t{ 1.0, 1.0, -1.0, c, d, 0}, Vertex_t{-1.0, -1.0, 1.0, c, d, 0},
Vertex_t{ 1.0, 1.0, 1.0, c, d, d}, Vertex_t{1.0, -1.0, 1.0, c, d, d},
Vertex_t{ 1.0, -1.0, 1.0, c, 0, d}, Vertex_t{1.0, -1.0, -1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, -1.0, -1.0, c, 0, 0}, Vertex_t{-1.0, 1.0, 1.0, c, d, 0},
Vertex_t{-1.0, -1.0, 1.0, c, d, 0}, Vertex_t{1.0, 1.0, 1.0, c, d, d},
Vertex_t{ 1.0, -1.0, 1.0, c, d, d}, Vertex_t{1.0, 1.0, -1.0, c, 0, d},
Vertex_t{ 1.0, -1.0, -1.0, c, 0, d},
Vertex_t{-1.0, 1.0, -1.0, c, 0, 0},
Vertex_t{-1.0, 1.0, 1.0, c, d, 0},
Vertex_t{ 1.0, 1.0, 1.0, c, d, d},
Vertex_t{ 1.0, 1.0, -1.0, c, 0, d},
] ]
mut vert_buffer_desc := C.sg_buffer_desc{} mut vert_buffer_desc := C.sg_buffer_desc{}
unsafe {C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc))} unsafe { C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc)) }
vert_buffer_desc.size = vertices.len * int(sizeof(Vertex_t)) vert_buffer_desc.size = vertices.len * int(sizeof(Vertex_t))
vert_buffer_desc.content = byteptr(vertices.data) vert_buffer_desc.content = byteptr(vertices.data)
vert_buffer_desc.@type = .vertexbuffer vert_buffer_desc.@type = .vertexbuffer
vert_buffer_desc.label = "cube-vertices".str vert_buffer_desc.label = 'cube-vertices'.str
vbuf := gfx.make_buffer(&vert_buffer_desc) vbuf := gfx.make_buffer(&vert_buffer_desc)
/* create an index buffer for the cube */ // create an index buffer for the cube
indices := [ indices := [
/* /*
u16(0), 1, 2, 0, 2, 3, u16(0), 1, 2, 0, 2, 3,
6, 5, 4, 7, 6, 4, 6, 5, 4, 7, 6, 4,
8, 9, 10, 8, 10, 11, 8, 9, 10, 8, 10, 11,
*/ */
u16(14), 13, 12, 15, 14, 12, u16(14),
16, 17, 18, 16, 18, 19, 13,
22, 21, 20, 23, 22, 20 12,
15,
14,
12,
16,
17,
18,
16,
18,
19,
22,
21,
20,
23,
22,
20,
] ]
mut index_buffer_desc := C.sg_buffer_desc{} mut index_buffer_desc := C.sg_buffer_desc{}
unsafe {C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc))} unsafe { C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc)) }
index_buffer_desc.size = indices.len * int(sizeof(u16)) index_buffer_desc.size = indices.len * int(sizeof(u16))
index_buffer_desc.content = byteptr(indices.data) index_buffer_desc.content = byteptr(indices.data)
index_buffer_desc.@type = .indexbuffer index_buffer_desc.@type = .indexbuffer
index_buffer_desc.label = "cube-indices".str index_buffer_desc.label = 'cube-indices'.str
ibuf := gfx.make_buffer(&index_buffer_desc) ibuf := gfx.make_buffer(&index_buffer_desc)
/* create shader */ // create shader
shader := gfx.make_shader(C.rt_puppy_shader_desc()) shader := gfx.make_shader(C.rt_puppy_shader_desc())
mut pipdesc := C.sg_pipeline_desc{} mut pipdesc := C.sg_pipeline_desc{}
unsafe {C.memset(&pipdesc, 0, sizeof(pipdesc))} unsafe { C.memset(&pipdesc, 0, sizeof(pipdesc)) }
pipdesc.layout.buffers[0].stride = int(sizeof(Vertex_t)) pipdesc.layout.buffers[0].stride = int(sizeof(Vertex_t))
// the constants [C.ATTR_vs_p_pos, C.ATTR_vs_p_color0, C.ATTR_vs_p_texcoord0] are generated by sokol-shdc // the constants [C.ATTR_vs_p_pos, C.ATTR_vs_p_color0, C.ATTR_vs_p_texcoord0] are generated by sokol-shdc
pipdesc.layout.attrs[C.ATTR_vs_p_pos ].format = .float3 // x,y,z as f32 pipdesc.layout.attrs[C.ATTR_vs_p_pos].format = .float3 // x,y,z as f32
pipdesc.layout.attrs[C.ATTR_vs_p_color0 ].format = .ubyte4n // color as u32 pipdesc.layout.attrs[C.ATTR_vs_p_color0].format = .ubyte4n // color as u32
pipdesc.layout.attrs[C.ATTR_vs_p_texcoord0].format = .float2 // u,v as f32 pipdesc.layout.attrs[C.ATTR_vs_p_texcoord0].format = .float2 // u,v as f32
//pipdesc.layout.attrs[C.ATTR_vs_p_texcoord0].format = .short2n // u,v as u16 // pipdesc.layout.attrs[C.ATTR_vs_p_texcoord0].format = .short2n // u,v as u16
pipdesc.shader = shader pipdesc.shader = shader
pipdesc.index_type = .uint16 pipdesc.index_type = .uint16
pipdesc.depth_stencil = C.sg_depth_stencil_state{ pipdesc.depth_stencil = C.sg_depth_stencil_state{
depth_write_enabled: true depth_write_enabled: true
depth_compare_func : gfx.CompareFunc(C.SG_COMPAREFUNC_LESS_EQUAL) depth_compare_func: gfx.CompareFunc(C.SG_COMPAREFUNC_LESS_EQUAL)
} }
pipdesc.rasterizer = C.sg_rasterizer_state { pipdesc.rasterizer = C.sg_rasterizer_state{
cull_mode: .back cull_mode: .back
} }
pipdesc.label = "glsl_shader pipeline".str pipdesc.label = 'glsl_shader pipeline'.str
mut bind := C.sg_bindings{} mut bind := C.sg_bindings{}
unsafe {C.memset(&bind, 0, sizeof(bind))} unsafe { C.memset(&bind, 0, sizeof(bind)) }
bind.vertex_buffers[0] = vbuf bind.vertex_buffers[0] = vbuf
bind.index_buffer = ibuf bind.index_buffer = ibuf
bind.fs_images[C.SLOT_tex] = app.texture bind.fs_images[C.SLOT_tex] = app.texture
app.bind['puppy'] = bind app.bind['puppy'] = bind
app.pipe['puppy'] = gfx.make_pipeline(&pipdesc) app.pipe['puppy'] = gfx.make_pipeline(&pipdesc)
println("GLSL Puppy init DONE!") println('GLSL Puppy init DONE!')
} }
fn calc_tr_matrices(w f32, h f32, rx f32, ry f32, in_scale f32) m4.Mat4{ fn calc_tr_matrices(w f32, h f32, rx f32, ry f32, in_scale f32) m4.Mat4 {
proj := m4.perspective(60, w/h, 0.01, 10.0) proj := m4.perspective(60, w / h, 0.01, 10.0)
view := m4.look_at(m4.Vec4{e:[f32(0.0),0.0,6,0]!}, m4.Vec4{e:[f32(0),0,0,0]!}, m4.Vec4{e:[f32(0),1.0,0,0]!}) view := m4.look_at(m4.Vec4{ e: [f32(0.0), 0.0, 6, 0]! }, m4.Vec4{
e: [f32(0), 0, 0, 0]!
}, m4.Vec4{
e: [f32(0), 1.0, 0, 0]!
})
view_proj := view * proj view_proj := view * proj
rxm := m4.rotate(m4.rad(rx), m4.Vec4{e:[f32(1),0,0,0]!}) rxm := m4.rotate(m4.rad(rx), m4.Vec4{
rym := m4.rotate(m4.rad(ry), m4.Vec4{e:[f32(0),1,0,0]!}) e: [f32(1), 0, 0, 0]!
})
rym := m4.rotate(m4.rad(ry), m4.Vec4{
e: [f32(0), 1, 0, 0]!
})
model := rym * rxm model := rym * rxm
scale_m := m4.scale(m4.Vec4{e:[in_scale, in_scale, in_scale, 1]!}) scale_m := m4.scale(m4.Vec4{ e: [in_scale, in_scale, in_scale, 1]! })
res := (scale_m * model)* view_proj res := (scale_m * model) * view_proj
return res return res
} }
// march triangles draw // march triangles draw
fn draw_cube_glsl_m(app App){ fn draw_cube_glsl_m(app App) {
if app.init_flag == false { if app.init_flag == false {
return return
} }
ws := gg.window_size() ws := gg.window_size()
ratio := f32(ws.width) / ws.height ratio := f32(ws.width) / ws.height
dw := f32(ws.width / 2) dw := f32(ws.width / 2)
dh := f32(ws.height / 2) dh := f32(ws.height / 2)
rot := [f32(app.mouse_y), f32(app.mouse_x)] rot := [f32(app.mouse_y), f32(app.mouse_x)]
@ -399,18 +417,21 @@ fn draw_cube_glsl_m(app App){
//*************** //***************
// passing the view matrix as uniform // passing the view matrix as uniform
// res is a 4x4 matrix of f32 thus: 4*16 byte of size // res is a 4x4 matrix of f32 thus: 4*16 byte of size
gfx.apply_uniforms(C.SG_SHADERSTAGE_VS, C.SLOT_vs_params_m, &tr_matrix, 4*16 ) gfx.apply_uniforms(C.SG_SHADERSTAGE_VS, C.SLOT_vs_params_m, &tr_matrix, 4 * 16)
// fragment shader uniforms // fragment shader uniforms
time_ticks := f32(time.ticks() - app.ticks) / 1000 time_ticks := f32(time.ticks() - app.ticks) / 1000
mut tmp_fs_params := [ mut tmp_fs_params := [
f32(ws.width), ws.height * ratio, // x,y resolution to pass to FS f32(ws.width),
0,0, // dont send mouse position ws.height * ratio, /* x,y resolution to pass to FS */
//app.mouse_x, // mouse x 0,
//ws.height - app.mouse_y*2, // mouse y scaled 0, /* dont send mouse position */
time_ticks, // time as f32 /* app.mouse_x, // mouse x */
app.frame_count, // frame count /* ws.height - app.mouse_y*2, // mouse y scaled */
0,0 // padding bytes , see "fs_params" struct paddings in rt_glsl.h time_ticks, /* time as f32 */
app.frame_count, /* frame count */
0,
0 /* padding bytes , see "fs_params" struct paddings in rt_glsl.h */,
]! ]!
gfx.apply_uniforms(C.SG_SHADERSTAGE_FS, C.SLOT_fs_params_m, &tmp_fs_params, int(sizeof(tmp_fs_params))) gfx.apply_uniforms(C.SG_SHADERSTAGE_FS, C.SLOT_fs_params_m, &tmp_fs_params, int(sizeof(tmp_fs_params)))
@ -419,14 +440,14 @@ fn draw_cube_glsl_m(app App){
} }
// puppy triangles draw // puppy triangles draw
fn draw_cube_glsl_p(app App){ fn draw_cube_glsl_p(app App) {
if app.init_flag == false { if app.init_flag == false {
return return
} }
ws := gg.window_size() ws := gg.window_size()
ratio := f32(ws.width) / ws.height ratio := f32(ws.width) / ws.height
dw := f32(ws.width / 2) dw := f32(ws.width / 2)
dh := f32(ws.height / 2) dh := f32(ws.height / 2)
rot := [f32(app.mouse_y), f32(app.mouse_x)] rot := [f32(app.mouse_y), f32(app.mouse_x)]
@ -441,18 +462,21 @@ fn draw_cube_glsl_p(app App){
//*************** //***************
// passing the view matrix as uniform // passing the view matrix as uniform
// res is a 4x4 matrix of f32 thus: 4*16 byte of size // res is a 4x4 matrix of f32 thus: 4*16 byte of size
gfx.apply_uniforms(C.SG_SHADERSTAGE_VS, C.SLOT_vs_params_p, &tr_matrix, 4*16 ) gfx.apply_uniforms(C.SG_SHADERSTAGE_VS, C.SLOT_vs_params_p, &tr_matrix, 4 * 16)
// fragment shader uniforms // fragment shader uniforms
time_ticks := f32(time.ticks() - app.ticks) / 1000 time_ticks := f32(time.ticks() - app.ticks) / 1000
mut tmp_fs_params := [ mut tmp_fs_params := [
f32(ws.width), ws.height * ratio, // x,y resolution to pass to FS f32(ws.width),
0,0, // dont send mouse position ws.height * ratio, /* x,y resolution to pass to FS */
//app.mouse_x, // mouse x 0,
//ws.height - app.mouse_y*2, // mouse y scaled 0, /* dont send mouse position */
time_ticks, // time as f32 /* app.mouse_x, // mouse x */
app.frame_count, // frame count /* ws.height - app.mouse_y*2, // mouse y scaled */
0,0 // padding bytes , see "fs_params" struct paddings in rt_glsl.h time_ticks, /* time as f32 */
app.frame_count, /* frame count */
0,
0 /* padding bytes , see "fs_params" struct paddings in rt_glsl.h */,
]! ]!
gfx.apply_uniforms(C.SG_SHADERSTAGE_FS, C.SLOT_fs_params_p, &tmp_fs_params, int(sizeof(tmp_fs_params))) gfx.apply_uniforms(C.SG_SHADERSTAGE_FS, C.SLOT_fs_params_p, &tmp_fs_params, int(sizeof(tmp_fs_params)))
@ -460,20 +484,20 @@ fn draw_cube_glsl_p(app App){
gfx.draw(0, (3 * 2) * 3, 1) gfx.draw(0, (3 * 2) * 3, 1)
} }
fn draw_start_glsl(app App){ fn draw_start_glsl(app App) {
if app.init_flag == false { if app.init_flag == false {
return return
} }
ws := gg.window_size() ws := gg.window_size()
//ratio := f32(ws.width) / ws.height // ratio := f32(ws.width) / ws.height
//dw := f32(ws.width / 2) // dw := f32(ws.width / 2)
//dh := f32(ws.height / 2) // dh := f32(ws.height / 2)
gfx.apply_viewport(0, 0, ws.width, ws.height, true) gfx.apply_viewport(0, 0, ws.width, ws.height, true)
} }
fn draw_end_glsl(app App){ fn draw_end_glsl(app App) {
gfx.end_pass() gfx.end_pass()
gfx.commit() gfx.commit()
} }
@ -493,17 +517,17 @@ fn frame(mut app App) {
pass_action.colors[0] = color_action pass_action.colors[0] = color_action
gfx.begin_default_pass(&pass_action, ws.width, ws.height) gfx.begin_default_pass(&pass_action, ws.width, ws.height)
/* /*
// glsl cube // glsl cube
if app.frame_count % 1 == 1{ if app.frame_count % 1 == 1{
draw_cube_glsl_m(app) draw_cube_glsl_m(app)
} else { } else {
draw_cube_glsl_p(app) draw_cube_glsl_p(app)
} }
*/ */
draw_start_glsl(app) draw_start_glsl(app)
draw_cube_glsl_m(app) draw_cube_glsl_m(app)
draw_cube_glsl_p(app) draw_cube_glsl_p(app)
draw_end_glsl(app) draw_end_glsl(app)
app.frame_count++ app.frame_count++
} }
@ -531,27 +555,27 @@ fn my_init(mut app App) {
mut i := 0 mut i := 0
for i < sz { for i < sz {
unsafe { unsafe {
y := (i >> 0x8) >> 5 // 8 cell y := (i >> 0x8) >> 5 // 8 cell
x := (i & 0xFF) >> 5 // 8 cell x := (i & 0xFF) >> 5 // 8 cell
// upper left corner // upper left corner
if x==0 && y==0 { if x == 0 && y == 0 {
tmp_txt[i ] = byte(0xFF) tmp_txt[i] = byte(0xFF)
tmp_txt[i+1] = byte(0) tmp_txt[i + 1] = byte(0)
tmp_txt[i+2] = byte(0) tmp_txt[i + 2] = byte(0)
tmp_txt[i+3] = byte(0xFF) tmp_txt[i + 3] = byte(0xFF)
} }
// low right corner // low right corner
else if x==7 && y==7 { else if x == 7 && y == 7 {
tmp_txt[i ] = byte(0) tmp_txt[i] = byte(0)
tmp_txt[i+1] = byte(0xFF) tmp_txt[i + 1] = byte(0xFF)
tmp_txt[i+2] = byte(0) tmp_txt[i + 2] = byte(0)
tmp_txt[i+3] = byte(0xFF) tmp_txt[i + 3] = byte(0xFF)
} else { } else {
col := if ((x+y) & 1) == 1 {0xFF} else {128} col := if ((x + y) & 1) == 1 { 0xFF } else { 128 }
tmp_txt[i ] = byte(col) // red tmp_txt[i] = byte(col) // red
tmp_txt[i+1] = byte(col) // green tmp_txt[i + 1] = byte(col) // green
tmp_txt[i+2] = byte(col) // blue tmp_txt[i + 2] = byte(col) // blue
tmp_txt[i+3] = byte(0xFF) // alpha tmp_txt[i + 3] = byte(0xFF) // alpha
} }
i += 4 i += 4
} }
@ -574,11 +598,11 @@ fn cleanup(mut app App) {
* event * event
* *
******************************************************************************/ ******************************************************************************/
fn my_event_manager(mut ev sapp.Event, mut app App) { fn my_event_manager(mut ev gg.Event, mut app App) {
if ev.typ == .mouse_down{ if ev.typ == .mouse_down {
app.mouse_down = true app.mouse_down = true
} }
if ev.typ == .mouse_up{ if ev.typ == .mouse_up {
app.mouse_down = false app.mouse_down = false
} }
if app.mouse_down == true && ev.typ == .mouse_move { if app.mouse_down == true && ev.typ == .mouse_move {
@ -600,25 +624,25 @@ fn my_event_manager(mut ev sapp.Event, mut app App) {
* *
******************************************************************************/ ******************************************************************************/
[console] [console]
fn main(){ fn main() {
// App init // App init
mut app := &App{ mut app := &App{
gg: 0 gg: 0
} }
app.gg = gg.new_context({ app.gg = gg.new_context(
width: win_width width: win_width
height: win_height height: win_height
use_ortho: true // This is needed for 2D drawing use_ortho: true // This is needed for 2D drawing
create_window: true create_window: true
window_title: '3D Ray Marching Cube' window_title: '3D Ray Marching Cube'
user_data: app user_data: app
bg_color: bg_color bg_color: bg_color
frame_fn: frame frame_fn: frame
init_fn: my_init init_fn: my_init
cleanup_fn: cleanup cleanup_fn: cleanup
event_fn: my_event_manager event_fn: my_event_manager
}) )
app.ticks = time.ticks() app.ticks = time.ticks()
app.gg.run() app.gg.run()