mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 17:41:12 +02:00
Fix the cleanup of the render::Item::ID in the EntityITem Rendereable wich were often not invalidated after beeing removed from the scene. THis caused a bug with particule system when beeing added /removed / updated quickly
This commit is contained in:
parent
04bd32e008
commit
1c53f9bc87
9 changed files with 18 additions and 7 deletions
|
@ -315,6 +315,7 @@ bool Avatar::addToScene(AvatarSharedPointer self, std::shared_ptr<render::Scene>
|
||||||
|
|
||||||
void Avatar::removeFromScene(AvatarSharedPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
void Avatar::removeFromScene(AvatarSharedPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
||||||
pendingChanges.removeItem(_renderItemID);
|
pendingChanges.removeItem(_renderItemID);
|
||||||
|
render::Item::clearID(_renderItemID);
|
||||||
_skeletonModel.removeFromScene(scene, pendingChanges);
|
_skeletonModel.removeFromScene(scene, pendingChanges);
|
||||||
getHead()->getFaceModel().removeFromScene(scene, pendingChanges);
|
getHead()->getFaceModel().removeFromScene(scene, pendingChanges);
|
||||||
for (auto& attachmentModel : _attachmentModels) {
|
for (auto& attachmentModel : _attachmentModels) {
|
||||||
|
@ -323,7 +324,7 @@ void Avatar::removeFromScene(AvatarSharedPointer self, std::shared_ptr<render::S
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avatar::updateRenderItem(render::PendingChanges& pendingChanges) {
|
void Avatar::updateRenderItem(render::PendingChanges& pendingChanges) {
|
||||||
if (_renderItemID != render::Item::INVALID_ITEM_ID) {
|
if (render::Item::isValidID(_renderItemID)) {
|
||||||
pendingChanges.updateItem<render::Payload<AvatarData>>(_renderItemID, [](render::Payload<AvatarData>& p) {});
|
pendingChanges.updateItem<render::Payload<AvatarData>>(_renderItemID, [](render::Payload<AvatarData>& p) {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,6 +229,6 @@ bool Overlay::addToScene(Overlay::Pointer overlay, std::shared_ptr<render::Scene
|
||||||
|
|
||||||
void Overlay::removeFromScene(Overlay::Pointer overlay, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
void Overlay::removeFromScene(Overlay::Pointer overlay, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
||||||
pendingChanges.removeItem(_renderItemID);
|
pendingChanges.removeItem(_renderItemID);
|
||||||
_renderItemID = render::Item::INVALID_ITEM_ID;
|
render::Item::clearID(_renderItemID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ void Overlays::cleanupOverlaysToDelete() {
|
||||||
Overlay::Pointer overlay = _overlaysToDelete.takeLast();
|
Overlay::Pointer overlay = _overlaysToDelete.takeLast();
|
||||||
|
|
||||||
auto itemID = overlay->getRenderItemID();
|
auto itemID = overlay->getRenderItemID();
|
||||||
if (itemID != render::Item::INVALID_ITEM_ID) {
|
if (render::Item::isValidID(itemID)) {
|
||||||
overlay->removeFromScene(overlay, scene, pendingChanges);
|
overlay->removeFromScene(overlay, scene, pendingChanges);
|
||||||
}
|
}
|
||||||
} while (!_overlaysToDelete.isEmpty());
|
} while (!_overlaysToDelete.isEmpty());
|
||||||
|
|
|
@ -66,10 +66,11 @@ public:
|
||||||
|
|
||||||
void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
||||||
pendingChanges.removeItem(_myItem);
|
pendingChanges.removeItem(_myItem);
|
||||||
|
render::Item::clearID(_myItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
void notifyChanged() {
|
void notifyChanged() {
|
||||||
if (_myItem == render::Item::INVALID_ITEM_ID) {
|
if (!render::Item::isValidID(_myItem)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -251,6 +251,7 @@ bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_p
|
||||||
void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges) {
|
render::PendingChanges& pendingChanges) {
|
||||||
pendingChanges.removeItem(_myMetaItem);
|
pendingChanges.removeItem(_myMetaItem);
|
||||||
|
render::Item::clearID(_myMetaItem);
|
||||||
if (_model) {
|
if (_model) {
|
||||||
_model->removeFromScene(scene, pendingChanges);
|
_model->removeFromScene(scene, pendingChanges);
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,6 +179,7 @@ void RenderableParticleEffectEntityItem::removeFromScene(EntityItemPointer self,
|
||||||
render::PendingChanges& pendingChanges) {
|
render::PendingChanges& pendingChanges) {
|
||||||
pendingChanges.removeItem(_renderItemId);
|
pendingChanges.removeItem(_renderItemId);
|
||||||
_scene = nullptr;
|
_scene = nullptr;
|
||||||
|
render::Item::clearID(_renderItemId);
|
||||||
};
|
};
|
||||||
|
|
||||||
void RenderableParticleEffectEntityItem::update(const quint64& now) {
|
void RenderableParticleEffectEntityItem::update(const quint64& now) {
|
||||||
|
@ -199,7 +200,8 @@ void RenderableParticleEffectEntityItem::update(const quint64& now) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderableParticleEffectEntityItem::updateRenderItem() {
|
void RenderableParticleEffectEntityItem::updateRenderItem() {
|
||||||
if (!_scene) {
|
// this 2 tests are synonyms for this class, but we would like to get rid of the _scene pointer ultimately
|
||||||
|
if (!_scene || !render::Item::isValidID(_renderItemId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!getVisible()) {
|
if (!getVisible()) {
|
||||||
|
@ -312,7 +314,7 @@ void RenderableParticleEffectEntityItem::createPipelines() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderableParticleEffectEntityItem::notifyBoundChanged() {
|
void RenderableParticleEffectEntityItem::notifyBoundChanged() {
|
||||||
if (_renderItemId == render::Item::INVALID_ITEM_ID) {
|
if (!render::Item::isValidID(_renderItemId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
render::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
|
|
|
@ -572,6 +572,7 @@ void RenderablePolyVoxEntityItem::removeFromScene(EntityItemPointer self,
|
||||||
std::shared_ptr<render::Scene> scene,
|
std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges) {
|
render::PendingChanges& pendingChanges) {
|
||||||
pendingChanges.removeItem(_myItem);
|
pendingChanges.removeItem(_myItem);
|
||||||
|
render::Item::clearID(_myItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace render {
|
namespace render {
|
||||||
|
|
|
@ -230,6 +230,7 @@ bool RenderableZoneEntityItem::addToScene(EntityItemPointer self, std::shared_pt
|
||||||
void RenderableZoneEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
void RenderableZoneEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges) {
|
render::PendingChanges& pendingChanges) {
|
||||||
pendingChanges.removeItem(_myMetaItem);
|
pendingChanges.removeItem(_myMetaItem);
|
||||||
|
render::Item::clearID(_myMetaItem);
|
||||||
if (_model) {
|
if (_model) {
|
||||||
_model->removeFromScene(scene, pendingChanges);
|
_model->removeFromScene(scene, pendingChanges);
|
||||||
}
|
}
|
||||||
|
@ -237,7 +238,7 @@ void RenderableZoneEntityItem::removeFromScene(EntityItemPointer self, std::shar
|
||||||
|
|
||||||
|
|
||||||
void RenderableZoneEntityItem::notifyBoundChanged() {
|
void RenderableZoneEntityItem::notifyBoundChanged() {
|
||||||
if (_myMetaItem == render::Item::INVALID_ITEM_ID) {
|
if (!render::Item::isValidID(_myMetaItem)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
render::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
|
|
|
@ -217,6 +217,10 @@ public:
|
||||||
static const ID INVALID_ITEM_ID = 0;
|
static const ID INVALID_ITEM_ID = 0;
|
||||||
static const ItemCell INVALID_CELL = -1;
|
static const ItemCell INVALID_CELL = -1;
|
||||||
|
|
||||||
|
// Convenient function to clear an ID or check it s valid
|
||||||
|
static void clearID(ID& id) { id = INVALID_ITEM_ID; }
|
||||||
|
static bool isValidID(const ID id) { return id != INVALID_ITEM_ID; }
|
||||||
|
|
||||||
// Bound is the AABBox fully containing this item
|
// Bound is the AABBox fully containing this item
|
||||||
typedef AABox Bound;
|
typedef AABox Bound;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue