mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 14:59:14 +02:00
move origin to center of domain
This commit is contained in:
parent
6ce4820b9f
commit
4fe8f49d4c
13 changed files with 40 additions and 17 deletions
|
@ -1020,8 +1020,12 @@ function getPositionToCreateEntity() {
|
||||||
|
|
||||||
var cameraPosition = Camera.position;
|
var cameraPosition = Camera.position;
|
||||||
|
|
||||||
var cameraOutOfBounds = cameraPosition.x < 0 || cameraPosition.y < 0 || cameraPosition.z < 0;
|
var HALF_TREE_SCALE = 16384 / 2;
|
||||||
var placementOutOfBounds = placementPosition.x < 0 || placementPosition.y < 0 || placementPosition.z < 0;
|
|
||||||
|
var cameraOutOfBounds = cameraPosition.x < -HALF_TREE_SCALE || cameraPosition.y < -HALF_TREE_SCALE ||
|
||||||
|
cameraPosition.z < -HALF_TREE_SCALE;
|
||||||
|
var placementOutOfBounds = placementPosition.x < -HALF_TREE_SCALE || placementPosition.y < -HALF_TREE_SCALE ||
|
||||||
|
placementPosition.z < -HALF_TREE_SCALE;
|
||||||
|
|
||||||
if (cameraOutOfBounds && placementOutOfBounds) {
|
if (cameraOutOfBounds && placementOutOfBounds) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -43,6 +43,8 @@ void renderWorldBox(gpu::Batch& batch) {
|
||||||
|
|
||||||
auto transform = Transform{};
|
auto transform = Transform{};
|
||||||
batch.setModelTransform(transform);
|
batch.setModelTransform(transform);
|
||||||
|
|
||||||
|
// FIXME - new origin tweaks need to be done to this
|
||||||
geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(TREE_SCALE, 0.0f, 0.0f), red);
|
geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(TREE_SCALE, 0.0f, 0.0f), red);
|
||||||
geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, TREE_SCALE, 0.0f), green);
|
geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, TREE_SCALE, 0.0f), green);
|
||||||
geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, TREE_SCALE), blue);
|
geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, TREE_SCALE), blue);
|
||||||
|
|
|
@ -25,6 +25,8 @@ AddEntityOperator::AddEntityOperator(EntityTree* tree,
|
||||||
{
|
{
|
||||||
// caller must have verified existence of newEntity
|
// caller must have verified existence of newEntity
|
||||||
assert(_newEntity);
|
assert(_newEntity);
|
||||||
|
|
||||||
|
// FIXME - how does this change for new origin???
|
||||||
_newEntityBox = _newEntity->getMaximumAACube().clamp(0.0f, (float)TREE_SCALE);
|
_newEntityBox = _newEntity->getMaximumAACube().clamp(0.0f, (float)TREE_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -634,7 +634,11 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
||||||
// but since we're using macros below we have to temporarily modify overwriteLocalData.
|
// but since we're using macros below we have to temporarily modify overwriteLocalData.
|
||||||
bool oldOverwrite = overwriteLocalData;
|
bool oldOverwrite = overwriteLocalData;
|
||||||
overwriteLocalData = overwriteLocalData && !weOwnSimulation;
|
overwriteLocalData = overwriteLocalData && !weOwnSimulation;
|
||||||
|
if (args.bitstreamVersion >= VERSION_ENTITIES_CENTER_ORIGIN) {
|
||||||
READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, updatePosition);
|
READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, updatePosition);
|
||||||
|
} else {
|
||||||
|
READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, updatePositionOldOrigin);
|
||||||
|
}
|
||||||
READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, updateRotation);
|
READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, updateRotation);
|
||||||
READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, updateVelocity);
|
READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, updateVelocity);
|
||||||
READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, updateAngularVelocity);
|
READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, updateAngularVelocity);
|
||||||
|
@ -656,7 +660,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
||||||
} else {
|
} else {
|
||||||
// legacy order of packing here
|
// legacy order of packing here
|
||||||
// TODO: purge this logic in a few months from now (2015.07)
|
// TODO: purge this logic in a few months from now (2015.07)
|
||||||
READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, updatePosition);
|
READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, updatePositionOldOrigin);
|
||||||
READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, updateDimensions);
|
READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, updateDimensions);
|
||||||
READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, updateRotation);
|
READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, updateRotation);
|
||||||
READ_ENTITY_PROPERTY(PROP_DENSITY, float, updateDensity);
|
READ_ENTITY_PROPERTY(PROP_DENSITY, float, updateDensity);
|
||||||
|
@ -1307,6 +1311,11 @@ void EntityItem::updatePosition(const glm::vec3& value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EntityItem::updatePositionOldOrigin(const glm::vec3& value) {
|
||||||
|
glm::vec3 newValue = value - glm::vec3(HALF_TREE_SCALE);
|
||||||
|
updatePosition(newValue);
|
||||||
|
}
|
||||||
|
|
||||||
void EntityItem::updateDimensions(const glm::vec3& value) {
|
void EntityItem::updateDimensions(const glm::vec3& value) {
|
||||||
auto delta = glm::distance(getDimensions(), value);
|
auto delta = glm::distance(getDimensions(), value);
|
||||||
if (delta > IGNORE_DIMENSIONS_DELTA) {
|
if (delta > IGNORE_DIMENSIONS_DELTA) {
|
||||||
|
|
|
@ -361,6 +361,7 @@ public:
|
||||||
|
|
||||||
// updateFoo() methods to be used when changes need to be accumulated in the _dirtyFlags
|
// updateFoo() methods to be used when changes need to be accumulated in the _dirtyFlags
|
||||||
void updatePosition(const glm::vec3& value);
|
void updatePosition(const glm::vec3& value);
|
||||||
|
void updatePositionOldOrigin(const glm::vec3& value);
|
||||||
void updateDimensions(const glm::vec3& value);
|
void updateDimensions(const glm::vec3& value);
|
||||||
void updateRotation(const glm::quat& rotation);
|
void updateRotation(const glm::quat& rotation);
|
||||||
void updateDensity(float value);
|
void updateDensity(float value);
|
||||||
|
|
|
@ -253,7 +253,7 @@ void EntityItemPropertiesFromScriptValueHonorReadOnly(const QScriptValue &object
|
||||||
|
|
||||||
// define these inline here so the macros work
|
// define these inline here so the macros work
|
||||||
inline void EntityItemProperties::setPosition(const glm::vec3& value)
|
inline void EntityItemProperties::setPosition(const glm::vec3& value)
|
||||||
{ _position = glm::clamp(value, 0.0f, (float)TREE_SCALE); _positionChanged = true; }
|
{ _position = glm::clamp(value, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; }
|
||||||
|
|
||||||
inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) {
|
inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) {
|
||||||
debug << "EntityItemProperties[" << "\n";
|
debug << "EntityItemProperties[" << "\n";
|
||||||
|
|
|
@ -113,7 +113,8 @@ void EntitySimulation::sortEntitiesThatMoved() {
|
||||||
// External changes to entity position/shape are expected to be sorted outside of the EntitySimulation.
|
// External changes to entity position/shape are expected to be sorted outside of the EntitySimulation.
|
||||||
PerformanceTimer perfTimer("sortingEntities");
|
PerformanceTimer perfTimer("sortingEntities");
|
||||||
MovingEntitiesOperator moveOperator(_entityTree);
|
MovingEntitiesOperator moveOperator(_entityTree);
|
||||||
AACube domainBounds(glm::vec3(0.0f,0.0f,0.0f), (float)TREE_SCALE);
|
AACube domainBounds(glm::vec3((float)-HALF_TREE_SCALE, (float)-HALF_TREE_SCALE, (float)-HALF_TREE_SCALE),
|
||||||
|
(float)TREE_SCALE);
|
||||||
SetOfEntities::iterator itemItr = _entitiesToSort.begin();
|
SetOfEntities::iterator itemItr = _entitiesToSort.begin();
|
||||||
while (itemItr != _entitiesToSort.end()) {
|
while (itemItr != _entitiesToSort.end()) {
|
||||||
EntityItemPointer entity = *itemItr;
|
EntityItemPointer entity = *itemItr;
|
||||||
|
@ -195,7 +196,8 @@ void EntitySimulation::changeEntity(EntityItemPointer entity) {
|
||||||
bool wasRemoved = false;
|
bool wasRemoved = false;
|
||||||
uint32_t dirtyFlags = entity->getDirtyFlags();
|
uint32_t dirtyFlags = entity->getDirtyFlags();
|
||||||
if (dirtyFlags & EntityItem::DIRTY_POSITION) {
|
if (dirtyFlags & EntityItem::DIRTY_POSITION) {
|
||||||
AACube domainBounds(glm::vec3(0.0f,0.0f,0.0f), (float)TREE_SCALE);
|
AACube domainBounds(glm::vec3((float)-HALF_TREE_SCALE, (float)-HALF_TREE_SCALE, (float)-HALF_TREE_SCALE),
|
||||||
|
(float)TREE_SCALE);
|
||||||
AACube newCube = entity->getMaximumAACube();
|
AACube newCube = entity->getMaximumAACube();
|
||||||
if (!domainBounds.touches(newCube)) {
|
if (!domainBounds.touches(newCube)) {
|
||||||
qCDebug(entities) << "Entity " << entity->getEntityItemID() << " moved out of domain bounds.";
|
qCDebug(entities) << "Entity " << entity->getEntityItemID() << " moved out of domain bounds.";
|
||||||
|
|
|
@ -444,14 +444,14 @@ bool EntityTreeElement::bestFitBounds(const AABox& bounds) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EntityTreeElement::containsBounds(const glm::vec3& minPoint, const glm::vec3& maxPoint) const {
|
bool EntityTreeElement::containsBounds(const glm::vec3& minPoint, const glm::vec3& maxPoint) const {
|
||||||
glm::vec3 clampedMin = glm::clamp(minPoint, 0.0f, (float)TREE_SCALE);
|
glm::vec3 clampedMin = glm::clamp(minPoint, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE);
|
||||||
glm::vec3 clampedMax = glm::clamp(maxPoint, 0.0f, (float)TREE_SCALE);
|
glm::vec3 clampedMax = glm::clamp(maxPoint, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE);
|
||||||
return _cube.contains(clampedMin) && _cube.contains(clampedMax);
|
return _cube.contains(clampedMin) && _cube.contains(clampedMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EntityTreeElement::bestFitBounds(const glm::vec3& minPoint, const glm::vec3& maxPoint) const {
|
bool EntityTreeElement::bestFitBounds(const glm::vec3& minPoint, const glm::vec3& maxPoint) const {
|
||||||
glm::vec3 clampedMin = glm::clamp(minPoint, 0.0f, (float)TREE_SCALE);
|
glm::vec3 clampedMin = glm::clamp(minPoint, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE);
|
||||||
glm::vec3 clampedMax = glm::clamp(maxPoint, 0.0f, (float)TREE_SCALE);
|
glm::vec3 clampedMax = glm::clamp(maxPoint, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE);
|
||||||
|
|
||||||
if (_cube.contains(clampedMin) && _cube.contains(clampedMax)) {
|
if (_cube.contains(clampedMin) && _cube.contains(clampedMax)) {
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ MovingEntitiesOperator::~MovingEntitiesOperator() {
|
||||||
|
|
||||||
void MovingEntitiesOperator::addEntityToMoveList(EntityItemPointer entity, const AACube& newCube) {
|
void MovingEntitiesOperator::addEntityToMoveList(EntityItemPointer entity, const AACube& newCube) {
|
||||||
EntityTreeElement* oldContainingElement = _tree->getContainingElement(entity->getEntityItemID());
|
EntityTreeElement* oldContainingElement = _tree->getContainingElement(entity->getEntityItemID());
|
||||||
AABox newCubeClamped = newCube.clamp(0.0f, (float)TREE_SCALE);
|
AABox newCubeClamped = newCube.clamp((float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE);
|
||||||
|
|
||||||
if (_wantDebug) {
|
if (_wantDebug) {
|
||||||
qCDebug(entities) << "MovingEntitiesOperator::addEntityToMoveList() -----------------------------";
|
qCDebug(entities) << "MovingEntitiesOperator::addEntityToMoveList() -----------------------------";
|
||||||
|
|
|
@ -47,7 +47,7 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree,
|
||||||
// which can handle all potential rotations?
|
// which can handle all potential rotations?
|
||||||
// the getMaximumAACube is the relaxed form.
|
// the getMaximumAACube is the relaxed form.
|
||||||
_oldEntityCube = _existingEntity->getMaximumAACube();
|
_oldEntityCube = _existingEntity->getMaximumAACube();
|
||||||
_oldEntityBox = _oldEntityCube.clamp(0.0f, (float)TREE_SCALE); // clamp to domain bounds
|
_oldEntityBox = _oldEntityCube.clamp((float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); // clamp to domain bounds
|
||||||
|
|
||||||
// If the old properties doesn't contain the properties required to calculate a bounding box,
|
// If the old properties doesn't contain the properties required to calculate a bounding box,
|
||||||
// get them from the existing entity. Registration point is required to correctly calculate
|
// get them from the existing entity. Registration point is required to correctly calculate
|
||||||
|
@ -123,7 +123,7 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_newEntityBox = _newEntityCube.clamp(0.0f, (float)TREE_SCALE); // clamp to domain bounds
|
_newEntityBox = _newEntityCube.clamp((float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); // clamp to domain bounds
|
||||||
|
|
||||||
|
|
||||||
if (_wantDebug) {
|
if (_wantDebug) {
|
||||||
|
|
|
@ -142,5 +142,6 @@ const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE
|
||||||
const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35;
|
const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35;
|
||||||
const PacketVersion VERSION_POLYVOX_TEXTURES = 36;
|
const PacketVersion VERSION_POLYVOX_TEXTURES = 36;
|
||||||
const PacketVersion VERSION_ENTITIES_POLYLINE = 37;
|
const PacketVersion VERSION_ENTITIES_POLYLINE = 37;
|
||||||
|
const PacketVersion VERSION_ENTITIES_CENTER_ORIGIN = 38;
|
||||||
|
|
||||||
#endif // hifi_PacketHeaders_h
|
#endif // hifi_PacketHeaders_h
|
|
@ -18,6 +18,7 @@
|
||||||
const quint64 CHANGE_FUDGE = 1000 * 200; // useconds of fudge in determining if we want to resend changed voxels
|
const quint64 CHANGE_FUDGE = 1000 * 200; // useconds of fudge in determining if we want to resend changed voxels
|
||||||
|
|
||||||
const int TREE_SCALE = 16384; // ~10 miles.. This is the number of meters of the 0.0 to 1.0 voxel universe
|
const int TREE_SCALE = 16384; // ~10 miles.. This is the number of meters of the 0.0 to 1.0 voxel universe
|
||||||
|
const int HALF_TREE_SCALE = TREE_SCALE / 2;
|
||||||
|
|
||||||
// This controls the LOD. Larger number will make smaller voxels visible at greater distance.
|
// This controls the LOD. Larger number will make smaller voxels visible at greater distance.
|
||||||
const float DEFAULT_OCTREE_SIZE_SCALE = TREE_SCALE * 400.0f;
|
const float DEFAULT_OCTREE_SIZE_SCALE = TREE_SCALE * 400.0f;
|
||||||
|
|
|
@ -191,6 +191,7 @@ void OctreeElement::calculateAACube() {
|
||||||
// this tells you the "size" of the voxel
|
// this tells you the "size" of the voxel
|
||||||
float voxelScale = (float)TREE_SCALE / powf(2.0f, numberOfThreeBitSectionsInCode(getOctalCode()));
|
float voxelScale = (float)TREE_SCALE / powf(2.0f, numberOfThreeBitSectionsInCode(getOctalCode()));
|
||||||
corner *= (float)TREE_SCALE;
|
corner *= (float)TREE_SCALE;
|
||||||
|
corner -= (float)HALF_TREE_SCALE;
|
||||||
_cube.setBox(corner, voxelScale);
|
_cube.setBox(corner, voxelScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -717,8 +718,8 @@ int OctreeElement::getMyChildContaining(const AACube& cube) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine which of our children the minimum and maximum corners of the cube live in...
|
// Determine which of our children the minimum and maximum corners of the cube live in...
|
||||||
glm::vec3 cubeCornerMinimum = glm::clamp(cube.getCorner(), 0.0f, (float)TREE_SCALE);
|
glm::vec3 cubeCornerMinimum = glm::clamp(cube.getCorner(), (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE);
|
||||||
glm::vec3 cubeCornerMaximum = glm::clamp(cube.calcTopFarLeft(), 0.0f, (float)TREE_SCALE);
|
glm::vec3 cubeCornerMaximum = glm::clamp(cube.calcTopFarLeft(), (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE);
|
||||||
|
|
||||||
if (_cube.contains(cubeCornerMinimum) && _cube.contains(cubeCornerMaximum)) {
|
if (_cube.contains(cubeCornerMinimum) && _cube.contains(cubeCornerMaximum)) {
|
||||||
int childIndexCubeMinimum = getMyChildContainingPoint(cubeCornerMinimum);
|
int childIndexCubeMinimum = getMyChildContainingPoint(cubeCornerMinimum);
|
||||||
|
|
Loading…
Reference in a new issue