Kaynağa Gözat

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 yıl önce
ebeveyn
işleme
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"/>
 			<fp source="default/UnlitUntextured.frag"/>
 		</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">		
 			<vp source="default/UnlitUntextured.vert"/>
 			<fp source="default/UnlitWireframe.frag"/>
@@ -23,6 +27,10 @@
 			<shader name="UnlitUntextured">
 			</shader>
 		</material>	
+		<material name="UnlitUntexturedVertexColor">
+			<shader name="UnlitUntexturedVertexColor">
+			</shader>
+		</material>			
 		<material name="UnlitWireframe">
 			<shader name="UnlitWireframe" wireframe="true">
 			</shader>

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

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

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

@@ -320,11 +320,6 @@ namespace Polycode {
 			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;
 
             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/PolyCore.h"
 #include "polycode/core/PolyTexture.h"
+#include "polycode/core/PolyMesh.h"
 
 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) {
 	this->name = name;

+ 0 - 2
src/core/PolyMesh.cpp

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

+ 0 - 2
src/core/PolyParticleEmitter.cpp

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

+ 3 - 11
src/core/PolySceneMesh.cpp

@@ -105,11 +105,7 @@ void SceneMesh::setMesh(Mesh *mesh) {
 
 void SceneMesh::rebuildAttributes() {
     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++)  {
         ShaderPass shaderPass = material->getShaderPass(i);
-        shaderPass.shaderBinding = new ShaderBinding();
-        
+        shaderPass.shaderBinding = new ShaderBinding();        
         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);
     }
     

+ 1 - 1
src/ide/PolycodeEntityEditor.cpp

@@ -1787,7 +1787,7 @@ void EntityEditorMainView::setOverlayWireframeRecursive(Entity *targetEntity, bo
                 wireframePass.wireframe = true;
                 wireframePass.shaderBinding = new ShaderBinding();
                 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));
 
                 

+ 0 - 2
src/ide/PolycodeSpriteEditor.cpp

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

+ 1 - 0
src/ide/TransformGizmo.cpp

@@ -260,6 +260,7 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	centerCircle->billboardMode = true;
 	addChild(centerCircle);
     centerCircle->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX());
+    centerCircle->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
 		  
 	trasnformDecorators = new Entity();
 	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()->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;	
 
@@ -81,6 +85,8 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	mainColorRect->setPosition(padding, topPadding+padding);
 	addChild(mainColorRect);
 	addChild(mainFrame);
+    
+    mainColorRect->setMaterialByName("UnlitUntexturedVertexColor");
 
 	hueFrame = new UIImage(hueFrameImage, 20, 187);
 	hueFrame->setPosition(mainFrame->getPosition().x + mainFrame->getWidth()+10, topPadding+padding);
@@ -100,7 +106,6 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	mainSelector->setPosition(mainFrame->getPosition());
 	addChild(mainSelector);	
 	
-	mainColorRect->getMesh()->useVertexColors = true;
 	
 	mainColorRect->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 	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[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() {