Trying to avoid calling getTransform on nestables from render thread

This commit is contained in:
samcake 2017-09-11 17:36:10 -07:00
parent 934364ec59
commit 01e4bfc53e
6 changed files with 51 additions and 26 deletions

View file

@ -427,7 +427,7 @@ public:
// Don't actually crash in debug builds, in case this apparent deadlock is simply from
// the developer actively debugging code
#ifdef NDEBUG
deadlockDetectionCrash();
// deadlockDetectionCrash();
#endif
}
}

View file

@ -191,13 +191,14 @@ void Base3DOverlay::setProperties(const QVariantMap& originalProperties) {
// Communicate changes to the renderItem if needed
if (needRenderItemUpdate) {
auto itemID = getRenderItemID();
/* auto itemID = getRenderItemID();
if (render::Item::isValidID(itemID)) {
render::ScenePointer scene = qApp->getMain3DScene();
render::Transaction transaction;
transaction.updateItem(itemID);
scene->enqueueTransaction(transaction);
}
}*/
}
}
@ -259,16 +260,39 @@ void Base3DOverlay::locationChanged(bool tellPhysics) {
// Force the actual update of the render transform now that we notify for the change
// so it s captured for the time of rendering
notifyRenderTransformChange();
/*
auto itemID = getRenderItemID();
if (render::Item::isValidID(itemID)) {
render::ScenePointer scene = qApp->getMain3DScene();
render::Transaction transaction;
transaction.updateItem(itemID);
scene->enqueueTransaction(transaction);
}
}*/
}
void Base3DOverlay::parentDeleted() {
qApp->getOverlays().deleteOverlay(getOverlayID());
}
void Base3DOverlay::update(float duration) {
if (_renderTransformDirty) {
setRenderTransform(evalRenderTransform());
auto itemID = getRenderItemID();
if (render::Item::isValidID(itemID)) {
render::ScenePointer scene = qApp->getMain3DScene();
render::Transaction transaction;
transaction.updateItem(itemID);
scene->enqueueTransaction(transaction);
}
_renderTransformDirty = false;
}
}
Transform Base3DOverlay::evalRenderTransform() const {
return getTransform();
}
void Base3DOverlay::setRenderTransform(const Transform& transform) {
_renderTransform = transform;
}

View file

@ -52,8 +52,11 @@ public:
virtual AABox getBounds() const override = 0;
void update(float deltatime) override;
void notifyRenderTransformChange() const { _renderTransformDirty = true; }
virtual Transform evalRenderTransform() const { return Transform(); }
virtual Transform evalRenderTransform() const;
void setRenderTransform(const Transform& transform);
void setProperties(const QVariantMap& properties) override;
QVariant getProperty(const QString& property) override;
@ -70,6 +73,8 @@ protected:
virtual void locationChanged(bool tellPhysics = true) override;
virtual void parentDeleted() override;
mutable Transform _renderTransform;
float _lineWidth;
bool _isSolid;
bool _isDashedLine;

View file

@ -180,7 +180,7 @@ void Web3DOverlay::buildWebSurface() {
void Web3DOverlay::update(float deltatime) {
if (_renderTransformDirty) {
/* if (_renderTransformDirty) {
auto updateTransform = evalRenderTransform();
auto itemID = getRenderItemID();
if (render::Item::isValidID(itemID)) {
@ -194,17 +194,19 @@ void Web3DOverlay::update(float deltatime) {
});
scene->enqueueTransaction(transaction);
}
}
}*/
if (_webSurface) {
// update globalPosition
_webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getPosition()));
}
Billboard3DOverlay::update(deltatime);
}
Transform Web3DOverlay::evalRenderTransform() const {
if (_renderTransformDirty) {
_updateTransform = getTransform();
auto transform = getTransform();
// FIXME: applyTransformTo causes tablet overlay to detach from tablet entity.
// Perhaps rather than deleting the following code it should be run only if isFacingAvatar() is true?
@ -214,15 +216,10 @@ Transform Web3DOverlay::evalRenderTransform() const {
*/
if (glm::length2(getDimensions()) != 1.0f) {
_updateTransform.postScale(vec3(getDimensions(), 1.0f));
transform.postScale(vec3(getDimensions(), 1.0f));
}
_renderTransformDirty = false;
}
return _updateTransform;
}
void Web3DOverlay::setRenderTransform(const Transform& transform) {
_renderTransform = transform;
return transform;
}
QString Web3DOverlay::pickURL() {

View file

@ -38,7 +38,6 @@ public:
virtual void update(float deltatime) override;
Transform evalRenderTransform() const override;
void setRenderTransform(const Transform& transform);
QObject* getEventHandler();
void setProxyWindow(QWindow* proxyWindow);
@ -95,9 +94,6 @@ private:
std::map<uint32_t, QTouchEvent::TouchPoint> _activeTouchPoints;
QTouchDevice _touchDevice;
mutable Transform _updateTransform;
mutable Transform _renderTransform;
uint8_t _desiredMaxFPS { 10 };
uint8_t _currentMaxFPS { 0 };

View file

@ -235,15 +235,18 @@ void Model::updateRenderItems() {
uint32_t deleteGeometryCounter = self->_deleteGeometryCounter;
Transform modelTransform = self->getTransform();
// Transform modelTransform = model->getTransform();
modelTransform.setScale(glm::vec3(1.0f));
render::Transaction transaction;
foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(itemID, [deleteGeometryCounter](ModelMeshPartPayload& data) {
transaction.updateItem<ModelMeshPartPayload>(itemID, [deleteGeometryCounter, modelTransform](ModelMeshPartPayload& data) {
ModelPointer model = data._model.lock();
if (model && model->isLoaded()) {
// Ensure the model geometry was not reset between frames
if (deleteGeometryCounter == model->_deleteGeometryCounter) {
Transform modelTransform = model->getTransform();
modelTransform.setScale(glm::vec3(1.0f));
const Model::MeshState& state = model->getMeshState(data._meshIndex);
Transform renderTransform = modelTransform;
@ -259,7 +262,7 @@ void Model::updateRenderItems() {
// collision mesh does not share the same unit scale as the FBX file's mesh: only apply offset
Transform collisionMeshOffset;
collisionMeshOffset.setIdentity();
Transform modelTransform = self->getTransform();
// Transform modelTransform = self->getTransform();
foreach(auto itemID, self->_collisionRenderItemsMap.keys()) {
transaction.updateItem<MeshPartPayload>(itemID, [modelTransform, collisionMeshOffset](MeshPartPayload& data) {
// update the model transform for this render item.