mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-22 22:33:43 -07:00
update
This commit is contained in:
parent
97ba6a42d9
commit
91d89f75c5
3 changed files with 63 additions and 24 deletions
|
@ -1,5 +1,7 @@
|
||||||
#include "../../Window.h"
|
#include "../../Window.h"
|
||||||
#ifdef ENABLE_OPENGL
|
#ifdef ENABLE_OPENGL
|
||||||
|
#endif
|
||||||
|
#if 1
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
@ -68,6 +70,35 @@ struct Framebuffer {
|
||||||
GLuint fbo, clrbuf, clrbuf_msaa, rbo;
|
GLuint fbo, clrbuf, clrbuf_msaa, rbo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GLTexture {
|
||||||
|
GLuint gltex;
|
||||||
|
GLfloat size[2];
|
||||||
|
bool filter;
|
||||||
|
};
|
||||||
|
|
||||||
|
void CheckOpenGLError(const char* stmt, const char* fname, int line)
|
||||||
|
{
|
||||||
|
GLenum err = glGetError();
|
||||||
|
if (err != GL_NO_ERROR)
|
||||||
|
{
|
||||||
|
printf("OpenGL error %08x, at %s:%i - for %s\n", err, fname, line, stmt);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define GL_CHECK(stmt) do { \
|
||||||
|
stmt; \
|
||||||
|
CheckOpenGLError(#stmt, __FILE__, __LINE__); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define GL_CHECK(stmt) stmt
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static struct GLTexture opengl_tex[2];
|
||||||
|
static GLint opengl_curtex = 0;
|
||||||
|
|
||||||
static map<pair<uint64_t, uint32_t>, struct ShaderProgram> shader_program_pool;
|
static map<pair<uint64_t, uint32_t>, struct ShaderProgram> shader_program_pool;
|
||||||
static GLuint opengl_vbo;
|
static GLuint opengl_vbo;
|
||||||
static bool current_depth_mask;
|
static bool current_depth_mask;
|
||||||
|
@ -431,22 +462,22 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
|
||||||
|
|
||||||
vs_buf[vs_len] = '\0';
|
vs_buf[vs_len] = '\0';
|
||||||
fs_buf[fs_len] = '\0';
|
fs_buf[fs_len] = '\0';
|
||||||
/*
|
|
||||||
puts("Vertex shader:");
|
/*puts("Vertex shader:");
|
||||||
puts(vs_buf);
|
puts(vs_buf);
|
||||||
puts("Fragment shader:");
|
puts("Fragment shader:");
|
||||||
puts(fs_buf);
|
puts(fs_buf);
|
||||||
puts("End");
|
puts("End");*/
|
||||||
*/
|
|
||||||
|
|
||||||
const GLchar *sources[2] = { vs_buf, fs_buf };
|
const GLchar *sources[2] = { vs_buf, fs_buf };
|
||||||
const GLint lengths[2] = { (GLint) vs_len, (GLint) fs_len };
|
const GLint lengths[2] = { (GLint) vs_len, (GLint) fs_len };
|
||||||
GLint success;
|
GLint success;
|
||||||
|
|
||||||
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
glShaderSource(vertex_shader, 1, &sources[0], &lengths[0]);
|
GL_CHECK(glShaderSource(vertex_shader, 1, &sources[0], &lengths[0]));
|
||||||
glCompileShader(vertex_shader);
|
GL_CHECK(glCompileShader(vertex_shader));
|
||||||
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
|
GL_CHECK(glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success));
|
||||||
if (!success) {
|
if (!success) {
|
||||||
GLint max_length = 0;
|
GLint max_length = 0;
|
||||||
glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &max_length);
|
glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &max_length);
|
||||||
|
@ -458,12 +489,12 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
glShaderSource(fragment_shader, 1, &sources[1], &lengths[1]);
|
GL_CHECK(glShaderSource(fragment_shader, 1, &sources[1], &lengths[1]));
|
||||||
glCompileShader(fragment_shader);
|
GL_CHECK(glCompileShader(fragment_shader));
|
||||||
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
|
GL_CHECK(glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success));
|
||||||
if (!success) {
|
if (!success) {
|
||||||
GLint max_length = 0;
|
GLint max_length = 0;
|
||||||
glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &max_length);
|
GL_CHECK(glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &max_length));
|
||||||
char error_log[1024];
|
char error_log[1024];
|
||||||
fprintf(stderr, "Fragment shader compilation failed\n");
|
fprintf(stderr, "Fragment shader compilation failed\n");
|
||||||
glGetShaderInfoLog(fragment_shader, max_length, &max_length, &error_log[0]);
|
glGetShaderInfoLog(fragment_shader, max_length, &max_length, &error_log[0]);
|
||||||
|
@ -472,9 +503,9 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint shader_program = glCreateProgram();
|
GLuint shader_program = glCreateProgram();
|
||||||
glAttachShader(shader_program, vertex_shader);
|
GL_CHECK(glAttachShader(shader_program, vertex_shader));
|
||||||
glAttachShader(shader_program, fragment_shader);
|
GL_CHECK(glAttachShader(shader_program, fragment_shader));
|
||||||
glLinkProgram(shader_program);
|
GL_CHECK(glLinkProgram(shader_program));
|
||||||
|
|
||||||
size_t cnt = 0;
|
size_t cnt = 0;
|
||||||
|
|
||||||
|
@ -535,13 +566,13 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
|
||||||
GLint sampler_location = glGetUniformLocation(shader_program, "uTex0");
|
GLint sampler_location = glGetUniformLocation(shader_program, "uTex0");
|
||||||
GLint uniform_location_0 = glGetUniformLocation(shader_program, "texSize0");
|
GLint uniform_location_0 = glGetUniformLocation(shader_program, "texSize0");
|
||||||
glUniform1i(sampler_location, 0);
|
glUniform1i(sampler_location, 0);
|
||||||
glUniform2f(uniform_location_0, 64.0,32.0);
|
glUniform2f(uniform_location_0, opengl_tex[0].size[0], opengl_tex[0].size[1]);
|
||||||
}
|
}
|
||||||
if (cc_features.used_textures[1]) {
|
if (cc_features.used_textures[1]) {
|
||||||
GLint sampler_location = glGetUniformLocation(shader_program, "uTex1");
|
GLint sampler_location = glGetUniformLocation(shader_program, "uTex1");
|
||||||
GLint uniform_location_1 = glGetUniformLocation(shader_program, "texSize1");
|
GLint uniform_location_1 = glGetUniformLocation(shader_program, "texSize1");
|
||||||
glUniform1i(sampler_location, 1);
|
GL_CHECK(glUniform1i(sampler_location, 1));
|
||||||
glUniform2f(uniform_location_1, 128.0,64.0);
|
GL_CHECK(glUniform2f(uniform_location_1, opengl_tex[1].size[0], opengl_tex[1].size[1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc_features.opt_alpha && cc_features.opt_noise) {
|
if (cc_features.opt_alpha && cc_features.opt_noise) {
|
||||||
|
@ -567,6 +598,7 @@ static void gfx_opengl_shader_get_info(struct ShaderProgram *prg, uint8_t *num_i
|
||||||
}
|
}
|
||||||
|
|
||||||
static GLuint gfx_opengl_new_texture(void) {
|
static GLuint gfx_opengl_new_texture(void) {
|
||||||
|
|
||||||
GLuint ret;
|
GLuint ret;
|
||||||
glGenTextures(1, &ret);
|
glGenTextures(1, &ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -577,10 +609,15 @@ static void gfx_opengl_delete_texture(uint32_t texID) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gfx_opengl_select_texture(int tile, GLuint texture_id) {
|
static void gfx_opengl_select_texture(int tile, GLuint texture_id) {
|
||||||
|
//printf("CURTEX: %d\n", texture_id);
|
||||||
|
opengl_curtex = texture_id;
|
||||||
glActiveTexture(GL_TEXTURE0 + tile);
|
glActiveTexture(GL_TEXTURE0 + tile);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture_id);
|
glBindTexture(GL_TEXTURE_2D, texture_id);
|
||||||
}
|
}
|
||||||
static void gfx_opengl_upload_texture(const uint8_t *rgba32_buf, uint32_t width, uint32_t height) {
|
static void gfx_opengl_upload_texture(const uint8_t *rgba32_buf, uint32_t width, uint32_t height) {
|
||||||
|
//printf("SHIT: texture %d: %d x %d\n", opengl_curtex, width, height);
|
||||||
|
opengl_tex[opengl_curtex].size[0] = width;
|
||||||
|
opengl_tex[opengl_curtex].size[1] = height;
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba32_buf);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba32_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -600,7 +637,7 @@ static uint32_t gfx_cm_to_opengl(uint32_t val) {
|
||||||
|
|
||||||
static void gfx_opengl_set_sampler_parameters(int tile, bool linear_filter, uint32_t cms, uint32_t cmt) {
|
static void gfx_opengl_set_sampler_parameters(int tile, bool linear_filter, uint32_t cms, uint32_t cmt) {
|
||||||
const GLint filter = linear_filter && current_filter_mode == LINEAR ? GL_LINEAR : GL_NEAREST;
|
const GLint filter = linear_filter && current_filter_mode == LINEAR ? GL_LINEAR : GL_NEAREST;
|
||||||
glActiveTexture(GL_TEXTURE0 + tile);
|
GL_CHECK(glActiveTexture(GL_TEXTURE0 + tile));
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gfx_cm_to_opengl(cms));
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gfx_cm_to_opengl(cms));
|
||||||
|
@ -646,8 +683,10 @@ static void gfx_opengl_set_use_alpha(bool use_alpha) {
|
||||||
|
|
||||||
static void gfx_opengl_draw_triangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) {
|
static void gfx_opengl_draw_triangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) {
|
||||||
//printf("flushing %d tris\n", buf_vbo_num_tris);
|
//printf("flushing %d tris\n", buf_vbo_num_tris);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buf_vbo_len, buf_vbo, GL_STREAM_DRAW);
|
GL_CHECK(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buf_vbo_len, buf_vbo, GL_STREAM_DRAW));
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3 * buf_vbo_num_tris);
|
//GL_CHECK(glDrawArrays(GL_TRIANGLES, 0, 3 * buf_vbo_num_tris));
|
||||||
|
GL_CHECK(glDrawArrays(GL_POINTS, 0, buf_vbo_num_tris));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gfx_opengl_init(void) {
|
static void gfx_opengl_init(void) {
|
||||||
|
|
|
@ -256,14 +256,14 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
|
||||||
|
|
||||||
// Store GLSL version string so we can refer to it later in case we recreate shaders.
|
// Store GLSL version string so we can refer to it later in case we recreate shaders.
|
||||||
// Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure.
|
// Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure.
|
||||||
if (glsl_version == NULL || true)
|
if (glsl_version == NULL)
|
||||||
{
|
{
|
||||||
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
||||||
glsl_version = "#version 100";
|
glsl_version = "#version 100";
|
||||||
#elif defined(IMGUI_IMPL_OPENGL_ES3)
|
#elif defined(IMGUI_IMPL_OPENGL_ES3)
|
||||||
glsl_version = "#version 300 es";
|
glsl_version = "#version 300 es";
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
glsl_version = "#version 150";
|
glsl_version = "#version 120";
|
||||||
#else
|
#else
|
||||||
glsl_version = "#version 130";
|
glsl_version = "#version 130";
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -154,7 +154,7 @@ namespace SohImGui {
|
||||||
switch (impl.backend) {
|
switch (impl.backend) {
|
||||||
case Backend::SDL:
|
case Backend::SDL:
|
||||||
#if __APPLE__
|
#if __APPLE__
|
||||||
ImGui_ImplOpenGL3_Init("#version 120");
|
ImGui_ImplOpenGL3_Init("#version 420");
|
||||||
#else
|
#else
|
||||||
ImGui_ImplOpenGL3_Init("#version 120");
|
ImGui_ImplOpenGL3_Init("#version 120");
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue