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"
|
||||
, 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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue