Skip to content

Commit 34ac6aa

Browse files
Add Sparkle particle system (SWA) (#54)
* Add NeedleResource for PackedFileInfo * Add new ArchiveInfo resource type * Fix spacing error * Add Sparkle particle reading/writing Adds everything necessary to read and write Sparkle particle files Co-authored-by: Hedgeturd <110350143+Hedgeturd@users.noreply.github.com> * Fix naming issues in Sparkle * Add properties and cleanup of Sparkle types * Fix typos VS autocomplete sucks * Fix naming of enums * Add argument for alignment and create SparkleMaterialProject --------- Co-authored-by: Hedgeturd <110350143+Hedgeturd@users.noreply.github.com>
1 parent be08101 commit 34ac6aa

27 files changed

+946
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
using SharpNeedle.Framework.HedgehogEngine.Mirage.MaterialData;
4+
5+
public class Material : IBinarySerializable
6+
{
7+
public string? Name { get; set; }
8+
public string? ShaderName { get; set; }
9+
public string? TextureName { get; set; }
10+
public string? DeflectionTextureName { get; set; }
11+
public TextureAddressMode AddressMode { get; set; }
12+
public MaterialBlend BlendMode { get; set; }
13+
14+
public void Read(BinaryObjectReader reader)
15+
{
16+
Name = reader.ReadStringPaddedByte(4);
17+
ShaderName = reader.ReadStringPaddedByte(4);
18+
TextureName = reader.ReadStringPaddedByte(4);
19+
DeflectionTextureName = reader.ReadStringPaddedByte(4);
20+
AddressMode = (TextureAddressMode)reader.ReadInt32();
21+
BlendMode = (MaterialBlend)reader.ReadInt32();
22+
reader.Seek(16, SeekOrigin.Current);
23+
}
24+
25+
public void Write(BinaryObjectWriter writer)
26+
{
27+
writer.WriteStringPaddedByte(Name, 4);
28+
writer.WriteStringPaddedByte(ShaderName, 4);
29+
writer.WriteStringPaddedByte(TextureName, 4);
30+
writer.WriteStringPaddedByte(DeflectionTextureName, 4);
31+
writer.Write(AddressMode);
32+
writer.Write(BlendMode);
33+
}
34+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
public enum MaterialBlend
4+
{
5+
Typical = 1,
6+
Add = 2
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
public enum TextureAddressMode : int
4+
{
5+
Clamp,
6+
Wrap
7+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
public class Animation : IBinarySerializable
4+
{
5+
public Track ColorA { get; set; }
6+
public Track ColorB { get; set; }
7+
public Track ColorG { get; set; }
8+
public Track ColorR { get; set; }
9+
10+
public Track TransX { get; set; }
11+
public Track TransY { get; set; }
12+
public Track TransZ { get; set; }
13+
14+
public Track ScaleX { get; set; }
15+
public Track ScaleY { get; set; }
16+
public Track ScaleZ { get; set; }
17+
18+
19+
public void Read(BinaryObjectReader reader)
20+
{
21+
//AnimationChunk
22+
reader.ReadStringPaddedByte(4);
23+
24+
ColorA = reader.ReadObject<Track>();
25+
ColorB = reader.ReadObject<Track>();
26+
ColorG = reader.ReadObject<Track>();
27+
ColorR = reader.ReadObject<Track>();
28+
29+
TransX = reader.ReadObject<Track>();
30+
TransY = reader.ReadObject<Track>();
31+
TransZ = reader.ReadObject<Track>();
32+
33+
ScaleX = reader.ReadObject<Track>();
34+
ScaleY = reader.ReadObject<Track>();
35+
ScaleZ = reader.ReadObject<Track>();
36+
}
37+
38+
public void Write(BinaryObjectWriter writer)
39+
{
40+
writer.WriteStringPaddedByte("AnimationChunk", 4);
41+
42+
writer.WriteObject(ColorA);
43+
writer.WriteObject(ColorB);
44+
writer.WriteObject(ColorG);
45+
writer.WriteObject(ColorR);
46+
47+
writer.WriteObject(TransX);
48+
writer.WriteObject(TransY);
49+
writer.WriteObject(TransZ);
50+
51+
writer.WriteObject(ScaleX);
52+
writer.WriteObject(ScaleY);
53+
writer.WriteObject(ScaleZ);
54+
}
55+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
public enum CurveType
4+
{
5+
Linear,
6+
Spline,
7+
Constant,
8+
Rotate
9+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
public class Cylinder : IBinarySerializable
3+
{
4+
public bool Enquiangular { get; set; }
5+
public bool IsCircumference { get; set; }
6+
public bool IsCone { get; set; }
7+
public float Angle { get; set; }
8+
public float Radius { get; set; }
9+
public float Height { get; set; }
10+
public float MinAngle { get; set; }
11+
public float MaxAngle { get; set; }
12+
public CylinderEmissionType CylinderEmissionType { get; set; }
13+
14+
public void Read(BinaryObjectReader reader)
15+
{
16+
Enquiangular = reader.ReadUInt32() == 1;
17+
IsCircumference = reader.ReadUInt32() == 1;
18+
IsCone = reader.ReadUInt32() == 1;
19+
Angle = reader.ReadSingle();
20+
Radius = reader.ReadSingle();
21+
Height = reader.ReadSingle();
22+
MinAngle = reader.ReadSingle();
23+
MaxAngle = reader.ReadSingle();
24+
CylinderEmissionType = (CylinderEmissionType)reader.ReadInt32();
25+
}
26+
27+
public void Write(BinaryObjectWriter writer)
28+
{
29+
writer.Write(Enquiangular ? 1 : 0);
30+
writer.Write(IsCircumference ? 1 : 0);
31+
writer.Write(IsCone ? 1 : 0);
32+
writer.Write(Angle);
33+
writer.Write(Radius);
34+
writer.Write(Height);
35+
writer.Write(MinAngle);
36+
writer.Write(MaxAngle);
37+
writer.Write(CylinderEmissionType);
38+
}
39+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
public enum CylinderEmissionType : int
4+
{
5+
ECylinder_UserVelocity
6+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
public enum DirectionType : int
4+
{
5+
EDirection_Billboard,
6+
EDirection_EmitterAxis,
7+
EDirection_DirectionalAngle,
8+
EDirection_YAxis,
9+
EDirection_XAxis,
10+
EDirection_ZAxis,
11+
EDirection_YRotOnly
12+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+

2+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
3+
4+
public class Effect : IBinarySerializable
5+
{
6+
public string Name { get; set; }
7+
public float InitialLifeTime { get; set; }
8+
public float ScaleRatio { get; set; }
9+
public float GenerateCountRatio { get; set; }
10+
public Vector4 InitialPosition { get; set; }
11+
public Vector4 InitialRotation { get; set; }
12+
public bool IsLoop { get; set; }
13+
public bool DeleteChildren { get; set; }
14+
public float VelocityOffset { get; set; }
15+
public int FieldU1 { get; set; }
16+
public int FieldU2 { get; set; }
17+
public int FieldU3 { get; set; }
18+
public int FieldU4 { get; set; }
19+
20+
public void Read(BinaryObjectReader reader)
21+
{
22+
Name = reader.ReadStringPaddedByte(4);
23+
InitialLifeTime = reader.ReadSingle();
24+
ScaleRatio = reader.ReadSingle();
25+
GenerateCountRatio = reader.ReadSingle();
26+
27+
InitialPosition = reader.Read<Vector4>();
28+
InitialRotation = reader.Read<Vector4>();
29+
30+
IsLoop = reader.ReadUInt32() == 1;
31+
DeleteChildren = reader.ReadUInt32() == 1;
32+
VelocityOffset = reader.ReadSingle();
33+
34+
FieldU1 = reader.ReadInt32();
35+
FieldU2 = reader.ReadInt32();
36+
FieldU3 = reader.ReadInt32();
37+
FieldU4 = reader.ReadInt32();
38+
39+
//Footer SEGA
40+
reader.Seek(16, SeekOrigin.Current);
41+
}
42+
43+
public void Write(BinaryObjectWriter writer)
44+
{
45+
writer.WriteStringPaddedByte(Name, 4);
46+
writer.Write(InitialLifeTime);
47+
writer.Write(ScaleRatio);
48+
writer.Write(GenerateCountRatio);
49+
50+
writer.Write(InitialPosition.X);
51+
writer.Write(InitialPosition.Y);
52+
writer.Write(InitialPosition.Z);
53+
writer.Write(InitialPosition.W);
54+
55+
writer.Write(InitialRotation.X);
56+
writer.Write(InitialRotation.Y);
57+
writer.Write(InitialRotation.Z);
58+
writer.Write(InitialRotation.W);
59+
60+
writer.Write(IsLoop ? 1 : 0);
61+
writer.Write(DeleteChildren ? 1 : 0);
62+
writer.Write(VelocityOffset);
63+
64+
writer.Write(FieldU1);
65+
writer.Write(FieldU2);
66+
writer.Write(FieldU3);
67+
writer.Write(FieldU4);
68+
69+
//S E G A
70+
writer.Write(83);
71+
writer.Write(69);
72+
writer.Write(71);
73+
writer.Write(65);
74+
}
75+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Sparkle;
2+
3+
public enum EmitCondition
4+
{
5+
Time
6+
}

0 commit comments

Comments
 (0)