viewport.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. function viewport_scale_to_bounds() {
  2. let po: mesh_object_t = context_raw.merged_object == null ? context_main_object() : context_raw.merged_object;
  3. let md: mesh_data_t = po.data;
  4. let aabb: vec4_t = mesh_data_calculate_aabb(md);
  5. let r: f32 = math_sqrt(aabb.x * aabb.x + aabb.y * aabb.y + aabb.z * aabb.z);
  6. po = context_main_object();
  7. po.base.transform.dim.x = aabb.x;
  8. po.base.transform.dim.y = aabb.y;
  9. po.base.transform.dim.z = aabb.z;
  10. vec4_set(po.base.transform.scale, 2 / r, 2 / r, 2 / r);
  11. vec4_set(po.base.transform.loc, 0, 0, 0);
  12. transform_build_matrix(po.base.transform);
  13. for (let i: i32 = 0; i < po.base.children.length; ++i) {
  14. let c: object_t = po.base.children[i];
  15. vec4_set(c.transform.loc, 0, 0, 0);
  16. transform_build_matrix(c.transform);
  17. }
  18. }
  19. function viewport_reset() {
  20. let cam: camera_object_t = scene_camera;
  21. for (let i: i32 = 0; i < _scene_raw.objects.length; ++i) {
  22. let o: obj_t = _scene_raw.objects[i];
  23. if (o.type == "camera_object") {
  24. mat4_set_from_f32_array(cam.base.transform.local, o.transform);
  25. transform_decompose(cam.base.transform);
  26. if (context_raw.fov_handle != null) {
  27. context_raw.fov_handle.value = cam.data.fov = base_default_fov;
  28. }
  29. context_raw.cam_handle.position = 0;
  30. cam.data.ortho = null;
  31. camera_object_build_proj(cam);
  32. context_raw.ddirty = 2;
  33. camera_reset();
  34. transform_reset(context_main_object().base.transform);
  35. break;
  36. }
  37. }
  38. }
  39. function viewport_set_view(x: f32, y: f32, z: f32, rx: f32, ry: f32, rz: f32) {
  40. quat_set(context_raw.paint_object.base.transform.rot, 0, 0, 0, 1);
  41. context_raw.paint_object.base.transform.dirty = true;
  42. let cam: camera_object_t = scene_camera;
  43. let dist: f32 = vec4_len(cam.base.transform.loc);
  44. vec4_set(cam.base.transform.loc, x * dist, y * dist, z * dist);
  45. quat_from_euler(cam.base.transform.rot, rx, ry, rz);
  46. transform_build_matrix(cam.base.transform);
  47. camera_object_build_proj(cam);
  48. context_raw.ddirty = 2;
  49. camera_reset(context_raw.view_index_last);
  50. }
  51. function viewport_orbit(x: f32, y: f32) {
  52. let cam: camera_object_t = scene_camera;
  53. let dist: f32 = camera_distance();
  54. transform_move(cam.base.transform, camera_object_look_world(cam), dist);
  55. transform_rotate(cam.base.transform, vec4_create(0, 0, 1), x);
  56. transform_rotate(cam.base.transform, camera_object_right_world(cam), y);
  57. transform_move(cam.base.transform, camera_object_look_world(cam), -dist);
  58. context_raw.ddirty = 2;
  59. }
  60. function viewport_orbit_opposite() {
  61. let cam: camera_object_t = scene_camera;
  62. let z: f32 = math_abs(camera_object_look(cam).z) - 1.0;
  63. (z < 0.0001 && z > -0.0001) ? viewport_orbit(0, math_pi()) : viewport_orbit(math_pi(), 0);
  64. }
  65. function viewport_zoom(f: f32) {
  66. let cam: camera_object_t = scene_camera;
  67. transform_move(cam.base.transform, camera_object_look(cam), f);
  68. context_raw.ddirty = 2;
  69. }
  70. function viewport_update_camera_type(camera_type: i32) {
  71. let cam: camera_object_t = scene_cameras[0];
  72. let light: light_object_t = scene_lights[0];
  73. if (camera_type == camera_type_t.PERSPECTIVE) {
  74. cam.data.ortho = null;
  75. light.base.visible = true;
  76. }
  77. else {
  78. let f32a: f32_array_t = f32_array_create(4);
  79. let f: f32 = cam.data.fov * vec4_len(mat4_get_loc(cam.base.transform.world)) / 2.5;
  80. f32a[0] = -2 * f;
  81. f32a[1] = 2 * f;
  82. f32a[2] = -2 * f * (app_h() / app_w());
  83. f32a[3] = 2 * f * (app_h() / app_w());
  84. cam.data.ortho = f32a;
  85. light.base.visible = false;
  86. }
  87. camera_object_build_proj(cam);
  88. context_raw.ddirty = 2;
  89. }