LibGL: Implement glLightModel integer normalization

For the ambient light model, integers need to be remapped to a range of
`-1.` through `1.`. Add the `+` and `-` operators to `VectorN` to make
it a bit easier to normalize 4 values at once.
This commit is contained in:
Jelle Raaijmakers 2022-12-12 00:32:11 +01:00 committed by Andreas Kling
parent a074b7e871
commit 8c094699db
Notes: sideshowbarker 2024-07-17 02:57:32 +09:00
2 changed files with 36 additions and 19 deletions

View file

@ -193,26 +193,23 @@ void GLContext::gl_light_model(GLenum pname, GLfloat x, GLfloat y, GLfloat z, GL
void GLContext::gl_light_modelv(GLenum pname, void const* params, GLenum type)
{
auto invoke_implementation = [&](auto const* params) {
switch (pname) {
case GL_LIGHT_MODEL_AMBIENT:
gl_light_model(pname, params[0], params[1], params[2], params[3]);
return;
default:
gl_light_model(pname, params[0], 0.f, 0.f, 0.f);
return;
}
VERIFY(type == GL_FLOAT || type == GL_INT);
auto parameters_to_vector = [&]<typename T>(T const* params) -> FloatVector4 {
return (pname == GL_LIGHT_MODEL_AMBIENT)
? Vector4<T> { params[0], params[1], params[2], params[3] }.template to_type<float>()
: Vector4<T> { params[0], 0, 0, 0 }.template to_type<float>();
};
switch (type) {
case GL_FLOAT:
invoke_implementation(reinterpret_cast<GLfloat const*>(params));
break;
case GL_INT:
invoke_implementation(reinterpret_cast<GLint const*>(params));
break;
default:
VERIFY_NOT_REACHED();
}
auto light_model_parameters = (type == GL_FLOAT)
? parameters_to_vector(reinterpret_cast<GLfloat const*>(params))
: parameters_to_vector(reinterpret_cast<GLint const*>(params));
// Normalize integers to -1..1
if (pname == GL_LIGHT_MODEL_AMBIENT && type == GL_INT)
light_model_parameters = (light_model_parameters + 2147483648.f) / 2147483647.5f - 1.f;
gl_light_model(pname, light_model_parameters[0], light_model_parameters[1], light_model_parameters[2], light_model_parameters[3]);
}
void GLContext::gl_lightf(GLenum light, GLenum pname, GLfloat param)

View file

@ -158,6 +158,26 @@ public:
return result;
}
template<typename U>
[[nodiscard]] constexpr VectorN operator+(U f) const
{
VectorN result;
UNROLL_LOOP
for (auto i = 0u; i < N; ++i)
result.m_data[i] = m_data[i] + f;
return result;
}
template<typename U>
[[nodiscard]] constexpr VectorN operator-(U f) const
{
VectorN result;
UNROLL_LOOP
for (auto i = 0u; i < N; ++i)
result.m_data[i] = m_data[i] - f;
return result;
}
template<typename U>
[[nodiscard]] constexpr VectorN operator*(U f) const
{