Sfoglia il codice sorgente

More new renderer fixes. Added UnlitUntextured shader, made labels render properly

Ivan Safrin 10 anni fa
parent
commit
06bcd0976e

BIN
Assets/Default asset pack/default.pak


+ 2 - 1
Assets/Default asset pack/default/Unlit.frag

@@ -1,6 +1,7 @@
 uniform sampler2D diffuse;
+uniform vec4 entityColor;
 varying vec2 texCoordVar;
 
 void main() {
-	gl_FragColor = texture2D(diffuse, texCoordVar);
+	gl_FragColor = texture2D(diffuse, texCoordVar) * entityColor;
 }

+ 5 - 0
Assets/Default asset pack/default/UnlitUntextured.frag

@@ -0,0 +1,5 @@
+uniform vec4 entityColor;
+
+void main() {
+	gl_FragColor = entityColor;
+}

+ 11 - 0
Assets/Default asset pack/default/UnlitUntextured.vert

@@ -0,0 +1,11 @@
+attribute vec4 position;
+
+uniform mat4 modelMatrix;
+uniform mat4 viewMatrix;
+uniform mat4 projectionMatrix;
+
+void main()
+{
+	vec4 p = viewMatrix * modelMatrix  * position;
+	gl_Position = projectionMatrix * p;
+}

+ 10 - 0
Assets/Default asset pack/default/default.mat

@@ -5,6 +5,10 @@
 			<vp source="default/Unlit.vert"/>
 			<fp source="default/Unlit.frag"/>
 		</shader>
+		<shader type="glsl" name="UnlitUntextured" numPointLights="0" numSpotLights="0">		
+			<vp source="default/UnlitUntextured.vert"/>
+			<fp source="default/UnlitUntextured.frag"/>
+		</shader>		
 	</shaders>	
 	<materials>	
 		<material name="Unlit">
@@ -13,5 +17,11 @@
 				</textures>				
 			</shader>
 		</material>
+		<material name="UnlitUntextured">
+			<shader name="UnlitUntextured">
+				<textures>
+				</textures>				
+			</shader>
+		</material>		
 	</materials>
 </polycode>

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

@@ -66,6 +66,7 @@ namespace Polycode {
         void createProgram(ShaderProgram *program);
         void createShader(Shader *shader);
         void beginDrawCall();
+        void endDrawCall();
         void setBlendingMode(unsigned int blendingMode);
         
         void createVertexBuffer(VertexDataArray *dataArray);

+ 1 - 1
Core/Contents/Include/PolyRenderer.h

@@ -63,7 +63,7 @@ namespace Polycode {
             virtual void enableBackfaceCulling(bool val) = 0;
         
             virtual void beginDrawCall() = 0;
-        
+            virtual void endDrawCall() = 0;
     };
     
     class _PolyExport RendererThreadJob {

+ 7 - 2
Core/Contents/Source/PolyOpenGLGraphicsInterface.cpp

@@ -50,7 +50,7 @@ void OpenGLGraphicsInterface::setUniformMatrix(GLint paramLocation, const Polyco
 }
 
 void OpenGLGraphicsInterface::setParamInShader(Shader *shader, ProgramParam *param, LocalShaderParam *localParam) {
-
+    
     GLuint paramLocation = *((GLuint*) param->platformData);
     
     switch(param->type) {
@@ -82,7 +82,7 @@ void OpenGLGraphicsInterface::setParamInShader(Shader *shader, ProgramParam *par
                 Color color = localParam->getColor();
                 glUniform4f(paramLocation, color.r, color.g, color.b, color.a);
             } else {
-                glUniform4f(paramLocation, 0.0f, 0.0f, 0.0f, 0.0f);
+                glUniform4f(paramLocation, 1.0f, 1.0f, 1.0f, 1.0f);
             }
             break;
         case ProgramParam::PARAM_MATRIX:
@@ -157,6 +157,11 @@ void OpenGLGraphicsInterface::beginDrawCall() {
     textureIndex = 0;
 }
 
+void OpenGLGraphicsInterface::endDrawCall() {
+    glUseProgram(0);
+    currentShaderID = -1;
+}
+
 void OpenGLGraphicsInterface::useShader(Shader *shader) {
     GLuint shaderID = *((GLuint*) shader->platformData);
     if(shaderID != currentShaderID) {

+ 6 - 2
Core/Contents/Source/PolyRenderer.cpp

@@ -109,9 +109,12 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                     
                     LocalShaderParam *localParam = rendererShaderBinding->getLocalParam(p);
                     if(localParam) {
-                        if(!localParam->param) {
+
+        // TODO: can't cache the param here, need a better system (move to material binding?)
+                        
+//                        if(!localParam->param) {
                             localParam->param = shader->getParamPointer(localParam->name);
-                        }
+  //                      }
                         if(localParam->param) {
                             interface->setParamInShader(shader, localParam->param, localParam);
                         }
@@ -179,6 +182,7 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                     interface->disableAttribute(shader, attribute);
                 }
                 
+                interface->endDrawCall();
             }
         }
     }

+ 7 - 4
Core/Contents/Source/PolySceneLabel.cpp

@@ -37,6 +37,8 @@ bool SceneLabel::createMipmapsForLabels = true;
 
 SceneLabel::SceneLabel(const String& text, int size, const String& fontName, int amode, Number actualHeight, bool premultiplyAlpha, const Color &backgroundColor, const Color &foregroundColor) : ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1){
 
+    setMaterialByName("Unlit");
+    
 	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size * CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX(), amode, premultiplyAlpha, backgroundColor, foregroundColor);
     
 	positionAtBaseline = SceneLabel::defaultPositionAtBaseline;
@@ -130,11 +132,12 @@ void SceneLabel::updateFromLabel() {
 }
 
 void SceneLabel::Render(GPUDrawBuffer *buffer) {
-	if(positionAtBaseline) {
-        // RENDERER_TODO
-		//CoreServices::getInstance()->getRenderer()->translate2D(0.0, (((Number)label->getSize()*labelScale) * -1.0 / CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()) + (((Number)label->getBaselineAdjust())*labelScale/CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()));
-	}
 	ScenePrimitive::Render(buffer);
+	if(positionAtBaseline) {
+        if(buffer->drawCalls.size() > 0) {
+            buffer->drawCalls[buffer->drawCalls.size()-1].modelMatrix.Translate(0.0, (((Number)label->getSize()*labelScale) * -1.0 / CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()) + (((Number)label->getBaselineAdjust())*labelScale/CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()), 0.0);
+        }
+    }
 }
 
 int SceneLabel::getTextWidthForString(String text) {

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

@@ -58,7 +58,7 @@ SceneMesh::SceneMesh(const String& fileName) : Entity(), material(NULL), skeleto
     backfaceCulled = true;
 	alphaTest = false;
     sendBoneMatricesToMaterial = false;
-    setMaterialByName("Unlit");
+    setMaterialByName("UnlitUntextured");
 }
 
 SceneMesh::SceneMesh(Mesh *mesh) : Entity(), material(NULL), skeleton(NULL), localShaderOptions(NULL), skeletalVertexPositions(3, RenderDataArray::VERTEX_DATA_ARRAY), skeletalVertexNormals(3, RenderDataArray::NORMAL_DATA_ARRAY) {
@@ -77,7 +77,7 @@ SceneMesh::SceneMesh(Mesh *mesh) : Entity(), material(NULL), skeleton(NULL), loc
     backfaceCulled = true;
 	alphaTest = false;
     sendBoneMatricesToMaterial = false;
-    setMaterialByName("Unlit");
+    setMaterialByName("UnlitUntextured");
 }
 
 SceneMesh::SceneMesh(int meshType) : material(NULL), skeleton(NULL), localShaderOptions(NULL), skeletalVertexPositions(3, RenderDataArray::VERTEX_DATA_ARRAY), skeletalVertexNormals(3, RenderDataArray::NORMAL_DATA_ARRAY) {
@@ -94,7 +94,7 @@ SceneMesh::SceneMesh(int meshType) : material(NULL), skeleton(NULL), localShader
     backfaceCulled = true;
 	alphaTest = false;
     sendBoneMatricesToMaterial = false;
-    setMaterialByName("Unlit");    
+    setMaterialByName("UnlitUntextured");    
 }
 
 void SceneMesh::setMesh(Mesh *mesh) {
@@ -186,6 +186,8 @@ void SceneMesh::setMaterial(Material *material) {
 	this->material = material;
     localShaderOptions = new ShaderBinding();
     
+    localShaderOptions->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
+    
     localShaderOptions->addAttributeBinding("texCoord", &mesh->vertexTexCoordArray);
     localShaderOptions->addAttributeBinding("position", &mesh->vertexPositionArray);
     localShaderOptions->addAttributeBinding("normal", &mesh->vertexNormalArray);

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

@@ -32,6 +32,7 @@ using namespace Polycode;
 
 
 SceneSprite::SceneSprite(SpriteSet *spriteSet) : SceneMesh(Mesh::TRI_MESH) {
+    setMaterialByName("Unlit");    
     currentSprite = NULL;
     currentSpriteState = NULL;
     this->spriteSet = NULL;

BIN
Examples/C++/Resources/default.pak


+ 24 - 3
Modules/Contents/UI/Source/PolyUIElement.cpp

@@ -135,8 +135,10 @@ UILabel::UILabel(const String& text, int size, const String& fontName, int amode
     label->positionAtBaseline = true;
     label->setAnchorPoint(-1.0, -1.0, 0.0);
 	label->snapToPixels = true;
-	
-	color.setColorHexFromString(conf->getStringValue("Polycode", "uiDefaultFontColor"));
+    label->depthTest = false;
+    label->depthWrite = false;
+    
+	label->color.setColorHexFromString(conf->getStringValue("Polycode", "uiDefaultFontColor"));
 	addChild(label);
 	setLocalBoundingBox(label->getLocalBoundingBox());
 }
@@ -261,13 +263,16 @@ void UIRect::initRect(Number width, Number height) {
     rectMesh->addIndexedFace(0, 1, 2);
     rectMesh->addIndexedFace(0, 2, 3);
     
-    material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Unlit");
+    material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "UnlitUntextured");
     localShaderOptions = new ShaderBinding();
     
+    localShaderOptions->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
+    
     localShaderOptions->addAttributeBinding("texCoord", &rectMesh->vertexTexCoordArray);
     localShaderOptions->addAttributeBinding("position", &rectMesh->vertexPositionArray);
 
     if(texture) {
+        material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Unlit");
         localShaderOptions->setTextureForParam("diffuse", texture);
     }
 }
@@ -279,14 +284,30 @@ UIRect::~UIRect() {
 
 void UIRect::loadTexture(String fileName) {
 
+    material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Unlit");
+    
 	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
 	texture = materialManager->createTextureFromFile(fileName, materialManager->clampDefault, false);
+    
+    if(!texture) {
+        material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "UnlitUntextured");
+    } else {
+        material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Unlit");
+    }
+    
     if(localShaderOptions) {
         localShaderOptions->setTextureForParam("diffuse", texture);
     }
 }
 
 void UIRect::setTexture(Texture *texture) {
+    
+    if(!texture) {
+        material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "UnlitUntextured");
+    } else {
+        material =  (Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Unlit");
+    }
+    
 	this->texture = texture;
     if(localShaderOptions) {
         localShaderOptions->setTextureForParam("diffuse", texture);