Gizmo.hx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package arm.plugin;
  2. import iron.object.MeshObject;
  3. import iron.object.LightObject;
  4. import iron.system.Input;
  5. import iron.math.RayCaster;
  6. import iron.math.Vec4;
  7. import iron.Scene;
  8. import arm.ui.UITrait;
  9. class Gizmo {
  10. public static function update() {
  11. var gizmo = UITrait.inst.gizmo;
  12. if (!gizmo.visible) return;
  13. if (Context.object != null) {
  14. var cam = Scene.active.camera;
  15. gizmo.transform.loc.setFrom(Context.object.transform.loc);
  16. var dist = Vec4.distance(cam.transform.loc, gizmo.transform.loc) / 10;
  17. gizmo.transform.scale.set(dist, dist, dist);
  18. UITrait.inst.gizmoX.transform.scale.set(dist, dist, dist);
  19. UITrait.inst.gizmoY.transform.scale.set(dist, dist, dist);
  20. UITrait.inst.gizmoZ.transform.scale.set(dist, dist, dist);
  21. gizmo.transform.buildMatrix();
  22. }
  23. var mouse = Input.getMouse();
  24. var kb = Input.getKeyboard();
  25. if (mouse.viewX < App.w()) {
  26. if (kb.started("delete") || kb.started("backspace")) {
  27. if (Context.object != null) {
  28. Context.object.remove();
  29. Context.selectObject(Scene.active.getChild("Scene"));
  30. }
  31. }
  32. if (kb.started("c") && Context.object != null) {
  33. if (Std.is(Context.object, MeshObject)) {
  34. var mo = cast(Context.object, MeshObject);
  35. var object = Scene.active.addMeshObject(mo.data, mo.materials, Scene.active.getChild("Scene"));
  36. object.name = mo.name + ".1";
  37. object.transform.loc.setFrom(mo.transform.loc);
  38. object.transform.rot.setFrom(mo.transform.rot);
  39. object.transform.scale.setFrom(mo.transform.scale);
  40. var hit = RayCaster.planeIntersect(Vec4.zAxis(), new Vec4(), mouse.viewX, mouse.viewY, Scene.active.camera);
  41. if (hit != null) {
  42. object.transform.loc.x = hit.x;
  43. object.transform.loc.y = hit.y;
  44. object.transform.setRotation(0, 0, Math.random() * 3.1516 * 2);
  45. }
  46. object.transform.buildMatrix();
  47. #if arm_physics
  48. object.addTrait(new arm.plugin.PhysicsBody());
  49. #end
  50. Context.selectObject(object);
  51. }
  52. else if (Std.is(Context.object, LightObject)) {
  53. var lo = cast(Context.object, LightObject);
  54. var object = Scene.active.addLightObject(lo.data, Scene.active.getChild("Scene"));
  55. object.name = lo.name + ".1";
  56. object.transform.loc.setFrom(lo.transform.loc);
  57. object.transform.rot.setFrom(lo.transform.rot);
  58. object.transform.scale.setFrom(lo.transform.scale);
  59. object.transform.buildMatrix();
  60. #if arm_physics
  61. object.addTrait(new arm.plugin.PhysicsBody());
  62. #end
  63. Context.selectObject(object);
  64. }
  65. Context.rdirty = 3;
  66. Context.ddirty = 3;
  67. }
  68. if (kb.started("m")) { // skip voxel
  69. var raw = Context.materialScene.data.raw;
  70. raw.skip_context = raw.skip_context == "" ? "voxel" : "";
  71. }
  72. }
  73. if (mouse.started("middle")) {
  74. #if arm_physics
  75. var physics = arm.plugin.PhysicsWorld.active;
  76. var pb = physics.pickClosest(mouse.viewX, mouse.viewY);
  77. if (pb != null) Context.selectObject(pb.object);
  78. #end
  79. }
  80. if (mouse.started("left") && Context.object.name != "Scene") {
  81. gizmo.transform.buildMatrix();
  82. var trs = [UITrait.inst.gizmoX.transform, UITrait.inst.gizmoY.transform, UITrait.inst.gizmoZ.transform];
  83. var hit = RayCaster.closestBoxIntersect(trs, mouse.viewX, mouse.viewY, Scene.active.camera);
  84. if (hit != null) {
  85. if (hit.object == UITrait.inst.gizmoX) UITrait.inst.axisX = true;
  86. else if (hit.object == UITrait.inst.gizmoY) UITrait.inst.axisY = true;
  87. else if (hit.object == UITrait.inst.gizmoZ) UITrait.inst.axisZ = true;
  88. if (UITrait.inst.axisX || UITrait.inst.axisY || UITrait.inst.axisZ) UITrait.inst.axisStart = 0.0;
  89. }
  90. }
  91. else if (mouse.released("left")) {
  92. UITrait.inst.axisX = UITrait.inst.axisY = UITrait.inst.axisZ = false;
  93. }
  94. if (UITrait.inst.axisX || UITrait.inst.axisY || UITrait.inst.axisZ) {
  95. var t = Context.object.transform;
  96. var v = new Vec4();
  97. v.set(t.worldx(), t.worldy(), t.worldz());
  98. if (UITrait.inst.axisX) {
  99. var hit = RayCaster.planeIntersect(Vec4.yAxis(), v, mouse.viewX, mouse.viewY, Scene.active.camera);
  100. if (hit != null) {
  101. if (UITrait.inst.axisStart == 0) UITrait.inst.axisStart = hit.x - Context.object.transform.loc.x;
  102. Context.object.transform.loc.x = hit.x - UITrait.inst.axisStart;
  103. Context.object.transform.buildMatrix();
  104. #if arm_physics
  105. var pb = Context.object.getTrait(arm.plugin.PhysicsBody);
  106. if (pb != null) pb.syncTransform();
  107. #end
  108. }
  109. }
  110. else if (UITrait.inst.axisY) {
  111. var hit = RayCaster.planeIntersect(Vec4.xAxis(), v, mouse.viewX, mouse.viewY, Scene.active.camera);
  112. if (hit != null) {
  113. if (UITrait.inst.axisStart == 0) UITrait.inst.axisStart = hit.y - Context.object.transform.loc.y;
  114. Context.object.transform.loc.y = hit.y - UITrait.inst.axisStart;
  115. Context.object.transform.buildMatrix();
  116. #if arm_physics
  117. var pb = Context.object.getTrait(arm.plugin.PhysicsBody);
  118. if (pb != null) pb.syncTransform();
  119. #end
  120. }
  121. }
  122. else if (UITrait.inst.axisZ) {
  123. var hit = RayCaster.planeIntersect(Vec4.xAxis(), v, mouse.viewX, mouse.viewY, Scene.active.camera);
  124. if (hit != null) {
  125. if (UITrait.inst.axisStart == 0) UITrait.inst.axisStart = hit.z - Context.object.transform.loc.z;
  126. Context.object.transform.loc.z = hit.z - UITrait.inst.axisStart;
  127. Context.object.transform.buildMatrix();
  128. #if arm_physics
  129. var pb = Context.object.getTrait(arm.plugin.PhysicsBody);
  130. if (pb != null) pb.syncTransform();
  131. #end
  132. }
  133. }
  134. }
  135. Input.occupied = (UITrait.inst.axisX || UITrait.inst.axisY || UITrait.inst.axisZ) && mouse.viewX < App.w();
  136. }
  137. }