Skip to content

Commit c05e69a

Browse files
authored
Fix RenderTexture internal sprite positioning and test cases (#2301)
* RenderTexture internal sprite should be anchored and positioned in middle of render texture. RenderTexture internal sprite should be active in order to support actions * No need to set RenderTexture internal sprite position, since it is already set correctly to the center of the RenderTexture * Fix RenderTexture tests due to RenderTexture internal sprite position being in middle of RendereTexture content size * Move setSprite method to protected access
1 parent 42f0ef4 commit c05e69a

File tree

6 files changed

+62
-63
lines changed

6 files changed

+62
-63
lines changed

core/2d/RenderTexture.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,9 @@ bool RenderTexture::initWithWidthAndHeight(int w,
232232
// retained
233233
setSprite(Sprite::createWithTexture(_texture2D));
234234

235+
_sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
236+
_sprite->setPosition(Vec2(w, h) / 2);
237+
235238
#if defined(AX_USE_GL)
236239
_sprite->setFlippedY(true);
237240
#endif
@@ -258,6 +261,24 @@ bool RenderTexture::initWithWidthAndHeight(int w,
258261
return ret;
259262
}
260263

264+
void RenderTexture::onEnter()
265+
{
266+
Node::onEnter();
267+
if (_sprite)
268+
{
269+
_sprite->onEnter();
270+
}
271+
}
272+
273+
void RenderTexture::onExit()
274+
{
275+
if (_sprite)
276+
{
277+
_sprite->onExit();
278+
}
279+
Node::onExit();
280+
}
281+
261282
void RenderTexture::setSprite(Sprite* sprite)
262283
{
263284
#if AX_ENABLE_GC_FOR_NATIVE_OBJECTS

core/2d/RenderTexture.h

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,6 @@ class AX_DLL RenderTexture : public Node
314314

315315
inline backend::RenderTarget* getRenderTarget() const { return _renderTarget; }
316316

317-
/** Sets the Sprite being used.
318-
*
319-
* @param sprite A Sprite.
320-
*/
321-
void setSprite(Sprite* sprite);
322-
323317
/** Flag: Use stack matrix computed from scene hierarchy or generate new modelView and projection matrix.
324318
*
325319
* @param keepMatrix Whether or not use stack matrix computed from scene hierarchy or generate new modelView and
@@ -379,7 +373,31 @@ class AX_DLL RenderTexture : public Node
379373
backend::PixelFormat depthStencilFormat,
380374
bool sharedRenderTarget = true);
381375

376+
/**
377+
* Event callback that is invoked every time when Node enters the 'stage'.
378+
* If the Node enters the 'stage' with a transition, this event is called when the transition starts.
379+
* During onEnter you can't access a "sister/brother" node.
380+
* If you override onEnter, you shall call its parent's one, e.g., Node::onEnter().
381+
* @lua NA
382+
*/
383+
void onEnter() override;
384+
385+
/**
386+
* Event callback that is invoked every time the Node leaves the 'stage'.
387+
* If the Node leaves the 'stage' with a transition, this event is called when the transition finishes.
388+
* During onExit you can't access a sibling node.
389+
* If you override onExit, you shall call its parent's one, e.g., Node::onExit().
390+
* @lua NA
391+
*/
392+
void onExit() override;
393+
382394
protected:
395+
/** Sets the Sprite being used.
396+
*
397+
* @param sprite A Sprite.
398+
*/
399+
void setSprite(Sprite* sprite);
400+
383401
virtual void
384402
beginWithClear(float r, float g, float b, float a, float depthValue, int stencilValue, ClearFlag flags);
385403
// renderer caches and callbacks

core/2d/Transition.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,7 +1129,6 @@ void TransitionCrossFade::onEnter()
11291129
return;
11301130
}
11311131

1132-
inTexture->getSprite()->setAnchorPoint(Vec2(0.5f, 0.5f));
11331132
inTexture->setPosition(size.width / 2, size.height / 2);
11341133
inTexture->setAnchorPoint(Vec2(0.5f, 0.5f));
11351134

@@ -1141,7 +1140,7 @@ void TransitionCrossFade::onEnter()
11411140
// create the second render texture for outScene
11421141
RenderTexture* outTexture =
11431142
RenderTexture::create((int)size.width, (int)size.height, backend::PixelFormat::RGBA8, PixelFormat::D24S8, false);
1144-
outTexture->getSprite()->setAnchorPoint(Vec2(0.5f, 0.5f));
1143+
11451144
outTexture->setPosition(size.width / 2, size.height / 2);
11461145
outTexture->setAnchorPoint(Vec2(0.5f, 0.5f));
11471146

extensions/scripting/lua-bindings/auto/axlua_base_auto.cpp

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -84131,56 +84131,6 @@ int lua_ax_base_RenderTexture_getRenderTarget(lua_State* tolua_S)
8413184131

8413284132
return 0;
8413384133
}
84134-
int lua_ax_base_RenderTexture_setSprite(lua_State* tolua_S)
84135-
{
84136-
int argc = 0;
84137-
ax::RenderTexture* cobj = nullptr;
84138-
bool ok = true;
84139-
84140-
#if _AX_DEBUG >= 1
84141-
tolua_Error tolua_err;
84142-
#endif
84143-
84144-
84145-
#if _AX_DEBUG >= 1
84146-
if (!tolua_isusertype(tolua_S,1,"ax.RenderTexture",0,&tolua_err)) goto tolua_lerror;
84147-
#endif
84148-
84149-
cobj = (ax::RenderTexture*)tolua_tousertype(tolua_S,1,0);
84150-
84151-
#if _AX_DEBUG >= 1
84152-
if (!cobj)
84153-
{
84154-
tolua_error(tolua_S,"invalid 'cobj' in function 'lua_ax_base_RenderTexture_setSprite'", nullptr);
84155-
return 0;
84156-
}
84157-
#endif
84158-
84159-
argc = lua_gettop(tolua_S)-1;
84160-
if (argc == 1)
84161-
{
84162-
ax::Sprite* arg0;
84163-
84164-
ok &= luaval_to_object<ax::Sprite>(tolua_S, 2, "ax.Sprite",&arg0, "ax.RenderTexture:setSprite");
84165-
if(!ok)
84166-
{
84167-
tolua_error(tolua_S,"invalid arguments in function 'lua_ax_base_RenderTexture_setSprite'", nullptr);
84168-
return 0;
84169-
}
84170-
cobj->setSprite(arg0);
84171-
lua_settop(tolua_S, 1);
84172-
return 1;
84173-
}
84174-
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ax.RenderTexture:setSprite",argc, 1);
84175-
return 0;
84176-
84177-
#if _AX_DEBUG >= 1
84178-
tolua_lerror:
84179-
tolua_error(tolua_S,"#ferror in function 'lua_ax_base_RenderTexture_setSprite'.",&tolua_err);
84180-
#endif
84181-
84182-
return 0;
84183-
}
8418484134
int lua_ax_base_RenderTexture_setKeepMatrix(lua_State* tolua_S)
8418584135
{
8418684136
int argc = 0;
@@ -84676,7 +84626,6 @@ int lua_register_ax_base_RenderTexture(lua_State* tolua_S)
8467684626
tolua_function(tolua_S,"setAutoDraw",lua_ax_base_RenderTexture_setAutoDraw);
8467784627
tolua_function(tolua_S,"getSprite",lua_ax_base_RenderTexture_getSprite);
8467884628
tolua_function(tolua_S,"getRenderTarget",lua_ax_base_RenderTexture_getRenderTarget);
84679-
tolua_function(tolua_S,"setSprite",lua_ax_base_RenderTexture_setSprite);
8468084629
tolua_function(tolua_S,"setKeepMatrix",lua_ax_base_RenderTexture_setKeepMatrix);
8468184630
tolua_function(tolua_S,"setVirtualViewport",lua_ax_base_RenderTexture_setVirtualViewport);
8468284631
tolua_function(tolua_S,"isSharedRenderTarget",lua_ax_base_RenderTexture_isSharedRenderTarget);

tests/cpp-tests/Source/RenderTextureTest/RenderTextureTest.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ RenderTextureSave::RenderTextureSave()
5151
_target = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA8);
5252
_target->retain();
5353
_target->setPosition(Vec2(s.width / 2, s.height / 2));
54+
_target->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
5455

5556
// note that the render texture is a Node, and contains a sprite of its texture for convenience,
5657
// so we can just parent it to the scene like any other Node
@@ -263,6 +264,7 @@ RenderTextureIssue937::RenderTextureIssue937()
263264
spr_nonpremulti->visit();
264265
rend->end();
265266

267+
rend->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
266268
rend->setPosition(Vec2(s.width / 2 + 16, s.height / 2));
267269

268270
addChild(spr_nonpremulti);
@@ -509,6 +511,7 @@ RenderTextureTestDepthStencil::RenderTextureTestDepthStencil()
509511
_rtx = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA4, PixelFormat::D24S8);
510512

511513
_rtx->setPosition(Vec2(s.width * 0.5f, s.height * 0.5f));
514+
_rtx->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
512515

513516
this->addChild(_rtx);
514517
}
@@ -613,15 +616,23 @@ RenderTextureTargetNode::RenderTextureTargetNode()
613616
auto s = Director::getInstance()->getWinSize();
614617

615618
/* Create the render texture */
616-
auto renderTexture = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA4);
617-
this->renderTexture = renderTexture;
619+
renderTexture = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA4);
618620

619621
renderTexture->setPosition(Vec2(s.width / 2, s.height / 2));
622+
renderTexture->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
620623
// renderTexture->setScale(2.0f);
621624

622625
/* add the sprites to the render texture */
626+
_spriteCenterPosition = renderTexture->getContentSize() / 2;
627+
628+
sprite1->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
629+
sprite1->setPosition(_spriteCenterPosition);
623630
renderTexture->addChild(sprite1);
631+
632+
sprite2->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
633+
sprite2->setPosition(_spriteCenterPosition);
624634
renderTexture->addChild(sprite2);
635+
625636
renderTexture->setClearColor(Color4F(0, 0, 0, 0));
626637
renderTexture->setClearFlags(ClearFlag::COLOR);
627638

@@ -658,8 +669,8 @@ void RenderTextureTargetNode::update(float dt)
658669
{
659670
static float time = 0;
660671
float r = 80;
661-
sprite1->setPosition(Vec2(cosf(time * 2) * r, sinf(time * 2) * r));
662-
sprite2->setPosition(Vec2(sinf(time * 2) * r, cosf(time * 2) * r));
672+
sprite1->setPosition(_spriteCenterPosition + Vec2(cosf(time * 2) * r, sinf(time * 2) * r));
673+
sprite2->setPosition(_spriteCenterPosition + Vec2(sinf(time * 2) * r, cosf(time * 2) * r));
663674

664675
time += dt;
665676
}

tests/cpp-tests/Source/RenderTextureTest/RenderTextureTest.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class RenderTextureTargetNode : public RenderTextureTest
121121
private:
122122
ax::Sprite *sprite1, *sprite2;
123123
ax::RenderTexture* renderTexture;
124+
ax::Vec2 _spriteCenterPosition;
124125

125126
public:
126127
CREATE_FUNC(RenderTextureTargetNode);

0 commit comments

Comments
 (0)