refactor geometry topology naming to reflect more the Vulkan way
Signed-off-by: Hartmut Seichter <hartmut@technotecture.com>
This commit is contained in:
parent
753f51453f
commit
8f815a33ef
5 changed files with 58 additions and 46 deletions
|
@ -118,16 +118,16 @@ void register_core_function(sol::state& lua,sol::table& ns)
|
||||||
);
|
);
|
||||||
|
|
||||||
ns.new_usertype<geometry>("geometry"
|
ns.new_usertype<geometry>("geometry"
|
||||||
, sol::constructors<geometry()>()
|
, sol::constructors<geometry(),geometry(geometry::primitive_topology_type,vector3_array,geometry::indices_t)>()
|
||||||
, "primitive_type", sol::property(&geometry::primitive_type,&geometry::set_primitive_type)
|
, "primitive_topology", sol::property(&geometry::primitive_topology,&geometry::set_primitive_topology)
|
||||||
, "vertices", sol::property(&geometry::vertices,&geometry::set_vertices)
|
, "vertices", sol::property(&geometry::vertices,&geometry::set_vertices)
|
||||||
, "indices", sol::property(&geometry::indices,&geometry::set_indices)
|
, "indices", sol::property(&geometry::indices,&geometry::set_indices)
|
||||||
, "compute_normals", &geometry::compute_normals);
|
, "compute_normals", &geometry::compute_normals);
|
||||||
|
|
||||||
ns.new_enum<false>("primitive_type"
|
ns.new_enum<false>("primitive_topology_type"
|
||||||
,"points", geometry::primitive_type::points
|
,"point_list", geometry::primitive_topology_type::point_list
|
||||||
,"lines", geometry::primitive_type::lines
|
,"line_list", geometry::primitive_topology_type::line_list
|
||||||
,"triangles", geometry::primitive_type::triangles);
|
,"triangle_list", geometry::primitive_topology_type::triangle_list);
|
||||||
|
|
||||||
|
|
||||||
ns.new_usertype<matrix_transform<real_t>>("matrixtransform"
|
ns.new_usertype<matrix_transform<real_t>>("matrixtransform"
|
||||||
|
|
|
@ -40,21 +40,27 @@ namespace pw {
|
||||||
class geometry {
|
class geometry {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum class primitive_type {
|
/**
|
||||||
points,
|
* @brief describes the topology for the primitives based on Vulkan
|
||||||
lines,
|
*/
|
||||||
triangles,
|
enum class primitive_topology_type {
|
||||||
polygons
|
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 index_t = uint32_t; //< needs to be compatible with GL_UNSIGNED_INT
|
||||||
using indices_t = std::vector<index_t>;
|
using indices_t = std::vector<index_t>;
|
||||||
|
|
||||||
geometry() = default;
|
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; }
|
void set_primitive_topology(primitive_topology_type t) { _primitive_topology = t; }
|
||||||
primitive_type primitive_type() { return _primitive_type; }
|
primitive_topology_type primitive_topology() { return _primitive_topology; }
|
||||||
|
|
||||||
void set_vertices(vector3_array v);
|
void set_vertices(vector3_array v);
|
||||||
const vector3_array& vertices() const { return _vertices; }
|
const vector3_array& vertices() const { return _vertices; }
|
||||||
|
@ -75,7 +81,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
enum primitive_type _primitive_type = primitive_type::triangles;
|
primitive_topology_type _primitive_topology = primitive_topology_type::point_list;
|
||||||
|
|
||||||
vector3_array _vertices; //!< vertex data
|
vector3_array _vertices; //!< vertex data
|
||||||
indices_t _indices; //!< indices
|
indices_t _indices; //!< indices
|
||||||
|
|
|
@ -112,9 +112,9 @@ struct matrix_transform {
|
||||||
{
|
{
|
||||||
matrix_<4,4,T> view_matrix; view_matrix.set_identity();
|
matrix_<4,4,T> view_matrix; view_matrix.set_identity();
|
||||||
|
|
||||||
const vector3_<T> los = (target - position).normalized(); // line of sight
|
const vector3_<T> los = (target - position).normalized(); // line of sight
|
||||||
const vector3_<T> sid = vector3_<T>::cross(los,up).normalized();
|
const vector3_<T> sid = vector3_<T>::cross(los,up).normalized(); // side vector
|
||||||
const vector3_<T> upd = vector3_<T>::cross(sid,los).normalized();
|
const vector3_<T> upd = vector3_<T>::cross(sid,los).normalized(); // upvector
|
||||||
|
|
||||||
// set base vectors
|
// set base vectors
|
||||||
view_matrix.set_slice(sid, 0, 0);
|
view_matrix.set_slice(sid, 0, 0);
|
||||||
|
|
|
@ -39,7 +39,7 @@ void geometry::compute_normals()
|
||||||
n.normalize();
|
n.normalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
// this->set_normals(normals);
|
// this->set_normals(normals);
|
||||||
|
|
||||||
|
|
||||||
// for triangle-strip
|
// for triangle-strip
|
||||||
|
@ -53,8 +53,8 @@ void geometry::compute_normals()
|
||||||
|
|
||||||
void geometry::compute_tangent_space()
|
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) {
|
for (size_t i = 0; i < _indices.size();i += 3) {
|
||||||
|
|
||||||
const auto& v0 = _vertices[_indices[i + 0]];
|
const auto& v0 = _vertices[_indices[i + 0]];
|
||||||
|
@ -62,18 +62,19 @@ void geometry::compute_tangent_space()
|
||||||
const auto& v2 = _vertices[_indices[i + 2]];
|
const auto& v2 = _vertices[_indices[i + 2]];
|
||||||
|
|
||||||
auto normal = vector3::cross(v1-v0,v2-v0);
|
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
|
,vector3_array v
|
||||||
,indices_t i)
|
,indices_t i)
|
||||||
: _primitive_type(t)
|
: _primitive_topology(t)
|
||||||
, _vertices(std::move(v))
|
, _vertices(std::move(v))
|
||||||
, _indices(std::move(i))
|
, _indices(std::move(i))
|
||||||
{
|
{
|
||||||
|
@ -127,8 +128,8 @@ void geometry::transform(const matrix4x4 &m)
|
||||||
v = vector4(m * v.homogenous()).project();
|
v = vector4(m * v.homogenous()).project();
|
||||||
|
|
||||||
// apply to normals
|
// apply to normals
|
||||||
// for(auto &n : _normals)
|
// for(auto &n : _normals)
|
||||||
// n = vector4(m * n.homogenous(0)).xyz();
|
// n = vector4(m * n.homogenous(0)).xyz();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,12 @@
|
||||||
-- pixwerx - bare rendering engine binding usage
|
-- pixwerx - bare rendering engine binding usage
|
||||||
--
|
--
|
||||||
|
|
||||||
|
-- we need everything
|
||||||
pw.script:load_all()
|
pw.script:load_all()
|
||||||
|
|
||||||
|
|
||||||
|
-- create a window (remember windows are invisible by default)
|
||||||
local w = pw.window.new()
|
local w = pw.window.new()
|
||||||
w.visible = false
|
|
||||||
|
|
||||||
-- set title
|
-- set title
|
||||||
w.title = "pixwerx - bare rendering"
|
w.title = "pixwerx - bare rendering"
|
||||||
|
@ -19,13 +21,12 @@ w.position = pw.point.new(100,100)
|
||||||
-- create a new geometry
|
-- create a new geometry
|
||||||
local g = pw.geometry:new()
|
local g = pw.geometry:new()
|
||||||
|
|
||||||
g.primitive_type = pw.primitive_type.triangles -- meh
|
g.primitive_topology = pw.primitive_topology_type.triangle_list -- meh
|
||||||
|
|
||||||
g.vertices:clear()
|
|
||||||
|
|
||||||
z = -5.0
|
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)) -- 0
|
||||||
g.vertices:add(pw.vector3:new(-s,-s, z)) -- 1
|
g.vertices:add(pw.vector3:new(-s,-s, z)) -- 1
|
||||||
g.vertices:add(pw.vector3:new( s,-s, z)) -- 2
|
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 mv = pw.matrix4x4:new()
|
||||||
local mp = pw.matrix4x4:new()
|
local mp = pw.matrix4x4:new()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local s = pw.shader:new()
|
local s = pw.shader:new()
|
||||||
|
|
||||||
|
|
||||||
s:set_source(pw.shader_type.vertex,[[
|
s:set_source(pw.shader_type.vertex,[[
|
||||||
#version 400
|
#version 400
|
||||||
uniform mat4 model;
|
uniform mat4 model;
|
||||||
|
@ -75,20 +73,25 @@ void main() {
|
||||||
}
|
}
|
||||||
]])
|
]])
|
||||||
|
|
||||||
|
-- check if the shader can be compiled and linked
|
||||||
if not s:build() then
|
if not s:build() then
|
||||||
print("Error!")
|
print("Error!")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- the renderer for a geometry
|
||||||
local renderer = pw.renderer:new()
|
local renderer = pw.renderer:new()
|
||||||
|
|
||||||
if not renderer:create(g) then
|
if not renderer:create(g) then
|
||||||
print("couldn't create renderer")
|
print("couldn't create renderer")
|
||||||
end
|
end
|
||||||
|
|
||||||
local cam_z = 0
|
-- camera position
|
||||||
local cam_x = 0
|
local cam_pos = pw.vector3:new(0,0,0)
|
||||||
|
|
||||||
|
|
||||||
w.on_resize = function(self)
|
w.on_resize = function(self)
|
||||||
|
-- use client_size to resize the viewport
|
||||||
print(self.client_size.width,self.client_size.height)
|
print(self.client_size.width,self.client_size.height)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -98,7 +101,7 @@ w.on_update = function(self)
|
||||||
-- set identity on model matrix
|
-- set identity on model matrix
|
||||||
mm:set_identity()
|
mm:set_identity()
|
||||||
-- set view matrix with look_at
|
-- 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
|
-- compute aspect ratio from canvas size
|
||||||
aspect_ratio = self.client_size.width / self.client_size.height
|
aspect_ratio = self.client_size.width / self.client_size.height
|
||||||
|
@ -150,15 +153,17 @@ while w:update() do
|
||||||
|
|
||||||
-- camera
|
-- camera
|
||||||
if pw.input.get().input_string == 'w' then
|
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
|
elseif pw.input.get().input_string == 's' then
|
||||||
cam_z = cam_z + move_step
|
cam_pos.z = cam_pos.z + move_step
|
||||||
print(cam_z)
|
|
||||||
elseif pw.input.get().input_string == 'a' then
|
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
|
elseif pw.input.get().input_string == 'd' then
|
||||||
cam_x = cam_x + move_step
|
cam_pos.x = cam_pos.x + move_step
|
||||||
end
|
end
|
||||||
|
|
||||||
|
print(cam_pos.x,cam_pos.y,cam_pos.z)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- just to check
|
-- just to check
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue