@@ -925,40 +925,6 @@ private unsafe void INTERNAL_parseEffectStruct(IntPtr effectData)
925
925
continue ;
926
926
}
927
927
928
- EffectParameterCollection structMembers = null ;
929
- if ( param . value . type . member_count > 0 )
930
- {
931
- List < EffectParameter > memList = new List < EffectParameter > ( ) ;
932
- unsafe
933
- {
934
- MOJOSHADER_symbolStructMember * mem = ( MOJOSHADER_symbolStructMember * ) param . value . type . members ;
935
- IntPtr curOffset = IntPtr . Zero ;
936
- for ( int j = 0 ; j < param . value . type . member_count ; j += 1 )
937
- {
938
- uint memSize = mem [ j ] . info . rows * mem [ j ] . info . columns ;
939
- if ( mem [ j ] . info . elements > 0 )
940
- {
941
- memSize *= mem [ j ] . info . elements ;
942
- }
943
- memList . Add ( new EffectParameter (
944
- Marshal . PtrToStringAnsi ( mem [ j ] . name ) ,
945
- null ,
946
- ( int ) mem [ j ] . info . rows ,
947
- ( int ) mem [ j ] . info . columns ,
948
- ( int ) mem [ j ] . info . elements ,
949
- XNAClass [ ( int ) mem [ j ] . info . parameter_class ] ,
950
- XNAType [ ( int ) mem [ j ] . info . parameter_type ] ,
951
- null , // FIXME: Nested structs! -flibit
952
- null ,
953
- param . value . values + curOffset . ToInt32 ( ) ,
954
- memSize * 4
955
- ) ) ;
956
- curOffset += ( int ) memSize * 4 ;
957
- }
958
- }
959
- structMembers = new EffectParameterCollection ( memList ) ;
960
- }
961
-
962
928
parameters . Add ( new EffectParameter (
963
929
Marshal . PtrToStringAnsi ( param . value . name ) ,
964
930
Marshal . PtrToStringAnsi ( param . value . semantic ) ,
@@ -967,7 +933,7 @@ private unsafe void INTERNAL_parseEffectStruct(IntPtr effectData)
967
933
( int ) param . value . type . elements ,
968
934
XNAClass [ ( int ) param . value . type . parameter_class ] ,
969
935
XNAType [ ( int ) param . value . type . parameter_type ] ,
970
- structMembers ,
936
+ new IntPtr ( & paramPtr [ i ] . value . type ) ,
971
937
INTERNAL_readAnnotations (
972
938
param . annotations ,
973
939
param . annotation_count
@@ -985,26 +951,27 @@ private unsafe void INTERNAL_parseEffectStruct(IntPtr effectData)
985
951
{
986
952
// Set up Passes
987
953
MOJOSHADER_effectPass * passPtr = ( MOJOSHADER_effectPass * ) techPtr ->passes ;
988
- List < EffectPass > passes = new List < EffectPass > ( ( int ) techPtr -> pass_count ) ;
989
- for ( int j = 0 ; j < passes . Capacity ; j + = 1 )
954
+ EffectPassCollection passes ;
955
+ if ( techPtr -> pass_count = = 1 )
990
956
{
991
- MOJOSHADER_effectPass pass = passPtr [ j ] ;
992
- passes . Add ( new EffectPass (
993
- Marshal . PtrToStringAnsi ( pass . name ) ,
994
- INTERNAL_readAnnotations (
995
- pass . annotations ,
996
- pass . annotation_count
997
- ) ,
998
- this ,
999
- ( IntPtr ) techPtr ,
1000
- ( uint ) j
957
+ passes = new EffectPassCollection ( INTERNAL_readPass (
958
+ ref passPtr [ 0 ] , ( IntPtr ) techPtr , 0
1001
959
) ) ;
1002
960
}
961
+ else
962
+ {
963
+ List < EffectPass > passList = new List < EffectPass > ( ( int ) techPtr ->pass_count ) ;
964
+ for ( int j = 0 ; j < passList . Capacity ; j += 1 )
965
+ {
966
+ passList . Add ( INTERNAL_readPass ( ref passPtr [ j ] , ( IntPtr ) techPtr , ( uint ) j ) ) ;
967
+ }
968
+ passes = new EffectPassCollection ( passList ) ;
969
+ }
1003
970
1004
971
techniques . Add ( new EffectTechnique (
1005
972
Marshal . PtrToStringAnsi ( techPtr ->name ) ,
1006
973
( IntPtr ) techPtr ,
1007
- new EffectPassCollection ( passes ) ,
974
+ passes ,
1008
975
INTERNAL_readAnnotations (
1009
976
techPtr ->annotations ,
1010
977
techPtr ->annotation_count
@@ -1014,10 +981,78 @@ private unsafe void INTERNAL_parseEffectStruct(IntPtr effectData)
1014
981
Techniques = new EffectTechniqueCollection ( techniques ) ;
1015
982
}
1016
983
984
+ internal unsafe static EffectParameterCollection INTERNAL_readEffectParameterStructureMembers (
985
+ EffectParameter parameter ,
986
+ IntPtr _type
987
+ ) {
988
+ if ( _type == IntPtr . Zero )
989
+ {
990
+ return null ;
991
+ }
992
+
993
+ var type = * ( MOJOSHADER_symbolTypeInfo * ) _type ;
994
+ EffectParameterCollection structMembers = null ;
995
+ if ( type . member_count > 0 )
996
+ {
997
+ List < EffectParameter > memList = new List < EffectParameter > ( ) ;
998
+ unsafe
999
+ {
1000
+ MOJOSHADER_symbolStructMember * mem = ( MOJOSHADER_symbolStructMember * ) type . members ;
1001
+ IntPtr curOffset = IntPtr . Zero ;
1002
+ for ( int j = 0 ; j < type . member_count ; j += 1 )
1003
+ {
1004
+ uint memSize = mem [ j ] . info . rows * mem [ j ] . info . columns ;
1005
+ if ( mem [ j ] . info . elements > 0 )
1006
+ {
1007
+ memSize *= mem [ j ] . info . elements ;
1008
+ }
1009
+ memList . Add ( new EffectParameter (
1010
+ Marshal . PtrToStringAnsi ( mem [ j ] . name ) ,
1011
+ null ,
1012
+ ( int ) mem [ j ] . info . rows ,
1013
+ ( int ) mem [ j ] . info . columns ,
1014
+ ( int ) mem [ j ] . info . elements ,
1015
+ XNAClass [ ( int ) mem [ j ] . info . parameter_class ] ,
1016
+ XNAType [ ( int ) mem [ j ] . info . parameter_type ] ,
1017
+ IntPtr . Zero , // FIXME: Nested structs! -flibit
1018
+ null ,
1019
+ parameter . values + curOffset . ToInt32 ( ) ,
1020
+ memSize * 4
1021
+ ) ) ;
1022
+ curOffset += ( int ) memSize * 4 ;
1023
+ }
1024
+ }
1025
+ structMembers = new EffectParameterCollection ( memList ) ;
1026
+ }
1027
+
1028
+ return structMembers ;
1029
+ }
1030
+
1031
+ private unsafe EffectPass INTERNAL_readPass (
1032
+ ref MOJOSHADER_effectPass pass ,
1033
+ IntPtr techPtr , uint index
1034
+ ) {
1035
+ return new EffectPass (
1036
+ Marshal . PtrToStringAnsi ( pass . name ) ,
1037
+ INTERNAL_readAnnotations (
1038
+ pass . annotations ,
1039
+ pass . annotation_count
1040
+ ) ,
1041
+ this ,
1042
+ techPtr ,
1043
+ index
1044
+ ) ;
1045
+ }
1046
+
1017
1047
private unsafe EffectAnnotationCollection INTERNAL_readAnnotations (
1018
1048
IntPtr rawAnnotations ,
1019
1049
uint numAnnotations
1020
1050
) {
1051
+ if ( numAnnotations == 0 )
1052
+ {
1053
+ return EffectAnnotationCollection . Empty ;
1054
+ }
1055
+
1021
1056
MOJOSHADER_effectAnnotation * annoPtr = ( MOJOSHADER_effectAnnotation * ) rawAnnotations ;
1022
1057
List < EffectAnnotation > annotations = new List < EffectAnnotation > ( ( int ) numAnnotations ) ;
1023
1058
for ( int i = 0 ; i < numAnnotations ; i += 1 )
0 commit comments