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