mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 03:37:49 +02:00
optimized OctreeElement::furthestDistanceToCamera()
This commit is contained in:
parent
252bc3b3ee
commit
f3bd8925d9
3 changed files with 40 additions and 8 deletions
|
@ -1219,14 +1219,13 @@ bool OctreeElement::calculateShouldRender(const ViewFrustum* viewFrustum, float
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculates the distance to the furthest point of the voxel to the camera
|
// Calculates the distance to the furthest point of the voxel to the camera
|
||||||
|
// does as much math as possible in voxel scale and then scales up to TREE_SCALE at end
|
||||||
float OctreeElement::furthestDistanceToCamera(const ViewFrustum& viewFrustum) const {
|
float OctreeElement::furthestDistanceToCamera(const ViewFrustum& viewFrustum) const {
|
||||||
AABox box = getAABox();
|
|
||||||
box.scale(TREE_SCALE);
|
|
||||||
glm::vec3 furthestPoint;
|
glm::vec3 furthestPoint;
|
||||||
viewFrustum.getFurthestPointFromCamera(box, furthestPoint);
|
viewFrustum.getFurthestPointFromCameraVoxelScale(getAABox(), furthestPoint);
|
||||||
glm::vec3 temp = viewFrustum.getPosition() - furthestPoint;
|
glm::vec3 temp = viewFrustum.getPositionVoxelScale() - furthestPoint;
|
||||||
float distanceToFurthestPoint = sqrtf(glm::dot(temp, temp));
|
float distanceToFurthestPoint = sqrtf(glm::dot(temp, temp));
|
||||||
return distanceToFurthestPoint;
|
return distanceToFurthestPoint * (float)TREE_SCALE;
|
||||||
}
|
}
|
||||||
|
|
||||||
float OctreeElement::distanceToCamera(const ViewFrustum& viewFrustum) const {
|
float OctreeElement::distanceToCamera(const ViewFrustum& viewFrustum) const {
|
||||||
|
|
|
@ -25,6 +25,7 @@ using namespace std;
|
||||||
|
|
||||||
ViewFrustum::ViewFrustum() :
|
ViewFrustum::ViewFrustum() :
|
||||||
_position(0,0,0),
|
_position(0,0,0),
|
||||||
|
_positionVoxelScale(0,0,0),
|
||||||
_orientation(),
|
_orientation(),
|
||||||
_direction(IDENTITY_FRONT),
|
_direction(IDENTITY_FRONT),
|
||||||
_up(IDENTITY_UP),
|
_up(IDENTITY_UP),
|
||||||
|
@ -724,3 +725,31 @@ void ViewFrustum::getFurthestPointFromCamera(const AABox& box, glm::vec3& furthe
|
||||||
furthestPoint.z = bottomNearRight.z;
|
furthestPoint.z = bottomNearRight.z;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ViewFrustum::getFurthestPointFromCameraVoxelScale(const AABox& box, glm::vec3& furthestPoint) const {
|
||||||
|
const glm::vec3& bottomNearRight = box.getCorner();
|
||||||
|
float scale = box.getScale();
|
||||||
|
float halfScale = scale * 0.5f;
|
||||||
|
|
||||||
|
if (_positionVoxelScale.x < bottomNearRight.x + halfScale) {
|
||||||
|
// we are to the right of the center, so the left edge is furthest
|
||||||
|
furthestPoint.x = bottomNearRight.x + scale;
|
||||||
|
} else {
|
||||||
|
furthestPoint.x = bottomNearRight.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_positionVoxelScale.y < bottomNearRight.y + halfScale) {
|
||||||
|
// we are below of the center, so the top edge is furthest
|
||||||
|
furthestPoint.y = bottomNearRight.y + scale;
|
||||||
|
} else {
|
||||||
|
furthestPoint.y = bottomNearRight.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_positionVoxelScale.z < bottomNearRight.z + halfScale) {
|
||||||
|
// we are to the near side of the center, so the far side edge is furthest
|
||||||
|
furthestPoint.z = bottomNearRight.z + scale;
|
||||||
|
} else {
|
||||||
|
furthestPoint.z = bottomNearRight.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,12 @@ const float DEFAULT_FAR_CLIP = 50.0f * TREE_SCALE;
|
||||||
class ViewFrustum {
|
class ViewFrustum {
|
||||||
public:
|
public:
|
||||||
// setters for camera attributes
|
// setters for camera attributes
|
||||||
void setPosition(const glm::vec3& p) { _position = p; }
|
void setPosition(const glm::vec3& p) { _position = p; _positionVoxelScale = (p / (float)TREE_SCALE); }
|
||||||
void setOrientation(const glm::quat& orientationAsQuaternion);
|
void setOrientation(const glm::quat& orientationAsQuaternion);
|
||||||
|
|
||||||
// getters for camera attributes
|
// getters for camera attributes
|
||||||
const glm::vec3& getPosition() const { return _position; }
|
const glm::vec3& getPosition() const { return _position; }
|
||||||
|
const glm::vec3& getPositionVoxelScale() const { return _positionVoxelScale; }
|
||||||
const glm::quat& getOrientation() const { return _orientation; }
|
const glm::quat& getOrientation() const { return _orientation; }
|
||||||
const glm::vec3& getDirection() const { return _direction; }
|
const glm::vec3& getDirection() const { return _direction; }
|
||||||
const glm::vec3& getUp() const { return _up; }
|
const glm::vec3& getUp() const { return _up; }
|
||||||
|
@ -102,9 +103,11 @@ public:
|
||||||
|
|
||||||
glm::vec2 projectPoint(glm::vec3 point, bool& pointInView) const;
|
glm::vec2 projectPoint(glm::vec3 point, bool& pointInView) const;
|
||||||
OctreeProjectedPolygon getProjectedPolygon(const AABox& box) const;
|
OctreeProjectedPolygon getProjectedPolygon(const AABox& box) const;
|
||||||
//glm::vec3 getFurthestPointFromCamera(const AABox& box) const;
|
|
||||||
void getFurthestPointFromCamera(const AABox& box, glm::vec3& furthestPoint) const;
|
void getFurthestPointFromCamera(const AABox& box, glm::vec3& furthestPoint) const;
|
||||||
|
|
||||||
|
// assumes box is in voxel scale, not TREE_SCALE, will scale view frustum's position accordingly
|
||||||
|
void getFurthestPointFromCameraVoxelScale(const AABox& box, glm::vec3& furthestPoint) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Used for keyhole calculations
|
// Used for keyhole calculations
|
||||||
ViewFrustum::location pointInKeyhole(const glm::vec3& point) const;
|
ViewFrustum::location pointInKeyhole(const glm::vec3& point) const;
|
||||||
|
@ -112,7 +115,8 @@ private:
|
||||||
ViewFrustum::location boxInKeyhole(const AABox& box) const;
|
ViewFrustum::location boxInKeyhole(const AABox& box) const;
|
||||||
|
|
||||||
// camera location/orientation attributes
|
// camera location/orientation attributes
|
||||||
glm::vec3 _position;
|
glm::vec3 _position; // the position in TREE_SCALE
|
||||||
|
glm::vec3 _positionVoxelScale; // the position in voxel scale
|
||||||
glm::quat _orientation;
|
glm::quat _orientation;
|
||||||
|
|
||||||
// calculated for orientation
|
// calculated for orientation
|
||||||
|
|
Loading…
Reference in a new issue