material.monkey2 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. Namespace mojo3d
  2. #rem monkeydoc The Material class.
  3. #end
  4. Class Material Extends Resource
  5. enum Attrib
  6. Position=1
  7. Normal=2
  8. Color=4
  9. TexCoord0=8
  10. TexCoord1=16
  11. Tangent=32
  12. Weights=64
  13. Bones=128
  14. End
  15. #rem monkeydoc Creates a copy of the material.
  16. #end
  17. Method Copy:Material() abstract
  18. #rem monkeydoc Material name.
  19. #end
  20. Property Name:String()
  21. Return _name
  22. Setter( name:String )
  23. _name=name
  24. End
  25. Property ShaderName:String()
  26. Return _shaderName
  27. Setter( name:String )
  28. If name=_shaderName Return
  29. _shaderName=name
  30. Invalidate()
  31. End
  32. Property AttribMask:Int()
  33. Return _attribMask
  34. Setter( mask:Int )
  35. If mask=_attribMask Return
  36. _attribMask=mask
  37. Invalidate()
  38. End
  39. Property SelfIlluminated:Bool()
  40. Return _selfillum
  41. Setter( selfillum:Bool )
  42. If selfillum=_selfillum Return
  43. _selfillum=selfillum
  44. End
  45. #Rem monkeydoc The material blendmode.
  46. #End
  47. Property BlendMode:BlendMode()
  48. Return _blendMode
  49. Setter( mode:BlendMode )
  50. _blendMode=mode
  51. End
  52. #Rem monkeydoc The material cullmode.
  53. #End
  54. Property CullMode:CullMode()
  55. Return _cullMode
  56. Setter( mode:CullMode )
  57. _cullMode=mode
  58. End
  59. #rem monkeydoc The material texture matrix.
  60. #end
  61. Property TextureMatrix:AffineMat3f()
  62. Return Uniforms.GetAffineMat3f( "TextureMatrix" )
  63. Setter( matrix:AffineMat3f )
  64. Uniforms.SetAffineMat3f( "TextureMatrix",matrix )
  65. End
  66. #rem monkeydoc Translates the texture matrix.
  67. #end
  68. Method TranslateTextureMatrix( tv:Vec2f )
  69. TextureMatrix=TextureMatrix.Translate( tv )
  70. End
  71. Method TranslateTextureMatrix( tx:Float,ty:Float )
  72. TextureMatrix=TextureMatrix.Translate( tx,ty )
  73. End
  74. #rem monkeydoc Rotates the texture matrix.
  75. #end
  76. Method RotateTextureMatrix( angle:Float )
  77. TextureMatrix=TextureMatrix.Rotate( angle )
  78. End
  79. #rem monkeydoc Scales the texture matrix.
  80. #end
  81. Method ScaleTextureMatrix( sv:Vec2f )
  82. TextureMatrix=TextureMatrix.Scale( sv )
  83. End
  84. Method ScaleTextureMatrix( sx:Float,sy:Float )
  85. TextureMatrix=TextureMatrix.Scale( sx,sy )
  86. End
  87. #Rem monkeydoc @hidden The material uniforms.
  88. TODO: Should really be protected...
  89. #End
  90. Property Uniforms:UniformBlock()
  91. Return _uniforms
  92. End
  93. #rem monkeydoc Gets material's shader for rendering.
  94. #end
  95. Method GetRenderShader:Shader()
  96. Validate()
  97. Return _shader
  98. End
  99. Function LoadTexture:Texture( path:String,textureFlags:TextureFlags,flipy:Bool=False )
  100. Local scene:=Scene.GetCurrent()
  101. Return scene.LoadTexture( path,textureFlags,flipy )
  102. End
  103. Function LoadTexture:Texture( path:String,name:String,textureFlags:TextureFlags,flipy:Bool=False )
  104. Local scene:=Scene.GetCurrent()
  105. Local texture:=scene.LoadTexture( path+"/"+name+".png",textureFlags,flipy )
  106. If Not texture texture=scene.LoadTexture( path+"/"+name+".jpg",textureFlags,flipy )
  107. Return texture
  108. End
  109. Protected
  110. Method OnValidate() Virtual
  111. End
  112. Method Invalidate()
  113. _shader=Null
  114. End
  115. Method New()
  116. _name="Material"
  117. _attribMask=1
  118. _blendMode=BlendMode.Opaque
  119. _cullMode=CullMode.Back
  120. _selfillum=False
  121. _uniforms=New UniformBlock( 3,True )
  122. TextureMatrix=New AffineMat3f
  123. End
  124. Method New( material:Material )
  125. _name=material._name
  126. _shaderName=material._shaderName
  127. _attribMask=material._attribMask
  128. _blendMode=material._blendMode
  129. _cullMode=material._cullMode
  130. _selfillum=material._selfillum
  131. _shader=material._shader
  132. _dirty=material._dirty
  133. _uniforms=New UniformBlock( material._uniforms )
  134. TextureMatrix=material.TextureMatrix
  135. End
  136. Method AddInstance()
  137. Local scene:=Scene.GetCurrent()
  138. If scene.Editing scene.Jsonifier.AddInstance( Self,New Variant[0] )
  139. End
  140. Method AddInstance( args:Variant[] )
  141. Local scene:=Scene.GetCurrent()
  142. If scene.Editing scene.Jsonifier.AddInstance( Self,args )
  143. End
  144. Method AddInstance( material:Material )
  145. Local scene:=Scene.GetCurrent()
  146. If scene.Editing scene.Jsonifier.AddInstance( Self,New Variant[]( material ) )
  147. End
  148. Private
  149. Field _name:String
  150. Field _shaderName:String
  151. Field _attribMask:Int
  152. Field _selfillum:Bool
  153. Field _cullMode:CullMode
  154. Field _blendMode:BlendMode
  155. Field _uniforms:UniformBlock
  156. Field _shader:Shader
  157. Field _dirty:Bool=True
  158. Method Validate()
  159. If _shader Return
  160. Local defs:=Renderer.GetCurrent().ShaderDefs
  161. defs+=";MX2_ATTRIBMASK "+_attribMask
  162. Local shaderName:=_shaderName ?Else "materials/default"
  163. _shader=mojo.graphics.Shader.Open( shaderName,defs )
  164. End
  165. End