From 0cf3b932d6cd7ae28242efcda4c7cc62e98d6ff2 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 25 Oct 2018 23:47:38 +0700 Subject: [PATCH] material and geometry ptr for draw_command --- headers/enduro2d/core/render.hpp | 34 +++++++---- headers/enduro2d/core/render.inl | 2 +- samples/sources/sample_00/sample_00.cpp | 10 ++-- samples/sources/sample_01/sample_01.cpp | 10 ++-- samples/sources/sample_02/sample_02.cpp | 10 ++-- sources/enduro2d/core/render.cpp | 56 +++++++++++++------ .../core/render_impl/render_opengl.cpp | 19 ++++--- .../core/render_impl/render_opengl_base.cpp | 4 +- 8 files changed, 92 insertions(+), 53 deletions(-) diff --git a/headers/enduro2d/core/render.hpp b/headers/enduro2d/core/render.hpp index 2fcedfc5..c4ab1888 100644 --- a/headers/enduro2d/core/render.hpp +++ b/headers/enduro2d/core/render.hpp @@ -665,8 +665,14 @@ namespace e2d u8 _pad[4] = {0}; }; + class material; + using material_ptr = std::shared_ptr; + class material final { public: + static material_ptr create(); + static material_ptr create(const material& mat); + material& add_pass(const pass_state& pass) noexcept; std::size_t pass_count() const noexcept; @@ -684,8 +690,14 @@ namespace e2d property_block properties_; }; + class geometry; + using geometry_ptr = std::shared_ptr; + class geometry final { public: + static geometry_ptr create(); + static geometry_ptr create(const geometry& geo); + geometry& add_vertices(const vertex_buffer_ptr& vb) noexcept; std::size_t vertices_count() const noexcept; @@ -722,21 +734,23 @@ namespace e2d class draw_command final { public: - draw_command() = delete; - draw_command(const material& mat, const geometry& geo) noexcept; - - draw_command& material_ref(const material& value) noexcept; - draw_command& geometry_ref(const geometry& value) noexcept; - - const material& material_ref() const noexcept; - const geometry& geometry_ref() const noexcept; + draw_command() = default; + draw_command(const material_ptr& mat, const geometry_ptr& geo) noexcept; + draw_command& material(const material_ptr& value) noexcept; + draw_command& geometry(const geometry_ptr& value) noexcept; draw_command& properties(const property_block& value); + + material_ptr& material() noexcept; + geometry_ptr& geometry() noexcept; property_block& properties() noexcept; + + const material_ptr& material() const noexcept; + const geometry_ptr& geometry() const noexcept; const property_block& properties() const noexcept; private: - const material* material_ = nullptr; - const geometry* geometry_ = nullptr; + material_ptr material_; + geometry_ptr geometry_; property_block properties_; }; diff --git a/headers/enduro2d/core/render.inl b/headers/enduro2d/core/render.inl index bbe834ea..1309c0ab 100644 --- a/headers/enduro2d/core/render.inl +++ b/headers/enduro2d/core/render.inl @@ -154,7 +154,7 @@ namespace e2d std::this_thread::get_id() == modules::main_thread()); - for ( std::size_t i = 0; i < commands.command_count(); ++i ) { + for ( std::size_t i = 0, e = commands.command_count(); i < e; ++i ) { execute(commands.command(i)); } return *this; diff --git a/samples/sources/sample_00/sample_00.cpp b/samples/sources/sample_00/sample_00.cpp index 74cb1030..10774b7b 100644 --- a/samples/sources/sample_00/sample_00.cpp +++ b/samples/sources/sample_00/sample_00.cpp @@ -144,7 +144,7 @@ int e2d_main() { return 1; } - auto material = render::material() + auto material = render::material::create(render::material() .add_pass(render::pass_state() .states(render::state_block() .capabilities(render::capabilities_state() @@ -161,12 +161,12 @@ int e2d_main() { .sampler("u_texture2", render::sampler_state() .texture(texture2) .min_filter(render::sampler_min_filter::linear) - .mag_filter(render::sampler_mag_filter::linear)))); + .mag_filter(render::sampler_mag_filter::linear))))); - auto geometry = render::geometry() + auto geometry = render::geometry::create(render::geometry() .indices(index_buffer) .add_vertices(vertex_buffer1) - .add_vertices(vertex_buffer2); + .add_vertices(vertex_buffer2)); const auto begin_game_time = time::now_ms(); const auto framebuffer_size = the().real_size().cast_to(); @@ -176,7 +176,7 @@ int e2d_main() { while ( !the().should_close() && !k.is_key_just_released(keyboard_key::escape) ) { const auto game_time = (time::now_ms() - begin_game_time).cast_to().value; - material.properties() + material->properties() .property("u_time", game_time) .property("u_MVP", projection); diff --git a/samples/sources/sample_01/sample_01.cpp b/samples/sources/sample_01/sample_01.cpp index 85067c62..2767bd99 100644 --- a/samples/sources/sample_01/sample_01.cpp +++ b/samples/sources/sample_01/sample_01.cpp @@ -202,7 +202,7 @@ int e2d_main() { return 1; } - auto material = render::material() + auto material = render::material::create(render::material() .add_pass(render::pass_state() .states(render::state_block() .capabilities(render::capabilities_state() @@ -216,12 +216,12 @@ int e2d_main() { .sampler("u_texture", render::sampler_state() .texture(texture) .min_filter(render::sampler_min_filter::linear) - .mag_filter(render::sampler_mag_filter::linear)))); + .mag_filter(render::sampler_mag_filter::linear))))); - auto geometry = render::geometry() + auto geometry = render::geometry::create(render::geometry() .indices(index_buffer) .add_vertices(vertex_buffer1) - .add_vertices(vertex_buffer2); + .add_vertices(vertex_buffer2)); const auto begin_game_time = time::now_ms(); const auto framebuffer_size = the().real_size().cast_to(); @@ -243,7 +243,7 @@ int e2d_main() { math::make_loot_at_lh_matrix4({0.f,0.f,-3.f}, v3f::zero(), v3f::unit_y()) * projection; - material.properties() + material->properties() .property("u_time", game_time) .property("u_MVP", MVP); diff --git a/samples/sources/sample_02/sample_02.cpp b/samples/sources/sample_02/sample_02.cpp index 7f3030eb..f2650291 100644 --- a/samples/sources/sample_02/sample_02.cpp +++ b/samples/sources/sample_02/sample_02.cpp @@ -151,7 +151,7 @@ int e2d_main() { return 1; } - auto material = render::material() + auto material = render::material::create(render::material() .add_pass(render::pass_state() .states(render::state_block() .capabilities(render::capabilities_state() @@ -169,11 +169,11 @@ int e2d_main() { .sampler("u_texture", render::sampler_state() .texture(texture) .min_filter(render::sampler_min_filter::linear) - .mag_filter(render::sampler_mag_filter::linear))); + .mag_filter(render::sampler_mag_filter::linear)))); - auto geometry = render::geometry() + auto geometry = render::geometry::create(render::geometry() .indices(index_buffer) - .add_vertices(vertex_buffer); + .add_vertices(vertex_buffer)); const auto begin_game_time = time::now_ms(); const auto framebuffer_size = the().real_size().cast_to(); @@ -201,7 +201,7 @@ int e2d_main() { math::make_loot_at_lh_matrix4({0.f,0.f,-2.f}, v3f::zero(), v3f::unit_y()) * projection; - material.properties() + material->properties() .property("u_time", game_time) .property("u_MVP", MVP); diff --git a/sources/enduro2d/core/render.cpp b/sources/enduro2d/core/render.cpp index fd60eebf..37473183 100644 --- a/sources/enduro2d/core/render.cpp +++ b/sources/enduro2d/core/render.cpp @@ -768,6 +768,14 @@ namespace e2d // material // + render::material_ptr render::material::create() { + return std::make_shared(); + } + + render::material_ptr render::material::create(const material& mat) { + return std::make_shared(mat); + } + render::material& render::material::add_pass(const pass_state& pass) noexcept { E2D_ASSERT(pass_count_ < max_pass_count); passes_[pass_count_] = pass; @@ -804,6 +812,14 @@ namespace e2d // geometry // + render::geometry_ptr render::geometry::create() { + return std::make_shared(); + } + + render::geometry_ptr render::geometry::create(const geometry& geo) { + return std::make_shared(geo); + } + render::geometry& render::geometry::add_vertices(const vertex_buffer_ptr& vb) noexcept { E2D_ASSERT(vertices_count_ < max_vertices_count); vertices_[vertices_count_] = vb; @@ -881,39 +897,45 @@ namespace e2d // draw_command // - render::draw_command::draw_command(const material& mat, const geometry& geo) noexcept - : material_(&mat) - , geometry_(&geo) {} + render::draw_command::draw_command(const material_ptr& mat, const geometry_ptr& geo) noexcept + : material_(mat) + , geometry_(geo) {} - render::draw_command& render::draw_command::material_ref(const material& value) noexcept { - material_ = &value; + render::draw_command& render::draw_command::material(const material_ptr& value) noexcept { + material_ = value; return *this; } - render::draw_command& render::draw_command::geometry_ref(const geometry& value) noexcept { - geometry_ = &value; + render::draw_command& render::draw_command::geometry(const geometry_ptr& value) noexcept { + geometry_ = value; return *this; } - const render::material& render::draw_command::material_ref() const noexcept { - E2D_ASSERT(material_); - return *material_; - } - - const render::geometry& render::draw_command::geometry_ref() const noexcept { - E2D_ASSERT(geometry_); - return *geometry_; - } - render::draw_command& render::draw_command::properties(const property_block& value) { properties_ = value; return *this; } + render::material_ptr& render::draw_command::material() noexcept { + return material_; + } + + render::geometry_ptr& render::draw_command::geometry() noexcept { + return geometry_; + } + render::property_block& render::draw_command::properties() noexcept { return properties_; } + const render::material_ptr& render::draw_command::material() const noexcept { + return material_; + } + + const render::geometry_ptr& render::draw_command::geometry() const noexcept { + return geometry_; + } + const render::property_block& render::draw_command::properties() const noexcept { return properties_; } diff --git a/sources/enduro2d/core/render_impl/render_opengl.cpp b/sources/enduro2d/core/render_impl/render_opengl.cpp index 456f2637..f3570882 100644 --- a/sources/enduro2d/core/render_impl/render_opengl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl.cpp @@ -180,7 +180,7 @@ namespace E2D_ASSERT(ps && vb); opengl::with_gl_bind_buffer(debug, vb->state().id(), [&debug, &ps, &vb]() noexcept { const vertex_declaration& decl = vb->decl(); - for ( std::size_t i = 0; i < decl.attribute_count(); ++i ) { + for ( std::size_t i = 0, e = decl.attribute_count(); i < e; ++i ) { const vertex_declaration::attribute_info& vai = decl.attribute(i); ps->state().with_attribute_location(vai.name, [&debug, &decl, &vai](const attribute_info& ai) noexcept { const GLuint rows = math::numeric_cast(vai.rows); @@ -207,7 +207,7 @@ namespace { E2D_ASSERT(ps && vb); const vertex_declaration& decl = vb->decl(); - for ( std::size_t i = 0; i < decl.attribute_count(); ++i ) { + for ( std::size_t i = 0, e = decl.attribute_count(); i < e; ++i ) { const vertex_declaration::attribute_info& vai = decl.attribute(i); ps->state().with_attribute_location(vai.name, [&debug, &vai](const attribute_info& ai) noexcept { const GLuint rows = math::numeric_cast(vai.rows); @@ -261,7 +261,7 @@ namespace F&& f, Args&&... args) { - for ( std::size_t i = 0; i < geo.vertices_count(); ++i ) { + for ( std::size_t i = 0, e = geo.vertices_count(); i < e; ++i ) { const vertex_buffer_ptr& vb = geo.vertices(i); if ( vb ) { bind_vertex_declaration(debug, ps, vb); @@ -270,7 +270,7 @@ namespace try { stdex::invoke(std::forward(f), std::forward(args)...); } catch (...) { - for ( std::size_t i = 0; i < geo.vertices_count(); ++i ) { + for ( std::size_t i = 0, e = geo.vertices_count(); i < e; ++i ) { const vertex_buffer_ptr& vb = geo.vertices(i); if ( vb ) { unbind_vertex_declaration(debug, ps, vb); @@ -278,7 +278,7 @@ namespace } throw; } - for ( std::size_t i = 0; i < geo.vertices_count(); ++i ) { + for ( std::size_t i = 0, e = geo.vertices_count(); i < e; ++i ) { const vertex_buffer_ptr& vb = geo.vertices(i); if ( vb ) { unbind_vertex_declaration(debug, ps, vb); @@ -782,11 +782,14 @@ namespace e2d std::this_thread::get_id() == modules::main_thread()); - const material& mat = command.material_ref(); - const geometry& geo = command.geometry_ref(); + E2D_ASSERT_MSG(command.material(), "draw command with empty material"); + E2D_ASSERT_MSG(command.geometry(), "draw command with empty geometry"); + + const material& mat = *command.material(); + const geometry& geo = *command.geometry(); const property_block& props = command.properties(); - for ( std::size_t i = 0; i < mat.pass_count(); ++i ) { + for ( std::size_t i = 0, e = mat.pass_count(); i < e; ++i ) { const pass_state& pass = mat.pass(i); const property_block& main_props = main_property_cache() .clear() diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.cpp b/sources/enduro2d/core/render_impl/render_opengl_base.cpp index 7f280bc3..5364e914 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.cpp @@ -1390,7 +1390,7 @@ namespace e2d { namespace opengl uniforms.reserve(uniforms.size() + math::numeric_cast(uniform_count)); - for ( GLuint i = 0; i < math::numeric_cast(uniform_count); ++i ) { + for ( GLuint i = 0, e = math::numeric_cast(uniform_count); i < e; ++i ) { GLint size = 0; GLenum type = 0; GL_CHECK_CODE(debug, glGetActiveUniform( @@ -1428,7 +1428,7 @@ namespace e2d { namespace opengl attributes.reserve(attributes.size() + math::numeric_cast(attribute_count)); - for ( GLuint i = 0; i < math::numeric_cast(attribute_count); ++i ) { + for ( GLuint i = 0, e = math::numeric_cast(attribute_count); i < e; ++i ) { GLint size = 0; GLenum type = 0; GL_CHECK_CODE(debug, glGetActiveAttrib(