diff --git a/Userland/Libraries/LibGL/CMakeLists.txt b/Userland/Libraries/LibGL/CMakeLists.txt index 55ac5a4dc5..5d402d5642 100644 --- a/Userland/Libraries/LibGL/CMakeLists.txt +++ b/Userland/Libraries/LibGL/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCES GLBlend.cpp GLColor.cpp GLContext.cpp + GLDraw.cpp GLFog.cpp GLLights.cpp GLLists.cpp diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 89530e9d7b..b7325b9aee 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -451,6 +451,7 @@ 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); +GLAPI void glRasterPos2i(GLint x, GLint y); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index e5bb10772e..576539e9c1 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -94,6 +94,7 @@ public: 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 gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0; virtual void present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLDraw.cpp b/Userland/Libraries/LibGL/GLDraw.cpp new file mode 100644 index 0000000000..102013867b --- /dev/null +++ b/Userland/Libraries/LibGL/GLDraw.cpp @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "GL/gl.h" +#include "GLContext.h" + +extern GL::GLContext* g_gl_context; + +void glRasterPos2i(GLint x, GLint y) +{ + g_gl_context->gl_raster_pos(static_cast(x), static_cast(y), 0.0f, 1.0f); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index 6ffe415d08..ebce348c6e 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -2248,6 +2248,15 @@ void SoftwareGLContext::gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) m_current_vertex_normal = { nx, ny, nz }; } +void SoftwareGLContext::gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_raster_pos, x, y, z, w); + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + + m_current_raster_position.window_coordinates = { x, y, z }; + m_current_raster_position.clip_coordinate_value = w; +} + void SoftwareGLContext::present() { m_rasterizer.blit_to(*m_frontbuffer); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 335ed640e9..a8869571e4 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -105,6 +105,7 @@ public: 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 gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) override; virtual void present() override; private: @@ -269,7 +270,8 @@ private: decltype(&SoftwareGLContext::gl_scissor), decltype(&SoftwareGLContext::gl_stencil_func_separate), decltype(&SoftwareGLContext::gl_stencil_op_separate), - decltype(&SoftwareGLContext::gl_normal)>; + decltype(&SoftwareGLContext::gl_normal), + decltype(&SoftwareGLContext::gl_raster_pos)>; using ExtraSavedArguments = Variant< FloatMatrix4x4>; @@ -305,6 +307,17 @@ private: u8 m_pack_alignment { 4 }; GLsizei m_unpack_row_length { 0 }; u8 m_unpack_alignment { 4 }; + + struct RasterPosition { + FloatVector3 window_coordinates { 0.0f, 0.0f, 0.0f }; + float clip_coordinate_value { 1.0f }; + float eye_coordinate_distance { 0.0f }; + bool valid { true }; + FloatVector4 color_rgba { 1.0f, 1.0f, 1.0f, 1.0f }; + float color_index { 1.0f }; + FloatVector4 texture_coordinates { 0.0f, 0.0f, 0.0f, 1.0f }; + }; + RasterPosition m_current_raster_position; }; }