Browse Source

Slight material speed improvements and additional sound stuff

Ivan Safrin 13 years ago
parent
commit
37ba78c602

+ 2 - 0
Core/Contents/Include/PolyMaterial.h

@@ -57,6 +57,8 @@ namespace Polycode {
 				
 			bool fp16RenderTargets;
 			
+			void *shaderModule;
+			
 		protected:
 		
 			std::vector<Shader*> materialShaders;

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

@@ -101,6 +101,7 @@ namespace Polycode {
 		
 		Number getPlaybackTime();
 		
+		void seekTo(Number time);
 		/**
 		* Returns the current sample offset (playback progress) of this sound.
 		* @return The sample offset if it is known, -1 otherwise.

+ 13 - 8
Core/Contents/Source/PolyGLRenderer.cpp

@@ -752,7 +752,7 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 	glMaterialfv(GL_FRONT, GL_AMBIENT, data4);
 
 	FixedShaderBinding *fBinding;
-
+	
 	switch(material->getShader(shaderIndex)->getType()) {
 		case Shader::FIXED_SHADER:
 //			FixedShader *fShader = (FixedShader*)material->getShader();
@@ -761,13 +761,18 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 //			setTexture(fShader->getDiffuseTexture());
 		break;	
 		case Shader::MODULE_SHADER:		
-			currentMaterial = material;			
-			for(int m=0; m < shaderModules.size(); m++) {
-				PolycodeShaderModule *shaderModule = shaderModules[m];	
-				if(shaderModule->hasShader(material->getShader(shaderIndex))) {
-					shaderModule->applyShaderMaterial(this, material, localOptions, shaderIndex);
-					currentShaderModule = shaderModule;
-				}
+			currentMaterial = material;
+			if(material->shaderModule == NULL) {
+				for(int m=0; m < shaderModules.size(); m++) {
+					PolycodeShaderModule *shaderModule = shaderModules[m];	
+					if(shaderModule->hasShader(material->getShader(shaderIndex))) {
+						material->shaderModule = (void*)shaderModule;
+					}
+				}	
+			} else {
+				PolycodeShaderModule *shaderModule = (PolycodeShaderModule*)material->shaderModule;
+				shaderModule->applyShaderMaterial(this, material, localOptions, shaderIndex);
+				currentShaderModule = shaderModule;
 			}
 		break;
 	}

+ 5 - 3
Core/Contents/Source/PolyGLSLShaderModule.cpp

@@ -402,8 +402,6 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 
 	GLSLShader *glslShader = (GLSLShader*)material->getShader(shaderIndex);
 
-	renderer->sortLights();
-
 	glPushMatrix();
 	glLoadIdentity();
 	
@@ -412,7 +410,11 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 	int numRendererSpotLights = renderer->getNumSpotLights();
 	
 	int numTotalLights = glslShader->numAreaLights + glslShader->numSpotLights;
-		
+	
+	if(numTotalLights > 0) {
+		renderer->sortLights();	
+	}
+	
 	for(int i=0 ; i < numTotalLights; i++) {
 		GLfloat resetData[] = {0.0, 0.0, 0.0, 0.0};				
 		glLightfv (GL_LIGHT0+i, GL_DIFFUSE, resetData);	

+ 1 - 0
Core/Contents/Source/PolyMaterial.cpp

@@ -31,6 +31,7 @@ Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	specularValue = 75.0;
 	specularStrength = 1.0;
 	fp16RenderTargets = false;
+	shaderModule = NULL;
 }
 
 Material::~Material() {

+ 3 - 0
Core/Contents/Source/PolySceneLabel.cpp

@@ -65,6 +65,9 @@ void SceneLabel::setText(const String& newText) {
 		mesh->getPolygon(i)->flipUVY();
 	}
 	
+	if(useVertexBuffer)
+		CoreServices::getInstance()->getRenderer()->createVertexBufferForMesh(mesh);
+	
 	// TODO: resize it here
 	
 	bBoxRadius = label->getWidth()*scale;

+ 6 - 0
Core/Contents/Source/PolySound.cpp

@@ -186,6 +186,12 @@ int Sound::getOffset() {
 	return off;
 }
 
+void Sound::seekTo(Number time) {
+	if(time > getPlaybackDuration())
+		return;
+	alSourcef(soundSource, AL_SEC_OFFSET, time);
+}
+
 int Sound::getSampleLength() {
 	return sampleLength;
 }