fixed #16894: RenderTexture does not support Sprite3D (#16909)

This commit is contained in:
James Chen 2016-11-28 09:50:54 +08:00 committed by minggo
parent fce13ba607
commit 0c06029532
3 changed files with 115 additions and 0 deletions

View File

@ -686,6 +686,7 @@ void RenderTexture::onClear()
GLfloat oldClearColor[4] = {0.0f};
GLfloat oldDepthClearValue = 0.0f;
GLint oldStencilClearValue = 0;
GLboolean oldDepthWrite = GL_FALSE;
// backup and set
if (_clearFlags & GL_COLOR_BUFFER_BIT)
@ -698,6 +699,9 @@ void RenderTexture::onClear()
{
glGetFloatv(GL_DEPTH_CLEAR_VALUE, &oldDepthClearValue);
glClearDepth(_clearDepth);
glGetBooleanv(GL_DEPTH_WRITEMASK, &oldDepthWrite);
glDepthMask(GL_TRUE);
}
if (_clearFlags & GL_STENCIL_BUFFER_BIT)
@ -717,6 +721,7 @@ void RenderTexture::onClear()
if (_clearFlags & GL_DEPTH_BUFFER_BIT)
{
glClearDepth(oldDepthClearValue);
glDepthMask(oldDepthWrite);
}
if (_clearFlags & GL_STENCIL_BUFFER_BIT)
{

View File

@ -13,6 +13,7 @@ RenderTextureTests::RenderTextureTests()
ADD_TEST_CASE(SpriteRenderTextureBug);
ADD_TEST_CASE(RenderTexturePartTest);
ADD_TEST_CASE(Issue16113Test);
ADD_TEST_CASE(RenderTextureWithSprite3DIssue16894);
};
/**
@ -735,3 +736,93 @@ std::string Issue16113Test::subtitle() const
{
return "aaa.png file without white border on iOS";
}
//
// RenderTextureWithSprite3DIssue16894
//
RenderTextureWithSprite3DIssue16894::RenderTextureWithSprite3DIssue16894()
{
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
for (int i = 0; i < 3; ++i)
{
// Ship - Model is from cocos2d-x test project
auto ship = Sprite3D::create("Sprite3DTest/boss.c3b");
ship->setScale(6);
ship->setRotation3D(Vec3(180,45,0));
ship->setPosition(Vec2(visibleSize.width/4 + origin.x, visibleSize.height/2 + origin.y));
ship->setForce2DQueue(true);
ship->retain();
if (i == 0)
{
addChild(ship, 1);
// Rotate Ship
auto spin = RotateBy::create(4, Vec3(0,180,0));
auto repeatspin = RepeatForever::create(spin);
ship->runAction(repeatspin);
}
_ship[i] = ship;
}
// RenderTextures
_renderTexDefault = RenderTexture::create(visibleSize.width, visibleSize.height, Texture2D::PixelFormat::RGBA8888);
_renderTexDefault->setKeepMatrix(true);
addChild(_renderTexDefault);
_renderTexDefault->setPosition(visibleSize.width/4 * 3, visibleSize.height/2);
_renderTexWithBuffer = RenderTexture::create(visibleSize.width, visibleSize.height, Texture2D::PixelFormat::RGBA8888, GL_DEPTH24_STENCIL8);
_renderTexWithBuffer->setKeepMatrix(true);
addChild(_renderTexWithBuffer);
_renderTexWithBuffer->setPosition(visibleSize.width/4 * 4, visibleSize.height/2);
// Update
scheduleUpdate();
auto label1 = Label::createWithTTF("Normal Sprite3D\n", "fonts/arial.ttf", 10);
label1->setPosition(Vec2(visibleSize.width/4 * 1, 60));
this->addChild(label1, 1);
auto label2 = Label::createWithTTF("RenderTexture\nDefault - No depth buffer", "fonts/arial.ttf", 10);
label2->setPosition(Vec2(visibleSize.width/4 * 2, 60));
this->addChild(label2, 1);
auto label3 = Label::createWithTTF("RenderTexture\nGL_DEPTH24_STENCIL8", "fonts/arial.ttf", 10);
label3->setPosition(Vec2(visibleSize.width/4 * 3, 60));
this->addChild(label3, 1);
}
RenderTextureWithSprite3DIssue16894::~RenderTextureWithSprite3DIssue16894()
{
for (int i = 0; i < 3; ++i)
{
_ship[i]->release();
}
}
void RenderTextureWithSprite3DIssue16894::visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags)
{
RenderTextureTest::visit(renderer, parentTransform, parentFlags);
_ship[1]->setRotation3D(_ship[0]->getRotation3D());
_ship[2]->setRotation3D(_ship[0]->getRotation3D());
_renderTexDefault->beginWithClear(0, 0, 0, 0, 0, 0);
_ship[1]->visit(Director::getInstance()->getRenderer(), Mat4::IDENTITY, 0);
_renderTexDefault->end();
_renderTexWithBuffer->beginWithClear(0, 0, 0, 0, 1, 0);
_ship[2]->visit(Director::getInstance()->getRenderer(), Mat4::IDENTITY, 0);
_renderTexWithBuffer->end();
}
std::string RenderTextureWithSprite3DIssue16894::title() const
{
return "Issue16894: Render Sprite3D to texture";
}
std::string RenderTextureWithSprite3DIssue16894::subtitle() const
{
return "3 ships, 1st & 3rd are the same";
}

View File

@ -155,4 +155,23 @@ private:
cocos2d::Sprite* _spriteDraw;
};
class RenderTextureWithSprite3DIssue16894 : public RenderTextureTest
{
public:
CREATE_FUNC(RenderTextureWithSprite3DIssue16894);
RenderTextureWithSprite3DIssue16894();
virtual ~RenderTextureWithSprite3DIssue16894();
virtual void visit(cocos2d::Renderer *renderer, const cocos2d::Mat4& parentTransform, uint32_t parentFlags) override;
virtual std::string title() const override;
virtual std::string subtitle() const override;
private:
cocos2d::Sprite3D* _ship[3];
cocos2d::RenderTexture* _renderTexDefault;
cocos2d::RenderTexture* _renderTexWithBuffer;
};
#endif