mirror of https://github.com/axmolengine/axmol.git
add clear feature when before draw scene with a camera
This commit is contained in:
parent
c785b7a021
commit
67ec758d15
|
@ -3640,6 +3640,8 @@
|
||||||
B217704C1977ED8B009EE11B /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
|
B217704C1977ED8B009EE11B /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
|
||||||
B230ED6F19B417AE00364AA8 /* CCTrianglesCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCTrianglesCommand.cpp; sourceTree = "<group>"; };
|
B230ED6F19B417AE00364AA8 /* CCTrianglesCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCTrianglesCommand.cpp; sourceTree = "<group>"; };
|
||||||
B230ED7019B417AE00364AA8 /* CCTrianglesCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTrianglesCommand.h; sourceTree = "<group>"; };
|
B230ED7019B417AE00364AA8 /* CCTrianglesCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTrianglesCommand.h; sourceTree = "<group>"; };
|
||||||
|
B241A6E21AFB0BE700C5623C /* ccShader_CameraClear.frag */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = ccShader_CameraClear.frag; sourceTree = "<group>"; };
|
||||||
|
B241A6E31AFB0BE700C5623C /* ccShader_CameraClear.vert */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = ccShader_CameraClear.vert; sourceTree = "<group>"; };
|
||||||
B24AA981195A675C007B4522 /* CCFastTMXLayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFastTMXLayer.cpp; sourceTree = "<group>"; };
|
B24AA981195A675C007B4522 /* CCFastTMXLayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFastTMXLayer.cpp; sourceTree = "<group>"; };
|
||||||
B24AA982195A675C007B4522 /* CCFastTMXLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCFastTMXLayer.h; sourceTree = "<group>"; };
|
B24AA982195A675C007B4522 /* CCFastTMXLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCFastTMXLayer.h; sourceTree = "<group>"; };
|
||||||
B24AA983195A675C007B4522 /* CCFastTMXTiledMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFastTMXTiledMap.cpp; sourceTree = "<group>"; };
|
B24AA983195A675C007B4522 /* CCFastTMXTiledMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFastTMXTiledMap.cpp; sourceTree = "<group>"; };
|
||||||
|
@ -5956,6 +5958,8 @@
|
||||||
5034CA5D191D591900CE6051 /* shaders */ = {
|
5034CA5D191D591900CE6051 /* shaders */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
B241A6E21AFB0BE700C5623C /* ccShader_CameraClear.frag */,
|
||||||
|
B241A6E31AFB0BE700C5623C /* ccShader_CameraClear.vert */,
|
||||||
B603F1B11AC8F1FD00A9579C /* ccShader_3D_Terrain.frag */,
|
B603F1B11AC8F1FD00A9579C /* ccShader_3D_Terrain.frag */,
|
||||||
B603F1B21AC8F1FD00A9579C /* ccShader_3D_Terrain.vert */,
|
B603F1B21AC8F1FD00A9579C /* ccShader_3D_Terrain.vert */,
|
||||||
B6D38B941AC3B45600043997 /* ccShader_3D_Particle.frag */,
|
B6D38B941AC3B45600043997 /* ccShader_3D_Particle.frag */,
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
#include "base/CCDirector.h"
|
#include "base/CCDirector.h"
|
||||||
#include "platform/CCGLView.h"
|
#include "platform/CCGLView.h"
|
||||||
#include "2d/CCScene.h"
|
#include "2d/CCScene.h"
|
||||||
|
#include "renderer/CCRenderer.h"
|
||||||
|
#include "renderer/CCQuadCommand.h"
|
||||||
|
#include "renderer/CCGLProgramCache.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
@ -377,4 +380,59 @@ void Camera::setScene(Scene* scene)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::onBeforeClear()
|
||||||
|
{
|
||||||
|
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||||
|
glStencilMask(0);
|
||||||
|
_oldDepthTest = glIsEnabled(GL_DEPTH_TEST);
|
||||||
|
glGetIntegerv(GL_DEPTH_FUNC, &_oldDepthFunc);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_ALWAYS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::onEndClear()
|
||||||
|
{
|
||||||
|
if(GL_FALSE == _oldDepthTest)
|
||||||
|
{
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
}
|
||||||
|
glDepthFunc(_oldDepthFunc);
|
||||||
|
|
||||||
|
glStencilMask(0xFFFFF);
|
||||||
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::clearBackground(float depth)
|
||||||
|
{
|
||||||
|
auto renderer = Director::getInstance()->getRenderer();
|
||||||
|
_beforeClearCommand.init(0,Mat4(),0);
|
||||||
|
_beforeClearCommand.func = CC_CALLBACK_0(Camera::onBeforeClear, this);
|
||||||
|
renderer->addCommand(&_beforeClearCommand);
|
||||||
|
|
||||||
|
//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::create(shader);
|
||||||
|
programState->setUniformFloat("depth", 1.0);
|
||||||
|
_clearCommand.init(0, 0, programState, BlendFunc::DISABLE, &quad, 1, Mat4(), 0);
|
||||||
|
renderer->addCommand(&_clearCommand);
|
||||||
|
|
||||||
|
|
||||||
|
_endClearCommand.init(0,Mat4(),0);
|
||||||
|
_endClearCommand.func = CC_CALLBACK_0(Camera::onEndClear, this);
|
||||||
|
renderer->addCommand(&_endClearCommand);
|
||||||
|
}
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
|
@ -26,6 +26,8 @@ THE SOFTWARE.
|
||||||
|
|
||||||
#include "2d/CCNode.h"
|
#include "2d/CCNode.h"
|
||||||
#include "3d/CCFrustum.h"
|
#include "3d/CCFrustum.h"
|
||||||
|
#include "renderer/CCQuadCommand.h"
|
||||||
|
#include "renderer/CCCustomCommand.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
@ -184,6 +186,8 @@ public:
|
||||||
*/
|
*/
|
||||||
static Camera* getDefaultCamera();
|
static Camera* getDefaultCamera();
|
||||||
|
|
||||||
|
void clearBackground(float depth);
|
||||||
|
|
||||||
CC_CONSTRUCTOR_ACCESS:
|
CC_CONSTRUCTOR_ACCESS:
|
||||||
Camera();
|
Camera();
|
||||||
~Camera();
|
~Camera();
|
||||||
|
@ -223,6 +227,15 @@ protected:
|
||||||
static Camera* _visitingCamera;
|
static Camera* _visitingCamera;
|
||||||
|
|
||||||
friend class Director;
|
friend class Director;
|
||||||
|
protected:
|
||||||
|
//callback for clear background
|
||||||
|
void onBeforeClear();
|
||||||
|
void onEndClear();
|
||||||
|
GLboolean _oldDepthTest;
|
||||||
|
GLint _oldDepthFunc;
|
||||||
|
CustomCommand _beforeClearCommand;
|
||||||
|
QuadCommand _clearCommand;
|
||||||
|
CustomCommand _endClearCommand;
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
|
@ -151,6 +151,8 @@ void Scene::render(Renderer* renderer)
|
||||||
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
|
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
|
||||||
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());
|
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());
|
||||||
|
|
||||||
|
//clear background with max depth
|
||||||
|
camera->clearBackground(1.0);
|
||||||
//visit the scene
|
//visit the scene
|
||||||
visit(renderer, transform, 0);
|
visit(renderer, transform, 0);
|
||||||
renderer->render();
|
renderer->render();
|
||||||
|
|
|
@ -74,6 +74,7 @@ const char* GLProgram::SHADER_3D_PARTICLE_COLOR = "Shader3DParticleColor";
|
||||||
const char* GLProgram::SHADER_3D_PARTICLE_TEXTURE = "Shader3DParticleTexture";
|
const char* GLProgram::SHADER_3D_PARTICLE_TEXTURE = "Shader3DParticleTexture";
|
||||||
const char* GLProgram::SHADER_3D_SKYBOX = "Shader3DSkybox";
|
const char* GLProgram::SHADER_3D_SKYBOX = "Shader3DSkybox";
|
||||||
const char* GLProgram::SHADER_3D_TERRAIN = "Shader3DTerrain";
|
const char* GLProgram::SHADER_3D_TERRAIN = "Shader3DTerrain";
|
||||||
|
const char* GLProgram::SHADER_CAMERA_CLEAR = "ShaderCameraClear";
|
||||||
|
|
||||||
|
|
||||||
// uniform names
|
// uniform names
|
||||||
|
|
|
@ -231,6 +231,10 @@ public:
|
||||||
*/
|
*/
|
||||||
static const char* SHADER_3D_TERRAIN;
|
static const char* SHADER_3D_TERRAIN;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Built in shader for camera clear
|
||||||
|
*/
|
||||||
|
static const char* SHADER_CAMERA_CLEAR;
|
||||||
/**
|
/**
|
||||||
end of built shader types.
|
end of built shader types.
|
||||||
@}
|
@}
|
||||||
|
|
|
@ -66,6 +66,7 @@ enum {
|
||||||
kShaderType_3DParticleColor,
|
kShaderType_3DParticleColor,
|
||||||
kShaderType_3DSkyBox,
|
kShaderType_3DSkyBox,
|
||||||
kShaderType_3DTerrain,
|
kShaderType_3DTerrain,
|
||||||
|
kShaderType_CameraClear,
|
||||||
#if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || defined(WP8_SHADER_COMPILER)
|
#if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || defined(WP8_SHADER_COMPILER)
|
||||||
kShaderType_PositionColor_noMVP_GrayScale,
|
kShaderType_PositionColor_noMVP_GrayScale,
|
||||||
#endif
|
#endif
|
||||||
|
@ -260,6 +261,10 @@ void GLProgramCache::loadDefaultGLPrograms()
|
||||||
p = new GLProgram();
|
p = new GLProgram();
|
||||||
loadDefaultGLProgram(p, kShaderType_3DTerrain);
|
loadDefaultGLProgram(p, kShaderType_3DTerrain);
|
||||||
_programs.insert(std::make_pair(GLProgram::SHADER_3D_TERRAIN, p));
|
_programs.insert(std::make_pair(GLProgram::SHADER_3D_TERRAIN, p));
|
||||||
|
|
||||||
|
p = new GLProgram();
|
||||||
|
loadDefaultGLProgram(p, kShaderType_CameraClear);
|
||||||
|
_programs.insert(std::make_pair(GLProgram::SHADER_CAMERA_CLEAR, p));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLProgramCache::reloadDefaultGLPrograms()
|
void GLProgramCache::reloadDefaultGLPrograms()
|
||||||
|
@ -395,6 +400,10 @@ void GLProgramCache::reloadDefaultGLPrograms()
|
||||||
p = getGLProgram(GLProgram::SHADER_3D_TERRAIN);
|
p = getGLProgram(GLProgram::SHADER_3D_TERRAIN);
|
||||||
p->reset();
|
p->reset();
|
||||||
loadDefaultGLProgram(p, kShaderType_3DTerrain);
|
loadDefaultGLProgram(p, kShaderType_3DTerrain);
|
||||||
|
|
||||||
|
p = getGLProgram(GLProgram::SHADER_CAMERA_CLEAR);
|
||||||
|
p->reset();
|
||||||
|
loadDefaultGLProgram(p, kShaderType_CameraClear);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLProgramCache::loadDefaultGLProgram(GLProgram *p, int type)
|
void GLProgramCache::loadDefaultGLProgram(GLProgram *p, int type)
|
||||||
|
@ -496,6 +505,9 @@ void GLProgramCache::loadDefaultGLProgram(GLProgram *p, int type)
|
||||||
case kShaderType_3DTerrain:
|
case kShaderType_3DTerrain:
|
||||||
p->initWithByteArrays(cc3D_Terrain_vert, cc3D_Terrain_frag);
|
p->initWithByteArrays(cc3D_Terrain_vert, cc3D_Terrain_frag);
|
||||||
break;
|
break;
|
||||||
|
case kShaderType_CameraClear:
|
||||||
|
p->initWithByteArrays(ccCameraClearVert, ccCameraClearFrag);
|
||||||
|
break;
|
||||||
#if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || defined(WP8_SHADER_COMPILER)
|
#if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || defined(WP8_SHADER_COMPILER)
|
||||||
case kShaderType_PositionColor_noMVP_GrayScale:
|
case kShaderType_PositionColor_noMVP_GrayScale:
|
||||||
p->initWithByteArrays(ccPositionTextureColor_noMVP_vert, ccUIGrayScale_frag);
|
p->initWithByteArrays(ccPositionTextureColor_noMVP_vert, ccUIGrayScale_frag);
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
const char* ccCameraClearFrag = STRINGIFY(
|
||||||
|
|
||||||
|
\n#ifdef GL_ES\n
|
||||||
|
varying mediump vec2 v_texCoord;
|
||||||
|
varying mediump vec3 v_color;
|
||||||
|
\n#else\n
|
||||||
|
varying vec2 v_texCoord;
|
||||||
|
varying vec3 v_color;
|
||||||
|
\n#endif\n
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = vec4(v_color, 1.0);
|
||||||
|
}
|
||||||
|
);
|
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
const char* ccCameraClearVert = STRINGIFY(
|
||||||
|
|
||||||
|
uniform float depth;
|
||||||
|
|
||||||
|
attribute vec4 a_position;
|
||||||
|
attribute vec2 a_texCoord;
|
||||||
|
attribute vec3 a_color;
|
||||||
|
\n#ifdef GL_ES\n
|
||||||
|
varying mediump vec2 v_texCoord;
|
||||||
|
varying mediump vec3 v_color;
|
||||||
|
\n#else\n
|
||||||
|
varying vec2 v_texCoord;
|
||||||
|
varying vec3 v_color;
|
||||||
|
\n#endif\n
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = a_position;
|
||||||
|
gl_Position.z = depth;
|
||||||
|
gl_Position.w = 1.0;
|
||||||
|
v_texCoord = a_texCoord;
|
||||||
|
v_color = a_color;
|
||||||
|
}
|
||||||
|
);
|
|
@ -97,5 +97,7 @@ NS_CC_BEGIN
|
||||||
#include "ccShader_3D_Skybox.frag"
|
#include "ccShader_3D_Skybox.frag"
|
||||||
#include "ccShader_3D_Terrain.vert"
|
#include "ccShader_3D_Terrain.vert"
|
||||||
#include "ccShader_3D_Terrain.frag"
|
#include "ccShader_3D_Terrain.frag"
|
||||||
|
#include "ccShader_CameraClear.vert"
|
||||||
|
#include "ccShader_CameraClear.frag"
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
|
@ -90,8 +90,8 @@ extern CC_DLL const GLchar * cc3D_Skybox_vert;
|
||||||
extern CC_DLL const GLchar * cc3D_Skybox_frag;
|
extern CC_DLL const GLchar * cc3D_Skybox_frag;
|
||||||
extern CC_DLL const GLchar * cc3D_Terrain_vert;
|
extern CC_DLL const GLchar * cc3D_Terrain_vert;
|
||||||
extern CC_DLL const GLchar * cc3D_Terrain_frag;
|
extern CC_DLL const GLchar * cc3D_Terrain_frag;
|
||||||
|
extern CC_DLL const GLchar * ccCameraClearVert;
|
||||||
|
extern CC_DLL const GLchar * ccCameraClearFrag;
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
/**
|
/**
|
||||||
end of support group
|
end of support group
|
||||||
|
|
Loading…
Reference in New Issue