浏览代码

Fixed new material system not setting ambient color properly, made Materials broadcast resource reload event on shader reload

Ivan Safrin 12 年之前
父节点
当前提交
bd00899428

+ 3 - 1
Core/Contents/Include/PolyMaterial.h

@@ -44,7 +44,9 @@ namespace Polycode {
 			void addShaderRenderTarget(ShaderRenderTarget *newTarget);
 			int getNumShaderRenderTargets();
 			ShaderRenderTarget *getShaderRenderTarget(unsigned int index);
-				
+			
+			void handleEvent(Event *event);
+						
 			const String& getName() const;
 			Shader *getShader(unsigned int index) const;
 			ShaderBinding *getShaderBinding(unsigned int index) const;

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

@@ -773,7 +773,7 @@ void OpenGLRenderer::clearShader() {
 	glDisable(GL_FOG);
 	
 	for(int i=0; i < 4; i++)  {
-		glActiveTexture(GL_TEXTURE0+i);		
+		glActiveTexture(GL_TEXTURE0+i);
 		glDisable(GL_TEXTURE_2D);
 	}
 		

+ 3 - 1
Core/Contents/Source/PolyGLSLShader.cpp

@@ -154,7 +154,6 @@ int GLSLShader::getPolycodeParamType(int glType) {
 }
 
 void GLSLShader::linkProgram() {
-
 	expectedParams.clear();
 	expectedTextures.clear();
 	expectedCubemaps.clear();
@@ -185,6 +184,7 @@ void GLSLShader::linkProgram() {
 		switch(type) {
 			case GL_SAMPLER_2D:
 				expectedTextures.push_back(String(name));
+				printf("expectedTextures: %s\n", name);
 			break;
 			case GL_SAMPLER_CUBE:
 				expectedCubemaps.push_back(String(name));
@@ -198,6 +198,8 @@ void GLSLShader::linkProgram() {
 		}
 		}
 	}	
+	
+	dispatchEvent(new Event(), Event::RESOURCE_RELOAD_EVENT);
 }
 
 void GLSLShader::unlinkProgram() {

+ 19 - 3
Core/Contents/Source/PolyMaterial.cpp

@@ -53,6 +53,10 @@ void Material::clearShaders() {
 		delete materialShaders[i];
 	}
 	*/
+	
+	for(int i=0; i < materialShaders.size(); i++)	{
+		materialShaders[i]->removeAllHandlersForListener(this);
+	}	
 	materialShaders.clear();
 
 	for(int i=0; i < shaderBindings.size(); i++)	{
@@ -65,18 +69,30 @@ void Material::clearShaders() {
 	}
 	renderTargets.clear();		
 }
+
+void Material::handleEvent(Event *event) {
+	std::vector<Shader*> _materialShaders = materialShaders;
+	clearShaders();
+	for(int i=0; i < _materialShaders.size(); i++)	{
+		ShaderBinding *newShaderBinding = _materialShaders[i]->createBinding();				
+		addShader(_materialShaders[i], newShaderBinding);
+	}	
+	dispatchEvent(new Event(), Event::RESOURCE_RELOAD_EVENT);	
+}
 			
 void Material::addShader(Shader *shader,ShaderBinding *shaderBinding) {
 	materialShaders.push_back(shader);
 	shaderBindings.push_back(shaderBinding);
 	
+	shader->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
+	
+	CoreServices::getInstance()->getRenderer()->setRendererShaderParams(shader, shaderBinding);	
+	
 	for(int i=0; i < shader->expectedParams.size(); i++) {
 		if(!shaderBinding->getLocalParamByName(shader->expectedParams[i].name)) {
 			shaderBinding->addParam(shader->expectedParams[i].type, shader->expectedParams[i].name);
 		}
-	}
-	
-	CoreServices::getInstance()->getRenderer()->setRendererShaderParams(shader, shaderBinding);	
+	}	
 }
 
 

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

@@ -451,9 +451,13 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 
 							if(strcmp(pChild2->Value(), "param") == 0){
 								String pname =  pChild2Element->Attribute("name");
+								
+								if(!CoreServices::getInstance()->getRenderer()->getDataPointerForName(pname)) {								
 								String pvalue =  pChild2Element->Attribute("value");																
 								int type = materialShader->getExpectedParamType(pname);								
 								LocalShaderParam *param = newShaderBinding->addParam(type, pname);
+								
+								
 								if(param) {
 									switch(type) {
 										case ProgramParam::PARAM_NUMBER:
@@ -492,6 +496,7 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 										}										
 										break;										
 									}
+									}
 								}
 							}						
 						}

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

@@ -348,7 +348,10 @@ void *Renderer::getDataPointerForName(const String &name) {
 
 void Renderer::setRendererShaderParams(Shader *shader, ShaderBinding *binding) {
 	for(int i=0; i < shader->expectedParams.size(); i++) {
-		binding->addLocalParam(shader->expectedParams[i].name, getDataPointerForName(shader->expectedParams[i].name));
+		void *dataPtr = getDataPointerForName(shader->expectedParams[i].name);
+		if(dataPtr) {
+			binding->addLocalParam(shader->expectedParams[i].name, dataPtr);
+		}
 	}
 }
 

+ 1 - 2
IDE/Contents/Include/PolycodeProps.h

@@ -333,7 +333,7 @@ class PropSheet : public UIElement {
 
 class ShaderOptionsSheet : public PropSheet {
 	public:
-		ShaderOptionsSheet(String title, String name, bool fragmentParams);
+		ShaderOptionsSheet(String title, String name);
 		~ShaderOptionsSheet();
 		
 		void handleEvent(Event *event);
@@ -344,7 +344,6 @@ class ShaderOptionsSheet : public PropSheet {
 		void setShader(Shader *shader, Material *material);
 				
 	private:
-		bool fragmentParams;
 		Shader *shader;
 		Material *material;
 		ShaderBinding *binding;

+ 19 - 2
IDE/Contents/Source/PolycodeMaterialEditor.cpp

@@ -271,7 +271,7 @@ MaterialEditorPane::MaterialEditorPane() : UIElement() {
 	propList->addPropSheet(shaderTextureSheet);			
 	shaderTextureSheet->addEventListener(this, Event::CHANGE_EVENT);
 		
-	shaderOptionsSheet = new ShaderOptionsSheet("SHADER OPTIONS", "shader_options", true);
+	shaderOptionsSheet = new ShaderOptionsSheet("SHADER OPTIONS", "shader_options");
 	propList->addPropSheet(shaderOptionsSheet);
 	shaderOptionsSheet->addEventListener(this, Event::CHANGE_EVENT);
 		
@@ -286,7 +286,12 @@ MaterialEditorPane::MaterialEditorPane() : UIElement() {
 	ScenePrimitive *previewBg = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 15.0, 15.0, 15.0);
 	previewBg->Yaw(45.0);
 	previewBg->backfaceCulled = false;
-	previewBg->loadTexture("Images/material_grid.png");
+	
+	Material *bgMaterial = CoreServices::getInstance()->getMaterialManager()->createMaterial("MaterialEditorBg", "Unlit");
+	
+	previewBg->setMaterial(bgMaterial);
+	Texture *tex = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile("Images/material_grid.png");
+	previewBg->getLocalShaderOptions()->addTexture("diffuse", tex);
 	previewScene->addChild(previewBg);
 	
 	previewScene->clearColor.setColor(0.1, 0.1, 0.1, 0.0);	
@@ -402,6 +407,11 @@ void MaterialEditorPane::showPrimitive(unsigned int index) {
 
 void MaterialEditorPane::handleEvent(Event *event) {
 
+	if(event->getDispatcher() == currentMaterial) {
+		shaderTextureSheet->setShader(currentMaterial->getShader(0), currentMaterial);
+		shaderOptionsSheet->setShader(currentMaterial->getShader(0), currentMaterial);		
+	}
+
 	if(event->getDispatcher() == shaderTextureSheet || event->getDispatcher() == shaderOptionsSheet) {
 		if(!changingMaterial) {
 			dispatchEvent(new Event(), Event::CHANGE_EVENT);
@@ -449,9 +459,16 @@ void MaterialEditorPane::handleEvent(Event *event) {
 
 void MaterialEditorPane::setMaterial(Material *material) {
 	changingMaterial = true;
+	
+	if(currentMaterial) {
+		currentMaterial->removeAllHandlersForListener(this);
+	}
+	
 	currentMaterial = material;
 	previewPrimitive->setMaterial(material);		
 	
+	material->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
+	
 	reloadShaders();
 	
 	if(!currentMaterial)

+ 4 - 3
IDE/Contents/Source/PolycodeProps.cpp

@@ -1336,9 +1336,8 @@ void EntityPropSheet::Update() {
 	}
 }
 
-ShaderOptionsSheet::ShaderOptionsSheet(String title, String name, bool fragmentParams) : PropSheet(title, name){
+ShaderOptionsSheet::ShaderOptionsSheet(String title, String name) : PropSheet(title, name){
 	shader = NULL;
-	this->fragmentParams = fragmentParams;
 	propHeight = 40;
 }
 
@@ -1383,6 +1382,7 @@ void ShaderOptionsSheet::clearShader() {
 void ShaderOptionsSheet::setOptionsFromParams(std::vector<ProgramParam> &params) {
 
 	for(int i=0; i < params.size(); i++) {
+		if(!CoreServices::getInstance()->getRenderer()->getDataPointerForName(params[i].name)) {			
 				switch (params[i].type) {
 				
 					case ProgramParam::PARAM_NUMBER:
@@ -1410,7 +1410,8 @@ void ShaderOptionsSheet::setOptionsFromParams(std::vector<ProgramParam> &params)
 					}
 					break;
 					
-				}				
+				}	
+			}
 		}	
 }