summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorreduz <reduzio@gmail.com>2020-12-17 15:56:59 -0300
committerJuan Linietsky <reduzio@gmail.com>2020-12-18 15:48:03 +0100
commitd2302f53d6ad80943e7f4245ac572003f1681d00 (patch)
treef1d46d8194f01e56cd3a4d042b9b33ba728c6f62 /core
parent36b4e035dc7c410c29cda4446f8daa2e00a31da0 (diff)
Implement automatic LOD (Level of Detail)
-Happens on import by default for all models -Just works (tm) -Biasing can be later adjusted per node or per viewport (as well as globally) -Disabled AABB.get_support test because its broken
Diffstat (limited to 'core')
-rw-r--r--core/math/aabb.h6
-rw-r--r--core/math/camera_matrix.cpp11
-rw-r--r--core/math/camera_matrix.h2
3 files changed, 16 insertions, 3 deletions
diff --git a/core/math/aabb.h b/core/math/aabb.h
index 45dcbc7f7f..474304eae2 100644
--- a/core/math/aabb.h
+++ b/core/math/aabb.h
@@ -190,9 +190,9 @@ Vector3 AABB::get_support(const Vector3 &p_normal) const {
Vector3 ofs = position + half_extents;
return Vector3(
- (p_normal.x > 0) ? -half_extents.x : half_extents.x,
- (p_normal.y > 0) ? -half_extents.y : half_extents.y,
- (p_normal.z > 0) ? -half_extents.z : half_extents.z) +
+ (p_normal.x > 0) ? half_extents.x : -half_extents.x,
+ (p_normal.y > 0) ? half_extents.y : -half_extents.y,
+ (p_normal.z > 0) ? half_extents.z : -half_extents.z) +
ofs;
}
diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp
index 5e5efb6356..f29cb7a269 100644
--- a/core/math/camera_matrix.cpp
+++ b/core/math/camera_matrix.cpp
@@ -655,6 +655,17 @@ real_t CameraMatrix::get_fov() const {
}
}
+float CameraMatrix::get_lod_multiplier() const {
+ if (is_orthogonal()) {
+ return get_viewport_half_extents().x;
+ } else {
+ float zn = get_z_near();
+ float width = get_viewport_half_extents().x * 2.0;
+ return 1.0 / (zn / width);
+ }
+
+ //usage is lod_size / (lod_distance * multiplier) < threshold
+}
void CameraMatrix::make_scale(const Vector3 &p_scale) {
set_identity();
matrix[0][0] = p_scale.x;
diff --git a/core/math/camera_matrix.h b/core/math/camera_matrix.h
index c5cdd98377..f856a7b1bf 100644
--- a/core/math/camera_matrix.h
+++ b/core/math/camera_matrix.h
@@ -108,6 +108,8 @@ struct CameraMatrix {
return !(*this == p_cam);
}
+ float get_lod_multiplier() const;
+
CameraMatrix();
CameraMatrix(const Transform &p_transform);
~CameraMatrix();