mirror of
https://git.shylie.info/shylie/glerminal.git
synced 2025-10-01 04:30:06 +00:00
Initial public api version
This commit is contained in:
@@ -25,7 +25,7 @@ namespace glerminal
|
||||
class glerminal
|
||||
{
|
||||
public:
|
||||
glerminal(glerminal_main_cb main);
|
||||
glerminal(glerminal_init_cb init, glerminal_main_cb main);
|
||||
~glerminal();
|
||||
|
||||
glerminal(const glerminal&) = delete;
|
||||
@@ -41,6 +41,9 @@ namespace glerminal
|
||||
void set(unsigned char x, unsigned char y, unsigned char layer, unsigned char sprite);
|
||||
unsigned char get(unsigned char x, unsigned char y, unsigned char layer) const;
|
||||
|
||||
void update_sprite(unsigned char id, glerminal_sprite sprite);
|
||||
void update_palette_color(unsigned char id, unsigned int color);
|
||||
|
||||
private:
|
||||
GLFWwindow* m_window;
|
||||
|
||||
|
@@ -89,7 +89,7 @@ namespace
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_Position = vec4(position * 2 + 1, 0, 1);\n"
|
||||
" texcoord = -position;\n"
|
||||
" texcoord = vec2(position.x + 1, -position.y);\n"
|
||||
"}";
|
||||
|
||||
constexpr char* SCREEN_FRAGMENT_SHADER_SOURCE =
|
||||
@@ -111,7 +111,7 @@ namespace
|
||||
|
||||
namespace glerminal
|
||||
{
|
||||
glerminal::glerminal(glerminal_main_cb main) :
|
||||
glerminal::glerminal(glerminal_init_cb init, glerminal_main_cb main) :
|
||||
m_main(main),
|
||||
m_cells{ },
|
||||
m_sprites{ },
|
||||
@@ -126,6 +126,11 @@ namespace glerminal
|
||||
}
|
||||
|
||||
// unsure if this should be an error
|
||||
if (!init)
|
||||
{
|
||||
throw std::runtime_error("No init callback provided.");
|
||||
}
|
||||
|
||||
if (!m_main)
|
||||
{
|
||||
throw std::runtime_error("No main callback provided.");
|
||||
@@ -135,6 +140,8 @@ namespace glerminal
|
||||
init_gl();
|
||||
|
||||
GLERMINAL_G = this;
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
glerminal::~glerminal()
|
||||
@@ -147,17 +154,25 @@ namespace glerminal
|
||||
|
||||
void glerminal::run()
|
||||
{
|
||||
float last = glfwGetTime();
|
||||
while (!glfwWindowShouldClose(m_window))
|
||||
{
|
||||
glfwPollEvents();
|
||||
|
||||
m_main();
|
||||
const float current = glfwGetTime();
|
||||
|
||||
m_main(current - last);
|
||||
|
||||
last = current;
|
||||
}
|
||||
}
|
||||
|
||||
void glerminal::flush()
|
||||
{
|
||||
// use dirty flag later
|
||||
glNamedBufferData(m_instance_vbo, sizeof(m_cells), m_cells, GL_STREAM_DRAW);
|
||||
update_sprites();
|
||||
update_palette();
|
||||
|
||||
glUseProgram(m_program);
|
||||
glBindTexture(GL_TEXTURE_2D_ARRAY, m_sprites_texture);
|
||||
@@ -196,6 +211,23 @@ namespace glerminal
|
||||
}
|
||||
}
|
||||
|
||||
void glerminal::update_sprite(unsigned char id, glerminal_sprite sprite)
|
||||
{
|
||||
// does this work?
|
||||
reinterpret_cast<glerminal_sprite*>(m_sprites)[id] = sprite;
|
||||
}
|
||||
|
||||
void glerminal::update_palette_color(unsigned char id, unsigned int color)
|
||||
{
|
||||
if (id < 16)
|
||||
{
|
||||
m_palette[4 * id + 0] = ((color >> 24) & 0xFF) / 255.0f;
|
||||
m_palette[4 * id + 1] = ((color >> 16) & 0xFF) / 255.0f;
|
||||
m_palette[4 * id + 2] = ((color >> 8) & 0xFF) / 255.0f;
|
||||
m_palette[4 * id + 3] = ((color >> 0) & 0xFF) / 255.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void glerminal::init_glfw()
|
||||
{
|
||||
glfwInit();
|
||||
@@ -538,11 +570,11 @@ namespace glerminal
|
||||
}
|
||||
}
|
||||
|
||||
void glerminal_run(glerminal_main_cb main)
|
||||
void glerminal_run(glerminal_init_cb init, glerminal_main_cb main)
|
||||
{
|
||||
try
|
||||
{
|
||||
glerminal::glerminal(main).run();
|
||||
glerminal::glerminal(init, main).run();
|
||||
}
|
||||
catch (const std::runtime_error& e)
|
||||
{
|
||||
@@ -568,4 +600,18 @@ unsigned char glerminal_get(unsigned char x, unsigned char y, unsigned char laye
|
||||
if (!GLERMINAL_G) { return 0; }
|
||||
|
||||
return GLERMINAL_G->get(x, y, layer);
|
||||
}
|
||||
|
||||
void glerminal_update_sprite(unsigned char id, glerminal_sprite sprite)
|
||||
{
|
||||
if (!GLERMINAL_G) { return; }
|
||||
|
||||
GLERMINAL_G->update_sprite(id, sprite);
|
||||
}
|
||||
|
||||
void glerminal_update_palette(unsigned char id, unsigned int color)
|
||||
{
|
||||
if (!GLERMINAL_G) { return; }
|
||||
|
||||
GLERMINAL_G->update_palette_color(id, color);
|
||||
}
|
Reference in New Issue
Block a user