SceneTree.hx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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[0];
  23. switch( prop.split(":").shift() ) {
  24. case "mat":
  25. return root.toMesh().getMaterials()[Std.parseInt(prop.substr(4))];
  26. case "joint":
  27. return root.getObjectByName(path.pop().substr(6));
  28. }
  29. return null;
  30. }
  31. override function onClick(id:String, evt: Dynamic) {
  32. var v : Dynamic = resolvePath(id);
  33. if( Std.is(v, h3d.scene.Object) )
  34. onSelectObject(v);
  35. else if( Std.is(v, h3d.mat.Material) )
  36. onSelectMaterial(v);
  37. }
  38. public dynamic function onSelectObject( obj : h3d.scene.Object ) {
  39. }
  40. public dynamic function onSelectMaterial( m : h3d.mat.Material ) {
  41. }
  42. override function applyStyle(id: String, el: Element) {
  43. var v : Dynamic = resolvePath(id);
  44. var obj = Std.downcast(v, h3d.scene.Object);
  45. if( obj == null || Std.is(obj,h3d.scene.Skin.Joint) ) return;
  46. if (el.find(".ico-eye").length == 0) {
  47. var visibilityToggle = new Element('<i class="ico ico-eye visibility-large-toggle"/>').appendTo(el.find(".jstree-anchor").first());
  48. visibilityToggle.click(function (e) {
  49. obj.visible = !obj.visible;
  50. el.toggleClass("hidden", !obj.visible);
  51. });
  52. }
  53. el.toggleClass("hidden", !obj.visible);
  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("/")) { id : p, index : Std.parseInt(p) }];
  72. for( p in parts ) {
  73. if( StringTools.startsWith(p.id,"joint:") ) {
  74. root = root.getObjectByName(parts.pop().id.substr(6)); // last joint only
  75. break;
  76. } else {
  77. root = root.getChildAt(p.index);
  78. }
  79. }
  80. }
  81. var elements : Array<IconTree.IconTreeItem<String>> = [
  82. for( i in 0...root.numChildren ) {
  83. var c = root.getChildAt(i);
  84. {
  85. value :path+i,
  86. text : getObjectName(c),
  87. icon : "ico ico-" + getIcon(c),
  88. children : c.isMesh() || c.numChildren > 0,
  89. state : { opened : c.numChildren > 0 && c.numChildren < 10 }
  90. }
  91. }
  92. ];
  93. if( root.isMesh() ) {
  94. var materials = root.toMesh().getMeshMaterials();
  95. for( i in 0...materials.length ) {
  96. var m = materials[i];
  97. elements.push({
  98. value :path+"mat:"+i,
  99. text : m.name == null ? "Material@"+i : m.name,
  100. icon : "ico ico-photo",
  101. });
  102. }
  103. var sk = Std.downcast(root,h3d.scene.Skin);
  104. if( sk != null ) {
  105. for( j in sk.getSkinData().rootJoints )
  106. elements.push({
  107. value: path+"joint:"+j.name,
  108. text : j.name,
  109. icon : "ico ico-gg",
  110. children : j.subs.length > 0,
  111. });
  112. }
  113. }
  114. var joint = Std.downcast(root,h3d.scene.Skin.Joint);
  115. if( joint != null ) {
  116. var j = joint.skin.getSkinData().allJoints[joint.index];
  117. for( j in j.subs )
  118. elements.push({
  119. value: path+"joint:"+j.name,
  120. text : j.name,
  121. icon : "ico ico-gg",
  122. children : j.subs.length > 0,
  123. });
  124. }
  125. return elements;
  126. }
  127. public function getObjectName( o : h3d.scene.Object ) {
  128. if( o.name != null )
  129. return o.name;
  130. if( o.parent == null )
  131. return o.toString();
  132. return o.toString() + "@" + @:privateAccess o.parent.children.indexOf(o);
  133. }
  134. }