From 78d06742284d52862e2aabb7cf83ae8b9cf9e237 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Wed, 1 Dec 2021 15:33:23 +0100 Subject: [PATCH] LibGL: Implement `glNormal3f` and `glNormal3fv` --- Userland/Libraries/LibGL/GL/gl.h | 2 ++ Userland/Libraries/LibGL/GLContext.h | 1 + Userland/Libraries/LibGL/GLStruct.h | 2 ++ Userland/Libraries/LibGL/GLVert.cpp | 10 ++++++++++ Userland/Libraries/LibGL/SoftwareGLContext.cpp | 8 ++++++++ Userland/Libraries/LibGL/SoftwareGLContext.h | 5 ++++- 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 396404e6d83..89530e9d7b6 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -449,6 +449,8 @@ GLAPI void glStencilFunc(GLenum func, GLint ref, GLuint mask); GLAPI void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask); GLAPI void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass); GLAPI void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void glNormal3fv(GLfloat const* v); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index 8ad450b4ab7..e5bb10772e2 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -93,6 +93,7 @@ public: virtual void gl_scissor(GLint x, GLint y, GLsizei width, GLsizei height) = 0; virtual void gl_stencil_func_separate(GLenum face, GLenum func, GLint ref, GLuint mask) = 0; virtual void gl_stencil_op_separate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) = 0; + virtual void gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) = 0; virtual void present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLStruct.h b/Userland/Libraries/LibGL/GLStruct.h index 9b7785462fd..72bb8cc3c35 100644 --- a/Userland/Libraries/LibGL/GLStruct.h +++ b/Userland/Libraries/LibGL/GLStruct.h @@ -8,6 +8,7 @@ #include "GL/gl.h" #include +#include #include namespace GL { @@ -20,6 +21,7 @@ struct GLVertex { FloatVector4 position; FloatVector4 color; FloatVector2 tex_coord; + FloatVector3 normal; }; struct GLTriangle { diff --git a/Userland/Libraries/LibGL/GLVert.cpp b/Userland/Libraries/LibGL/GLVert.cpp index 74249b9d05d..d2a2bc4ba69 100644 --- a/Userland/Libraries/LibGL/GLVert.cpp +++ b/Userland/Libraries/LibGL/GLVert.cpp @@ -169,3 +169,13 @@ void glTranslatef(GLfloat x, GLfloat y, GLfloat z) { g_gl_context->gl_translate(x, y, z); } + +void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) +{ + g_gl_context->gl_normal(nx, ny, nz); +} + +void glNormal3fv(GLfloat const* v) +{ + g_gl_context->gl_normal(v[0], v[1], v[2]); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index c220e89efc9..6ffe415d08c 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -514,6 +514,7 @@ void SoftwareGLContext::gl_vertex(GLdouble x, GLdouble y, GLdouble z, GLdouble w vertex.position = { static_cast(x), static_cast(y), static_cast(z), static_cast(w) }; vertex.color = m_current_vertex_color; vertex.tex_coord = { m_current_vertex_tex_coord.x(), m_current_vertex_tex_coord.y() }; + vertex.normal = m_current_vertex_normal; vertex_list.append(vertex); } @@ -2240,6 +2241,13 @@ void SoftwareGLContext::gl_stencil_op_separate(GLenum face, GLenum sfail, GLenum m_stencil_backfacing_op = new_options; } +void SoftwareGLContext::gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) +{ + APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_normal, nx, ny, nz); + + m_current_vertex_normal = { nx, ny, nz }; +} + void SoftwareGLContext::present() { m_rasterizer.blit_to(*m_frontbuffer); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index f5805a3dfab..335ed640e90 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -104,6 +104,7 @@ public: virtual void gl_scissor(GLint x, GLint y, GLsizei width, GLsizei height) override; virtual void gl_stencil_func_separate(GLenum face, GLenum func, GLint ref, GLuint mask) override; virtual void gl_stencil_op_separate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) override; + virtual void gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) override; virtual void present() override; private: @@ -143,6 +144,7 @@ private: double m_clear_depth = { 1.0 }; FloatVector4 m_current_vertex_color = { 1.0f, 1.0f, 1.0f, 1.0f }; FloatVector4 m_current_vertex_tex_coord = { 0.0f, 0.0f, 0.0f, 0.0f }; + FloatVector3 m_current_vertex_normal = { 0.0f, 0.0f, 1.0f }; Vector vertex_list; Vector triangle_list; @@ -266,7 +268,8 @@ private: decltype(&SoftwareGLContext::gl_polygon_offset), decltype(&SoftwareGLContext::gl_scissor), decltype(&SoftwareGLContext::gl_stencil_func_separate), - decltype(&SoftwareGLContext::gl_stencil_op_separate)>; + decltype(&SoftwareGLContext::gl_stencil_op_separate), + decltype(&SoftwareGLContext::gl_normal)>; using ExtraSavedArguments = Variant< FloatMatrix4x4>;