FiE-Game/assets/streaming/PackFx/Particles/Lightning/Lightning_Projection.pkfx
2018-11-20 20:05:15 +02:00

440 lines
12 KiB
Text

Version = 1.8.4.27161;
CParticleEffect $LOCAL$/Resource
{
OnSpawn = "$LOCAL$/Spawner";
CustomAttributes = "$LOCAL$/_GlobalAttributes";
Autostart = true;
}
CCompilerSyntaxNodeExpression $LOCAL$/CCompilerSyntaxNodeExpression_D158FB1D
{
EditorInfosIsBlockMinimized = 0;
Expression = "function void Eval()
{
Life = 0.2;
// here, grab a random spawn location in the \'ProjSpawnVolume\' shape.
// you can select that shape in the treeview and move it around in the viewport
// to make lightning start at different locations
Position = ProjSpawnMesh.samplePosition();
// next, reproject the start position on the mesh
// (this is because otherwise the trail evolver will make a trail from the
// original position to the projected position on the first frame)
//Position += ProjMesh.project(Position).xyz;
// random velocity on a squased sphere whose height is
// 0.3 times its equatorial radius. -> move faster horizontally
Velocity = vrand() * float3(1,0.3,1)*ProbeVelocity;
}
";
}
CActionFactoryWithChilds $LOCAL$/Spawner
{
ChildList =
{
"$LOCAL$/Source",
};
}
CParticleFieldDeclaration $LOCAL$/CParticleFieldDeclaration_67949F4D
{
FieldName = "ColorCoeff";
}
CParticleSamplerCurve $LOCAL$/CParticleSamplerCurve_E7219408
{
SamplerName = "DisplacementWeight";
Times =
{
0.0000000e+000,
5.0000000e-001,
1.0000000e+000,
};
FloatValues =
{
3.5361910e-001,
1.7034518e+000,
3.5361910e-001,
};
FloatTangents =
{
0.0000000e+000,
1.3884335e+000,
0.0000000e+000,
0.0000000e+000,
-9.6360749e-001,
0.0000000e+000,
};
MinLimits = float4(0.0000000e+000, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
}
CParticleEvolver_Physics $LOCAL$/CParticleEvolver_Physics_4B0C0AC6
{
ConstantAcceleration = float3(0.0000000e+000, 5.0000000e+000, 0.0000000e+000);
}
CParticleEvolver_Script $LOCAL$/CParticleEvolver_Script_6DEC9E9F
{
Expression = "$LOCAL$/CCompilerSyntaxNodeExpression_E63D424E";
}
CParticleAttributeList $LOCAL$/_GlobalAttributes
{
AttributeList =
{
"$LOCAL$/CParticleAttributeDeclaration_9BDD555E",
"$LOCAL$/CParticleAttributeDeclaration_6085D8ED",
};
}
CParticleState $LOCAL$/CParticleState_37820737
{
StateName = "State_0";
Evolvers =
{
"$LOCAL$/CParticleEvolver_Physics_4B0C0AC6",
"$LOCAL$/LightningTrail",
};
}
CParticleDescriptor $LOCAL$/CParticleDescriptor_2830BC72
{
Samplers =
{
"$LOCAL$/CParticleSamplerShape_23C61C9B",
};
SpawnEvaluator = "$LOCAL$/CCompilerSyntaxNodeExpression_D158FB1D";
States =
{
"$LOCAL$/CParticleState_37820737",
};
}
CParticleAttributeDeclaration $LOCAL$/CParticleAttributeDeclaration_6085D8ED
{
AttributeName = "Flux";
AttributeDescription = "Controls the amount of strokes\\nMultiplier of the \'Source\' layer\'s spawn-rate.";
DefaultValueF4 = float4(3.0000000e+000, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
HasMin = true;
HasMax = true;
MaxValueF4 = float4(3.0000000e+000, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
}
CParticleFieldDeclaration $LOCAL$/CParticleFieldDeclaration_F6A6C829
{
FieldName = "PCoords";
FieldType = int3;
}
CParticleEvolver_Spawner $LOCAL$/LightningTrail
{
SpawnInterval = 5.0000001e-002;
LocalSpaceSpawn = true;
Descriptor = "$LOCAL$/CParticleDescriptor_EAA4F4AE";
}
CParticleState $LOCAL$/CParticleState_48BA6F7F
{
StateName = "State_0";
Evolvers =
{
"$LOCAL$/CParticleEvolver_Script_6DEC9E9F",
"$LOCAL$/CParticleEvolver_Physics_815F8FC3",
"$LOCAL$/CParticleEvolver_Field_11EF5012",
"$LOCAL$/CParticleEvolver_Field_25CAC61C",
"$LOCAL$/CParticleEvolver_Script_1CA6C021",
};
}
CParticleDescriptor $LOCAL$/CParticleDescriptor_EAA4F4AE
{
Renderer = "$LOCAL$/CParticleRenderer_List_6FEA4612";
CustomFields =
{
"$LOCAL$/CParticleFieldDeclaration_342360F8",
"$LOCAL$/CParticleFieldDeclaration_6ACE796C",
"$LOCAL$/CParticleFieldDeclaration_F6A6C829",
"$LOCAL$/CParticleFieldDeclaration_7F0885A0",
"$LOCAL$/CParticleFieldDeclaration_67949F4D",
};
Samplers =
{
"$LOCAL$/CParticleSamplerShape_627F92C7",
"$LOCAL$/CParticleSamplerCurve_31F983E2",
"$LOCAL$/CParticleSamplerProceduralTurbulence_E0F88948",
"$LOCAL$/CParticleSamplerCurve_E7219408",
"$LOCAL$/CParticleSamplerShape_79C1883D",
};
SpawnEvaluator = "$LOCAL$/CCompilerSyntaxNodeExpression_A9553A09";
States =
{
"$LOCAL$/CParticleState_48BA6F7F",
};
}
CParticleFieldDeclaration $LOCAL$/CParticleFieldDeclaration_7F0885A0
{
FieldName = "Color";
FieldType = float4;
}
CCompilerSyntaxNodeExpression $LOCAL$/CCompilerSyntaxNodeExpression_A9553A09
{
Expression = "function void Eval()
{
Life = 0.1;
// grab a random lightning texture from the atlas, for the ribbon.
// there are 16 sub-frames, whose IDs go from 0 to 15
TextureID = rand(0,16);
// color factor that we will apply to the sampled \'Color\' in an evolve script
// make particles spawned at the end of the trail\'s life dimmer, to avoid hard-ending trails.
ColorCoeff = ColorCoeffLookup.sample(spawner.LifeRatio);
//Position = ProjMesh.samplePosition();
// save RealPosition (see the evolvers on why we need this)
RealPosition = Position;
// velocity goes upwards, faster at the center of the trail (see the curve\'s shape)
Velocity = float3(0,1,0) * DisplacementWeight.sample(spawner.LifeRatio);
}
";
}
CParticleSamplerProceduralTurbulence $LOCAL$/CParticleSamplerProceduralTurbulence_E0F88948
{
SamplerName = "Noise3D";
Scale = 2.5000000e-001;
Strength = 2.0000000e-001;
TimeScale = 1.0000000e+000;
TimeBase = 2.0000000e+000;
}
CParticleEvolver_Field $LOCAL$/CParticleEvolver_Field_11EF5012
{
Name = "Color";
Evaluator = "$LOCAL$/CParticleSamplerCurve_870B473D";
}
CCompilerSyntaxNodeExpression $LOCAL$/CCompilerSyntaxNodeExpression_4DAC29C5
{
Expression = "function void Eval()
{
// the other evolvers have computed a new Position, back it up in \'RealPosition\'
// (see the comments in the first script evolver for details)
RealPosition = Position;
// the projection evolver filled \'PCoords\' with the meshe\'s parametric coordinates for us.
// use this to grab the mesh normal where at the location we were reprojected on:
float3 meshNormalAtLocation = ProjMesh.sampleNormal(PCoords);
// sample the random procedural turbulent field to get a turbulent displacement:
float3 turb = Noise3D.sample(RealPosition);
// project this vector with the mesh normal, so that it becomes tangent to the triangle plane.
// this will effectively convert it to a 2D tangent turbulence, because we don\'t want
// the 3D turbulent vector to make the ribbon penetrate the mesh
float3 projTurb = turb + meshNormalAtLocation * max(0,-dot(turb, meshNormalAtLocation));
// patch the Position by moving it slightly away from the mesh surface along the mesh normal,
// and displace it by the turbulence vector.
float distanceToMesh = 0.05;
Position += meshNormalAtLocation * distanceToMesh + projTurb;
// apply our color coefficient to the RGBA color sampled in the CParticleEvolver_Field that
// was run before us:
Color *= ColorCoeff;
}
";
}
CParticleEvolver_Physics $LOCAL$/CParticleEvolver_Physics_815F8FC3
{
}
CParticleFieldDeclaration $LOCAL$/CParticleFieldDeclaration_6ACE796C
{
FieldName = "RealPosition";
FieldType = float3;
TransformFilter = full;
}
CParticleSamplerCurve $LOCAL$/CParticleSamplerCurve_870B473D
{
ValueType = Float4;
Times =
{
0.0000000e+000,
1.6905037e-001,
1.0000000e+000,
};
FloatValues =
{
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
3.4852638e+000,
6.2353525e+000,
2.6371586e+001,
9.5917916e-001,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
};
FloatTangents =
{
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
5.3765507e+000,
1.4243516e+001,
2.5521017e+001,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
0.0000000e+000,
};
MinLimits = float4(0.0000000e+000, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
}
CCompilerSyntaxNodeExpression $LOCAL$/CCompilerSyntaxNodeExpression_E63D424E
{
Expression = "function void Eval()
{
// here, we have a problem:
// we can\'t yet (in popcorn 1.5.4) tell the ribbon renderer to use a custom field
// for position, and we want to manually shift the positions away from the mesh surface.
// if we shift the positions used for reprojection, they will shift from frame to frame
// and become dependent of the FPS.
// Therefore, we\'ll use a trick where we will \'backup\' the simulated position into a custom
// field named \'RealPosition\', then we\'ll shift the \'Position\' field to get it ready for rendering
// at the start of the next frame, we\'ll restore \'Position\' to the one saved in \'RealPosition\',
// so that simulation uses the correct value, not the one deformed for rendering.
// here, restore the projected position saved in the previous frame
Position = RealPosition;
// all the next evolvers in the state will work on this restored \'Position\',
// up to the last script evolver
}
";
}
CParticleEvolver_Field $LOCAL$/CParticleEvolver_Field_25CAC61C
{
EditorInfosIsBlockMinimized = 0;
Name = "Size";
Evaluator = "$LOCAL$/CParticleSamplerCurve_F033910F";
}
CParticleSamplerCurve $LOCAL$/CParticleSamplerCurve_31F983E2
{
EditorInfosIsBlockMinimized = 0;
SamplerName = "ColorCoeffLookup";
Times =
{
0.0000000e+000,
1.0000000e+000,
};
FloatValues =
{
1.0483411e+001,
1.3673043e-001,
};
FloatTangents =
{
0.0000000e+000,
0.0000000e+000,
-1.5378418e+001,
0.0000000e+000,
};
MinLimits = float4(0.0000000e+000, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
}
CParticleSamplerCurve $LOCAL$/CParticleSamplerCurve_F033910F
{
Times =
{
0.0000000e+000,
2.6556039e-001,
1.0000000e+000,
};
FloatValues =
{
0.0000000e+000,
7.1906403e-002,
2.3364559e-002,
};
FloatTangents =
{
0.0000000e+000,
1.4652826e-001,
0.0000000e+000,
0.0000000e+000,
-5.8887009e-002,
0.0000000e+000,
};
MinLimits = float4(0.0000000e+000, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
}
CParticleEvolver_Script $LOCAL$/CParticleEvolver_Script_1CA6C021
{
Expression = "$LOCAL$/CCompilerSyntaxNodeExpression_4DAC29C5";
}
CParticleAttributeDeclaration $LOCAL$/CParticleAttributeDeclaration_9BDD555E
{
AttributeName = "ProbeVelocity";
AttributeDescription = "Initial velocity of lightning strokes\\nDirectly controls the stroke length.";
DefaultValueF4 = float4(3.4574502e+000, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
HasMin = true;
HasMax = true;
MaxValueF4 = float4(1.0000000e+002, 0.0000000e+000, 0.0000000e+000, 0.0000000e+000);
}
CActionFactoryParticleSpawnerBase $LOCAL$/Source
{
Descriptor = "$LOCAL$/CParticleDescriptor_2830BC72";
Infinite = true;
DurationInSeconds = 2.0000000e+000;
SpawnCount = 8.0000000e+001;
FluxFactorExpression = "Flux";
}
CParticleRenderer_Ribbon $LOCAL$/CParticleRenderer_Ribbon_976AB253
{
BillboardingMaterial = Additive_Soft;
Diffuse = "Textures/FX/Lightning_05.dds";
AtlasDefinition = "Textures/FX/AtlasX4.pkat";
}
CParticleRenderer_List $LOCAL$/CParticleRenderer_List_6FEA4612
{
Renderers =
{
"$LOCAL$/CParticleRenderer_Ribbon_976AB253",
};
}
CParticleFieldDeclaration $LOCAL$/CParticleFieldDeclaration_342360F8
{
FieldName = "TextureID";
}
CParticleSamplerShape $LOCAL$/CParticleSamplerShape_79C1883D
{
EditorInfosIsBlockMinimized = 0;
SamplerName = "Shape_0";
Shape = "$LOCAL$/CShapeDescriptor_1FDF7D44";
}
CShapeDescriptor $LOCAL$/CShapeDescriptor_1FDF7D44
{
}
CParticleSamplerShape $LOCAL$/CParticleSamplerShape_627F92C7
{
EditorInfosIsBlockMinimized = 0;
SamplerName = "ProjMesh";
Shape = "$LOCAL$/CShapeDescriptor_1AAF32F4";
}
CShapeDescriptor $LOCAL$/CShapeDescriptor_1AAF32F4
{
ShapeType = SPHERE;
Radius = 5.0000000e-001;
MeshResource = "Meshes/VenusHigh.pkmm";
}
CParticleSamplerShape $LOCAL$/CParticleSamplerShape_23C61C9B
{
SamplerName = "ProjSpawnMesh";
Shape = "$LOCAL$/CShapeDescriptor_E20159FA";
}
CShapeDescriptor $LOCAL$/CShapeDescriptor_E20159FA
{
ShapeType = SPHERE;
Radius = 5.0000000e-001;
}