diff --git a/gl/glsl_common.cpp b/gl/glsl_common.cpp index fd2bfd69..7ebbcce6 100644 --- a/gl/glsl_common.cpp +++ b/gl/glsl_common.cpp @@ -63,6 +63,7 @@ void gl::glsl_common_setup() { mat4 projection; mat4 lightview; + vec3 scene_extra; float time; }; diff --git a/gl/shader.cpp b/gl/shader.cpp index a9722ce8..a7d28a2f 100644 --- a/gl/shader.cpp +++ b/gl/shader.cpp @@ -228,6 +228,8 @@ gl::shader::shader(const std::string &filename) type = GL_VERTEX_SHADER; else if (strcend(filename, ".frag")) type = GL_FRAGMENT_SHADER; + else if (strcend(filename, ".geom")) + type = GL_GEOMETRY_SHADER; else throw shader_exception("unknown shader " + filename); diff --git a/gl/ubo.h b/gl/ubo.h index eb3dd810..c8ce5167 100644 --- a/gl/ubo.h +++ b/gl/ubo.h @@ -37,8 +37,8 @@ namespace gl { glm::mat4 projection; glm::mat4 lightview; + glm::vec3 scene_extra; float time; - UBS_PAD(12); }; static_assert(sizeof(scene_ubs) == 144, "bad size of ubs"); diff --git a/ref/glad/include/glad/glad.h b/ref/glad/include/glad/glad.h index 6af388db..3bb95c8b 100644 --- a/ref/glad/include/glad/glad.h +++ b/ref/glad/include/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL, OpenGL ES loader generated by glad 0.1.28 on Mon Oct 15 19:49:56 2018. + OpenGL, OpenGL ES loader generated by glad 0.1.29 on -. Language/Generator: C/C++ Specification: gl @@ -26,6 +26,7 @@ GL_EXT_clip_control, GL_EXT_color_buffer_float, GL_EXT_color_buffer_half_float, + GL_EXT_geometry_shader, GL_EXT_sRGB, GL_EXT_texture_compression_s3tc, GL_EXT_texture_compression_s3tc_srgb, @@ -40,12 +41,12 @@ Loader: False Local files: False Omit khrplatform: True - Reproducible: False + Reproducible: True Commandline: - --profile="core" --api="gl=3.3,gles2=3.1" --generator="c" --spec="gl" --no-loader --omit-khrplatform --extensions="GL_ANGLE_depth_texture,GL_ANGLE_framebuffer_blit,GL_ANGLE_framebuffer_multisample,GL_ANGLE_instanced_arrays,GL_ANGLE_pack_reverse_row_order,GL_ANGLE_program_binary,GL_ANGLE_texture_compression_dxt3,GL_ANGLE_texture_compression_dxt5,GL_ANGLE_texture_usage,GL_ANGLE_translated_shader_source,GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_EXT_clip_control,GL_EXT_color_buffer_float,GL_EXT_color_buffer_half_float,GL_EXT_sRGB,GL_EXT_texture_compression_s3tc,GL_EXT_texture_compression_s3tc_srgb,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_OES_texture_float,GL_OES_texture_float_linear,GL_OES_texture_half_float,GL_OES_texture_half_float_linear,GL_OES_vertex_half_float" + --profile="core" --api="gl=3.3,gles2=3.1" --generator="c" --spec="gl" --no-loader --omit-khrplatform --extensions="GL_ANGLE_depth_texture,GL_ANGLE_framebuffer_blit,GL_ANGLE_framebuffer_multisample,GL_ANGLE_instanced_arrays,GL_ANGLE_pack_reverse_row_order,GL_ANGLE_program_binary,GL_ANGLE_texture_compression_dxt3,GL_ANGLE_texture_compression_dxt5,GL_ANGLE_texture_usage,GL_ANGLE_translated_shader_source,GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_EXT_clip_control,GL_EXT_color_buffer_float,GL_EXT_color_buffer_half_float,GL_EXT_geometry_shader,GL_EXT_sRGB,GL_EXT_texture_compression_s3tc,GL_EXT_texture_compression_s3tc_srgb,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_OES_texture_float,GL_OES_texture_float_linear,GL_OES_texture_half_float,GL_OES_texture_half_float_linear,GL_OES_vertex_half_float" Online: - http://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.1&extensions=GL_ANGLE_depth_texture&extensions=GL_ANGLE_framebuffer_blit&extensions=GL_ANGLE_framebuffer_multisample&extensions=GL_ANGLE_instanced_arrays&extensions=GL_ANGLE_pack_reverse_row_order&extensions=GL_ANGLE_program_binary&extensions=GL_ANGLE_texture_compression_dxt3&extensions=GL_ANGLE_texture_compression_dxt5&extensions=GL_ANGLE_texture_usage&extensions=GL_ANGLE_translated_shader_source&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_ARB_texture_storage&extensions=GL_ARB_texture_storage_multisample&extensions=GL_EXT_clip_control&extensions=GL_EXT_color_buffer_float&extensions=GL_EXT_color_buffer_half_float&extensions=GL_EXT_sRGB&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_compression_s3tc_srgb&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_OES_texture_float&extensions=GL_OES_texture_float_linear&extensions=GL_OES_texture_half_float&extensions=GL_OES_texture_half_float_linear&extensions=GL_OES_vertex_half_float + https://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.1&extensions=GL_ANGLE_depth_texture&extensions=GL_ANGLE_framebuffer_blit&extensions=GL_ANGLE_framebuffer_multisample&extensions=GL_ANGLE_instanced_arrays&extensions=GL_ANGLE_pack_reverse_row_order&extensions=GL_ANGLE_program_binary&extensions=GL_ANGLE_texture_compression_dxt3&extensions=GL_ANGLE_texture_compression_dxt5&extensions=GL_ANGLE_texture_usage&extensions=GL_ANGLE_translated_shader_source&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_ARB_texture_storage&extensions=GL_ARB_texture_storage_multisample&extensions=GL_EXT_clip_control&extensions=GL_EXT_color_buffer_float&extensions=GL_EXT_color_buffer_half_float&extensions=GL_EXT_geometry_shader&extensions=GL_EXT_sRGB&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_compression_s3tc_srgb&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_OES_texture_float&extensions=GL_OES_texture_float_linear&extensions=GL_OES_texture_half_float&extensions=GL_OES_texture_half_float_linear&extensions=GL_OES_vertex_half_float */ @@ -2745,6 +2746,39 @@ GLAPI PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor; #define GL_R16F_EXT 0x822D #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 #define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 #define GL_HALF_FLOAT_OES 0x8D61 #ifndef GL_ARB_clip_control @@ -3181,6 +3215,13 @@ GLAPI int GLAD_GL_EXT_color_buffer_float; #define GL_EXT_color_buffer_half_float 1 GLAPI int GLAD_GL_EXT_color_buffer_half_float; #endif +#ifndef GL_EXT_geometry_shader +#define GL_EXT_geometry_shader 1 +GLAPI int GLAD_GL_EXT_geometry_shader; +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT; +#define glFramebufferTextureEXT glad_glFramebufferTextureEXT +#endif #ifndef GL_EXT_sRGB #define GL_EXT_sRGB 1 GLAPI int GLAD_GL_EXT_sRGB; diff --git a/ref/glad/src/glad.c b/ref/glad/src/glad.c index 01896d1e..5cbdcb11 100644 --- a/ref/glad/src/glad.c +++ b/ref/glad/src/glad.c @@ -1,6 +1,6 @@ /* - OpenGL, OpenGL ES loader generated by glad 0.1.28 on Mon Oct 15 19:49:56 2018. + OpenGL, OpenGL ES loader generated by glad 0.1.29 on -. Language/Generator: C/C++ Specification: gl @@ -26,6 +26,7 @@ GL_EXT_clip_control, GL_EXT_color_buffer_float, GL_EXT_color_buffer_half_float, + GL_EXT_geometry_shader, GL_EXT_sRGB, GL_EXT_texture_compression_s3tc, GL_EXT_texture_compression_s3tc_srgb, @@ -40,12 +41,12 @@ Loader: False Local files: False Omit khrplatform: True - Reproducible: False + Reproducible: True Commandline: - --profile="core" --api="gl=3.3,gles2=3.1" --generator="c" --spec="gl" --no-loader --omit-khrplatform --extensions="GL_ANGLE_depth_texture,GL_ANGLE_framebuffer_blit,GL_ANGLE_framebuffer_multisample,GL_ANGLE_instanced_arrays,GL_ANGLE_pack_reverse_row_order,GL_ANGLE_program_binary,GL_ANGLE_texture_compression_dxt3,GL_ANGLE_texture_compression_dxt5,GL_ANGLE_texture_usage,GL_ANGLE_translated_shader_source,GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_EXT_clip_control,GL_EXT_color_buffer_float,GL_EXT_color_buffer_half_float,GL_EXT_sRGB,GL_EXT_texture_compression_s3tc,GL_EXT_texture_compression_s3tc_srgb,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_OES_texture_float,GL_OES_texture_float_linear,GL_OES_texture_half_float,GL_OES_texture_half_float_linear,GL_OES_vertex_half_float" + --profile="core" --api="gl=3.3,gles2=3.1" --generator="c" --spec="gl" --no-loader --omit-khrplatform --extensions="GL_ANGLE_depth_texture,GL_ANGLE_framebuffer_blit,GL_ANGLE_framebuffer_multisample,GL_ANGLE_instanced_arrays,GL_ANGLE_pack_reverse_row_order,GL_ANGLE_program_binary,GL_ANGLE_texture_compression_dxt3,GL_ANGLE_texture_compression_dxt5,GL_ANGLE_texture_usage,GL_ANGLE_translated_shader_source,GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_EXT_clip_control,GL_EXT_color_buffer_float,GL_EXT_color_buffer_half_float,GL_EXT_geometry_shader,GL_EXT_sRGB,GL_EXT_texture_compression_s3tc,GL_EXT_texture_compression_s3tc_srgb,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_OES_texture_float,GL_OES_texture_float_linear,GL_OES_texture_half_float,GL_OES_texture_half_float_linear,GL_OES_vertex_half_float" Online: - http://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.1&extensions=GL_ANGLE_depth_texture&extensions=GL_ANGLE_framebuffer_blit&extensions=GL_ANGLE_framebuffer_multisample&extensions=GL_ANGLE_instanced_arrays&extensions=GL_ANGLE_pack_reverse_row_order&extensions=GL_ANGLE_program_binary&extensions=GL_ANGLE_texture_compression_dxt3&extensions=GL_ANGLE_texture_compression_dxt5&extensions=GL_ANGLE_texture_usage&extensions=GL_ANGLE_translated_shader_source&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_ARB_texture_storage&extensions=GL_ARB_texture_storage_multisample&extensions=GL_EXT_clip_control&extensions=GL_EXT_color_buffer_float&extensions=GL_EXT_color_buffer_half_float&extensions=GL_EXT_sRGB&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_compression_s3tc_srgb&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_OES_texture_float&extensions=GL_OES_texture_float_linear&extensions=GL_OES_texture_half_float&extensions=GL_OES_texture_half_float_linear&extensions=GL_OES_vertex_half_float + https://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.1&extensions=GL_ANGLE_depth_texture&extensions=GL_ANGLE_framebuffer_blit&extensions=GL_ANGLE_framebuffer_multisample&extensions=GL_ANGLE_instanced_arrays&extensions=GL_ANGLE_pack_reverse_row_order&extensions=GL_ANGLE_program_binary&extensions=GL_ANGLE_texture_compression_dxt3&extensions=GL_ANGLE_texture_compression_dxt5&extensions=GL_ANGLE_texture_usage&extensions=GL_ANGLE_translated_shader_source&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_ARB_texture_storage&extensions=GL_ARB_texture_storage_multisample&extensions=GL_EXT_clip_control&extensions=GL_EXT_color_buffer_float&extensions=GL_EXT_color_buffer_half_float&extensions=GL_EXT_geometry_shader&extensions=GL_EXT_sRGB&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_compression_s3tc_srgb&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_OES_texture_float&extensions=GL_OES_texture_float_linear&extensions=GL_OES_texture_half_float&extensions=GL_OES_texture_half_float_linear&extensions=GL_OES_vertex_half_float */ #include @@ -78,11 +79,7 @@ static int get_exts(void) { num_exts_i = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i); if (num_exts_i > 0) { - char **tmp_exts_i = (char **)realloc((void *)exts_i, (size_t)num_exts_i * (sizeof *exts_i)); - if (tmp_exts_i == NULL) { - return 0; - } - exts_i = tmp_exts_i; + exts_i = (char **)malloc((size_t)num_exts_i * (sizeof *exts_i)); } if (exts_i == NULL) { @@ -646,6 +643,7 @@ int GLAD_GL_ARB_texture_storage_multisample = 0; int GLAD_GL_EXT_clip_control = 0; int GLAD_GL_EXT_color_buffer_float = 0; int GLAD_GL_EXT_color_buffer_half_float = 0; +int GLAD_GL_EXT_geometry_shader = 0; int GLAD_GL_EXT_sRGB = 0; int GLAD_GL_EXT_texture_compression_s3tc = 0; int GLAD_GL_EXT_texture_compression_s3tc_srgb = 0; @@ -771,6 +769,7 @@ PFNGLDRAWELEMENTSINSTANCEDANGLEPROC glad_glDrawElementsInstancedANGLE = NULL; PFNGLVERTEXATTRIBDIVISORANGLEPROC glad_glVertexAttribDivisorANGLE = NULL; PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC glad_glGetTranslatedShaderSourceANGLE = NULL; PFNGLCLIPCONTROLEXTPROC glad_glClipControlEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT = NULL; static void load_GL_VERSION_1_0(GLADloadproc load) { if(!GLAD_GL_VERSION_1_0) return; glad_glCullFace = (PFNGLCULLFACEPROC)load("glCullFace"); @@ -1756,6 +1755,10 @@ static void load_GL_EXT_clip_control(GLADloadproc load) { if(!GLAD_GL_EXT_clip_control) return; glad_glClipControlEXT = (PFNGLCLIPCONTROLEXTPROC)load("glClipControlEXT"); } +static void load_GL_EXT_geometry_shader(GLADloadproc load) { + if(!GLAD_GL_EXT_geometry_shader) return; + glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)load("glFramebufferTextureEXT"); +} static int find_extensionsGLES2(void) { if (!get_exts()) return 0; GLAD_GL_ANGLE_depth_texture = has_ext("GL_ANGLE_depth_texture"); @@ -1771,6 +1774,7 @@ static int find_extensionsGLES2(void) { GLAD_GL_EXT_clip_control = has_ext("GL_EXT_clip_control"); GLAD_GL_EXT_color_buffer_float = has_ext("GL_EXT_color_buffer_float"); GLAD_GL_EXT_color_buffer_half_float = has_ext("GL_EXT_color_buffer_half_float"); + GLAD_GL_EXT_geometry_shader = has_ext("GL_EXT_geometry_shader"); GLAD_GL_EXT_sRGB = has_ext("GL_EXT_sRGB"); GLAD_GL_EXT_texture_compression_s3tc = has_ext("GL_EXT_texture_compression_s3tc"); GLAD_GL_EXT_texture_compression_s3tc_srgb = has_ext("GL_EXT_texture_compression_s3tc_srgb"); @@ -1845,6 +1849,7 @@ int gladLoadGLES2Loader(GLADloadproc load) { load_GL_ANGLE_instanced_arrays(load); load_GL_ANGLE_translated_shader_source(load); load_GL_EXT_clip_control(load); + load_GL_EXT_geometry_shader(load); return GLVersion.major != 0 || GLVersion.minor != 0; } diff --git a/scene.cpp b/scene.cpp index 2a2cda45..7df09c95 100644 --- a/scene.cpp +++ b/scene.cpp @@ -1718,7 +1718,7 @@ void basic_region::update_poi_geometry() { std::vector vertices; for (const auto sem : map::Objects.entries) - vertices.push_back(gfx::basic_vertex(sem->location, glm::vec3(), glm::vec3())); + vertices.push_back(std::move(sem->vertex())); if (!m_map_poipoints) { gfx::geometrybank_handle poibank = GfxRenderer.Create_Bank(); diff --git a/scenenodegroups.cpp b/scenenodegroups.cpp index a145b8dc..64373df3 100644 --- a/scenenodegroups.cpp +++ b/scenenodegroups.cpp @@ -89,13 +89,20 @@ node_groups::update_map() if (!launcher || !launcher->Event1 || !launcher->Event2) continue; - auto track_switch = std::make_shared(); - map::Objects.entries.push_back(track_switch); + auto map_launcher = std::make_shared(); + map::Objects.entries.push_back(map_launcher); - track_switch->location = node->location(); - track_switch->name = node->name(); - track_switch->straight_event = launcher->Event1; - track_switch->divert_event = launcher->Event2; + map_launcher->location = node->location(); + map_launcher->name = node->name(); + map_launcher->first_event = launcher->Event1; + map_launcher->second_event = launcher->Event2; + if (map_launcher->name.empty()) + map_launcher->name = launcher->Event1->name(); + + if (launcher->Event1->name().find_first_of("-+:") != std::string::npos) + map_launcher->type = map::launcher::track_switch; + else + map_launcher->type = map::launcher::level_crossing; } } } diff --git a/shaders/map.vert b/shaders/map.vert index 9bdb5848..149efb62 100644 --- a/shaders/map.vert +++ b/shaders/map.vert @@ -1,4 +1,7 @@ layout(location = 0) in vec3 v_vert; +layout(location = 2) in vec2 v_coords; + +out vec2 g_coords; #include @@ -7,4 +10,5 @@ void main() vec4 clip_pos = projection * vec4(v_vert, 1.0f); gl_Position = vec4(clip_pos.xz, 0.5, 1.0); + g_coords = v_coords; } diff --git a/shaders/map_poi.frag b/shaders/map_poi.frag new file mode 100644 index 00000000..cb8c43ea --- /dev/null +++ b/shaders/map_poi.frag @@ -0,0 +1,14 @@ +in vec2 f_coords; + +layout(location = 0) out vec4 out_color; + +#texture (tex1, 0, sRGB_A) +uniform sampler2D tex1; + +void main() +{ + vec2 texcoord = f_coords; + vec4 color = texture(tex1, texcoord); + + out_color = color; +} diff --git a/shaders/map_poi.geom b/shaders/map_poi.geom new file mode 100644 index 00000000..25f12fe6 --- /dev/null +++ b/shaders/map_poi.geom @@ -0,0 +1,30 @@ +layout (points) in; +layout (triangle_strip, max_vertices = 4) out; + +in vec2 g_coords[]; +out vec2 f_coords; + +#include + +void main() { + vec4 position = gl_in[0].gl_Position; + vec2 size = vec2(0.1) * scene_extra.xy; + + gl_Position = position + vec4(-size.x, -size.y, 0.0, 0.0); + f_coords = vec2(g_coords[0].s, 0.0); + EmitVertex(); + + gl_Position = position + vec4( size.x, -size.y, 0.0, 0.0); + f_coords = vec2(g_coords[0].t, 0.0); + EmitVertex(); + + gl_Position = position + vec4(-size.x, size.y, 0.0, 0.0); + f_coords = vec2(g_coords[0].s, 1.0); + EmitVertex(); + + gl_Position = position + vec4( size.x, size.y, 0.0, 0.0); + f_coords = vec2(g_coords[0].t, 1.0); + EmitVertex(); + + EndPrimitive(); +} diff --git a/translation.cpp b/translation.cpp index c5827b95..b57ce2ca 100644 --- a/translation.cpp +++ b/translation.cpp @@ -107,6 +107,8 @@ init() { "Straight |", "Divert /", + "Open |", + "Close -", "Insert obstacle:", "Delete obstacle", @@ -308,6 +310,8 @@ init() { u8"Prosto |", u8"W bok /", + u8"Otwórz |", + u8"Zamknij -", u8"Wstaw przeszkodę:", u8"Usuń przeszkodę", diff --git a/translation.h b/translation.h index 5f0e572d..a1be84cd 100644 --- a/translation.h +++ b/translation.h @@ -96,6 +96,8 @@ enum string { map_straight, map_divert, + map_open, + map_close, map_obstacle_insert, map_obstacle_remove, diff --git a/widgets/map.cpp b/widgets/map.cpp index 156f32a0..04920633 100644 --- a/widgets/map.cpp +++ b/widgets/map.cpp @@ -16,8 +16,11 @@ ui::map_panel::map_panel() : ui_panel(LOC_STR(ui_map), false) gl::shader vert("map.vert"); gl::shader frag("map.frag"); - gl::program *prog = new gl::program({vert, frag}); - m_shader = std::unique_ptr(prog); + gl::shader poi_frag("map_poi.frag"); + gl::shader poi_geom("map_poi.geom"); + m_track_shader = std::unique_ptr(new gl::program({vert, frag})); + m_poi_shader = std::unique_ptr(new gl::program({vert, poi_frag, poi_geom})); + m_icon_atlas = GfxRenderer.Fetch_Texture("map_icons"); m_tex = std::make_unique(); m_tex->alloc_rendertarget(GL_RGB8, GL_RGB, fb_size, fb_size); @@ -100,7 +103,7 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si m_fb->bind(); } - m_shader->bind(); + m_track_shader->bind(); glLineWidth(1.5f); glViewport(0, 0, surface_size.x, surface_size.y); @@ -117,7 +120,10 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si scene_ubo->update(scene_ubs); GfxRenderer.Draw_Geometry(m_switch_handles.begin(), m_switch_handles.end()); - glPointSize(5.0f); + GfxRenderer.Bind_Texture(0, m_icon_atlas); + m_poi_shader->bind(); + scene_ubs.scene_extra = glm::vec3(1.0f / (surface_size / 200.0f), 1.0f); + scene_ubs.time = 1.0f; scene_ubo->update(scene_ubs); GfxRenderer.Draw_Geometry(simulation::Region->get_map_poi_geometry()); @@ -126,7 +132,7 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si m_fb->blit_from(m_msaa_fb.get(), surface_size.x, surface_size.y, GL_COLOR_BUFFER_BIT, GL_COLOR_ATTACHMENT0); gl::framebuffer::unbind(); - m_shader->unbind(); + gl::program::unbind(); } void ui::map_panel::render_labels(glm::mat4 transform, ImVec2 origin, glm::vec2 surface_size) @@ -285,9 +291,9 @@ void ui::handle_map_object_click(ui_panel &parent, std::shared_ptr(parent, std::move(sem))); } - else if (auto track = std::dynamic_pointer_cast(obj)) + else if (auto track = std::dynamic_pointer_cast(obj)) { - parent.register_popup(std::make_unique(parent, std::move(track))); + parent.register_popup(std::make_unique(parent, std::move(track))); } else if (auto obstacle = std::dynamic_pointer_cast(obj)) { @@ -411,21 +417,29 @@ void ui::semaphore_window::render_content() } } -ui::switch_window::switch_window(ui_panel &panel, std::shared_ptr &&sw) : popup(panel), m_switch(sw) {} +ui::launcher_window::launcher_window(ui_panel &panel, std::shared_ptr &&sw) : popup(panel), m_switch(sw) {} -void ui::switch_window::render_content() +void ui::launcher_window::render_content() { ImGui::TextUnformatted(m_switch->name.c_str()); - if (ImGui::Button(LOC_STR(map_straight))) + const std::string &open_label = locale::strings[ + m_switch->type == map::launcher::track_switch + ? locale::string::map_straight : locale::string::map_open]; + + const std::string &close_label = locale::strings[ + m_switch->type == map::launcher::track_switch + ? locale::string::map_divert : locale::string::map_close]; + + if (ImGui::Button(open_label.c_str())) { - m_relay.post(user_command::queueevent, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &m_switch->straight_event->name()); + m_relay.post(user_command::queueevent, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &m_switch->first_event->name()); ImGui::CloseCurrentPopup(); } - if (ImGui::Button(LOC_STR(map_divert))) + if (ImGui::Button(close_label.c_str())) { - m_relay.post(user_command::queueevent, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &m_switch->divert_event->name()); + m_relay.post(user_command::queueevent, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &m_switch->second_event->name()); ImGui::CloseCurrentPopup(); } } @@ -473,12 +487,13 @@ void ui::obstacle_insert_window::render_content() obstacle->name = entry.first; obstacle->location = m_position; obstacle->model_name = name; - map::Objects.entries.push_back(std::move(obstacle)); std::vector vertices; - vertices.emplace_back((glm::vec3)m_position, glm::vec3(), glm::vec3()); + vertices.emplace_back(std::move(obstacle->vertex())); GfxRenderer.Append(vertices, simulation::Region->get_map_poi_geometry(), GL_POINTS); + map::Objects.entries.push_back(std::move(obstacle)); + ImGui::CloseCurrentPopup(); } } diff --git a/widgets/map.h b/widgets/map.h index 158bd23c..abc3708d 100644 --- a/widgets/map.h +++ b/widgets/map.h @@ -31,13 +31,13 @@ class semaphore_window : public popup virtual void render_content() override; }; -class switch_window : public popup +class launcher_window : public popup { - std::shared_ptr m_switch; + std::shared_ptr m_switch; command_relay m_relay; public: - switch_window(ui_panel &panel, std::shared_ptr &&sw); + launcher_window(ui_panel &panel, std::shared_ptr &&sw); virtual void render_content() override; }; @@ -67,9 +67,11 @@ class obstacle_remove_window : public popup class map_panel : public ui_panel { - std::unique_ptr m_shader; + std::unique_ptr m_track_shader; + std::unique_ptr m_poi_shader; std::unique_ptr m_msaa_fb; std::unique_ptr m_msaa_rb; + texture_handle m_icon_atlas; std::unique_ptr m_fb; std::unique_ptr m_tex; diff --git a/widgets/map_objects.h b/widgets/map_objects.h index f07a9547..b37cb986 100644 --- a/widgets/map_objects.h +++ b/widgets/map_objects.h @@ -13,6 +13,9 @@ struct map_object glm::vec3 location; virtual ~map_object() = default; + virtual gfx::basic_vertex vertex() { + return gfx::basic_vertex(location, glm::vec3(), glm::vec2(0.0f, 0.25f)); + } }; using object_list = std::vector>; @@ -22,21 +25,38 @@ using sorted_object_list = std::map>; struct semaphore : public map_object { std::vector models; - std::vector events; + + virtual gfx::basic_vertex vertex() override { + return gfx::basic_vertex(location, glm::vec3(), glm::vec2(0.0f, 0.25f)); + } }; -// switch description (only for minimap purposes) -struct track_switch : public map_object +// event launcher description (only for minimap purposes) +struct launcher : public map_object { - basic_event *straight_event = nullptr; - basic_event *divert_event = nullptr; + basic_event *first_event = nullptr; + basic_event *second_event = nullptr; + + enum type_e { + track_switch, + level_crossing + } type; + + virtual gfx::basic_vertex vertex() { + return gfx::basic_vertex(location, glm::vec3(), + type == track_switch ? glm::vec2(0.25f, 0.5f) : glm::vec2(0.5f, 0.75f)); + } }; // training obstacle description struct obstacle : public map_object { std::string model_name; + + virtual gfx::basic_vertex vertex() { + return gfx::basic_vertex(location, glm::vec3(), glm::vec2(0.75f, 1.0f)); + } }; struct objects diff --git a/widgets/vehicleparams.cpp b/widgets/vehicleparams.cpp index c3412e8e..ee1ff0a7 100644 --- a/widgets/vehicleparams.cpp +++ b/widgets/vehicleparams.cpp @@ -6,7 +6,7 @@ #include "Train.h" ui::vehicleparams_panel::vehicleparams_panel(const std::string &vehicle) - : ui_panel(std::string(LOC_STR(vehicleparams_window)) + ": " + vehicle, false), m_vehicle_name(vehicle) + : ui_panel(std::string(locale::strings[locale::string::vehicleparams_window]) + ": " + vehicle, false), m_vehicle_name(vehicle) { }