mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-09 18:15:33 +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
|
// Don't actually crash in debug builds, in case this apparent deadlock is simply from
|
||||||
// the developer actively debugging code
|
// the developer actively debugging code
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
deadlockDetectionCrash();
|
// deadlockDetectionCrash();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,13 +191,14 @@ void Base3DOverlay::setProperties(const QVariantMap& originalProperties) {
|
||||||
|
|
||||||
// Communicate changes to the renderItem if needed
|
// Communicate changes to the renderItem if needed
|
||||||
if (needRenderItemUpdate) {
|
if (needRenderItemUpdate) {
|
||||||
auto itemID = getRenderItemID();
|
|
||||||
|
/* auto itemID = getRenderItemID();
|
||||||
if (render::Item::isValidID(itemID)) {
|
if (render::Item::isValidID(itemID)) {
|
||||||
render::ScenePointer scene = qApp->getMain3DScene();
|
render::ScenePointer scene = qApp->getMain3DScene();
|
||||||
render::Transaction transaction;
|
render::Transaction transaction;
|
||||||
transaction.updateItem(itemID);
|
transaction.updateItem(itemID);
|
||||||
scene->enqueueTransaction(transaction);
|
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
|
// Force the actual update of the render transform now that we notify for the change
|
||||||
// so it s captured for the time of rendering
|
// so it s captured for the time of rendering
|
||||||
notifyRenderTransformChange();
|
notifyRenderTransformChange();
|
||||||
|
/*
|
||||||
auto itemID = getRenderItemID();
|
auto itemID = getRenderItemID();
|
||||||
if (render::Item::isValidID(itemID)) {
|
if (render::Item::isValidID(itemID)) {
|
||||||
render::ScenePointer scene = qApp->getMain3DScene();
|
render::ScenePointer scene = qApp->getMain3DScene();
|
||||||
render::Transaction transaction;
|
render::Transaction transaction;
|
||||||
transaction.updateItem(itemID);
|
transaction.updateItem(itemID);
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void Base3DOverlay::parentDeleted() {
|
void Base3DOverlay::parentDeleted() {
|
||||||
qApp->getOverlays().deleteOverlay(getOverlayID());
|
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;
|
virtual AABox getBounds() const override = 0;
|
||||||
|
|
||||||
|
void update(float deltatime) override;
|
||||||
|
|
||||||
void notifyRenderTransformChange() const { _renderTransformDirty = true; }
|
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;
|
void setProperties(const QVariantMap& properties) override;
|
||||||
QVariant getProperty(const QString& property) override;
|
QVariant getProperty(const QString& property) override;
|
||||||
|
@ -70,6 +73,8 @@ protected:
|
||||||
virtual void locationChanged(bool tellPhysics = true) override;
|
virtual void locationChanged(bool tellPhysics = true) override;
|
||||||
virtual void parentDeleted() override;
|
virtual void parentDeleted() override;
|
||||||
|
|
||||||
|
mutable Transform _renderTransform;
|
||||||
|
|
||||||
float _lineWidth;
|
float _lineWidth;
|
||||||
bool _isSolid;
|
bool _isSolid;
|
||||||
bool _isDashedLine;
|
bool _isDashedLine;
|
||||||
|
|
|
@ -180,7 +180,7 @@ void Web3DOverlay::buildWebSurface() {
|
||||||
|
|
||||||
|
|
||||||
void Web3DOverlay::update(float deltatime) {
|
void Web3DOverlay::update(float deltatime) {
|
||||||
if (_renderTransformDirty) {
|
/* if (_renderTransformDirty) {
|
||||||
auto updateTransform = evalRenderTransform();
|
auto updateTransform = evalRenderTransform();
|
||||||
auto itemID = getRenderItemID();
|
auto itemID = getRenderItemID();
|
||||||
if (render::Item::isValidID(itemID)) {
|
if (render::Item::isValidID(itemID)) {
|
||||||
|
@ -194,17 +194,19 @@ void Web3DOverlay::update(float deltatime) {
|
||||||
});
|
});
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (_webSurface) {
|
if (_webSurface) {
|
||||||
// update globalPosition
|
// update globalPosition
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getPosition()));
|
_webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getPosition()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Billboard3DOverlay::update(deltatime);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Web3DOverlay::evalRenderTransform() const {
|
Transform Web3DOverlay::evalRenderTransform() const {
|
||||||
if (_renderTransformDirty) {
|
auto transform = getTransform();
|
||||||
_updateTransform = getTransform();
|
|
||||||
|
|
||||||
// FIXME: applyTransformTo causes tablet overlay to detach from tablet entity.
|
// 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?
|
// 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) {
|
if (glm::length2(getDimensions()) != 1.0f) {
|
||||||
_updateTransform.postScale(vec3(getDimensions(), 1.0f));
|
transform.postScale(vec3(getDimensions(), 1.0f));
|
||||||
}
|
}
|
||||||
_renderTransformDirty = false;
|
|
||||||
}
|
return transform;
|
||||||
return _updateTransform;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Web3DOverlay::setRenderTransform(const Transform& transform) {
|
|
||||||
_renderTransform = transform;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Web3DOverlay::pickURL() {
|
QString Web3DOverlay::pickURL() {
|
||||||
|
|
|
@ -38,7 +38,6 @@ public:
|
||||||
virtual void update(float deltatime) override;
|
virtual void update(float deltatime) override;
|
||||||
|
|
||||||
Transform evalRenderTransform() const override;
|
Transform evalRenderTransform() const override;
|
||||||
void setRenderTransform(const Transform& transform);
|
|
||||||
|
|
||||||
QObject* getEventHandler();
|
QObject* getEventHandler();
|
||||||
void setProxyWindow(QWindow* proxyWindow);
|
void setProxyWindow(QWindow* proxyWindow);
|
||||||
|
@ -95,9 +94,6 @@ private:
|
||||||
std::map<uint32_t, QTouchEvent::TouchPoint> _activeTouchPoints;
|
std::map<uint32_t, QTouchEvent::TouchPoint> _activeTouchPoints;
|
||||||
QTouchDevice _touchDevice;
|
QTouchDevice _touchDevice;
|
||||||
|
|
||||||
mutable Transform _updateTransform;
|
|
||||||
mutable Transform _renderTransform;
|
|
||||||
|
|
||||||
uint8_t _desiredMaxFPS { 10 };
|
uint8_t _desiredMaxFPS { 10 };
|
||||||
uint8_t _currentMaxFPS { 0 };
|
uint8_t _currentMaxFPS { 0 };
|
||||||
|
|
||||||
|
|
|
@ -235,15 +235,18 @@ void Model::updateRenderItems() {
|
||||||
|
|
||||||
uint32_t deleteGeometryCounter = self->_deleteGeometryCounter;
|
uint32_t deleteGeometryCounter = self->_deleteGeometryCounter;
|
||||||
|
|
||||||
|
Transform modelTransform = self->getTransform();
|
||||||
|
// Transform modelTransform = model->getTransform();
|
||||||
|
modelTransform.setScale(glm::vec3(1.0f));
|
||||||
|
|
||||||
render::Transaction transaction;
|
render::Transaction transaction;
|
||||||
foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) {
|
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();
|
ModelPointer model = data._model.lock();
|
||||||
if (model && model->isLoaded()) {
|
if (model && model->isLoaded()) {
|
||||||
// Ensure the model geometry was not reset between frames
|
// Ensure the model geometry was not reset between frames
|
||||||
if (deleteGeometryCounter == model->_deleteGeometryCounter) {
|
if (deleteGeometryCounter == model->_deleteGeometryCounter) {
|
||||||
Transform modelTransform = model->getTransform();
|
|
||||||
modelTransform.setScale(glm::vec3(1.0f));
|
|
||||||
|
|
||||||
const Model::MeshState& state = model->getMeshState(data._meshIndex);
|
const Model::MeshState& state = model->getMeshState(data._meshIndex);
|
||||||
Transform renderTransform = modelTransform;
|
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
|
// collision mesh does not share the same unit scale as the FBX file's mesh: only apply offset
|
||||||
Transform collisionMeshOffset;
|
Transform collisionMeshOffset;
|
||||||
collisionMeshOffset.setIdentity();
|
collisionMeshOffset.setIdentity();
|
||||||
Transform modelTransform = self->getTransform();
|
// Transform modelTransform = self->getTransform();
|
||||||
foreach(auto itemID, self->_collisionRenderItemsMap.keys()) {
|
foreach(auto itemID, self->_collisionRenderItemsMap.keys()) {
|
||||||
transaction.updateItem<MeshPartPayload>(itemID, [modelTransform, collisionMeshOffset](MeshPartPayload& data) {
|
transaction.updateItem<MeshPartPayload>(itemID, [modelTransform, collisionMeshOffset](MeshPartPayload& data) {
|
||||||
// update the model transform for this render item.
|
// update the model transform for this render item.
|
||||||
|
|
Loading…
Reference in a new issue