Skip to content

Commit e0bf1d4

Browse files
authored
Add support for LightFieldTree (.lft) files (#41)
* Add support for LightFieldTree (.lft) files * Move to LightData
1 parent 6e86d75 commit e0bf1d4

1 file changed

Lines changed: 101 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
namespace SharpNeedle.Framework.HedgehogEngine.Mirage;
2+
3+
using SharpNeedle.Structs;
4+
5+
// https://github.com/blueskythlikesclouds/HedgeGI/blob/master/Source/HedgeGI/LightField.h
6+
[NeedleResource("hh/lft", @"\.lft$")]
7+
public class LightFieldTree : SampleChunkResource
8+
{
9+
public AABB Bounds { get; set; }
10+
public List<LightFieldCell> Cells { get; set; } = [];
11+
public List<LightFieldProbe> Probes { get; set; } = [];
12+
public List<uint> Indices { get; set; } = [];
13+
14+
public LightFieldTree()
15+
{
16+
DataVersion = 1;
17+
}
18+
19+
public override void Read(BinaryObjectReader reader)
20+
{
21+
Bounds = reader.Read<AABB>();
22+
23+
Cells.AddRange(reader.ReadObjectArrayOffset<LightFieldCell>(reader.Read<int>()));
24+
Probes.AddRange(reader.ReadObjectArrayOffset<LightFieldProbe, uint>(DataVersion, reader.Read<int>()));
25+
Indices.AddRange(reader.ReadArrayOffset<uint>(reader.Read<int>()));
26+
}
27+
28+
public override void Write(BinaryObjectWriter writer)
29+
{
30+
writer.Write(Bounds);
31+
32+
writer.Write(Cells.Count);
33+
writer.WriteObjectCollectionOffset(Cells);
34+
35+
writer.Write(Probes.Count);
36+
writer.WriteObjectCollectionOffset(DataVersion, Probes);
37+
38+
writer.Write(Indices.Count);
39+
writer.WriteCollectionOffset(Indices);
40+
}
41+
}
42+
43+
public class LightFieldCell : IBinarySerializable
44+
{
45+
public CellType Type { get; set; }
46+
public uint Index { get; set; }
47+
48+
public void Read(BinaryObjectReader reader)
49+
{
50+
Type = (CellType)reader.Read<int>();
51+
Index = reader.Read<uint>();
52+
}
53+
54+
public void Write(BinaryObjectWriter writer)
55+
{
56+
writer.Write((int)Type);
57+
writer.Write(Index);
58+
}
59+
60+
public enum CellType : int
61+
{
62+
X,
63+
Y,
64+
Z,
65+
Probe
66+
}
67+
}
68+
69+
public class LightFieldProbe : IBinarySerializable<uint>
70+
{
71+
public Color<byte>[] Colors { get; set; } = new Color<byte>[8];
72+
public byte Shadow { get; set; } = 255;
73+
74+
public void Read(BinaryObjectReader reader, uint version)
75+
{
76+
for(int i=0; i<8; i++)
77+
{
78+
Colors[i] = new Color<byte>(reader.Read<byte>(), reader.Read<byte>(), reader.Read<byte>(), 255);
79+
}
80+
81+
if(version >= 1)
82+
{
83+
Shadow = reader.Read<byte>();
84+
}
85+
}
86+
87+
public void Write(BinaryObjectWriter writer, uint version)
88+
{
89+
for (int i = 0; i < 8; i++)
90+
{
91+
writer.Write(Colors[i].R);
92+
writer.Write(Colors[i].G);
93+
writer.Write(Colors[i].B);
94+
}
95+
96+
if(version >= 1)
97+
{
98+
writer.Write(Shadow);
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)