Skip to content

Commit

Permalink
LibGL: Flesh out glMaterialf{v}
Browse files Browse the repository at this point in the history
These two functions have been turned from stubs into actually doing
something. They now set the correspondingmaterial data member based on
the value passed into the `pname`argument.

Co-authored-by: Stephan Unverwerth <[email protected]>
  • Loading branch information
2 people authored and linusg committed Jan 12, 2022
1 parent 9118b0d commit 92373ab
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 48 deletions.
3 changes: 2 additions & 1 deletion Userland/Libraries/LibGL/GLContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ class GLContext {
virtual void gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) = 0;
virtual void gl_normal_pointer(GLenum type, GLsizei stride, void const* pointer) = 0;
virtual void gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0;
virtual void gl_materialv(GLenum face, GLenum pname, GLfloat const* params) = 0;
virtual void gl_line_width(GLfloat width) = 0;
virtual void gl_push_attrib(GLbitfield mask) = 0;
virtual void gl_pop_attrib() = 0;
Expand All @@ -123,6 +122,8 @@ class GLContext {
virtual void gl_tex_gen_floatv(GLenum coord, GLenum pname, GLfloat const* params) = 0;
virtual void gl_lightf(GLenum light, GLenum pname, GLfloat param) = 0;
virtual void gl_lightfv(GLenum light, GLenum pname, GLfloat const* params) = 0;
virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) = 0;
virtual void gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) = 0;

virtual void present() = 0;
};
Expand Down
4 changes: 2 additions & 2 deletions Userland/Libraries/LibGL/GLLights.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ void glLightModeli(GLenum pname, GLint param)

void glMaterialf(GLenum face, GLenum pname, GLfloat param)
{
g_gl_context->gl_materialv(face, pname, &param);
g_gl_context->gl_materialf(face, pname, param);
}

void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params)
{
g_gl_context->gl_materialv(face, pname, params);
g_gl_context->gl_materialfv(face, pname, params);
}

void glShadeModel(GLenum mode)
Expand Down
131 changes: 90 additions & 41 deletions Userland/Libraries/LibGL/SoftwareGLContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2649,47 +2649,6 @@ void SoftwareGLContext::gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w
m_current_raster_position.clip_coordinate_value = w;
}

void SoftwareGLContext::gl_materialv(GLenum face, GLenum pname, GLfloat const* params)
{
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_materialv, face, pname, params);

RETURN_WITH_ERROR_IF(!(face == GL_FRONT || face == GL_BACK || face == GL_FRONT_AND_BACK), GL_INVALID_ENUM);

RETURN_WITH_ERROR_IF(!(pname == GL_AMBIENT
|| pname == GL_DIFFUSE
|| pname == GL_SPECULAR
|| pname == GL_EMISSION
|| pname == GL_SHININESS
|| pname == GL_AMBIENT_AND_DIFFUSE
|| pname == GL_COLOR_INDEXES),
GL_INVALID_ENUM);

GLfloat x, y, z, w;

switch (pname) {
case GL_SHININESS:
x = params[0];
y = 0.0f;
z = 0.0f;
w = 0.0f;
break;
case GL_COLOR_INDEXES:
x = params[0];
y = params[1];
z = params[2];
w = 0.0f;
break;
default:
x = params[0];
y = params[1];
z = params[2];
w = params[3];
}

// FIXME: implement this method
dbgln_if(GL_DEBUG, "gl_materialv({}, {}, {}, {}, {}, {}): unimplemented", face, pname, x, y, z, w);
}

void SoftwareGLContext::gl_line_width(GLfloat width)
{
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_line_width, width);
Expand Down Expand Up @@ -3018,6 +2977,23 @@ void SoftwareGLContext::sync_light_state()

m_rasterizer.set_light_state(light_id, light);
}

for (auto material_id = 0u; material_id < 2u; material_id++) {
SoftGPU::Material material;
auto const& current_material_state = m_material_states.at(material_id);

material.ambient = current_material_state.ambient;
material.diffuse = current_material_state.diffuse;
material.specular = current_material_state.specular;
material.emissive = current_material_state.emissive;
material.shininess = current_material_state.shininess;
material.specular_exponent = current_material_state.specular_exponent;
material.ambient_color_index = current_material_state.ambient_color_index;
material.diffuse_color_index = current_material_state.diffuse_color_index;
material.specular_color_index = current_material_state.specular_color_index;

m_rasterizer.set_material_state(material_id, material);
}
}

void SoftwareGLContext::sync_device_texcoord_config()
Expand Down Expand Up @@ -3166,4 +3142,77 @@ void SoftwareGLContext::gl_lightfv(GLenum light, GLenum pname, GLfloat const* pa

m_light_state_is_dirty = true;
}

void SoftwareGLContext::gl_materialf(GLenum face, GLenum pname, GLfloat param)
{
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_materialf, face, pname, param);
RETURN_WITH_ERROR_IF(!(face == GL_FRONT || face == GL_BACK || face == GL_FRONT_AND_BACK), GL_INVALID_ENUM);
RETURN_WITH_ERROR_IF(pname != GL_SHININESS, GL_INVALID_ENUM);
RETURN_WITH_ERROR_IF(param > 128.0f, GL_INVALID_VALUE);

switch (face) {
case GL_FRONT:
m_material_states.at(to_underlying(MaterialFace::Front)).shininess = param;
break;
case GL_BACK:
m_material_states.at(to_underlying(MaterialFace::Back)).shininess = param;
break;
case GL_FRONT_AND_BACK:
m_material_states.at(to_underlying(MaterialFace::Front)).shininess = param;
m_material_states.at(to_underlying(MaterialFace::Back)).shininess = param;
break;
default:
VERIFY_NOT_REACHED();
}

m_light_state_is_dirty = true;
}

void SoftwareGLContext::gl_materialfv(GLenum face, GLenum pname, GLfloat const* params)
{
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_materialfv, face, pname, params);
RETURN_WITH_ERROR_IF(!(face == GL_FRONT || face == GL_BACK || face == GL_FRONT_AND_BACK), GL_INVALID_ENUM);
RETURN_WITH_ERROR_IF(!(pname == GL_AMBIENT || pname == GL_DIFFUSE || pname == GL_SPECULAR || pname == GL_EMISSION || pname == GL_SHININESS || pname == GL_AMBIENT_AND_DIFFUSE), GL_INVALID_ENUM);
RETURN_WITH_ERROR_IF((pname == GL_SHININESS && *params > 128.0f), GL_INVALID_VALUE);

auto update_material = [](SoftGPU::Material& material, GLenum pname, GLfloat const* params) {
switch (pname) {
case GL_AMBIENT:
material.ambient = { params[0], params[1], params[2], params[3] };
break;
case GL_DIFFUSE:
material.diffuse = { params[0], params[1], params[2], params[3] };
break;
case GL_SPECULAR:
material.specular = { params[0], params[1], params[2], params[3] };
break;
case GL_EMISSION:
material.emissive = { params[0], params[1], params[2], params[3] };
break;
case GL_SHININESS:
material.shininess = *params;
break;
case GL_AMBIENT_AND_DIFFUSE:
material.ambient = { params[0], params[1], params[2], params[3] };
material.diffuse = { params[0], params[1], params[2], params[3] };
break;
}
};

switch (face) {
case GL_FRONT:
update_material(m_material_states.at(to_underlying(MaterialFace::Front)), pname, params);
break;
case GL_BACK:
update_material(m_material_states.at(to_underlying(MaterialFace::Back)), pname, params);
break;
case GL_FRONT_AND_BACK:
update_material(m_material_states.at(to_underlying(MaterialFace::Front)), pname, params);
update_material(m_material_states.at(to_underlying(MaterialFace::Back)), pname, params);
break;
}

m_light_state_is_dirty = true;
}

}
15 changes: 11 additions & 4 deletions Userland/Libraries/LibGL/SoftwareGLContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ struct ContextParameter {
} value;
};

enum class MaterialFace : u8 {
Front = 0,
Back = 1,
};

class SoftwareGLContext : public GLContext {
public:
SoftwareGLContext(Gfx::Bitmap&);
Expand Down Expand Up @@ -126,7 +131,6 @@ class SoftwareGLContext : public GLContext {
virtual void gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) override;
virtual void gl_normal_pointer(GLenum type, GLsizei stride, void const* pointer) override;
virtual void gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) override;
virtual void gl_materialv(GLenum face, GLenum pname, GLfloat const* params) override;
virtual void gl_line_width(GLfloat width) override;
virtual void gl_push_attrib(GLbitfield mask) override;
virtual void gl_pop_attrib() override;
Expand All @@ -139,7 +143,8 @@ class SoftwareGLContext : public GLContext {
virtual void gl_tex_gen_floatv(GLenum coord, GLenum pname, GLfloat const* params) override;
virtual void gl_lightf(GLenum light, GLenum pname, GLfloat param) override;
virtual void gl_lightfv(GLenum light, GLenum pname, GLfloat const* params) override;

virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) override;
virtual void gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) override;
virtual void present() override;

private:
Expand Down Expand Up @@ -358,7 +363,6 @@ class SoftwareGLContext : public GLContext {
decltype(&SoftwareGLContext::gl_stencil_op_separate),
decltype(&SoftwareGLContext::gl_normal),
decltype(&SoftwareGLContext::gl_raster_pos),
decltype(&SoftwareGLContext::gl_materialv),
decltype(&SoftwareGLContext::gl_line_width),
decltype(&SoftwareGLContext::gl_push_attrib),
decltype(&SoftwareGLContext::gl_pop_attrib),
Expand All @@ -372,7 +376,9 @@ class SoftwareGLContext : public GLContext {
decltype(&SoftwareGLContext::gl_fogfv),
decltype(&SoftwareGLContext::gl_fogi),
decltype(&SoftwareGLContext::gl_lightf),
decltype(&SoftwareGLContext::gl_lightfv)>;
decltype(&SoftwareGLContext::gl_lightfv),
decltype(&SoftwareGLContext::gl_materialf),
decltype(&SoftwareGLContext::gl_materialfv)>;

using ExtraSavedArguments = Variant<
FloatMatrix4x4>;
Expand Down Expand Up @@ -428,6 +434,7 @@ class SoftwareGLContext : public GLContext {
GLfloat m_light_model_two_side { 0.0f };

Vector<SoftGPU::Light> m_light_states;
Array<SoftGPU::Material, 2u> m_material_states;
};

}
5 changes: 5 additions & 0 deletions Userland/Libraries/LibSoftGPU/Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1009,4 +1009,9 @@ void Device::set_light_state(unsigned int light_id, Light const& light)
m_lights.at(light_id) = light;
}

void Device::set_material_state(unsigned int material_id, Material const& material)
{
m_materials.at(material_id) = material;
}

}
3 changes: 3 additions & 0 deletions Userland/Libraries/LibSoftGPU/Device.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <LibSoftGPU/Image.h>
#include <LibSoftGPU/ImageFormat.h>
#include <LibSoftGPU/Light/Light.h>
#include <LibSoftGPU/Light/Material.h>
#include <LibSoftGPU/Sampler.h>
#include <LibSoftGPU/Triangle.h>
#include <LibSoftGPU/Vertex.h>
Expand Down Expand Up @@ -94,6 +95,7 @@ class Device final {

void set_sampler_config(unsigned, SamplerConfig const&);
void set_light_state(unsigned, Light const&);
void set_material_state(unsigned, Material const&);

private:
void draw_statistics_overlay(Gfx::Bitmap&);
Expand All @@ -115,6 +117,7 @@ class Device final {
Vector<size_t> m_enabled_texture_units;
AlphaBlendFactors m_alpha_blend_factors;
Array<Light, NUM_LIGHTS> m_lights;
Array<Material, 2u> m_materials;
};

}
25 changes: 25 additions & 0 deletions Userland/Libraries/LibSoftGPU/Light/Material.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright (c) 2022, Jesse Buhagiar <[email protected]>
*
* SPDX-License-Identifier: BSD-2-Clause
*/

#pragma once

#include <LibGfx/Vector4.h>

namespace SoftGPU {

struct Material {
Vector4<float> ambient { 0.2f, 0.2f, 0.2f, 1.0f };
Vector4<float> diffuse { 0.8f, 0.8f, 0.8f, 1.0f };
Vector4<float> specular { 0.0f, 0.0f, 0.0f, 1.0f };
Vector4<float> emissive { 0.0f, 0.0f, 0.0f, 1.0f };
float shininess { 0.0f };
float specular_exponent { 0.0f };
float ambient_color_index { 0.0f };
float diffuse_color_index = { 1.0f };
float specular_color_index = { 1.0f };
};

}

0 comments on commit 92373ab

Please sign in to comment.