mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-05 06:12:15 +02:00
Trying to avoid calling getTransform on nestables from render thread
This commit is contained in:
parent
934364ec59
commit
01e4bfc53e
6 changed files with 51 additions and 26 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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 };
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue