From 7479bfd6256220a7accbc44aff24e8ff14f7e1bd Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Tue, 4 Jan 2022 23:09:32 +0100 Subject: [PATCH] Major update to revamp development --- src/binding/src/script_core.cpp | 13 ++++++++ src/binding/src/script_visual.cpp | 4 ++- src/core/include/pw/core/color.hpp | 11 +++++-- src/core/include/pw/core/geometry.hpp | 4 +++ src/runtime/CMakeLists.txt | 14 ++++---- src/runtime/pixwerx.cpp | 13 ++------ src/scripts/demos/simple_003.lua | 39 ++++++++++++++++++----- src/visual/CMakeLists.txt | 8 ++--- src/visual/include/pw/visual/context.hpp | 6 ++-- src/visual/include/pw/visual/renderer.hpp | 8 +++-- src/visual/src/context.cpp | 22 +++++++++++++ src/visual/src/renderer.cpp | 36 +++++++++++++++++---- 12 files changed, 133 insertions(+), 45 deletions(-) diff --git a/src/binding/src/script_core.cpp b/src/binding/src/script_core.cpp index ae8d5f9..d1a2c63 100644 --- a/src/binding/src/script_core.cpp +++ b/src/binding/src/script_core.cpp @@ -9,6 +9,7 @@ #include "pw/core/image.hpp" #include "pw/core/matrix_transform.hpp" #include "pw/core/rectangle.hpp" +#include "pw/core/color.hpp" #include "runtime_lua.hpp" @@ -49,6 +50,17 @@ void register_core_function(sol::state& lua,sol::table& ns) ns.set("pi",pw::pi()); + + ns.new_usertype("color", + sol::call_constructor,sol::constructors(), + "rgba",&color::rgba, + "data",sol::property([](color& c) { return std::ref(c.rgba.data);} ), + "table",sol::property([](const color& c){ return sol::as_table(std::array{c.rgba.x(),c.rgba.y(),c.rgba.z(),c.rgba.w()}); }, + [](color& c,const sol::table& t) { c = color((real_t)t[0],t[1],t[2],t[3]);}) + + ); + + ns.new_usertype("matrix4x4", sol::call_constructor,sol::constructors(), "row",&matrix4x4::row, @@ -170,6 +182,7 @@ void register_core_function(sol::state& lua,sol::table& ns) sol::call_constructor,sol::constructors(), "primitive_topology", sol::property(&geometry::primitive_topology,&geometry::set_primitive_topology), "compute_normals", &geometry::compute_normals, + "change_count",sol::property(&geometry::change_count,&geometry::set_change_count), "indices",sol::property( [](const geometry& g){ return sol::as_table(g.indices());}, [](geometry& g,sol::table t){ std::vector vals; diff --git a/src/binding/src/script_visual.cpp b/src/binding/src/script_visual.cpp index ddff54d..2ee87a1 100644 --- a/src/binding/src/script_visual.cpp +++ b/src/binding/src/script_visual.cpp @@ -55,8 +55,9 @@ void register_visual_function(sol::state& lua,sol::table &ns) ns.new_usertype("renderer" ,sol::call_constructor,sol::constructors() - ,"create",&renderer::create + ,"update",&renderer::update ,"ready",sol::readonly_property(&renderer::ready) + ,"change_count",sol::readonly_property(&renderer::change_count) ,"release",&renderer::release ,"draw",&renderer::draw ); @@ -80,6 +81,7 @@ void register_visual_function(sol::state& lua,sol::table &ns) ns.new_usertype("context" ,sol::call_constructor,sol::constructors() ,"clear",&context::clear + ,"clearcolor",sol::property(&context::clearcolor,&context::set_clearcolor) ,"set_viewport",&context::set_viewport ,"get_error",&context::get_error ); diff --git a/src/core/include/pw/core/color.hpp b/src/core/include/pw/core/color.hpp index ec1010a..fd2837b 100644 --- a/src/core/include/pw/core/color.hpp +++ b/src/core/include/pw/core/color.hpp @@ -29,7 +29,10 @@ namespace pw { struct color { - vector4 components; + + vector4 rgba {0, 0, 0, 1}; + + color() = default; color(uint8_t r8,uint8_t g8,uint8_t b8,uint8_t a8) : color(static_cast(r8 / std::numeric_limits::max()), @@ -40,10 +43,14 @@ struct color { } color(real_t r,real_t g,real_t b,real_t a) - : components({r,g,b,a}) + : rgba({r,g,b,a}) { } + color(const vector4& v) : rgba(v) { } + + operator vector4() const { return rgba; } + uint32_t to_rgb8888() const { return 0; } diff --git a/src/core/include/pw/core/geometry.hpp b/src/core/include/pw/core/geometry.hpp index 35e7af3..e3edf50 100644 --- a/src/core/include/pw/core/geometry.hpp +++ b/src/core/include/pw/core/geometry.hpp @@ -82,6 +82,10 @@ public: aabb bounds() const; + uint64_t change_count() const { return _change_count; } + void set_change_count(uint64_t n) { _change_count = n; } + + protected: primitive_topology_type _primitive_topology = primitive_topology_type::point_list; diff --git a/src/runtime/CMakeLists.txt b/src/runtime/CMakeLists.txt index c7f69c0..44026b9 100644 --- a/src/runtime/CMakeLists.txt +++ b/src/runtime/CMakeLists.txt @@ -2,8 +2,8 @@ set(scripts_demo ${CMAKE_SOURCE_DIR}/src/scripts/demos/simple_000.lua ${CMAKE_SOURCE_DIR}/src/scripts/demos/simple_001.lua - ${CMAKE_SOURCE_DIR}/src/scripts/demos/simple_002.lua - ${CMAKE_SOURCE_DIR}/src/scripts/demos/simple_003.lua + ${CMAKE_SOURCE_DIR}/src/scripts/demos/simple_002.lua + ${CMAKE_SOURCE_DIR}/src/scripts/demos/simple_003.lua ) set(scripts_test @@ -26,8 +26,8 @@ target_include_directories(pixwerx ${CMAKE_SOURCE_DIR}/src/scripting/include ) - target_link_libraries(pixwerx - pwbinding - # -Wl,--whole-archive -lpwscripting -Wl,--no-whole-archive - pwcore - pwsystem) +target_link_libraries(pixwerx + pwbinding + pwcore + pwsystem + ) diff --git a/src/runtime/pixwerx.cpp b/src/runtime/pixwerx.cpp index 504785c..8e6b2c5 100644 --- a/src/runtime/pixwerx.cpp +++ b/src/runtime/pixwerx.cpp @@ -15,19 +15,12 @@ #include #include - -//PW_RUNTIME_LUA_USE(core) - - int main(int argc,const char** argv) { argagg::parser argparser {{ - { "help", {"-h", "--help"}, - "shows this help message", 0}, - { "file", {"-f", "--file"}, - "load file to run", 1} - } - }; + { "help", {"-h", "--help"}, "shows this help message", 0}, + { "file", {"-f", "--file"}, "load file to run", 1} + }}; argagg::parser_results args; diff --git a/src/scripts/demos/simple_003.lua b/src/scripts/demos/simple_003.lua index 5dd7573..f300529 100644 --- a/src/scripts/demos/simple_003.lua +++ b/src/scripts/demos/simple_003.lua @@ -122,21 +122,26 @@ end -- the renderer for a geometry local renderer = pw.renderer() -if not renderer:create(g) then - print("couldn't create renderer") -end - -- camera position local cam_pos = pw.vector3(0,0,0) +-- model position local model_pos = pw.vector3(0,0,0) +-- create new context (should move into a scene later) local ctx = pw.context() +-- create a texture local tx = pw.texture() + +-- create texture from an image tx:create(img) +-- show how to unload it here + + +-- set function to w.on_resize = function(self) -- use client_size to resize the viewport ctx:set_viewport(pw.rectangle(pw.point(0,0),self.client_size:cast_to_float())) @@ -146,6 +151,9 @@ end -- setup a lua callback function as callback w.on_update = function(self) + ctx.clearcolor = pw.color(pw.mathf.ping_pong(pw.time.now,1.0),0,1,1) + ctx:clear() + -- set view matrix with look_at - view matrix is moving the world - hence inverse! mv = pw.matrixtransform.look_at(cam_pos,cam_pos + pw.vector3.forward,pw.vector3.up).inverse @@ -153,7 +161,11 @@ w.on_update = function(self) aspect_ratio = self.client_size.width / self.client_size.height -- create a view frustum for a perspective projection - mp = pw.matrixtransform.perspective_projection(1.3,aspect_ratio,0.2,100) + mp = pw.matrixtransform.perspective_projection(math.rad(45),aspect_ratio,0.2,100) + + -- + -- this code is raw rendering mode + -- -- just some toying around local color_red = pw.mathf.ping_pong(pw.time.now,1.0) @@ -173,12 +185,16 @@ w.on_update = function(self) s:set_uniform_mat4("projection",mp) s:set_uniform_vec4("color",cl) + -- specific to our shader s:set_uniform_int("tex_color",0) tx:bind() + -- update renderer from geometry + renderer:update(g) + -- draw - renderer:draw() + renderer:draw() local e = ctx:get_error() if e ~= 0 then @@ -190,12 +206,16 @@ end -- before entering the update loop make the window visible w.visible = true +-- some fluffyness +local speed = 0 + -- main update loop while w:update() do -- only check if get a new input if pw.input.get().has_input then + -- somehow works if pw.input.get().input_string == 'f' then w.fullscreen = not w.fullscreen @@ -207,7 +227,8 @@ while w:update() do end -- just to quickly modify speed - local move_step = 0.05 + local move_step = 0.05 + -- camera if pw.input.get().input_string == 'w' then @@ -222,7 +243,9 @@ while w:update() do cam_pos.y = cam_pos.y + move_step elseif pw.input.get().input_string == 'x' then cam_pos.y = cam_pos.y - move_step - end + end + + -- just some debugging print(cam_pos.x,cam_pos.y,cam_pos.z) diff --git a/src/visual/CMakeLists.txt b/src/visual/CMakeLists.txt index 1294b8f..12eb6e2 100644 --- a/src/visual/CMakeLists.txt +++ b/src/visual/CMakeLists.txt @@ -3,7 +3,7 @@ set(hdrs include/pw/visual/context.hpp include/pw/visual/framebuffer.hpp include/pw/visual/shader.hpp - include/pw/visual/pipeline.hpp +# include/pw/visual/pipeline.hpp include/pw/visual/texture.hpp include/pw/visual/renderer.hpp ) @@ -13,8 +13,8 @@ set(srcs src/framebuffer.cpp src/shader.cpp src/pass.cpp - src/pipeline.cpp - src/target.cpp +# src/pipeline.cpp +# src/target.cpp src/texture.cpp src/renderer.cpp ) @@ -39,5 +39,3 @@ target_include_directories( ) target_link_libraries(pwvisual pwscene glad) - -#add_subdirectory(tests) diff --git a/src/visual/include/pw/visual/context.hpp b/src/visual/include/pw/visual/context.hpp index 245eec8..2c175ae 100644 --- a/src/visual/include/pw/visual/context.hpp +++ b/src/visual/include/pw/visual/context.hpp @@ -28,6 +28,7 @@ #include #include #include +#include namespace pw { @@ -47,11 +48,12 @@ public: size viewport_size() const; point viewport_origin() const; - void set_clearcolor(vector4f const& c); + void set_clearcolor(const color &c); + color clearcolor() const; void clear(); - u_int32_t get_error() const; + uint32_t get_error() const; protected: struct impl; diff --git a/src/visual/include/pw/visual/renderer.hpp b/src/visual/include/pw/visual/renderer.hpp index f7a8d13..8b0d2eb 100644 --- a/src/visual/include/pw/visual/renderer.hpp +++ b/src/visual/include/pw/visual/renderer.hpp @@ -1,8 +1,7 @@ #ifndef PW_VISUAL_MESH_RENDERER_HPP #define PW_VISUAL_MESH_RENDERER_HPP -#include - +#include #include namespace pw { @@ -14,17 +13,20 @@ class geometry; */ class renderer { public: + renderer(); renderer(const geometry& m); ~renderer(); - bool create(const geometry &m); + bool update(const geometry &m); void release(); void draw(); bool ready() const; + uint64_t change_count() const; + void set_change_count(uint64_t n); protected: struct impl; diff --git a/src/visual/src/context.cpp b/src/visual/src/context.cpp index 75e2f4a..49cff8b 100644 --- a/src/visual/src/context.cpp +++ b/src/visual/src/context.cpp @@ -1,4 +1,5 @@ #include "pw/visual/context.hpp" +#include "pw/core/vector.hpp" #include "glad/glad.h" @@ -7,6 +8,8 @@ namespace pw { struct context::impl { + vector4f _clear_color { 0, 1, 0, 1}; + void set_viewport(const rectangle& v) { glViewport(v.position.x,v.position.y,v.size.width,v.size.height); @@ -21,9 +24,17 @@ struct context::impl { void clear() { + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CCW); + + glClearColor(_clear_color[0],_clear_color[1],_clear_color[2],_clear_color[3]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } + + uint32_t get_error() const { return glGetError(); @@ -65,6 +76,17 @@ u_int32_t context::get_error() const return _impl->get_error(); } +color context::clearcolor() const +{ + return _impl->_clear_color; +} + +void context::set_clearcolor(const color& c) +{ + _impl->_clear_color = c; +} + + } diff --git a/src/visual/src/renderer.cpp b/src/visual/src/renderer.cpp index 56bd06c..3f66fac 100644 --- a/src/visual/src/renderer.cpp +++ b/src/visual/src/renderer.cpp @@ -3,6 +3,7 @@ #include "pw/core/geometry.hpp" #include "pw/core/size.hpp" #include "pw/core/debug.hpp" +#include "pw/core/matrix.hpp" #include "glad/glad.h" @@ -13,10 +14,13 @@ namespace pw { struct renderer::impl { + uint64_t _change_count { 0 }; + uint32_t _vao { 0 }; uint32_t _ebo { 0 }; std::vector _vbos { }; + GLint _mesh_elements = { 0 }; impl() = default; @@ -31,12 +35,14 @@ struct renderer::impl { return glIsVertexArray != nullptr && GL_TRUE == glIsVertexArray(_vao); } - bool create(const geometry& m) + bool update(const geometry& m) { + if (_change_count == m.change_count()) + return false; + // reset if the renderer already in use - if (ready()) { + if (ready()) release(); - } _mesh_elements = m.indices().size(); @@ -115,6 +121,9 @@ struct renderer::impl { glBindVertexArray(0); + this->_change_count = m.change_count(); + + #if 0 // get errors auto error = glGetError(); @@ -141,7 +150,8 @@ struct renderer::impl { void draw() { -#if 1 + // following code has no business being here ;) +#if 0 glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CCW); @@ -181,7 +191,8 @@ renderer::renderer() renderer::renderer(const geometry &m) { renderer(); - _impl->create(m); + // directly update + _impl->update(m); } renderer::~renderer() @@ -193,9 +204,9 @@ bool renderer::ready() const return _impl->ready(); } -bool renderer::create(const geometry &m) +bool renderer::update(const geometry &m) { - return _impl->create(m); + return _impl->update(m); } void renderer::release() @@ -208,6 +219,17 @@ void renderer::draw() _impl->draw(); } +uint64_t renderer::change_count() const +{ + return _impl->_change_count; +} + +void renderer::set_change_count(uint64_t n) +{ + _impl->_change_count = n; +} + + //class viewport {