Răsfoiți Sursa

Removed superfluous screen clearing

Bill Robinson 11 ani în urmă
părinte
comite
33e1e9516f

+ 1 - 1
Core/Contents/Include/PolyGLES1Renderer.h

@@ -78,7 +78,7 @@ namespace Polycode {
 		
 		void renderToTexture(Texture *targetTexture);		
 		void renderZBufferToTexture(Texture *targetTexture);
-		void clearScreen();	
+		void clearScreen(bool clearColor = true, bool clearDepth = true);
 		
 		void translate2D(Number x, Number y);
 		void rotate2D(Number angle);

+ 1 - 1
Core/Contents/Include/PolyGLRenderer.h

@@ -147,7 +147,7 @@ namespace Polycode {
 
 		Image *renderScreenToImage();
 		Image *renderBufferToImage(Texture *texture);
-		void clearScreen();	
+		void clearScreen(bool clearColor = true, bool clearDepth = true);
 		
 		void translate2D(Number x, Number y);
 		void rotate2D(Number angle);

+ 1 - 1
Core/Contents/Include/PolyRenderer.h

@@ -128,7 +128,7 @@ namespace Polycode {
 		
 		virtual void setAmbientColor(Number r, Number g, Number b);
 		
-		virtual void clearScreen() = 0;
+		virtual void clearScreen(bool clearColor = true, bool clearDepth = true) = 0;
 		
 		virtual void translate2D(Number x, Number y) = 0;
 		virtual void rotate2D(Number angle) = 0;

+ 8 - 1
Core/Contents/Include/PolyScene.h

@@ -157,10 +157,17 @@ namespace Polycode {
 		Color clearColor;
 		
 		/**
-		* If set to true, the renderer will use the scene's clear color when rendering the scene.
+		* If set to true, the renderer will clear the screen prior to rendering the scene
+		* @default true
 		*/
 		bool useClearColor;
 
+		/**
+		* If set to true, the renderer will clear the depth buffer prior to rendering the scene.
+		* @default true
+		*/
+		bool useClearDepth;
+
 		/**
 		* Ambient color, passed to lighting shaders
 		*/				

+ 12 - 3
Core/Contents/Source/PolyGLES1Renderer.cpp

@@ -353,7 +353,7 @@ void OpenGLES1Renderer::BeginRender() {
 }
 
 void OpenGLES1Renderer::setClearColor(Number r, Number g, Number b) {
-	clearColor.setColor(r,g,b,1.0f);	
+	clearColor.setColor(r,g,b,1.0f);
 	glClearColor(r,g,b,0.0f);
 }
 
@@ -479,8 +479,17 @@ Texture *OpenGLES1Renderer::createTexture(unsigned int width, unsigned int heigh
 	return newTexture;
 }
 
-void OpenGLES1Renderer::clearScreen() {
-	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+void OpenGLES1Renderer::clearScreen(bool clearColor, bool clearDepth) {
+	GLbitfield mask = 0;
+	if (clearColor) {
+		mask |= GL_COLOR_BUFFER_BIT;
+	}
+	if (clearDepth) {
+		mask |= GL_DEPTH_BUFFER_BIT;
+	}
+	if (mask) {
+		glClear(mask);
+	}
 }
 
 void OpenGLES1Renderer::applyMaterial(Material *material,  ShaderBinding *localOptions,unsigned int shaderIndex) {

+ 14 - 3
Core/Contents/Source/PolyGLRenderer.cpp

@@ -730,9 +730,20 @@ void OpenGLRenderer::destroyTexture(Texture *texture) {
 	delete glTex;
 }
 
-void OpenGLRenderer::clearScreen() {
-	glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
-	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+void OpenGLRenderer::clearScreen(bool useClearColor, bool useClearDepth) {
+	if (useClearColor) {
+		glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
+	}
+	GLbitfield mask = 0;
+	if (useClearColor) {
+		mask |= GL_COLOR_BUFFER_BIT;
+	}
+	if (useClearDepth) {
+		mask |= GL_DEPTH_BUFFER_BIT;
+	}
+	if (mask) {
+		glClear(mask);
+	}
 }
 
 void OpenGLRenderer::drawToColorBuffer(bool val) {

+ 4 - 1
Core/Contents/Source/PolyScene.cpp

@@ -62,6 +62,7 @@ void Scene::initScene(int sceneType, bool virtualScene) {
 	clearColor.setColor(0.13f,0.13f,0.13f,1.0f); 
 	ambientColor.setColor(0.0,0.0,0.0,1.0);	
 	useClearColor = false;
+	useClearDepth = true;
 	ownsChildren = false;
     remapMouse = false;
     _doVisibilityChecking = true;
@@ -226,7 +227,9 @@ void Scene::Render(Camera *targetCamera) {
 		
 	if(useClearColor) {
 		CoreServices::getInstance()->getRenderer()->setClearColor(clearColor.r,clearColor.g,clearColor.b, clearColor.a);	
-		CoreServices::getInstance()->getRenderer()->clearScreen();		
+	}
+	if (useClearColor || useClearDepth) {
+		CoreServices::getInstance()->getRenderer()->clearScreen(useClearColor, useClearDepth);
 	}
 	
 	CoreServices::getInstance()->getRenderer()->setAmbientColor(ambientColor.r,ambientColor.g,ambientColor.b);		

+ 5 - 1
Core/Contents/Source/PolySceneManager.cpp

@@ -75,13 +75,17 @@ void SceneManager::setRenderer(Renderer *renderer) {
 }
 
 void SceneManager::renderVirtual() {
+	bool anyVirtualsRendered = false;
 	for(int i=0;i<renderTextures.size();i++) {
 		if(renderTextures[i]->enabled) {
             renderTextures[i]->Render();
+			anyVirtualsRendered = true;
 		}			
 	}
 	renderer->setViewportSize(renderer->getXRes(), renderer->getYRes());
-	renderer->clearScreen();
+	if (anyVirtualsRendered) {
+		renderer->clearScreen();
+	}
 }
 
 void SceneManager::Render() {