Viewport.hx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package arm;
  2. import kha.arrays.Float32Array;
  3. import iron.Scene;
  4. import iron.math.Vec4;
  5. import arm.Camera;
  6. import arm.Enums;
  7. class Viewport {
  8. public static function scaleToBounds() {
  9. var po = Context.mergedObject == null ? Context.mainObject() : Context.mergedObject;
  10. var md = po.data;
  11. md.geom.calculateAABB();
  12. var r = Math.sqrt(md.geom.aabb.x * md.geom.aabb.x + md.geom.aabb.y * md.geom.aabb.y + md.geom.aabb.z * md.geom.aabb.z);
  13. po = Context.mainObject();
  14. po.transform.dim.x = md.geom.aabb.x;
  15. po.transform.dim.y = md.geom.aabb.y;
  16. po.transform.dim.z = md.geom.aabb.z;
  17. po.transform.scale.set(2 / r, 2 / r, 2 / r);
  18. po.transform.loc.set(0, 0, 0);
  19. po.transform.buildMatrix();
  20. for (c in po.children) {
  21. c.transform.loc.set(0, 0, 0);
  22. c.transform.buildMatrix();
  23. }
  24. }
  25. public static function reset() {
  26. var cam = Scene.active.camera;
  27. for (o in Scene.active.raw.objects) {
  28. if (o.type == "camera_object") {
  29. cam.transform.local.setF32(o.transform.values);
  30. cam.transform.decompose();
  31. if (Context.fovHandle != null) Context.fovHandle.value = cam.data.raw.fov = 0.92;
  32. Context.camHandle.position = 0;
  33. cam.data.raw.ortho = null;
  34. cam.buildProjection();
  35. Context.ddirty = 2;
  36. Camera.inst.reset();
  37. break;
  38. }
  39. }
  40. }
  41. public static function setView(x: Float, y: Float, z: Float, rx: Float, ry: Float, rz: Float) {
  42. Context.paintObject.transform.rot.set(0, 0, 0, 1);
  43. Context.paintObject.transform.dirty = true;
  44. var cam = Scene.active.camera;
  45. var dist = cam.transform.loc.length();
  46. cam.transform.loc.set(x * dist, y * dist, z * dist);
  47. cam.transform.rot.fromEuler(rx, ry, rz);
  48. cam.transform.buildMatrix();
  49. cam.buildProjection();
  50. Context.ddirty = 2;
  51. Camera.inst.reset(Context.viewIndexLast);
  52. }
  53. public static function orbit(x: Float, y: Float) {
  54. var cam = Scene.active.camera;
  55. var dist = Camera.inst.distance();
  56. cam.transform.move(cam.lookWorld(), dist);
  57. cam.transform.rotate(new Vec4(0, 0, 1), x);
  58. cam.transform.rotate(cam.rightWorld(), y);
  59. cam.transform.move(cam.lookWorld(), -dist);
  60. Context.ddirty = 2;
  61. }
  62. public static function orbitOpposite() {
  63. var cam = Scene.active.camera;
  64. var z = Math.abs(cam.look().z) - 1.0;
  65. (z < 0.0001 && z > -0.0001) ? orbit(0, Math.PI) : orbit(Math.PI, 0);
  66. }
  67. public static function zoom(f: Float) {
  68. var cam = Scene.active.camera;
  69. cam.transform.move(cam.look(), f);
  70. Context.ddirty = 2;
  71. }
  72. public static function updateCameraType(cameraType: Int) {
  73. var cam = Scene.active.cameras[0];
  74. var light = Scene.active.lights[0];
  75. if (cameraType == CameraPerspective) {
  76. cam.data.raw.ortho = null;
  77. light.visible = true;
  78. }
  79. else {
  80. var f32 = new Float32Array(4);
  81. var f = cam.data.raw.fov * cam.transform.world.getLoc().length() / 2.5;
  82. f32[0] = -2 * f;
  83. f32[1] = 2 * f;
  84. f32[2] = -2 * f * (iron.App.h() / iron.App.w());
  85. f32[3] = 2 * f * (iron.App.h() / iron.App.w());
  86. cam.data.raw.ortho = f32;
  87. light.visible = false;
  88. }
  89. cam.buildProjection();
  90. Context.ddirty = 2;
  91. }
  92. }