Bladeren bron

Fixed texture destruction and render to texture

Ivan Safrin 14 jaren geleden
bovenliggende
commit
971106bb55

+ 18 - 6
Bindings/Contents/LUA/API/Polycode/Renderer.lua

@@ -93,6 +93,10 @@ function Renderer:createTexture(width, height, textureData, clamp, type)
 	end
 end
 
+function Renderer:destroyTexture(texture)
+	local retVal = Polycore.Renderer_destroyTexture(self.__ptr, texture.__ptr)
+end
+
 function Renderer:createRenderTextures(colorBuffer, depthBuffer, width, height)
 	local retVal = Polycore.Renderer_createRenderTextures(self.__ptr, colorBuffer.__ptr, depthBuffer.__ptr, width, height)
 end
@@ -125,8 +129,20 @@ function Renderer:renderZBufferToTexture(targetTexture)
 	local retVal = Polycore.Renderer_renderZBufferToTexture(self.__ptr, targetTexture.__ptr)
 end
 
-function Renderer:setViewportSize(w, h, fov)
-	local retVal = Polycore.Renderer_setViewportSize(self.__ptr, w, h, fov)
+function Renderer:setFOV(fov)
+	local retVal = Polycore.Renderer_setFOV(self.__ptr, fov)
+end
+
+function Renderer:setViewportSize(w, h)
+	local retVal = Polycore.Renderer_setViewportSize(self.__ptr, w, h)
+end
+
+function Renderer:setViewportSizeAndFOV(w, h, fov)
+	local retVal = Polycore.Renderer_setViewportSizeAndFOV(self.__ptr, w, h, fov)
+end
+
+function Renderer:resetViewport()
+	local retVal =  Polycore.Renderer_resetViewport(self.__ptr)
 end
 
 function Renderer:loadIdentity()
@@ -177,10 +193,6 @@ function Renderer:scale2D(scale)
 	local retVal = Polycore.Renderer_scale2D(self.__ptr, scale.__ptr)
 end
 
-function Renderer:setFOV(fov)
-	local retVal = Polycore.Renderer_setFOV(self.__ptr, fov)
-end
-
 function Renderer:setVertexColor(r, g, b, a)
 	local retVal = Polycore.Renderer_setVertexColor(self.__ptr, r, g, b, a)
 end

+ 4 - 0
Bindings/Contents/LUA/API/Polycode/SceneManager.lua

@@ -40,6 +40,10 @@ function SceneManager:registerRenderTexture(r_enderTexture)
 	local retVal = Polycore.SceneManager_registerRenderTexture(self.__ptr, r_enderTexture.__ptr)
 end
 
+function SceneManager:unregisterRenderTexture(r_enderTexture)
+	local retVal = Polycore.SceneManager_unregisterRenderTexture(self.__ptr, r_enderTexture.__ptr)
+end
+
 
 
 function SceneManager:__delete()

+ 48 - 16
Bindings/Contents/LUA/Include/PolycodeLUAWrappers.h

@@ -5963,6 +5963,15 @@ static int Polycore_Renderer_createTexture(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_Renderer_destroyTexture(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Renderer *inst = (Renderer*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
+	Texture* texture = (Texture*)lua_topointer(L, 2);
+	inst->destroyTexture(texture);
+	return 0;
+}
+
 static int Polycore_Renderer_createRenderTextures(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Renderer *inst = (Renderer*)lua_topointer(L, 1);
@@ -6028,6 +6037,15 @@ static int Polycore_Renderer_renderZBufferToTexture(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_Renderer_setFOV(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Renderer *inst = (Renderer*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TNUMBER);
+	Number fov = lua_tonumber(L, 2);
+	inst->setFOV(fov);
+	return 0;
+}
+
 static int Polycore_Renderer_setViewportSize(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Renderer *inst = (Renderer*)lua_topointer(L, 1);
@@ -6035,13 +6053,27 @@ static int Polycore_Renderer_setViewportSize(lua_State *L) {
 	int w = lua_tointeger(L, 2);
 	luaL_checktype(L, 3, LUA_TNUMBER);
 	int h = lua_tointeger(L, 3);
-	Number fov;
-	if(lua_isnumber(L, 4)) {
-		fov = lua_tonumber(L, 4);
-	} else {
-		fov = 45.0f;
-	}
-	inst->setViewportSize(w, h, fov);
+	inst->setViewportSize(w, h);
+	return 0;
+}
+
+static int Polycore_Renderer_setViewportSizeAndFOV(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Renderer *inst = (Renderer*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TNUMBER);
+	int w = lua_tointeger(L, 2);
+	luaL_checktype(L, 3, LUA_TNUMBER);
+	int h = lua_tointeger(L, 3);
+	luaL_checktype(L, 4, LUA_TNUMBER);
+	Number fov = lua_tonumber(L, 4);
+	inst->setViewportSizeAndFOV(w, h, fov);
+	return 0;
+}
+
+static int Polycore_Renderer_resetViewport(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Renderer *inst = (Renderer*)lua_topointer(L, 1);
+	inst->resetViewport();
 	return 0;
 }
 
@@ -6165,15 +6197,6 @@ static int Polycore_Renderer_scale2D(lua_State *L) {
 	return 0;
 }
 
-static int Polycore_Renderer_setFOV(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
-	Renderer *inst = (Renderer*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TNUMBER);
-	Number fov = lua_tonumber(L, 2);
-	inst->setFOV(fov);
-	return 0;
-}
-
 static int Polycore_Renderer_setVertexColor(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Renderer *inst = (Renderer*)lua_topointer(L, 1);
@@ -7878,6 +7901,15 @@ static int Polycore_SceneManager_registerRenderTexture(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_SceneManager_unregisterRenderTexture(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	SceneManager *inst = (SceneManager*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
+	SceneRenderTexture* r_enderTexture = (SceneRenderTexture*)lua_topointer(L, 2);
+	inst->unregisterRenderTexture(r_enderTexture);
+	return 0;
+}
+
 static int Polycore_delete_SceneManager(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	SceneManager *inst = (SceneManager*)lua_topointer(L, 1);

+ 5 - 1
Bindings/Contents/LUA/Source/PolycodeLUA.cpp

@@ -633,13 +633,17 @@ int luaopen_Polycode(lua_State *L) {
 		{"Renderer_EndRender", Polycore_Renderer_EndRender},
 		{"Renderer_createCubemap", Polycore_Renderer_createCubemap},
 		{"Renderer_createTexture", Polycore_Renderer_createTexture},
+		{"Renderer_destroyTexture", Polycore_Renderer_destroyTexture},
 		{"Renderer_createRenderTextures", Polycore_Renderer_createRenderTextures},
 		{"Renderer_createFramebufferTexture", Polycore_Renderer_createFramebufferTexture},
 		{"Renderer_bindFrameBufferTexture", Polycore_Renderer_bindFrameBufferTexture},
 		{"Renderer_unbindFramebuffers", Polycore_Renderer_unbindFramebuffers},
 		{"Renderer_renderToTexture", Polycore_Renderer_renderToTexture},
 		{"Renderer_renderZBufferToTexture", Polycore_Renderer_renderZBufferToTexture},
+		{"Renderer_setFOV", Polycore_Renderer_setFOV},
 		{"Renderer_setViewportSize", Polycore_Renderer_setViewportSize},
+		{"Renderer_setViewportSizeAndFOV", Polycore_Renderer_setViewportSizeAndFOV},
+		{"Renderer_resetViewport", Polycore_Renderer_resetViewport},
 		{"Renderer_loadIdentity", Polycore_Renderer_loadIdentity},
 		{"Renderer_setOrthoMode", Polycore_Renderer_setOrthoMode},
 		{"Renderer__setOrthoMode", Polycore_Renderer__setOrthoMode},
@@ -652,7 +656,6 @@ int luaopen_Polycode(lua_State *L) {
 		{"Renderer_translate2D", Polycore_Renderer_translate2D},
 		{"Renderer_rotate2D", Polycore_Renderer_rotate2D},
 		{"Renderer_scale2D", Polycore_Renderer_scale2D},
-		{"Renderer_setFOV", Polycore_Renderer_setFOV},
 		{"Renderer_setVertexColor", Polycore_Renderer_setVertexColor},
 		{"Renderer_pushDataArrayForMesh", Polycore_Renderer_pushDataArrayForMesh},
 		{"Renderer_pushRenderDataArray", Polycore_Renderer_pushRenderDataArray},
@@ -827,6 +830,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"SceneManager_UpdateVirtual", Polycore_SceneManager_UpdateVirtual},
 		{"SceneManager_removeScene", Polycore_SceneManager_removeScene},
 		{"SceneManager_registerRenderTexture", Polycore_SceneManager_registerRenderTexture},
+		{"SceneManager_unregisterRenderTexture", Polycore_SceneManager_unregisterRenderTexture},
 		{"delete_SceneManager", Polycore_delete_SceneManager},
 		{"SceneMesh_get_lightmapIndex", Polycore_SceneMesh_get_lightmapIndex},
 		{"SceneMesh_get_showVertexNormals", Polycore_SceneMesh_get_showVertexNormals},

+ 3 - 2
Core/Contents/Include/PolyGLRenderer.h

@@ -118,6 +118,7 @@ namespace Polycode {
 		
 		Cubemap *createCubemap(Texture *t0, Texture *t1, Texture *t2, Texture *t3, Texture *t4, Texture *t5);
 		Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, int type = Image::IMAGE_RGBA);
+		void destroyTexture(Texture *texture);		
 		Texture *createFramebufferTexture(unsigned int width, unsigned int height);
 		void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height);
 		
@@ -141,7 +142,8 @@ namespace Polycode {
 		void setPerspectiveMode();
 		
 		void enableBackfaceCulling(bool val);
-		void setViewportSize(int w, int h, Number fov=45.0f);
+		
+		void resetViewport();
 		
 		void setLineSmooth(bool val);		
 		
@@ -196,7 +198,6 @@ namespace Polycode {
 		
 		bool test2DCoordinate(Number x, Number y, Polycode::Polygon *poly, const Matrix4 &matrix, bool billboardMode);
 		
-		void setFOV(Number fov);
 		
 		Vector3 Unproject(Number x, Number y);
 		

+ 10 - 3
Core/Contents/Include/PolyRenderer.h

@@ -87,6 +87,7 @@ namespace Polycode {
 		
 		virtual Cubemap *createCubemap(Texture *t0, Texture *t1, Texture *t2, Texture *t3, Texture *t4, Texture *t5) = 0;		
 		virtual Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, int type=Image::IMAGE_RGBA) = 0;
+		virtual void destroyTexture(Texture *texture) = 0;
 		virtual void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height) = 0;
 		
 		virtual Texture *createFramebufferTexture(unsigned int width, unsigned int height) = 0;
@@ -95,8 +96,12 @@ namespace Polycode {
 		
 		virtual void renderToTexture(Texture *targetTexture) = 0;
 		virtual void renderZBufferToTexture(Texture *targetTexture) = 0;
-		virtual void setViewportSize(int w, int h, Number fov=45.0f) = 0;
 		
+		void setFOV(Number fov);		
+		void setViewportSize(int w, int h);
+		void setViewportSizeAndFOV(int w, int h, Number fov);
+		virtual void resetViewport() = 0;
+				
 		virtual void loadIdentity() = 0;		
 		virtual void setOrthoMode(Number xSize=0.0f, Number ySize=0.0f) = 0;
 		virtual void _setOrthoMode() = 0;
@@ -115,8 +120,7 @@ namespace Polycode {
 		virtual void translate2D(Number x, Number y) = 0;
 		virtual void rotate2D(Number angle) = 0;
 		virtual void scale2D(Vector2 *scale) = 0;
-		
-		virtual void setFOV(Number fov) = 0;		
+			
 		
 		virtual void setVertexColor(Number r, Number g, Number b, Number a) = 0;
 		
@@ -253,6 +257,9 @@ namespace Polycode {
 		Matrix4 currentModelMatrix;
 		LightSorter sorter;	
 	
+		Number viewportWidth;
+		Number viewportHeight;
+			
 		bool cullingFrontFaces;
 				
 		Texture *currentTexture;

+ 2 - 1
Core/Contents/Include/PolySceneManager.h

@@ -40,7 +40,8 @@ namespace Polycode {
 		void UpdateVirtual();
 		void removeScene(Scene *scene);	
 		void registerRenderTexture(SceneRenderTexture *renderTexture);
-		
+		void unregisterRenderTexture(SceneRenderTexture *renderTexture);
+				
 		private:
 		
 		void updateRenderTextures(Scene *scene);

+ 1 - 0
Core/Contents/Include/PolySceneRenderTexture.h

@@ -63,6 +63,7 @@ namespace Polycode {
 				
 		protected:
 		
+			Texture *depthTexture;		
 			Texture *targetTexture;
 			Scene *targetScene;
 			Camera *targetCamera;

+ 12 - 16
Core/Contents/Source/PolyGLRenderer.cpp

@@ -134,6 +134,8 @@ void OpenGLRenderer::initOSSpecific(){
 void OpenGLRenderer::Resize(int xRes, int yRes) {
 	this->xRes = xRes;
 	this->yRes = yRes;
+	viewportWidth = xRes;
+	viewportHeight = xRes;
 	glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
 	glClearDepth(1.0f);
 	
@@ -191,23 +193,14 @@ void OpenGLRenderer::setLineSmooth(bool val) {
 		glDisable(GL_LINE_SMOOTH);
 }
 
-void OpenGLRenderer::setFOV(Number fov) {
-	this->fov = fov;
+void OpenGLRenderer::resetViewport() {
 	glMatrixMode(GL_PROJECTION);
 	glLoadIdentity();
-	gluPerspective(fov,(GLfloat)xRes/(GLfloat)yRes,nearPlane,farPlane);	
-	glViewport(0, 0, xRes, yRes);
-	glScissor(0, 0, xRes, yRes);
+	gluPerspective(fov,(GLfloat)viewportWidth/(GLfloat)viewportHeight,nearPlane,farPlane);	
+	glViewport(0, 0, viewportWidth, viewportHeight);
+	glScissor(0, 0, viewportWidth, viewportHeight);
 	glMatrixMode(GL_MODELVIEW);	
-}
 
-void OpenGLRenderer::setViewportSize(int w, int h, Number fov) {
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-	gluPerspective(fov,(GLfloat)w/(GLfloat)h,nearPlane,farPlane);
-	glViewport(0, 0, w, h);
-	glScissor(0, 0, w, h);
-	glMatrixMode(GL_MODELVIEW);
 }
 
 Vector3 OpenGLRenderer::Unproject(Number x, Number y) {
@@ -588,9 +581,7 @@ void OpenGLRenderer::unbindFramebuffers() {
 
 
 void OpenGLRenderer::createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height) {
-	
-	Logger::log("generating fbo textures %d %d\n", colorBuffer, depthBuffer);	
-		
+			
 	GLuint depthTexture,colorTexture;
 	GLenum status;
 	GLuint frameBufferID;
@@ -669,6 +660,11 @@ Texture *OpenGLRenderer::createTexture(unsigned int width, unsigned int height,
 	return newTexture;
 }
 
+void OpenGLRenderer::destroyTexture(Texture *texture) {
+	OpenGLTexture *glTex = (OpenGLTexture*)texture;
+	delete glTex;
+}
+
 void OpenGLRenderer::clearScreen() {
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }

+ 4 - 0
Core/Contents/Source/PolyGLTexture.cpp

@@ -29,6 +29,7 @@ using namespace Polycode;
 OpenGLTexture::OpenGLTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, int filteringMode, int type) : Texture(width, height, textureData,clamp, type) {
 	this->filteringMode = filteringMode;
 	glTextureLoaded = false;
+	frameBufferID = 999999;
 	
 	glTextureType = GL_RGBA;
 	if(type == Image::IMAGE_RGB) {
@@ -98,6 +99,9 @@ void OpenGLTexture::setTextureData(char *data) {
 
 OpenGLTexture::~OpenGLTexture() {
 	glDeleteTextures(1, &textureID);
+	if(frameBufferID != 999999) {
+		glDeleteFramebuffersEXT(1, &frameBufferID);
+	}	
 }
 
 GLuint OpenGLTexture::getFrameBufferID() {

+ 1 - 1
Core/Contents/Source/PolyMaterialManager.cpp

@@ -67,7 +67,7 @@ void MaterialManager::deleteTexture(Texture *texture) {
 	for(int i=0;i < textures.size(); i++) {
 		if(textures[i] == texture) {
 			textures.erase(textures.begin()+i);
-			delete texture;
+			CoreServices::getInstance()->getRenderer()->destroyTexture(texture);
 			return;
 		}
 	}

+ 20 - 0
Core/Contents/Source/PolyRenderer.cpp

@@ -260,3 +260,23 @@ void Renderer::setTextureFilteringMode(int mode) {
 int Renderer::getRenderMode() {
 	return renderMode;
 }
+
+void Renderer::setFOV(Number fov) {
+	this->fov = fov;
+	resetViewport();
+}
+
+void Renderer::setViewportSize(int w, int h) {
+	viewportWidth = w;
+	viewportHeight = h;
+	resetViewport();
+}
+
+void Renderer::setViewportSizeAndFOV(int w, int h, Number fov) {
+	this->fov = fov;
+	viewportWidth = w;
+	viewportHeight = h;
+	resetViewport();
+}
+
+

+ 2 - 2
Core/Contents/Source/PolySceneLight.cpp

@@ -136,7 +136,7 @@ void SceneLight::renderDepthMap(Scene *scene) {
 	CoreServices::getInstance()->getRenderer()->pushMatrix();
 	CoreServices::getInstance()->getRenderer()->loadIdentity();
 
-	CoreServices::getInstance()->getRenderer()->setViewportSize(shadowMapRes, shadowMapRes, shadowMapFOV);	
+	CoreServices::getInstance()->getRenderer()->setViewportSizeAndFOV(shadowMapRes, shadowMapRes, shadowMapFOV);	
 	CoreServices::getInstance()->getRenderer()->bindFrameBufferTexture(zBufferTexture);	
 
 	scene->RenderDepthOnly(spotCamera);
@@ -144,7 +144,7 @@ void SceneLight::renderDepthMap(Scene *scene) {
 	lightViewMatrix = CoreServices::getInstance()->getRenderer()->getModelviewMatrix() *  CoreServices::getInstance()->getRenderer()->getProjectionMatrix();
 	CoreServices::getInstance()->getRenderer()->unbindFramebuffers();
 	CoreServices::getInstance()->getRenderer()->popMatrix();
-	CoreServices::getInstance()->getRenderer()->setViewportSize(CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes(), 45.0f);
+	CoreServices::getInstance()->getRenderer()->setViewportSizeAndFOV(CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes(), 45.0f);
 }
 
 const Matrix4& SceneLight::getLightViewMatrix() const {

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

@@ -54,7 +54,15 @@ void SceneManager::removeScene(Scene *scene) {
 void SceneManager::registerRenderTexture(SceneRenderTexture *renderTexture) {
 	renderTextures.push_back(renderTexture);
 }
-
+	
+void SceneManager::unregisterRenderTexture(SceneRenderTexture *renderTexture) {
+	for(int i=0;i<renderTextures.size();i++) {
+		if(renderTextures[i] == renderTexture) {
+			renderTextures.erase(renderTextures.begin()+i);
+		}
+	}	
+}
+		
 void SceneManager::addScene(Scene *newScene) {
 	scenes.push_back(newScene);
 }

+ 4 - 3
Core/Contents/Source/PolySceneRenderTexture.cpp

@@ -30,8 +30,7 @@ using namespace Polycode;
 
 SceneRenderTexture::SceneRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight) {
 //	targetTexture = CoreServices::getInstance()->getMaterialManager()->createTexture(renderWidth, renderHeight, NULL,true);
-	Texture *tex;
-	CoreServices::getInstance()->getRenderer()->createRenderTextures(&targetTexture, &tex, renderWidth, renderHeight);
+	CoreServices::getInstance()->getRenderer()->createRenderTextures(&targetTexture, &depthTexture, renderWidth, renderHeight);
 	this->targetScene = targetScene;
 	this->targetCamera = targetCamera;
 	CoreServices::getInstance()->getSceneManager()->registerRenderTexture(this);
@@ -54,5 +53,7 @@ Texture *SceneRenderTexture::getTargetTexture() {
 }
 
 SceneRenderTexture::~SceneRenderTexture() {
-
+	CoreServices::getInstance()->getSceneManager()->unregisterRenderTexture(this);
+	CoreServices::getInstance()->getRenderer()->destroyTexture(targetTexture);
+	CoreServices::getInstance()->getRenderer()->destroyTexture(depthTexture);	
 }