From 8f815a33ef57b3f001ba08f3083476a7fdd3450e Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Sun, 24 Jan 2021 09:38:05 +0100 Subject: [PATCH] refactor geometry topology naming to reflect more the Vulkan way Signed-off-by: Hartmut Seichter --- src/binding/src/script_core.cpp | 12 +++--- src/core/include/pw/core/geometry.hpp | 24 +++++++----- src/core/include/pw/core/matrix_transform.hpp | 6 +-- src/core/src/geometry.cpp | 25 +++++++------ src/scripts/demos/simple_002.lua | 37 +++++++++++-------- 5 files changed, 58 insertions(+), 46 deletions(-) diff --git a/src/binding/src/script_core.cpp b/src/binding/src/script_core.cpp index 5016a6d..f7c4f9a 100644 --- a/src/binding/src/script_core.cpp +++ b/src/binding/src/script_core.cpp @@ -118,16 +118,16 @@ void register_core_function(sol::state& lua,sol::table& ns) ); ns.new_usertype("geometry" - , sol::constructors() - , "primitive_type", sol::property(&geometry::primitive_type,&geometry::set_primitive_type) + , sol::constructors() + , "primitive_topology", sol::property(&geometry::primitive_topology,&geometry::set_primitive_topology) , "vertices", sol::property(&geometry::vertices,&geometry::set_vertices) , "indices", sol::property(&geometry::indices,&geometry::set_indices) , "compute_normals", &geometry::compute_normals); - ns.new_enum("primitive_type" - ,"points", geometry::primitive_type::points - ,"lines", geometry::primitive_type::lines - ,"triangles", geometry::primitive_type::triangles); + ns.new_enum("primitive_topology_type" + ,"point_list", geometry::primitive_topology_type::point_list + ,"line_list", geometry::primitive_topology_type::line_list + ,"triangle_list", geometry::primitive_topology_type::triangle_list); ns.new_usertype>("matrixtransform" diff --git a/src/core/include/pw/core/geometry.hpp b/src/core/include/pw/core/geometry.hpp index cd1476a..66ced4c 100644 --- a/src/core/include/pw/core/geometry.hpp +++ b/src/core/include/pw/core/geometry.hpp @@ -40,21 +40,27 @@ namespace pw { class geometry { public: - enum class primitive_type { - points, - lines, - triangles, - polygons + /** + * @brief describes the topology for the primitives based on Vulkan + */ + enum class primitive_topology_type { + point_list, + line_list, + line_strip, + triangle_list, + triangle_strip, + triangle_fan }; using index_t = uint32_t; //< needs to be compatible with GL_UNSIGNED_INT using indices_t = std::vector; geometry() = default; - geometry(primitive_type t, vector3_array v, indices_t i); + geometry(primitive_topology_type t, vector3_array v, indices_t i); + ~geometry() = default; - void set_primitive_type(primitive_type t) { _primitive_type = t; } - primitive_type primitive_type() { return _primitive_type; } + void set_primitive_topology(primitive_topology_type t) { _primitive_topology = t; } + primitive_topology_type primitive_topology() { return _primitive_topology; } void set_vertices(vector3_array v); const vector3_array& vertices() const { return _vertices; } @@ -75,7 +81,7 @@ public: protected: - enum primitive_type _primitive_type = primitive_type::triangles; + primitive_topology_type _primitive_topology = primitive_topology_type::point_list; vector3_array _vertices; //!< vertex data indices_t _indices; //!< indices diff --git a/src/core/include/pw/core/matrix_transform.hpp b/src/core/include/pw/core/matrix_transform.hpp index 085a356..bf60b91 100644 --- a/src/core/include/pw/core/matrix_transform.hpp +++ b/src/core/include/pw/core/matrix_transform.hpp @@ -112,9 +112,9 @@ struct matrix_transform { { matrix_<4,4,T> view_matrix; view_matrix.set_identity(); - const vector3_ los = (target - position).normalized(); // line of sight - const vector3_ sid = vector3_::cross(los,up).normalized(); - const vector3_ upd = vector3_::cross(sid,los).normalized(); + const vector3_ los = (target - position).normalized(); // line of sight + const vector3_ sid = vector3_::cross(los,up).normalized(); // side vector + const vector3_ upd = vector3_::cross(sid,los).normalized(); // upvector // set base vectors view_matrix.set_slice(sid, 0, 0); diff --git a/src/core/src/geometry.cpp b/src/core/src/geometry.cpp index 5387203..17d9007 100644 --- a/src/core/src/geometry.cpp +++ b/src/core/src/geometry.cpp @@ -39,7 +39,7 @@ void geometry::compute_normals() n.normalize(); } -// this->set_normals(normals); + // this->set_normals(normals); // for triangle-strip @@ -53,8 +53,8 @@ void geometry::compute_normals() void geometry::compute_tangent_space() { - if (_primitive_type == primitive_type::triangles) { - + switch (_primitive_topology) { + case primitive_topology_type::triangle_list: for (size_t i = 0; i < _indices.size();i += 3) { const auto& v0 = _vertices[_indices[i + 0]]; @@ -62,18 +62,19 @@ void geometry::compute_tangent_space() const auto& v2 = _vertices[_indices[i + 2]]; auto normal = vector3::cross(v1-v0,v2-v0); - - - + break; } + + default: + debug::w() << __PRETTY_FUNCTION__ << " not implemented for this topology type"; } } -geometry::geometry(enum primitive_type t - ,vector3_array v - ,indices_t i) - : _primitive_type(t) +geometry::geometry(primitive_topology_type t + ,vector3_array v + ,indices_t i) + : _primitive_topology(t) , _vertices(std::move(v)) , _indices(std::move(i)) { @@ -127,8 +128,8 @@ void geometry::transform(const matrix4x4 &m) v = vector4(m * v.homogenous()).project(); // apply to normals -// for(auto &n : _normals) -// n = vector4(m * n.homogenous(0)).xyz(); + // for(auto &n : _normals) + // n = vector4(m * n.homogenous(0)).xyz(); } diff --git a/src/scripts/demos/simple_002.lua b/src/scripts/demos/simple_002.lua index 69542d6..39343ee 100644 --- a/src/scripts/demos/simple_002.lua +++ b/src/scripts/demos/simple_002.lua @@ -2,10 +2,12 @@ -- pixwerx - bare rendering engine binding usage -- +-- we need everything pw.script:load_all() + +-- create a window (remember windows are invisible by default) local w = pw.window.new() -w.visible = false -- set title w.title = "pixwerx - bare rendering" @@ -19,13 +21,12 @@ w.position = pw.point.new(100,100) -- create a new geometry local g = pw.geometry:new() -g.primitive_type = pw.primitive_type.triangles -- meh - -g.vertices:clear() +g.primitive_topology = pw.primitive_topology_type.triangle_list -- meh z = -5.0 -s = 2 +s = 1 +-- geometry can only build with indexed facesets g.vertices:add(pw.vector3:new(-s, s, z)) -- 0 g.vertices:add(pw.vector3:new(-s,-s, z)) -- 1 g.vertices:add(pw.vector3:new( s,-s, z)) -- 2 @@ -48,11 +49,8 @@ local mm = pw.matrix4x4:new() local mv = pw.matrix4x4:new() local mp = pw.matrix4x4:new() - - local s = pw.shader:new() - s:set_source(pw.shader_type.vertex,[[ #version 400 uniform mat4 model; @@ -75,20 +73,25 @@ void main() { } ]]) +-- check if the shader can be compiled and linked if not s:build() then print("Error!") end + +-- the renderer for a geometry local renderer = pw.renderer:new() if not renderer:create(g) then print("couldn't create renderer") end -local cam_z = 0 -local cam_x = 0 +-- camera position +local cam_pos = pw.vector3:new(0,0,0) + w.on_resize = function(self) + -- use client_size to resize the viewport print(self.client_size.width,self.client_size.height) end @@ -98,7 +101,7 @@ w.on_update = function(self) -- set identity on model matrix mm:set_identity() -- set view matrix with look_at - mv = pw.matrixtransform.look_at(pw.vector3:new(cam_x,0,cam_z),pw.vector3.forward(),pw.vector3.up()) + mv = pw.matrixtransform.look_at(cam_pos,pw.vector3.forward(),pw.vector3.up()) -- compute aspect ratio from canvas size aspect_ratio = self.client_size.width / self.client_size.height @@ -150,15 +153,17 @@ while w:update() do -- camera if pw.input.get().input_string == 'w' then - cam_z = cam_z - move_step + cam_pos.z = cam_pos.z - move_step elseif pw.input.get().input_string == 's' then - cam_z = cam_z + move_step - print(cam_z) + cam_pos.z = cam_pos.z + move_step elseif pw.input.get().input_string == 'a' then - cam_x = cam_x - move_step + cam_pos.x = cam_pos.x - move_step elseif pw.input.get().input_string == 'd' then - cam_x = cam_x + move_step + cam_pos.x = cam_pos.x + move_step end + + print(cam_pos.x,cam_pos.y,cam_pos.z) + end -- just to check