소스 검색

Mesh attributes now set automatically in shader based on their string name, added vertex color shader, removed useVertexColors option as they are now sent automatically if required, fixed color picker in UI

Ivan Safrin 10 년 전
부모
커밋
bfabdb993e

BIN
assets/default/default.pak


+ 10 - 0
assets/default/default/UnlitUntexturedVertexColor.frag

@@ -0,0 +1,10 @@
+#ifdef GLES2
+	precision mediump float;
+#endif
+
+uniform vec4 entityColor;
+varying vec4 varColor;
+
+void main() {
+	gl_FragColor = varColor * entityColor;
+}

+ 19 - 0
assets/default/default/UnlitUntexturedVertexColor.vert

@@ -0,0 +1,19 @@
+#ifdef GLES2
+	precision mediump float;
+#endif
+
+attribute vec4 position;
+attribute vec4 color;
+
+uniform mat4 modelMatrix;
+uniform mat4 viewMatrix;
+uniform mat4 projectionMatrix;
+
+varying vec4 varColor;
+
+void main()
+{
+	vec4 p = viewMatrix * modelMatrix  * position;
+	gl_Position = projectionMatrix * p;
+	varColor = color;
+}

+ 8 - 0
assets/default/default/default.mat

@@ -9,6 +9,10 @@
 			<vp source="default/UnlitUntextured.vert"/>
 			<vp source="default/UnlitUntextured.vert"/>
 			<fp source="default/UnlitUntextured.frag"/>
 			<fp source="default/UnlitUntextured.frag"/>
 		</shader>
 		</shader>
+		<shader type="glsl" name="UnlitUntexturedVertexColor" numPointLights="0" numSpotLights="0">		
+			<vp source="default/UnlitUntexturedVertexColor.vert"/>
+			<fp source="default/UnlitUntexturedVertexColor.frag"/>
+		</shader>		
 		<shader type="glsl" name="UnlitWireframe" numPointLights="0" numSpotLights="0">		
 		<shader type="glsl" name="UnlitWireframe" numPointLights="0" numSpotLights="0">		
 			<vp source="default/UnlitUntextured.vert"/>
 			<vp source="default/UnlitUntextured.vert"/>
 			<fp source="default/UnlitWireframe.frag"/>
 			<fp source="default/UnlitWireframe.frag"/>
@@ -23,6 +27,10 @@
 			<shader name="UnlitUntextured">
 			<shader name="UnlitUntextured">
 			</shader>
 			</shader>
 		</material>	
 		</material>	
+		<material name="UnlitUntexturedVertexColor">
+			<shader name="UnlitUntexturedVertexColor">
+			</shader>
+		</material>			
 		<material name="UnlitWireframe">
 		<material name="UnlitWireframe">
 			<shader name="UnlitWireframe" wireframe="true">
 			<shader name="UnlitWireframe" wireframe="true">
 			</shader>
 			</shader>

+ 4 - 0
include/polycode/core/PolyMaterial.h

@@ -32,11 +32,15 @@ namespace Polycode {
 	class Shader;
 	class Shader;
 	class ShaderBinding;
 	class ShaderBinding;
 	class ShaderRenderTarget;
 	class ShaderRenderTarget;
+    class Mesh;
     
     
     class _PolyExport ShaderPass {
     class _PolyExport ShaderPass {
         public:
         public:
             ShaderPass();
             ShaderPass();
             ShaderPass(Shader *shader);
             ShaderPass(Shader *shader);
+        
+            void setExpectedAttributes(Mesh *mesh);
+        
             Shader *shader;
             Shader *shader;
             bool wireframe;
             bool wireframe;
             unsigned short blendingMode;
             unsigned short blendingMode;

+ 0 - 5
include/polycode/core/PolyMesh.h

@@ -320,11 +320,6 @@ namespace Polycode {
 			static const int LINE_LOOP_MESH = 7;
 			static const int LINE_LOOP_MESH = 7;
         
         
         
         
-		
-			/**
-			* If set to true, the renderer will use the vertex colors instead of entity color transform to render this mesh.
-			*/
-			bool useVertexColors;
             bool indexedMesh;
             bool indexedMesh;
 
 
             void addIndexedFace(unsigned int i1, unsigned int i2);
             void addIndexedFace(unsigned int i1, unsigned int i2);

+ 38 - 0
src/core/PolyMaterial.cpp

@@ -27,6 +27,7 @@
 #include "polycode/core/PolyCoreServices.h"
 #include "polycode/core/PolyCoreServices.h"
 #include "polycode/core/PolyCore.h"
 #include "polycode/core/PolyCore.h"
 #include "polycode/core/PolyTexture.h"
 #include "polycode/core/PolyTexture.h"
+#include "polycode/core/PolyMesh.h"
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
@@ -48,6 +49,43 @@ ShaderPass::ShaderPass(Shader *shader) :
     
     
 }
 }
 
 
+void ShaderPass::setExpectedAttributes(Mesh *mesh) {
+    if(!shader || !shaderBinding) {
+        return;
+    }
+    
+    shaderBinding->attributes.clear();
+    
+    for(int i=0; i < shader->expectedAttributes.size(); i++) {
+        
+        VertexDataArray *targetArray = NULL;
+        
+        if(shader->expectedAttributes[i].name == "position") {
+            targetArray = &mesh->vertexPositionArray;
+        } else if(shader->expectedAttributes[i].name == "texCoord"){
+            targetArray = &mesh->vertexTexCoordArray;
+        } else if(shader->expectedAttributes[i].name == "normal") {
+            targetArray = &mesh->vertexNormalArray;
+        } else if(shader->expectedAttributes[i].name == "color") {
+            targetArray = &mesh->vertexColorArray;
+        } else if(shader->expectedAttributes[i].name == "tangent") {
+            targetArray = &mesh->vertexTangentArray;
+        } else if(shader->expectedAttributes[i].name == "texCoord2") {
+            targetArray = &mesh->vertexTexCoord2Array;
+        } else if(shader->expectedAttributes[i].name == "boneWeights") {
+            targetArray = &mesh->vertexBoneWeightArray;
+        } else if(shader->expectedAttributes[i].name == "boneIndices") {
+            targetArray = &mesh->vertexBoneIndexArray;
+        }
+        
+        AttributeBinding *attributeBinding = shaderBinding->getAttributeBindingByName(shader->expectedAttributes[i].name);
+        if(attributeBinding) {
+            attributeBinding->vertexData = targetArray;
+        } else {
+            shaderBinding->addAttributeBinding(shader->expectedAttributes[i].name, targetArray);
+        }
+    }
+}
 
 
 Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	this->name = name;
 	this->name = name;

+ 0 - 2
src/core/PolyMesh.cpp

@@ -49,7 +49,6 @@ indexArray(RenderDataArray::INDEX_DATA_ARRAY)
     meshType = TRI_MESH;
     meshType = TRI_MESH;
     meshHasVertexBuffer = false;
     meshHasVertexBuffer = false;
     loadMesh(fileName);
     loadMesh(fileName);
-    useVertexColors = false;
 }
 }
 
 
 Mesh::Mesh(int meshType)
 Mesh::Mesh(int meshType)
@@ -66,7 +65,6 @@ indexArray(RenderDataArray::INDEX_DATA_ARRAY)
 
 
     this->meshType = meshType;
     this->meshType = meshType;
     meshHasVertexBuffer = false;
     meshHasVertexBuffer = false;
-    useVertexColors = false;
     indexedMesh = false;
     indexedMesh = false;
 }
 }
 
 

+ 0 - 2
src/core/PolyParticleEmitter.cpp

@@ -32,7 +32,6 @@ SceneParticleEmitter::SceneParticleEmitter(unsigned int particleCount, Number li
     
     
     core = CoreServices::getInstance()->getCore();
     core = CoreServices::getInstance()->getCore();
     motionPerlin = new Perlin(3,5,1.0,RANDOM_NUMBER);
     motionPerlin = new Perlin(3,5,1.0,RANDOM_NUMBER);
-    mesh->useVertexColors = true;
     depthWrite = false;
     depthWrite = false;
     systemEnabled = true;
     systemEnabled = true;
     setParticleCount(particleCount);
     setParticleCount(particleCount);
@@ -102,7 +101,6 @@ void SceneParticleEmitter::applyClone(Entity *clone, bool deepClone, bool ignore
     cloneEmitter->colorCurveA = colorCurveA;
     cloneEmitter->colorCurveA = colorCurveA;
     cloneEmitter->useColorCurves = useColorCurves;
     cloneEmitter->useColorCurves = useColorCurves;
     
     
-    cloneEmitter->getMesh()->useVertexColors = true;
 }
 }
 
 
 void SceneParticleEmitter::resetParticle(unsigned int index) {
 void SceneParticleEmitter::resetParticle(unsigned int index) {

+ 3 - 11
src/core/PolySceneMesh.cpp

@@ -105,11 +105,7 @@ void SceneMesh::setMesh(Mesh *mesh) {
 
 
 void SceneMesh::rebuildAttributes() {
 void SceneMesh::rebuildAttributes() {
     for(int i=0; i < shaderPasses.size(); i++) {
     for(int i=0; i < shaderPasses.size(); i++) {
-        if(shaderPasses[i].shaderBinding) {
-            shaderPasses[i].shaderBinding->getAttributeBindingByName("texCoord")->vertexData = &mesh->vertexTexCoordArray;
-            shaderPasses[i].shaderBinding->getAttributeBindingByName("position")->vertexData = &mesh->vertexPositionArray;
-            shaderPasses[i].shaderBinding->getAttributeBindingByName("normal")->vertexData = &mesh->vertexNormalArray;
-        }
+        shaderPasses[i].setExpectedAttributes(mesh);
     }
     }
 }
 }
 
 
@@ -209,13 +205,9 @@ void SceneMesh::setMaterial(Material *material) {
     
     
     for(int i=0; i < material->getNumShaderPasses(); i++)  {
     for(int i=0; i < material->getNumShaderPasses(); i++)  {
         ShaderPass shaderPass = material->getShaderPass(i);
         ShaderPass shaderPass = material->getShaderPass(i);
-        shaderPass.shaderBinding = new ShaderBinding();
-        
+        shaderPass.shaderBinding = new ShaderBinding();        
         shaderPass.shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
         shaderPass.shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
-        shaderPass.shaderBinding->addAttributeBinding("texCoord", &mesh->vertexTexCoordArray);
-        shaderPass.shaderBinding->addAttributeBinding("position", &mesh->vertexPositionArray);
-        shaderPass.shaderBinding->addAttributeBinding("normal", &mesh->vertexNormalArray);
-        
+        shaderPass.setExpectedAttributes(mesh);
         shaderPasses.push_back(shaderPass);
         shaderPasses.push_back(shaderPass);
     }
     }
     
     

+ 1 - 1
src/ide/PolycodeEntityEditor.cpp

@@ -1787,7 +1787,7 @@ void EntityEditorMainView::setOverlayWireframeRecursive(Entity *targetEntity, bo
                 wireframePass.wireframe = true;
                 wireframePass.wireframe = true;
                 wireframePass.shaderBinding = new ShaderBinding();
                 wireframePass.shaderBinding = new ShaderBinding();
                 wireframePass.blendingMode = Renderer::BLEND_MODE_NORMAL;
                 wireframePass.blendingMode = Renderer::BLEND_MODE_NORMAL;
-                wireframePass.shaderBinding->addAttributeBinding("position", &sceneMesh->getMesh()->vertexPositionArray);
+                wireframePass.setExpectedAttributes(sceneMesh->getMesh());
                 wireframePass.shaderBinding->addParam(ProgramParam::PARAM_COLOR, "wireframeColor")->setColor(Color(0.5, 0.6, 1.0, 0.75));
                 wireframePass.shaderBinding->addParam(ProgramParam::PARAM_COLOR, "wireframeColor")->setColor(Color(0.5, 0.6, 1.0, 0.75));
 
 
                 
                 

+ 0 - 2
src/ide/PolycodeSpriteEditor.cpp

@@ -1140,12 +1140,10 @@ void SpriteStateEditBar::refreshBar() {
     Mesh *meshBg = barMeshBg->getMesh();
     Mesh *meshBg = barMeshBg->getMesh();
     meshBg->clearMesh();
     meshBg->clearMesh();
     meshBg->indexedMesh = true;
     meshBg->indexedMesh = true;
-    meshBg->useVertexColors = true;
     
     
     Mesh *meshTicks = frameTicksMesh->getMesh();
     Mesh *meshTicks = frameTicksMesh->getMesh();
     meshTicks->clearMesh();
     meshTicks->clearMesh();
     meshTicks->indexedMesh = true;
     meshTicks->indexedMesh = true;
-    meshTicks->useVertexColors = true;
     
     
     Mesh *meshGrips = frameGripsMesh->getMesh();
     Mesh *meshGrips = frameGripsMesh->getMesh();
     meshGrips->clearMesh();
     meshGrips->clearMesh();

+ 1 - 0
src/ide/TransformGizmo.cpp

@@ -260,6 +260,7 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	centerCircle->billboardMode = true;
 	centerCircle->billboardMode = true;
 	addChild(centerCircle);
 	addChild(centerCircle);
     centerCircle->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX());
     centerCircle->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX());
+    centerCircle->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
 		  
 		  
 	trasnformDecorators = new Entity();
 	trasnformDecorators = new Entity();
 	addChild(trasnformDecorators);
 	addChild(trasnformDecorators);

+ 8 - 3
src/modules/ui/PolyUIColorBox.cpp

@@ -72,8 +72,12 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
     
     
     mainColorRect->getMesh()->indexedMesh = true;
     mainColorRect->getMesh()->indexedMesh = true;
     
     
-    mainColorRect->getMesh()->addIndexedFace(0, 1, 2);
-    mainColorRect->getMesh()->addIndexedFace(0, 2, 3);
+//    mainColorRect->getMesh()->addIndexedFace(0, 1, 2);
+//    mainColorRect->getMesh()->addIndexedFace(0, 2, 3);
+    
+    mainColorRect->getMesh()->addIndexedFace(3, 0, 1);
+    mainColorRect->getMesh()->addIndexedFace(3, 1, 2);
+    
     
     
 	mainColorRect->backfaceCulled = false;	
 	mainColorRect->backfaceCulled = false;	
 
 
@@ -81,6 +85,8 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	mainColorRect->setPosition(padding, topPadding+padding);
 	mainColorRect->setPosition(padding, topPadding+padding);
 	addChild(mainColorRect);
 	addChild(mainColorRect);
 	addChild(mainFrame);
 	addChild(mainFrame);
+    
+    mainColorRect->setMaterialByName("UnlitUntexturedVertexColor");
 
 
 	hueFrame = new UIImage(hueFrameImage, 20, 187);
 	hueFrame = new UIImage(hueFrameImage, 20, 187);
 	hueFrame->setPosition(mainFrame->getPosition().x + mainFrame->getWidth()+10, topPadding+padding);
 	hueFrame->setPosition(mainFrame->getPosition().x + mainFrame->getWidth()+10, topPadding+padding);
@@ -100,7 +106,6 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	mainSelector->setPosition(mainFrame->getPosition());
 	mainSelector->setPosition(mainFrame->getPosition());
 	addChild(mainSelector);	
 	addChild(mainSelector);	
 	
 	
-	mainColorRect->getMesh()->useVertexColors = true;
 	
 	
 	mainColorRect->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 	mainColorRect->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 	mainColorRect->addEventListener(this, InputEvent::EVENT_MOUSEUP);
 	mainColorRect->addEventListener(this, InputEvent::EVENT_MOUSEUP);

+ 1 - 3
src/modules/ui/PolyUIElement.cpp

@@ -320,9 +320,7 @@ void UIRect::setMaterial(Material *material) {
     shaderPasses.push_back(pass);
     shaderPasses.push_back(pass);
     
     
     shaderPasses[0].shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
     shaderPasses[0].shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
-    shaderPasses[0].shaderBinding->addAttributeBinding("texCoord", &rectMesh->vertexTexCoordArray);
-    shaderPasses[0].shaderBinding->addAttributeBinding("position", &rectMesh->vertexPositionArray);
-    
+    shaderPasses[0].setExpectedAttributes(rectMesh);
 }
 }
 
 
 Texture *UIRect::getTexture() {
 Texture *UIRect::getTexture() {