mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:27:43 +00:00
LibGL: Implement glMateriali{v}
This commit is contained in:
parent
170739fe39
commit
371d49c0f6
5 changed files with 62 additions and 0 deletions
|
@ -631,6 +631,8 @@ GLAPI void glNormalPointer(GLenum type, GLsizei stride, void const* pointer);
|
||||||
GLAPI void glRasterPos2i(GLint x, GLint y);
|
GLAPI void glRasterPos2i(GLint x, GLint y);
|
||||||
GLAPI void glMaterialf(GLenum face, GLenum pname, GLfloat param);
|
GLAPI void glMaterialf(GLenum face, GLenum pname, GLfloat param);
|
||||||
GLAPI void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params);
|
GLAPI void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params);
|
||||||
|
GLAPI void glMateriali(GLenum face, GLenum pname, GLint param);
|
||||||
|
GLAPI void glMaterialiv(GLenum face, GLenum pname, GLint const* params);
|
||||||
GLAPI void glLineWidth(GLfloat width);
|
GLAPI void glLineWidth(GLfloat width);
|
||||||
GLAPI void glPushAttrib(GLbitfield mask);
|
GLAPI void glPushAttrib(GLbitfield mask);
|
||||||
GLAPI void glPopAttrib();
|
GLAPI void glPopAttrib();
|
||||||
|
|
|
@ -119,6 +119,7 @@ public:
|
||||||
virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) = 0;
|
virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) = 0;
|
||||||
virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) = 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 gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) = 0;
|
||||||
|
virtual void gl_materialiv(GLenum face, GLenum pname, GLint const* params) = 0;
|
||||||
virtual void gl_color_material(GLenum face, GLenum mode) = 0;
|
virtual void gl_color_material(GLenum face, GLenum mode) = 0;
|
||||||
virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) = 0;
|
virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) = 0;
|
||||||
virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) = 0;
|
virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) = 0;
|
||||||
|
|
|
@ -81,6 +81,16 @@ void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params)
|
||||||
g_gl_context->gl_materialfv(face, pname, params);
|
g_gl_context->gl_materialfv(face, pname, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void glMateriali(GLenum face, GLenum pname, GLint param)
|
||||||
|
{
|
||||||
|
g_gl_context->gl_materialf(face, pname, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
void glMaterialiv(GLenum face, GLenum pname, GLint const* params)
|
||||||
|
{
|
||||||
|
g_gl_context->gl_materialiv(face, pname, params);
|
||||||
|
}
|
||||||
|
|
||||||
void glShadeModel(GLenum mode)
|
void glShadeModel(GLenum mode)
|
||||||
{
|
{
|
||||||
g_gl_context->gl_shade_model(mode);
|
g_gl_context->gl_shade_model(mode);
|
||||||
|
|
|
@ -3549,6 +3549,53 @@ void SoftwareGLContext::gl_materialfv(GLenum face, GLenum pname, GLfloat const*
|
||||||
m_light_state_is_dirty = true;
|
m_light_state_is_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoftwareGLContext::gl_materialiv(GLenum face, GLenum pname, GLint const* params)
|
||||||
|
{
|
||||||
|
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_materialiv, 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), GL_INVALID_VALUE);
|
||||||
|
|
||||||
|
auto update_material = [](SoftGPU::Material& material, GLenum pname, GLint const* params) {
|
||||||
|
switch (pname) {
|
||||||
|
case GL_AMBIENT:
|
||||||
|
material.ambient = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
|
||||||
|
break;
|
||||||
|
case GL_DIFFUSE:
|
||||||
|
material.diffuse = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
|
||||||
|
break;
|
||||||
|
case GL_SPECULAR:
|
||||||
|
material.specular = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
|
||||||
|
break;
|
||||||
|
case GL_EMISSION:
|
||||||
|
material.emissive = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
|
||||||
|
break;
|
||||||
|
case GL_SHININESS:
|
||||||
|
material.shininess = static_cast<float>(params[0]);
|
||||||
|
break;
|
||||||
|
case GL_AMBIENT_AND_DIFFUSE:
|
||||||
|
material.ambient = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
|
||||||
|
material.diffuse = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (face) {
|
||||||
|
case GL_FRONT:
|
||||||
|
update_material(m_material_states[Face::Front], pname, params);
|
||||||
|
break;
|
||||||
|
case GL_BACK:
|
||||||
|
update_material(m_material_states[Face::Back], pname, params);
|
||||||
|
break;
|
||||||
|
case GL_FRONT_AND_BACK:
|
||||||
|
update_material(m_material_states[Face::Front], pname, params);
|
||||||
|
update_material(m_material_states[Face::Back], pname, params);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_light_state_is_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
void SoftwareGLContext::gl_color_material(GLenum face, GLenum mode)
|
void SoftwareGLContext::gl_color_material(GLenum face, GLenum mode)
|
||||||
{
|
{
|
||||||
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_color_material, face, mode);
|
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_color_material, face, mode);
|
||||||
|
|
|
@ -150,6 +150,7 @@ public:
|
||||||
virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) override;
|
virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) override;
|
||||||
virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) 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 gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) override;
|
||||||
|
virtual void gl_materialiv(GLenum face, GLenum pname, GLint const* params) override;
|
||||||
virtual void gl_color_material(GLenum face, GLenum mode) override;
|
virtual void gl_color_material(GLenum face, GLenum mode) override;
|
||||||
virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) override;
|
virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) override;
|
||||||
virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) override;
|
virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) override;
|
||||||
|
@ -378,6 +379,7 @@ private:
|
||||||
decltype(&SoftwareGLContext::gl_lightiv),
|
decltype(&SoftwareGLContext::gl_lightiv),
|
||||||
decltype(&SoftwareGLContext::gl_materialf),
|
decltype(&SoftwareGLContext::gl_materialf),
|
||||||
decltype(&SoftwareGLContext::gl_materialfv),
|
decltype(&SoftwareGLContext::gl_materialfv),
|
||||||
|
decltype(&SoftwareGLContext::gl_materialiv),
|
||||||
decltype(&SoftwareGLContext::gl_color_material),
|
decltype(&SoftwareGLContext::gl_color_material),
|
||||||
decltype(&SoftwareGLContext::gl_get_light)>;
|
decltype(&SoftwareGLContext::gl_get_light)>;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue