mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-08 06:48:09 +02:00
More gradual improvements to heightfield voxelization.
This commit is contained in:
parent
ef0a400dcb
commit
27d9de0cba
2 changed files with 39 additions and 5 deletions
|
@ -2486,8 +2486,39 @@ bool Heightfield::intersects(const glm::vec3& start, const glm::vec3& end, float
|
||||||
if (!getBounds().findRayIntersection(start, direction, rayDistance) || rayDistance > 1.0f) {
|
if (!getBounds().findRayIntersection(start, direction, rayDistance) || rayDistance > 1.0f) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
glm::vec3 entry = (start + direction * rayDistance - getBounds().minimum) / _increment;
|
glm::vec3 entry = start + direction * rayDistance;
|
||||||
direction /= _increment;
|
const float DISTANCE_THRESHOLD = 0.001f;
|
||||||
|
if (glm::abs(entry.x - getBounds().minimum.x) < DISTANCE_THRESHOLD) {
|
||||||
|
normal = glm::vec3(-1.0f, 0.0f, 0.0f);
|
||||||
|
distance = rayDistance;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else if (glm::abs(entry.x - getBounds().maximum.x) < DISTANCE_THRESHOLD) {
|
||||||
|
normal = glm::vec3(1.0f, 0.0f, 0.0f);
|
||||||
|
distance = rayDistance;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else if (glm::abs(entry.y - getBounds().minimum.y) < DISTANCE_THRESHOLD) {
|
||||||
|
normal = glm::vec3(0.0f, -1.0f, 0.0f);
|
||||||
|
distance = rayDistance;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else if (glm::abs(entry.y - getBounds().maximum.y) < DISTANCE_THRESHOLD) {
|
||||||
|
normal = glm::vec3(0.0f, 1.0f, 0.0f);
|
||||||
|
distance = rayDistance;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else if (glm::abs(entry.z - getBounds().minimum.z) < DISTANCE_THRESHOLD) {
|
||||||
|
normal = glm::vec3(0.0f, 0.0f, -1.0f);
|
||||||
|
distance = rayDistance;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else if (glm::abs(entry.z - getBounds().maximum.z) < DISTANCE_THRESHOLD) {
|
||||||
|
normal = glm::vec3(0.0f, 0.0f, 1.0f);
|
||||||
|
distance = rayDistance;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
entry = (entry - getBounds().minimum) / _increment;
|
||||||
glm::vec3 floors = glm::floor(entry);
|
glm::vec3 floors = glm::floor(entry);
|
||||||
glm::vec3 ceils = glm::ceil(entry);
|
glm::vec3 ceils = glm::ceil(entry);
|
||||||
if (floors.x == ceils.x) {
|
if (floors.x == ceils.x) {
|
||||||
|
|
|
@ -998,10 +998,13 @@ int HeightfieldClearFetchVisitor::visit(MetavoxelInfo& info) {
|
||||||
_spannerBounds.maximum = (glm::ceil(_bounds.maximum / increment) + glm::vec3(1.0f, 0.0f, 1.0f)) * increment;
|
_spannerBounds.maximum = (glm::ceil(_bounds.maximum / increment) + glm::vec3(1.0f, 0.0f, 1.0f)) * increment;
|
||||||
_spannerBounds.minimum.y = bounds.minimum.y;
|
_spannerBounds.minimum.y = bounds.minimum.y;
|
||||||
_spannerBounds.maximum.y = bounds.maximum.y;
|
_spannerBounds.maximum.y = bounds.maximum.y;
|
||||||
_heightfieldWidth = (int)glm::round((_spannerBounds.maximum.x - _spannerBounds.minimum.x) / increment) + 1;
|
_heightfieldWidth = (int)glm::round((_spannerBounds.maximum.x - _spannerBounds.minimum.x) / increment);
|
||||||
_heightfieldHeight = (int)glm::round((_spannerBounds.maximum.z - _spannerBounds.minimum.z) / increment) + 1;
|
_heightfieldHeight = (int)glm::round((_spannerBounds.maximum.z - _spannerBounds.minimum.z) / increment);
|
||||||
int heightfieldArea = _heightfieldWidth * _heightfieldHeight;
|
int heightfieldArea = _heightfieldWidth * _heightfieldHeight;
|
||||||
_spanner = spanner = new Heightfield(_spannerBounds, increment, QByteArray(heightfieldArea, 0),
|
Box innerBounds = _spannerBounds;
|
||||||
|
innerBounds.maximum.x -= increment;
|
||||||
|
innerBounds.maximum.z -= increment;
|
||||||
|
_spanner = spanner = new Heightfield(innerBounds, increment, QByteArray(heightfieldArea, 0),
|
||||||
QByteArray(heightfieldArea * DataBlock::COLOR_BYTES, 0), QByteArray(heightfieldArea, 0),
|
QByteArray(heightfieldArea * DataBlock::COLOR_BYTES, 0), QByteArray(heightfieldArea, 0),
|
||||||
QVector<SharedObjectPointer>());
|
QVector<SharedObjectPointer>());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue