mirror of https://github.com/axmolengine/axmol.git
Merge pull request #13497 from pandamicro/camera
Add CCCameraBackgroundBrush
This commit is contained in:
commit
f3b7e027d6
|
@ -3603,6 +3603,10 @@
|
||||||
B6DD2FF61B04825B00E47F5F /* fastlz.c in Sources */ = {isa = PBXBuildFile; fileRef = B6DD2FA51B04825B00E47F5F /* fastlz.c */; };
|
B6DD2FF61B04825B00E47F5F /* fastlz.c in Sources */ = {isa = PBXBuildFile; fileRef = B6DD2FA51B04825B00E47F5F /* fastlz.c */; };
|
||||||
B6DD2FF71B04825B00E47F5F /* fastlz.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DD2FA61B04825B00E47F5F /* fastlz.h */; };
|
B6DD2FF71B04825B00E47F5F /* fastlz.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DD2FA61B04825B00E47F5F /* fastlz.h */; };
|
||||||
B6DD2FF81B04825B00E47F5F /* fastlz.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DD2FA61B04825B00E47F5F /* fastlz.h */; };
|
B6DD2FF81B04825B00E47F5F /* fastlz.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DD2FA61B04825B00E47F5F /* fastlz.h */; };
|
||||||
|
B6DD36D51B8564EC0044745A /* CCCameraBackgroundBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6DD36D31B8564EC0044745A /* CCCameraBackgroundBrush.cpp */; };
|
||||||
|
B6DD36D61B8564EC0044745A /* CCCameraBackgroundBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6DD36D31B8564EC0044745A /* CCCameraBackgroundBrush.cpp */; };
|
||||||
|
B6DD36D71B8564EC0044745A /* CCCameraBackgroundBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DD36D41B8564EC0044745A /* CCCameraBackgroundBrush.h */; };
|
||||||
|
B6DD36D81B8564EC0044745A /* CCCameraBackgroundBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DD36D41B8564EC0044745A /* CCCameraBackgroundBrush.h */; };
|
||||||
C50306691B60B583001E6D43 /* CCBoneNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50306631B60B583001E6D43 /* CCBoneNode.cpp */; };
|
C50306691B60B583001E6D43 /* CCBoneNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50306631B60B583001E6D43 /* CCBoneNode.cpp */; };
|
||||||
C503066A1B60B583001E6D43 /* CCBoneNode.h in Headers */ = {isa = PBXBuildFile; fileRef = C50306641B60B583001E6D43 /* CCBoneNode.h */; };
|
C503066A1B60B583001E6D43 /* CCBoneNode.h in Headers */ = {isa = PBXBuildFile; fileRef = C50306641B60B583001E6D43 /* CCBoneNode.h */; };
|
||||||
C503066B1B60B583001E6D43 /* CCSkeletonNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50306651B60B583001E6D43 /* CCSkeletonNode.cpp */; };
|
C503066B1B60B583001E6D43 /* CCSkeletonNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50306651B60B583001E6D43 /* CCSkeletonNode.cpp */; };
|
||||||
|
@ -5546,6 +5550,8 @@
|
||||||
B6DD2FA31B04825B00E47F5F /* DetourTileCacheBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetourTileCacheBuilder.h; sourceTree = "<group>"; };
|
B6DD2FA31B04825B00E47F5F /* DetourTileCacheBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetourTileCacheBuilder.h; sourceTree = "<group>"; };
|
||||||
B6DD2FA51B04825B00E47F5F /* fastlz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fastlz.c; sourceTree = "<group>"; };
|
B6DD2FA51B04825B00E47F5F /* fastlz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fastlz.c; sourceTree = "<group>"; };
|
||||||
B6DD2FA61B04825B00E47F5F /* fastlz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fastlz.h; sourceTree = "<group>"; };
|
B6DD2FA61B04825B00E47F5F /* fastlz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fastlz.h; sourceTree = "<group>"; };
|
||||||
|
B6DD36D31B8564EC0044745A /* CCCameraBackgroundBrush.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCCameraBackgroundBrush.cpp; sourceTree = "<group>"; };
|
||||||
|
B6DD36D41B8564EC0044745A /* CCCameraBackgroundBrush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCCameraBackgroundBrush.h; sourceTree = "<group>"; };
|
||||||
C50306631B60B583001E6D43 /* CCBoneNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCBoneNode.cpp; sourceTree = "<group>"; };
|
C50306631B60B583001E6D43 /* CCBoneNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCBoneNode.cpp; sourceTree = "<group>"; };
|
||||||
C50306641B60B583001E6D43 /* CCBoneNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCBoneNode.h; sourceTree = "<group>"; };
|
C50306641B60B583001E6D43 /* CCBoneNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCBoneNode.h; sourceTree = "<group>"; };
|
||||||
C50306651B60B583001E6D43 /* CCSkeletonNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCSkeletonNode.cpp; sourceTree = "<group>"; };
|
C50306651B60B583001E6D43 /* CCSkeletonNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCSkeletonNode.cpp; sourceTree = "<group>"; };
|
||||||
|
@ -7327,6 +7333,8 @@
|
||||||
46A169A11807B037005B8026 /* 2d */ = {
|
46A169A11807B037005B8026 /* 2d */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
B6DD36D31B8564EC0044745A /* CCCameraBackgroundBrush.cpp */,
|
||||||
|
B6DD36D41B8564EC0044745A /* CCCameraBackgroundBrush.h */,
|
||||||
3EACC99C19F5014D00EB3C5E /* CCCamera.cpp */,
|
3EACC99C19F5014D00EB3C5E /* CCCamera.cpp */,
|
||||||
3EACC99D19F5014D00EB3C5E /* CCCamera.h */,
|
3EACC99D19F5014D00EB3C5E /* CCCamera.h */,
|
||||||
3EACC99E19F5014D00EB3C5E /* CCLight.cpp */,
|
3EACC99E19F5014D00EB3C5E /* CCLight.cpp */,
|
||||||
|
@ -9330,6 +9338,7 @@
|
||||||
15AE1BDD19AAE01E00C27E9E /* CCControlUtils.h in Headers */,
|
15AE1BDD19AAE01E00C27E9E /* CCControlUtils.h in Headers */,
|
||||||
B6CAB3271AF9AA1A00B9B856 /* btGImpactBvh.h in Headers */,
|
B6CAB3271AF9AA1A00B9B856 /* btGImpactBvh.h in Headers */,
|
||||||
15AE198D19AAD36E00C27E9E /* CheckBoxReader.h in Headers */,
|
15AE198D19AAD36E00C27E9E /* CheckBoxReader.h in Headers */,
|
||||||
|
B6DD36D71B8564EC0044745A /* CCCameraBackgroundBrush.h in Headers */,
|
||||||
B29A7E0919EE1B7700872B35 /* AttachmentLoader.h in Headers */,
|
B29A7E0919EE1B7700872B35 /* AttachmentLoader.h in Headers */,
|
||||||
1A01C68818F57BE800EFE3A6 /* CCBool.h in Headers */,
|
1A01C68818F57BE800EFE3A6 /* CCBool.h in Headers */,
|
||||||
B29A7E3319EE1B7700872B35 /* SlotData.h in Headers */,
|
B29A7E3319EE1B7700872B35 /* SlotData.h in Headers */,
|
||||||
|
@ -10810,6 +10819,7 @@
|
||||||
B29A7DDA19EE1B7700872B35 /* SkeletonRenderer.h in Headers */,
|
B29A7DDA19EE1B7700872B35 /* SkeletonRenderer.h in Headers */,
|
||||||
15AE194119AAD35100C27E9E /* CCBone.h in Headers */,
|
15AE194119AAD35100C27E9E /* CCBone.h in Headers */,
|
||||||
D0FD035A1A3B51AA00825BB5 /* CCAllocatorStrategyDefault.h in Headers */,
|
D0FD035A1A3B51AA00825BB5 /* CCAllocatorStrategyDefault.h in Headers */,
|
||||||
|
B6DD36D81B8564EC0044745A /* CCCameraBackgroundBrush.h in Headers */,
|
||||||
50ABBD471925AB0000A911A9 /* CCVertex.h in Headers */,
|
50ABBD471925AB0000A911A9 /* CCVertex.h in Headers */,
|
||||||
B6CAB4D81AF9AA1A00B9B856 /* SpuLocalSupport.h in Headers */,
|
B6CAB4D81AF9AA1A00B9B856 /* SpuLocalSupport.h in Headers */,
|
||||||
B6CAB2921AF9AA1A00B9B856 /* btCollisionShape.h in Headers */,
|
B6CAB2921AF9AA1A00B9B856 /* btCollisionShape.h in Headers */,
|
||||||
|
@ -11041,6 +11051,7 @@
|
||||||
B6CAB2811AF9AA1A00B9B856 /* btBoxShape.cpp in Sources */,
|
B6CAB2811AF9AA1A00B9B856 /* btBoxShape.cpp in Sources */,
|
||||||
50ABBE311925AB6F00A911A9 /* CCConfiguration.cpp in Sources */,
|
50ABBE311925AB6F00A911A9 /* CCConfiguration.cpp in Sources */,
|
||||||
B665E3821AA80A6500DDB1C5 /* CCPUPathFollower.cpp in Sources */,
|
B665E3821AA80A6500DDB1C5 /* CCPUPathFollower.cpp in Sources */,
|
||||||
|
B6DD36D51B8564EC0044745A /* CCCameraBackgroundBrush.cpp in Sources */,
|
||||||
1A01C6A418F58F7500EFE3A6 /* CCNotificationCenter.cpp in Sources */,
|
1A01C6A418F58F7500EFE3A6 /* CCNotificationCenter.cpp in Sources */,
|
||||||
15AE1A5D19AAD40300C27E9E /* b2Body.cpp in Sources */,
|
15AE1A5D19AAD40300C27E9E /* b2Body.cpp in Sources */,
|
||||||
15AE1BDA19AAE01E00C27E9E /* CCControlSwitch.cpp in Sources */,
|
15AE1BDA19AAE01E00C27E9E /* CCControlSwitch.cpp in Sources */,
|
||||||
|
@ -12051,6 +12062,7 @@
|
||||||
3EACC9A519F5014D00EB3C5E /* CCLight.cpp in Sources */,
|
3EACC9A519F5014D00EB3C5E /* CCLight.cpp in Sources */,
|
||||||
15AE1B7A19AADA9A00C27E9E /* UIScrollView.cpp in Sources */,
|
15AE1B7A19AADA9A00C27E9E /* UIScrollView.cpp in Sources */,
|
||||||
1A570076180BC5A10088DEC7 /* CCActionGrid3D.cpp in Sources */,
|
1A570076180BC5A10088DEC7 /* CCActionGrid3D.cpp in Sources */,
|
||||||
|
B6DD36D61B8564EC0044745A /* CCCameraBackgroundBrush.cpp in Sources */,
|
||||||
B6CAB38C1AF9AA1A00B9B856 /* btPolyhedralContactClipping.cpp in Sources */,
|
B6CAB38C1AF9AA1A00B9B856 /* btPolyhedralContactClipping.cpp in Sources */,
|
||||||
B6CAB3A41AF9AA1A00B9B856 /* btConeTwistConstraint.cpp in Sources */,
|
B6CAB3A41AF9AA1A00B9B856 /* btConeTwistConstraint.cpp in Sources */,
|
||||||
15AE19B219AAD39700C27E9E /* SliderReader.cpp in Sources */,
|
15AE19B219AAD39700C27E9E /* SliderReader.cpp in Sources */,
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "2d/CCCamera.h"
|
#include "2d/CCCamera.h"
|
||||||
|
#include "2d/CCCameraBackgroundBrush.h"
|
||||||
#include "base/CCDirector.h"
|
#include "base/CCDirector.h"
|
||||||
#include "platform/CCGLView.h"
|
#include "platform/CCGLView.h"
|
||||||
#include "2d/CCScene.h"
|
#include "2d/CCScene.h"
|
||||||
|
@ -96,11 +97,14 @@ Camera::Camera()
|
||||||
, _fbo(nullptr)
|
, _fbo(nullptr)
|
||||||
{
|
{
|
||||||
_frustum.setClipZ(true);
|
_frustum.setClipZ(true);
|
||||||
|
_clearBrush = CameraBackgroundBrush::createDepthBrush(1.f);
|
||||||
|
_clearBrush->retain();
|
||||||
}
|
}
|
||||||
|
|
||||||
Camera::~Camera()
|
Camera::~Camera()
|
||||||
{
|
{
|
||||||
CC_SAFE_RELEASE_NULL(_fbo);
|
CC_SAFE_RELEASE_NULL(_fbo);
|
||||||
|
CC_SAFE_RELEASE(_clearBrush);
|
||||||
}
|
}
|
||||||
|
|
||||||
const Mat4& Camera::getProjectionMatrix() const
|
const Mat4& Camera::getProjectionMatrix() const
|
||||||
|
@ -398,86 +402,11 @@ void Camera::setScene(Scene* scene)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::clearBackground(float depth)
|
void Camera::clearBackground()
|
||||||
{
|
{
|
||||||
GLboolean oldDepthTest;
|
if (_clearBrush)
|
||||||
GLint oldDepthFunc;
|
|
||||||
GLboolean oldDepthMask;
|
|
||||||
{
|
{
|
||||||
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
_clearBrush->drawBackground(this);
|
||||||
glStencilMask(0);
|
|
||||||
|
|
||||||
oldDepthTest = glIsEnabled(GL_DEPTH_TEST);
|
|
||||||
glGetIntegerv(GL_DEPTH_FUNC, &oldDepthFunc);
|
|
||||||
glGetBooleanv(GL_DEPTH_WRITEMASK, &oldDepthMask);
|
|
||||||
|
|
||||||
glDepthMask(GL_TRUE);
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glDepthFunc(GL_ALWAYS);
|
|
||||||
}
|
|
||||||
|
|
||||||
//draw
|
|
||||||
static V3F_C4B_T2F_Quad quad;
|
|
||||||
quad.bl.vertices = Vec3(-1,-1,0);
|
|
||||||
quad.br.vertices = Vec3(1,-1,0);
|
|
||||||
quad.tl.vertices = Vec3(-1,1,0);
|
|
||||||
quad.tr.vertices = Vec3(1,1,0);
|
|
||||||
|
|
||||||
quad.bl.colors = quad.br.colors = quad.tl.colors = quad.tr.colors = Color4B(0,0,0,1);
|
|
||||||
|
|
||||||
quad.bl.texCoords = Tex2F(0,0);
|
|
||||||
quad.br.texCoords = Tex2F(1,0);
|
|
||||||
quad.tl.texCoords = Tex2F(0,1);
|
|
||||||
quad.tr.texCoords = Tex2F(1,1);
|
|
||||||
|
|
||||||
auto shader = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_CAMERA_CLEAR);
|
|
||||||
auto programState = GLProgramState::getOrCreateWithGLProgram(shader);
|
|
||||||
programState->setUniformFloat("depth", 1.0);
|
|
||||||
programState->apply(Mat4());
|
|
||||||
GLshort indices[6] = {0, 1, 2, 3, 2, 1};
|
|
||||||
|
|
||||||
{
|
|
||||||
GL::bindVAO(0);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX);
|
|
||||||
|
|
||||||
// vertices
|
|
||||||
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), &quad.tl.vertices);
|
|
||||||
|
|
||||||
// colors
|
|
||||||
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B_T2F), &quad.tl.colors);
|
|
||||||
|
|
||||||
// tex coords
|
|
||||||
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), &quad.tl.texCoords);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
||||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
if(GL_FALSE == oldDepthTest)
|
|
||||||
{
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
}
|
|
||||||
glDepthFunc(oldDepthFunc);
|
|
||||||
|
|
||||||
if(GL_FALSE == oldDepthMask)
|
|
||||||
{
|
|
||||||
glDepthMask(GL_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* IMPORTANT: We only need to update the states that are not restored.
|
|
||||||
Since we don't know what was the previous value of the mask, we update the RenderState
|
|
||||||
after setting it.
|
|
||||||
The other values don't need to be updated since they were restored to their original values
|
|
||||||
*/
|
|
||||||
glStencilMask(0xFFFFF);
|
|
||||||
// RenderState::StateBlock::_defaultState->setStencilWrite(0xFFFFF);
|
|
||||||
|
|
||||||
/* BUG: RenderState does not support glColorMask yet. */
|
|
||||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -545,4 +474,11 @@ void Camera::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t par
|
||||||
return Node::visit(renderer, parentTransform, parentFlags);
|
return Node::visit(renderer, parentTransform, parentFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::setBackgroundBrush(CameraBackgroundBrush* clearBrush)
|
||||||
|
{
|
||||||
|
CC_SAFE_RETAIN(clearBrush);
|
||||||
|
CC_SAFE_RELEASE(_clearBrush);
|
||||||
|
_clearBrush = clearBrush;
|
||||||
|
}
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
|
@ -36,6 +36,7 @@ THE SOFTWARE.
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
class Scene;
|
class Scene;
|
||||||
|
class CameraBackgroundBrush;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Note:
|
* Note:
|
||||||
|
@ -236,9 +237,9 @@ public:
|
||||||
*/
|
*/
|
||||||
static Camera* getDefaultCamera();
|
static Camera* getDefaultCamera();
|
||||||
/**
|
/**
|
||||||
Before rendering scene with this camera, the background need to be cleared.
|
Before rendering scene with this camera, the background need to be cleared. It clears the depth buffer with max depth by default. Use setBackgroundBrush to modify the default behavior
|
||||||
*/
|
*/
|
||||||
void clearBackground(float depth);
|
void clearBackground();
|
||||||
/**
|
/**
|
||||||
Apply the FBO, RenderTargets and viewport.
|
Apply the FBO, RenderTargets and viewport.
|
||||||
*/
|
*/
|
||||||
|
@ -258,6 +259,17 @@ public:
|
||||||
*/
|
*/
|
||||||
bool isViewProjectionUpdated() const {return _viewProjectionUpdated;}
|
bool isViewProjectionUpdated() const {return _viewProjectionUpdated;}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the background brush. See CameraBackgroundBrush for more information.
|
||||||
|
* @param clearBrush Brush used to clear the background
|
||||||
|
*/
|
||||||
|
void setBackgroundBrush(CameraBackgroundBrush* clearBrush);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get clear brush
|
||||||
|
*/
|
||||||
|
CameraBackgroundBrush* getBackgroundBrush() const { return _clearBrush; }
|
||||||
|
|
||||||
virtual void visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags) override;
|
virtual void visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags) override;
|
||||||
|
|
||||||
CC_CONSTRUCTOR_ACCESS:
|
CC_CONSTRUCTOR_ACCESS:
|
||||||
|
@ -300,6 +312,8 @@ protected:
|
||||||
int8_t _depth; //camera depth, the depth of camera with CameraFlag::DEFAULT flag is 0 by default, a camera with larger depth is drawn on top of camera with smaller detph
|
int8_t _depth; //camera depth, the depth of camera with CameraFlag::DEFAULT flag is 0 by default, a camera with larger depth is drawn on top of camera with smaller detph
|
||||||
static Camera* _visitingCamera;
|
static Camera* _visitingCamera;
|
||||||
|
|
||||||
|
CameraBackgroundBrush* _clearBrush; //brush used to clear the back ground
|
||||||
|
|
||||||
experimental::Viewport _viewport;
|
experimental::Viewport _viewport;
|
||||||
|
|
||||||
experimental::FrameBuffer* _fbo;
|
experimental::FrameBuffer* _fbo;
|
||||||
|
|
|
@ -0,0 +1,418 @@
|
||||||
|
/****************************************************************************
|
||||||
|
Copyright (c) 2015 Chukong Technologies Inc.
|
||||||
|
|
||||||
|
http://www.cocos2d-x.org
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
#include "2d/CCCameraBackgroundBrush.h"
|
||||||
|
#include "2d/CCCamera.h"
|
||||||
|
#include "base/ccMacros.h"
|
||||||
|
#include "base/CCConfiguration.h"
|
||||||
|
#include "base/CCDirector.h"
|
||||||
|
#include "renderer/ccGLStateCache.h"
|
||||||
|
#include "renderer/CCGLProgram.h"
|
||||||
|
#include "renderer/CCGLProgramCache.h"
|
||||||
|
#include "renderer/CCGLProgramState.h"
|
||||||
|
#include "renderer/CCRenderer.h"
|
||||||
|
#include "renderer/CCRenderState.h"
|
||||||
|
#include "3d/CCTextureCube.h"
|
||||||
|
|
||||||
|
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||||
|
#include "base/CCEventCustom.h"
|
||||||
|
#include "base/CCEventListenerCustom.h"
|
||||||
|
#include "base/CCEventType.h"
|
||||||
|
#include "base/CCEventDispatcher.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
CameraBackgroundBrush::CameraBackgroundBrush()
|
||||||
|
: _glProgramState(nullptr)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundBrush::~CameraBackgroundBrush()
|
||||||
|
{
|
||||||
|
CC_SAFE_RELEASE(_glProgramState);
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundBrush* CameraBackgroundBrush::createNoneBrush()
|
||||||
|
{
|
||||||
|
auto ret = new (std::nothrow) CameraBackgroundBrush();
|
||||||
|
ret->init();
|
||||||
|
|
||||||
|
ret->autorelease();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundColorBrush* CameraBackgroundBrush::createColorBrush(const Color4F& color, float depth)
|
||||||
|
{
|
||||||
|
return CameraBackgroundColorBrush::create(color, depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundDepthBrush* CameraBackgroundBrush::createDepthBrush(float depth)
|
||||||
|
{
|
||||||
|
return CameraBackgroundDepthBrush::create(depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundSkyBoxBrush* CameraBackgroundBrush::createSkyboxBrush(const std::string& positive_x, const std::string& negative_x, const std::string& positive_y, const std::string& negative_y, const std::string& positive_z, const std::string& negative_z)
|
||||||
|
{
|
||||||
|
return CameraBackgroundSkyBoxBrush::create(positive_x, negative_x, positive_y, negative_y, positive_z, negative_z);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CameraBackgroundDepthBrush::CameraBackgroundDepthBrush()
|
||||||
|
: _depth(0.f)
|
||||||
|
, _clearColor(GL_FALSE)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
CameraBackgroundDepthBrush::~CameraBackgroundDepthBrush()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundDepthBrush* CameraBackgroundDepthBrush::create(float depth)
|
||||||
|
{
|
||||||
|
auto ret = new (std::nothrow) CameraBackgroundDepthBrush();
|
||||||
|
ret->_depth = depth;
|
||||||
|
ret->init();
|
||||||
|
ret->autorelease();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CameraBackgroundDepthBrush::init()
|
||||||
|
{
|
||||||
|
auto shader = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_CAMERA_CLEAR);
|
||||||
|
_glProgramState = GLProgramState::getOrCreateWithGLProgram(shader);
|
||||||
|
_glProgramState->retain();
|
||||||
|
|
||||||
|
_quad.bl.vertices = Vec3(-1,-1,0);
|
||||||
|
_quad.br.vertices = Vec3(1,-1,0);
|
||||||
|
_quad.tl.vertices = Vec3(-1,1,0);
|
||||||
|
_quad.tr.vertices = Vec3(1,1,0);
|
||||||
|
|
||||||
|
_quad.bl.colors = _quad.br.colors = _quad.tl.colors = _quad.tr.colors = Color4B(0,0,0,1);
|
||||||
|
|
||||||
|
_quad.bl.texCoords = Tex2F(0,0);
|
||||||
|
_quad.br.texCoords = Tex2F(1,0);
|
||||||
|
_quad.tl.texCoords = Tex2F(0,1);
|
||||||
|
_quad.tr.texCoords = Tex2F(1,1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraBackgroundDepthBrush::drawBackground(Camera* camera)
|
||||||
|
{
|
||||||
|
GLboolean oldDepthTest;
|
||||||
|
GLint oldDepthFunc;
|
||||||
|
GLboolean oldDepthMask;
|
||||||
|
{
|
||||||
|
glColorMask(_clearColor, _clearColor, _clearColor, _clearColor);
|
||||||
|
glStencilMask(0);
|
||||||
|
|
||||||
|
oldDepthTest = glIsEnabled(GL_DEPTH_TEST);
|
||||||
|
glGetIntegerv(GL_DEPTH_FUNC, &oldDepthFunc);
|
||||||
|
glGetBooleanv(GL_DEPTH_WRITEMASK, &oldDepthMask);
|
||||||
|
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_ALWAYS);
|
||||||
|
}
|
||||||
|
|
||||||
|
//draw
|
||||||
|
|
||||||
|
_glProgramState->setUniformFloat("depth", _depth);
|
||||||
|
_glProgramState->apply(Mat4::IDENTITY);
|
||||||
|
GLshort indices[6] = {0, 1, 2, 3, 2, 1};
|
||||||
|
|
||||||
|
{
|
||||||
|
GL::bindVAO(0);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX);
|
||||||
|
|
||||||
|
// vertices
|
||||||
|
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), &_quad.tl.vertices);
|
||||||
|
|
||||||
|
// colors
|
||||||
|
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B_T2F), &_quad.tl.colors);
|
||||||
|
|
||||||
|
// tex coords
|
||||||
|
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), &_quad.tl.texCoords);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
if(GL_FALSE == oldDepthTest)
|
||||||
|
{
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
}
|
||||||
|
glDepthFunc(oldDepthFunc);
|
||||||
|
|
||||||
|
if(GL_FALSE == oldDepthMask)
|
||||||
|
{
|
||||||
|
glDepthMask(GL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IMPORTANT: We only need to update the states that are not restored.
|
||||||
|
Since we don't know what was the previous value of the mask, we update the RenderState
|
||||||
|
after setting it.
|
||||||
|
The other values don't need to be updated since they were restored to their original values
|
||||||
|
*/
|
||||||
|
glStencilMask(0xFFFFF);
|
||||||
|
// RenderState::StateBlock::_defaultState->setStencilWrite(0xFFFFF);
|
||||||
|
|
||||||
|
/* BUG: RenderState does not support glColorMask yet. */
|
||||||
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CameraBackgroundColorBrush::CameraBackgroundColorBrush()
|
||||||
|
: _color(0.f, 0.f, 0.f, 0.f)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundColorBrush::~CameraBackgroundColorBrush()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraBackgroundColorBrush::setColor(const Color4F& color)
|
||||||
|
{
|
||||||
|
_quad.bl.colors = _quad.br.colors = _quad.tl.colors = _quad.tr.colors = Color4B(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundColorBrush* CameraBackgroundColorBrush::create(const Color4F& color, float depth)
|
||||||
|
{
|
||||||
|
auto ret = new (std::nothrow) CameraBackgroundColorBrush();
|
||||||
|
ret->init();
|
||||||
|
ret->_clearColor = GL_TRUE;
|
||||||
|
ret->setColor(color);
|
||||||
|
ret->setDepth(depth);
|
||||||
|
|
||||||
|
ret->autorelease();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
CameraBackgroundSkyBoxBrush::CameraBackgroundSkyBoxBrush()
|
||||||
|
: _vao(0)
|
||||||
|
, _vertexBuffer(0)
|
||||||
|
, _indexBuffer(0)
|
||||||
|
, _texture(nullptr)
|
||||||
|
{
|
||||||
|
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||||
|
_backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED,
|
||||||
|
[this](EventCustom*)
|
||||||
|
{
|
||||||
|
initBuffer();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundSkyBoxBrush::~CameraBackgroundSkyBoxBrush()
|
||||||
|
{
|
||||||
|
CC_SAFE_RELEASE(_texture);
|
||||||
|
|
||||||
|
glDeleteBuffers(1, &_vertexBuffer);
|
||||||
|
glDeleteBuffers(1, &_indexBuffer);
|
||||||
|
|
||||||
|
_vertexBuffer = 0;
|
||||||
|
_indexBuffer = 0;
|
||||||
|
|
||||||
|
if (Configuration::getInstance()->supportsShareableVAO())
|
||||||
|
{
|
||||||
|
glDeleteVertexArrays(1, &_vao);
|
||||||
|
GL::bindVAO(0);
|
||||||
|
_vao = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundSkyBoxBrush* CameraBackgroundSkyBoxBrush::create(const std::string& positive_x, const std::string& negative_x, const std::string& positive_y, const std::string& negative_y, const std::string& positive_z, const std::string& negative_z)
|
||||||
|
{
|
||||||
|
auto texture = TextureCube::create(positive_x, negative_x, positive_y, negative_y, positive_z, negative_z);
|
||||||
|
if (texture == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
Texture2D::TexParams tRepeatParams;
|
||||||
|
tRepeatParams.magFilter = GL_LINEAR;
|
||||||
|
tRepeatParams.minFilter = GL_LINEAR;
|
||||||
|
tRepeatParams.wrapS = GL_CLAMP_TO_EDGE;
|
||||||
|
tRepeatParams.wrapT = GL_CLAMP_TO_EDGE;
|
||||||
|
texture->setTexParameters(tRepeatParams);
|
||||||
|
|
||||||
|
auto ret = new(std::nothrow)CameraBackgroundSkyBoxBrush();
|
||||||
|
|
||||||
|
ret->init();
|
||||||
|
ret->setTexture(texture);
|
||||||
|
|
||||||
|
ret->autorelease();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraBackgroundSkyBoxBrush* CameraBackgroundSkyBoxBrush::create()
|
||||||
|
{
|
||||||
|
auto ret = new(std::nothrow)CameraBackgroundSkyBoxBrush();
|
||||||
|
|
||||||
|
ret->init();
|
||||||
|
|
||||||
|
ret->autorelease();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraBackgroundSkyBoxBrush::drawBackground(Camera* camera)
|
||||||
|
{
|
||||||
|
Mat4 cameraModelMat = camera->getNodeToWorldTransform();
|
||||||
|
|
||||||
|
_glProgramState->apply(Mat4::IDENTITY);
|
||||||
|
|
||||||
|
Vec4 color(1.f, 1.f, 1.f, 1.f);
|
||||||
|
_glProgramState->setUniformVec4("u_color", color);
|
||||||
|
cameraModelMat.m[12] = cameraModelMat.m[13] = cameraModelMat.m[14] = 0;
|
||||||
|
_glProgramState->setUniformMat4("u_cameraRot", cameraModelMat);
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
RenderState::StateBlock::_defaultState->setDepthTest(true);
|
||||||
|
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
RenderState::StateBlock::_defaultState->setDepthFunction(RenderState::DEPTH_LEQUAL);
|
||||||
|
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
RenderState::StateBlock::_defaultState->setCullFace(true);
|
||||||
|
|
||||||
|
glCullFace(GL_BACK);
|
||||||
|
RenderState::StateBlock::_defaultState->setCullFaceSide(RenderState::CULL_FACE_SIDE_BACK);
|
||||||
|
|
||||||
|
if (Configuration::getInstance()->supportsShareableVAO())
|
||||||
|
{
|
||||||
|
GL::bindVAO(_vao);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||||
|
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3), nullptr);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
glDrawElements(GL_TRIANGLES, (GLsizei)36, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
|
||||||
|
if (Configuration::getInstance()->supportsShareableVAO())
|
||||||
|
{
|
||||||
|
GL::bindVAO(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, 8);
|
||||||
|
|
||||||
|
CHECK_GL_ERROR_DEBUG();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CameraBackgroundSkyBoxBrush::init()
|
||||||
|
{
|
||||||
|
auto shader = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_SKYBOX);
|
||||||
|
_glProgramState = GLProgramState::create(shader);
|
||||||
|
_glProgramState->setVertexAttribPointer(GLProgram::ATTRIBUTE_NAME_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3), nullptr);
|
||||||
|
_glProgramState->retain();
|
||||||
|
|
||||||
|
initBuffer();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraBackgroundSkyBoxBrush::initBuffer()
|
||||||
|
{
|
||||||
|
if (_vertexBuffer)
|
||||||
|
glDeleteBuffers(1, &_vertexBuffer);
|
||||||
|
if (_indexBuffer)
|
||||||
|
glDeleteBuffers(1, &_indexBuffer);
|
||||||
|
|
||||||
|
if (Configuration::getInstance()->supportsShareableVAO() && _vao)
|
||||||
|
{
|
||||||
|
glDeleteVertexArrays(1, &_vao);
|
||||||
|
GL::bindVAO(0);
|
||||||
|
_vao = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Configuration::getInstance()->supportsShareableVAO())
|
||||||
|
{
|
||||||
|
glGenVertexArrays(1, &_vao);
|
||||||
|
GL::bindVAO(_vao);
|
||||||
|
}
|
||||||
|
|
||||||
|
// init vertex buffer object
|
||||||
|
Vec3 vexBuf[] =
|
||||||
|
{
|
||||||
|
Vec3(1, -1, 1), Vec3(1, 1, 1), Vec3(-1, 1, 1), Vec3(-1, -1, 1),
|
||||||
|
Vec3(1, -1, -1), Vec3(1, 1, -1), Vec3(-1, 1, -1), Vec3(-1, -1, -1)
|
||||||
|
};
|
||||||
|
|
||||||
|
glGenBuffers(1, &_vertexBuffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vexBuf), vexBuf, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// init index buffer object
|
||||||
|
const unsigned char idxBuf[] = { 2, 1, 0, 3, 2, 0, // font
|
||||||
|
1, 5, 4, 1, 4, 0, // right
|
||||||
|
4, 5, 6, 4, 6, 7, // back
|
||||||
|
7, 6, 2, 7, 2, 3, // left
|
||||||
|
2, 6, 5, 2, 5, 1, // up
|
||||||
|
3, 0, 4, 3, 4, 7 // down
|
||||||
|
};
|
||||||
|
|
||||||
|
glGenBuffers(1, &_indexBuffer);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(idxBuf), idxBuf, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
if (Configuration::getInstance()->supportsShareableVAO())
|
||||||
|
{
|
||||||
|
glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION);
|
||||||
|
_glProgramState->applyAttributes(false);
|
||||||
|
|
||||||
|
GL::bindVAO(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraBackgroundSkyBoxBrush::setTexture(TextureCube* texture)
|
||||||
|
{
|
||||||
|
CC_SAFE_RETAIN(texture);
|
||||||
|
CC_SAFE_RELEASE(_texture);
|
||||||
|
_texture = texture;
|
||||||
|
_glProgramState->setUniformTexture("u_Env", _texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_CC_END
|
|
@ -0,0 +1,263 @@
|
||||||
|
/****************************************************************************
|
||||||
|
Copyright (c) 2015 Chukong Technologies Inc.
|
||||||
|
|
||||||
|
http://www.cocos2d-x.org
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef _CCCAMERA_BACKGROUND_BRUSH_H__
|
||||||
|
#define _CCCAMERA_BACKGROUND_BRUSH_H__
|
||||||
|
|
||||||
|
#include "base/ccTypes.h"
|
||||||
|
#include "base/CCRef.h"
|
||||||
|
#include "3d/CCFrustum.h"
|
||||||
|
#include "renderer/CCQuadCommand.h"
|
||||||
|
#include "renderer/CCCustomCommand.h"
|
||||||
|
#include "renderer/CCFrameBuffer.h"
|
||||||
|
|
||||||
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
class CameraBackgroundColorBrush;
|
||||||
|
class CameraBackgroundDepthBrush;
|
||||||
|
class CameraBackgroundSkyBoxBrush;
|
||||||
|
|
||||||
|
class GLProgramState;
|
||||||
|
class Camera;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines a brush to clear the background of camera.
|
||||||
|
* There are 4 types of brush. None brush do nothing, Depth brush clear background with given depth, Color brush clear background with given color and depth, Skybox brush clear the background with a skybox. Camera uses depth brush by default.
|
||||||
|
*/
|
||||||
|
class CC_DLL CameraBackgroundBrush : public Ref
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Brush types. There are 4 types of brush. See CameraBackgroundDepthBrush, CameraBackgroundColorBrush, CameraBackgroundSkyBoxBrush for more information.
|
||||||
|
*/
|
||||||
|
enum class BrushType
|
||||||
|
{
|
||||||
|
NONE, //none brush
|
||||||
|
DEPTH, // depth brush. See CameraBackgroundDepthBrush
|
||||||
|
COLOR, // color brush. See CameraBackgroundColorBrush
|
||||||
|
SKYBOX, // skybox brush. See CameraBackgroundSkyBoxBrush
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get brush type
|
||||||
|
* @return BrushType
|
||||||
|
*/
|
||||||
|
virtual BrushType getBrushType() const { return BrushType::NONE; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a none brush, it does nothing when clear the background
|
||||||
|
* @return Created brush.
|
||||||
|
*/
|
||||||
|
static CameraBackgroundBrush* createNoneBrush();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a depth brush, which clears depth buffer with a given depth.
|
||||||
|
* @param depth Depth used to clear depth buffer
|
||||||
|
* @return Created brush
|
||||||
|
*/
|
||||||
|
static CameraBackgroundDepthBrush* createDepthBrush(float depth = 1.f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a color brush
|
||||||
|
* @param color Color of brush
|
||||||
|
* @param depth Depth used to clear depth buffer
|
||||||
|
* @return Created brush
|
||||||
|
*/
|
||||||
|
static CameraBackgroundColorBrush* createColorBrush(const Color4F& color, float depth);
|
||||||
|
|
||||||
|
|
||||||
|
/** Creates a Skybox brush with 6 textures.
|
||||||
|
@param positive_x texture for the right side of the texture cube face.
|
||||||
|
@param negative_x texture for the up side of the texture cube face.
|
||||||
|
@param positive_y texture for the top side of the texture cube face
|
||||||
|
@param negative_y texture for the bottom side of the texture cube face
|
||||||
|
@param positive_z texture for the forward side of the texture cube face.
|
||||||
|
@param negative_z texture for the rear side of the texture cube face.
|
||||||
|
@return A new brush inited with given parameters.
|
||||||
|
*/
|
||||||
|
static CameraBackgroundSkyBoxBrush* createSkyboxBrush(const std::string& positive_x, const std::string& negative_x,
|
||||||
|
const std::string& positive_y, const std::string& negative_y,
|
||||||
|
const std::string& positive_z, const std::string& negative_z);
|
||||||
|
/**
|
||||||
|
* draw the background
|
||||||
|
*/
|
||||||
|
virtual void drawBackground(Camera* camera) {}
|
||||||
|
|
||||||
|
CC_CONSTRUCTOR_ACCESS:
|
||||||
|
CameraBackgroundBrush();
|
||||||
|
virtual ~CameraBackgroundBrush();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool init() { return true; }
|
||||||
|
|
||||||
|
GLProgramState* _glProgramState;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Depth brush clear depth buffer with given depth
|
||||||
|
*/
|
||||||
|
class CC_DLL CameraBackgroundDepthBrush : public CameraBackgroundBrush
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Create a depth brush
|
||||||
|
* @param depth Depth used to clear the depth buffer
|
||||||
|
* @return Created brush
|
||||||
|
*/
|
||||||
|
static CameraBackgroundDepthBrush* create(float depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get brush type. Should be BrushType::DEPTH
|
||||||
|
* @return brush type
|
||||||
|
*/
|
||||||
|
virtual BrushType getBrushType() const override { return BrushType::DEPTH; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw background
|
||||||
|
*/
|
||||||
|
virtual void drawBackground(Camera* camera) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set depth
|
||||||
|
* @param depth Depth used to clear depth buffer
|
||||||
|
*/
|
||||||
|
void setDepth(float depth) { _depth = depth; }
|
||||||
|
|
||||||
|
CC_CONSTRUCTOR_ACCESS:
|
||||||
|
CameraBackgroundDepthBrush();
|
||||||
|
virtual ~CameraBackgroundDepthBrush();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool init() override;
|
||||||
|
|
||||||
|
float _depth;
|
||||||
|
|
||||||
|
GLboolean _clearColor;
|
||||||
|
|
||||||
|
V3F_C4B_T2F_Quad _quad;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Color brush clear buffer with given depth and color
|
||||||
|
*/
|
||||||
|
class CC_DLL CameraBackgroundColorBrush : public CameraBackgroundDepthBrush
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Get brush type. Should be BrushType::COLOR
|
||||||
|
* @return brush type
|
||||||
|
*/
|
||||||
|
virtual BrushType getBrushType() const override { return BrushType::COLOR; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a color brush
|
||||||
|
* @param color Color used to clear the color buffer
|
||||||
|
* @param depth Depth used to clear the depth buffer
|
||||||
|
* @return Created brush
|
||||||
|
*/
|
||||||
|
static CameraBackgroundColorBrush* create(const Color4F& color, float depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set clear color
|
||||||
|
* @param color Color used to clear the color buffer
|
||||||
|
*/
|
||||||
|
void setColor(const Color4F& color);
|
||||||
|
|
||||||
|
CC_CONSTRUCTOR_ACCESS:
|
||||||
|
CameraBackgroundColorBrush();
|
||||||
|
virtual ~CameraBackgroundColorBrush();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
Color4F _color;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TextureCube;
|
||||||
|
class GLProgramState;
|
||||||
|
class EventListenerCustom;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skybox brush clear buffer with a skybox
|
||||||
|
*/
|
||||||
|
class CC_DLL CameraBackgroundSkyBoxBrush : public CameraBackgroundBrush
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Get brush type. Should be BrushType::SKYBOX
|
||||||
|
* @return brush type
|
||||||
|
*/
|
||||||
|
virtual BrushType getBrushType() const override { return BrushType::SKYBOX; }
|
||||||
|
|
||||||
|
/** Creates a Skybox brush with 6 textures.
|
||||||
|
@param positive_x texture for the right side of the texture cube face.
|
||||||
|
@param negative_x texture for the up side of the texture cube face.
|
||||||
|
@param positive_y texture for the top side of the texture cube face
|
||||||
|
@param negative_y texture for the bottom side of the texture cube face
|
||||||
|
@param positive_z texture for the forward side of the texture cube face.
|
||||||
|
@param negative_z texture for the rear side of the texture cube face.
|
||||||
|
@return A new brush inited with given parameters.
|
||||||
|
*/
|
||||||
|
static CameraBackgroundSkyBoxBrush* create(const std::string& positive_x, const std::string& negative_x,
|
||||||
|
const std::string& positive_y, const std::string& negative_y,
|
||||||
|
const std::string& positive_z, const std::string& negative_z);
|
||||||
|
|
||||||
|
/** Creates a Skybox brush with 6 textures.
|
||||||
|
*/
|
||||||
|
static CameraBackgroundSkyBoxBrush* create();
|
||||||
|
/**
|
||||||
|
* Set skybox texutre
|
||||||
|
* @param texture Skybox texture
|
||||||
|
*/
|
||||||
|
void setTexture(TextureCube* texture);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw background
|
||||||
|
*/
|
||||||
|
virtual void drawBackground(Camera* camera) override;
|
||||||
|
|
||||||
|
CC_CONSTRUCTOR_ACCESS:
|
||||||
|
CameraBackgroundSkyBoxBrush();
|
||||||
|
virtual ~CameraBackgroundSkyBoxBrush();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init Skybox.
|
||||||
|
*/
|
||||||
|
virtual bool init() override;
|
||||||
|
|
||||||
|
void initBuffer();
|
||||||
|
|
||||||
|
GLuint _vao;
|
||||||
|
GLuint _vertexBuffer;
|
||||||
|
GLuint _indexBuffer;
|
||||||
|
|
||||||
|
TextureCube* _texture;
|
||||||
|
|
||||||
|
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||||
|
EventListenerCustom* _backToForegroundListener;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
NS_CC_END
|
||||||
|
|
||||||
|
#endif// _CCCAMERA_BACKGROUND_BRUSH_H__
|
|
@ -194,7 +194,7 @@ void Scene::render(Renderer* renderer)
|
||||||
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());
|
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());
|
||||||
camera->apply();
|
camera->apply();
|
||||||
//clear background with max depth
|
//clear background with max depth
|
||||||
camera->clearBackground(1.0);
|
camera->clearBackground();
|
||||||
//visit the scene
|
//visit the scene
|
||||||
visit(renderer, transform, 0);
|
visit(renderer, transform, 0);
|
||||||
#if CC_USE_NAVMESH
|
#if CC_USE_NAVMESH
|
||||||
|
|
|
@ -24,6 +24,7 @@ set(COCOS_2D_SRC
|
||||||
2d/CCAnimation.cpp
|
2d/CCAnimation.cpp
|
||||||
2d/CCAtlasNode.cpp
|
2d/CCAtlasNode.cpp
|
||||||
2d/CCCamera.cpp
|
2d/CCCamera.cpp
|
||||||
|
2d/CCCameraBackgroundBrush.cpp
|
||||||
2d/CCClippingNode.cpp
|
2d/CCClippingNode.cpp
|
||||||
2d/CCClippingRectangleNode.cpp
|
2d/CCClippingRectangleNode.cpp
|
||||||
2d/CCComponentContainer.cpp
|
2d/CCComponentContainer.cpp
|
||||||
|
|
|
@ -681,6 +681,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.*
|
||||||
<ClCompile Include="CCAtlasNode.cpp" />
|
<ClCompile Include="CCAtlasNode.cpp" />
|
||||||
<ClCompile Include="CCAutoPolygon.cpp" />
|
<ClCompile Include="CCAutoPolygon.cpp" />
|
||||||
<ClCompile Include="CCCamera.cpp" />
|
<ClCompile Include="CCCamera.cpp" />
|
||||||
|
<ClCompile Include="CCCameraBackgroundBrush.cpp" />
|
||||||
<ClCompile Include="CCClippingNode.cpp" />
|
<ClCompile Include="CCClippingNode.cpp" />
|
||||||
<ClCompile Include="CCClippingRectangleNode.cpp" />
|
<ClCompile Include="CCClippingRectangleNode.cpp" />
|
||||||
<ClCompile Include="CCComponent.cpp" />
|
<ClCompile Include="CCComponent.cpp" />
|
||||||
|
@ -1296,6 +1297,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.*
|
||||||
<ClInclude Include="CCAtlasNode.h" />
|
<ClInclude Include="CCAtlasNode.h" />
|
||||||
<ClInclude Include="CCAutoPolygon.h" />
|
<ClInclude Include="CCAutoPolygon.h" />
|
||||||
<ClInclude Include="CCCamera.h" />
|
<ClInclude Include="CCCamera.h" />
|
||||||
|
<ClInclude Include="CCCameraBackgroundBrush.h" />
|
||||||
<ClInclude Include="CCClippingNode.h" />
|
<ClInclude Include="CCClippingNode.h" />
|
||||||
<ClInclude Include="CCClippingRectangleNode.h" />
|
<ClInclude Include="CCClippingRectangleNode.h" />
|
||||||
<ClInclude Include="CCComponent.h" />
|
<ClInclude Include="CCComponent.h" />
|
||||||
|
|
|
@ -1931,6 +1931,9 @@
|
||||||
<ClCompile Include="..\network\CCDownloaderImpl.cpp">
|
<ClCompile Include="..\network\CCDownloaderImpl.cpp">
|
||||||
<Filter>network\Source Files</Filter>
|
<Filter>network\Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="CCCameraBackgroundBrush.cpp">
|
||||||
|
<Filter>2d</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\physics\CCPhysicsBody.h">
|
<ClInclude Include="..\physics\CCPhysicsBody.h">
|
||||||
|
@ -3765,6 +3768,9 @@
|
||||||
<ClInclude Include="..\network\CCIDownloaderImpl.h">
|
<ClInclude Include="..\network\CCIDownloaderImpl.h">
|
||||||
<Filter>network\Header Files</Filter>
|
<Filter>network\Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="CCCameraBackgroundBrush.h">
|
||||||
|
<Filter>2d</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\math\Mat4.inl">
|
<None Include="..\math\Mat4.inl">
|
||||||
|
|
|
@ -584,6 +584,7 @@
|
||||||
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCAtlasNode.h" />
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCAtlasNode.h" />
|
||||||
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCAutoPolygon.h" />
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCAutoPolygon.h" />
|
||||||
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCCamera.h" />
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCCamera.h" />
|
||||||
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCCameraBackgroundBrush.h" />
|
||||||
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingNode.h" />
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingNode.h" />
|
||||||
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingRectangleNode.h" />
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingRectangleNode.h" />
|
||||||
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCComponent.h" />
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCComponent.h" />
|
||||||
|
@ -1178,6 +1179,7 @@
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCAtlasNode.cpp" />
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCAtlasNode.cpp" />
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCAutoPolygon.cpp" />
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCAutoPolygon.cpp" />
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCCamera.cpp" />
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCCamera.cpp" />
|
||||||
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCCameraBackgroundBrush.cpp" />
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingNode.cpp" />
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingNode.cpp" />
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingRectangleNode.cpp" />
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCClippingRectangleNode.cpp" />
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCComponent.cpp" />
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCComponent.cpp" />
|
||||||
|
|
|
@ -1867,6 +1867,9 @@
|
||||||
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\..\editor-support\cocostudio\WidgetReader\GameNode3DReader\GameNode3DReader.h">
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\..\editor-support\cocostudio\WidgetReader\GameNode3DReader\GameNode3DReader.h">
|
||||||
<Filter>cocostudio\reader\WidgetReader\GameNodeDReader</Filter>
|
<Filter>cocostudio\reader\WidgetReader\GameNodeDReader</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\CCCameraBackgroundBrush.h">
|
||||||
|
<Filter>2d</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\..\cocos2d.cpp">
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\..\cocos2d.cpp">
|
||||||
|
@ -3564,6 +3567,9 @@
|
||||||
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\..\editor-support\cocostudio\WidgetReader\GameNode3DReader\GameNode3DReader.cpp">
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\..\editor-support\cocostudio\WidgetReader\GameNode3DReader\GameNode3DReader.cpp">
|
||||||
<Filter>cocostudio\reader\WidgetReader\GameNodeDReader</Filter>
|
<Filter>cocostudio\reader\WidgetReader\GameNodeDReader</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\CCCameraBackgroundBrush.cpp">
|
||||||
|
<Filter>2d</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="2d">
|
<Filter Include="2d">
|
||||||
|
|
|
@ -35,6 +35,7 @@ cocos2d.cpp \
|
||||||
2d/CCAnimationCache.cpp \
|
2d/CCAnimationCache.cpp \
|
||||||
2d/CCAtlasNode.cpp \
|
2d/CCAtlasNode.cpp \
|
||||||
2d/CCCamera.cpp \
|
2d/CCCamera.cpp \
|
||||||
|
2d/CCCameraBackgroundBrush.cpp \
|
||||||
2d/CCClippingNode.cpp \
|
2d/CCClippingNode.cpp \
|
||||||
2d/CCClippingRectangleNode.cpp \
|
2d/CCClippingRectangleNode.cpp \
|
||||||
2d/CCComponent.cpp \
|
2d/CCComponent.cpp \
|
||||||
|
|
|
@ -138,6 +138,7 @@ THE SOFTWARE.
|
||||||
|
|
||||||
// 2d utils
|
// 2d utils
|
||||||
#include "2d/CCCamera.h"
|
#include "2d/CCCamera.h"
|
||||||
|
#include "2d/CCCameraBackgroundBrush.h"
|
||||||
#include "2d/CCGrabber.h"
|
#include "2d/CCGrabber.h"
|
||||||
#include "2d/CCGrid.h"
|
#include "2d/CCGrid.h"
|
||||||
#include "2d/CCLight.h"
|
#include "2d/CCLight.h"
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
#include "Sprite3DTest.h"
|
#include "Sprite3DTest.h"
|
||||||
#include "DrawNode3D.h"
|
#include "DrawNode3D.h"
|
||||||
|
#include "2d/CCCameraBackgroundBrush.h"
|
||||||
|
|
||||||
#include "extensions/Particle3D/PU/CCPUParticleSystem3D.h"
|
#include "extensions/Particle3D/PU/CCPUParticleSystem3D.h"
|
||||||
|
|
||||||
|
@ -61,6 +62,7 @@ Sprite3DTests::Sprite3DTests()
|
||||||
ADD_TEST_CASE(Sprite3DClippingTest);
|
ADD_TEST_CASE(Sprite3DClippingTest);
|
||||||
ADD_TEST_CASE(Sprite3DTestMeshLight);
|
ADD_TEST_CASE(Sprite3DTestMeshLight);
|
||||||
ADD_TEST_CASE(Animate3DCallbackTest);
|
ADD_TEST_CASE(Animate3DCallbackTest);
|
||||||
|
ADD_TEST_CASE(CameraBackgroundClearTest);
|
||||||
};
|
};
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
@ -2720,3 +2722,66 @@ std::string Sprite3DTestMeshLight::subtitle() const
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CameraBackgroundClearTest::CameraBackgroundClearTest()
|
||||||
|
{
|
||||||
|
TTFConfig ttfConfig("fonts/arial.ttf", 20);
|
||||||
|
auto label1 = Label::createWithTTF(ttfConfig,"Clear Mode");
|
||||||
|
auto item1 = MenuItemLabel::create(label1,CC_CALLBACK_1(CameraBackgroundClearTest::switch_CameraClearMode,this) );
|
||||||
|
|
||||||
|
item1->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*4 ) );
|
||||||
|
|
||||||
|
auto pMenu1 = Menu::create(item1, nullptr);
|
||||||
|
pMenu1->setPosition(Vec2(0,0));
|
||||||
|
this->addChild(pMenu1, 10);
|
||||||
|
|
||||||
|
//setup camera
|
||||||
|
auto s = Director::getInstance()->getWinSize();
|
||||||
|
_camera = Camera::createPerspective(40, s.width / s.height, 0.01f, 1000.f);
|
||||||
|
_camera->setCameraFlag(CameraFlag::USER1);
|
||||||
|
_camera->setPosition3D(Vec3(0.f, 30.f, 100.f));
|
||||||
|
_camera->lookAt(Vec3(0.f, 0.f, 0.f));
|
||||||
|
addChild(_camera);
|
||||||
|
|
||||||
|
auto sprite = Sprite3D::create("Sprite3DTest/orc.c3b");
|
||||||
|
addChild(sprite);
|
||||||
|
sprite->setCameraMask(2);
|
||||||
|
|
||||||
|
_label = Label::createWithTTF(ttfConfig, "Depth Clear Brush");
|
||||||
|
addChild(_label);
|
||||||
|
_label->setPosition(s.width / 2.f , VisibleRect::top().y * 0.8f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraBackgroundClearTest::switch_CameraClearMode(cocos2d::Ref* sender)
|
||||||
|
{
|
||||||
|
auto type = _camera->getBackgroundBrush()->getBrushType();
|
||||||
|
if (type == CameraBackgroundBrush::BrushType::NONE)
|
||||||
|
{
|
||||||
|
_camera->setBackgroundBrush(CameraBackgroundBrush::createDepthBrush(1.f));
|
||||||
|
_label->setString("Depth Clear Brush");
|
||||||
|
}
|
||||||
|
else if (type == CameraBackgroundBrush::BrushType::DEPTH)
|
||||||
|
{
|
||||||
|
_camera->setBackgroundBrush(CameraBackgroundBrush::createColorBrush(Color4F(1.f, 0.f, 0.f, 1.f), 1.f));
|
||||||
|
_label->setString("Color Clear Brush");
|
||||||
|
}
|
||||||
|
else if (type == CameraBackgroundBrush::BrushType::COLOR)
|
||||||
|
{
|
||||||
|
_camera->setBackgroundBrush(CameraBackgroundBrush::createSkyboxBrush("Sprite3DTest/skybox/left.jpg", "Sprite3DTest/skybox/right.jpg","Sprite3DTest/skybox/top.jpg", "Sprite3DTest/skybox/bottom.jpg","Sprite3DTest/skybox/front.jpg", "Sprite3DTest/skybox/back.jpg"));
|
||||||
|
_label->setString("Skybox Clear Brush");
|
||||||
|
}
|
||||||
|
else if (type == CameraBackgroundBrush::BrushType::SKYBOX)
|
||||||
|
{
|
||||||
|
_camera->setBackgroundBrush(CameraBackgroundBrush::createNoneBrush());
|
||||||
|
_label->setString("None Clear Brush");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CameraBackgroundClearTest::title() const
|
||||||
|
{
|
||||||
|
return "Camera Background Clear Brush";
|
||||||
|
}
|
||||||
|
std::string CameraBackgroundClearTest::subtitle() const
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
|
@ -592,4 +592,18 @@ protected:
|
||||||
cocos2d::Sprite3D* _sprite;
|
cocos2d::Sprite3D* _sprite;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CameraBackgroundClearTest : public Sprite3DTestDemo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CREATE_FUNC(CameraBackgroundClearTest);
|
||||||
|
CameraBackgroundClearTest();
|
||||||
|
virtual std::string title() const override;
|
||||||
|
virtual std::string subtitle() const override;
|
||||||
|
|
||||||
|
void switch_CameraClearMode(cocos2d::Ref* sender);
|
||||||
|
protected:
|
||||||
|
cocos2d::Camera* _camera;
|
||||||
|
cocos2d::Label* _label;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue