Model.hx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package hrt.prefab;
  2. class Model extends Object3D {
  3. var animation : Null<String>;
  4. var lockAnimation : Bool = false;
  5. public function new(?parent) {
  6. super(parent);
  7. type = "model";
  8. }
  9. override function save() {
  10. var obj : Dynamic = super.save();
  11. if( animation != null ) obj.animation = animation;
  12. if( lockAnimation ) obj.lockAnimation = lockAnimation;
  13. return obj;
  14. }
  15. override function load( obj : Dynamic ) {
  16. super.load(obj);
  17. animation = obj.animation;
  18. lockAnimation = obj.lockAnimation;
  19. }
  20. function setCullingCollider( o : h3d.scene.Object, cc : h3d.col.Collider ) {
  21. o.cullingCollider = cc;
  22. for( c in @:privateAccess o.children )
  23. setCullingCollider(c, cc);
  24. }
  25. override function makeInstance(ctx:Context):Context {
  26. if( source == null)
  27. return super.makeInstance(ctx);
  28. ctx = ctx.clone(this);
  29. try {
  30. var obj = ctx.loadModel(source);
  31. if(obj.defaultTransform != null && children.length > 0) {
  32. obj.name = "root";
  33. var root = new h3d.scene.Object();
  34. root.addChild(obj);
  35. obj = root;
  36. }
  37. obj.name = name;
  38. ctx.local3d.addChild(obj);
  39. ctx.local3d = obj;
  40. updateInstance(ctx);
  41. if( animation != null )
  42. obj.playAnimation(ctx.loadAnimation(animation));
  43. return ctx;
  44. } catch( e : Dynamic ) {
  45. e.message = "Could not load model " + source + ": " + e.message;
  46. ctx.shared.onError(e);
  47. }
  48. ctx.local3d = new h3d.scene.Object(ctx.local3d);
  49. ctx.local3d.name = name;
  50. updateInstance(ctx);
  51. return ctx;
  52. }
  53. var tmpBounds = new h3d.col.Bounds();
  54. override function updateInstance( ctx: Context, ?propName : String ) {
  55. super.updateInstance(ctx, propName);
  56. var o = ctx.local3d;
  57. #if editor
  58. var cc = o.getBounds(tmpBounds).toSphere();
  59. setCullingCollider(o, cc);
  60. #end
  61. }
  62. #if editor
  63. override function edit( ctx : EditContext ) {
  64. super.edit(ctx);
  65. var props = ctx.properties.add(new hide.Element('
  66. <div class="group" name="Animation">
  67. <dl>
  68. <dt>Model</dt><dd><input type="model" field="source"/></dd>
  69. <dt>Animation</dt><dd><select><option value="">-- Choose --</option></select>
  70. <dt title="Don\'t save animation changes">Lock</dt><dd><input type="checkbox" field="lockAnimation"></select>
  71. </dl>
  72. </div>
  73. '),this, function(pname) {
  74. ctx.onChange(this, pname);
  75. });
  76. var select = props.find("select");
  77. var anims = try ctx.scene.listAnims(source) catch(e: Dynamic) [];
  78. for( a in anims )
  79. new hide.Element('<option>').attr("value", ctx.ide.makeRelative(a)).text(ctx.scene.animationName(a)).appendTo(select);
  80. if( animation != null )
  81. select.val(animation);
  82. select.change(function(_) {
  83. var v = select.val();
  84. var prev = animation;
  85. var obj = ctx.getContext(this).local3d;
  86. ctx.scene.setCurrent();
  87. if( v == "" ) {
  88. animation = null;
  89. obj.stopAnimation();
  90. } else {
  91. obj.playAnimation(ctx.rootContext.loadAnimation(v)).loop = true;
  92. if( lockAnimation ) return;
  93. animation = v;
  94. }
  95. var newValue = animation;
  96. ctx.properties.undo.change(Custom(function(undo) {
  97. var obj = ctx.getContext(this).local3d;
  98. animation = undo ? prev : newValue;
  99. if( animation == null ) {
  100. obj.stopAnimation();
  101. select.val("");
  102. } else {
  103. obj.playAnimation(ctx.rootContext.loadAnimation(animation)).loop = true;
  104. select.val(v);
  105. }
  106. }));
  107. });
  108. }
  109. override function getHideProps() : HideProps {
  110. return {
  111. icon : "cube", name : "Model", fileSource : ["fbx","hmd"],
  112. allowChildren : function(t) return Library.isOfType(t,Object3D) || ["material", "shader"].indexOf(t) >= 0,
  113. onResourceRenamed : function(f) animation = f(animation),
  114. };
  115. }
  116. #end
  117. static var _ = Library.register("model", Model);
  118. }