diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 696ae07cce7..0b9ecc1f2c6 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -475,6 +475,8 @@ extern "C" { #define GL_MODELVIEW_MATRIX 0x0BA6 #define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_ADD 0x0104 + GLAPI void glBegin(GLenum mode); GLAPI void glClear(GLbitfield mask); GLAPI void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); diff --git a/Userland/Libraries/LibGL/GLContext.cpp b/Userland/Libraries/LibGL/GLContext.cpp index 70b6c93b04f..c34b167ac58 100644 --- a/Userland/Libraries/LibGL/GLContext.cpp +++ b/Userland/Libraries/LibGL/GLContext.cpp @@ -2057,6 +2057,7 @@ void GLContext::gl_tex_env(GLenum target, GLenum pname, GLfloat param) case GL_MODULATE: case GL_REPLACE: case GL_DECAL: + case GL_ADD: m_active_texture_unit->set_env_mode(param_enum); m_sampler_config_is_dirty = true; break; @@ -3013,6 +3014,9 @@ void GLContext::sync_device_sampler_config() case GL_DECAL: config.fixed_function_texture_env_mode = GPU::TextureEnvMode::Decal; break; + case GL_ADD: + config.fixed_function_texture_env_mode = GPU::TextureEnvMode::Add; + break; default: VERIFY_NOT_REACHED(); } diff --git a/Userland/Libraries/LibGPU/SamplerConfig.h b/Userland/Libraries/LibGPU/SamplerConfig.h index 42ccdd2c768..a4b5b140d64 100644 --- a/Userland/Libraries/LibGPU/SamplerConfig.h +++ b/Userland/Libraries/LibGPU/SamplerConfig.h @@ -34,6 +34,7 @@ enum class TextureEnvMode { Modulate, Replace, Decal, + Add, }; struct SamplerConfig final { diff --git a/Userland/Libraries/LibSoftGPU/Device.cpp b/Userland/Libraries/LibSoftGPU/Device.cpp index 2ee86bac645..b7d8455caff 100644 --- a/Userland/Libraries/LibSoftGPU/Device.cpp +++ b/Userland/Libraries/LibSoftGPU/Device.cpp @@ -991,6 +991,12 @@ ALWAYS_INLINE void Device::shade_fragments(PixelQuad& quad) quad.out_color.set_z(mix(quad.out_color.z(), texel.z(), dst_alpha)); break; } + case GPU::TextureEnvMode::Add: + quad.out_color.set_x(quad.out_color.x() + texel.x()); + quad.out_color.set_y(quad.out_color.y() + texel.y()); + quad.out_color.set_z(quad.out_color.z() + texel.z()); + quad.out_color.set_w(quad.out_color.w() * texel.w()); // FIXME: If texture format is `GL_INTENSITY` alpha components must be added (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml) + break; default: VERIFY_NOT_REACHED(); }