From afaef0cef69bd05dbcf79f09d0a9672dec96388e Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sat, 22 Feb 2020 09:01:58 +0700 Subject: [PATCH] add inner and outer texrects to sprite asset and atlas sprite --- headers/enduro2d/high/sprite.hpp | 9 ++- sources/enduro2d/high/assets/atlas_asset.cpp | 63 +++++++++++++----- sources/enduro2d/high/assets/sprite_asset.cpp | 64 ++++++++++++++----- .../high/components/sprite_renderer.cpp | 4 +- sources/enduro2d/high/sprite.cpp | 29 ++++++--- .../render_system_drawer.cpp | 2 +- untests/bin/library/atlas.json | 5 ++ untests/bin/library/sprite2.json | 6 ++ untests/sources/untests_high/library.cpp | 21 +++++- 9 files changed, 156 insertions(+), 47 deletions(-) create mode 100644 untests/bin/library/sprite2.json diff --git a/headers/enduro2d/high/sprite.hpp b/headers/enduro2d/high/sprite.hpp index 8659713a..4986a017 100644 --- a/headers/enduro2d/high/sprite.hpp +++ b/headers/enduro2d/high/sprite.hpp @@ -30,15 +30,18 @@ namespace e2d sprite& assign(const sprite& other); sprite& set_pivot(const v2f& pivot) noexcept; - sprite& set_texrect(const b2f& texrect) 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& texrect() 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 texrect_; + b2f inner_texrect_; + b2f outer_texrect_; texture_asset::ptr texture_; }; diff --git a/sources/enduro2d/high/assets/atlas_asset.cpp b/sources/enduro2d/high/assets/atlas_asset.cpp index b20092d4..3841dc9b 100644 --- a/sources/enduro2d/high/assets/atlas_asset.cpp +++ b/sources/enduro2d/high/assets/atlas_asset.cpp @@ -20,8 +20,7 @@ namespace } }; - const char* atlas_asset_schema_source = R"json( - { + const char* atlas_asset_schema_source = R"json({ "type" : "object", "required" : [ "texture" ], "additionalProperties" : false, @@ -35,14 +34,26 @@ namespace "items" : { "$ref": "#/definitions/sprite" } }, "sprite" : { - "type" : "object", - "required" : [ "name", "pivot", "texrect" ], - "additionalProperties" : false, - "properties" : { - "name" : { "$ref": "#/common_definitions/name" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, - "texrect" : { "$ref": "#/common_definitions/b2" } - } + "anyOf" : [{ + "type" : "object", + "required" : [ "name", "pivot", "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" ], + "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" } + } + }] } } })json"; @@ -68,7 +79,8 @@ namespace struct sprite_desc { str_hash name; v2f pivot; - b2f texrect; + b2f inner_texrect; + b2f outer_texrect; }; bool parse_sprites( @@ -94,10 +106,28 @@ namespace return false; } - E2D_ASSERT(sprite_json.HasMember("texrect")); - if ( !json_utils::try_parse_value(sprite_json["texrect"], tsprite_descs[i].texrect) ) { - the().error("ATLAS: Incorrect formatting of 'texrect' property"); - return false; + E2D_ASSERT( + sprite_json.HasMember("texrect") || + (sprite_json.HasMember("inner_texrect") && sprite_json.HasMember("outer_texrect"))); + + if ( sprite_json.HasMember("texrect") ) { + b2f texrect; + if ( !json_utils::try_parse_value(sprite_json["texrect"], texrect) ) { + the().error("ATLAS: Incorrect formatting of 'texrect' property"); + return false; + } + tsprite_descs[i].inner_texrect = texrect; + tsprite_descs[i].outer_texrect = texrect; + } else { + if ( !json_utils::try_parse_value(sprite_json["inner_texrect"], tsprite_descs[i].inner_texrect) ) { + the().error("ATLAS: Incorrect formatting of 'inner_texrect' property"); + return false; + } + + if ( !json_utils::try_parse_value(sprite_json["outer_texrect"], tsprite_descs[i].outer_texrect) ) { + the().error("ATLAS: Incorrect formatting of 'outer_texrect' property"); + return false; + } } } @@ -134,7 +164,8 @@ namespace for ( const sprite_desc& desc : sprite_descs ) { sprite spr; spr.set_pivot(desc.pivot); - spr.set_texrect(desc.texrect); + spr.set_inner_texrect(desc.inner_texrect); + spr.set_outer_texrect(desc.outer_texrect); spr.set_texture(texture); ncontent.insert(std::make_pair(desc.name, sprite_asset::create(std::move(spr)))); } diff --git a/sources/enduro2d/high/assets/sprite_asset.cpp b/sources/enduro2d/high/assets/sprite_asset.cpp index 3dfab128..2b41d617 100644 --- a/sources/enduro2d/high/assets/sprite_asset.cpp +++ b/sources/enduro2d/high/assets/sprite_asset.cpp @@ -21,14 +21,26 @@ namespace }; const char* sprite_asset_schema_source = R"json({ - "type" : "object", - "required" : [ "texture", "pivot", "texrect" ], - "additionalProperties" : false, - "properties" : { - "texture" : { "$ref": "#/common_definitions/address" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, - "texrect" : { "$ref": "#/common_definitions/b2" } - } + "anyOf" : [{ + "type" : "object", + "required" : [ "texture", "pivot", "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" ], + "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" } + } + }] })json"; const rapidjson::SchemaDocument& sprite_asset_schema() { @@ -59,26 +71,48 @@ namespace 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()); } - b2f texrect; - E2D_ASSERT(root.HasMember("texrect")); - if ( !json_utils::try_parse_value(root["texrect"], texrect) ) { - the().error("SPRITE: Incorrect formatting of 'texrect' property"); - return stdex::make_rejected_promise(sprite_asset_loading_exception()); + E2D_ASSERT( + root.HasMember("texrect") || + (root.HasMember("inner_texrect") && root.HasMember("outer_texrect"))); + + if ( root.HasMember("texrect") ) { + b2f texrect; + if ( !json_utils::try_parse_value(root["texrect"], texrect) ) { + the().error("SPRITE: Incorrect formatting of 'texrect' property"); + return stdex::make_rejected_promise(sprite_asset_loading_exception()); + } + inner_texrect = texrect; + outer_texrect = texrect; + } else { + if ( !json_utils::try_parse_value(root["inner_texrect"], inner_texrect) ) { + the().error("SPRITE: Incorrect formatting of 'inner_texrect' property"); + return stdex::make_rejected_promise(sprite_asset_loading_exception()); + } + + if ( !json_utils::try_parse_value(root["outer_texrect"], outer_texrect) ) { + the().error("SPRITE: Incorrect formatting of 'outer_texrect' property"); + return stdex::make_rejected_promise(sprite_asset_loading_exception()); + } } return texture_p.then([ pivot, - texrect + inner_texrect, + outer_texrect ](const texture_asset::load_result& texture){ sprite content; content.set_pivot(pivot); - content.set_texrect(texrect); + content.set_inner_texrect(inner_texrect); + content.set_outer_texrect(outer_texrect); content.set_texture(texture); return content; }); diff --git a/sources/enduro2d/high/components/sprite_renderer.cpp b/sources/enduro2d/high/components/sprite_renderer.cpp index f686e429..3c7ab276 100644 --- a/sources/enduro2d/high/components/sprite_renderer.cpp +++ b/sources/enduro2d/high/components/sprite_renderer.cpp @@ -204,8 +204,8 @@ namespace e2d if ( const sprite_asset::ptr& spr_a = c->sprite() ) { const sprite& spr = spr_a->content(); ctx.draw_wire_rect( - spr.texrect().position - spr.pivot() + spr.texrect().size * 0.5f, - spr.texrect().size, + spr.outer_texrect().position - spr.pivot() + spr.outer_texrect().size * 0.5f, + spr.outer_texrect().size, ctx.selected() ? color32::yellow() : color32::magenta()); } } diff --git a/sources/enduro2d/high/sprite.cpp b/sources/enduro2d/high/sprite.cpp index 91610fc0..08c6c576 100644 --- a/sources/enduro2d/high/sprite.cpp +++ b/sources/enduro2d/high/sprite.cpp @@ -26,14 +26,16 @@ namespace e2d void sprite::clear() noexcept { pivot_ = v2f::zero(); - texrect_ = b2f::zero(); + inner_texrect_ = b2f::zero(); + outer_texrect_ = b2f::zero(); texture_.reset(); } void sprite::swap(sprite& other) noexcept { using std::swap; swap(pivot_, other.pivot_); - swap(texrect_, other.texrect_); + swap(inner_texrect_, other.inner_texrect_); + swap(outer_texrect_, other.outer_texrect_); swap(texture_, other.texture_); } @@ -49,7 +51,8 @@ namespace e2d if ( this != &other ) { sprite s; s.pivot_ = other.pivot_; - s.texrect_ = other.texrect_; + s.inner_texrect_ = other.inner_texrect_; + s.outer_texrect_ = other.outer_texrect_; s.texture_ = other.texture_; swap(s); } @@ -61,8 +64,13 @@ namespace e2d return *this; } - sprite& sprite::set_texrect(const b2f& texrect) noexcept { - texrect_ = texrect; + sprite& sprite::set_inner_texrect(const b2f& texrect) noexcept { + inner_texrect_ = texrect; + return *this; + } + + sprite& sprite::set_outer_texrect(const b2f& texrect) noexcept { + outer_texrect_ = texrect; return *this; } @@ -75,8 +83,12 @@ namespace e2d return pivot_; } - const b2f& sprite::texrect() const noexcept { - return texrect_; + const b2f& sprite::inner_texrect() const noexcept { + return inner_texrect_; + } + + const b2f& sprite::outer_texrect() const noexcept { + return outer_texrect_; } const texture_asset::ptr& sprite::texture() const noexcept { @@ -92,7 +104,8 @@ namespace e2d bool operator==(const sprite& l, const sprite& r) noexcept { return l.pivot() == r.pivot() - && l.texrect() == r.texrect() + && 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 76874a7d..2dde1770 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 @@ -458,7 +458,7 @@ namespace e2d::render_system_impl return; } - const b2f& tex_r = spr.texrect(); + const b2f& tex_r = spr.outer_texrect(); const v2f& tex_s = tex_p->size().cast_to(); const f32 sw = tex_r.size.x; diff --git a/untests/bin/library/atlas.json b/untests/bin/library/atlas.json index f1868a9f..478f2ba9 100644 --- a/untests/bin/library/atlas.json +++ b/untests/bin/library/atlas.json @@ -4,5 +4,10 @@ "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/sprite2.json b/untests/bin/library/sprite2.json new file mode 100644 index 00000000..876d5416 --- /dev/null +++ b/untests/bin/library/sprite2.json @@ -0,0 +1,6 @@ +{ + "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 b2337ee6..d21a7309 100644 --- a/untests/sources/untests_high/library.cpp +++ b/untests/sources/untests_high/library.cpp @@ -188,20 +188,37 @@ TEST_CASE("library"){ REQUIRE(atlas_res->content().texture() == texture_res); REQUIRE(atlas_res->find_nested_asset("sprite")); + REQUIRE(atlas_res->find_nested_asset("sprite2")); sprite_asset::ptr spr = atlas_res->find_nested_asset("sprite"); REQUIRE(spr); REQUIRE(spr->content().pivot() == v2f(1.f,2.f)); - REQUIRE(spr->content().texrect() == b2f(5.f,6.f,7.f,8.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); } { 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().texrect() == b2f(5.f, 6.f, 7.f, 8.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); } {