Merge pull request #16122 from ricardoquesada/issue_16100

testcase: add test case for issue #16100
This commit is contained in:
Ricardo Quesada 2016-07-26 23:21:25 -07:00 committed by GitHub
commit 4e278183ad
4 changed files with 86 additions and 8 deletions

View File

@ -1180,12 +1180,11 @@ uint32_t Node::processParentFlags(const Mat4& parentTransform, uint32_t parentFl
} }
} }
//remove this two line given that isVisitableByVisitingCamera should not affect the calculation of transform given that we are visiting scene // Fixes Github issue #16100. Basically when having two cameras, one camera might set as dirty the
//without involving view and projection matrix. // node that is not visited by it, and might affect certain calculations. Besides, it is faster to do this.
if (!isVisitableByVisitingCamera())
// if (!isVisitableByVisitingCamera()) return parentFlags;
// return parentFlags;
uint32_t flags = parentFlags; uint32_t flags = parentFlags;
flags |= (_transformUpdated ? FLAGS_TRANSFORM_DIRTY : 0); flags |= (_transformUpdated ? FLAGS_TRANSFORM_DIRTY : 0);
flags |= (_contentSizeDirty ? FLAGS_CONTENT_SIZE_DIRTY : 0); flags |= (_contentSizeDirty ? FLAGS_CONTENT_SIZE_DIRTY : 0);

View File

@ -651,14 +651,15 @@ void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
} }
#if CC_USE_CULLING #if CC_USE_CULLING
// Don't do calculate the culling if the transform was not updated // Don't calculate the culling if the transform was not updated
auto visitingCamera = Camera::getVisitingCamera(); auto visitingCamera = Camera::getVisitingCamera();
auto defaultCamera = Camera::getDefaultCamera(); auto defaultCamera = Camera::getDefaultCamera();
if (visitingCamera == defaultCamera) { if (visitingCamera == defaultCamera) {
_insideBounds = ((flags & FLAGS_TRANSFORM_DIRTY)|| visitingCamera->isViewProjectionUpdated()) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds; _insideBounds = ((flags & FLAGS_TRANSFORM_DIRTY) || visitingCamera->isViewProjectionUpdated()) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;
} }
else else
{ {
// XXX: this always return true since
_insideBounds = renderer->checkVisibility(transform, _contentSize); _insideBounds = renderer->checkVisibility(transform, _contentSize);
} }

View File

@ -71,6 +71,7 @@ CocosNodeTests::CocosNodeTests()
ADD_TEST_CASE(NodeNormalizedPositionTest2); ADD_TEST_CASE(NodeNormalizedPositionTest2);
ADD_TEST_CASE(NodeNormalizedPositionBugTest); ADD_TEST_CASE(NodeNormalizedPositionBugTest);
ADD_TEST_CASE(NodeNameTest); ADD_TEST_CASE(NodeNameTest);
ADD_TEST_CASE(Issue16100Test);
} }
TestCocosNodeDemo::TestCocosNodeDemo(void) TestCocosNodeDemo::TestCocosNodeDemo(void)
@ -1445,3 +1446,69 @@ void NodeNameTest::test(float dt)
auto findChildren = utils::findChildren(*parent, "node"); auto findChildren = utils::findChildren(*parent, "node");
CCAssert(findChildren.size() == 50, ""); CCAssert(findChildren.size() == 50, "");
} }
//------------------------------------------------------------------
//
// Issue16100Test
//
//------------------------------------------------------------------
void Issue16100Test::onEnter()
{
TestCocosNodeDemo::onEnter();
// create user camera
auto s = Director::getInstance()->getWinSize();
auto delay = DelayTime::create(0.1f);
auto f = CallFunc::create([this, s]()
{
auto camera = Camera::createOrthographic(s.width * 2, s.height * 2, -1024, 1024);
camera->setCameraFlag(CameraFlag::USER1);
addChild(camera);
});
this->runAction(Sequence::createWithTwoActions(delay, f));
// grossini using default camera
auto sprite = Sprite::create("Images/grossini.png");
this->addChild(sprite);
sprite->setPosition(-200,s.height/3);
auto moveby = MoveBy::create(2, Vec2(400,0));
auto movebyback = moveby->reverse();
auto seq = Sequence::create(moveby, movebyback, nullptr);
auto forever = RepeatForever::create(seq);
sprite->runAction(forever);
sprite->setCameraMask((int)CameraFlag::DEFAULT);
// grossini's sister using user camera
auto sister = Sprite::create("Images/grossinis_sister1.png");
this->addChild(sister);
sister->setPosition(-200,s.height*2/3);
auto moveby1 = MoveBy::create(2, Vec2(400,0));
auto movebyback1 = moveby1->reverse();
auto seq1 = Sequence::create(moveby1, movebyback1, nullptr);
auto forever1 = RepeatForever::create(seq1);
sister->runAction(forever1);
sister->setCameraMask((int)CameraFlag::USER1);
}
void Issue16100Test::onExit()
{
TestCocosNodeDemo::onExit();
}
std::string Issue16100Test::title() const
{
return "Issue 16100";
}
std::string Issue16100Test::subtitle() const
{
return "Sprite should appear on the screen";
}

View File

@ -330,4 +330,15 @@ public:
void test(float dt); void test(float dt);
}; };
class Issue16100Test : public TestCocosNodeDemo
{
public:
CREATE_FUNC(Issue16100Test);
virtual std::string title() const override;
virtual std::string subtitle() const override;
virtual void onEnter() override;
virtual void onExit() override;
};
#endif #endif