@@ -106,48 +106,43 @@ public XivDataFile DataFile
106
106
{ XivTexType . Diffuse , new TextureUsageStruct ( ) { TextureType = 3054951514 , Unknown = 1611594207 } } ,
107
107
{ XivTexType . Specular , new TextureUsageStruct ( ) { TextureType = 3367837167 , Unknown = 2687453224 } } ,
108
108
{ XivTexType . Skin , new TextureUsageStruct ( ) { TextureType = 940355280 , Unknown = 735790577 } } ,
109
+ { XivTexType . Other , new TextureUsageStruct ( ) { TextureType = 612525193 , Unknown = 1851494160 } } ,
110
+ } ; // Probably want to key this off a custom enum soon if we keep finding additional texture usage values.
111
+
112
+
113
+ // Shader Parameter defaults. For most of them they seem to be used as multipliers.
114
+ public static Dictionary < MtrlShaderParameterId , List < float > > ShaderParameterValues = new Dictionary < MtrlShaderParameterId , List < float > > ( ) {
115
+ { MtrlShaderParameterId . Common1 , new List < float > ( ) { 0.5f } } ,
116
+ { MtrlShaderParameterId . Common2 , new List < float > ( ) { 1f } } ,
117
+ { MtrlShaderParameterId . SkinColor , new List < float > ( ) { 1.4f , 1.4f , 1.4f } } , // Direct R/G/B Multiplier. 3.0 for Limbal rings.
118
+ { MtrlShaderParameterId . Reflection1 , new List < float > ( ) { 1f } } ,
119
+ { MtrlShaderParameterId . SkinOutline , new List < float > ( ) { 3f } } ,
120
+ { MtrlShaderParameterId . RacialSkin1 , new List < float > ( ) { 0.02f , 0.02f , 0.02f } } ,
121
+ { MtrlShaderParameterId . SkinUnknown1 , new List < float > ( ) { 0.4f , 0.4f , 0.4f } } ,
122
+ { MtrlShaderParameterId . SkinUnknown2 , new List < float > ( ) { 0f , 0f , 0f } } ,
123
+ { MtrlShaderParameterId . RacialSkin2 , new List < float > ( ) { 65f , 100f } } ,
124
+ { MtrlShaderParameterId . SkinUnknown3 , new List < float > ( ) { 63f } } ,
125
+ { MtrlShaderParameterId . Equipment1 , new List < float > ( ) { 0f } } ,
126
+ { MtrlShaderParameterId . Face1 , new List < float > ( ) { 32f } } ,
127
+ { MtrlShaderParameterId . Hair1 , new List < float > ( ) { 0.35f } } ,
128
+ { MtrlShaderParameterId . Hair2 , new List < float > ( ) { 0.5f } } ,
129
+
130
+
131
+ { MtrlShaderParameterId . Furniture1 , new List < float > ( ) { 1f , 1f , 1f } } ,
132
+ { MtrlShaderParameterId . Furniture2 , new List < float > ( ) { 1f , 1f , 1f } } ,
133
+ { MtrlShaderParameterId . Furniture3 , new List < float > ( ) { 0f , 0f , 0f } } ,
134
+ { MtrlShaderParameterId . Furniture4 , new List < float > ( ) { 1f } } ,
135
+ { MtrlShaderParameterId . Furniture5 , new List < float > ( ) { 0.15f } } ,
136
+ { MtrlShaderParameterId . Furniture6 , new List < float > ( ) { 0.15f } } ,
137
+ { MtrlShaderParameterId . Furniture7 , new List < float > ( ) { 1f } } ,
138
+ { MtrlShaderParameterId . Furniture8 , new List < float > ( ) { 1f } } ,
139
+ { MtrlShaderParameterId . Furniture9 , new List < float > ( ) { 1f } } ,
140
+ { MtrlShaderParameterId . Furniture10 , new List < float > ( ) { 1f , 1f , 1f } } ,
141
+ { MtrlShaderParameterId . Furniture11 , new List < float > ( ) { 1f , 1f , 1f } } ,
142
+ { MtrlShaderParameterId . Furniture12 , new List < float > ( ) { 1f , 1f , 1f } } ,
143
+ { MtrlShaderParameterId . Furniture13 , new List < float > ( ) { 0f , 0f , 0f } } ,
109
144
} ;
110
145
111
-
112
- // References to the additional shader data at the end of MTRL files.
113
- // Stored by ID, though unknown yet what the IDs correspond to.
114
- // I suspect the IDs are used for piping additional maps/values to the shader, such as cube maps for reflection
115
- // and skin/hair/iris color, etc. -Sel
116
- // The actual byte array values do change a bit, but thus far I haven't been able to notice differences when they're changed.
117
- public static Dictionary < MtrlShaderParameterId , List < byte > > ShaderParameterValues = new Dictionary < MtrlShaderParameterId , List < byte > > ( ) {
118
- { MtrlShaderParameterId . Common1 , new List < byte > ( ) { 0 , 0 , 0 , 63 } } ,
119
- { MtrlShaderParameterId . Common2 , new List < byte > ( ) { 0 , 0 , 128 , 63 } } ,
120
- { MtrlShaderParameterId . SkinColor , new List < byte > ( ) { 51 , 51 , 179 , 63 , 51 , 51 , 179 , 63 , 51 , 51 , 179 , 63 } } ,
121
- { MtrlShaderParameterId . Reflection1 , new List < byte > ( ) { 0 , 0 , 128 , 63 } } ,
122
- { MtrlShaderParameterId . SkinOutline , new List < byte > ( ) { 0 , 0 , 64 , 64 } } ,
123
- { MtrlShaderParameterId . RacialSkin1 , new List < byte > ( ) { 10 , 215 , 163 , 60 , 10 , 215 , 163 , 60 , 10 , 215 , 163 , 60 } } ,
124
- { MtrlShaderParameterId . SkinUnknown1 , new List < byte > ( ) { 205 , 204 , 204 , 62 , 205 , 204 , 204 , 62 , 205 , 204 , 204 , 62 } } ,
125
- { MtrlShaderParameterId . SkinUnknown2 , new List < byte > ( ) { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } } ,
126
- { MtrlShaderParameterId . RacialSkin2 , new List < byte > ( ) { 0 , 0 , 130 , 66 , 0 , 0 , 200 , 66 } } ,
127
- { MtrlShaderParameterId . SkinUnknown3 , new List < byte > ( ) { 0 , 0 , 124 , 66 } } ,
128
- { MtrlShaderParameterId . Equipment1 , new List < byte > ( ) { 0 , 0 , 0 , 0 } } ,
129
- { MtrlShaderParameterId . Face1 , new List < byte > ( ) { 0 , 0 , 0 , 66 } } ,
130
- { MtrlShaderParameterId . Hair1 , new List < byte > ( ) { 51 , 51 , 179 , 62 } } ,
131
- { MtrlShaderParameterId . Hair2 , new List < byte > ( ) { 0 , 0 , 0 , 63 } } ,
132
-
133
-
134
- { MtrlShaderParameterId . Furniture1 , new List < byte > ( ) { 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 } } ,
135
- { MtrlShaderParameterId . Furniture2 , new List < byte > ( ) { 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 } } ,
136
- { MtrlShaderParameterId . Furniture3 , new List < byte > ( ) { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } } ,
137
- { MtrlShaderParameterId . Furniture4 , new List < byte > ( ) { 0 , 0 , 128 , 63 } } ,
138
- { MtrlShaderParameterId . Furniture5 , new List < byte > ( ) { 143 , 194 , 117 , 60 } } ,
139
- { MtrlShaderParameterId . Furniture6 , new List < byte > ( ) { 143 , 194 , 117 , 60 } } ,
140
- { MtrlShaderParameterId . Furniture7 , new List < byte > ( ) { 0 , 0 , 128 , 63 } } ,
141
- { MtrlShaderParameterId . Furniture8 , new List < byte > ( ) { 0 , 0 , 128 , 63 } } ,
142
- { MtrlShaderParameterId . Furniture9 , new List < byte > ( ) { 0 , 0 , 128 , 63 } } ,
143
- { MtrlShaderParameterId . Furniture10 , new List < byte > ( ) { 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 } } ,
144
- { MtrlShaderParameterId . Furniture11 , new List < byte > ( ) { 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 } } ,
145
- { MtrlShaderParameterId . Furniture12 , new List < byte > ( ) { 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 , 0 , 0 , 128 , 63 } } ,
146
- { MtrlShaderParameterId . Furniture13 , new List < byte > ( ) { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 128 , 63 } } ,
147
- } ;
148
-
149
-
150
-
151
146
/// <summary>
152
147
/// Gets the MTRL data for the given item
153
148
/// </summary>
@@ -517,22 +512,19 @@ await Task.Run((Func<Task>)(async () =>
517
512
{
518
513
var offset = shaderParam . Offset ;
519
514
var size = shaderParam . Size ;
520
- shaderParam . Bytes = new List < byte > ( ) ;
521
- shaderParam . Args = new List < uint > ( ) ;
515
+ shaderParam . Args = new List < float > ( ) ;
522
516
if ( bytesRead + size <= originalShaderParameterDataSize )
523
517
{
524
518
for ( var idx = offset ; idx < offset + size ; idx += 4 )
525
519
{
526
- var arg = br . ReadUInt32 ( ) ;
520
+ var arg = br . ReadSingle ( ) ;
527
521
shaderParam . Args . Add ( arg ) ;
528
522
bytesRead += 4 ;
529
- shaderParam . Bytes . AddRange ( BitConverter . GetBytes ( arg ) ) ;
530
523
}
531
524
} else
532
525
{
533
526
// Just use a blank array if we have missing/invalid shader data.
534
- shaderParam . Bytes = new List < byte > ( new byte [ size ] ) ;
535
- shaderParam . Args = new List < uint > ( new uint [ size / 4 ] ) ;
527
+ shaderParam . Args = new List < float > ( new float [ size / 4 ] ) ;
536
528
}
537
529
}
538
530
@@ -784,16 +776,17 @@ public byte[] CreateMtrlFile(XivMtrl xivMtrl, IItem item)
784
776
}
785
777
786
778
var offset = 0 ;
787
- foreach ( var dataStruct2 in xivMtrl . ShaderParameterList )
779
+ foreach ( var parameter in xivMtrl . ShaderParameterList )
788
780
{
789
781
// Ensure we're writing correctly calculated data.
790
- dataStruct2 . Offset = ( short ) offset ;
791
- dataStruct2 . Size = ( short ) dataStruct2 . Bytes . Count ;
792
- offset += dataStruct2 . Size ;
793
-
794
- mtrlBytes . AddRange ( BitConverter . GetBytes ( ( uint ) dataStruct2 . ParameterID ) ) ;
795
- mtrlBytes . AddRange ( BitConverter . GetBytes ( dataStruct2 . Offset ) ) ;
796
- mtrlBytes . AddRange ( BitConverter . GetBytes ( dataStruct2 . Size ) ) ;
782
+ parameter . Offset = ( short ) offset ;
783
+ parameter . Size = ( short ) parameter . Args . Count ;
784
+ offset += parameter . Size * 4 ;
785
+ short byteSize = ( short ) ( parameter . Size * 4 ) ;
786
+
787
+ mtrlBytes . AddRange ( BitConverter . GetBytes ( ( uint ) parameter . ParameterID ) ) ;
788
+ mtrlBytes . AddRange ( BitConverter . GetBytes ( parameter . Offset ) ) ;
789
+ mtrlBytes . AddRange ( BitConverter . GetBytes ( byteSize ) ) ;
797
790
}
798
791
799
792
foreach ( var parameterStruct in xivMtrl . TextureDescriptorList )
@@ -809,9 +802,10 @@ public byte[] CreateMtrlFile(XivMtrl xivMtrl, IItem item)
809
802
var shaderBytes = new List < byte > ( ) ;
810
803
foreach ( var shaderParam in xivMtrl . ShaderParameterList )
811
804
{
812
- //shaderBytes.AddRange(Mtrl.ShaderParameterValues[shaderParam.ParameterID]);
813
- //shaderBytes.AddRange(new byte[shaderParam.Bytes.Count]);
814
- shaderBytes . AddRange ( shaderParam . Bytes ) ;
805
+ foreach ( var f in shaderParam . Args )
806
+ {
807
+ shaderBytes . AddRange ( BitConverter . GetBytes ( f ) ) ;
808
+ }
815
809
}
816
810
817
811
// Pad out if we're missing anything.
@@ -821,7 +815,6 @@ public byte[] CreateMtrlFile(XivMtrl xivMtrl, IItem item)
821
815
}
822
816
mtrlBytes . AddRange ( shaderBytes ) ;
823
817
824
- //mtrlBytes.AddRange(xivMtrl.AdditionalData);
825
818
826
819
827
820
// Backfill the actual file size data.
0 commit comments