mirror of
https://git.shylie.info/shylie/glerminal.git
synced 2025-09-30 12:10:07 +00:00
Initial lua API
This commit is contained in:
163
source/glerminal-main.cpp
Normal file
163
source/glerminal-main.cpp
Normal file
@@ -0,0 +1,163 @@
|
||||
#include <glerminal.h>
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
}
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WINDOWS_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
#define CHANGE_WORKING_DIRECTORY(path) !(SetCurrentDirectory(path))
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#define CHANGE_WORKING_DIRECTORY(path) chdir(path)
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
int lglerminal_quit(lua_State* L)
|
||||
{
|
||||
glerminal_quit();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lglerminal_flush(lua_State* L)
|
||||
{
|
||||
glerminal_flush();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lglerminal_set(lua_State* L)
|
||||
{
|
||||
const unsigned char x = luaL_checkinteger(L, 1) - 1;
|
||||
const unsigned char y = luaL_checkinteger(L, 2) - 1;
|
||||
const unsigned char layer = luaL_checkinteger(L, 3) - 1;
|
||||
const unsigned char sprite = luaL_checkinteger(L, 4) - 1;
|
||||
glerminal_set(x, y, layer, sprite);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lglerminal_get(lua_State* L)
|
||||
{
|
||||
const unsigned char x = luaL_checkinteger(L, 1) - 1;
|
||||
const unsigned char y = luaL_checkinteger(L, 2) - 1;
|
||||
const unsigned char layer = luaL_checkinteger(L, 3) - 1;
|
||||
lua_pushnumber(L, glerminal_get(x, y, layer) + 1);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int lglerminal_offset(lua_State* L)
|
||||
{
|
||||
const unsigned char x = luaL_checkinteger(L, 1) - 1;
|
||||
const unsigned char y = luaL_checkinteger(L, 2) - 1;
|
||||
const unsigned char layer = luaL_checkinteger(L, 3) - 1;
|
||||
const float ox = luaL_checknumber(L, 4);
|
||||
const float oy = luaL_checknumber(L, 5);
|
||||
glerminal_offset(x, y, layer, ox, oy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lglerminal_layer_color(lua_State* L)
|
||||
{
|
||||
const unsigned char layer = luaL_checkinteger(L, 1) - 1;
|
||||
const unsigned int color = luaL_checkinteger(L, 2);
|
||||
glerminal_layer_color(layer, color);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lglerminal_layer_scale(lua_State* L)
|
||||
{
|
||||
const unsigned char layer = luaL_checkinteger(L, 1) - 1;
|
||||
const float scale = luaL_checknumber(L, 2);
|
||||
glerminal_layer_scale(layer, scale);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lglerminal_load_sprites_file(lua_State* L)
|
||||
{
|
||||
const char* path = luaL_checkstring(L, 1);
|
||||
lua_pushboolean(L, glerminal_load_sprites_file(path));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const luaL_Reg lglerminal_methods[] =
|
||||
{
|
||||
{ "quit", lglerminal_quit },
|
||||
{ "flush", lglerminal_flush },
|
||||
{ "set", lglerminal_set },
|
||||
{ "get", lglerminal_get },
|
||||
{ "offset", lglerminal_offset },
|
||||
{ "tint", lglerminal_layer_color },
|
||||
{ "scale", lglerminal_layer_scale },
|
||||
{ "sprites", lglerminal_load_sprites_file },
|
||||
{ nullptr, nullptr }
|
||||
};
|
||||
|
||||
lua_State* L;
|
||||
|
||||
void init()
|
||||
{
|
||||
lua_getglobal(L, "glerminal");
|
||||
lua_getfield(L, -1, "init");
|
||||
lua_remove(L, -2);
|
||||
if (lua_pcall(L, 0, 0, 0) != LUA_OK)
|
||||
{
|
||||
// ignore error for now
|
||||
lua_remove(L, -1);
|
||||
}
|
||||
}
|
||||
|
||||
void mainloop(float dt)
|
||||
{
|
||||
lua_getglobal(L, "glerminal");
|
||||
lua_getfield(L, -1, "main");
|
||||
lua_remove(L, -2);
|
||||
lua_pushnumber(L, dt);
|
||||
if (lua_pcall(L, 1, 0, 0) != LUA_OK)
|
||||
{
|
||||
// ignore error for now
|
||||
lua_remove(L, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
std::cout << "Usage: " << argv[0] << " <project directory>" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (CHANGE_WORKING_DIRECTORY(argv[1]))
|
||||
{
|
||||
std::cout << "Failed to find project directory" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
L = luaL_newstate();
|
||||
luaL_openlibs(L);
|
||||
|
||||
luaL_newlib(L, lglerminal_methods);
|
||||
lua_setglobal(L, "glerminal");
|
||||
|
||||
luaL_dofile(L, "main.lua");
|
||||
|
||||
glerminal_run(init, mainloop);
|
||||
|
||||
lua_close(L);
|
||||
|
||||
return 0;
|
||||
}
|
@@ -35,9 +35,14 @@ namespace
|
||||
"{\n"
|
||||
" float scales[];\n"
|
||||
"} lss;\n"
|
||||
"layout (std430, binding = 1) buffer LayerColors"
|
||||
"{\n"
|
||||
" vec4 colors[];\n"
|
||||
"} lcs;\n"
|
||||
"out VS_OUT {\n"
|
||||
" flat int sprite;\n"
|
||||
" flat int layer;\n"
|
||||
" flat vec4 layer_color;\n"
|
||||
" vec2 texcoord;\n"
|
||||
"} vs_out;\n"
|
||||
"void main()\n"
|
||||
@@ -46,6 +51,7 @@ namespace
|
||||
" vec2 scaled_offset = 2 * offset * " GRID_SIZE_UNIFORM_NAME ".zw;\n"
|
||||
" vs_out.sprite = sprite;\n"
|
||||
" vs_out.layer = layer;\n"
|
||||
" vs_out.layer_color = lcs.colors[layer];\n"
|
||||
" vs_out.texcoord = vec2(position.x + 1, -position.y);\n"
|
||||
" vec2 cell_position = vec2(lss.scales[layer] + (gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) - " GRID_SIZE_UNIFORM_NAME ".x * floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z), -floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z));\n"
|
||||
" vec2 temp = ((position + vec2(-0.5, 0.5)) * lss.scales[layer] + cell_position + vec2(0.5, -0.5)) * " GRID_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1);\n"
|
||||
@@ -65,8 +71,13 @@ namespace
|
||||
"{\n"
|
||||
" float scales[];\n"
|
||||
"} lss;\n"
|
||||
"layout (std430, binding = 1) buffer LayerColors"
|
||||
"{\n"
|
||||
" vec4 colors[];\n"
|
||||
"} lcs;\n"
|
||||
"out VS_OUT {\n"
|
||||
" flat int sprite;\n"
|
||||
" flat vec4 layer_color;\n"
|
||||
" vec2 texcoord;\n"
|
||||
"} vs_out;\n"
|
||||
"void main()\n"
|
||||
@@ -76,6 +87,7 @@ namespace
|
||||
" vec2 scaled_offset = 2 * offset * " GRID_SIZE_UNIFORM_NAME ".zw;\n"
|
||||
" vs_out.sprite = sprite;\n"
|
||||
" vs_out.texcoord = vec2(position.x + 1, -position.y);\n"
|
||||
" vs_out.layer_color = lcs.colors[layer];\n"
|
||||
" vec2 cell_position = vec2(lss.scales[layer] + (gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) - " GRID_SIZE_UNIFORM_NAME ".x * floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z), -floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z));\n"
|
||||
" vec2 temp = ((position + vec2(-0.5, 0.5)) * lss.scales[layer] + cell_position + vec2(0.5, -0.5)) * " GRID_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1);\n"
|
||||
" gl_Position = vec4(scaled_offset.x + temp.x, scaled_offset.y - temp.y, 0, 1);\n"
|
||||
@@ -91,25 +103,30 @@ namespace
|
||||
"in VS_OUT {\n"
|
||||
" flat int sprite;\n"
|
||||
" flat int layer;\n"
|
||||
" flat vec4 layer_color;\n"
|
||||
" vec2 texcoord;\n"
|
||||
"} gs_in[];\n"
|
||||
"flat out int sprite;\n"
|
||||
"flat vec4 layer_color;\n"
|
||||
"out vec2 texcoord;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_Layer = gs_in[0].layer;\n"
|
||||
" gl_Position = gl_in[0].gl_Position;\n"
|
||||
" sprite = gs_in[0].sprite;\n"
|
||||
" layer_color = gs_in[0].layer_color;\n"
|
||||
" texcoord = gs_in[0].texcoord;\n"
|
||||
" EmitVertex();\n"
|
||||
" gl_Layer = gs_in[1].layer;\n"
|
||||
" gl_Position = gl_in[1].gl_Position;\n"
|
||||
" sprite = gs_in[1].sprite;\n"
|
||||
" layer_color = gs_in[1].layer_color;\n"
|
||||
" texcoord = gs_in[1].texcoord;\n"
|
||||
" EmitVertex();\n"
|
||||
" gl_Layer = gs_in[2].layer;\n"
|
||||
" gl_Position = gl_in[2].gl_Position;\n"
|
||||
" sprite = gs_in[2].sprite;\n"
|
||||
" layer_color = gs_in[2].layer_color;\n"
|
||||
" texcoord = gs_in[2].texcoord;\n"
|
||||
" EmitVertex();\n"
|
||||
" EndPrimitive();\n"
|
||||
@@ -119,13 +136,14 @@ namespace
|
||||
|
||||
constexpr char FRAGMENT_SHADER_SOURCE[] =
|
||||
"#version 450 core\n"
|
||||
"in vec2 texcoord;\n"
|
||||
"flat in int sprite;\n"
|
||||
"flat vec4 layer_color;\n"
|
||||
"in vec2 texcoord;\n"
|
||||
"layout (binding = 0) uniform sampler2DArray " SPRITES_UNIFORM_NAME ";\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" FragColor = texture(" SPRITES_UNIFORM_NAME ", vec3(texcoord, sprite));\n"
|
||||
" FragColor = layer_color * texture(" SPRITES_UNIFORM_NAME ", vec3(texcoord, sprite));\n"
|
||||
"}";
|
||||
|
||||
// note: AMD_vertex_shader_layer support required
|
||||
@@ -133,13 +151,14 @@ namespace
|
||||
"#version 450 core\n"
|
||||
"in VS_OUT {\n"
|
||||
" flat int sprite;\n"
|
||||
" flat vec4 layer_color;\n"
|
||||
" vec2 texcoord;\n"
|
||||
"} fs_in;\n"
|
||||
"layout (binding = 0) uniform sampler2DArray " SPRITES_UNIFORM_NAME ";\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" FragColor = texture(" SPRITES_UNIFORM_NAME ", vec3(fs_in.texcoord, fs_in.sprite));\n"
|
||||
" FragColor = fs_in.layer_color * texture(" SPRITES_UNIFORM_NAME ", vec3(fs_in.texcoord, fs_in.sprite));\n"
|
||||
"}";
|
||||
|
||||
constexpr const char* FRAGMENT_SHADER_SOURCE_PTR = FRAGMENT_SHADER_SOURCE;
|
||||
@@ -161,10 +180,6 @@ namespace
|
||||
"#version 450 core\n"
|
||||
"in vec2 texcoord;\n"
|
||||
"layout (binding = 1) uniform sampler2DArray " LAYERS_UNIFORM_NAME ";\n"
|
||||
"layout (std430, binding = 1) buffer LayerColors"
|
||||
"{\n"
|
||||
" vec4 colors[];\n"
|
||||
"} lcs;\n"
|
||||
"uniform int " LAYER_COUNT_UNIFORM_NAME ";\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"void main()\n"
|
||||
@@ -172,7 +187,7 @@ namespace
|
||||
" vec3 current_color = vec3(0);\n"
|
||||
" for (int i = 0; i < " LAYER_COUNT_UNIFORM_NAME "; i++)\n"
|
||||
" {\n"
|
||||
" vec4 texsample = lcs.colors[i] * texture(" LAYERS_UNIFORM_NAME ", vec3(texcoord, i));\n"
|
||||
" vec4 texsample = texture(" LAYERS_UNIFORM_NAME ", vec3(texcoord, i));\n"
|
||||
" current_color = mix(current_color, texsample.rgb, texsample.a);\n"
|
||||
" }\n"
|
||||
" FragColor = vec4(current_color, 1);\n"
|
||||
@@ -222,6 +237,8 @@ namespace glerminal
|
||||
GLERMINAL_G = this;
|
||||
|
||||
init();
|
||||
|
||||
glerminal_flush();
|
||||
}
|
||||
|
||||
glerminal::~glerminal()
|
||||
@@ -527,8 +544,8 @@ namespace glerminal
|
||||
glDeleteShader(geometry_shader);
|
||||
glDeleteShader(fragment_shader);
|
||||
|
||||
log(GL_DEBUG_TYPE_ERROR, 0, 0, "Could not compile vertex shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 0, 0, info_log);
|
||||
log(GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Could not compile vertex shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, info_log);
|
||||
throw std::runtime_error("Could not compile vertex shader.");
|
||||
}
|
||||
|
||||
@@ -541,8 +558,8 @@ namespace glerminal
|
||||
glDeleteShader(geometry_shader);
|
||||
glDeleteShader(fragment_shader);
|
||||
|
||||
log(GL_DEBUG_TYPE_ERROR, 1, 0, "Could not compile geometry shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 1, 0, info_log);
|
||||
log(GL_DEBUG_TYPE_ERROR, 1, GL_DEBUG_SEVERITY_HIGH, "Could not compile geometry shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 1, GL_DEBUG_SEVERITY_HIGH, info_log);
|
||||
throw std::runtime_error("Could not compile geometry shader.");
|
||||
}
|
||||
|
||||
@@ -555,8 +572,8 @@ namespace glerminal
|
||||
glDeleteShader(geometry_shader);
|
||||
glDeleteShader(fragment_shader);
|
||||
|
||||
log(GL_DEBUG_TYPE_ERROR, 2, 0, "Could not compile fragment shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 2, 0, info_log);
|
||||
log(GL_DEBUG_TYPE_ERROR, 2, GL_DEBUG_SEVERITY_HIGH, "Could not compile fragment shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 2, GL_DEBUG_SEVERITY_HIGH, info_log);
|
||||
throw std::runtime_error("Could not compile fragment shader.");
|
||||
}
|
||||
|
||||
@@ -582,8 +599,8 @@ namespace glerminal
|
||||
|
||||
glDeleteProgram(m_program);
|
||||
|
||||
log(GL_DEBUG_TYPE_ERROR, 3, 0, "Could not link shader program.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 3, 0, info_log);
|
||||
log(GL_DEBUG_TYPE_ERROR, 3, GL_DEBUG_SEVERITY_HIGH, "Could not link shader program.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 3, GL_DEBUG_SEVERITY_HIGH, info_log);
|
||||
throw std::runtime_error("Could not link shader program.");
|
||||
}
|
||||
|
||||
@@ -611,8 +628,8 @@ namespace glerminal
|
||||
glDeleteShader(screen_vertex_shader);
|
||||
glDeleteShader(screen_fragment_shader);
|
||||
|
||||
log(GL_DEBUG_TYPE_ERROR, 4, 0, "Could not compile screen vertex shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 4, 0, info_log);
|
||||
log(GL_DEBUG_TYPE_ERROR, 4, GL_DEBUG_SEVERITY_HIGH, "Could not compile screen vertex shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 4, GL_DEBUG_SEVERITY_HIGH, info_log);
|
||||
throw std::runtime_error("Could not compile screen vertex shader.");
|
||||
}
|
||||
|
||||
@@ -624,8 +641,8 @@ namespace glerminal
|
||||
glDeleteShader(screen_vertex_shader);
|
||||
glDeleteShader(screen_fragment_shader);
|
||||
|
||||
log(GL_DEBUG_TYPE_ERROR, 5, 0, "Could not compile screen fragment shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 5, 0, info_log);
|
||||
log(GL_DEBUG_TYPE_ERROR, 5, GL_DEBUG_SEVERITY_HIGH, "Could not compile screen fragment shader.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 5, GL_DEBUG_SEVERITY_HIGH, info_log);
|
||||
throw std::runtime_error("Could not compile screen fragment shader.");
|
||||
}
|
||||
|
||||
@@ -643,8 +660,8 @@ namespace glerminal
|
||||
{
|
||||
glDeleteProgram(m_screen_program);
|
||||
|
||||
log(GL_DEBUG_TYPE_ERROR, 6, 0, "Could not link screen shader program.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 6, 0, info_log);
|
||||
log(GL_DEBUG_TYPE_ERROR, 6, GL_DEBUG_SEVERITY_HIGH, "Could not link screen shader program.");
|
||||
log(GL_DEBUG_TYPE_ERROR, 6, GL_DEBUG_SEVERITY_HIGH, info_log);
|
||||
throw std::runtime_error("Could not link screen shader program.");
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user