Kaynağa Gözat

Merge pull request #99 from mcclure/shaderfixes

Misc shader cleanup (fix MaterialManager::reloadPrograms)
Ivan Safrin 13 yıl önce
ebeveyn
işleme
439c9686a6

+ 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);
 		
 		
 		
 		

+ 10 - 2
Core/Contents/Include/PolyShader.h

@@ -23,7 +23,9 @@ THE SOFTWARE.
 #pragma once
 #pragma once
 #include "PolyString.h"
 #include "PolyString.h"
 #include "PolyGlobals.h"
 #include "PolyGlobals.h"
+#include "PolyVector3.h"
 #include "PolyResource.h"
 #include "PolyResource.h"
+#include <string.h>
 
 
 namespace Polycode {
 namespace Polycode {
 
 
@@ -41,6 +43,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;
@@ -70,7 +73,10 @@ namespace Polycode {
 	class LocalShaderParam {
 	class LocalShaderParam {
 		public:	
 		public:	
 			String name;
 			String name;
-			void *data;		
+			void *data;
+			
+			void setNumber(Number n) { memcpy(data, &n, sizeof(n)); }
+			void setVector3(Vector3 v) { memcpy(data, &v, sizeof(v)); }
 	};	
 	};	
 	
 	
 	class RenderTargetBinding {
 	class RenderTargetBinding {
@@ -111,7 +117,9 @@ namespace Polycode {
 			RenderTargetBinding *getOutTargetBinding(unsigned int index);
 			RenderTargetBinding *getOutTargetBinding(unsigned int index);
 			
 			
 			void addLocalParam(const String& name, void *ptr);
 			void addLocalParam(const String& name, void *ptr);
-			
+			void addLocalParamNumber(const String& name, Number n);
+			void addLocalParamVector3(const String& name, Vector3 v);
+		
 			Shader* shader;
 			Shader* shader;
 			std::vector<LocalShaderParam*> localParams;
 			std::vector<LocalShaderParam*> localParams;
 			std::vector<RenderTargetBinding*> renderTargetBindings;
 			std::vector<RenderTargetBinding*> renderTargetBindings;

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

@@ -102,17 +102,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;
+}

+ 12 - 0
Core/Contents/Source/PolyShader.cpp

@@ -56,6 +56,18 @@ void ShaderBinding::addLocalParam(const String& name, void *ptr) {
 	localParams.push_back(newParam);
 	localParams.push_back(newParam);
 }
 }
 
 
+void ShaderBinding::addLocalParamNumber(const String& name, Number n) {
+	Number *value = new Number;
+	*value = n;
+	addLocalParam(name, value);
+}
+
+void ShaderBinding::addLocalParamVector3(const String& name, Vector3 v) {
+	Vector3 *value = new Vector3;
+	memcpy(value, &v, sizeof(v));
+	addLocalParam(name, value);
+}
+
 void ShaderBinding::addRenderTargetBinding(RenderTargetBinding *binding) {
 void ShaderBinding::addRenderTargetBinding(RenderTargetBinding *binding) {
 	renderTargetBindings.push_back(binding);
 	renderTargetBindings.push_back(binding);
 	if(binding->mode == RenderTargetBinding::MODE_IN) {
 	if(binding->mode == RenderTargetBinding::MODE_IN) {