2024-12-24 09:39:08 +08:00
|
|
|
package.cpath = package.cpath..";../bin/win64/?.dll"
|
|
|
|
|
package.path = package.path..";../ffi/sokol/?.lua"
|
|
|
|
|
package.path = package.path..";../?.lua"
|
|
|
|
|
|
|
|
|
|
local sapp = require("sokol_app")
|
|
|
|
|
local sg = require("sokol_gfx")
|
|
|
|
|
local slib = require("sokol_libs") -- Warn - always after gfx!!
|
|
|
|
|
|
|
|
|
|
local ffi = require("ffi")
|
|
|
|
|
|
|
|
|
|
ffi.cdef[[
|
|
|
|
|
/* application state */
|
|
|
|
|
typedef struct state {
|
|
|
|
|
sg_pipeline pip;
|
|
|
|
|
sg_bindings bind;
|
|
|
|
|
sg_pass_action pass_action;
|
|
|
|
|
} state;
|
|
|
|
|
]]
|
|
|
|
|
|
|
|
|
|
-- --------------------------------------------------------------------------------------
|
|
|
|
|
-- Manual example of adding a created header file. This may be necessary if the compiler cant
|
|
|
|
|
-- process a complex shader.
|
|
|
|
|
|
|
|
|
|
-- local vs_source_glsl430 = ffi.new("uint8_t[194]", {
|
|
|
|
|
-- 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,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x69,0x74,
|
|
|
|
|
-- 0x69,0x6f,0x6e,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,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x0a,
|
|
|
|
|
-- 0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,
|
|
|
|
|
-- 0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,
|
|
|
|
|
-- 0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,
|
|
|
|
|
-- 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x30,0x3b,0x0a,0x7d,0x0a,
|
|
|
|
|
-- 0x0a,0x00,
|
|
|
|
|
-- })
|
|
|
|
|
|
|
|
|
|
-- local fs_source_glsl430 = ffi.new("uint8_t[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,
|
|
|
|
|
-- })
|
|
|
|
|
|
|
|
|
|
-- -- DL - Taken from the glsl.h file. I think a simple lua parser could convert to ffi fairly easy.
|
|
|
|
|
-- local shader = ffi.new("sg_shader_desc[1]")
|
|
|
|
|
-- shader[0].attrs[0].name = "position"
|
|
|
|
|
-- shader[0].attrs[1].name = "color0"
|
|
|
|
|
-- shader[0].vs.source = vs_source_glsl430
|
|
|
|
|
-- shader[0].vs.entry = "main"
|
|
|
|
|
-- shader[0].fs.source = fs_source_glsl430
|
|
|
|
|
-- shader[0].fs.entry = "main"
|
|
|
|
|
-- shader[0].label = "triangle_shader"
|
|
|
|
|
|
|
|
|
|
-- --------------------------------------------------------------------------------------
|
|
|
|
|
-- The nice way to take a glsl shader and load, compile and return a shader description
|
|
|
|
|
local shc = require("tools.shader_compiler.shc_compile").init( "sokol%-luajit", false )
|
|
|
|
|
local shader = shc.compile("./samples/triangle-sapp.glsl")
|
|
|
|
|
|
|
|
|
|
-- --------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
local state = ffi.new("state[1]")
|
|
|
|
|
|
|
|
|
|
local function slog_func(tag, log_level, log_item, message, line_nr, filename, udata)
|
|
|
|
|
print(tag .. log_level .. log_item .. message .. line_nr .. filename)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function init()
|
|
|
|
|
|
|
|
|
|
local desc = ffi.new("sg_desc[1]")
|
|
|
|
|
desc[0].environment = slib.sglue_environment()
|
|
|
|
|
desc[0].logger.func = slib.slog_func
|
|
|
|
|
|
|
|
|
|
sg.sg_setup( desc )
|
|
|
|
|
|
|
|
|
|
local vertices = ffi.new("float[21]")
|
|
|
|
|
vertices[0] = 0.0; vertices[1] = 0.5; vertices[2] = 0.5;
|
|
|
|
|
vertices[7] = 0.5; vertices[8] = -0.5; vertices[9] = 0.5;
|
|
|
|
|
vertices[14] = -0.5; vertices[15] = -0.5; vertices[16] = 0.5;
|
|
|
|
|
|
|
|
|
|
vertices[3] = 1.0; vertices[4] = 0.0; vertices[5] = 0.0; vertices[6] = 1.0;
|
|
|
|
|
vertices[10] = 0.0; vertices[11] = 1.0; vertices[12] = 0.0; vertices[13] = 1.0;
|
|
|
|
|
vertices[17] = 0.0; vertices[18] = 0.0; vertices[19] = 1.0; vertices[20] = 1.0;
|
|
|
|
|
|
|
|
|
|
local buffer_desc = ffi.new("sg_buffer_desc[1]")
|
|
|
|
|
buffer_desc[0].data.ptr = vertices
|
|
|
|
|
buffer_desc[0].data.size = 21 * ffi.sizeof("float")
|
|
|
|
|
buffer_desc[0].label = "triangle-vertices"
|
|
|
|
|
|
|
|
|
|
state[0].bind.vertex_buffers[0] = sg.sg_make_buffer(buffer_desc)
|
|
|
|
|
|
|
|
|
|
local shd = sg.sg_make_shader(shader)
|
|
|
|
|
|
|
|
|
|
local pipe_desc = ffi.new("sg_pipeline_desc[1]")
|
|
|
|
|
pipe_desc[0].shader = shd
|
|
|
|
|
pipe_desc[0].layout.attrs[0].format = 3 -- vs_position float3
|
|
|
|
|
pipe_desc[0].layout.attrs[1].format = 4 -- vs_color float4
|
|
|
|
|
pipe_desc[0].label = "triangle-pipeline"
|
|
|
|
|
|
|
|
|
|
state[0].pip = sg.sg_make_pipeline(pipe_desc)
|
|
|
|
|
|
|
|
|
|
local pass_action = ffi.new("sg_pass_action[1]")
|
|
|
|
|
pass_action[0].colors[0].load_action = sg.SG_LOADACTION_CLEAR
|
|
|
|
|
pass_action[0].colors[0].clear_value = { 0.0, 0.0, 0.0, 1.0 }
|
|
|
|
|
state[0].pass_action = pass_action[0]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function frame()
|
|
|
|
|
|
|
|
|
|
local pass = ffi.new("sg_pass[1]")
|
|
|
|
|
pass[0].action = state[0].pass_action
|
|
|
|
|
pass[0].swapchain = sg.sglue_swapchain()
|
|
|
|
|
|
|
|
|
|
sg.sg_begin_pass(pass)
|
|
|
|
|
sg.sg_apply_pipeline(state[0].pip)
|
|
|
|
|
sg.sg_apply_bindings(state[0].bind)
|
|
|
|
|
sg.sg_draw(0, 3, 1)
|
|
|
|
|
sg.sg_end_pass()
|
|
|
|
|
sg.sg_commit()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function cleanup()
|
|
|
|
|
sg.sg_shutdown()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local app_desc = ffi.new("sapp_desc[1]")
|
|
|
|
|
app_desc[0].init_cb = init
|
|
|
|
|
app_desc[0].frame_cb = frame
|
|
|
|
|
app_desc[0].cleanup_cb = cleanup
|
|
|
|
|
app_desc[0].width = 1920
|
|
|
|
|
app_desc[0].height = 1080
|
|
|
|
|
app_desc[0].window_title = "Triangle (sokol-app)"
|
|
|
|
|
app_desc[0].icon.sokol_default = true
|
|
|
|
|
app_desc[0].logger.func = slib.slog_func
|
|
|
|
|
|
2024-10-08 16:47:56 +08:00
|
|
|
sapp.sapp_run( app_desc )
|