Sfoglia il codice sorgente

Saving and loading particle systems in entity editor, tweaked particle shader to take into account vertex color alpha

Ivan Safrin 12 anni fa
parent
commit
0ed9d27bda

BIN
Assets/Default asset pack/default.pak


+ 1 - 1
Assets/Default asset pack/default/DefaultParticleShader.frag

@@ -96,7 +96,7 @@ void main()
 	fogFactor = clamp(fogFactor, 0.0, 1.0);
 	fogFactor = clamp(fogFactor, 0.0, 1.0);
 
 
 	color = mix(gl_Fog.color, color, fogFactor );    
 	color = mix(gl_Fog.color, color, fogFactor );    
-	color.a = diffuse_color.a * texColor.a;  	
+	color.a = diffuse_color.a * texColor.a * vertexColor.a;  	
 	gl_FragColor = color;
 	gl_FragColor = color;
 
 
 }
 }

+ 1 - 1
Assets/Default asset pack/default/DefaultShader.frag

@@ -115,7 +115,7 @@ void main()
 	fogFactor = clamp(fogFactor, 0.0, 1.0);
 	fogFactor = clamp(fogFactor, 0.0, 1.0);
 
 
 	color = mix(gl_Fog.color, color, fogFactor );   
 	color = mix(gl_Fog.color, color, fogFactor );   
-	color.a = vertexColor.a * texColor.a;	
+	color.a = vertexColor.a * texColor.a * diffuse_color.a;	
 	gl_FragColor = color;
 	gl_FragColor = color;
 
 
 }
 }

+ 51 - 7
Core/Contents/Source/PolySceneEntityInstance.cpp

@@ -177,29 +177,33 @@ void SceneEntityInstance::parseObjectIntoCurve(ObjectEntry *entry, BezierCurve *
 		for(int i=0; i < controlPoints->length; i++) {		
 		for(int i=0; i < controlPoints->length; i++) {		
 			ObjectEntry *controlPoint = ((*controlPoints))[i];		
 			ObjectEntry *controlPoint = ((*controlPoints))[i];		
 			if(controlPoint) {
 			if(controlPoint) {
-				Vector2 vpt1;
-				Vector2 vpt2;
-				Vector2 vpt3;
+				Vector3 vpt1;
+				Vector3 vpt2;
+				Vector3 vpt3;
 												
 												
 				ObjectEntry *pt1 = ((*controlPoint))["pt1"];
 				ObjectEntry *pt1 = ((*controlPoint))["pt1"];
 				if(pt1) {
 				if(pt1) {
 					vpt1.x = ((*pt1))["x"]->NumberVal;
 					vpt1.x = ((*pt1))["x"]->NumberVal;
-					vpt1.y = ((*pt1))["y"]->NumberVal;					
+					vpt1.y = ((*pt1))["y"]->NumberVal;
+					vpt1.z = ((*pt1))["z"]->NumberVal;
 				}
 				}
 
 
 				ObjectEntry *pt2 = ((*controlPoint))["pt2"];
 				ObjectEntry *pt2 = ((*controlPoint))["pt2"];
 				if(pt2) {
 				if(pt2) {
 					vpt2.x = ((*pt2))["x"]->NumberVal;
 					vpt2.x = ((*pt2))["x"]->NumberVal;
-					vpt2.y = ((*pt2))["y"]->NumberVal;					
+					vpt2.y = ((*pt2))["y"]->NumberVal;
+					vpt2.z = ((*pt2))["z"]->NumberVal;
+					
 				}
 				}
 
 
 				ObjectEntry *pt3 = ((*controlPoint))["pt3"];
 				ObjectEntry *pt3 = ((*controlPoint))["pt3"];
 				if(pt3) {
 				if(pt3) {
 					vpt3.x = ((*pt3))["x"]->NumberVal;
 					vpt3.x = ((*pt3))["x"]->NumberVal;
-					vpt3.y = ((*pt3))["y"]->NumberVal;					
+					vpt3.y = ((*pt3))["y"]->NumberVal;
+					vpt3.z = ((*pt3))["z"]->NumberVal;
 				}
 				}
 
 
-				curve->addControlPoint(vpt1.x, vpt1.y, 0.0, vpt2.x, vpt2.y, 0.0, vpt3.x, vpt3.y, 0.0);
+				curve->addControlPoint(vpt1.x, vpt1.y, vpt1.z, vpt2.x, vpt2.y, vpt2.z, vpt3.x, vpt3.y, vpt3.z);
 			}
 			}
 		}
 		}
 	}
 	}
@@ -251,6 +255,46 @@ Entity *SceneEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry, Entit
             applySceneMesh((*entry)["SceneMesh"], label);
             applySceneMesh((*entry)["SceneMesh"], label);
             label->setText(text);
             label->setText(text);
 			entity = label;
 			entity = label;
+        } else if(entityType->stringVal == "SceneParticleEmitter") {
+            
+			ObjectEntry *emitterEntry = (*entry)["SceneParticleEmitter"];
+            SceneParticleEmitter *emitter = new SceneParticleEmitter(1, 1, 1);
+
+            emitter->setParticleType((*emitterEntry)["type"]->intVal);
+            emitter->setParticleCount((*emitterEntry)["count"]->intVal);
+            emitter->setParticleLifetime((*emitterEntry)["lifetime"]->NumberVal);
+            emitter->setParticleSize((*emitterEntry)["size"]->NumberVal);
+            emitter->setParticlesInWorldSpace((*emitterEntry)["world"]->boolVal);
+            emitter->setLoopParticles((*emitterEntry)["loop"]->boolVal);
+            
+            emitter->setParticleRotationSpeed(Vector3((*emitterEntry)["rX"]->NumberVal, (*emitterEntry)["rY"]->NumberVal, (*emitterEntry)["rZ"]->NumberVal));
+            emitter->setGravity(Vector3((*emitterEntry)["gX"]->NumberVal, (*emitterEntry)["gY"]->NumberVal, (*emitterEntry)["gZ"]->NumberVal));
+            emitter->setParticleDirection(Vector3((*emitterEntry)["dirX"]->NumberVal, (*emitterEntry)["dirY"]->NumberVal, (*emitterEntry)["dirZ"]->NumberVal));
+            emitter->setEmitterSize(Vector3((*emitterEntry)["eX"]->NumberVal, (*emitterEntry)["eY"]->NumberVal, (*emitterEntry)["eZ"]->NumberVal));
+            emitter->setDirectionDeviation(Vector3((*emitterEntry)["devX"]->NumberVal, (*emitterEntry)["devY"]->NumberVal, (*emitterEntry)["devZ"]->NumberVal));
+            
+            emitter->setPerlinEnabled((*emitterEntry)["perlin"]->boolVal);
+            if(emitter->getPerlinEnabled()) {
+                emitter->setPerlinValue(Vector3((*emitterEntry)["pX"]->NumberVal, (*emitterEntry)["pY"]->NumberVal, (*emitterEntry)["pZ"]->NumberVal));
+            }
+            
+            emitter->useColorCurves = (*emitterEntry)["useColorCurves"]->boolVal;
+            emitter->useScaleCurve = (*emitterEntry)["useScaleCurve"]->boolVal;
+            
+            if(emitter->useColorCurves) {
+                parseObjectIntoCurve((*emitterEntry)["colorCurveR"], &emitter->colorCurveR);
+                parseObjectIntoCurve((*emitterEntry)["colorCurveG"], &emitter->colorCurveG);
+                parseObjectIntoCurve((*emitterEntry)["colorCurveB"], &emitter->colorCurveB);
+                parseObjectIntoCurve((*emitterEntry)["colorCurveA"], &emitter->colorCurveA);
+            }
+            
+            if(emitter->useScaleCurve) {
+                parseObjectIntoCurve((*emitterEntry)["scaleCurve"], &emitter->scaleCurve);
+            }
+            
+            applySceneMesh((*entry)["SceneMesh"], emitter);
+			entity = emitter;
+            
 		} else if(entityType->stringVal == "SceneLight") {
 		} else if(entityType->stringVal == "SceneLight") {
             
             
 			ObjectEntry *lightEntry = (*entry)["SceneLight"];
 			ObjectEntry *lightEntry = (*entry)["SceneLight"];

+ 36 - 9
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -830,16 +830,43 @@ void PolycodeEntityEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *
         SceneParticleEmitter *emitter = (SceneParticleEmitter*) entity;
         SceneParticleEmitter *emitter = (SceneParticleEmitter*) entity;
         
         
         ObjectEntry *emitterEntry = entry->addChild("SceneParticleEmitter");
         ObjectEntry *emitterEntry = entry->addChild("SceneParticleEmitter");
-//        emitterEntry->addChild("radiusX", emitter->emitterRadius.x);
-     
-        
-        saveCurveToObject(emitterEntry->addChild("scaleCurve"), &emitter->scaleCurve);
-        
-        saveCurveToObject(emitterEntry->addChild("colorCurveR"), &emitter->colorCurveR);
-        saveCurveToObject(emitterEntry->addChild("colorCurveG"), &emitter->colorCurveG);
-        saveCurveToObject(emitterEntry->addChild("colorCurveB"), &emitter->colorCurveB);
-        saveCurveToObject(emitterEntry->addChild("colorCurveA"), &emitter->colorCurveA);
+        emitterEntry->addChild("type", (int)emitter->getParticleType());
+        emitterEntry->addChild("count", (int)emitter->getParticleCount());
+        emitterEntry->addChild("lifetime", emitter->getParticleLifetime());
+        emitterEntry->addChild("size", emitter->getParticleSize());
+        emitterEntry->addChild("world", emitter->getParticlesInWorldSpace());
+        emitterEntry->addChild("loop", emitter->getLoopParticles());
+        emitterEntry->addChild("rX", emitter->getParticleRotationSpeed().x);
+        emitterEntry->addChild("rY", emitter->getParticleRotationSpeed().y);
+        emitterEntry->addChild("rZ", emitter->getParticleRotationSpeed().z);
+        emitterEntry->addChild("gX", emitter->getGravity().x);
+        emitterEntry->addChild("gY", emitter->getGravity().y);
+        emitterEntry->addChild("gZ", emitter->getGravity().z);
+        emitterEntry->addChild("dirX", emitter->getParticleDirection().x);
+        emitterEntry->addChild("dirY", emitter->getParticleDirection().y);
+        emitterEntry->addChild("dirZ", emitter->getParticleDirection().z);
+        emitterEntry->addChild("eX", emitter->getEmitterSize().x);
+        emitterEntry->addChild("eY", emitter->getEmitterSize().y);
+        emitterEntry->addChild("eZ", emitter->getEmitterSize().z);
+        emitterEntry->addChild("devX", emitter->getDirectionDeviation().x);
+        emitterEntry->addChild("devY", emitter->getDirectionDeviation().y);
+        emitterEntry->addChild("devZ", emitter->getDirectionDeviation().z);
+        emitterEntry->addChild("perlin", emitter->getPerlinEnabled());
+        emitterEntry->addChild("pX", emitter->getPerlinValue().x);
+        emitterEntry->addChild("pY", emitter->getPerlinValue().y);
+        emitterEntry->addChild("pZ", emitter->getPerlinValue().z);
+        emitterEntry->addChild("useColorCurves", emitter->useColorCurves);
+        emitterEntry->addChild("useScaleCurve", emitter->useScaleCurve);
         
         
+        if(emitter->useScaleCurve) {
+            saveCurveToObject(emitterEntry->addChild("scaleCurve"), &emitter->scaleCurve);
+        }
+        if(emitter->useColorCurves) {
+            saveCurveToObject(emitterEntry->addChild("colorCurveR"), &emitter->colorCurveR);
+            saveCurveToObject(emitterEntry->addChild("colorCurveG"), &emitter->colorCurveG);
+            saveCurveToObject(emitterEntry->addChild("colorCurveB"), &emitter->colorCurveB);
+            saveCurveToObject(emitterEntry->addChild("colorCurveA"), &emitter->colorCurveA);
+        }
     }
     }
     
     
     if(dynamic_cast<SceneSprite*>(entity)) {
     if(dynamic_cast<SceneSprite*>(entity)) {