From 3451cd57c46a89e1595374f380779f74b0a4466b Mon Sep 17 00:00:00 2001 From: Relintai Date: Wed, 19 Feb 2025 16:50:15 +0100 Subject: [PATCH] Added a new ColoredTextureMaterial2D class. Also made the immediate mode renderer use it. This fixes color modulation. --- compile_linux.sh | 2 + compile_osx.sh | 2 + compile_vs.bat | 2 + compile_windows.sh | 2 + .../colored_texture_material_2d.cpp | 92 +++++++++++++++++++ sfw/render_core/colored_texture_material_2d.h | 41 +++++++++ sfw/render_immediate/renderer.cpp | 2 +- sfw/render_immediate/renderer.h | 3 +- tools/merger/sfw_full.cpp.inl | 4 + tools/merger/sfw_full.h.inl | 7 +- tools/merger/sfw_gui.cpp.inl | 4 + tools/merger/sfw_gui.h.inl | 6 ++ tools/merger/sfw_render_core.cpp.inl | 4 + tools/merger/sfw_render_core.h.inl | 6 ++ tools/merger/sfw_render_immediate.cpp.inl | 4 + tools/merger/sfw_render_immediate.h.inl | 6 ++ tools/merger/sfw_render_objects.cpp.inl | 4 + tools/merger/sfw_render_objects.h.inl | 6 ++ 18 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 sfw/render_core/colored_texture_material_2d.cpp create mode 100644 sfw/render_core/colored_texture_material_2d.h diff --git a/compile_linux.sh b/compile_linux.sh index bc69a7c..8b7cf89 100755 --- a/compile_linux.sh +++ b/compile_linux.sh @@ -82,6 +82,7 @@ ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/font_material.cpp -o s ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/texture_material_2d.cpp -o sfw/render_core/texture_material_2d.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/texture_material.cpp -o sfw/render_core/texture_material.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/transparent_texture_material.cpp -o sfw/render_core/transparent_texture_material.o +ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/colored_texture_material_2d.cpp -o sfw/render_core/colored_texture_material_2d.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_immediate/renderer.cpp -o sfw/render_immediate/renderer.o @@ -138,6 +139,7 @@ ccache g++ -Wall -D_REENTRANT -g sfw/core/aabb.o sfw/core/basis.o sfw/core/color sfw/render_core/colored_material.o sfw/render_core/font_material.o \ sfw/render_core/texture_material_2d.o sfw/render_core/texture_material.o \ sfw/render_core/transparent_texture_material.o \ + sfw/render_core/colored_texture_material_2d.o \ sfw/render_immediate/renderer.o \ sfw/render_objects/camera_3d.o sfw/render_objects/object_3d.o sfw/render_objects/mesh_instance_3d.o \ sfw/render_objects/object_2d.o \ diff --git a/compile_osx.sh b/compile_osx.sh index fa06883..5f4641b 100755 --- a/compile_osx.sh +++ b/compile_osx.sh @@ -93,6 +93,7 @@ clang++ $args -D_REENTRANT -g -Isfw -c sfw/render_core/font_material.cpp -o sfw/ clang++ $args -D_REENTRANT -g -Isfw -c sfw/render_core/texture_material_2d.cpp -o sfw/render_core/texture_material_2d.o clang++ $args -D_REENTRANT -g -Isfw -c sfw/render_core/texture_material.cpp -o sfw/render_core/texture_material.o clang++ $args -D_REENTRANT -g -Isfw -c sfw/render_core/transparent_texture_material.cpp -o sfw/render_core/transparent_texture_material.o +clang++ $args -D_REENTRANT -g -Isfw -c sfw/render_core/colored_texture_material_2d.cpp -o sfw/render_core/colored_texture_material_2d.o clang++ -w -framework cocoa -framework iokit -framework CoreFoundation -framework CoreAudio -framework AudioToolbox -D_REENTRANT -g -Isfw -c sfw/render_core/glfw_impl.m -o sfw/render_core/glfw_impl.o @@ -151,6 +152,7 @@ clang++ $args -D_REENTRANT -g sfw/core/aabb.o sfw/core/basis.o sfw/core/color.o sfw/render_core/colored_material.o sfw/render_core/font_material.o \ sfw/render_core/texture_material_2d.o sfw/render_core/texture_material.o \ sfw/render_core/transparent_texture_material.o \ + sfw/render_core/colored_texture_material_2d.o \ sfw/render_core/glfw_impl.o \ sfw/render_immediate/renderer.o \ sfw/render_objects/camera_3d.o sfw/render_objects/object_3d.o sfw/render_objects/mesh_instance_3d.o \ diff --git a/compile_vs.bat b/compile_vs.bat index 9869de4..6ada27b 100644 --- a/compile_vs.bat +++ b/compile_vs.bat @@ -90,6 +90,7 @@ cl /D_REENTRANT /EHsc /Zi /Isfw /c sfw/render_core/font_material.cpp /Fo:sfw/ren cl /D_REENTRANT /EHsc /Zi /Isfw /c sfw/render_core/texture_material_2d.cpp /Fo:sfw/render_core/texture_material_2d.obj cl /D_REENTRANT /EHsc /Zi /Isfw /c sfw/render_core/texture_material.cpp /Fo:sfw/render_core/texture_material.obj cl /D_REENTRANT /EHsc /Zi /Isfw /c sfw/render_core/transparent_texture_material.cpp /Fo:sfw/render_core/transparent_texture_material.obj +cl /D_REENTRANT /EHsc /Zi /Isfw /c sfw/render_core/colored_texture_material_2d.cpp /Fo:sfw/render_core/colored_texture_material_2d.obj cl /D_REENTRANT /EHsc /Zi /Isfw /c sfw/render_immediate/renderer.cpp /Fo:sfw/render_immediate/renderer.obj @@ -149,6 +150,7 @@ cl /D_REENTRANT /Zi ^ sfw/render_core/colored_material.obj sfw/render_core/font_material.obj ^ sfw/render_core/texture_material_2d.obj sfw/render_core/texture_material.obj ^ sfw/render_core/transparent_texture_material.obj ^ + sfw/render_core/colored_texture_material_2d.obj ^ sfw/render_immediate/renderer.obj ^ sfw/render_objects/camera_3d.obj sfw/render_objects/object_3d.obj sfw/render_objects/mesh_instance_3d.obj ^ sfw/render_objects/object_2d.obj ^ diff --git a/compile_windows.sh b/compile_windows.sh index 9f97f8e..ddb237f 100755 --- a/compile_windows.sh +++ b/compile_windows.sh @@ -82,6 +82,7 @@ ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/font_material.cpp -o s ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/texture_material_2d.cpp -o sfw/render_core/texture_material_2d.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/texture_material.cpp -o sfw/render_core/texture_material.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/transparent_texture_material.cpp -o sfw/render_core/transparent_texture_material.o +ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/colored_texture_material_2d.cpp -o sfw/render_core/colored_texture_material_2d.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_immediate/renderer.cpp -o sfw/render_immediate/renderer.o @@ -139,6 +140,7 @@ ccache g++ -Wall \ sfw/render_core/colored_material.o sfw/render_core/font_material.o \ sfw/render_core/texture_material_2d.o sfw/render_core/texture_material.o \ sfw/render_core/transparent_texture_material.o \ + sfw/render_core/colored_texture_material_2d.o \ sfw/render_immediate/renderer.o \ sfw/render_objects/camera_3d.o sfw/render_objects/object_3d.o sfw/render_objects/mesh_instance_3d.o \ sfw/render_objects/object_2d.o \ diff --git a/sfw/render_core/colored_texture_material_2d.cpp b/sfw/render_core/colored_texture_material_2d.cpp new file mode 100644 index 0000000..229facc --- /dev/null +++ b/sfw/render_core/colored_texture_material_2d.cpp @@ -0,0 +1,92 @@ +//--STRIP +#include "colored_texture_material_2d.h" +#include "render_core/3rd_glad.h" +//--STRIP + +void ColoredTextureMaterial2D::bind_uniforms() { + set_uniform(projection_matrix_location, RenderState::projection_matrix_2d); + set_uniform(model_view_matrix_location, RenderState::model_view_matrix_2d); + + if (texture.is_valid()) { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture->get_gl_texture()); + glUniform1i(texture_location, 0); + } +} + +void ColoredTextureMaterial2D::setup_uniforms() { + projection_matrix_location = get_uniform("u_proj_matrix"); + model_view_matrix_location = get_uniform("u_model_view_matrix"); + + texture_location = get_uniform("u_texture"); +} + +void ColoredTextureMaterial2D::unbind() { + glDisable(GL_TEXTURE_2D); +} + +void ColoredTextureMaterial2D::setup_state() { + glEnable(GL_TEXTURE_2D); +} + +String ColoredTextureMaterial2D::get_vertex_shader_source() { + static const char *vertex_shader_source[] = { +#if defined(__APPLE__) +#else + "#version 100\n" + "precision mediump float;\n" +#endif + "uniform mat4 u_proj_matrix;\n" + "uniform mat4 u_model_view_matrix;\n" + "\n" + "attribute vec4 a_position;\n" + "attribute vec2 a_uv;\n" + "attribute vec4 a_color;\n" + "\n" + "varying vec4 v_color;\n" + "varying vec2 v_uv;\n" + "\n" + "void main() {\n" + " v_uv = a_uv;\n" + " v_color = a_color;\n" + " gl_Position = u_proj_matrix * u_model_view_matrix * a_position;\n" + "}" + }; + + return String(*vertex_shader_source); +} + +String ColoredTextureMaterial2D::get_fragment_shader_source() { + static const char *fragment_shader_source[] = { +#ifndef __APPLE__ + "#version 100\n" + "#ifdef GL_ES\n" + " precision mediump float;\n" + "#endif\n" +#endif + "\n" + "uniform sampler2D u_texture;\n" + "\n" + "varying vec4 v_color;\n" + "varying vec2 v_uv;\n" + "\n" + "void main() {\n" + " vec4 col = texture2D(u_texture, v_uv);\n" + "\n" + " if (col.a < 0.1) {\n" + " discard;\n" + " }\n" + "\n" + " gl_FragColor = col * v_color;\n" + "}" + }; + + return String(*fragment_shader_source); +} + +ColoredTextureMaterial2D::ColoredTextureMaterial2D() { + projection_matrix_location = 0; + model_view_matrix_location = 0; + + texture_location = 0; +} diff --git a/sfw/render_core/colored_texture_material_2d.h b/sfw/render_core/colored_texture_material_2d.h new file mode 100644 index 0000000..fc0eae8 --- /dev/null +++ b/sfw/render_core/colored_texture_material_2d.h @@ -0,0 +1,41 @@ +//--STRIP +#ifndef COLORED_TEXTURE_MATERIAL_2D_H +#define COLORED_TEXTURE_MATERIAL_2D_H +//--STRIP + +//--STRIP +#include "render_core/material.h" +#include "render_core/texture.h" + +#include "render_core/render_state.h" +//--STRIP + +class ColoredTextureMaterial2D : public Material { + SFW_OBJECT(ColoredTextureMaterial2D, Material); + +public: + int get_material_id() { + return 8; + } + + void bind_uniforms(); + void setup_uniforms(); + void unbind(); + void setup_state(); + + String get_vertex_shader_source(); + String get_fragment_shader_source(); + + ColoredTextureMaterial2D(); + + int32_t projection_matrix_location; + int32_t model_view_matrix_location; + + int32_t texture_location; + + Ref texture; +}; + +//--STRIP +#endif // COLORED_TEXTURE_MATERIAL_2D_H +//--STRIP diff --git a/sfw/render_immediate/renderer.cpp b/sfw/render_immediate/renderer.cpp index 4f88c61..971a7ba 100644 --- a/sfw/render_immediate/renderer.cpp +++ b/sfw/render_immediate/renderer.cpp @@ -11,7 +11,7 @@ #include "render_core/mesh.h" #include "render_core/texture.h" #include "render_core/texture_material.h" -#include "render_core/texture_material_2d.h" +#include "render_core/colored_texture_material_2d.h" #include "render_core/render_state.h" //--STRIP diff --git a/sfw/render_immediate/renderer.h b/sfw/render_immediate/renderer.h index 7fde36e..ef47029 100644 --- a/sfw/render_immediate/renderer.h +++ b/sfw/render_immediate/renderer.h @@ -24,6 +24,7 @@ class ColorMaterial2D; class TextureMaterial; class ColorMaterial; class ColoredMaterial; +class ColoredTextureMaterial2D; class Renderer : public Object { SFW_OBJECT(Renderer, Object); @@ -141,7 +142,7 @@ private: Ref _3d_mesh; Ref _font_mesh; - Ref _texture_material_2d; + Ref _texture_material_2d; Ref _font_material; Ref _color_material_2d; diff --git a/tools/merger/sfw_full.cpp.inl b/tools/merger/sfw_full.cpp.inl index df0feda..422af03 100644 --- a/tools/merger/sfw_full.cpp.inl +++ b/tools/merger/sfw_full.cpp.inl @@ -618,6 +618,10 @@ //#includes own header //--STRIP {{FILE:sfw/render_core/transparent_texture_material.cpp}} +//--STRIP +//#includes own header +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.cpp}} //--STRIP //#include "render_core/image.h" diff --git a/tools/merger/sfw_full.h.inl b/tools/merger/sfw_full.h.inl index 18c0b25..637507e 100644 --- a/tools/merger/sfw_full.h.inl +++ b/tools/merger/sfw_full.h.inl @@ -714,7 +714,12 @@ //#include "render_core/render_state.h" //--STRIP {{FILE:sfw/render_core/transparent_texture_material.h}} - +//--STRIP +//#include "render_core/material.h" +//#include "render_core/texture.h" +//#include "render_core/render_state.h" +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.h}} //--STRIP //#include "core/color.h" diff --git a/tools/merger/sfw_gui.cpp.inl b/tools/merger/sfw_gui.cpp.inl index 4f27115..d4c189e 100644 --- a/tools/merger/sfw_gui.cpp.inl +++ b/tools/merger/sfw_gui.cpp.inl @@ -619,6 +619,10 @@ //#includes own header //--STRIP {{FILE:sfw/render_core/transparent_texture_material.cpp}} +//--STRIP +//#includes own header +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.cpp}} //--STRIP //#include "render_core/image.h" diff --git a/tools/merger/sfw_gui.h.inl b/tools/merger/sfw_gui.h.inl index 9af2941..aca1fb7 100644 --- a/tools/merger/sfw_gui.h.inl +++ b/tools/merger/sfw_gui.h.inl @@ -715,6 +715,12 @@ //#include "render_core/render_state.h" //--STRIP {{FILE:sfw/render_core/transparent_texture_material.h}} +//--STRIP +//#include "render_core/material.h" +//#include "render_core/texture.h" +//#include "render_core/render_state.h" +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.h}} //--STRIP diff --git a/tools/merger/sfw_render_core.cpp.inl b/tools/merger/sfw_render_core.cpp.inl index c039107..4da849d 100644 --- a/tools/merger/sfw_render_core.cpp.inl +++ b/tools/merger/sfw_render_core.cpp.inl @@ -618,6 +618,10 @@ //#includes own header //--STRIP {{FILE:sfw/render_core/transparent_texture_material.cpp}} +//--STRIP +//#includes own header +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.cpp}} //--STRIP //#include "render_core/image.h" diff --git a/tools/merger/sfw_render_core.h.inl b/tools/merger/sfw_render_core.h.inl index f1e4e16..dac33d9 100644 --- a/tools/merger/sfw_render_core.h.inl +++ b/tools/merger/sfw_render_core.h.inl @@ -714,6 +714,12 @@ //#include "render_core/render_state.h" //--STRIP {{FILE:sfw/render_core/transparent_texture_material.h}} +//--STRIP +//#include "render_core/material.h" +//#include "render_core/texture.h" +//#include "render_core/render_state.h" +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.h}} //--STRIP diff --git a/tools/merger/sfw_render_immediate.cpp.inl b/tools/merger/sfw_render_immediate.cpp.inl index aa4ff44..6b02e67 100644 --- a/tools/merger/sfw_render_immediate.cpp.inl +++ b/tools/merger/sfw_render_immediate.cpp.inl @@ -618,6 +618,10 @@ //#includes own header //--STRIP {{FILE:sfw/render_core/transparent_texture_material.cpp}} +//--STRIP +//#includes own header +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.cpp}} //--STRIP //#include "render_core/image.h" diff --git a/tools/merger/sfw_render_immediate.h.inl b/tools/merger/sfw_render_immediate.h.inl index 6787bf8..206738c 100644 --- a/tools/merger/sfw_render_immediate.h.inl +++ b/tools/merger/sfw_render_immediate.h.inl @@ -714,6 +714,12 @@ //#include "render_core/render_state.h" //--STRIP {{FILE:sfw/render_core/transparent_texture_material.h}} +//--STRIP +//#include "render_core/material.h" +//#include "render_core/texture.h" +//#include "render_core/render_state.h" +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.h}} //--STRIP diff --git a/tools/merger/sfw_render_objects.cpp.inl b/tools/merger/sfw_render_objects.cpp.inl index d20a705..d0251b0 100644 --- a/tools/merger/sfw_render_objects.cpp.inl +++ b/tools/merger/sfw_render_objects.cpp.inl @@ -618,6 +618,10 @@ //#includes own header //--STRIP {{FILE:sfw/render_core/transparent_texture_material.cpp}} +//--STRIP +//#includes own header +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.cpp}} //--STRIP //#include "render_core/image.h" diff --git a/tools/merger/sfw_render_objects.h.inl b/tools/merger/sfw_render_objects.h.inl index 6674fc6..dd05fb2 100644 --- a/tools/merger/sfw_render_objects.h.inl +++ b/tools/merger/sfw_render_objects.h.inl @@ -714,6 +714,12 @@ //#include "render_core/render_state.h" //--STRIP {{FILE:sfw/render_core/transparent_texture_material.h}} +//--STRIP +//#include "render_core/material.h" +//#include "render_core/texture.h" +//#include "render_core/render_state.h" +//--STRIP +{{FILE:sfw/render_core/colored_texture_material_2d.h}} //--STRIP