SceneTree.hx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package hide.comp;
  2. class SceneTree extends IconTree<String> {
  3. var showRoot : Bool;
  4. public var obj : h3d.scene.Object;
  5. public function new(obj, root, showRoot : Bool) {
  6. super(root);
  7. this.showRoot = showRoot;
  8. this.obj = obj;
  9. init();
  10. }
  11. function resolvePath(id:String) : Dynamic {
  12. var path = id.split("/");
  13. var root = showRoot ? obj.parent : obj;
  14. while( path.length > 0 ) {
  15. var idx = Std.parseInt(path[0]);
  16. if( idx == null ) break;
  17. path.shift();
  18. root = root.getChildAt(idx);
  19. }
  20. if( path.length == 0 )
  21. return root;
  22. var prop = path.shift();
  23. switch( prop.split(":").shift() ) {
  24. case "mat":
  25. return root.toMesh().getMaterials()[Std.parseInt(prop.substr(4))];
  26. default:
  27. }
  28. return null;
  29. }
  30. override function onClick(id:String, evt: Dynamic) {
  31. var v : Dynamic = resolvePath(id);
  32. if( Std.is(v, h3d.scene.Object) )
  33. onSelectObject(v);
  34. else if( Std.is(v, h3d.mat.Material) )
  35. onSelectMaterial(v);
  36. }
  37. public dynamic function onSelectObject( obj : h3d.scene.Object ) {
  38. }
  39. public dynamic function onSelectMaterial( m : h3d.mat.Material ) {
  40. }
  41. override function applyStyle(id: String, el: Element) {
  42. var v : Dynamic = resolvePath(id);
  43. var obj = Std.instance(v, h3d.scene.Object);
  44. if (obj != null) {
  45. if (el.find(".fa-eye").length == 0) {
  46. var visibilityToggle = new Element('<i class="fa fa-eye visibility-large-toggle"/>').appendTo(el.find(".jstree-wholerow").first());
  47. visibilityToggle.click(function (e) {
  48. obj.visible = !obj.visible;
  49. el.toggleClass("hidden", !obj.visible);
  50. });
  51. }
  52. el.toggleClass("hidden", !obj.visible);
  53. }
  54. }
  55. function getIcon( c : h3d.scene.Object ) {
  56. if( c.isMesh() ) {
  57. if( Std.is(c, h3d.scene.Skin) )
  58. return "male";
  59. if( Std.is(c, h3d.parts.GpuParticles) || Std.is(c, h3d.parts.Particles) )
  60. return "snowflake-o";
  61. return "cube";
  62. }
  63. if( Std.is(c, h3d.scene.Light) )
  64. return "sun-o";
  65. return "circle-o";
  66. }
  67. override function get( id : String ) {
  68. var root = showRoot ? obj.parent : obj;
  69. var path = id == null ? "" : id+"/";
  70. if( id != null ) {
  71. var parts = [for(p in id.split("/")) Std.parseInt(p)];
  72. for( p in parts )
  73. root = root.getChildAt(p);
  74. }
  75. var elements : Array<IconTree.IconTreeItem<String>> = [
  76. for( i in 0...root.numChildren ) {
  77. var c = root.getChildAt(i);
  78. {
  79. value :path+i,
  80. text : getObjectName(c),
  81. icon : "fa fa-" + getIcon(c),
  82. children : c.isMesh() || c.numChildren > 0,
  83. state : { opened : c.numChildren > 0 && c.numChildren < 10 }
  84. }
  85. }
  86. ];
  87. if( root.isMesh() ) {
  88. var materials = root.toMesh().getMeshMaterials();
  89. for( i in 0...materials.length ) {
  90. var m = materials[i];
  91. elements.push({
  92. value :path+"mat:"+i,
  93. text : m.name == null ? "Material@"+i : m.name,
  94. icon : "fa fa-photo",
  95. });
  96. }
  97. }
  98. return elements;
  99. }
  100. public function getObjectName( o : h3d.scene.Object ) {
  101. if( o.name != null )
  102. return o.name;
  103. if( o.parent == null )
  104. return o.toString();
  105. return o.toString() + "@" + @:privateAccess o.parent.children.indexOf(o);
  106. }
  107. }