diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index 322196c95c..773e7bf8a9 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -2684,17 +2684,25 @@ void SoftwareGLContext::gl_light_model(GLenum pname, GLfloat x, GLfloat y, GLflo || pname == GL_LIGHT_MODEL_TWO_SIDE), GL_INVALID_ENUM); + auto lighting_params = m_rasterizer.light_model(); + bool update_lighting_model = false; + switch (pname) { case GL_LIGHT_MODEL_AMBIENT: - m_light_model_ambient = { x, y, z, w }; + lighting_params.scene_ambient_color = { x, y, z, w }; + update_lighting_model = true; break; case GL_LIGHT_MODEL_TWO_SIDE: VERIFY(y == 0.0f && z == 0.0f && w == 0.0f); - m_light_model_two_side = x; + lighting_params.two_sided_lighting = x; + update_lighting_model = true; break; default: VERIFY_NOT_REACHED(); } + + if (update_lighting_model) + m_rasterizer.set_light_model_params(lighting_params); } void SoftwareGLContext::gl_bitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, GLubyte const* bitmap) diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 81b77fefd0..b8d9900a4e 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -430,8 +430,6 @@ private: // Lighting configuration bool m_lighting_enabled { false }; - FloatVector4 m_light_model_ambient { 0.2f, 0.2f, 0.2f, 1.0f }; - GLfloat m_light_model_two_side { 0.0f }; Vector m_light_states; Array m_material_states; diff --git a/Userland/Libraries/LibSoftGPU/Device.cpp b/Userland/Libraries/LibSoftGPU/Device.cpp index 99ab79913a..d15ea2a6ef 100644 --- a/Userland/Libraries/LibSoftGPU/Device.cpp +++ b/Userland/Libraries/LibSoftGPU/Device.cpp @@ -970,6 +970,15 @@ void Device::set_options(const RasterizerOptions& options) // FIXME: Recreate or reinitialize render threads here when multithreading is being implemented } +void Device::set_light_model_params(const LightModelParameters& lighting_model) +{ + wait_for_all_threads(); + + m_lighting_model = lighting_model; + + // FIXME: Recreate or reinitialize render threads here when multithreading is being implemented +} + Gfx::RGBA32 Device::get_backbuffer_pixel(int x, int y) { // FIXME: Reading individual pixels is very slow, rewrite this to transfer whole blocks diff --git a/Userland/Libraries/LibSoftGPU/Device.h b/Userland/Libraries/LibSoftGPU/Device.h index 1b78aba6a6..b8f6299b2c 100644 --- a/Userland/Libraries/LibSoftGPU/Device.h +++ b/Userland/Libraries/LibSoftGPU/Device.h @@ -71,6 +71,13 @@ struct RasterizerOptions { Gfx::IntRect viewport; }; +struct LightModelParameters { + FloatVector4 scene_ambient_color { 0.2f, 0.2f, 0.2f, 1.0f }; + bool viewer_at_infinity { false }; + unsigned int single_color { 0x81F9 }; // This is the value of `GL_SINGLE_COLOR`. Considering we definitely don't leak gl.h stuff into here, we fix it to the gl.h macro value. + bool two_sided_lighting { false }; +}; + struct PixelQuad; class Device final { @@ -87,7 +94,9 @@ public: void blit_to(Gfx::Bitmap&); void wait_for_all_threads() const; void set_options(const RasterizerOptions&); + void set_light_model_params(const LightModelParameters&); RasterizerOptions options() const { return m_options; } + LightModelParameters light_model() const { return m_lighting_model; } Gfx::RGBA32 get_backbuffer_pixel(int x, int y); float get_depthbuffer_value(int x, int y); @@ -109,6 +118,7 @@ private: RefPtr m_render_target; OwnPtr m_depth_buffer; RasterizerOptions m_options; + LightModelParameters m_lighting_model; Clipper m_clipper; Vector m_triangle_list; Vector m_processed_triangles;