Ver código fonte

Material manager 'reload programs' reloads programs (shaders) but not shaders (programs), meaning materials don't actually change after a reload. Fix that. Add a 'grab all resources of type' feature to ResourceManager to support this.

mcc 14 anos atrás
pai
commit
f9e5bf72fb

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

@@ -60,6 +60,10 @@ function Shader:createBinding()
 	end
 	end
 end
 end
 
 
+function Shader:reload()
+	local retVal =  Polycore.Shader_reload(self.__ptr)
+end
+
 
 
 
 
 function Shader:__delete()
 function Shader:__delete()

+ 7 - 0
Bindings/Contents/LUA/Include/PolycodeLUAWrappers.h

@@ -9745,6 +9745,13 @@ static int Polycore_Shader_createBinding(lua_State *L) {
 	return 1;
 	return 1;
 }
 }
 
 
+static int Polycore_Shader_reload(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Shader *inst = (Shader*)lua_topointer(L, 1);
+	inst->reload();
+	return 0;
+}
+
 static int Polycore_delete_Shader(lua_State *L) {
 static int Polycore_delete_Shader(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Shader *inst = (Shader*)lua_topointer(L, 1);
 	Shader *inst = (Shader*)lua_topointer(L, 1);

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

@@ -1024,6 +1024,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"Shader_setName", Polycore_Shader_setName},
 		{"Shader_setName", Polycore_Shader_setName},
 		{"Shader_getName", Polycore_Shader_getName},
 		{"Shader_getName", Polycore_Shader_getName},
 		{"Shader_createBinding", Polycore_Shader_createBinding},
 		{"Shader_createBinding", Polycore_Shader_createBinding},
+		{"Shader_reload", Polycore_Shader_reload},
 		{"delete_Shader", Polycore_delete_Shader},
 		{"delete_Shader", Polycore_delete_Shader},
 		{"ShaderBinding", Polycore_ShaderBinding},
 		{"ShaderBinding", Polycore_ShaderBinding},
 		{"ShaderBinding_clearTexture", Polycore_ShaderBinding_clearTexture},
 		{"ShaderBinding_clearTexture", Polycore_ShaderBinding_clearTexture},

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

@@ -48,13 +48,14 @@ namespace Polycode {
 			virtual ~GLSLShader();
 			virtual ~GLSLShader();
 
 
 			ShaderBinding *createBinding();
 			ShaderBinding *createBinding();
-			
+			virtual void reload();
+		
 			unsigned int shader_id;		
 			unsigned int shader_id;		
 			GLSLProgram *vp;
 			GLSLProgram *vp;
 			GLSLProgram *fp;			
 			GLSLProgram *fp;			
 			
 			
 		protected:
 		protected:
-			
+			void linkProgram();
 	};
 	};
 	
 	
 	class _PolyExport GLSLShaderBinding : public ShaderBinding {
 	class _PolyExport GLSLShaderBinding : public ShaderBinding {

+ 6 - 0
Core/Contents/Include/PolyResourceManager.h

@@ -73,6 +73,12 @@ namespace Polycode {
 			*/
 			*/
 			Resource *getResource(int resourceType, const String& resourceName) const;
 			Resource *getResource(int resourceType, const String& resourceName) const;
 		
 		
+			/**
+			 * Request a full set of loaded resources. You need to manually cast them to their subclasses based on their type.
+			 * @param resourceType Type of resource. See Resource for available resource types.
+			 */
+			std::vector<Resource *> getResources(int resourceType);
+		
 			void addShaderModule(PolycodeShaderModule *module);
 			void addShaderModule(PolycodeShaderModule *module);
 		
 		
 		
 		

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

@@ -41,6 +41,7 @@ namespace Polycode {
 			const String& getName() const;
 			const String& getName() const;
 			
 			
 			virtual ShaderBinding *createBinding() = 0;
 			virtual ShaderBinding *createBinding() = 0;
+			virtual void reload() {}
 
 
 			static const int FIXED_SHADER = 0;
 			static const int FIXED_SHADER = 0;
 			static const int MODULE_SHADER = 1;
 			static const int MODULE_SHADER = 1;

+ 15 - 6
Core/Contents/Source/PolyGLSLShader.cpp

@@ -111,17 +111,26 @@ void GLSLShaderBinding::addParam(const String& type, const String& name, const S
 	localParams.push_back(newParam);
 	localParams.push_back(newParam);
 }
 }
 
 
-GLSLShader::GLSLShader(GLSLProgram *vp, GLSLProgram *fp) : Shader(Shader::MODULE_SHADER) {
-	this->vp = vp;
-	this->fp = fp;
-		
+void GLSLShader::linkProgram() {
 	shader_id = glCreateProgram();
 	shader_id = glCreateProgram();
     glAttachShader(shader_id, fp->program);
     glAttachShader(shader_id, fp->program);
     glAttachShader(shader_id, vp->program);
     glAttachShader(shader_id, vp->program);
 	
 	
 	glBindAttribLocation(shader_id, 6, "vTangent");
 	glBindAttribLocation(shader_id, 6, "vTangent");
-		
-    glLinkProgram(shader_id);	
+	
+    glLinkProgram(shader_id);
+}
+
+GLSLShader::GLSLShader(GLSLProgram *vp, GLSLProgram *fp) : Shader(Shader::MODULE_SHADER) {
+	this->vp = vp;
+	this->fp = fp;
+	
+	linkProgram();
+}
+
+void GLSLShader::reload() {
+	glDeleteProgram(shader_id);
+	linkProgram();
 }
 }
 
 
 GLSLShader::~GLSLShader() {
 GLSLShader::~GLSLShader() {

+ 5 - 0
Core/Contents/Source/PolyMaterialManager.cpp

@@ -78,6 +78,11 @@ void MaterialManager::reloadPrograms() {
 		PolycodeShaderModule *shaderModule = shaderModules[m];
 		PolycodeShaderModule *shaderModule = shaderModules[m];
 		shaderModule->reloadPrograms();
 		shaderModule->reloadPrograms();
 	}
 	}
+	vector<Resource *> shaders = CoreServices::getInstance()->getResourceManager()->getResources(Resource::RESOURCE_SHADER);
+	for(int s = 0; s < shaders.size(); s++) {
+		Shader *shader = (Shader *)shaders[s];
+		shader->reload();
+	}
 }
 }
 
 
 void MaterialManager::addShaderModule(PolycodeShaderModule *module) {
 void MaterialManager::addShaderModule(PolycodeShaderModule *module) {

+ 13 - 0
Core/Contents/Source/PolyResourceManager.cpp

@@ -251,3 +251,16 @@ Resource *ResourceManager::getResource(int resourceType, const String& resourceN
 	// need to add some sort of default resource for each type
 	// need to add some sort of default resource for each type
 	return NULL;
 	return NULL;
 }
 }
+
+// Would it make more sense to pass back, like, something like an ObjectEntry here? Lua hates vectors.
+vector<Resource *> ResourceManager::getResources(int resourceType) {
+	vector<Resource *> result;
+	Logger::log("requested all of type %d\n", resourceType);
+	for(int i =0; i < resources.size(); i++) {
+		//		Logger::log("is it %s?\n", resources[i]->getResourceName().c_str());		
+		if(resources[i]->getResourceType() == resourceType) {
+			result.push_back(resources[i]);
+		}
+	}
+	return result;
+}