Files
armorpaint/base/Sources/Viewport.ts
T

96 lines
3.3 KiB
TypeScript
Raw Normal View History

2023-02-08 14:40:15 +01:00
class Viewport {
2024-03-07 20:37:30 +01:00
static scale_to_bounds = () => {
let po: mesh_object_t = Context.raw.merged_object == null ? Context.main_object() : Context.raw.merged_object;
let md: mesh_data_t = po.data;
let aabb: vec4_t = mesh_data_calculate_aabb(md);
let r: f32 = Math.sqrt(aabb.x * aabb.x + aabb.y * aabb.y + aabb.z * aabb.z);
po = Context.main_object();
2024-01-31 15:12:28 +01:00
po.base.transform.dim.x = aabb.x;
po.base.transform.dim.y = aabb.y;
po.base.transform.dim.z = aabb.z;
2024-02-05 20:57:20 +01:00
vec4_set(po.base.transform.scale, 2 / r, 2 / r, 2 / r);
vec4_set(po.base.transform.loc, 0, 0, 0);
transform_build_matrix(po.base.transform);
2024-01-31 15:12:28 +01:00
for (let c of po.base.children) {
2024-02-05 20:57:20 +01:00
vec4_set(c.transform.loc, 0, 0, 0);
transform_build_matrix(c.transform);
2023-02-08 14:40:15 +01:00
}
}
2024-01-17 18:53:31 +01:00
static reset = () => {
2024-03-07 20:37:30 +01:00
let cam: camera_object_t = scene_camera;
2024-02-05 20:57:20 +01:00
for (let o of _scene_raw.objects) {
2023-02-08 14:40:15 +01:00
if (o.type == "camera_object") {
2024-03-01 13:06:16 +01:00
mat4_set_from_f32_array(cam.base.transform.local, o.transform);
2024-02-05 20:57:20 +01:00
transform_decompose(cam.base.transform);
2024-03-07 20:37:30 +01:00
if (Context.raw.fov_handle != null) Context.raw.fov_handle.value = cam.data.fov = Base.default_fov;
Context.raw.cam_handle.position = 0;
2024-01-29 09:37:53 +01:00
cam.data.ortho = null;
2024-02-10 19:26:53 +01:00
camera_object_build_proj(cam);
2023-02-27 21:13:25 +01:00
Context.raw.ddirty = 2;
2024-01-21 15:18:44 +01:00
Camera.reset();
2024-03-07 20:37:30 +01:00
transform_reset(Context.main_object().base.transform);
2023-02-08 14:40:15 +01:00
break;
}
}
}
2024-03-07 20:37:30 +01:00
static set_view = (x: f32, y: f32, z: f32, rx: f32, ry: f32, rz: f32) => {
quat_set(Context.raw.paint_object.base.transform.rot, 0, 0, 0, 1);
Context.raw.paint_object.base.transform.dirty = true;
let cam: camera_object_t = scene_camera;
let dist: f32 = vec4_len(cam.base.transform.loc);
2024-02-05 20:57:20 +01:00
vec4_set(cam.base.transform.loc, x * dist, y * dist, z * dist);
quat_from_euler(cam.base.transform.rot, rx, ry, rz);
transform_build_matrix(cam.base.transform);
2024-02-10 19:26:53 +01:00
camera_object_build_proj(cam);
2023-02-27 21:13:25 +01:00
Context.raw.ddirty = 2;
2024-03-07 20:37:30 +01:00
Camera.reset(Context.raw.view_index_last);
2023-02-08 14:40:15 +01:00
}
2024-01-17 18:53:31 +01:00
static orbit = (x: f32, y: f32) => {
2024-03-07 20:37:30 +01:00
let cam: camera_object_t = scene_camera;
let dist: f32 = Camera.distance();
2024-02-06 19:32:21 +01:00
transform_move(cam.base.transform, camera_object_look_world(cam), dist);
2024-02-05 20:57:20 +01:00
transform_rotate(cam.base.transform, vec4_create(0, 0, 1), x);
2024-02-06 19:32:21 +01:00
transform_rotate(cam.base.transform, camera_object_right_world(cam), y);
transform_move(cam.base.transform, camera_object_look_world(cam), -dist);
2023-02-27 21:13:25 +01:00
Context.raw.ddirty = 2;
2023-02-08 14:40:15 +01:00
}
2024-03-07 20:37:30 +01:00
static orbit_opposite = () => {
let cam: camera_object_t = scene_camera;
let z: f32 = Math.abs(camera_object_look(cam).z) - 1.0;
2024-01-17 18:53:31 +01:00
(z < 0.0001 && z > -0.0001) ? Viewport.orbit(0, Math.PI) : Viewport.orbit(Math.PI, 0);
2023-02-08 14:40:15 +01:00
}
2024-01-17 18:53:31 +01:00
static zoom = (f: f32) => {
2024-03-07 20:37:30 +01:00
let cam: camera_object_t = scene_camera;
2024-02-06 19:32:21 +01:00
transform_move(cam.base.transform, camera_object_look(cam), f);
2023-02-27 21:13:25 +01:00
Context.raw.ddirty = 2;
2023-02-08 14:40:15 +01:00
}
2024-03-07 20:37:30 +01:00
static update_camera_type = (cameraType: i32) => {
let cam: camera_object_t = scene_cameras[0];
let light: light_object_t = scene_lights[0];
if (cameraType == camera_type_t.PERSPECTIVE) {
2024-01-29 09:37:53 +01:00
cam.data.ortho = null;
2024-01-31 15:12:28 +01:00
light.base.visible = true;
2023-02-08 14:40:15 +01:00
}
else {
2024-03-07 20:37:30 +01:00
let f32a: Float32Array = new Float32Array(4);
let f: f32 = cam.data.fov * vec4_len(mat4_get_loc(cam.base.transform.world)) / 2.5;
2024-01-17 18:53:31 +01:00
f32a[0] = -2 * f;
f32a[1] = 2 * f;
2024-02-06 19:32:21 +01:00
f32a[2] = -2 * f * (app_h() / app_w());
f32a[3] = 2 * f * (app_h() / app_w());
2024-01-29 09:37:53 +01:00
cam.data.ortho = f32a;
2024-01-31 15:12:28 +01:00
light.base.visible = false;
2023-02-08 14:40:15 +01:00
}
2024-02-10 19:26:53 +01:00
camera_object_build_proj(cam);
2023-02-27 21:13:25 +01:00
Context.raw.ddirty = 2;
2023-02-08 14:40:15 +01:00
}
}