mirror of
https://github.com/overte-org/overte.git
synced 2025-08-05 13:39:47 +02:00
attempt to fix render-collision hull feature
This commit is contained in:
parent
f3d26e163d
commit
d535109caf
6 changed files with 36 additions and 17 deletions
|
@ -227,7 +227,7 @@ bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_p
|
||||||
|
|
||||||
// note: we don't care if the model fails to add items, we always added our meta item and therefore we return
|
// note: we don't care if the model fails to add items, we always added our meta item and therefore we return
|
||||||
// true so that the system knows our meta item is in the scene!
|
// true so that the system knows our meta item is in the scene!
|
||||||
_model->addToScene(scene, pendingChanges, statusGetters);
|
_model->addToScene(scene, pendingChanges, statusGetters, _showCollisionHull);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -259,14 +259,16 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
|
||||||
|
|
||||||
// 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
|
||||||
if (_model->needsFixupInScene()) {
|
bool shouldShowCollisionHull = (args->_debugFlags & (int)RenderArgs::RENDER_DEBUG_HULLS) > 0;
|
||||||
|
if (_model->needsFixupInScene() || _showCollisionHull != shouldShowCollisionHull) {
|
||||||
|
_showCollisionHull = shouldShowCollisionHull;
|
||||||
render::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
|
|
||||||
_model->removeFromScene(scene, pendingChanges);
|
_model->removeFromScene(scene, pendingChanges);
|
||||||
|
|
||||||
render::Item::Status::Getters statusGetters;
|
render::Item::Status::Getters statusGetters;
|
||||||
makeEntityItemStatusGetters(this, statusGetters);
|
makeEntityItemStatusGetters(this, statusGetters);
|
||||||
_model->addToScene(scene, pendingChanges, statusGetters);
|
_model->addToScene(scene, pendingChanges, statusGetters, _showCollisionHull);
|
||||||
|
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,8 @@ private:
|
||||||
bool _dimensionsInitialized = true;
|
bool _dimensionsInitialized = true;
|
||||||
|
|
||||||
render::ItemID _myMetaItem;
|
render::ItemID _myMetaItem;
|
||||||
|
|
||||||
|
bool _showCollisionHull = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_RenderableModelEntityItem_h
|
#endif // hifi_RenderableModelEntityItem_h
|
||||||
|
|
|
@ -112,7 +112,7 @@ void RenderableZoneEntityItem::render(RenderArgs* args) {
|
||||||
render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
|
render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
|
||||||
render::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
_model->removeFromScene(scene, pendingChanges);
|
_model->removeFromScene(scene, pendingChanges);
|
||||||
_model->addToScene(scene, pendingChanges);
|
_model->addToScene(scene, pendingChanges, false);
|
||||||
|
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
|
|
||||||
|
|
|
@ -508,8 +508,10 @@ void Model::setVisibleInScene(bool newValue, std::shared_ptr<render::Scene> scen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges, bool showCollisionHull) {
|
||||||
if (!_meshGroupsKnown && isLoaded()) {
|
|
||||||
|
if ((!_meshGroupsKnown || showCollisionHull != _showCollisionHull) && isLoaded()) {
|
||||||
|
_showCollisionHull = showCollisionHull;
|
||||||
segregateMeshGroups();
|
segregateMeshGroups();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,8 +534,12 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan
|
||||||
return somethingAdded;
|
return somethingAdded;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges, render::Item::Status::Getters& statusGetters) {
|
bool Model::addToScene(std::shared_ptr<render::Scene> scene,
|
||||||
if (!_meshGroupsKnown && isLoaded()) {
|
render::PendingChanges& pendingChanges,
|
||||||
|
render::Item::Status::Getters& statusGetters,
|
||||||
|
bool showCollisionHull) {
|
||||||
|
if ((!_meshGroupsKnown || showCollisionHull != _showCollisionHull) && isLoaded()) {
|
||||||
|
_showCollisionHull = showCollisionHull;
|
||||||
segregateMeshGroups();
|
segregateMeshGroups();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1144,8 +1150,14 @@ AABox Model::getPartBounds(int meshIndex, int partIndex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::segregateMeshGroups() {
|
void Model::segregateMeshGroups() {
|
||||||
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
QSharedPointer<NetworkGeometry> networkGeometry;
|
||||||
const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = _geometry->getMeshes();
|
if (_showCollisionHull && _collisionGeometry && _collisionGeometry->isLoaded()) {
|
||||||
|
networkGeometry = _collisionGeometry;
|
||||||
|
} else {
|
||||||
|
networkGeometry = _geometry;
|
||||||
|
}
|
||||||
|
const FBXGeometry& geometry = networkGeometry->getFBXGeometry();
|
||||||
|
const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = networkGeometry->getMeshes();
|
||||||
|
|
||||||
_rig->makeAnimSkeleton(geometry);
|
_rig->makeAnimSkeleton(geometry);
|
||||||
|
|
||||||
|
|
|
@ -76,10 +76,13 @@ public:
|
||||||
return !_needsReload && isRenderable() && isActive() && isLoaded();
|
return !_needsReload && isRenderable() && isActive() && isLoaded();
|
||||||
}
|
}
|
||||||
bool initWhenReady(render::ScenePointer scene);
|
bool initWhenReady(render::ScenePointer scene);
|
||||||
bool addToScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges);
|
|
||||||
bool addToScene(std::shared_ptr<render::Scene> scene,
|
bool addToScene(std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges,
|
render::PendingChanges& pendingChanges,
|
||||||
render::Item::Status::Getters& statusGetters);
|
bool showCollisionHull = false);
|
||||||
|
bool addToScene(std::shared_ptr<render::Scene> scene,
|
||||||
|
render::PendingChanges& pendingChanges,
|
||||||
|
render::Item::Status::Getters& statusGetters,
|
||||||
|
bool showCollisionHull = false);
|
||||||
void removeFromScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges);
|
void removeFromScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges);
|
||||||
void renderSetup(RenderArgs* args);
|
void renderSetup(RenderArgs* args);
|
||||||
bool isRenderable() const { return !_meshStates.isEmpty() || (isActive() && _geometry->getMeshes().empty()); }
|
bool isRenderable() const { return !_meshStates.isEmpty() || (isActive() && _geometry->getMeshes().empty()); }
|
||||||
|
@ -368,6 +371,7 @@ private:
|
||||||
bool _readyWhenAdded = false;
|
bool _readyWhenAdded = false;
|
||||||
bool _needsReload = true;
|
bool _needsReload = true;
|
||||||
bool _needsUpdateClusterMatrices = true;
|
bool _needsUpdateClusterMatrices = true;
|
||||||
|
bool _showCollisionHull = false;
|
||||||
|
|
||||||
friend class MeshPartPayload;
|
friend class MeshPartPayload;
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -75,8 +75,7 @@ public:
|
||||||
|
|
||||||
enum DebugFlags {
|
enum DebugFlags {
|
||||||
RENDER_DEBUG_NONE = 0,
|
RENDER_DEBUG_NONE = 0,
|
||||||
RENDER_DEBUG_HULLS = 1,
|
RENDER_DEBUG_HULLS = 1
|
||||||
RENDER_DEBUG_SIMULATION_OWNERSHIP = 2,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
RenderArgs(std::shared_ptr<gpu::Context> context = nullptr,
|
RenderArgs(std::shared_ptr<gpu::Context> context = nullptr,
|
||||||
|
|
Loading…
Reference in a new issue