Material.hx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package h3d.mat;
  2. import h3d.mat.Data;
  3. import h3d.mat.Pass;
  4. class Material {
  5. var passes : Pass;
  6. public var mainPass(get, never) : Pass;
  7. public var shadows(get, set) : Bool;
  8. public var castShadows(default, set) : Bool;
  9. public var receiveShadows(default, set) : Bool;
  10. public function new(passes) {
  11. this.passes = passes;
  12. }
  13. public function addPass<T:Pass>( p : T ) : T {
  14. var prev = null, cur = passes;
  15. while( cur != null ) {
  16. prev = cur;
  17. cur = cur.nextPass;
  18. }
  19. if( prev == null )
  20. passes = p;
  21. else
  22. prev.nextPass = p;
  23. p.nextPass = null;
  24. return p;
  25. }
  26. public function removePass( p : Pass ) {
  27. var prev : Pass = null, cur = passes;
  28. while( cur != null ) {
  29. if( cur == p ) {
  30. if( prev == null )
  31. passes = p.nextPass;
  32. else
  33. prev.nextPass = p.nextPass;
  34. p.nextPass = null;
  35. return true;
  36. }
  37. prev = cur;
  38. cur = cur.nextPass;
  39. }
  40. return false;
  41. }
  42. inline function get_mainPass() {
  43. return passes;
  44. }
  45. public function getPass( name : String ) : Pass {
  46. var p = passes;
  47. while( p != null ) {
  48. if( p.name == name )
  49. return p;
  50. p = p.nextPass;
  51. }
  52. return null;
  53. }
  54. public function allocPass< T:(Pass, { function new(?parent:Pass) : Void; }) >( name : String, ?c : Class<T> ) : T {
  55. var p = getPass(name);
  56. if( p != null ) return cast p;
  57. if( c == null ) return null;
  58. var p = Type.createInstance(c, [passes]);
  59. addPass(p);
  60. return p;
  61. }
  62. public function clone() {
  63. throw "TODO";
  64. }
  65. inline function get_shadows() {
  66. return castShadows && receiveShadows;
  67. }
  68. inline function set_shadows(v) {
  69. castShadows = v;
  70. receiveShadows = v;
  71. return v;
  72. }
  73. function set_castShadows(v) {
  74. if( castShadows == v )
  75. return v;
  76. if( v )
  77. addPass(new Pass("shadow", null, mainPass));
  78. else
  79. removePass(getPass("shadow"));
  80. return castShadows = v;
  81. }
  82. function set_receiveShadows(v) {
  83. if( v == receiveShadows )
  84. return v;
  85. var shadows = h3d.pass.Params.shadowShader;
  86. if( v )
  87. mainPass.addShader(shadows);
  88. else
  89. mainPass.removeShader(shadows);
  90. return receiveShadows = v;
  91. }
  92. }