@@ -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);
@@ -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()
config.fixed_function_texture_env_mode = GPU::TextureEnvMode::Decal;
+ config.fixed_function_texture_env_mode = GPU::TextureEnvMode::Add;
+ break;
default:
VERIFY_NOT_REACHED();
}
@@ -34,6 +34,7 @@ enum class TextureEnvMode {
Modulate,
Replace,
Decal,
+ Add,
};
struct SamplerConfig final {
@@ -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));
+ 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)