handle remove attachment case

This commit is contained in:
ZappoMan 2015-06-10 16:13:17 -07:00
parent e06422825a
commit 139855f487
3 changed files with 26 additions and 21 deletions

View file

@ -107,6 +107,9 @@ Avatar::Avatar() :
} }
Avatar::~Avatar() { Avatar::~Avatar() {
for(auto attachment : _unusedAttachments) {
delete attachment;
}
} }
const float BILLBOARD_LOD_DISTANCE = 40.0f; const float BILLBOARD_LOD_DISTANCE = 40.0f;
@ -525,7 +528,7 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const {
return glm::angleAxis(angle * proportion, axis); return glm::angleAxis(angle * proportion, axis);
} }
void Avatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel) { void Avatar::fixupModelsInScene() {
// check to see if when we added our models to the scene they were ready, if they were not ready, then // check to see if when we added our models to the scene they were ready, if they were not ready, then
// fix them up in the scene // fix them up in the scene
render::ScenePointer scene = Application::getInstance()->getMain3DScene(); render::ScenePointer scene = Application::getInstance()->getMain3DScene();
@ -544,8 +547,18 @@ void Avatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool
attachmentModel->addToScene(scene, pendingChanges); attachmentModel->addToScene(scene, pendingChanges);
} }
} }
for (auto attachmentModelToRemove : _attachmentsToRemove) {
attachmentModelToRemove->removeFromScene(scene, pendingChanges);
_unusedAttachments << attachmentModelToRemove;
}
_attachmentsToRemove.clear();
scene->enqueuePendingChanges(pendingChanges); scene->enqueuePendingChanges(pendingChanges);
}
void Avatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel) {
fixupModelsInScene();
{ {
Glower glower(renderArgs, glowLevel); Glower glower(renderArgs, glowLevel);
@ -947,13 +960,18 @@ void Avatar::setAttachmentData(const QVector<AttachmentData>& attachmentData) {
} }
// make sure we have as many models as attachments // make sure we have as many models as attachments
while (_attachmentModels.size() < attachmentData.size()) { while (_attachmentModels.size() < attachmentData.size()) {
Model* model = new Model(this); Model* model = nullptr;
if (_unusedAttachments.size() > 0) {
model = _unusedAttachments.takeFirst();
} else {
model = new Model(this);
}
model->init(); model->init();
_attachmentModels.append(model); _attachmentModels.append(model);
} }
while (_attachmentModels.size() > attachmentData.size()) { while (_attachmentModels.size() > attachmentData.size()) {
// NOTE: what's really going to happen here? This seems dangerous... has the model been removed from the scene? auto attachmentModel = _attachmentModels.takeLast();
delete _attachmentModels.takeLast(); _attachmentsToRemove << attachmentModel;
} }
// update the urls // update the urls

View file

@ -195,6 +195,8 @@ protected:
SkeletonModel _skeletonModel; SkeletonModel _skeletonModel;
glm::vec3 _skeletonOffset; glm::vec3 _skeletonOffset;
QVector<Model*> _attachmentModels; QVector<Model*> _attachmentModels;
QVector<Model*> _attachmentsToRemove;
QVector<Model*> _unusedAttachments;
float _bodyYawDelta; float _bodyYawDelta;
// These position histories and derivatives are in the world-frame. // These position histories and derivatives are in the world-frame.
@ -234,6 +236,7 @@ protected:
void renderDisplayName(RenderArgs* renderArgs); void renderDisplayName(RenderArgs* renderArgs);
virtual void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f); virtual void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f);
virtual bool shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const; virtual bool shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const;
virtual void fixupModelsInScene();
void simulateAttachments(float deltaTime); void simulateAttachments(float deltaTime);

View file

@ -1178,23 +1178,7 @@ void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bo
// check to see if when we added our models to the scene they were ready, if they were not ready, then // check to see if when we added our models to the scene they were ready, if they were not ready, then
// fix them up in the scene // fix them up in the scene
render::ScenePointer scene = Application::getInstance()->getMain3DScene(); fixupModelsInScene();
render::PendingChanges pendingChanges;
if (_skeletonModel.needsFixupInScene()) {
_skeletonModel.removeFromScene(scene, pendingChanges);
_skeletonModel.addToScene(scene, pendingChanges);
}
if (getHead()->getFaceModel().needsFixupInScene()) {
getHead()->getFaceModel().removeFromScene(scene, pendingChanges);
getHead()->getFaceModel().addToScene(scene, pendingChanges);
}
for (auto attachmentModel : _attachmentModels) {
if (attachmentModel->needsFixupInScene()) {
attachmentModel->removeFromScene(scene, pendingChanges);
attachmentModel->addToScene(scene, pendingChanges);
}
}
scene->enqueuePendingChanges(pendingChanges);
const glm::vec3 cameraPos = Application::getInstance()->getCamera()->getPosition(); const glm::vec3 cameraPos = Application::getInstance()->getCamera()->getPosition();