MultiMaterial.hx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package h3d.scene;
  2. class MultiMaterial extends Mesh {
  3. public var materials : Array<h3d.mat.Material>;
  4. public function new( prim, ?mats, ?parent ) {
  5. super(prim, mats == null ? null : mats[0], parent);
  6. this.materials = mats == null ? [material] : mats;
  7. }
  8. override function getMeshMaterials() {
  9. return materials.copy();
  10. }
  11. override function clone( ?o : Object ) {
  12. var m = o == null ? new MultiMaterial(null, materials) : cast o;
  13. m.materials = [];
  14. for( mat in materials )
  15. m.materials.push(if( mat == null ) null else cast mat.clone());
  16. super.clone(m);
  17. m.material = m.materials[0];
  18. return m;
  19. }
  20. override function emit( ctx : RenderContext ) {
  21. calcScreenRatio(ctx);
  22. if ( primitive.screenRatioToLod(curScreenRatio) >= primitive.lodCount() )
  23. return;
  24. for( i in 0...materials.length ) {
  25. var m = materials[i];
  26. if( m != null )
  27. ctx.emit(m, this, i);
  28. }
  29. }
  30. override function getMaterialByName( name : String ) : h3d.mat.Material {
  31. for( m in materials )
  32. if( m != null && m.name == name )
  33. return m;
  34. return super.getMaterialByName(name);
  35. }
  36. override function getMaterials( ?a : Array<h3d.mat.Material>, recursive = true ) {
  37. if( a == null ) a = [];
  38. for( m in materials )
  39. if( m != null && a.indexOf(m) < 0 )
  40. a.push(m);
  41. if( recursive ) {
  42. for( o in children )
  43. o.getMaterials(a);
  44. }
  45. return a;
  46. }
  47. override function draw( ctx : RenderContext ) {
  48. if( materials.length > 1 )
  49. primitive.selectMaterial(ctx.drawPass.index, primitive.screenRatioToLod(curScreenRatio));
  50. primitive.render(ctx.engine);
  51. }
  52. }