refactor geometry topology naming to reflect more the Vulkan way

Signed-off-by: Hartmut Seichter <hartmut@technotecture.com>
This commit is contained in:
Hartmut Seichter 2021-01-24 09:38:05 +01:00
parent 753f51453f
commit 8f815a33ef
5 changed files with 58 additions and 46 deletions

View file

@ -118,16 +118,16 @@ void register_core_function(sol::state& lua,sol::table& ns)
);
ns.new_usertype<geometry>("geometry"
, sol::constructors<geometry()>()
, "primitive_type", sol::property(&geometry::primitive_type,&geometry::set_primitive_type)
, sol::constructors<geometry(),geometry(geometry::primitive_topology_type,vector3_array,geometry::indices_t)>()
, "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<false>("primitive_type"
,"points", geometry::primitive_type::points
,"lines", geometry::primitive_type::lines
,"triangles", geometry::primitive_type::triangles);
ns.new_enum<false>("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<matrix_transform<real_t>>("matrixtransform"

View file

@ -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<index_t>;
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

View file

@ -113,8 +113,8 @@ struct matrix_transform {
matrix_<4,4,T> view_matrix; view_matrix.set_identity();
const vector3_<T> los = (target - position).normalized(); // line of sight
const vector3_<T> sid = vector3_<T>::cross(los,up).normalized();
const vector3_<T> upd = vector3_<T>::cross(sid,los).normalized();
const vector3_<T> sid = vector3_<T>::cross(los,up).normalized(); // side vector
const vector3_<T> upd = vector3_<T>::cross(sid,los).normalized(); // upvector
// set base vectors
view_matrix.set_slice(sid, 0, 0);

View file

@ -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
geometry::geometry(primitive_topology_type t
,vector3_array v
,indices_t i)
: _primitive_type(t)
: _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();
}

View file

@ -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