jsonifierexts.monkey2 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. Namespace mojo3d.jsonifier
  2. Class MojoJsonifierExt Extends JsonifierExt
  3. Const Instance:=New MojoJsonifierExt
  4. Method Jsonify:JsonValue( value:Variant,jsonifier:Jsonifier ) Override
  5. Select value.Type
  6. Case Typeof<TextureFlags>
  7. Return New JsonNumber( Int( Cast<TextureFlags>( value ) ) )
  8. End
  9. Return Null
  10. End
  11. Method Dejsonify:Variant( jvalue:JsonValue,type:TypeInfo,jsonifier:Jsonifier ) Override
  12. Select type
  13. Case Typeof<TextureFlags>
  14. Return Cast<TextureFlags>( Int( jvalue.ToNumber() ) )
  15. End
  16. Return Null
  17. End
  18. End
  19. Class StdJsonifierExt Extends JsonifierExt
  20. Const Instance:=New StdJsonifierExt
  21. Method Jsonify:JsonValue( value:Variant,jsonifier:Jsonifier ) Override
  22. Select value.Type
  23. Case Typeof<Vec2i>
  24. Local v:=Cast<Vec2i>( value )
  25. Return jsonifier.Jsonify( New Int[]( v.x,v.y ) )
  26. Case Typeof<Vec2f>
  27. Local v:=Cast<Vec2f>( value )
  28. Return jsonifier.Jsonify( New Float[]( v.x,v.y ) )
  29. Case Typeof<Recti>
  30. Local v:=Cast<Recti>( value )
  31. Return jsonifier.Jsonify( new Int[]( v.min.x,v.min.y,v.max.x,v.max.y ) )
  32. Case Typeof<Rectf>
  33. Local v:=Cast<Rectf>( value )
  34. Return jsonifier.Jsonify( New Float[]( v.min.x,v.min.y,v.max.x,v.max.y ) )
  35. Case Typeof<Vec3f>
  36. Local v:=Cast<Vec3f>( value )
  37. Return jsonifier.Jsonify( New Float[]( v.x,v.y,v.z ) )
  38. Case Typeof<Boxf>
  39. Local v:=Cast<Boxf>( value )
  40. Return jsonifier.Jsonify( New Float[]( v.min.x,v.min.y,v.min.z,v.max.x,v.max.y,v.max.z ) )
  41. Case Typeof<AffineMat4f>
  42. Local v:=Cast<AffineMat4f>( value )
  43. Return jsonifier.Jsonify( New Float[]( v.m.i.x,v.m.i.y,v.m.i.z, v.m.j.x,v.m.j.y,v.m.j.z, v.m.k.x,v.m.k.y,v.m.k.z, v.t.x,v.t.y,v.t.z ) )
  44. Case Typeof<Color>
  45. Local v:=Cast<Color>( value )
  46. Return jsonifier.Jsonify( New Float[]( v.r,v.g,v.b,v.a ) )
  47. Case typeof<Axis>
  48. Return New JsonNumber( Int( Cast<Axis>( value ) ) )
  49. End
  50. Return Null
  51. End
  52. Method Dejsonify:Variant( jvalue:JsonValue,type:TypeInfo,jsonifier:Jsonifier ) Override
  53. Select type
  54. Case Typeof<Vec2i>
  55. Local v:=jsonifier.Dejsonify<Int[]>( jvalue )
  56. Return New Vec2i( v[0],v[1] )
  57. Case Typeof<Vec2f>
  58. Local v:=jsonifier.Dejsonify<Float[]>( jvalue )
  59. Return New Vec2f( v[0],v[1] )
  60. Case Typeof<Recti>
  61. Local v:=jsonifier.Dejsonify<Int[]>( jvalue )
  62. Return New Recti( v[0],v[1],v[2],v[3] )
  63. Case Typeof<Rectf>
  64. Local v:=jsonifier.Dejsonify<Float[]>( jvalue )
  65. Return New Rectf( v[0],v[1],v[2],v[3] )
  66. Case Typeof<Vec3f>
  67. Local v:=jsonifier.Dejsonify<Float[]>( jvalue )
  68. Return New Vec3f( v[0],v[1],v[2] )
  69. Case Typeof<Boxf>
  70. Local v:=jsonifier.Dejsonify<Float[]>( jvalue )
  71. Return New Boxf( v[0],v[1],v[2],v[3],v[4],v[5] )
  72. Case Typeof<AffineMat4f>
  73. Local v:=jsonifier.Dejsonify<Float[]>( jvalue )
  74. Return New AffineMat4f( v[0],v[1],v[2], v[3],v[4],v[5], v[6],v[7],v[8], v[9],v[10],v[11] )
  75. Case Typeof<Color>
  76. Local v:=jsonifier.Dejsonify<Float[]>( jvalue )
  77. Return New Color( v[0],v[1],v[2],v[3] )
  78. Case Typeof<Axis>
  79. Return Cast<Axis>( Int( jvalue.ToNumber() ) )
  80. End
  81. Return Null
  82. End
  83. End
  84. Class InvocationJsonifierExt Extends JsonifierExt
  85. Const Instance:=New InvocationJsonifierExt
  86. Method Jsonify:JsonValue( value:Variant,jsonifier:Jsonifier ) Override
  87. Select value.Type
  88. Case Typeof<Invocation>
  89. Local v:=Cast<Invocation>( value )
  90. Local jobj:=New JsonObject
  91. ' jobj.SetString( "scope",v.Scope.Name )
  92. ' jobj.SetString( "decl",v.Decl.Name )
  93. Local decl:=v.Scope.Name
  94. If decl.EndsWith( " Extension" ) decl=decl.Slice( 0,-10 )
  95. decl+="."+v.Decl.Name
  96. jobj.SetString( "decl",decl )
  97. jobj.SetString( "type",v.Decl.Type )
  98. If v.Inst jobj.SetValue( "inst",jsonifier.Jsonify( v.Inst ) )
  99. jobj.SetValue( "args",jsonifier.Jsonify( v.Args ) )
  100. Return jobj
  101. End
  102. Return Null
  103. End
  104. Method Dejsonify:Variant( jvalue:JsonValue,type:TypeInfo,jsonifier:Jsonifier ) Override
  105. Select type
  106. Case Typeof<Invocation>
  107. Local jobj:=Cast<JsonObject>( jvalue )
  108. Local dname:=jobj.GetString( "decl" )
  109. Local dtype:=jobj.GetString( "type" )
  110. Local jinst:=jobj.Contains( "inst" ) ? jobj.GetValue( "inst" ) Else JsonValue.NullValue
  111. Local jargs:=jobj.GetArray( "args" )
  112. Local i:=dname.FindLast( "." )
  113. Local dscope:=dname.Slice( 0,i )
  114. dname=dname.Slice( i+1 )
  115. Local scope:=TypeInfo.GetType( dscope )
  116. Local decl:DeclInfo
  117. For Local tdecl:=Eachin scope.GetDecls( dname )
  118. If String(tdecl.Type)<>dtype Continue
  119. decl=tdecl
  120. Exit
  121. Next
  122. If Not decl
  123. For Local type:=Eachin reflection.GetTypeExtensions( scope )
  124. For Local tdecl:=Eachin type.GetDecls( dname )
  125. If String(tdecl.Type)<>dtype Continue
  126. scope=type
  127. decl=tdecl
  128. Exit
  129. Next
  130. If decl Exit
  131. Next
  132. Assert( decl )
  133. Endif
  134. Local type:=dname="New" ? scope Else decl.Type.ReturnType
  135. Local inst:=jsonifier.Dejsonify( jinst,type )'Typeof<Object> )
  136. Local args:=New Variant[jargs.Length]
  137. For Local i:=0 Until args.Length
  138. args[i]=jsonifier.Dejsonify( jargs[i],decl.Type.ParamTypes[i] )
  139. Next
  140. Local ctor:=New Invocation( scope,decl,inst,args )
  141. Return ctor
  142. End
  143. Return Null
  144. End
  145. End