diff --git a/headers/enduro2d/high/components/named.hpp b/headers/enduro2d/high/components/named.hpp index 1643796e..4ea45564 100644 --- a/headers/enduro2d/high/components/named.hpp +++ b/headers/enduro2d/high/components/named.hpp @@ -13,6 +13,7 @@ namespace e2d class named final { public: named() = default; + named(str value) noexcept; named& name(str value) noexcept; @@ -53,6 +54,9 @@ namespace e2d namespace e2d { + inline named::named(str value) noexcept + : name_(std::move(value)) {} + inline named& named::name(str value) noexcept { name_ = std::move(value); return *this; diff --git a/headers/enduro2d/high/resources/sprite.hpp b/headers/enduro2d/high/resources/sprite.hpp index 74dc0f0d..cba8a85f 100644 --- a/headers/enduro2d/high/resources/sprite.hpp +++ b/headers/enduro2d/high/resources/sprite.hpp @@ -29,17 +29,14 @@ namespace e2d sprite& assign(sprite&& other) noexcept; sprite& assign(const sprite& other); - sprite& set_pivot(const v2f& pivot) noexcept; sprite& set_inner_texrect(const b2f& texrect) noexcept; sprite& set_outer_texrect(const b2f& texrect) noexcept; sprite& set_texture(const texture_asset::ptr& texture) noexcept; - const v2f& pivot() const noexcept; const b2f& inner_texrect() const noexcept; const b2f& outer_texrect() const noexcept; const texture_asset::ptr& texture() const noexcept; private: - v2f pivot_; b2f inner_texrect_; b2f outer_texrect_; texture_asset::ptr texture_; diff --git a/samples/bin/library/prefabs/ship_prefab.json b/samples/bin/library/prefabs/ship_prefab.json index 78b4949e..601f0891 100644 --- a/samples/bin/library/prefabs/ship_prefab.json +++ b/samples/bin/library/prefabs/ship_prefab.json @@ -1,11 +1,22 @@ { - "prefab" : "sprite_prefab.json", "components" : { "named" : { "name" : "ship" - }, - "sprite_renderer" : { - "sprite" : "../sprites/ship_sprite.json" } - } + }, + "children" : [{ + "uuid" : "6A3E19C4-840C-40E9-9AB0-5D8DF77F0634", + "prefab" : "sprite_prefab.json", + "components" : { + "named" : { + "name" : "sprite" + }, + "actor" : { + "translation" : [-33,-56.5] + }, + "sprite_renderer" : { + "sprite" : "../sprites/ship_sprite.json" + } + } + }] } diff --git a/samples/bin/library/scenes/sample_04.json b/samples/bin/library/scenes/sample_04.json index 61eb6f04..c5df9f52 100644 --- a/samples/bin/library/scenes/sample_04.json +++ b/samples/bin/library/scenes/sample_04.json @@ -58,37 +58,50 @@ "actor" : { "translation" : [0,0], "scale" : 20 - }, - "named" : { - "name" : "gnome" } } }, { - "prefab" : "../prefabs/ship_prefab.json", "components" : { - "sprite_renderer" : { - "blending" : "additive" - }, - "actor" : { - "translation" : [-50,-50] - }, "named" : { - "name" : "ship(1)" + "name" : "ships" } }, "children" : [{ "prefab" : "../prefabs/ship_prefab.json", "components" : { - "sprite_renderer" : { - "tint" : [255,0,0,255] + "named" : { + "name" : "ship(1)" }, "actor" : { - "translation" : [100,0] - }, + "translation" : [-50,-50] + } + }, + "mod_children" : [{ + "uuid" : "6A3E19C4-840C-40E9-9AB0-5D8DF77F0634", + "components" : { + "sprite_renderer" : { + "tint" : [255,0,0,255] + } + } + }] + }, { + "prefab" : "../prefabs/ship_prefab.json", + "components" : { "named" : { "name" : "ship(2)" + }, + "actor" : { + "translation" : [50,-50] } - } + }, + "mod_children" : [{ + "uuid" : "6A3E19C4-840C-40E9-9AB0-5D8DF77F0634", + "components" : { + "sprite_renderer" : { + "blending" : "additive" + } + } + }] }] }, { "prefab" : "../prefabs/label_bm_prefab.json", diff --git a/samples/bin/library/sprites/background_sprite.json b/samples/bin/library/sprites/background_sprite.json index e57b5343..7d17856d 100644 --- a/samples/bin/library/sprites/background_sprite.json +++ b/samples/bin/library/sprites/background_sprite.json @@ -1,5 +1,4 @@ { "texture" : "background.png", - "pivot" : { "x" : 0, "y" : 0 }, "texrect" : { "x" : 0, "y" : 0, "w" : 256, "h" : 256 } } diff --git a/samples/bin/library/sprites/cube_0_sprite.json b/samples/bin/library/sprites/cube_0_sprite.json index 5ff1c3bd..8ff2dd27 100644 --- a/samples/bin/library/sprites/cube_0_sprite.json +++ b/samples/bin/library/sprites/cube_0_sprite.json @@ -1,5 +1,4 @@ { "texture" : "cube_0.png", - "pivot" : { "x" : 12, "y" : 12 }, "texrect" : { "x" : 0, "y" : 0, "w" : 24, "h" : 24 } } diff --git a/samples/bin/library/sprites/cube_1_sprite.json b/samples/bin/library/sprites/cube_1_sprite.json index 2efec47d..b8e527a5 100644 --- a/samples/bin/library/sprites/cube_1_sprite.json +++ b/samples/bin/library/sprites/cube_1_sprite.json @@ -1,5 +1,4 @@ { "texture" : "cube_1.png", - "pivot" : { "x" : 12, "y" : 12 }, "texrect" : { "x" : 0, "y" : 0, "w" : 24, "h" : 24 } } diff --git a/samples/bin/library/sprites/panel_sprite.json b/samples/bin/library/sprites/panel_sprite.json index 2b0b1cbd..3fb2411b 100644 --- a/samples/bin/library/sprites/panel_sprite.json +++ b/samples/bin/library/sprites/panel_sprite.json @@ -1,6 +1,5 @@ { "texture" : "panel.png", - "pivot" : { "x" : 0, "y" : 0 }, "inner_texrect" : { "x" : 6, "y" : 6, "w" : 88, "h" : 88 }, "outer_texrect" : { "x" : 0, "y" : 0, "w" : 100, "h" : 100 } } diff --git a/samples/bin/library/sprites/ship_sprite.json b/samples/bin/library/sprites/ship_sprite.json index d8d0203e..6ea5b7d0 100644 --- a/samples/bin/library/sprites/ship_sprite.json +++ b/samples/bin/library/sprites/ship_sprite.json @@ -1,5 +1,4 @@ { "texture" : "ships.png", - "pivot" : { "x" : 441, "y" : 340.5 }, "texrect" : { "x" : 408, "y" : 284, "w" : 66, "h" : 113 } } diff --git a/samples/bin/library/sprites/ships_atlas.json b/samples/bin/library/sprites/ships_atlas.json index 4fba5134..0c8f3cdc 100644 --- a/samples/bin/library/sprites/ships_atlas.json +++ b/samples/bin/library/sprites/ships_atlas.json @@ -2,11 +2,9 @@ "texture" : "ships.png", "sprites" : [{ "name" : "ship (1).png", - "pivot" : { "x" : 441, "y" : 455 }, "texrect" : { "x" : 408, "y" : 399, "w" : 66, "h" : 113 } },{ "name" : "ship (2).png", - "pivot" : { "x" : 441, "y" : 340 }, "texrect" : { "x" : 408, "y" : 284, "w" : 66, "h" : 113 } }] } diff --git a/samples/sources/sample_03/sample_03.cpp b/samples/sources/sample_03/sample_03.cpp index 1cd7cf60..cfd8ef00 100644 --- a/samples/sources/sample_03/sample_03.cpp +++ b/samples/sources/sample_03/sample_03.cpp @@ -80,6 +80,7 @@ namespace auto scene_i = the().instantiate(); scene_i.component().assign(); + scene_i.component().assign("scene"); { prefab prefab; @@ -113,14 +114,22 @@ namespace } { + prefab sprite_prefab; + sprite_prefab.prototype() + .component(named() + .name("sprite")) + .component(actor() + .node(node::create(math::make_translation_trs2(v2f{-33.f,-56.5f})))) + .component() + .component(sprite_renderer(sprite_res) + .materials({{"normal", sprite_mat}})); + prefab prefab; prefab.prototype() .component(named() .name("ship")) - .component() - .component() - .component(sprite_renderer(sprite_res) - .materials({{"normal", sprite_mat}})); + .component(); + prefab.set_children({sprite_prefab}); the().instantiate( prefab, @@ -129,11 +138,12 @@ namespace } { - prefab prefab_a; - prefab_a.prototype() + prefab sprite_prefab; + sprite_prefab.prototype() .component(named() - .name("cube")) - .component() + .name("sprite")) + .component(actor() + .node(node::create(math::make_translation_trs2(v2f{-12.f,-12.f})))) .component() .component(sprite_renderer() .filtering(false) @@ -142,28 +152,35 @@ namespace .play("idle") .looped(true)); + prefab child_prefab; + child_prefab.prototype() + .component(named() + .name("child")) + .component(actor() + .node(node::create(make_trs2( + v2f{20.f,0.f}, + 0.f, + v2f{0.3f,0.3f})))) + .component(); + child_prefab.set_children({sprite_prefab}); + + prefab root_prefab; + root_prefab.prototype() + .component(named() + .name("root")) + .component(); + root_prefab.set_children({sprite_prefab, child_prefab}); + for ( std::size_t i = 0; i < 2; ++i ) for ( std::size_t j = 0; j < 5; ++j ) { t2f trans{ {-80.f + j * 40.f, -200.f + i * 40.f}, 0.f, {2.f,2.f}}; - gobject inst = the().instantiate( - prefab_a, + the().instantiate( + root_prefab, scene_i.component()->node(), trans); - - prefab prefab_b = prefab_a; - prefab_b.prototype() - .component() - .component(node::create(make_trs2( - v2f{20.f,0.f}, - 0.f, - v2f{0.3f,0.3f}))); - - the().instantiate( - prefab_b, - inst.component()->node()); } } diff --git a/sources/enduro2d/high/assets/atlas_asset.cpp b/sources/enduro2d/high/assets/atlas_asset.cpp index 3841dc9b..916bdbcc 100644 --- a/sources/enduro2d/high/assets/atlas_asset.cpp +++ b/sources/enduro2d/high/assets/atlas_asset.cpp @@ -36,20 +36,18 @@ namespace "sprite" : { "anyOf" : [{ "type" : "object", - "required" : [ "name", "pivot", "texrect" ], + "required" : [ "name", "texrect" ], "additionalProperties" : false, "properties" : { "name" : { "$ref": "#/common_definitions/name" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, "texrect" : { "$ref": "#/common_definitions/b2" } } },{ "type" : "object", - "required" : [ "name", "pivot", "inner_texrect", "outer_texrect" ], + "required" : [ "name", "inner_texrect", "outer_texrect" ], "additionalProperties" : false, "properties" : { "name" : { "$ref": "#/common_definitions/name" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, "inner_texrect" : { "$ref": "#/common_definitions/b2" }, "outer_texrect" : { "$ref": "#/common_definitions/b2" } } @@ -78,7 +76,6 @@ namespace struct sprite_desc { str_hash name; - v2f pivot; b2f inner_texrect; b2f outer_texrect; }; @@ -100,12 +97,6 @@ namespace return false; } - E2D_ASSERT(sprite_json.HasMember("pivot")); - if ( !json_utils::try_parse_value(sprite_json["pivot"], tsprite_descs[i].pivot) ) { - the().error("ATLAS: Incorrect formatting of 'pivot' property"); - return false; - } - E2D_ASSERT( sprite_json.HasMember("texrect") || (sprite_json.HasMember("inner_texrect") && sprite_json.HasMember("outer_texrect"))); @@ -163,7 +154,6 @@ namespace nested_content ncontent; for ( const sprite_desc& desc : sprite_descs ) { sprite spr; - spr.set_pivot(desc.pivot); spr.set_inner_texrect(desc.inner_texrect); spr.set_outer_texrect(desc.outer_texrect); spr.set_texture(texture); diff --git a/sources/enduro2d/high/assets/sprite_asset.cpp b/sources/enduro2d/high/assets/sprite_asset.cpp index 2b41d617..abe2aa89 100644 --- a/sources/enduro2d/high/assets/sprite_asset.cpp +++ b/sources/enduro2d/high/assets/sprite_asset.cpp @@ -23,20 +23,18 @@ namespace const char* sprite_asset_schema_source = R"json({ "anyOf" : [{ "type" : "object", - "required" : [ "texture", "pivot", "texrect" ], + "required" : [ "texture", "texrect" ], "additionalProperties" : false, "properties" : { "texture" : { "$ref": "#/common_definitions/address" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, "texrect" : { "$ref": "#/common_definitions/b2" } } },{ "type" : "object", - "required" : [ "texture", "pivot", "inner_texrect", "outer_texrect" ], + "required" : [ "texture", "inner_texrect", "outer_texrect" ], "additionalProperties" : false, "properties" : { "texture" : { "$ref": "#/common_definitions/address" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, "inner_texrect" : { "$ref": "#/common_definitions/b2" }, "outer_texrect" : { "$ref": "#/common_definitions/b2" } } @@ -70,16 +68,9 @@ namespace auto texture_p = library.load_asset_async( path::combine(parent_address, root["texture"].GetString())); - v2f pivot; b2f inner_texrect; b2f outer_texrect; - E2D_ASSERT(root.HasMember("pivot")); - if ( !json_utils::try_parse_value(root["pivot"], pivot) ) { - the().error("SPRITE: Incorrect formatting of 'pivot' property"); - return stdex::make_rejected_promise(sprite_asset_loading_exception()); - } - E2D_ASSERT( root.HasMember("texrect") || (root.HasMember("inner_texrect") && root.HasMember("outer_texrect"))); @@ -105,12 +96,10 @@ namespace } return texture_p.then([ - pivot, inner_texrect, outer_texrect ](const texture_asset::load_result& texture){ sprite content; - content.set_pivot(pivot); content.set_inner_texrect(inner_texrect); content.set_outer_texrect(outer_texrect); content.set_texture(texture); diff --git a/sources/enduro2d/high/components/sprite_renderer.cpp b/sources/enduro2d/high/components/sprite_renderer.cpp index b144e2e8..a5cb7c00 100644 --- a/sources/enduro2d/high/components/sprite_renderer.cpp +++ b/sources/enduro2d/high/components/sprite_renderer.cpp @@ -245,10 +245,9 @@ namespace e2d const b2f& outer_r = spr.outer_texrect(); const v2f size = outer_r.size * c->scale(); - const v2f poff = (outer_r.position - spr.pivot()) * c->scale(); ctx.draw_wire_rect( - poff + size * 0.5f, + size * 0.5f, size, ctx.selected() ? color32::yellow() : color32::magenta()); } diff --git a/sources/enduro2d/high/resources/sprite.cpp b/sources/enduro2d/high/resources/sprite.cpp index 22dc2a17..42ccd04e 100644 --- a/sources/enduro2d/high/resources/sprite.cpp +++ b/sources/enduro2d/high/resources/sprite.cpp @@ -25,7 +25,6 @@ namespace e2d } void sprite::clear() noexcept { - pivot_ = v2f::zero(); inner_texrect_ = b2f::zero(); outer_texrect_ = b2f::zero(); texture_.reset(); @@ -33,7 +32,6 @@ namespace e2d void sprite::swap(sprite& other) noexcept { using std::swap; - swap(pivot_, other.pivot_); swap(inner_texrect_, other.inner_texrect_); swap(outer_texrect_, other.outer_texrect_); swap(texture_, other.texture_); @@ -50,7 +48,6 @@ namespace e2d sprite& sprite::assign(const sprite& other) { if ( this != &other ) { sprite s; - s.pivot_ = other.pivot_; s.inner_texrect_ = other.inner_texrect_; s.outer_texrect_ = other.outer_texrect_; s.texture_ = other.texture_; @@ -59,11 +56,6 @@ namespace e2d return *this; } - sprite& sprite::set_pivot(const v2f& pivot) noexcept { - pivot_ = pivot; - return *this; - } - sprite& sprite::set_inner_texrect(const b2f& texrect) noexcept { inner_texrect_ = texrect; return *this; @@ -79,10 +71,6 @@ namespace e2d return *this; } - const v2f& sprite::pivot() const noexcept { - return pivot_; - } - const b2f& sprite::inner_texrect() const noexcept { return inner_texrect_; } @@ -103,8 +91,7 @@ namespace e2d } bool operator==(const sprite& l, const sprite& r) noexcept { - return l.pivot() == r.pivot() - && l.inner_texrect() == r.inner_texrect() + return l.inner_texrect() == r.inner_texrect() && l.outer_texrect() == r.outer_texrect() && l.texture() == r.texture(); } diff --git a/sources/enduro2d/high/systems/render_system_impl/render_system_drawer.cpp b/sources/enduro2d/high/systems/render_system_impl/render_system_drawer.cpp index a6b76362..7c477b49 100644 --- a/sources/enduro2d/high/systems/render_system_impl/render_system_drawer.cpp +++ b/sources/enduro2d/high/systems/render_system_impl/render_system_drawer.cpp @@ -496,13 +496,12 @@ namespace e2d::render_system_impl const b2f& outer_r = spr.outer_texrect(); const v2f size = outer_r.size * spr_r.scale(); - const v2f poff = (outer_r.position - spr.pivot()) * spr_r.scale(); const v2f pos_xs = v2f{ - 0.f, size.x} + poff.x; + 0.f, size.x}; const v2f pos_ys = v2f{ - 0.f, size.y} + poff.y; + 0.f, size.y}; const v2f tex_xs = v2f{ outer_r.position.x, @@ -550,7 +549,6 @@ namespace e2d::render_system_impl const f32 top = (outer_r.size.y - inner_r.size.y) - bottom; const v2f size = outer_r.size * spr_r.scale(); - const v2f poff = (outer_r.position - spr.pivot()) * spr_r.scale(); const f32 sides_width = left + right; const f32 sides_height = bottom + top; @@ -569,13 +567,13 @@ namespace e2d::render_system_impl 0.f, adj_left, size.x - adj_right, - size.x} + poff.x; + size.x}; const v4f pos_ys = v4f{ 0.f, adj_bottom, size.y - adj_top, - size.y} + poff.y; + size.y}; const v4f tex_xs = v4f{ outer_r.position.x, diff --git a/untests/bin/library/atlas.json b/untests/bin/library/atlas.json index 478f2ba9..bd84bdb6 100644 --- a/untests/bin/library/atlas.json +++ b/untests/bin/library/atlas.json @@ -2,11 +2,9 @@ "texture" : "image.png", "sprites" : [{ "name" : "sprite", - "pivot" : { "x" : 1, "y" : 2 }, "texrect" : { "x" : 5, "y" : 6, "w" : 7, "h" : 8 } },{ "name" : "sprite2", - "pivot" : { "x" : 1, "y" : 2 }, "inner_texrect" : { "x" : 1, "y" : 2, "w" : 3, "h" : 4 }, "outer_texrect" : { "x" : 5, "y" : 6, "w" : 7, "h" : 8 } }] diff --git a/untests/bin/library/sprite.json b/untests/bin/library/sprite.json index 28abe14a..7e8defb3 100644 --- a/untests/bin/library/sprite.json +++ b/untests/bin/library/sprite.json @@ -1,5 +1,4 @@ { "texture" : "image.png", - "pivot" : { "x" : 1, "y" : 2 }, "texrect" : { "x" : 5, "y" : 6, "w" : 7, "h" : 8 } } diff --git a/untests/bin/library/sprite2.json b/untests/bin/library/sprite2.json index 876d5416..f238ea3f 100644 --- a/untests/bin/library/sprite2.json +++ b/untests/bin/library/sprite2.json @@ -1,6 +1,5 @@ { "texture" : "image.png", - "pivot" : { "x" : 1, "y" : 2 }, "inner_texrect" : { "x" : 1, "y" : 2, "w" : 3, "h" : 4 }, "outer_texrect" : { "x" : 5, "y" : 6, "w" : 7, "h" : 8 } } diff --git a/untests/sources/untests_high/library.cpp b/untests/sources/untests_high/library.cpp index f67a1625..8ea1fbf9 100644 --- a/untests/sources/untests_high/library.cpp +++ b/untests/sources/untests_high/library.cpp @@ -192,14 +192,12 @@ TEST_CASE("library"){ sprite_asset::ptr spr = atlas_res->find_nested_asset("sprite"); REQUIRE(spr); - REQUIRE(spr->content().pivot() == v2f(1.f,2.f)); REQUIRE(spr->content().inner_texrect() == b2f(5.f,6.f,7.f,8.f)); REQUIRE(spr->content().outer_texrect() == b2f(5.f,6.f,7.f,8.f)); REQUIRE(spr->content().texture()== texture_res); sprite_asset::ptr spr2 = atlas_res->find_nested_asset("sprite2"); REQUIRE(spr2); - REQUIRE(spr2->content().pivot() == v2f(1.f,2.f)); REQUIRE(spr2->content().inner_texrect() == b2f(1.f,2.f,3.f,4.f)); REQUIRE(spr2->content().outer_texrect() == b2f(5.f,6.f,7.f,8.f)); REQUIRE(spr2->content().texture()== texture_res); @@ -208,14 +206,12 @@ TEST_CASE("library"){ { auto sprite_res = l.load_asset("sprite.json"); REQUIRE(sprite_res); - REQUIRE(sprite_res->content().pivot() == v2f(1.f, 2.f)); REQUIRE(sprite_res->content().inner_texrect() == b2f(5.f, 6.f, 7.f, 8.f)); REQUIRE(sprite_res->content().outer_texrect() == b2f(5.f, 6.f, 7.f, 8.f)); REQUIRE(sprite_res->content().texture() == texture_res); auto sprite2_res = l.load_asset("sprite2.json"); REQUIRE(sprite2_res); - REQUIRE(sprite2_res->content().pivot() == v2f(1.f, 2.f)); REQUIRE(sprite2_res->content().inner_texrect() == b2f(1.f, 2.f, 3.f, 4.f)); REQUIRE(sprite2_res->content().outer_texrect() == b2f(5.f, 6.f, 7.f, 8.f)); REQUIRE(sprite2_res->content().texture() == texture_res);