attempt to fix render-collision hull feature

This commit is contained in:
Seth Alves 2015-11-10 09:49:31 -08:00
parent f3d26e163d
commit d535109caf
6 changed files with 36 additions and 17 deletions

View file

@ -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);
} }
@ -288,7 +290,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
EntityTreeRenderer* renderer = static_cast<EntityTreeRenderer*>(args->_renderer); EntityTreeRenderer* renderer = static_cast<EntityTreeRenderer*>(args->_renderer);
getModel(renderer); getModel(renderer);
} }
if (_model) { if (_model) {
// handle animations.. // handle animations..
if (hasAnimation()) { if (hasAnimation()) {

View file

@ -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

View file

@ -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);

View file

@ -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);

View file

@ -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:

View file

@ -68,17 +68,16 @@ public:
class RenderArgs { class RenderArgs {
public: public:
typedef std::function<bool(const RenderArgs* args, const AABox& bounds)> ShoudRenderFunctor; typedef std::function<bool(const RenderArgs* args, const AABox& bounds)> ShoudRenderFunctor;
enum RenderMode { DEFAULT_RENDER_MODE, SHADOW_RENDER_MODE, DIFFUSE_RENDER_MODE, NORMAL_RENDER_MODE, MIRROR_RENDER_MODE }; enum RenderMode { DEFAULT_RENDER_MODE, SHADOW_RENDER_MODE, DIFFUSE_RENDER_MODE, NORMAL_RENDER_MODE, MIRROR_RENDER_MODE };
enum RenderSide { MONO, STEREO_LEFT, STEREO_RIGHT }; enum RenderSide { MONO, STEREO_LEFT, STEREO_RIGHT };
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,
OctreeRenderer* renderer = nullptr, OctreeRenderer* renderer = nullptr,
ViewFrustum* viewFrustum = nullptr, ViewFrustum* viewFrustum = nullptr,