From 40b84fb78fe0c4eb94e2425637e4b1ede8965782 Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Tue, 12 Feb 2019 21:28:20 +0100 Subject: [PATCH] plenty of additions to rendering. transformation now work almost as expected ... --- share/doc/pixwerx.xmind | Bin 133033 -> 168910 bytes src/core/include/pw/core/math.hpp | 15 +++ src/core/include/pw/core/transform_tools.hpp | 99 +++++++---------- src/io/src/image_io.cpp | 3 + src/scene/include/pw/scene/camera.hpp | 2 +- src/scene/include/pw/scene/component.hpp | 11 +- src/scene/include/pw/scene/node.hpp | 32 +++--- src/scene/include/pw/scene/transform.hpp | 55 ++++++---- src/scene/src/camera.cpp | 19 +++- src/scene/src/component.cpp | 5 +- src/scene/src/node.cpp | 40 +++---- src/scene/src/transform.cpp | 28 ++--- src/scene/tests/pwscene_test_node.cpp | 55 ++++++---- src/scene/tests/pwscene_test_traverser.cpp | 2 +- src/scripting/src/script_scene.cpp | 1 + src/visual/include/pw/visual/shader.hpp | 12 +- src/visual/src/pipeline.cpp | 110 +++++++------------ src/visual/src/shader.cpp | 4 +- 18 files changed, 242 insertions(+), 251 deletions(-) diff --git a/share/doc/pixwerx.xmind b/share/doc/pixwerx.xmind index 5c96f0fd8640e794d3c2264ac5ec9106aecdb9cf..f6648d5460aea6fcc8565bbd7cb81bfb83aec446 100644 GIT binary patch delta 58994 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 YV7R8XA25j^%<%6%1vqnez_E<{57&xXo&W#< diff --git a/src/core/include/pw/core/math.hpp b/src/core/include/pw/core/math.hpp index 750c1da..b8fc16e 100644 --- a/src/core/include/pw/core/math.hpp +++ b/src/core/include/pw/core/math.hpp @@ -24,6 +24,7 @@ #define PW_CORE_MATH_HPP #include +#include namespace pw { @@ -45,6 +46,20 @@ inline T deg_to_rad(const T& angle_in_degree) { return angle_in_degree * __DEG2RAD; } +template +static inline +T repeat(const T& t, const T& length) { + return std::clamp(t - std::floor(t / length) * length, T(0), length); +} + +template +static inline +T ping_pong(const T& t,const T& length) { + auto tn = repeat(t, length * T(2)); + return length - std::abs(tn - length); +} + + } #endif diff --git a/src/core/include/pw/core/transform_tools.hpp b/src/core/include/pw/core/transform_tools.hpp index 0941774..999469c 100644 --- a/src/core/include/pw/core/transform_tools.hpp +++ b/src/core/include/pw/core/transform_tools.hpp @@ -39,23 +39,42 @@ struct transform_tools { } inline static - matrix_<4,4,T> projection_from_frustum(T left,T right,T bottom,T top,T z_near,T z_far) + matrix_<4,4,T> projection_from_frustum(const T &left,const T &right, + const T &bottom,const T &top, + const T &z_near,const T &z_far) { matrix_<4,4,T> frustum; frustum.zero(); - frustum(0,0) = T(2) * z_near / (right - left); - frustum(1,1) = T(2) * z_near / (top - bottom); + frustum(0,0) = T(2) * z_near / (right - left); + frustum(1,1) = T(2) * z_near / (top - bottom); - frustum(2,0) = (right+left)/(right-left); //A - frustum(2,1) = (top+bottom)/(top-bottom); //B - frustum(2,2) = - (z_far+z_near)/(z_far-z_near); //C - frustum(2,3) = -(T(2) * z_far*z_near)/(z_far-z_near); //D + frustum(0,2) = (right+left)/(right-left); //A + frustum(1,2) = (top+bottom)/(top-bottom); //B + frustum(2,2) = -(z_far+z_near)/(z_far-z_near); //C + frustum(2,3) = -T(2) * z_far*z_near/(z_far-z_near); //D - frustum(3,2) = -T(1); + frustum(3,2) = -T(1); return frustum; } + inline static + matrix_<4,4,T> perspective_projection(const T &field_of_view, + const T &aspect_ratio, + const T &z_near,const T &z_far) + { + const T tan_half = tan(field_of_view / T(2)); + const T right = aspect_ratio * tan_half * z_near; + const T left = -right; + const T top = aspect_ratio * tan_half; + const T bottom = -top; + + return projection_from_frustum(left,right, + bottom,top, + z_near,z_far); + } + + inline static matrix_<4,4,T> orthogonal_projection(T left, T right, T bottom,T top, @@ -78,63 +97,25 @@ struct transform_tools { return ortho; } - inline static - matrix_<4,4,T> perspective_projection(T fov_y, T aspect_ratio, T z_near, T z_far) - { - const T height = z_near * tan(fov_y/T(360) * pi()); // half height of near plane - const T width = height * aspect_ratio; // half width of near plane - return projection_from_frustum(-width, width, -height, height, z_near, z_far ); - } - - inline static - matrix_<4,4,T> look_at( - const vector3_ &eye, - const vector3_ &target, - const vector3_ &up) - { + inline static + matrix_<4,4,T> look_at(const vector3_ &position, + const vector3_ &target, + const vector3_ &up) + { matrix_<4,4,T> view_matrix; view_matrix.set_identity(); - const vector3_ L = (target - eye).normalized(); // line of sight - const vector3_ S = L.cross(up).normalized(); - const vector3_ Ud = S.cross(L).normalized(); + const vector3_ los = (target - position).normalized(); // line of sight + const vector3_ sid = los.cross(up).normalized(); + const vector3_ upd = sid.cross(los).normalized(); // set base vectors - view_matrix.set_slice(S, 0,0); - view_matrix.set_slice(Ud, 0,1); - view_matrix.set_slice(L*T(-1), 0,2); - view_matrix.set_slice(eye, 0,3); - - return view_matrix; - - - // matrix<3,1,T> S = matrix31::Cross(L,up); - // S.normalize(); - // matrix<3,1,T> Ud = matrix31::Cross(S,L); - // Ud.normalize(); - - // lookat(0,0) = S.at(0); - // lookat(0,1) = S.at(1); - // lookat(0,2) = S.at(2); - // lookat(0,3) = T(0); - - // lookat(1,0) = Ud.at(0); - // lookat(1,1) = Ud.at(1); - // lookat(1,2) = Ud.at(2); - // lookat(1,3) = T(0); - - // lookat(2,0) = -L.at(0); - // lookat(2,1) = -L.at(1); - // lookat(2,2) = -L.at(2); - // lookat(3,2) = T(0); - - // lookat(3,0) = eye.at(0); - // lookat(3,1) = eye.at(1); - // lookat(3,2) = eye.at(2); - // lookat(3,3) = 1; - - // return lookat; + view_matrix.set_slice(sid, 0, 0); + view_matrix.set_slice(upd, 0, 1); + view_matrix.set_slice(los * T(-1), 0, 2); + view_matrix.set_slice(position, 0, 3); + return view_matrix; } }; diff --git a/src/io/src/image_io.cpp b/src/io/src/image_io.cpp index 6ae8e1e..f659ab7 100644 --- a/src/io/src/image_io.cpp +++ b/src/io/src/image_io.cpp @@ -24,6 +24,9 @@ struct image_io::impl image r; r.create(sizei(x,y),image::pixel_layout::RGBA8,data); + + stbi_image_free(data); + return r; } diff --git a/src/scene/include/pw/scene/camera.hpp b/src/scene/include/pw/scene/camera.hpp index a8bd0c7..713aaad 100644 --- a/src/scene/include/pw/scene/camera.hpp +++ b/src/scene/include/pw/scene/camera.hpp @@ -47,7 +47,7 @@ public: using component::component; - camera(); + camera(node &host); void set_projection(const matrix4x4 &projection); const matrix4x4& projection() const; diff --git a/src/scene/include/pw/scene/component.hpp b/src/scene/include/pw/scene/component.hpp index 1be7791..4edb95f 100644 --- a/src/scene/include/pw/scene/component.hpp +++ b/src/scene/include/pw/scene/component.hpp @@ -42,11 +42,9 @@ class component { public: friend class node; + typedef std::vector array; - typedef std::shared_ptr ref; - typedef std::vector array; - - component(); + component(node &host); component(const component& other); virtual ~component(); @@ -56,15 +54,14 @@ public: uint32_t weight() const; void set_weight(const uint32_t &weight); - template inline T* cast() { return static_cast(this);} protected: - uint32_t _weight = 0; + uint32_t _weight = 1; - node* _node; + node &_node; bool _enabled; }; diff --git a/src/scene/include/pw/scene/node.hpp b/src/scene/include/pw/scene/node.hpp index d4a853b..4b96895 100644 --- a/src/scene/include/pw/scene/node.hpp +++ b/src/scene/include/pw/scene/node.hpp @@ -42,6 +42,8 @@ namespace pw { class node { public: + friend class component; + typedef shared_ptr ref; typedef std::vector ref_array; @@ -66,8 +68,8 @@ public: //! return parent of this node inline ptr parent() const { return _path.back(); } - //! add a child node - ref add_child(); + //! add a child node + void add_child(ref child_node); //! remove a child void remove_child(ref child_node); @@ -85,29 +87,25 @@ public: inline bool is_root() const { return _path.empty(); } //! list of components - const component::array& components() const; + const component::array& components() const; //! add a node component - void add_component(component::ref new_component); + void add_component(component new_component); + + template + void add_component_() { + _components.push_back(T(*this)); + } //! remove a node component - void remove_component(component::ref c); + void remove_component(component c); //! paths to root const ptr_array& path() const; void traversal(); - template - T* find_component() - { - for (auto c : _components) { - T* r = static_cast(c.get()); - if (r != nullptr) return r; - } - return nullptr; - } - + // not sure about this const class transform& transform() const { return _transform; } class transform& transform() { return _transform; } @@ -116,10 +114,10 @@ protected: ref_array _children; //!< list of children ptr_array _path; //!< path to root - component::array _components; // #include -#include - namespace pw { -class transform : public component { +class node; + +class transform { public: - using component::component; - - transform(); + transform(node &host); inline const matrix4x4& local() const { return _local; } void set_local(const matrix4x4 &local); @@ -22,42 +20,59 @@ public: inline const matrix4x4& global() const { return _global; } void set_global(const matrix4x4 &global); - inline void translate(const real_t &x, const real_t &y, const real_t &z) { + inline const matrix4x4& global_inverse() const { return _global_inverse; } + + inline transform& translate(const real_t &x, const real_t &y, const real_t &z) { _local(0,3) += x;_local(1,3) += y;_local(2,3) += z; update_global_from_local(); + return *this; } - inline void rotate(const quaternion& q) { + inline transform& set_translation(const real_t &x, const real_t &y, const real_t &z) { + _local(0,3) = x;_local(1,3) = y;_local(2,3) = z; + update_global_from_local(); + return *this; + } + + inline transform& rotate(const quaternion& q) { _local = _local * q.to_matrix(); update_global_from_local(); + return *this; } - inline void scale(const real_t &x, const real_t &y, const real_t &z) { - _local(0,0) *= x; _local(1,1) *= y; _local(2,2) *= z; + inline transform& set_rotation(const quaternion& q) { + _local = q.to_matrix(); update_global_from_local(); + return *this; } - inline void scale(const real_t& uniform_scale) { - scale(uniform_scale,uniform_scale,uniform_scale); - } - - inline void set_translation(const real_t &x, const real_t &y, const real_t &z) { - _local(0,3) = x;_local(1,3) = y;_local(2,3) = z; + inline transform& scale(const real_t &sx, const real_t &sy, const real_t &sz) { + _local(0,0) *= sx; _local(1,1) *= sy; _local(2,2) *= sz; update_global_from_local(); + return *this; } + inline transform& set_scale(const real_t &sx, const real_t &sy, const real_t &sz) { + _local(0,0) = sx; _local(1,1) = sy; _local(2,2) = sz; + update_global_from_local(); + return *this; + } - - - void update(node &node); + inline transform& scale(const real_t& uniform_scale) { + return scale(uniform_scale,uniform_scale,uniform_scale); + } protected: matrix4x4 _local; matrix4x4 _global; + matrix4x4 _global_inverse; + private: + node &_node; + //! updates the global transform from parent globals and local transform void update_global_from_local(); @@ -65,8 +80,6 @@ private: void update_local_from_global(); }; - - } #endif diff --git a/src/scene/src/camera.cpp b/src/scene/src/camera.cpp index b1325da..112584d 100644 --- a/src/scene/src/camera.cpp +++ b/src/scene/src/camera.cpp @@ -3,8 +3,9 @@ namespace pw { -camera::camera() - : _fov(60.0) +camera::camera(node &host) + : component (host) + , _fov(60.0) , _near_plane(0.2f) , _far_plane(1000) { @@ -16,6 +17,20 @@ void camera::set_projection(const matrix4x4 &projection) this->_projection = projection; // recompute the simplified parameters + + auto near = _projection(3,4); + auto far = _projection(3,4); + +// right = (1-m14) / m11 + +// near = (1+m34)/m33; +// far = -(1-m34)/m33; +// bottom = (1-m24)/m22; +// top = -(1+m24)/m22; +// left = -(1+m14)/m11; +// right = (1-m14)/m11; + +// real_t fov_raw = float( atan (top / near_)) * * 2.0f; } const matrix4x4 &camera::projection() const diff --git a/src/scene/src/component.cpp b/src/scene/src/component.cpp index ab711d8..83dad27 100644 --- a/src/scene/src/component.cpp +++ b/src/scene/src/component.cpp @@ -11,8 +11,8 @@ namespace pw { -component::component() - : _node(nullptr) +component::component(node &host) + : _node(host) { } @@ -23,7 +23,6 @@ component::component(const component &other) component::~component() { -// if (_node != nullptr) _node->unregister_component(this); } bool component::enabled() const diff --git a/src/scene/src/node.cpp b/src/scene/src/node.cpp index 428459d..bfe57b1 100644 --- a/src/scene/src/node.cpp +++ b/src/scene/src/node.cpp @@ -1,11 +1,12 @@ #include "pw/scene/transform.hpp" #include "pw/scene/node.hpp" -#include +#include "pw/core/debug.hpp" namespace pw { node::node() + : _transform(*this) { } @@ -13,7 +14,9 @@ node::node(const node &node) : _children(node.children()) , _components(node.components()) , _name(node._name) + , _transform(*this) { +// _components.push_back(std::make_unique(*this)); } node::ref node::clone(const unsigned short ©mode) const @@ -31,22 +34,16 @@ void node::set_name(const std::string &name) _name = name; } -node::ref node::add_child() +void node::add_child(node::ref c) { - // create new node - node::ref new_node = std::make_shared(); - // take parent nodepath ... - if (!this->is_root()) new_node->_path = this->_path; + c->_path = this->_path; - // add itself - new_node->_path.push_back(this); + // add current node + c->_path.push_back(this); // add as child - _children.push_back(new_node); - - // return - return new_node; + _children.push_back(c); } void node::remove_child(ref child_node) @@ -72,28 +69,22 @@ node::~node() // // components // -void node::add_component(component::ref new_component) +void node::add_component(component new_component) { // assumption is that only transform is a "singular" node _components.push_back(new_component); } -void node::remove_component(component::ref c) +void node::remove_component(component c) { // component::array::iterator it = _components.end(); - for (component::array::iterator it = _components.begin(); + for (component::array::iterator it = _components.begin(); it != _components.end(); it++) { - if (*it == c) it = _components.erase(it); +// if (*it == c) it = _components.erase(it); } - - -// while ((it = std::find(_components.begin(),_components.end(),c)) != _components.end()) { -// (*it)->_node = nullptr; -// _components.erase(it); -// } } const node::ptr_array &node::path() const @@ -103,10 +94,11 @@ const node::ptr_array &node::path() const void node::traversal() { -// for (auto c : _components) c->visit(this); + } -const component::array& node::components() const + +const component::array &node::components() const { return _components; } diff --git a/src/scene/src/transform.cpp b/src/scene/src/transform.cpp index 6f35881..a0d6948 100644 --- a/src/scene/src/transform.cpp +++ b/src/scene/src/transform.cpp @@ -3,46 +3,48 @@ namespace pw { -transform::transform() +transform::transform(node &host) + : _node(host) { _local.set_identity(); _global.set_identity(); + _global_inverse.set_identity(); } void transform::set_local(const matrix4x4 &local) { - // TODO need to rebuild the transforms: both -> global down and global up - _local = local; - + _local = local; + update_global_from_local(); + // TODO need to rebuild the transforms: both -> global down and global up } void transform::set_global(const matrix4x4 &global) { //TODO need to rebuild **_local** from parent _global = global; -} + _global_inverse = global.inverse(); - -void transform::update(node& node) -{ + update_local_from_global(); + // TODO need to rebuild the transforms: both -> global down and global up } void transform::update_global_from_local() { // update the global transform - if (_node && _node->parent()) - { - this->_global = _node->transform()._global * _local; + if (_node.is_root()) { + this->_global = _local; } else { - this->_global = _local; + this->_global = _node.parent()->transform().global() * _local; } + _global_inverse = _global.inverse(); } void transform::update_local_from_global() { + _local = (_node.is_root()) ? _global : + _node.parent()->transform().global_inverse() * _global; -// _local = this->global() } } diff --git a/src/scene/tests/pwscene_test_node.cpp b/src/scene/tests/pwscene_test_node.cpp index a3e247f..eda12bd 100644 --- a/src/scene/tests/pwscene_test_node.cpp +++ b/src/scene/tests/pwscene_test_node.cpp @@ -22,45 +22,52 @@ void print_node_path(pw::node::ref node) { int main(int argc,char **argv) { - using namespace pw; + using namespace pw; - node::ref n = std::make_shared(); - n->set_name("root"); + auto n = std::make_shared(); + n->set_name("root-node"); - // check - { - n->add_child()->set_name("node"); - } - std::cout << "n name: " << n->name() << std::endl; - std::cout << "n leaf: " << n->is_leaf() << std::endl; - std::cout << "n root: " << n->is_root() << std::endl; + // add a child + auto c = std::make_shared(); + c->set_name("child-node"); + n->add_child(c); + + std::cout << "n name: " << n->name() << std::endl; + std::cout << "n leaf: " << n->is_leaf() << std::endl; + std::cout << "n root: " << n->is_root() << std::endl; std::cout << "s name: " << n->children().front()->name() << std::endl; - std::cout << "s leaf: " << n->children()[0]->is_leaf() << std::endl; - std::cout << "s root: " << n->children()[0]->is_root() << std::endl; + std::cout << "s leaf: " << n->children().front()->is_leaf() << std::endl; + std::cout << "s root: " << n->children().front()->is_root() << std::endl; - // thats the only and most ugly way to register a component -// new component(n.get()); + // thats the only and most ugly way to register a component + // new component(n.get()); - n->add_component(std::make_shared()); - std::cout << "n components: " << n->components().size() << std::endl; + std::cout << "n components: " << n->components().size() << std::endl; + n->transform().set_translation(5,4,3); + + std::cout << "c transform g " << serialize::matrix(n->transform().global()) << std::endl; + std::cout << "c transform gi " << serialize::matrix(n->transform().global_inverse()) << std::endl; + std::cout << "c transform l " << serialize::matrix(n->transform().local()) << std::endl; + + + //n->add_component_(); print_node_path((n)); -// auto t = n->transform(); + // auto t = n->transform(); -// if (t) - std::cout << n->transform().local()(0,0) << std::endl; -// else { -// std::cerr << "no transform?" << std::endl; -// } + // if (t) +// std::cout << n->transform().local()(0,0) << std::endl; + // else { + // std::cerr << "no transform?" << std::endl; + // } - - return 0; + return 0; } diff --git a/src/scene/tests/pwscene_test_traverser.cpp b/src/scene/tests/pwscene_test_traverser.cpp index 6eb30f8..d742ba0 100644 --- a/src/scene/tests/pwscene_test_traverser.cpp +++ b/src/scene/tests/pwscene_test_traverser.cpp @@ -42,7 +42,7 @@ int main(int argc,char **argv) { node::ref root(std::make_shared()); root->set_name("root"); - root->add_child()->set_name("sub-1"); +// root->add_child()->set_name("sub-1"); // node::ref sub_2_1 = std::make_shared("sub-2-1"); diff --git a/src/scripting/src/script_scene.cpp b/src/scripting/src/script_scene.cpp index e49d4df..40f174a 100644 --- a/src/scripting/src/script_scene.cpp +++ b/src/scripting/src/script_scene.cpp @@ -12,6 +12,7 @@ void register_scene_function(sol::state&,sol::table &ns) sol::constructors(), "add_child",&node::add_child, "children",sol::readonly_property(&node::children), + "parent",sol::readonly_property(&node::parent), "child_count",sol::readonly_property(&node::child_count), "create", []() -> std::shared_ptr { return std::make_shared(); }, "is_leaf", sol::readonly_property(&node::is_leaf), diff --git a/src/visual/include/pw/visual/shader.hpp b/src/visual/include/pw/visual/shader.hpp index e522bc1..207834a 100644 --- a/src/visual/include/pw/visual/shader.hpp +++ b/src/visual/include/pw/visual/shader.hpp @@ -30,20 +30,20 @@ public: bool ready() const; - shader& bind(int location,float v); - shader& bind(int location,matrix4x4f const & v); - shader& bind(int location,vector4f const & v); + shader& set(int location,float v); + shader& set(int location,matrix4x4f const & v); + shader& set(int location,vector4f const & v); int uniform_location(std::string const & name) const; template - shader & bind(std::string const & name, T&& value) + shader & set(std::string const & name, T&& value) { int location = uniform_location(name); if (location >= 0) - return bind(location, std::forward(value)); + return set(location, std::forward(value)); else - debug::e() << "missing uniform: "<< name; + debug::e() << "missing uniform: '" << name << "'"; return *this; } diff --git a/src/visual/src/pipeline.cpp b/src/visual/src/pipeline.cpp index 4a2458a..3d6956c 100644 --- a/src/visual/src/pipeline.cpp +++ b/src/visual/src/pipeline.cpp @@ -3,6 +3,8 @@ #include "pw/core/mesh.hpp" #include "pw/core/timer.hpp" #include "pw/core/axisangle.hpp" +#include "pw/core/serialize.hpp" +#include "pw/core/transform_tools.hpp" #include "pw/core/debug.hpp" #include "pw/visual/pipeline.hpp" @@ -17,6 +19,8 @@ class command { }; + + class mesh_command : command { // shader @@ -46,10 +50,13 @@ struct triangle_renderer void setup() { + + const float z_val = -5.f; + mesh::vertex3array_t vertices = { - { 0.0f, 0.5f, 0.0f} // 0 - ,{ 0.5f, -0.5f, 0.0f} // 1 - ,{-0.5f, -0.5f, 0.0f} // 2 + { 0.0f, 0.5f, z_val} // 0 + ,{ 0.5f, -0.5f, z_val} // 1 + ,{-0.5f, -0.5f, z_val} // 2 }; // actual indices @@ -59,71 +66,17 @@ struct triangle_renderer amesh.set_vertices(vertices); amesh_renderer.create(amesh); -#if 0 - - - size_t vertex_size_bytes = amesh.vertices().size() * sizeof(mesh::vertex3array_t::value_type); - size_t vertex_stride = amesh.vertices().front().size(); - - debug::d() << 9 * sizeof(mesh::vertex3array_t::value_type::value_type) << " " - << vertex_size_bytes; - - - -// sizeof(mesh::vertex3array_t::value_type) -// 9 * sizeof(mesh::vertex3array_t::value_type::value_type) - - glGenBuffers(1, &vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - glBufferData(GL_ARRAY_BUFFER, vertex_size_bytes , amesh.vertices().data(), GL_STATIC_DRAW); - - glGenVertexArrays(1,&vao); - glBindVertexArray(vao); - - glEnableVertexAttribArray(0); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - glVertexAttribPointer(0, vertex_stride, GL_FLOAT, GL_FALSE, 0, nullptr); - - - - GLuint vs = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vs, 1, &vertex_shader, NULL); - glCompileShader(vs); - GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fs, 1, &fragment_shader, NULL); - glCompileShader(fs); - - shader_programme = glCreateProgram(); - glAttachShader(shader_programme, fs); - glAttachShader(shader_programme, vs); - glLinkProgram(shader_programme); -#endif - - const char* vertex_shader = R"( - #version 400 - in vec3 vp; - void main() { - gl_Position = vec4(vp, 1.0); - } - )"; - - const char *fragment_shader = R"( - #version 400 - uniform vec4 input_color = vec4(1.0, 0.0, 0.0, 1.0); - out vec4 frag_colour; - void main() { - frag_colour = input_color; - })"; - - const char* vertex_shader_2 = R"( #version 400 - uniform mat4 model_mat; - uniform mat4 view_mat = mat4 + uniform mat4 model; + uniform mat4 view; + uniform mat4 projection; + in vec3 vertex_p; + void main() { - gl_Position = model_mat * vec4(vertex_p, 1.0); + gl_Position = projection * view * model * vec4(vertex_p, 1.0); } )"; @@ -136,7 +89,7 @@ struct triangle_renderer })"; shader_p.set_source(vertex_shader_2,shader::vertex); - shader_p.set_source(fragment_shader,shader::fragment); + shader_p.set_source(fragment_shader_2,shader::fragment); if (!shader_p.build()) exit(-1); @@ -148,19 +101,34 @@ struct triangle_renderer shader_p.use(); - static float v = 0.0f; - v+= 0.01f; - if (v>1.0f) v = 0.0f; - vector4f test({0.5f,1-v,v,1.0f}); + auto v_col = ping_pong(static_cast(timer::now()),1.0f); + + vector4f col({0.5f,1-v_col,v_col,1.0f}); matrix4x4f model_mat; model_mat.set_identity(); - axisangle rot(vector3::right(),v); + auto v_angle = ping_pong(static_cast(timer::now()),::pw::pi()); + + axisangle rot(vector3::forward(),v_angle); model_mat = rot.to_matrix(); + + matrix4x4f view_mat = transform_tools::look_at(vector3({0,0,0}), + vector3::forward(), + vector3::up()); + + matrix4x4f proj_mat = transform_tools::perspective_projection(deg_to_rad(45.f), + 1.3f, + 0.2f,1000.f); + +// debug::d() << serialize::matrix(proj_mat); + + // highly inefficient - should be cached - - shader_p.bind("input_color",test); - shader_p.bind("model_mat",model_mat); + shader_p.set("input_color",col); + shader_p.set("model",model_mat); + shader_p.set("view",view_mat); + shader_p.set("projection",proj_mat); amesh_renderer.draw(); diff --git a/src/visual/src/shader.cpp b/src/visual/src/shader.cpp index 3c55f0a..a2f9ac0 100644 --- a/src/visual/src/shader.cpp +++ b/src/visual/src/shader.cpp @@ -180,12 +180,12 @@ bool shader::ready() const return _impl->is_valid(); } -shader &shader::bind(int location, const vector4f &v) +shader &shader::set(int location, const vector4f &v) { _impl->bind(location,v); return *this; } -shader &shader::bind(int location, const matrix4x4f &v) +shader &shader::set(int location, const matrix4x4f &v) { _impl->bind(location,v); return *this; }