mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 16:41:02 +02:00
hacking more on the modelID to element map
This commit is contained in:
parent
3ed0b34b63
commit
2d1d4de174
6 changed files with 57 additions and 3 deletions
|
@ -65,6 +65,18 @@ void ModelServer::modelCreated(const ModelItem& newModel, const SharedNodePointe
|
||||||
memcpy(copyAt, &modelID, sizeof(modelID));
|
memcpy(copyAt, &modelID, sizeof(modelID));
|
||||||
copyAt += sizeof(modelID);
|
copyAt += sizeof(modelID);
|
||||||
packetLength += sizeof(modelID);
|
packetLength += sizeof(modelID);
|
||||||
|
|
||||||
|
// This would be a good place to fix our modelID to element map
|
||||||
|
ModelTree* tree = static_cast<ModelTree*>(_tree);
|
||||||
|
|
||||||
|
// find and clear the map element with the creatorToken
|
||||||
|
ModelItemID creatorTokenModelItemID(modelID, creatorTokenID, true);
|
||||||
|
ModelTreeElement* element = tree->getContainingElement(creatorTokenModelItemID);
|
||||||
|
tree->setContainingElement(creatorTokenModelItemID, NULL);
|
||||||
|
|
||||||
|
// find and clear the map element with the creatorToken
|
||||||
|
ModelItemID justModelID(modelID);
|
||||||
|
tree->setContainingElement(justModelID, element);
|
||||||
|
|
||||||
NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, senderNode);
|
NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, senderNode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -771,6 +771,11 @@ int ModelItem::readModelDataFromBuffer(const unsigned char* data, int bytesLeftT
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelItem ModelItem::fromEditPacket(const unsigned char* data, int length, int& processedBytes, ModelTree* tree, bool& valid) {
|
ModelItem ModelItem::fromEditPacket(const unsigned char* data, int length, int& processedBytes, ModelTree* tree, bool& valid) {
|
||||||
|
bool wantDebug = false;
|
||||||
|
if (wantDebug) {
|
||||||
|
qDebug() << "ModelItem ModelItem::fromEditPacket() length=" << length;
|
||||||
|
}
|
||||||
|
|
||||||
ModelItem newModelItem; // id and _lastUpdated will get set here...
|
ModelItem newModelItem; // id and _lastUpdated will get set here...
|
||||||
const unsigned char* dataAt = data;
|
const unsigned char* dataAt = data;
|
||||||
processedBytes = 0;
|
processedBytes = 0;
|
||||||
|
@ -779,6 +784,10 @@ ModelItem ModelItem::fromEditPacket(const unsigned char* data, int length, int&
|
||||||
int octets = numberOfThreeBitSectionsInCode(data);
|
int octets = numberOfThreeBitSectionsInCode(data);
|
||||||
int lengthOfOctcode = bytesRequiredForCodeLength(octets);
|
int lengthOfOctcode = bytesRequiredForCodeLength(octets);
|
||||||
|
|
||||||
|
if (wantDebug) {
|
||||||
|
qDebug() << "ModelItem ModelItem::fromEditPacket() lengthOfOctcode=" << lengthOfOctcode;
|
||||||
|
}
|
||||||
|
|
||||||
// we don't actually do anything with this octcode...
|
// we don't actually do anything with this octcode...
|
||||||
dataAt += lengthOfOctcode;
|
dataAt += lengthOfOctcode;
|
||||||
processedBytes += lengthOfOctcode;
|
processedBytes += lengthOfOctcode;
|
||||||
|
@ -789,6 +798,10 @@ ModelItem ModelItem::fromEditPacket(const unsigned char* data, int length, int&
|
||||||
dataAt += sizeof(editID);
|
dataAt += sizeof(editID);
|
||||||
processedBytes += sizeof(editID);
|
processedBytes += sizeof(editID);
|
||||||
|
|
||||||
|
if (wantDebug) {
|
||||||
|
qDebug() << "ModelItem ModelItem::fromEditPacket() editID=" << editID;
|
||||||
|
}
|
||||||
|
|
||||||
bool isNewModelItem = (editID == NEW_MODEL);
|
bool isNewModelItem = (editID == NEW_MODEL);
|
||||||
|
|
||||||
// special case for handling "new" modelItems
|
// special case for handling "new" modelItems
|
||||||
|
@ -811,7 +824,7 @@ ModelItem ModelItem::fromEditPacket(const unsigned char* data, int length, int&
|
||||||
newModelItem = *existingModelItem;
|
newModelItem = *existingModelItem;
|
||||||
} else {
|
} else {
|
||||||
// the user attempted to edit a modelItem that doesn't exist
|
// the user attempted to edit a modelItem that doesn't exist
|
||||||
qDebug() << "user attempted to edit a modelItem that doesn't exist...";
|
qDebug() << "user attempted to edit a modelItem that doesn't exist... editID=" << editID;
|
||||||
valid = false;
|
valid = false;
|
||||||
return newModelItem;
|
return newModelItem;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,11 @@ ModelTreeElement* ModelTree::createNewElement(unsigned char * octalCode) {
|
||||||
return newElement;
|
return newElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelTree::eraseAllOctreeElements() {
|
||||||
|
_modelToElementMap.clear();
|
||||||
|
Octree::eraseAllOctreeElements();
|
||||||
|
}
|
||||||
|
|
||||||
bool ModelTree::handlesEditPacketType(PacketType packetType) const {
|
bool ModelTree::handlesEditPacketType(PacketType packetType) const {
|
||||||
// we handle these types of "edit" packets
|
// we handle these types of "edit" packets
|
||||||
switch (packetType) {
|
switch (packetType) {
|
||||||
|
@ -171,6 +176,13 @@ bool StoreModelOperator::PreRecursion(OctreeElement* element) {
|
||||||
// correct element.
|
// correct element.
|
||||||
if (!_containingElement->bestFitModelBounds(_newModel)) {
|
if (!_containingElement->bestFitModelBounds(_newModel)) {
|
||||||
modelTreeElement->removeModelWithModelItemID(_newModel.getModelItemID());
|
modelTreeElement->removeModelWithModelItemID(_newModel.getModelItemID());
|
||||||
|
|
||||||
|
// If we haven't yet found the new location, then we need to
|
||||||
|
// make sure to remove our model to element map, because for
|
||||||
|
// now we're not in that map
|
||||||
|
if (!_foundNew) {
|
||||||
|
_tree->setContainingElement(_newModel.getModelItemID(), NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_foundOld = true;
|
_foundOld = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -494,6 +506,15 @@ void ModelTree::findModels(const AACube& cube, QVector<ModelItem*> foundModels)
|
||||||
|
|
||||||
const ModelItem* ModelTree::findModelByID(uint32_t id, bool alreadyLocked) const {
|
const ModelItem* ModelTree::findModelByID(uint32_t id, bool alreadyLocked) const {
|
||||||
ModelItemID modelID(id);
|
ModelItemID modelID(id);
|
||||||
|
|
||||||
|
bool wantDebug = false;
|
||||||
|
if (wantDebug) {
|
||||||
|
qDebug() << "ModelTree::findModelByID()...";
|
||||||
|
qDebug() << " id=" << id;
|
||||||
|
qDebug() << " modelID=" << modelID;
|
||||||
|
qDebug() << "_modelToElementMap=" << _modelToElementMap;
|
||||||
|
}
|
||||||
|
|
||||||
return findModelByModelItemID(modelID);
|
return findModelByModelItemID(modelID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -793,7 +814,11 @@ ModelTreeElement* ModelTree::getContainingElement(const ModelItemID& modelItemID
|
||||||
|
|
||||||
void ModelTree::setContainingElement(const ModelItemID& modelItemID, ModelTreeElement* element) {
|
void ModelTree::setContainingElement(const ModelItemID& modelItemID, ModelTreeElement* element) {
|
||||||
// TODO: do we need to make this thread safe? Or is it acceptable as is
|
// TODO: do we need to make this thread safe? Or is it acceptable as is
|
||||||
_modelToElementMap[modelItemID] = element;
|
if (element) {
|
||||||
|
_modelToElementMap[modelItemID] = element;
|
||||||
|
} else {
|
||||||
|
_modelToElementMap.remove(modelItemID);
|
||||||
|
}
|
||||||
|
|
||||||
//qDebug() << "setContainingElement() modelItemID=" << modelItemID << "element=" << element;
|
//qDebug() << "setContainingElement() modelItemID=" << modelItemID << "element=" << element;
|
||||||
//qDebug() << "AFTER _modelToElementMap=" << _modelToElementMap;
|
//qDebug() << "AFTER _modelToElementMap=" << _modelToElementMap;
|
||||||
|
|
|
@ -36,6 +36,7 @@ public:
|
||||||
/// Type safe version of getRoot()
|
/// Type safe version of getRoot()
|
||||||
ModelTreeElement* getRoot() { return static_cast<ModelTreeElement*>(_rootElement); }
|
ModelTreeElement* getRoot() { return static_cast<ModelTreeElement*>(_rootElement); }
|
||||||
|
|
||||||
|
virtual void eraseAllOctreeElements();
|
||||||
|
|
||||||
// These methods will allow the OctreeServer to send your tree inbound edit packets of your
|
// These methods will allow the OctreeServer to send your tree inbound edit packets of your
|
||||||
// own definition. Implement these to allow your octree based server to support editing
|
// own definition. Implement these to allow your octree based server to support editing
|
||||||
|
|
|
@ -22,6 +22,7 @@ ModelTreeElement::ModelTreeElement(unsigned char* octalCode) : OctreeElement(),
|
||||||
};
|
};
|
||||||
|
|
||||||
ModelTreeElement::~ModelTreeElement() {
|
ModelTreeElement::~ModelTreeElement() {
|
||||||
|
//qDebug() << "ModelTreeElement::~ModelTreeElement() this=" << this;
|
||||||
_voxelMemoryUsage -= sizeof(ModelTreeElement);
|
_voxelMemoryUsage -= sizeof(ModelTreeElement);
|
||||||
delete _modelItems;
|
delete _modelItems;
|
||||||
_modelItems = NULL;
|
_modelItems = NULL;
|
||||||
|
@ -226,6 +227,7 @@ void ModelTreeElement::update(ModelTreeUpdateArgs& args) {
|
||||||
markWithChangedTime();
|
markWithChangedTime();
|
||||||
|
|
||||||
// TODO: is this a good place to change the containing element map???
|
// TODO: is this a good place to change the containing element map???
|
||||||
|
qDebug() << "ModelTreeElement::update()... calling _myTree->setContainingElement(model.getModelItemID(), NULL); ********";
|
||||||
_myTree->setContainingElement(model.getModelItemID(), NULL);
|
_myTree->setContainingElement(model.getModelItemID(), NULL);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -526,6 +528,7 @@ bool ModelTreeElement::removeModelWithID(uint32_t id) {
|
||||||
if ((*_modelItems)[i].getID() == id) {
|
if ((*_modelItems)[i].getID() == id) {
|
||||||
foundModel = true;
|
foundModel = true;
|
||||||
_modelItems->removeAt(i);
|
_modelItems->removeAt(i);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -222,7 +222,7 @@ public:
|
||||||
|
|
||||||
OctreeElement* getRoot() { return _rootElement; }
|
OctreeElement* getRoot() { return _rootElement; }
|
||||||
|
|
||||||
void eraseAllOctreeElements();
|
virtual void eraseAllOctreeElements();
|
||||||
|
|
||||||
void processRemoveOctreeElementsBitstream(const unsigned char* bitstream, int bufferSizeBytes);
|
void processRemoveOctreeElementsBitstream(const unsigned char* bitstream, int bufferSizeBytes);
|
||||||
void readBitstreamToTree(const unsigned char* bitstream, unsigned long int bufferSizeBytes, ReadBitstreamToTreeParams& args);
|
void readBitstreamToTree(const unsigned char* bitstream, unsigned long int bufferSizeBytes, ReadBitstreamToTreeParams& args);
|
||||||
|
|
Loading…
Reference in a new issue