mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 18:21:16 +02:00
handle remove attachment case
This commit is contained in:
parent
e06422825a
commit
139855f487
3 changed files with 26 additions and 21 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue