mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 18:50:00 +02:00
repair debug rendering of collision shapes
This commit is contained in:
parent
996b71fa9a
commit
29efe53f74
2 changed files with 53 additions and 27 deletions
|
@ -695,12 +695,8 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
void RenderableModelEntityItem::setCollisionShape(const btCollisionShape* shape) {
|
void RenderableModelEntityItem::setCollisionShape(const btCollisionShape* shape) {
|
||||||
const void* key = static_cast<const void*>(shape);
|
const void* key = static_cast<const void*>(shape);
|
||||||
if (_collisionMeshKey != key) {
|
if (_collisionMeshKey != key) {
|
||||||
if (_collisionMeshKey) {
|
|
||||||
collisionMeshCache.releaseMesh(_collisionMeshKey);
|
|
||||||
}
|
|
||||||
_collisionMeshKey = key;
|
_collisionMeshKey = key;
|
||||||
// toggle _showCollisionGeometry forces re-evaluation later
|
emit requestCollisionGeometryUpdate();
|
||||||
_showCollisionGeometry = !_showCollisionGeometry;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1103,6 +1099,10 @@ bool ModelEntityRenderer::needsRenderUpdate() const {
|
||||||
if (model->getRenderItemsNeedUpdate()) {
|
if (model->getRenderItemsNeedUpdate()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_needsCollisionGeometryUpdate) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return Parent::needsRenderUpdate();
|
return Parent::needsRenderUpdate();
|
||||||
}
|
}
|
||||||
|
@ -1169,6 +1169,15 @@ bool ModelEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPoin
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelEntityRenderer::setCollisionMeshKey(const void*key) {
|
||||||
|
if (key != _collisionMeshKey) {
|
||||||
|
if (_collisionMeshKey) {
|
||||||
|
collisionMeshCache.releaseMesh(_collisionMeshKey);
|
||||||
|
}
|
||||||
|
_collisionMeshKey = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) {
|
void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) {
|
||||||
DETAILED_PROFILE_RANGE(simulation_physics, __FUNCTION__);
|
DETAILED_PROFILE_RANGE(simulation_physics, __FUNCTION__);
|
||||||
if (_hasModel != entity->hasModel()) {
|
if (_hasModel != entity->hasModel()) {
|
||||||
|
@ -1201,6 +1210,7 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
model = std::make_shared<Model>(nullptr, entity.get());
|
model = std::make_shared<Model>(nullptr, entity.get());
|
||||||
connect(model.get(), &Model::setURLFinished, this, &ModelEntityRenderer::requestRenderUpdate);
|
connect(model.get(), &Model::setURLFinished, this, &ModelEntityRenderer::requestRenderUpdate);
|
||||||
connect(model.get(), &Model::requestRenderUpdate, this, &ModelEntityRenderer::requestRenderUpdate);
|
connect(model.get(), &Model::requestRenderUpdate, this, &ModelEntityRenderer::requestRenderUpdate);
|
||||||
|
connect(entity.get(), &RenderableModelEntityItem::requestCollisionGeometryUpdate, this, &ModelEntityRenderer::flagForCollisionGeometryUpdate);
|
||||||
model->setLoadingPriority(EntityTreeRenderer::getEntityLoadingPriority(*entity));
|
model->setLoadingPriority(EntityTreeRenderer::getEntityLoadingPriority(*entity));
|
||||||
model->init();
|
model->init();
|
||||||
entity->setModel(model);
|
entity->setModel(model);
|
||||||
|
@ -1259,6 +1269,26 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
}
|
}
|
||||||
// TODO? early exit here when not visible?
|
// TODO? early exit here when not visible?
|
||||||
|
|
||||||
|
if (_needsCollisionGeometryUpdate) {
|
||||||
|
setCollisionMeshKey(entity->getCollisionMeshKey());
|
||||||
|
_needsCollisionGeometryUpdate = false;
|
||||||
|
ShapeType type = entity->getShapeType();
|
||||||
|
if (_showCollisionGeometry && type != SHAPE_TYPE_STATIC_MESH && type != SHAPE_TYPE_NONE) {
|
||||||
|
// NOTE: it is OK if _collisionMeshKey is nullptr
|
||||||
|
model::MeshPointer mesh = collisionMeshCache.getMesh(_collisionMeshKey);
|
||||||
|
// NOTE: the model will render the collisionGeometry if it has one
|
||||||
|
_model->setCollisionMesh(mesh);
|
||||||
|
} else {
|
||||||
|
if (_collisionMeshKey) {
|
||||||
|
// release mesh
|
||||||
|
collisionMeshCache.releaseMesh(_collisionMeshKey);
|
||||||
|
}
|
||||||
|
// clear model's collision geometry
|
||||||
|
model::MeshPointer mesh = nullptr;
|
||||||
|
_model->setCollisionMesh(mesh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
DETAILED_PROFILE_RANGE(simulation_physics, "Fixup");
|
DETAILED_PROFILE_RANGE(simulation_physics, "Fixup");
|
||||||
if (model->needsFixupInScene()) {
|
if (model->needsFixupInScene()) {
|
||||||
|
@ -1297,6 +1327,11 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelEntityRenderer::flagForCollisionGeometryUpdate() {
|
||||||
|
_needsCollisionGeometryUpdate = true;
|
||||||
|
emit requestRenderUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: this only renders the "meta" portion of the Model, namely it renders debugging items
|
// NOTE: this only renders the "meta" portion of the Model, namely it renders debugging items
|
||||||
void ModelEntityRenderer::doRender(RenderArgs* args) {
|
void ModelEntityRenderer::doRender(RenderArgs* args) {
|
||||||
DETAILED_PROFILE_RANGE(render_detail, "MetaModelRender");
|
DETAILED_PROFILE_RANGE(render_detail, "MetaModelRender");
|
||||||
|
@ -1327,28 +1362,11 @@ void ModelEntityRenderer::doRender(RenderArgs* args) {
|
||||||
// Remap textures for the next frame to avoid flicker
|
// Remap textures for the next frame to avoid flicker
|
||||||
// remapTextures();
|
// remapTextures();
|
||||||
|
|
||||||
#if 0
|
bool showCollisionGeometry = (bool)(args->_debugFlags & (int)RenderArgs::RENDER_DEBUG_HULLS);
|
||||||
// update whether the model should be showing collision mesh (this may flag for fixupInScene)
|
if (showCollisionGeometry != _showCollisionGeometry) {
|
||||||
bool showingCollisionGeometry = (bool)(args->_debugFlags & (int)RenderArgs::RENDER_DEBUG_HULLS);
|
_showCollisionGeometry = showCollisionGeometry;
|
||||||
if (showingCollisionGeometry != _showCollisionGeometry) {
|
flagForCollisionGeometryUpdate();
|
||||||
ShapeType type = _entity->getShapeType();
|
|
||||||
_showCollisionGeometry = showingCollisionGeometry;
|
|
||||||
if (_showCollisionGeometry && type != SHAPE_TYPE_STATIC_MESH && type != SHAPE_TYPE_NONE) {
|
|
||||||
// NOTE: it is OK if _collisionMeshKey is nullptr
|
|
||||||
model::MeshPointer mesh = collisionMeshCache.getMesh(_collisionMeshKey);
|
|
||||||
// NOTE: the model will render the collisionGeometry if it has one
|
|
||||||
_model->setCollisionMesh(mesh);
|
|
||||||
} else {
|
|
||||||
// release mesh
|
|
||||||
if (_collisionMeshKey) {
|
|
||||||
collisionMeshCache.releaseMesh(_collisionMeshKey);
|
|
||||||
}
|
|
||||||
// clear model's collision geometry
|
|
||||||
model::MeshPointer mesh = nullptr;
|
|
||||||
_model->setCollisionMesh(mesh);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelEntityRenderer::mapJoints(const TypedEntityPointer& entity, const QStringList& modelJointNames) {
|
void ModelEntityRenderer::mapJoints(const TypedEntityPointer& entity, const QStringList& modelJointNames) {
|
||||||
|
|
|
@ -50,6 +50,8 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
class RenderableModelEntityItem : public ModelEntityWrapper {
|
class RenderableModelEntityItem : public ModelEntityWrapper {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
friend class render::entities::ModelEntityRenderer;
|
friend class render::entities::ModelEntityRenderer;
|
||||||
using Parent = ModelEntityWrapper;
|
using Parent = ModelEntityWrapper;
|
||||||
public:
|
public:
|
||||||
|
@ -105,6 +107,10 @@ public:
|
||||||
virtual QStringList getJointNames() const override;
|
virtual QStringList getJointNames() const override;
|
||||||
|
|
||||||
bool getMeshes(MeshProxyList& result) override;
|
bool getMeshes(MeshProxyList& result) override;
|
||||||
|
const void* getCollisionMeshKey() const { return _collisionMeshKey; }
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void requestCollisionGeometryUpdate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool needsUpdateModelBounds() const;
|
bool needsUpdateModelBounds() const;
|
||||||
|
@ -117,7 +123,6 @@ private:
|
||||||
QVariantMap _originalTextures;
|
QVariantMap _originalTextures;
|
||||||
bool _dimensionsInitialized { true };
|
bool _dimensionsInitialized { true };
|
||||||
bool _needsJointSimulation { false };
|
bool _needsJointSimulation { false };
|
||||||
bool _showCollisionGeometry { false };
|
|
||||||
const void* _collisionMeshKey { nullptr };
|
const void* _collisionMeshKey { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -141,6 +146,8 @@ protected:
|
||||||
virtual bool needsRenderUpdate() const override;
|
virtual bool needsRenderUpdate() const override;
|
||||||
virtual void doRender(RenderArgs* args) override;
|
virtual void doRender(RenderArgs* args) override;
|
||||||
virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override;
|
virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override;
|
||||||
|
void flagForCollisionGeometryUpdate();
|
||||||
|
void setCollisionMeshKey(const void* key);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void animate(const TypedEntityPointer& entity);
|
void animate(const TypedEntityPointer& entity);
|
||||||
|
@ -163,6 +170,7 @@ private:
|
||||||
|
|
||||||
bool _needsJointSimulation{ false };
|
bool _needsJointSimulation{ false };
|
||||||
bool _showCollisionGeometry{ false };
|
bool _showCollisionGeometry{ false };
|
||||||
|
bool _needsCollisionGeometryUpdate{ false };
|
||||||
const void* _collisionMeshKey{ nullptr };
|
const void* _collisionMeshKey{ nullptr };
|
||||||
|
|
||||||
// used on client side
|
// used on client side
|
||||||
|
|
Loading…
Reference in a new issue