mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-13 07:45:39 +07:00
Merge pull request #124 from enduro2d/feature/remove_sprite_pivot
Feature/remove sprite pivot
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"texture" : "background.png",
|
||||
"pivot" : { "x" : 0, "y" : 0 },
|
||||
"texrect" : { "x" : 0, "y" : 0, "w" : 256, "h" : 256 }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"texture" : "cube_0.png",
|
||||
"pivot" : { "x" : 12, "y" : 12 },
|
||||
"texrect" : { "x" : 0, "y" : 0, "w" : 24, "h" : 24 }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"texture" : "cube_1.png",
|
||||
"pivot" : { "x" : 12, "y" : 12 },
|
||||
"texrect" : { "x" : 0, "y" : 0, "w" : 24, "h" : 24 }
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"texture" : "ships.png",
|
||||
"pivot" : { "x" : 441, "y" : 340.5 },
|
||||
"texrect" : { "x" : 408, "y" : 284, "w" : 66, "h" : 113 }
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
}]
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ namespace
|
||||
|
||||
auto scene_i = the<world>().instantiate();
|
||||
scene_i.component<scene>().assign();
|
||||
scene_i.component<named>().assign("scene");
|
||||
|
||||
{
|
||||
prefab prefab;
|
||||
@@ -113,14 +114,22 @@ namespace
|
||||
}
|
||||
|
||||
{
|
||||
prefab sprite_prefab;
|
||||
sprite_prefab.prototype()
|
||||
.component<named>(named()
|
||||
.name("sprite"))
|
||||
.component<actor>(actor()
|
||||
.node(node::create(math::make_translation_trs2(v2f{-33.f,-56.5f}))))
|
||||
.component<renderer>()
|
||||
.component<sprite_renderer>(sprite_renderer(sprite_res)
|
||||
.materials({{"normal", sprite_mat}}));
|
||||
|
||||
prefab prefab;
|
||||
prefab.prototype()
|
||||
.component<named>(named()
|
||||
.name("ship"))
|
||||
.component<node_rotator>()
|
||||
.component<renderer>()
|
||||
.component<sprite_renderer>(sprite_renderer(sprite_res)
|
||||
.materials({{"normal", sprite_mat}}));
|
||||
.component<node_rotator>();
|
||||
prefab.set_children({sprite_prefab});
|
||||
|
||||
the<world>().instantiate(
|
||||
prefab,
|
||||
@@ -129,11 +138,12 @@ namespace
|
||||
}
|
||||
|
||||
{
|
||||
prefab prefab_a;
|
||||
prefab_a.prototype()
|
||||
prefab sprite_prefab;
|
||||
sprite_prefab.prototype()
|
||||
.component<named>(named()
|
||||
.name("cube"))
|
||||
.component<node_rotator>()
|
||||
.name("sprite"))
|
||||
.component<actor>(actor()
|
||||
.node(node::create(math::make_translation_trs2(v2f{-12.f,-12.f}))))
|
||||
.component<renderer>()
|
||||
.component<sprite_renderer>(sprite_renderer()
|
||||
.filtering(false)
|
||||
@@ -142,28 +152,35 @@ namespace
|
||||
.play("idle")
|
||||
.looped(true));
|
||||
|
||||
prefab child_prefab;
|
||||
child_prefab.prototype()
|
||||
.component<named>(named()
|
||||
.name("child"))
|
||||
.component<actor>(actor()
|
||||
.node(node::create(make_trs2(
|
||||
v2f{20.f,0.f},
|
||||
0.f,
|
||||
v2f{0.3f,0.3f}))))
|
||||
.component<node_rotator>();
|
||||
child_prefab.set_children({sprite_prefab});
|
||||
|
||||
prefab root_prefab;
|
||||
root_prefab.prototype()
|
||||
.component<named>(named()
|
||||
.name("root"))
|
||||
.component<node_rotator>();
|
||||
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<world>().instantiate(
|
||||
prefab_a,
|
||||
the<world>().instantiate(
|
||||
root_prefab,
|
||||
scene_i.component<actor>()->node(),
|
||||
trans);
|
||||
|
||||
prefab prefab_b = prefab_a;
|
||||
prefab_b.prototype()
|
||||
.component<node_rotator>()
|
||||
.component<actor>(node::create(make_trs2(
|
||||
v2f{20.f,0.f},
|
||||
0.f,
|
||||
v2f{0.3f,0.3f})));
|
||||
|
||||
the<world>().instantiate(
|
||||
prefab_b,
|
||||
inst.component<actor>()->node());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<debug>().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);
|
||||
|
||||
@@ -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<texture_asset>(
|
||||
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<debug>().error("SPRITE: Incorrect formatting of 'pivot' property");
|
||||
return stdex::make_rejected_promise<sprite>(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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 }
|
||||
}]
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"texture" : "image.png",
|
||||
"pivot" : { "x" : 1, "y" : 2 },
|
||||
"texrect" : { "x" : 5, "y" : 6, "w" : 7, "h" : 8 }
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
@@ -192,14 +192,12 @@ TEST_CASE("library"){
|
||||
|
||||
sprite_asset::ptr spr = atlas_res->find_nested_asset<sprite_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<sprite_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_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<sprite_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);
|
||||
|
||||
Reference in New Issue
Block a user