summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Unverwerth <s.unverwerth@serenityos.org>2021-12-16 22:43:39 +0100
committerBrian Gianforcaro <b.gianfo@gmail.com>2021-12-24 05:10:28 -0800
commit251f3c007f50397e2c65962b3322cb1b9f325d4f (patch)
tree14efd96141d9b13ff1c90f577add1a8c2894ed4e
parent73ba208ee7fec6a8f5e11b4169e283b50fb56cbe (diff)
downloadserenity-251f3c007f50397e2c65962b3322cb1b9f325d4f.zip
LibGL+LibSoftGPU: Move Vertex and Triangle structs to LibSoftGPU
-rw-r--r--Userland/Libraries/LibGL/GLStruct.h11
-rw-r--r--Userland/Libraries/LibGL/SoftwareGLContext.cpp2
-rw-r--r--Userland/Libraries/LibGL/SoftwareGLContext.h3
-rw-r--r--Userland/Libraries/LibSoftGPU/Clipper.cpp6
-rw-r--r--Userland/Libraries/LibSoftGPU/Clipper.h10
-rw-r--r--Userland/Libraries/LibSoftGPU/SoftwareRasterizer.cpp20
-rw-r--r--Userland/Libraries/LibSoftGPU/SoftwareRasterizer.h12
-rw-r--r--Userland/Libraries/LibSoftGPU/Triangle.h18
-rw-r--r--Userland/Libraries/LibSoftGPU/Vertex.h22
9 files changed, 68 insertions, 36 deletions
diff --git a/Userland/Libraries/LibGL/GLStruct.h b/Userland/Libraries/LibGL/GLStruct.h
index a7434fba1b..0d6a348f97 100644
--- a/Userland/Libraries/LibGL/GLStruct.h
+++ b/Userland/Libraries/LibGL/GLStruct.h
@@ -17,17 +17,6 @@ struct GLColor {
GLclampf r, g, b, a;
};
-struct GLVertex {
- FloatVector4 position;
- FloatVector4 color;
- FloatVector4 tex_coord;
- FloatVector3 normal;
-};
-
-struct GLTriangle {
- GLVertex vertices[3];
-};
-
struct GLEdge {
GLfloat x1;
GLfloat y1;
diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp
index 94b01b7d88..35b6dbd9ca 100644
--- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp
+++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp
@@ -500,7 +500,7 @@ void SoftwareGLContext::gl_vertex(GLdouble x, GLdouble y, GLdouble z, GLdouble w
{
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_vertex, x, y, z, w);
- GLVertex vertex;
+ SoftGPU::Vertex vertex;
vertex.position = { static_cast<float>(x), static_cast<float>(y), static_cast<float>(z), static_cast<float>(w) };
vertex.color = m_current_vertex_color;
diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h
index 1f96290988..eec82eebcc 100644
--- a/Userland/Libraries/LibGL/SoftwareGLContext.h
+++ b/Userland/Libraries/LibGL/SoftwareGLContext.h
@@ -23,6 +23,7 @@
#include <LibGfx/Vector3.h>
#include <LibSoftGPU/Clipper.h>
#include <LibSoftGPU/SoftwareRasterizer.h>
+#include <LibSoftGPU/Vertex.h>
namespace GL {
@@ -176,7 +177,7 @@ private:
FloatVector4 m_current_vertex_tex_coord = { 0.0f, 0.0f, 0.0f, 1.0f };
FloatVector3 m_current_vertex_normal = { 0.0f, 0.0f, 1.0f };
- Vector<GLVertex, 96> m_vertex_list;
+ Vector<SoftGPU::Vertex> m_vertex_list;
GLenum m_error = GL_NO_ERROR;
bool m_in_draw_state = false;
diff --git a/Userland/Libraries/LibSoftGPU/Clipper.cpp b/Userland/Libraries/LibSoftGPU/Clipper.cpp
index e32a0e7361..89e6e204e5 100644
--- a/Userland/Libraries/LibSoftGPU/Clipper.cpp
+++ b/Userland/Libraries/LibSoftGPU/Clipper.cpp
@@ -31,7 +31,7 @@ bool Clipper::point_within_clip_plane(const FloatVector4& vertex, ClipPlane plan
return false;
}
-GL::GLVertex Clipper::clip_intersection_point(const GL::GLVertex& p1, const GL::GLVertex& p2, ClipPlane plane_index)
+Vertex Clipper::clip_intersection_point(const Vertex& p1, const Vertex& p2, ClipPlane plane_index)
{
// See https://www.microsoft.com/en-us/research/wp-content/uploads/1978/01/p245-blinn.pdf
// "Clipping Using Homogeneous Coordinates" Blinn/Newell, 1978
@@ -42,14 +42,14 @@ GL::GLVertex Clipper::clip_intersection_point(const GL::GLVertex& p1, const GL::
float x2 = clip_plane_normals[plane_index].dot(p2.position);
float a = (w1 + x1) / ((w1 + x1) - (w2 + x2));
- GL::GLVertex out;
+ Vertex out;
out.position = p1.position * (1 - a) + p2.position * a;
out.color = p1.color * (1 - a) + p2.color * a;
out.tex_coord = p1.tex_coord * (1 - a) + p2.tex_coord * a;
return out;
}
-void Clipper::clip_triangle_against_frustum(Vector<GL::GLVertex>& input_verts)
+void Clipper::clip_triangle_against_frustum(Vector<Vertex>& input_verts)
{
list_a = input_verts;
list_b.clear_with_capacity();
diff --git a/Userland/Libraries/LibSoftGPU/Clipper.h b/Userland/Libraries/LibSoftGPU/Clipper.h
index 4be38b963f..7bf46e8d35 100644
--- a/Userland/Libraries/LibSoftGPU/Clipper.h
+++ b/Userland/Libraries/LibSoftGPU/Clipper.h
@@ -7,8 +7,8 @@
#pragma once
#include <AK/Vector.h>
-#include <LibGL/GLStruct.h>
#include <LibGfx/Vector4.h>
+#include <LibSoftGPU/Vertex.h>
namespace SoftGPU {
@@ -46,13 +46,13 @@ class Clipper final {
public:
Clipper() { }
- void clip_triangle_against_frustum(Vector<GL::GLVertex>& input_vecs);
+ void clip_triangle_against_frustum(Vector<Vertex>& input_vecs);
private:
bool point_within_clip_plane(const FloatVector4& vertex, ClipPlane plane);
- GL::GLVertex clip_intersection_point(const GL::GLVertex& vec, const GL::GLVertex& prev_vec, ClipPlane plane_index);
- Vector<GL::GLVertex> list_a;
- Vector<GL::GLVertex> list_b;
+ Vertex clip_intersection_point(const Vertex& vec, const Vertex& prev_vec, ClipPlane plane_index);
+ Vector<Vertex> list_a;
+ Vector<Vertex> list_b;
};
}
diff --git a/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.cpp b/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.cpp
index c582256434..66f523bcb6 100644
--- a/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.cpp
+++ b/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.cpp
@@ -111,7 +111,7 @@ static constexpr void setup_blend_factors(GLenum mode, FloatVector4& constant, f
}
template<typename PS>
-static void rasterize_triangle(const RasterizerOptions& options, Gfx::Bitmap& render_target, DepthBuffer& depth_buffer, const GL::GLTriangle& triangle, PS pixel_shader)
+static void rasterize_triangle(const RasterizerOptions& options, Gfx::Bitmap& render_target, DepthBuffer& depth_buffer, const Triangle& triangle, PS pixel_shader)
{
// Since the algorithm is based on blocks of uniform size, we need
// to ensure that our render_target size is actually a multiple of the block size
@@ -495,7 +495,7 @@ SoftwareRasterizer::SoftwareRasterizer(const Gfx::IntSize& min_size)
m_options.scissor_box = m_render_target->rect();
}
-void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 const& transform, FloatMatrix4x4 const& texture_matrix, Vector<GL::GLVertex> const& vertices, GL::TextureUnit::BoundList const& bound_texture_units)
+void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 const& transform, FloatMatrix4x4 const& texture_matrix, Vector<Vertex> const& vertices, GL::TextureUnit::BoundList const& bound_texture_units)
{
// At this point, the user has effectively specified that they are done with defining the geometry
// of what they want to draw. We now need to do a few things (https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview):
@@ -515,7 +515,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
// Let's construct some triangles
if (primitive_type == GL_TRIANGLES) {
- GL::GLTriangle triangle;
+ Triangle triangle;
for (size_t i = 0; i < vertices.size(); i += 3) {
triangle.vertices[0] = vertices.at(i);
triangle.vertices[1] = vertices.at(i + 1);
@@ -525,7 +525,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
}
} else if (primitive_type == GL_QUADS) {
// We need to construct two triangles to form the quad
- GL::GLTriangle triangle;
+ Triangle triangle;
VERIFY(vertices.size() % 4 == 0);
for (size_t i = 0; i < vertices.size(); i += 4) {
// Triangle 1
@@ -541,7 +541,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
m_triangle_list.append(triangle);
}
} else if (primitive_type == GL_TRIANGLE_FAN || primitive_type == GL_POLYGON) {
- GL::GLTriangle triangle;
+ Triangle triangle;
triangle.vertices[0] = vertices.at(0); // Root vertex is always the vertex defined first
for (size_t i = 1; i < vertices.size() - 1; i++) // This is technically `n-2` triangles. We start at index 1
@@ -551,7 +551,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
m_triangle_list.append(triangle);
}
} else if (primitive_type == GL_TRIANGLE_STRIP) {
- GL::GLTriangle triangle;
+ Triangle triangle;
for (size_t i = 0; i < vertices.size() - 2; i++) {
triangle.vertices[0] = vertices.at(i);
triangle.vertices[1] = vertices.at(i + 1);
@@ -562,7 +562,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
// Now let's transform each triangle and send that to the GPU
for (size_t i = 0; i < m_triangle_list.size(); i++) {
- GL::GLTriangle& triangle = m_triangle_list.at(i);
+ Triangle& triangle = m_triangle_list.at(i);
// First multiply the vertex by the MODELVIEW matrix and then the PROJECTION matrix
triangle.vertices[0].position = transform * triangle.vertices[0].position;
@@ -607,7 +607,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
vec.position.set_y(scr_height / 2 - vec.position.y() * scr_height / 2);
}
- GL::GLTriangle tri;
+ Triangle tri;
tri.vertices[0] = m_clipped_vertices[0];
for (size_t i = 1; i < m_clipped_vertices.size() - 1; i++) {
tri.vertices[1] = m_clipped_vertices[i];
@@ -617,7 +617,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
}
for (size_t i = 0; i < m_processed_triangles.size(); i++) {
- GL::GLTriangle& triangle = m_processed_triangles.at(i);
+ Triangle& triangle = m_processed_triangles.at(i);
// Let's calculate the (signed) area of the triangle
// https://cp-algorithms.com/geometry/oriented-triangle-area.html
@@ -648,7 +648,7 @@ void SoftwareRasterizer::draw_primitives(GLenum primitive_type, FloatMatrix4x4 c
}
}
-void SoftwareRasterizer::submit_triangle(const GL::GLTriangle& triangle, GL::TextureUnit::BoundList const& bound_texture_units)
+void SoftwareRasterizer::submit_triangle(const Triangle& triangle, GL::TextureUnit::BoundList const& bound_texture_units)
{
rasterize_triangle(m_options, *m_render_target, *m_depth_buffer, triangle, [this, &bound_texture_units](FloatVector4 const& uv, FloatVector4 const& color, float z) -> FloatVector4 {
FloatVector4 fragment = color;
diff --git a/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.h b/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.h
index 25f1bc9950..1b5b627f40 100644
--- a/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.h
+++ b/Userland/Libraries/LibSoftGPU/SoftwareRasterizer.h
@@ -18,6 +18,8 @@
#include <LibGfx/Vector4.h>
#include <LibSoftGPU/Clipper.h>
#include <LibSoftGPU/DepthBuffer.h>
+#include <LibSoftGPU/Triangle.h>
+#include <LibSoftGPU/Vertex.h>
namespace SoftGPU {
@@ -61,7 +63,7 @@ class SoftwareRasterizer final {
public:
SoftwareRasterizer(const Gfx::IntSize& min_size);
- void draw_primitives(GLenum primitive_type, FloatMatrix4x4 const& transform, FloatMatrix4x4 const& texture_matrix, Vector<GL::GLVertex> const& vertices, GL::TextureUnit::BoundList const& bound_texture_units);
+ void draw_primitives(GLenum primitive_type, FloatMatrix4x4 const& transform, FloatMatrix4x4 const& texture_matrix, Vector<Vertex> const& vertices, GL::TextureUnit::BoundList const& bound_texture_units);
void resize(const Gfx::IntSize& min_size);
void clear_color(const FloatVector4&);
void clear_depth(float);
@@ -74,16 +76,16 @@ public:
float get_depthbuffer_value(int x, int y);
private:
- void submit_triangle(GL::GLTriangle const& triangle, GL::TextureUnit::BoundList const& bound_texture_units);
+ void submit_triangle(Triangle const& triangle, GL::TextureUnit::BoundList const& bound_texture_units);
private:
RefPtr<Gfx::Bitmap> m_render_target;
OwnPtr<DepthBuffer> m_depth_buffer;
RasterizerOptions m_options;
Clipper m_clipper;
- Vector<GL::GLTriangle, 32> m_triangle_list;
- Vector<GL::GLTriangle, 32> m_processed_triangles;
- Vector<GL::GLVertex> m_clipped_vertices;
+ Vector<Triangle> m_triangle_list;
+ Vector<Triangle> m_processed_triangles;
+ Vector<Vertex> m_clipped_vertices;
};
}
diff --git a/Userland/Libraries/LibSoftGPU/Triangle.h b/Userland/Libraries/LibSoftGPU/Triangle.h
new file mode 100644
index 0000000000..bf7a27e761
--- /dev/null
+++ b/Userland/Libraries/LibSoftGPU/Triangle.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
+ * Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibSoftGPU/Vertex.h>
+
+namespace SoftGPU {
+
+struct Triangle {
+ Vertex vertices[3];
+};
+
+}
diff --git a/Userland/Libraries/LibSoftGPU/Vertex.h b/Userland/Libraries/LibSoftGPU/Vertex.h
new file mode 100644
index 0000000000..b2c5fa63cd
--- /dev/null
+++ b/Userland/Libraries/LibSoftGPU/Vertex.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
+ * Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibGfx/Vector3.h>
+#include <LibGfx/Vector4.h>
+
+namespace SoftGPU {
+
+struct Vertex {
+ FloatVector4 position;
+ FloatVector4 color;
+ FloatVector4 tex_coord;
+ FloatVector3 normal;
+};
+
+}