Post by olganix on Dec 8, 2017 19:59:28 GMT
Hi.
Lazybone and I have done lot of work to have XmlConverter and "what values is for" on file for effects :
-bsa: configuration file (look like .bac), witch could use eepk, define a projectile, its hitbox, the display on impact on ground, wall, enemies.
-eepk: configuration file for effect, witch could use emp, etr, ecf, emo, ema, emm, and texturesEmbPack.
-emp: for particules generation.
-etr: for making 'traces', sort of extrude things.
-ecf: for colorise the character (like 'poison' effect).
-emo, obj.ema and mat.ema : allready done with conversion into .emd, .esk, .ean, and mat.ema.xml.
Please see, Lazybone's XV2_Xml_Serializer and Olganix's XenoXmlConverter to have more information about it, and link on tutorial for each.
In this post, we will focus on Emp.
For Emp, the tool to convert is Lazybone's XV2_Xml_Serializer.
Don't forget to keep originals files to reverse a strange behaviour, or for make comparaison !!!
For people witch don't know yet, Emp are in xxxxx.pbind.emb file, so you have to unPack with the last version of EmbPack2 (link).
So, you have to repack the extracted folder each time you change the emp file.
As it's a little bored to do conversion and repack each time, I give you a example of batch to do the job each time you execute it : XXX.cmd (link). Don't forget to adapt paths in file before use it !!!
Notice: if nothing change, there 2 questions:
-did you don't forget to use the batch ?
-did the Xml don't have a error of synthax (tags not well close by sample).
check the date of file, or use the batch in cmd.exe to see errors, to solve this kind of problems.
Notice: we use in game the offline->training to test more easely the files. when you make a change and repack, select "Get back to characters selection" (not sure it's the exact name because my game is not in English) to have will the reload of the emb if you use the Eternity's patcher.
Notice: Lazybone also put a fonctionnality on XV2_Xml_Serializer : a drag of the folder to convert all emp.xml and repack in the same time.
Notice: The only thing to know about eepk here is :
For Emp, it's make a link between :
-the pbind.emb witch have the emp,
-the ptcl.emm witch have materials,
-and ptcl.emb with have the texture.
And define a effect to play.
(To know more about playing a Effect, you have to look eepk tutorial, and look after .bac and .bsa files).
Notice:
-all times are in frames.
-all angles are in degrees in the Xml.
-all distances could be considered as meters.
-all speed could be considered in meters/second.
-all Uv are based on one repetition for [0.0, 1.0].
There still some unknow values in each parts. So, to not oversize this tutorial, I will add some test package with all we know about the unknow values/average behaviour, if someone want to find more things about emp. (link2 Wait for It)
*********
For this example, we will use only the vfx\cmn\BTL_AURA.pbind\Aura_LoopSGSKOK.emp (link).
To use it, you have to choose the Black Goku Rosé, you should see one particle on front of the player.
------------- Fast Xml review :
Emp is a "Particles Generator".
It create particles geometry witch use a material from emm, some textures, and some animations.
The Xml is composed of 2 parts :
-ParticleEffects, witch have all parameters, animations and refer to some Texture to use.
-TextureUnit definition, witch is define how to use a texture, and add some scroll animations.
As you could see ParticleEffect are organize as a hierarchy (parent/child).
So like fireworks, you could make new particles from another.
There is differents types of ParticleEffect witch change its behaviour.
We can split all types into 2 familly:
-Nodes: They will change the transformation (position/Orientation/Scale) and they could also defined a distribution for children.
-Textured: They will display a geometry, and apply a material/shader/texture/color.
To change the type, you should modify the Type parameter, and add the good Component tag :
We will begin to see the specifications by type to understand what we could do with this.
------------- Nodes:
-------- VerticalDistribution
It's about put child particules's position and speed go up, like for flames or for simulate gravity.
Important Notice !!!! :
All tag witch have a Base and a AddedRandom, is for randomize the final value :
finalValue = baseValue + random(0 to AddedRandom).
The finalValue is calculate at each creation of the particle.
Here, that for not starting on the same position (witch is not natural).
But, you will have also for randomize values and speeds in translation, in rotation, in scale, etc ...
For the next of this tutorial, I will not talk again about AddedRandom to reduce explanations.
-PositionOffset_Y: could position the particle somewhere Y-axis.
Notice: the Y direction refer of the result of transformation on Common part. So, from the worldspace, that could be another direction.
-TranslationSpeed_Y: after creation, the speed will increase the value each frame (same if the speed is in meters/second).
Here a test with AddedRandom=1.0 on PositionOffset_Y, and TranslationSpeed_Y=1.0, that give the particule will be created between 0.0 and 1.0 on Y axis, and after it's will go up.
Notice: for better see things, all test use <PositionOffset X="1.0" Y="0.0" Z="0.0" W="0.0" /> (see Common part), so the origine of the particle is in one meter front of the character, at one meter from the ground (because of bone attachement).
(Files)
-VirtualConeOpenAngle: it's the OpenAngle on a virtual Cone witch Y-axis is put randomly on it surface. That will change Y-axis direction.
Here with 45,5 degrees:
(Files)
--------- SphericalDistribution
It's about put child particules's position On and/or In a sphere, randomly.
It's sound good for making some fire ball.
(Files)
-------- ShapePerimeterDistribution
It's about put child particules's position on a perimeter of a square or a circle, randomly.
-Shape: you could choose between "Square" or "Circle".
-In case of "Circle", Width1 will be the radius of the circle.
-In case of "Square", Width1 and Width2 will be the width in each dimensions.
(Files)
(Files)
-------- ShapeAreaDistribution
it's the same as ShapePerimeterDistribution but the child's particles's position will be on the area of the shape, randomly.
So it's the same parameters as ShapePerimeterDistribution.
(Files)
------------- Textured:
All this ParticleEffects, have a "TexturePart" witch we will see in details in another part of this tutorial.
-------- AutoOriented
This ParticleEffect will make a plane witch is autoOriented to have the UpVector targeting the camera.
(UpVector is the vector perpendicular to the front face of the plane)
(Files)
-Rotation: It's a angle for a rotation witch use the UpVector as axis, and the origine of the plane : on the middle.
-SpeedRotation: speed to increase the Rotation's angle.
(Files)
Notice: with ParticleEffect.AutoOrientationType = Front, the AutoOrientation go in front of the attachedBone (depend of the eepk parameter).
-------- AutoOriented_VisibleOnSpeed
Like "AutoOriented", that will make a plane witch front the camera.
But, this plane will be visible only if it's move, so if speeds on parent is not 0.0.
That certainly in goal to animate the speed, to have only visible some time.
It's sound like electric spark.
This case don't have any extra data (else of TexturePart).
(Files)
-------- Default
We call it "Default" because there is no AutoOrientation on the plane, so you could change its orientation.
We can change the orientation in the Common part and also in extra datas:
-AngleRotation: Saddely, there is two ways to use it.
-The easy one is about defined RotationAxis.XYZ. So the AngleRotation will give a rotation from this axis.
(Files)
-The second is most complex :
-With the EnableRandomUpVectorOnVirtualCone=true, we will active a mode witch it put the UpVector randomly on the surface of a virtual Cone.
-This Cone is defined by the original UpVector of the plane and the AngleRotation.
Here with a openAngle of 30 degrees:
(Files)
We have to imagine the cone , with axis go to the right of character and the 30 degree of openAngle.
We will see the upVector is on randomly on the surface of the Cone.
-SpeedRotation: In the two case, this parameter will increase the AngleRotation.
-RotationAxis: Axis for Rotation. W is never used.
-------- ConeExtrude
In this type, we will not use a plane, but a geometry witch is made by extrusion of a segment,
witch give a kind of deformed cone.
The direction of the axe of the cone is random on each creation.
The openAngle of the cone is also random.
This extrusion is animate to work by define a angle witch cover a part of the cone.
Like here, we do a effect on 400 degrees.
(Files)
Notice: As it's a extrude, putting a big value on TexturePart.Scale.Base will create artefacts.
I will give a basic example of needed animations after explanation on ConeExtrude_Component.
-Duration: it's a duration, but we have to deal with Particle_LifeTime:
If you put a value up to the Particle_LifeTime (ex:400), you will have a pause on the middle, that could be better for tests sessions.
-TimeBetweenTwoStep: It's a kind of mesh resolution, because it's force to wait for create a new segment before X frames.
(Files)
-Points: It's a complex behaviour. May be to create thunder lightening. you can test it. see EndPoint and Path on Etr tutorial (link) to have informations about the values.
Notice: we must keep one point with 1.0, 0.0, 0.0, 0.0 as minimal, or you will see nothing.
(Files)
-minimum animations for see something:
-------- Mesh
Here, we could use a custom mesh witch will be integrate into the emp file.
NOTICE: The game don't like that ParticleEffect have a child, it's just crash.
-EMG_File: It's the path of an extracted Emg (the mesh part into emo file).
You should have it into the folder of yours emp (don't care if it's added to pbind, that will be at the end, so don't make problem on Index reference into Emb).
The thing is, you can't edit the Emg for now. So use the EmpEmd.exe tools (link).
-RotationAxis: is the Axis for Rotation. W is never used, just use 0.0.
-RotationAngle: use RotationAxis to define a Rotation.
-SpeedRotation: increase the RotationAngle.
(Files)
Notice: if FlashOnGeneration=false, useScale2=True, you can scale the object with Texture.Scale2. See TexturePart.
-------- ShapeDraw
Here, we could define a path for define a Shape.
This shape will is extruded on a axis for making the particule.
BaseLine: The path for the shape. here it's a half-circle.
(Files)
AutoOrientation: define the direction of the Axis for extrusion, we will call it "Z-Axis" (because of XY in baseline),
-if "Camera": it's a AutoOrientation targeting the Camera. Z-axis, always try to front the camera by Y axis Rotation.
-if "Front": it's a AutoOrientation targeting the Front of some bone/character attachement (depend of eepk parameters).
-if "None": no Rotation, just normal orientation.
Notice:
if useScale2=True, Texture.Scale1 mutiply the shaped object.
if useScale2=True and FlashOnGeneration=False, you can use :
-TexturePart.Scale1 as the extern Radius
-TexturePart.Scale2.X as the intern Radius
-TexturePart.Scale2.Y as the witdh on the axe. (So you can make it flat, with 0.0)
------------- Common Part :
-NumberOfParticles: define the number of particles to create (limited to the duration of parent).
-Particle_Lifetime Base="40" AddedRandom="0": Duration of a particule, before disparition.
Here, there is some parameters to deal with the rate and when create some particles:
-StartTime Base="0" AddedRandom="0": Time (from creation of the parent particle) to wait before create the particle.
-NumberOfFramesBetweenNewParticles Base="0" AddedRandom="0": Between two creation of particles, we have to wait this duration.
-MaxParticlesPerFrame Base="1" AddedRandom="0": Each frame with creation of Particles have a limit on the number. So, they will have to wait another frame to be created.
Here, we configure to have 10 particles create every 40 frames.
(Files)
After, we have some value to configure the position and orientationof one particle.
-PositionOffset X="0.0" Y="0.0" Z="0.0" W="0.0": position from attachedBone. W is never used.
-PositionOffset_AddedRandom X="0.0" Y="0.0" Z="0.0" W="0.0": AddedRandom for each PositionOffset components.
-Rotation X="0.0" Y="0.0" Z="0.0" W="0.0": 3 angles for 3 rotations, one on X-axis, one on Y-axis, and one on Z-axis. W is never used.
-Rotation_AddedRandom X="0.0" Y="0.0" Z="0.0" W="0.0": AddedRandom for each Rotation components.
On the last, we have a flags witch alter the particle look like.
In all this flags, we should look after :
-Loop: could loop the duration range, until the parent duration finish.
-Hide: just Hide !!
-useScale2: permit to use TexturePart.Scale2.X and Y, so two dimension, on the main plane (or Flash, see FlashOnGeneration) instead of the TexturePart.Scale1.
(Files)
-useColor2 permit :
-if FlashOnGeneration=false, to have degrade on Uv.Y (color1 up, Color2 down) on the main plane,
(Files)
-if FlashOnGeneration=true, to having Color1 on the main plane, and Color2 on the Flash (see just after).
-FlashOnGeneration: It's just used on one frame for making a apparition at creation.
The Flash, by default, is the same as normal particle. So, we can't see this in this state.
But, we could change of visualisation, by using useSecondEffect for the size, and useColor2 for the color.
A double side effect is it's cancel all SpeedRotation.
Notice: as it's just one frame, we will create 10 particules in 10 frame to see it, and also change the color and the scale.
Notice: the flash is yellow instead of Green, is because of composition with the main plane witch is red.
(Files)
-EnableRandomRotationDirection: If active that change randomly the direction of Rotations stuff in Components, on each creation.
(Files)
-EnableRandomUpVectorOnVirtualCone: If active that change the behaviour of Default_Component :
-AngleRotation is used as a openAngle, witch make a virtual Cone, where the UpVector of the plane is randomly put on the surface.
-SpeedRotation is continue to increase AngleRotation (so increase the openAngle).
-RotationAxis.X in Common part is not affected, so it's only for Components.
(See Default type)
-AutoOrientationType: is a type of AutoOrientation only in AutoOriented case:
-if "Camera", the upvector target the camera,
-if "Front", it target the Front of attachedbone X (depend of eepk).
------------- TexturePart :
-Texture_ID: Id of the texture in the second part of the emp file.
-Material.Index: index of the material in emm file.
Notice: the last XenoXmlConverter add a comment with index, to simplify the search).
On BTL_AURA, the index 10 is double side, and 53 is not. that could help for tests.
-Color1.RGBA: main color witch multiply the texture applyed on the mesh.
-Color2.RGBA: the second Color for Degrade on the main plane or for Flashs.
-Color_AddedRandom: AddedRandom on each component of the Color1 and Color2.
-Scale1: main scale on the two dimensions, from origine of the particle, so the middle.
-Scale2.X and Y: if useSecondEffect=true, we can scale independently on the two dimensions.
-Scale2_AddedRandom: AddedRandom of Scale2.
Notice: Scale2 and Scale1 could differ from normal behaviour, depend of the type and the Flags
ex: in case of "ShapeDraw", if useSecondEffect=true,
-Scale1 is the extern radius,
-Scale2.X is the internRadius,
-Scale2.Y is the width on the axis effect.
See each type and CommonPart for more informations.
-AddedDepth: it's a value to add on the depth (from camera or screen) on the particle.
Here by adding 2 meters on depth.
(Files)
------------- Animations Part :
For Parameter, we will consider the two case: Animation under a Animation_SubGroup (="grouped"), and others (="classic").
-"Parameter: Components" for "classic" Animations :
-PositionOffset: X,Y,Z,W
-Rotation: X,Y,Z
-Scale:
-if useScale2=false: 0 witch give a general scale from center of the plane (middle).
-if useScale2=true :
-0: for Scale_X from left (Strange Scale witch affect Uv, because of diagonal)
-1: Scale_Y from middle
-2: Scale_X from right.
-Color1: R,G,B,A
-Color2: R,G,B,A (need useColor2=true to see Color2, you will have the Degrade)
(Files)
-"Parameter: Component" for "grouped" Animations : We don't have found confirmations about parameters and components, same for the Two numbers on group tag.
Except, there is in the special case ConeExtrude_Component this informations:
2: 1 : is the angle of cone/rotation, it's AddedRandom.
1: 0,1 : influence the openAngle sometime.
Don't use number up to 11 as parameter, or the game crash.
-Interpolated: if true, it's will add intermediaire values between two keyframes.
-Looped: it's for automatically copy the value of the first keyframe to the last keyframe, for loop the animation.
We don't have informations about I_00 and I_01 for now, so we don't know why they use a group of animations.
------------- Texture :
-TextureIndex: Index of the texture in Emb.
Notice, the last version embPack_v2.exe add a comment with the index, to search faster.
-TextureRepetition: By default, there is a full texture on a area witch Uv is in range [0,1] for each components.
But, when we are not on the area, here the different behaviour :
-"Wrap" : all range, [1,2], [2,3], ..., have the same full texture. it's a repetition.
-"Mirror" : by dimension, one range on two have a symetry. That could be apply on image witch are not ready for repetitions.
-"Clamp" : all pixels are transparents.
-"Border" : all pixels are opaque, full white (with multiplication of Color1 (or Color2 or Degrade) ).
This case is also if we modify the Uv from mesh by applying a scroll and scale:
-ScrollAnimation:
There is two way to use ScrollAnimation:
-if you just need to move the texture on the object, you just need to setup ScrollSpeed, and set UseSpeedInsteadKeyFrames at true.
-if you need to do something more specific, like just take a part of the texture, or make some repetitions,
you should set UseSpeedInsteadKeyFrames at false and add some Keyframes:
-Duration: time to keep this state. the last is keeped until the end.
-Scale_X and Y: In shaders, the Uv of the vertex (points) will be multiply by this values.
So, multiply by 0.25 will do we will see only 1/4 of the image.
And, multiply by 2.0 will do we will see 4 x the image (2 by dimensions).
-Scroll_X and Y: In shaders, the Uv of the vertex will be increase by this values. that why it's scroll.
-Filtering Min: filtering to use when the image is smaller on screen than its resolution.
-Filtering Max: filtering to use when the image is larger on screen than its resolution.
It's about "How to display a real group of pixel on one pixel of the screen".
Here, In both Min and Max:
-0 and 1 give a pixelixation of the Texture.
-and 2 give a blur of the texture.
-EnableRandomSymetry.x and Y: if you use 2, you will have randomly the symetry on the axis of the dimension.
(Files)
--------------------
Ok, lot of things we see here.
Saddely, there is lots of sides effects depend of flags and type, and lot of unknows values.
But, I think there is enougth informations for doing great effects's mods .
Have a good day and happy modding !!!
Lazybone and I have done lot of work to have XmlConverter and "what values is for" on file for effects :
-bsa: configuration file (look like .bac), witch could use eepk, define a projectile, its hitbox, the display on impact on ground, wall, enemies.
-eepk: configuration file for effect, witch could use emp, etr, ecf, emo, ema, emm, and texturesEmbPack.
-emp: for particules generation.
-etr: for making 'traces', sort of extrude things.
-ecf: for colorise the character (like 'poison' effect).
-emo, obj.ema and mat.ema : allready done with conversion into .emd, .esk, .ean, and mat.ema.xml.
Please see, Lazybone's XV2_Xml_Serializer and Olganix's XenoXmlConverter to have more information about it, and link on tutorial for each.
In this post, we will focus on Emp.
For Emp, the tool to convert is Lazybone's XV2_Xml_Serializer.
Don't forget to keep originals files to reverse a strange behaviour, or for make comparaison !!!
For people witch don't know yet, Emp are in xxxxx.pbind.emb file, so you have to unPack with the last version of EmbPack2 (link).
So, you have to repack the extracted folder each time you change the emp file.
As it's a little bored to do conversion and repack each time, I give you a example of batch to do the job each time you execute it : XXX.cmd (link). Don't forget to adapt paths in file before use it !!!
Notice: if nothing change, there 2 questions:
-did you don't forget to use the batch ?
-did the Xml don't have a error of synthax (tags not well close by sample).
check the date of file, or use the batch in cmd.exe to see errors, to solve this kind of problems.
Notice: we use in game the offline->training to test more easely the files. when you make a change and repack, select "Get back to characters selection" (not sure it's the exact name because my game is not in English) to have will the reload of the emb if you use the Eternity's patcher.
Notice: Lazybone also put a fonctionnality on XV2_Xml_Serializer : a drag of the folder to convert all emp.xml and repack in the same time.
Notice: The only thing to know about eepk here is :
For Emp, it's make a link between :
-the pbind.emb witch have the emp,
-the ptcl.emm witch have materials,
-and ptcl.emb with have the texture.
And define a effect to play.
(To know more about playing a Effect, you have to look eepk tutorial, and look after .bac and .bsa files).
Notice:
-all times are in frames.
-all angles are in degrees in the Xml.
-all distances could be considered as meters.
-all speed could be considered in meters/second.
-all Uv are based on one repetition for [0.0, 1.0].
There still some unknow values in each parts. So, to not oversize this tutorial, I will add some test package with all we know about the unknow values/average behaviour, if someone want to find more things about emp. (link2 Wait for It)
*********
For this example, we will use only the vfx\cmn\BTL_AURA.pbind\Aura_LoopSGSKOK.emp (link).
To use it, you have to choose the Black Goku Rosé, you should see one particle on front of the player.
------------- Fast Xml review :
Emp is a "Particles Generator".
It create particles geometry witch use a material from emm, some textures, and some animations.
The Xml is composed of 2 parts :
-ParticleEffects, witch have all parameters, animations and refer to some Texture to use.
-TextureUnit definition, witch is define how to use a texture, and add some scroll animations.
As you could see ParticleEffect are organize as a hierarchy (parent/child).
So like fireworks, you could make new particles from another.
There is differents types of ParticleEffect witch change its behaviour.
We can split all types into 2 familly:
-Nodes: They will change the transformation (position/Orientation/Scale) and they could also defined a distribution for children.
-Textured: They will display a geometry, and apply a material/shader/texture/color.
To change the type, you should modify the Type parameter, and add the good Component tag :
<ParticleEffect Name="TexturedParticle" Type="AutoOriented">
We will begin to see the specifications by type to understand what we could do with this.
------------- Nodes:
-------- VerticalDistribution
It's about put child particules's position and speed go up, like for flames or for simulate gravity.
<VerticalDistribution_Component>
<PositionOffset_Y Base="0.0" AddedRandom="1.0" />
<TranslationSpeed_Y Base="1.0" AddedRandom="0.0" />
<VirtualConeOpenAngle Base="0.0" AddedRandom="0.0" />
<F_24 value="0.0" />
<F_28 value="0.0" />
</VerticalDistribution_Component>
Important Notice !!!! :
All tag witch have a Base and a AddedRandom, is for randomize the final value :
finalValue = baseValue + random(0 to AddedRandom).
The finalValue is calculate at each creation of the particle.
Here, that for not starting on the same position (witch is not natural).
But, you will have also for randomize values and speeds in translation, in rotation, in scale, etc ...
For the next of this tutorial, I will not talk again about AddedRandom to reduce explanations.
-PositionOffset_Y: could position the particle somewhere Y-axis.
Notice: the Y direction refer of the result of transformation on Common part. So, from the worldspace, that could be another direction.
-TranslationSpeed_Y: after creation, the speed will increase the value each frame (same if the speed is in meters/second).
Here a test with AddedRandom=1.0 on PositionOffset_Y, and TranslationSpeed_Y=1.0, that give the particule will be created between 0.0 and 1.0 on Y axis, and after it's will go up.
Notice: for better see things, all test use <PositionOffset X="1.0" Y="0.0" Z="0.0" W="0.0" /> (see Common part), so the origine of the particle is in one meter front of the character, at one meter from the ground (because of bone attachement).
(Files)
-VirtualConeOpenAngle: it's the OpenAngle on a virtual Cone witch Y-axis is put randomly on it surface. That will change Y-axis direction.
Here with 45,5 degrees:
(Files)
--------- SphericalDistribution
It's about put child particules's position On and/or In a sphere, randomly.
It's sound good for making some fire ball.
<SphericalDistribution_Component>
<SphereRadius_ForRandomPositionOnSphere value="1.0" />
<SphereRadius_ForRandomPositionInSphere value="0.0" />
<TranslationSpeed_Y Base="1.0" AddedRandom="0.0" />
</SphericalDistribution_Component>
(Files)
-------- ShapePerimeterDistribution
It's about put child particules's position on a perimeter of a square or a circle, randomly.
<ShapePerimeterDistribution_Component>
<PositionOffset_Y Base="0.0" AddedRandom="0.0" />
<TranslationSpeed_Y Base="0.0" AddedRandom="0.0" />
<F_16 value="0.0" />
<F_20 value="0.0" />
<Width1 Base="4.0" AddedRandom="0.0" />
<Width2 Base="3.0" AddedRandom="0.0" />
<Shape type="Circle" />
<F_44 value="0.0" />
</ShapePerimeterDistribution_Component>
-Shape: you could choose between "Square" or "Circle".
-In case of "Circle", Width1 will be the radius of the circle.
-In case of "Square", Width1 and Width2 will be the width in each dimensions.
(Files)
(Files)
-------- ShapeAreaDistribution
it's the same as ShapePerimeterDistribution but the child's particles's position will be on the area of the shape, randomly.
So it's the same parameters as ShapePerimeterDistribution.
<ShapeAreaDistribution_Component>
<PositionOffset_Y Base="0.0" AddedRandom="0.0" />
<TranslationSpeed_Y Base="0.0" AddedRandom="0.0" />
<F_16 value="0.0" />
<F_20 value="0.0" />
<Width1 Base="4.0" AddedRandom="0.0" />
<Width2 Base="3.0" AddedRandom="0.0" />
<Shape type="Square" />
<F_44 value="0.0" />
</ShapeAreaDistribution_Component>
(Files)
------------- Textured:
All this ParticleEffects, have a "TexturePart" witch we will see in details in another part of this tutorial.
-------- AutoOriented
This ParticleEffect will make a plane witch is autoOriented to have the UpVector targeting the camera.
(UpVector is the vector perpendicular to the front face of the plane)
(Files)
<AutoOriented_Component>
<Rotation Base="0.0" AddedRandom="0.0" />
<SpeedRotation Base="0.0" AddedRandom="0.0" />
</AutoOriented_Component>
-Rotation: It's a angle for a rotation witch use the UpVector as axis, and the origine of the plane : on the middle.
-SpeedRotation: speed to increase the Rotation's angle.
(Files)
Notice: with ParticleEffect.AutoOrientationType = Front, the AutoOrientation go in front of the attachedBone (depend of the eepk parameter).
-------- AutoOriented_VisibleOnSpeed
Like "AutoOriented", that will make a plane witch front the camera.
But, this plane will be visible only if it's move, so if speeds on parent is not 0.0.
That certainly in goal to animate the speed, to have only visible some time.
It's sound like electric spark.
This case don't have any extra data (else of TexturePart).
(Files)
-------- Default
We call it "Default" because there is no AutoOrientation on the plane, so you could change its orientation.
We can change the orientation in the Common part and also in extra datas:
<Default_Component>
<AngleRotation Base="0.0" AddedRandom="0.0" />
<SpeedRotation Base="1.0" AddedRandom="0.0" />
<RotationAxis X="0.0" Y="1.0" Z="0.0" W="0.0" />
</Default_Component>
-AngleRotation: Saddely, there is two ways to use it.
-The easy one is about defined RotationAxis.XYZ. So the AngleRotation will give a rotation from this axis.
(Files)
-The second is most complex :
-With the EnableRandomUpVectorOnVirtualCone=true, we will active a mode witch it put the UpVector randomly on the surface of a virtual Cone.
-This Cone is defined by the original UpVector of the plane and the AngleRotation.
Here with a openAngle of 30 degrees:
(Files)
We have to imagine the cone , with axis go to the right of character and the 30 degree of openAngle.
We will see the upVector is on randomly on the surface of the Cone.
-SpeedRotation: In the two case, this parameter will increase the AngleRotation.
-RotationAxis: Axis for Rotation. W is never used.
-------- ConeExtrude
In this type, we will not use a plane, but a geometry witch is made by extrusion of a segment,
witch give a kind of deformed cone.
The direction of the axe of the cone is random on each creation.
The openAngle of the cone is also random.
This extrusion is animate to work by define a angle witch cover a part of the cone.
Like here, we do a effect on 400 degrees.
(Files)
Notice: As it's a extrude, putting a big value on TexturePart.Scale.Base will create artefacts.
I will give a basic example of needed animations after explanation on ConeExtrude_Component.
<ConeExtrude_Component>
<Duration Base="100" AddedRandom="0" />
<TimeBetweenTwoStep value="1" />
<I_08 value="0" />
<I_10 value="0" />
<Points>
<Point WorldScaleFactor="1.0" WorldScaleAdd="0.0" WorldOffsetFactor="0.0" WorldOffsetFactorb="0.0" />
</Points>
</ConeExtrude_Component>
-Duration: it's a duration, but we have to deal with Particle_LifeTime:
If you put a value up to the Particle_LifeTime (ex:400), you will have a pause on the middle, that could be better for tests sessions.
-TimeBetweenTwoStep: It's a kind of mesh resolution, because it's force to wait for create a new segment before X frames.
(Files)
-Points: It's a complex behaviour. May be to create thunder lightening. you can test it. see EndPoint and Path on Etr tutorial (link) to have informations about the values.
Notice: we must keep one point with 1.0, 0.0, 0.0, 0.0 as minimal, or you will see nothing.
(Files)
-minimum animations for see something:
<Animations>
<Animation_SubGroup I_00="9" I_01="0">
<Animation Duration="0">
<Properties Parameter="1" Component="0" Interpolated="True" Looped="False" />
<I_03 int8="0" />
<F_04 value="-2.0" />
<Keyframes>
<Keyframe Index="0" Float="1.0" />
</Keyframes>
</Animation>
<Animation Duration="0">
<Properties Parameter="1" Component="1" Interpolated="True" Looped="False" />
<I_03 int8="0" />
<F_04 value="-2.0" />
<Keyframes>
<Keyframe Index="0" Float="1.0" />
</Keyframes>
</Animation>
<Animation Duration="0">
<Properties Parameter="1" Component="2" Interpolated="True" Looped="False" />
<I_03 int8="0" />
<F_04 value="-2.0" />
<Keyframes>
<Keyframe Index="0" Float="1.0" />
</Keyframes>
</Animation>
<Animation Duration="0">
<Properties Parameter="2" Component="1" Interpolated="True" Looped="False" />
<I_03 int8="0" />
<F_04 value="128.0" />
<Keyframes>
<Keyframe Index="0" Float="400.0" />
</Keyframes>
</Animation>
</Animation_SubGroup>
</Animations>
-------- Mesh
Here, we could use a custom mesh witch will be integrate into the emp file.
NOTICE: The game don't like that ParticleEffect have a child, it's just crash.
<Mesh_Component>
<RotateAngle Base="0.0" AddedRandom="0.0" />
<SpeedRotation Base="1.0" AddedRandom="0.0" />
<RotationAxis X="1.0" Y="0.0" Z="0.0" W="0.0" />
<I_32 value="0" />
<I_40 value="0" />
<I_44 value="0" />
<EMG_File path="Sbk_Bom02_extractedMesh/Sbk_Bom02_model_1.emg" />
</Mesh_Component>
-EMG_File: It's the path of an extracted Emg (the mesh part into emo file).
You should have it into the folder of yours emp (don't care if it's added to pbind, that will be at the end, so don't make problem on Index reference into Emb).
The thing is, you can't edit the Emg for now. So use the EmpEmd.exe tools (link).
-RotationAxis: is the Axis for Rotation. W is never used, just use 0.0.
-RotationAngle: use RotationAxis to define a Rotation.
-SpeedRotation: increase the RotationAngle.
(Files)
Notice: if FlashOnGeneration=false, useScale2=True, you can scale the object with Texture.Scale2. See TexturePart.
-------- ShapeDraw
Here, we could define a path for define a Shape.
This shape will is extruded on a axis for making the particule.
<ShapeDraw_Component>
<Rotation Base="0.0" AddedRandom="0.0" />
<AngularSpeed Base="0.0" AddedRandom="0.0" />
<AutoOrientation Z_Axis="Camera" />
<I_24 uint16="0, 0, 0, 0" />
<BaseLine>
<Point X="0.0" Y="1.0" />
<Point X="0.09801714" Y="0.9951847" />
<Point X="0.1950903" Y="0.9807853" />
<Point X="0.2902847" Y="0.9569404" />
<Point X="0.3826835" Y="0.9238795" />
<Point X="0.4713967" Y="0.8819212" />
<Point X="0.5555702" Y="0.8314696" />
<Point X="0.6343933" Y="0.7730104" />
<Point X="0.7071068" Y="0.7071068" />
<Point X="0.7730104" Y="0.6343933" />
<Point X="0.8314697" Y="0.5555702" />
<Point X="0.8819213" Y="0.4713967" />
<Point X="0.9238795" Y="0.3826834" />
<Point X="0.9569404" Y="0.2902846" />
<Point X="0.9807853" Y="0.1950902" />
<Point X="0.9951847" Y="0.09801713" />
<Point X="1.0" Y="-0.000000043711" />
<Point X="0.9951847" Y="-0.09801722" />
<Point X="0.9807853" Y="-0.1950903" />
<Point X="0.9569403" Y="-0.2902847" />
<Point X="0.9238795" Y="-0.3826835" />
<Point X="0.8819212" Y="-0.4713968" />
<Point X="0.8314695" Y="-0.5555704" />
<Point X="0.7730105" Y="-0.6343933" />
<Point X="0.7071068" Y="-0.7071068" />
<Point X="0.6343933" Y="-0.7730105" />
<Point X="0.5555702" Y="-0.8314697" />
<Point X="0.4713966" Y="-0.8819214" />
<Point X="0.3826833" Y="-0.9238796" />
<Point X="0.2902847" Y="-0.9569404" />
<Point X="0.1950903" Y="-0.9807853" />
<Point X="0.0980171" Y="-0.9951847" />
<Point X="-0.000000087423" Y="-1.0" />
</BaseLine>
</ShapeDraw_Component>
BaseLine: The path for the shape. here it's a half-circle.
(Files)
AutoOrientation: define the direction of the Axis for extrusion, we will call it "Z-Axis" (because of XY in baseline),
-if "Camera": it's a AutoOrientation targeting the Camera. Z-axis, always try to front the camera by Y axis Rotation.
-if "Front": it's a AutoOrientation targeting the Front of some bone/character attachement (depend of eepk parameters).
-if "None": no Rotation, just normal orientation.
Notice:
if useScale2=True, Texture.Scale1 mutiply the shaped object.
if useScale2=True and FlashOnGeneration=False, you can use :
-TexturePart.Scale1 as the extern Radius
-TexturePart.Scale2.X as the intern Radius
-TexturePart.Scale2.Y as the witdh on the axe. (So you can make it flat, with 0.0)
------------- Common Part :
-NumberOfParticles: define the number of particles to create (limited to the duration of parent).
-Particle_Lifetime Base="40" AddedRandom="0": Duration of a particule, before disparition.
Here, there is some parameters to deal with the rate and when create some particles:
-StartTime Base="0" AddedRandom="0": Time (from creation of the parent particle) to wait before create the particle.
-NumberOfFramesBetweenNewParticles Base="0" AddedRandom="0": Between two creation of particles, we have to wait this duration.
-MaxParticlesPerFrame Base="1" AddedRandom="0": Each frame with creation of Particles have a limit on the number. So, they will have to wait another frame to be created.
Here, we configure to have 10 particles create every 40 frames.
(Files)
After, we have some value to configure the position and orientationof one particle.
-PositionOffset X="0.0" Y="0.0" Z="0.0" W="0.0": position from attachedBone. W is never used.
-PositionOffset_AddedRandom X="0.0" Y="0.0" Z="0.0" W="0.0": AddedRandom for each PositionOffset components.
-Rotation X="0.0" Y="0.0" Z="0.0" W="0.0": 3 angles for 3 rotations, one on X-axis, one on Y-axis, and one on Z-axis. W is never used.
-Rotation_AddedRandom X="0.0" Y="0.0" Z="0.0" W="0.0": AddedRandom for each Rotation components.
On the last, we have a flags witch alter the particle look like.
In all this flags, we should look after :
-Loop: could loop the duration range, until the parent duration finish.
-Hide: just Hide !!
-useScale2: permit to use TexturePart.Scale2.X and Y, so two dimension, on the main plane (or Flash, see FlashOnGeneration) instead of the TexturePart.Scale1.
(Files)
-useColor2 permit :
-if FlashOnGeneration=false, to have degrade on Uv.Y (color1 up, Color2 down) on the main plane,
(Files)
-if FlashOnGeneration=true, to having Color1 on the main plane, and Color2 on the Flash (see just after).
-FlashOnGeneration: It's just used on one frame for making a apparition at creation.
The Flash, by default, is the same as normal particle. So, we can't see this in this state.
But, we could change of visualisation, by using useSecondEffect for the size, and useColor2 for the color.
A double side effect is it's cancel all SpeedRotation.
Notice: as it's just one frame, we will create 10 particules in 10 frame to see it, and also change the color and the scale.
Notice: the flash is yellow instead of Green, is because of composition with the main plane witch is red.
(Files)
-EnableRandomRotationDirection: If active that change randomly the direction of Rotations stuff in Components, on each creation.
(Files)
-EnableRandomUpVectorOnVirtualCone: If active that change the behaviour of Default_Component :
-AngleRotation is used as a openAngle, witch make a virtual Cone, where the UpVector of the plane is randomly put on the surface.
-SpeedRotation is continue to increase AngleRotation (so increase the openAngle).
-RotationAxis.X in Common part is not affected, so it's only for Components.
(See Default type)
-AutoOrientationType: is a type of AutoOrientation only in AutoOriented case:
-if "Camera", the upvector target the camera,
-if "Front", it target the Front of attachedbone X (depend of eepk).
------------- TexturePart :
<TexturePart Texture_ID="3">
<I_00 a="0" b="0" />
<I_01 a="0" b="0" />
<I_02 int8="0" />
<I_03 int8="0" />
<AddedDepth value="0.0" />
<I_08 value="69" />
<I_12 value="0" />
<EmmMaterial Index="10" />
<Color1 R="1.0" G="0.0" B="0.0" A="1.0" />
<Color2 R="0.0" G="1.0" B="0.0" A="1.0" />
<Color_AddedRandom R="0.0" G="0.0" B="0.0" A="0.0" />
<Scale1 Base="1.0" AddedRandom="0.0" />
<Scale2 X="2.0" Y="0.5" />
<Scale2_AddedRandom X="0.0" Y="0.0" />
<F_96 value="0.0" />
<F_100 value="0.0" />
<F_104 value="0.0" />
<F_108 value="0.0" />
</TexturePart>
-Texture_ID: Id of the texture in the second part of the emp file.
-Material.Index: index of the material in emm file.
Notice: the last XenoXmlConverter add a comment with index, to simplify the search).
On BTL_AURA, the index 10 is double side, and 53 is not. that could help for tests.
-Color1.RGBA: main color witch multiply the texture applyed on the mesh.
-Color2.RGBA: the second Color for Degrade on the main plane or for Flashs.
-Color_AddedRandom: AddedRandom on each component of the Color1 and Color2.
-Scale1: main scale on the two dimensions, from origine of the particle, so the middle.
-Scale2.X and Y: if useSecondEffect=true, we can scale independently on the two dimensions.
-Scale2_AddedRandom: AddedRandom of Scale2.
Notice: Scale2 and Scale1 could differ from normal behaviour, depend of the type and the Flags
ex: in case of "ShapeDraw", if useSecondEffect=true,
-Scale1 is the extern radius,
-Scale2.X is the internRadius,
-Scale2.Y is the width on the axis effect.
See each type and CommonPart for more informations.
-AddedDepth: it's a value to add on the depth (from camera or screen) on the particle.
Here by adding 2 meters on depth.
(Files)
------------- Animations Part :
<Animations>
<Animation Duration="101">
<Properties Parameter="Color1" Component="A" Interpolated="True" Looped="False" />
<I_03 int8="0" />
<F_04 value="0.0" />
<Keyframes>
<Keyframe Index="0" Float="0.0" />
<Keyframe Index="1" Float="0.0" />
<Keyframe Index="60" Float="1.0" />
<Keyframe Index="100" Float="1.0" />
</Keyframes>
</Animation>
<Animation_SubGroup I_00="9" I_01="0">
<Animation Duration="0">
<Properties Parameter="1" Component="1" Interpolated="True" Looped="False" />
<I_03 int8="0" />
<F_04 value="-2.0" />
<Keyframes>
<Keyframe Index="0" Float="1.0" />
</Keyframes>
</Animation>
...
</Animation_SubGroup>
</Animations>
For Parameter, we will consider the two case: Animation under a Animation_SubGroup (="grouped"), and others (="classic").
-"Parameter: Components" for "classic" Animations :
-PositionOffset: X,Y,Z,W
-Rotation: X,Y,Z
-Scale:
-if useScale2=false: 0 witch give a general scale from center of the plane (middle).
-if useScale2=true :
-0: for Scale_X from left (Strange Scale witch affect Uv, because of diagonal)
-1: Scale_Y from middle
-2: Scale_X from right.
-Color1: R,G,B,A
-Color2: R,G,B,A (need useColor2=true to see Color2, you will have the Degrade)
(Files)
-"Parameter: Component" for "grouped" Animations : We don't have found confirmations about parameters and components, same for the Two numbers on group tag.
Except, there is in the special case ConeExtrude_Component this informations:
2: 1 : is the angle of cone/rotation, it's AddedRandom.
1: 0,1 : influence the openAngle sometime.
Don't use number up to 11 as parameter, or the game crash.
-Interpolated: if true, it's will add intermediaire values between two keyframes.
-Looped: it's for automatically copy the value of the first keyframe to the last keyframe, for loop the animation.
We don't have informations about I_00 and I_01 for now, so we don't know why they use a group of animations.
------------- Texture :
<Texture ID="3" TextureIndex="33">
<I_00 value="0" />
<I_02 value="0" />
<I_03 value="0" />
<Filtering Min="2" Max="2" />
<TextureRepetition X="Wrap" Y="Wrap" />
<EnableRandomSymetry X="2" Y="0" />
<ScrollAnimationType UseSpeedInsteadKeyFrames="False">
<ScrollSpeed U="0.0" V="0.0" />
<Keyframes>
<Keyframe Time="3" Scroll_X="0.0" Scroll_Y="0.0" Scale_X="0.25" Scale_Y="0.25" />
</Keyframes>
</ScrollAnimationType>
</Texture>
-TextureIndex: Index of the texture in Emb.
Notice, the last version embPack_v2.exe add a comment with the index, to search faster.
-TextureRepetition: By default, there is a full texture on a area witch Uv is in range [0,1] for each components.
But, when we are not on the area, here the different behaviour :
-"Wrap" : all range, [1,2], [2,3], ..., have the same full texture. it's a repetition.
-"Mirror" : by dimension, one range on two have a symetry. That could be apply on image witch are not ready for repetitions.
-"Clamp" : all pixels are transparents.
-"Border" : all pixels are opaque, full white (with multiplication of Color1 (or Color2 or Degrade) ).
This case is also if we modify the Uv from mesh by applying a scroll and scale:
-ScrollAnimation:
There is two way to use ScrollAnimation:
-if you just need to move the texture on the object, you just need to setup ScrollSpeed, and set UseSpeedInsteadKeyFrames at true.
-if you need to do something more specific, like just take a part of the texture, or make some repetitions,
you should set UseSpeedInsteadKeyFrames at false and add some Keyframes:
-Duration: time to keep this state. the last is keeped until the end.
-Scale_X and Y: In shaders, the Uv of the vertex (points) will be multiply by this values.
So, multiply by 0.25 will do we will see only 1/4 of the image.
And, multiply by 2.0 will do we will see 4 x the image (2 by dimensions).
-Scroll_X and Y: In shaders, the Uv of the vertex will be increase by this values. that why it's scroll.
-Filtering Min: filtering to use when the image is smaller on screen than its resolution.
-Filtering Max: filtering to use when the image is larger on screen than its resolution.
It's about "How to display a real group of pixel on one pixel of the screen".
Here, In both Min and Max:
-0 and 1 give a pixelixation of the Texture.
-and 2 give a blur of the texture.
-EnableRandomSymetry.x and Y: if you use 2, you will have randomly the symetry on the axis of the dimension.
(Files)
--------------------
Ok, lot of things we see here.
Saddely, there is lots of sides effects depend of flags and type, and lot of unknows values.
But, I think there is enougth informations for doing great effects's mods .
Have a good day and happy modding !!!