mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
Merge pull request #13350 from sabrina-shanman/bulletcollisionrenderonly
Remove functionality for rendering collision models directly in the Model class
This commit is contained in:
commit
2483c45f40
12 changed files with 32 additions and 244 deletions
|
@ -2241,9 +2241,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
|
||||||
DependencyManager::get<EntityTreeRenderer>()->setSetPrecisionPickingOperator([&](unsigned int rayPickID, bool value) {
|
DependencyManager::get<EntityTreeRenderer>()->setSetPrecisionPickingOperator([&](unsigned int rayPickID, bool value) {
|
||||||
DependencyManager::get<PickManager>()->setPrecisionPicking(rayPickID, value);
|
DependencyManager::get<PickManager>()->setPrecisionPicking(rayPickID, value);
|
||||||
});
|
});
|
||||||
EntityTreeRenderer::setRenderDebugHullsOperator([] {
|
|
||||||
return Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowHulls);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Preload Tablet sounds
|
// Preload Tablet sounds
|
||||||
DependencyManager::get<TabletScriptingInterface>()->preloadSounds();
|
DependencyManager::get<TabletScriptingInterface>()->preloadSounds();
|
||||||
|
|
|
@ -205,10 +205,6 @@ void Application::runRenderFrame(RenderArgs* renderArgs) {
|
||||||
|
|
||||||
RenderArgs::DebugFlags renderDebugFlags = RenderArgs::RENDER_DEBUG_NONE;
|
RenderArgs::DebugFlags renderDebugFlags = RenderArgs::RENDER_DEBUG_NONE;
|
||||||
|
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowHulls)) {
|
|
||||||
renderDebugFlags = static_cast<RenderArgs::DebugFlags>(renderDebugFlags |
|
|
||||||
static_cast<int>(RenderArgs::RENDER_DEBUG_HULLS));
|
|
||||||
}
|
|
||||||
renderArgs->_debugFlags = renderDebugFlags;
|
renderArgs->_debugFlags = renderDebugFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -725,7 +725,6 @@ Menu::Menu() {
|
||||||
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowOwned,
|
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowOwned,
|
||||||
0, false, drawStatusConfig, SLOT(setShowNetwork(bool)));
|
0, false, drawStatusConfig, SLOT(setShowNetwork(bool)));
|
||||||
}
|
}
|
||||||
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowHulls, 0, false, qApp->getEntities().data(), SIGNAL(setRenderDebugHulls()));
|
|
||||||
|
|
||||||
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletWireframe, 0, false, qApp, SLOT(setShowBulletWireframe(bool)));
|
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletWireframe, 0, false, qApp, SLOT(setShowBulletWireframe(bool)));
|
||||||
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletAABBs, 0, false, qApp, SLOT(setShowBulletAABBs(bool)));
|
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletAABBs, 0, false, qApp, SLOT(setShowBulletAABBs(bool)));
|
||||||
|
|
|
@ -141,7 +141,6 @@ namespace MenuOption {
|
||||||
const QString Overlays = "Show Overlays";
|
const QString Overlays = "Show Overlays";
|
||||||
const QString PackageModel = "Package Model as .fst...";
|
const QString PackageModel = "Package Model as .fst...";
|
||||||
const QString Pair = "Pair";
|
const QString Pair = "Pair";
|
||||||
const QString PhysicsShowHulls = "Draw Collision Shapes";
|
|
||||||
const QString PhysicsShowOwned = "Highlight Simulation Ownership";
|
const QString PhysicsShowOwned = "Highlight Simulation Ownership";
|
||||||
const QString VerboseLogging = "Verbose Logging";
|
const QString VerboseLogging = "Verbose Logging";
|
||||||
const QString PhysicsShowBulletWireframe = "Show Bullet Collision";
|
const QString PhysicsShowBulletWireframe = "Show Bullet Collision";
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
|
|
||||||
size_t std::hash<EntityItemID>::operator()(const EntityItemID& id) const { return qHash(id); }
|
size_t std::hash<EntityItemID>::operator()(const EntityItemID& id) const { return qHash(id); }
|
||||||
std::function<bool()> EntityTreeRenderer::_entitiesShouldFadeFunction;
|
std::function<bool()> EntityTreeRenderer::_entitiesShouldFadeFunction;
|
||||||
std::function<bool()> EntityTreeRenderer::_renderDebugHullsOperator = [] { return false; };
|
|
||||||
|
|
||||||
QString resolveScriptURL(const QString& scriptUrl) {
|
QString resolveScriptURL(const QString& scriptUrl) {
|
||||||
auto normalizedScriptUrl = DependencyManager::get<ResourceManager>()->normalizeURL(scriptUrl);
|
auto normalizedScriptUrl = DependencyManager::get<ResourceManager>()->normalizeURL(scriptUrl);
|
||||||
|
|
|
@ -116,14 +116,10 @@ public:
|
||||||
EntityItemPointer getEntity(const EntityItemID& id);
|
EntityItemPointer getEntity(const EntityItemID& id);
|
||||||
void onEntityChanged(const EntityItemID& id);
|
void onEntityChanged(const EntityItemID& id);
|
||||||
|
|
||||||
static void setRenderDebugHullsOperator(std::function<bool()> renderDebugHullsOperator) { _renderDebugHullsOperator = renderDebugHullsOperator; }
|
|
||||||
static bool shouldRenderDebugHulls() { return _renderDebugHullsOperator(); }
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void enterEntity(const EntityItemID& entityItemID);
|
void enterEntity(const EntityItemID& entityItemID);
|
||||||
void leaveEntity(const EntityItemID& entityItemID);
|
void leaveEntity(const EntityItemID& entityItemID);
|
||||||
void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision);
|
void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision);
|
||||||
void setRenderDebugHulls();
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addingEntity(const EntityItemID& entityID);
|
void addingEntity(const EntityItemID& entityID);
|
||||||
|
@ -259,8 +255,6 @@ private:
|
||||||
static int _entitiesScriptEngineCount;
|
static int _entitiesScriptEngineCount;
|
||||||
static CalculateEntityLoadingPriority _calculateEntityLoadingPriorityFunc;
|
static CalculateEntityLoadingPriority _calculateEntityLoadingPriorityFunc;
|
||||||
static std::function<bool()> _entitiesShouldFadeFunction;
|
static std::function<bool()> _entitiesShouldFadeFunction;
|
||||||
|
|
||||||
static std::function<bool()> _renderDebugHullsOperator;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include <QtCore/QUrlQuery>
|
#include <QtCore/QUrlQuery>
|
||||||
|
|
||||||
#include <AbstractViewStateInterface.h>
|
#include <AbstractViewStateInterface.h>
|
||||||
#include <CollisionRenderMeshCache.h>
|
|
||||||
#include <Model.h>
|
#include <Model.h>
|
||||||
#include <PerfStat.h>
|
#include <PerfStat.h>
|
||||||
#include <render/Scene.h>
|
#include <render/Scene.h>
|
||||||
|
@ -35,8 +34,6 @@
|
||||||
#include "EntitiesRendererLogging.h"
|
#include "EntitiesRendererLogging.h"
|
||||||
|
|
||||||
|
|
||||||
static CollisionRenderMeshCache collisionMeshCache;
|
|
||||||
|
|
||||||
void ModelEntityWrapper::setModel(const ModelPointer& model) {
|
void ModelEntityWrapper::setModel(const ModelPointer& model) {
|
||||||
withWriteLock([&] {
|
withWriteLock([&] {
|
||||||
if (_model != model) {
|
if (_model != model) {
|
||||||
|
@ -1052,10 +1049,7 @@ using namespace render;
|
||||||
using namespace render::entities;
|
using namespace render::entities;
|
||||||
|
|
||||||
ModelEntityRenderer::ModelEntityRenderer(const EntityItemPointer& entity) : Parent(entity) {
|
ModelEntityRenderer::ModelEntityRenderer(const EntityItemPointer& entity) : Parent(entity) {
|
||||||
connect(DependencyManager::get<EntityTreeRenderer>().data(), &EntityTreeRenderer::setRenderDebugHulls, this, [&] {
|
|
||||||
_needsCollisionGeometryUpdate = true;
|
|
||||||
emit requestRenderUpdate();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelEntityRenderer::setKey(bool didVisualGeometryRequestSucceed) {
|
void ModelEntityRenderer::setKey(bool didVisualGeometryRequestSucceed) {
|
||||||
|
@ -1215,10 +1209,6 @@ bool ModelEntityRenderer::needsRenderUpdate() const {
|
||||||
if (model->getRenderItemsNeedUpdate()) {
|
if (model->getRenderItemsNeedUpdate()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_needsCollisionGeometryUpdate) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return Parent::needsRenderUpdate();
|
return Parent::needsRenderUpdate();
|
||||||
}
|
}
|
||||||
|
@ -1285,12 +1275,7 @@ bool ModelEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPoin
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelEntityRenderer::setCollisionMeshKey(const void*key) {
|
void ModelEntityRenderer::setCollisionMeshKey(const void*key) {
|
||||||
if (key != _collisionMeshKey) {
|
_collisionMeshKey = key;
|
||||||
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) {
|
||||||
|
@ -1339,7 +1324,6 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
_didLastVisualGeometryRequestSucceed = didVisualGeometryRequestSucceed;
|
_didLastVisualGeometryRequestSucceed = didVisualGeometryRequestSucceed;
|
||||||
});
|
});
|
||||||
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));
|
||||||
entity->setModel(model);
|
entity->setModel(model);
|
||||||
withWriteLock([&] { _model = model; });
|
withWriteLock([&] { _model = model; });
|
||||||
|
@ -1412,26 +1396,6 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
model->setCanCastShadow(_canCastShadow, scene);
|
model->setCanCastShadow(_canCastShadow, scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_needsCollisionGeometryUpdate) {
|
|
||||||
setCollisionMeshKey(entity->getCollisionMeshKey());
|
|
||||||
_needsCollisionGeometryUpdate = false;
|
|
||||||
ShapeType type = entity->getShapeType();
|
|
||||||
if (DependencyManager::get<EntityTreeRenderer>()->shouldRenderDebugHulls() && type != SHAPE_TYPE_STATIC_MESH && type != SHAPE_TYPE_NONE) {
|
|
||||||
// NOTE: it is OK if _collisionMeshKey is nullptr
|
|
||||||
graphics::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
|
|
||||||
graphics::MeshPointer mesh = nullptr;
|
|
||||||
_model->setCollisionMesh(mesh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
DETAILED_PROFILE_RANGE(simulation_physics, "Fixup");
|
DETAILED_PROFILE_RANGE(simulation_physics, "Fixup");
|
||||||
if (model->needsFixupInScene()) {
|
if (model->needsFixupInScene()) {
|
||||||
|
@ -1487,11 +1451,6 @@ void ModelEntityRenderer::setIsVisibleInSecondaryCamera(bool value) {
|
||||||
setKey(_didLastVisualGeometryRequestSucceed);
|
setKey(_didLastVisualGeometryRequestSucceed);
|
||||||
}
|
}
|
||||||
|
|
||||||
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");
|
||||||
|
|
|
@ -161,7 +161,6 @@ 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);
|
void setCollisionMeshKey(const void* key);
|
||||||
|
|
||||||
render::hifi::Tag getTagMask() const override;
|
render::hifi::Tag getTagMask() const override;
|
||||||
|
@ -189,7 +188,6 @@ private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool _needsJointSimulation { false };
|
bool _needsJointSimulation { false };
|
||||||
bool _needsCollisionGeometryUpdate { false };
|
|
||||||
const void* _collisionMeshKey { nullptr };
|
const void* _collisionMeshKey { nullptr };
|
||||||
|
|
||||||
// used on client side
|
// used on client side
|
||||||
|
|
|
@ -47,7 +47,7 @@ bool CauterizedModel::updateGeometry() {
|
||||||
return needsFullUpdate;
|
return needsFullUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CauterizedModel::createVisibleRenderItemSet() {
|
void CauterizedModel::createRenderItemSet() {
|
||||||
if (_isCauterized) {
|
if (_isCauterized) {
|
||||||
assert(isLoaded());
|
assert(isLoaded());
|
||||||
const auto& meshes = _renderGeometry->getMeshes();
|
const auto& meshes = _renderGeometry->getMeshes();
|
||||||
|
@ -94,15 +94,10 @@ void CauterizedModel::createVisibleRenderItemSet() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Model::createVisibleRenderItemSet();
|
Model::createRenderItemSet();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CauterizedModel::createCollisionRenderItemSet() {
|
|
||||||
// Temporary HACK: use base class method for now
|
|
||||||
Model::createCollisionRenderItemSet();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CauterizedModel::updateClusterMatrices() {
|
void CauterizedModel::updateClusterMatrices() {
|
||||||
PerformanceTimer perfTimer("CauterizedModel::updateClusterMatrices");
|
PerformanceTimer perfTimer("CauterizedModel::updateClusterMatrices");
|
||||||
|
|
||||||
|
@ -186,12 +181,6 @@ void CauterizedModel::updateRenderItems() {
|
||||||
if (!_addedToScene) {
|
if (!_addedToScene) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 scale = getScale();
|
|
||||||
if (_collisionGeometry) {
|
|
||||||
// _collisionGeometry is already scaled
|
|
||||||
scale = glm::vec3(1.0f);
|
|
||||||
}
|
|
||||||
_needsUpdateClusterMatrices = true;
|
_needsUpdateClusterMatrices = true;
|
||||||
_renderItemsNeedUpdate = false;
|
_renderItemsNeedUpdate = false;
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,8 @@ public:
|
||||||
void deleteGeometry() override;
|
void deleteGeometry() override;
|
||||||
bool updateGeometry() override;
|
bool updateGeometry() override;
|
||||||
|
|
||||||
void createVisibleRenderItemSet() override;
|
void createRenderItemSet() override;
|
||||||
void createCollisionRenderItemSet() override;
|
|
||||||
|
|
||||||
virtual void updateClusterMatrices() override;
|
virtual void updateClusterMatrices() override;
|
||||||
void updateRenderItems() override;
|
void updateRenderItems() override;
|
||||||
|
|
||||||
|
|
|
@ -47,51 +47,9 @@ int vec3VectorTypeId = qRegisterMetaType<QVector<glm::vec3> >();
|
||||||
float Model::FAKE_DIMENSION_PLACEHOLDER = -1.0f;
|
float Model::FAKE_DIMENSION_PLACEHOLDER = -1.0f;
|
||||||
#define HTTP_INVALID_COM "http://invalid.com"
|
#define HTTP_INVALID_COM "http://invalid.com"
|
||||||
|
|
||||||
const int NUM_COLLISION_HULL_COLORS = 24;
|
|
||||||
std::vector<graphics::MaterialPointer> _collisionMaterials;
|
|
||||||
|
|
||||||
void initCollisionMaterials() {
|
|
||||||
// generates bright colors in red, green, blue, yellow, magenta, and cyan spectrums
|
|
||||||
// (no browns, greys, or dark shades)
|
|
||||||
float component[NUM_COLLISION_HULL_COLORS] = {
|
|
||||||
0.0f, 0.0f, 0.0f, 0.0f,
|
|
||||||
0.0f, 0.0f, 0.0f, 0.0f,
|
|
||||||
0.2f, 0.4f, 0.6f, 0.8f,
|
|
||||||
1.0f, 1.0f, 1.0f, 1.0f,
|
|
||||||
1.0f, 1.0f, 1.0f, 1.0f,
|
|
||||||
0.8f, 0.6f, 0.4f, 0.2f
|
|
||||||
};
|
|
||||||
_collisionMaterials.reserve(NUM_COLLISION_HULL_COLORS);
|
|
||||||
|
|
||||||
// each component gets the same cuve
|
|
||||||
// but offset by a multiple of one third the full width
|
|
||||||
int numComponents = 3;
|
|
||||||
int sectionWidth = NUM_COLLISION_HULL_COLORS / numComponents;
|
|
||||||
int greenPhase = sectionWidth;
|
|
||||||
int bluePhase = 2 * sectionWidth;
|
|
||||||
|
|
||||||
// we stride through the colors to scatter adjacent shades
|
|
||||||
// so they don't tend to group together for large models
|
|
||||||
for (int i = 0; i < sectionWidth; ++i) {
|
|
||||||
for (int j = 0; j < numComponents; ++j) {
|
|
||||||
graphics::MaterialPointer material;
|
|
||||||
material = std::make_shared<graphics::Material>();
|
|
||||||
int index = j * sectionWidth + i;
|
|
||||||
float red = component[index % NUM_COLLISION_HULL_COLORS];
|
|
||||||
float green = component[(index + greenPhase) % NUM_COLLISION_HULL_COLORS];
|
|
||||||
float blue = component[(index + bluePhase) % NUM_COLLISION_HULL_COLORS];
|
|
||||||
material->setAlbedo(glm::vec3(red, green, blue));
|
|
||||||
material->setMetallic(0.02f);
|
|
||||||
material->setRoughness(0.5f);
|
|
||||||
_collisionMaterials.push_back(material);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) :
|
Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) :
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
_renderGeometry(),
|
_renderGeometry(),
|
||||||
_collisionGeometry(),
|
|
||||||
_renderWatcher(_renderGeometry),
|
_renderWatcher(_renderGeometry),
|
||||||
_spatiallyNestableOverride(spatiallyNestableOverride),
|
_spatiallyNestableOverride(spatiallyNestableOverride),
|
||||||
_translation(0.0f),
|
_translation(0.0f),
|
||||||
|
@ -310,16 +268,6 @@ void Model::updateRenderItems() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform collisionMeshOffset;
|
|
||||||
collisionMeshOffset.setIdentity();
|
|
||||||
foreach(auto itemID, self->_collisionRenderItemsMap.keys()) {
|
|
||||||
transaction.updateItem<MeshPartPayload>(itemID, [renderItemKeyGlobalFlags, modelTransform, collisionMeshOffset](MeshPartPayload& data) {
|
|
||||||
// update the model transform for this render item.
|
|
||||||
data.updateKey(renderItemKeyGlobalFlags);
|
|
||||||
data.updateTransform(modelTransform, collisionMeshOffset);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);
|
AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -777,11 +725,6 @@ void Model::updateRenderItemsKey(const render::ScenePointer& scene) {
|
||||||
data.updateKey(renderItemsKey);
|
data.updateKey(renderItemsKey);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
foreach(auto item, _collisionRenderItemsMap.keys()) {
|
|
||||||
transaction.updateItem<ModelMeshPartPayload>(item, [renderItemsKey](ModelMeshPartPayload& data) {
|
|
||||||
data.updateKey(renderItemsKey);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -862,49 +805,37 @@ const render::ItemKey Model::getRenderItemKeyGlobalFlags() const {
|
||||||
bool Model::addToScene(const render::ScenePointer& scene,
|
bool Model::addToScene(const render::ScenePointer& scene,
|
||||||
render::Transaction& transaction,
|
render::Transaction& transaction,
|
||||||
render::Item::Status::Getters& statusGetters) {
|
render::Item::Status::Getters& statusGetters) {
|
||||||
bool readyToRender = _collisionGeometry || isLoaded();
|
if (!_addedToScene && isLoaded()) {
|
||||||
if (!_addedToScene && readyToRender) {
|
updateClusterMatrices();
|
||||||
createRenderItemSet();
|
if (_modelMeshRenderItems.empty()) {
|
||||||
|
createRenderItemSet();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool somethingAdded = false;
|
bool somethingAdded = false;
|
||||||
if (_collisionGeometry) {
|
|
||||||
if (_collisionRenderItemsMap.empty()) {
|
if (_modelMeshRenderItemsMap.empty()) {
|
||||||
foreach (auto renderItem, _collisionRenderItems) {
|
|
||||||
auto item = scene->allocateID();
|
bool hasTransparent = false;
|
||||||
auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem);
|
size_t verticesCount = 0;
|
||||||
if (_collisionRenderItems.empty() && statusGetters.size()) {
|
foreach(auto renderItem, _modelMeshRenderItems) {
|
||||||
renderPayload->addStatusGetters(statusGetters);
|
auto item = scene->allocateID();
|
||||||
}
|
auto renderPayload = std::make_shared<ModelMeshPartPayload::Payload>(renderItem);
|
||||||
transaction.resetItem(item, renderPayload);
|
if (_modelMeshRenderItemsMap.empty() && statusGetters.size()) {
|
||||||
_collisionRenderItemsMap.insert(item, renderPayload);
|
renderPayload->addStatusGetters(statusGetters);
|
||||||
}
|
}
|
||||||
somethingAdded = !_collisionRenderItemsMap.empty();
|
transaction.resetItem(item, renderPayload);
|
||||||
|
|
||||||
|
hasTransparent = hasTransparent || renderItem.get()->getShapeKey().isTranslucent();
|
||||||
|
verticesCount += renderItem.get()->getVerticesCount();
|
||||||
|
_modelMeshRenderItemsMap.insert(item, renderPayload);
|
||||||
|
_modelMeshRenderItemIDs.emplace_back(item);
|
||||||
}
|
}
|
||||||
} else {
|
somethingAdded = !_modelMeshRenderItemsMap.empty();
|
||||||
if (_modelMeshRenderItemsMap.empty()) {
|
|
||||||
|
|
||||||
bool hasTransparent = false;
|
_renderInfoVertexCount = verticesCount;
|
||||||
size_t verticesCount = 0;
|
_renderInfoDrawCalls = _modelMeshRenderItemsMap.count();
|
||||||
foreach(auto renderItem, _modelMeshRenderItems) {
|
_renderInfoHasTransparent = hasTransparent;
|
||||||
auto item = scene->allocateID();
|
|
||||||
auto renderPayload = std::make_shared<ModelMeshPartPayload::Payload>(renderItem);
|
|
||||||
if (_modelMeshRenderItemsMap.empty() && statusGetters.size()) {
|
|
||||||
renderPayload->addStatusGetters(statusGetters);
|
|
||||||
}
|
|
||||||
transaction.resetItem(item, renderPayload);
|
|
||||||
|
|
||||||
hasTransparent = hasTransparent || renderItem.get()->getShapeKey().isTranslucent();
|
|
||||||
verticesCount += renderItem.get()->getVerticesCount();
|
|
||||||
_modelMeshRenderItemsMap.insert(item, renderPayload);
|
|
||||||
_modelMeshRenderItemIDs.emplace_back(item);
|
|
||||||
}
|
|
||||||
somethingAdded = !_modelMeshRenderItemsMap.empty();
|
|
||||||
|
|
||||||
_renderInfoVertexCount = verticesCount;
|
|
||||||
_renderInfoDrawCalls = _modelMeshRenderItemsMap.count();
|
|
||||||
_renderInfoHasTransparent = hasTransparent;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (somethingAdded) {
|
if (somethingAdded) {
|
||||||
|
@ -926,11 +857,6 @@ void Model::removeFromScene(const render::ScenePointer& scene, render::Transacti
|
||||||
_modelMeshMaterialNames.clear();
|
_modelMeshMaterialNames.clear();
|
||||||
_modelMeshRenderItemShapes.clear();
|
_modelMeshRenderItemShapes.clear();
|
||||||
|
|
||||||
foreach(auto item, _collisionRenderItemsMap.keys()) {
|
|
||||||
transaction.removeItem(item);
|
|
||||||
}
|
|
||||||
_collisionRenderItems.clear();
|
|
||||||
_collisionRenderItemsMap.clear();
|
|
||||||
_addedToScene = false;
|
_addedToScene = false;
|
||||||
|
|
||||||
_renderInfoVertexCount = 0;
|
_renderInfoVertexCount = 0;
|
||||||
|
@ -1504,7 +1430,6 @@ void Model::deleteGeometry() {
|
||||||
_rig.destroyAnimGraph();
|
_rig.destroyAnimGraph();
|
||||||
_blendedBlendshapeCoefficients.clear();
|
_blendedBlendshapeCoefficients.clear();
|
||||||
_renderGeometry.reset();
|
_renderGeometry.reset();
|
||||||
_collisionGeometry.reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::overrideModelTransformAndOffset(const Transform& transform, const glm::vec3& offset) {
|
void Model::overrideModelTransformAndOffset(const Transform& transform, const glm::vec3& offset) {
|
||||||
|
@ -1533,19 +1458,6 @@ const render::ItemIDs& Model::fetchRenderItemIDs() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::createRenderItemSet() {
|
void Model::createRenderItemSet() {
|
||||||
updateClusterMatrices();
|
|
||||||
if (_collisionGeometry) {
|
|
||||||
if (_collisionRenderItems.empty()) {
|
|
||||||
createCollisionRenderItemSet();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (_modelMeshRenderItems.empty()) {
|
|
||||||
createVisibleRenderItemSet();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void Model::createVisibleRenderItemSet() {
|
|
||||||
assert(isLoaded());
|
assert(isLoaded());
|
||||||
const auto& meshes = _renderGeometry->getMeshes();
|
const auto& meshes = _renderGeometry->getMeshes();
|
||||||
|
|
||||||
|
@ -1591,41 +1503,6 @@ void Model::createVisibleRenderItemSet() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::createCollisionRenderItemSet() {
|
|
||||||
assert((bool)_collisionGeometry);
|
|
||||||
if (_collisionMaterials.empty()) {
|
|
||||||
initCollisionMaterials();
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto& meshes = _collisionGeometry->getMeshes();
|
|
||||||
|
|
||||||
// We should not have any existing renderItems if we enter this section of code
|
|
||||||
Q_ASSERT(_collisionRenderItems.isEmpty());
|
|
||||||
|
|
||||||
Transform identity;
|
|
||||||
identity.setIdentity();
|
|
||||||
Transform offset;
|
|
||||||
offset.postTranslate(_offset);
|
|
||||||
|
|
||||||
// Run through all of the meshes, and place them into their segregated, but unsorted buckets
|
|
||||||
uint32_t numMeshes = (uint32_t)meshes.size();
|
|
||||||
for (uint32_t i = 0; i < numMeshes; i++) {
|
|
||||||
const auto& mesh = meshes.at(i);
|
|
||||||
if (!mesh) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the render payloads
|
|
||||||
int numParts = (int)mesh->getNumParts();
|
|
||||||
for (int partIndex = 0; partIndex < numParts; partIndex++) {
|
|
||||||
graphics::MaterialPointer& material = _collisionMaterials[partIndex % NUM_COLLISION_HULL_COLORS];
|
|
||||||
auto payload = std::make_shared<MeshPartPayload>(mesh, partIndex, material);
|
|
||||||
payload->updateTransform(identity, offset);
|
|
||||||
_collisionRenderItems << payload;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::isRenderable() const {
|
bool Model::isRenderable() const {
|
||||||
return !_meshStates.empty() || (isLoaded() && _renderGeometry->getMeshes().empty());
|
return !_meshStates.empty() || (isLoaded() && _renderGeometry->getMeshes().empty());
|
||||||
}
|
}
|
||||||
|
@ -1709,15 +1586,6 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void Model::setCollisionMesh(graphics::MeshPointer mesh) {
|
|
||||||
if (mesh) {
|
|
||||||
_collisionGeometry = std::make_shared<CollisionRenderGeometry>(mesh);
|
|
||||||
} else {
|
|
||||||
_collisionGeometry.reset();
|
|
||||||
}
|
|
||||||
_needsFixupInScene = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ModelBlender::ModelBlender() :
|
ModelBlender::ModelBlender() :
|
||||||
_pendingBlenders(0) {
|
_pendingBlenders(0) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,8 +153,6 @@ public:
|
||||||
|
|
||||||
/// Returns a reference to the shared geometry.
|
/// Returns a reference to the shared geometry.
|
||||||
const Geometry::Pointer& getGeometry() const { return _renderGeometry; }
|
const Geometry::Pointer& getGeometry() const { return _renderGeometry; }
|
||||||
/// Returns a reference to the shared collision geometry.
|
|
||||||
const Geometry::Pointer& getCollisionGeometry() const { return _collisionGeometry; }
|
|
||||||
|
|
||||||
const QVariantMap getTextures() const { assert(isLoaded()); return _renderGeometry->getTextures(); }
|
const QVariantMap getTextures() const { assert(isLoaded()); return _renderGeometry->getTextures(); }
|
||||||
Q_INVOKABLE virtual void setTextures(const QVariantMap& textures);
|
Q_INVOKABLE virtual void setTextures(const QVariantMap& textures);
|
||||||
|
@ -260,7 +258,6 @@ public:
|
||||||
|
|
||||||
// returns 'true' if needs fullUpdate after geometry change
|
// returns 'true' if needs fullUpdate after geometry change
|
||||||
virtual bool updateGeometry();
|
virtual bool updateGeometry();
|
||||||
void setCollisionMesh(graphics::MeshPointer mesh);
|
|
||||||
|
|
||||||
void setLoadingPriority(float priority) { _loadingPriority = priority; }
|
void setLoadingPriority(float priority) { _loadingPriority = priority; }
|
||||||
|
|
||||||
|
@ -362,7 +359,6 @@ protected:
|
||||||
bool getJointPosition(int jointIndex, glm::vec3& position) const;
|
bool getJointPosition(int jointIndex, glm::vec3& position) const;
|
||||||
|
|
||||||
Geometry::Pointer _renderGeometry; // only ever set by its watcher
|
Geometry::Pointer _renderGeometry; // only ever set by its watcher
|
||||||
Geometry::Pointer _collisionGeometry;
|
|
||||||
|
|
||||||
GeometryResourceWatcher _renderWatcher;
|
GeometryResourceWatcher _renderWatcher;
|
||||||
|
|
||||||
|
@ -430,9 +426,7 @@ protected:
|
||||||
QVector<TriangleSet> _modelSpaceMeshTriangleSets; // model space triangles for all sub meshes
|
QVector<TriangleSet> _modelSpaceMeshTriangleSets; // model space triangles for all sub meshes
|
||||||
|
|
||||||
|
|
||||||
void createRenderItemSet();
|
virtual void createRenderItemSet();
|
||||||
virtual void createVisibleRenderItemSet();
|
|
||||||
virtual void createCollisionRenderItemSet();
|
|
||||||
|
|
||||||
bool _isWireframe;
|
bool _isWireframe;
|
||||||
bool _useDualQuaternionSkinning { false };
|
bool _useDualQuaternionSkinning { false };
|
||||||
|
@ -443,9 +437,6 @@ protected:
|
||||||
|
|
||||||
static AbstractViewStateInterface* _viewState;
|
static AbstractViewStateInterface* _viewState;
|
||||||
|
|
||||||
QVector<std::shared_ptr<MeshPartPayload>> _collisionRenderItems;
|
|
||||||
QMap<render::ItemID, render::PayloadPointer> _collisionRenderItemsMap;
|
|
||||||
|
|
||||||
QVector<std::shared_ptr<ModelMeshPartPayload>> _modelMeshRenderItems;
|
QVector<std::shared_ptr<ModelMeshPartPayload>> _modelMeshRenderItems;
|
||||||
QMap<render::ItemID, render::PayloadPointer> _modelMeshRenderItemsMap;
|
QMap<render::ItemID, render::PayloadPointer> _modelMeshRenderItemsMap;
|
||||||
render::ItemIDs _modelMeshRenderItemIDs;
|
render::ItemIDs _modelMeshRenderItemIDs;
|
||||||
|
|
Loading…
Reference in a new issue