mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-30 05:21:09 +02:00
more work on simple renderable
This commit is contained in:
parent
806ee88f1f
commit
2fba5a0928
12 changed files with 62 additions and 61 deletions
|
@ -3406,7 +3406,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render::Scene::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
|
|
||||||
// Make sure the WorldBox is in the scene
|
// Make sure the WorldBox is in the scene
|
||||||
if (WorldBoxRenderData::_item == 0) {
|
if (WorldBoxRenderData::_item == 0) {
|
||||||
|
|
|
@ -67,7 +67,7 @@ void AvatarManager::init() {
|
||||||
auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload);
|
auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload);
|
||||||
static_cast<Avatar*>(_myAvatar.get())->_renderItemID = scene->allocateID();
|
static_cast<Avatar*>(_myAvatar.get())->_renderItemID = scene->allocateID();
|
||||||
|
|
||||||
render::Scene::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
pendingChanges.resetItem(static_cast<Avatar*>(_myAvatar.get())->_renderItemID, avatarPayloadPointer);
|
pendingChanges.resetItem(static_cast<Avatar*>(_myAvatar.get())->_renderItemID, avatarPayloadPointer);
|
||||||
|
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
|
@ -152,7 +152,7 @@ AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWe
|
||||||
auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload);
|
auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload);
|
||||||
static_cast<Avatar*>(avatar.get())->_renderItemID = scene->allocateID();
|
static_cast<Avatar*>(avatar.get())->_renderItemID = scene->allocateID();
|
||||||
|
|
||||||
render::Scene::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
pendingChanges.resetItem(static_cast<Avatar*>(avatar.get())->_renderItemID, avatarPayloadPointer);
|
pendingChanges.resetItem(static_cast<Avatar*>(avatar.get())->_renderItemID, avatarPayloadPointer);
|
||||||
|
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
|
@ -186,7 +186,7 @@ void AvatarManager::removeAvatar(const QUuid& sessionUUID) {
|
||||||
}
|
}
|
||||||
|
|
||||||
render::ScenePointer scene = Application::getInstance()->getMain3DScene();
|
render::ScenePointer scene = Application::getInstance()->getMain3DScene();
|
||||||
render::Scene::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
pendingChanges.removeItem(avatar->_renderItemID);
|
pendingChanges.removeItem(avatar->_renderItemID);
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,9 +97,11 @@ void EntityTreeRenderer::clear() {
|
||||||
_entityScripts.clear();
|
_entityScripts.clear();
|
||||||
|
|
||||||
auto scene = _viewState->getMain3DScene();
|
auto scene = _viewState->getMain3DScene();
|
||||||
|
render::PendingChanges pendingChanges;
|
||||||
foreach(auto entity, _entitiesInScene) {
|
foreach(auto entity, _entitiesInScene) {
|
||||||
entity->removeFromScene(entity, scene);
|
entity->removeFromScene(entity, scene, pendingChanges);
|
||||||
}
|
}
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
_entitiesInScene.clear();
|
_entitiesInScene.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1067,8 +1069,10 @@ void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) {
|
||||||
// here's where we remove the entity payload from the scene
|
// here's where we remove the entity payload from the scene
|
||||||
auto entity = static_cast<EntityTree*>(_tree)->findEntityByID(entityID);
|
auto entity = static_cast<EntityTree*>(_tree)->findEntityByID(entityID);
|
||||||
if (entity && _entitiesInScene.contains(entity)) {
|
if (entity && _entitiesInScene.contains(entity)) {
|
||||||
|
render::PendingChanges pendingChanges;
|
||||||
auto scene = _viewState->getMain3DScene();
|
auto scene = _viewState->getMain3DScene();
|
||||||
entity->removeFromScene(entity, scene);
|
entity->removeFromScene(entity, scene, pendingChanges);
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
_entitiesInScene.remove(entity);
|
_entitiesInScene.remove(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1079,10 +1083,12 @@ void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) {
|
||||||
// here's where we add the entity payload to the scene
|
// here's where we add the entity payload to the scene
|
||||||
auto entity = static_cast<EntityTree*>(_tree)->findEntityByID(entityID);
|
auto entity = static_cast<EntityTree*>(_tree)->findEntityByID(entityID);
|
||||||
if (entity && entity->canRenderInScene()) {
|
if (entity && entity->canRenderInScene()) {
|
||||||
|
render::PendingChanges pendingChanges;
|
||||||
auto scene = _viewState->getMain3DScene();
|
auto scene = _viewState->getMain3DScene();
|
||||||
if (entity->addToScene(entity, scene)) {
|
if (entity->addToScene(entity, scene, pendingChanges)) {
|
||||||
_entitiesInScene.insert(entity);
|
_entitiesInScene.insert(entity);
|
||||||
}
|
}
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,7 @@ public:
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
|
|
||||||
virtual bool canRenderInScene() { return true; } // we use our _renderHelper to render in scene
|
SIMPLE_RENDERABLE()
|
||||||
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { return _renderHelper.addToScene(self, scene); }
|
|
||||||
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { _renderHelper.removeFromScene(self, scene); }
|
|
||||||
private:
|
|
||||||
SingleRenderableEntityItem _renderHelper;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,10 +32,9 @@ namespace render {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mixin class for implementing basic single item rendering
|
// Mixin class for implementing basic single item rendering
|
||||||
class SingleRenderableEntityItem {
|
class SimpleRenderableEntityItem {
|
||||||
public:
|
public:
|
||||||
bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) {
|
bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
||||||
render::Scene::PendingChanges pendingChanges;
|
|
||||||
_myItem = scene->allocateID();
|
_myItem = scene->allocateID();
|
||||||
|
|
||||||
auto renderData = RenderableEntityItemProxy::Pointer(new RenderableEntityItemProxy(self));
|
auto renderData = RenderableEntityItemProxy::Pointer(new RenderableEntityItemProxy(self));
|
||||||
|
@ -43,14 +42,11 @@ public:
|
||||||
|
|
||||||
pendingChanges.resetItem(_myItem, renderPayload);
|
pendingChanges.resetItem(_myItem, renderPayload);
|
||||||
|
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) {
|
void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
|
||||||
render::Scene::PendingChanges pendingChanges;
|
|
||||||
pendingChanges.removeItem(_myItem);
|
pendingChanges.removeItem(_myItem);
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -58,4 +54,14 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define SIMPLE_RENDERABLE() \
|
||||||
|
public: \
|
||||||
|
virtual bool canRenderInScene() { return true; } \
|
||||||
|
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) { return _renderHelper.addToScene(self, scene, pendingChanges); } \
|
||||||
|
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) { _renderHelper.removeFromScene(self, scene, pendingChanges); } \
|
||||||
|
private: \
|
||||||
|
SimpleRenderableEntityItem _renderHelper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // hifi_RenderableEntityItem_h
|
#endif // hifi_RenderableEntityItem_h
|
||||||
|
|
|
@ -25,11 +25,7 @@ public:
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
|
|
||||||
virtual bool canRenderInScene() { return true; } // we use our _renderHelper to render in scene
|
SIMPLE_RENDERABLE()
|
||||||
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { return _renderHelper.addToScene(self, scene); }
|
|
||||||
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { _renderHelper.removeFromScene(self, scene); }
|
|
||||||
private:
|
|
||||||
SingleRenderableEntityItem _renderHelper;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,11 +23,7 @@ public:
|
||||||
|
|
||||||
void updateQuads(RenderArgs* args, bool textured);
|
void updateQuads(RenderArgs* args, bool textured);
|
||||||
|
|
||||||
virtual bool canRenderInScene() { return true; } // we use our _renderHelper to render in scene
|
SIMPLE_RENDERABLE()
|
||||||
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { return _renderHelper.addToScene(self, scene); }
|
|
||||||
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { _renderHelper.removeFromScene(self, scene); }
|
|
||||||
private:
|
|
||||||
SingleRenderableEntityItem _renderHelper;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,7 @@ public:
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
|
|
||||||
virtual bool canRenderInScene() { return true; } // we use our _renderHelper to render in scene
|
SIMPLE_RENDERABLE()
|
||||||
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { return _renderHelper.addToScene(self, scene); }
|
|
||||||
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { _renderHelper.removeFromScene(self, scene); }
|
|
||||||
private:
|
|
||||||
SingleRenderableEntityItem _renderHelper;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,3 +14,4 @@ target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS})
|
||||||
target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES})
|
target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES})
|
||||||
|
|
||||||
link_hifi_libraries(avatars shared octree gpu model fbx networking animation environment)
|
link_hifi_libraries(avatars shared octree gpu model fbx networking animation environment)
|
||||||
|
include_hifi_library_headers(render)
|
||||||
|
|
|
@ -36,6 +36,7 @@ class EntityTreeElementExtraEncodeData;
|
||||||
|
|
||||||
namespace render {
|
namespace render {
|
||||||
class Scene;
|
class Scene;
|
||||||
|
class PendingChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
// these thesholds determine what updates will be ignored (client and server)
|
// these thesholds determine what updates will be ignored (client and server)
|
||||||
|
@ -157,8 +158,10 @@ public:
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
|
|
||||||
virtual bool canRenderInScene() { return false; } // does your entity property render using Render Items and Payloads
|
virtual bool canRenderInScene() { return false; } // does your entity property render using Render Items and Payloads
|
||||||
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { return false; } // by default entity items don't add to scene
|
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
||||||
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene) { } // by default entity items don't add to scene
|
render::PendingChanges& pendingChanges) { return false; } // by default entity items don't add to scene
|
||||||
|
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
||||||
|
render::PendingChanges& pendingChanges) { } // by default entity items don't add to scene
|
||||||
virtual void render(RenderArgs* args) { } // by default entity items don't know how to render
|
virtual void render(RenderArgs* args) { } // by default entity items don't know how to render
|
||||||
|
|
||||||
static int expectedBytes();
|
static int expectedBytes();
|
||||||
|
|
|
@ -68,21 +68,21 @@ void Item::move() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::PendingChanges::resetItem(ItemID id, const PayloadPointer& payload) {
|
void PendingChanges::resetItem(ItemID id, const PayloadPointer& payload) {
|
||||||
_resetItems.push_back(id);
|
_resetItems.push_back(id);
|
||||||
_resetPayloads.push_back(payload);
|
_resetPayloads.push_back(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::PendingChanges::removeItem(ItemID id) {
|
void PendingChanges::removeItem(ItemID id) {
|
||||||
_removedItems.push_back(id);
|
_removedItems.push_back(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::PendingChanges::moveItem(ItemID id) {
|
void PendingChanges::moveItem(ItemID id) {
|
||||||
_movedItems.push_back(id);
|
_movedItems.push_back(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Scene::PendingChanges::merge(PendingChanges& changes) {
|
void PendingChanges::merge(PendingChanges& changes) {
|
||||||
_resetItems.insert(_resetItems.end(), changes._resetItems.begin(), changes._resetItems.end());
|
_resetItems.insert(_resetItems.end(), changes._resetItems.begin(), changes._resetItems.end());
|
||||||
_resetPayloads.insert(_resetPayloads.end(), changes._resetPayloads.begin(), changes._resetPayloads.end());
|
_resetPayloads.insert(_resetPayloads.end(), changes._resetPayloads.begin(), changes._resetPayloads.end());
|
||||||
_removedItems.insert(_removedItems.end(), changes._removedItems.begin(), changes._removedItems.end());
|
_removedItems.insert(_removedItems.end(), changes._removedItems.begin(), changes._removedItems.end());
|
||||||
|
@ -106,7 +106,7 @@ void Scene::enqueuePendingChanges(const PendingChanges& pendingChanges) {
|
||||||
_changeQueueMutex.unlock();
|
_changeQueueMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void consolidateChangeQueue(Scene::PendingChangesQueue& queue, Scene::PendingChanges& singleBatch) {
|
void consolidateChangeQueue(PendingChangesQueue& queue, PendingChanges& singleBatch) {
|
||||||
while (!queue.empty()) {
|
while (!queue.empty()) {
|
||||||
auto pendingChanges = queue.front();
|
auto pendingChanges = queue.front();
|
||||||
singleBatch.merge(pendingChanges);
|
singleBatch.merge(pendingChanges);
|
||||||
|
|
|
@ -303,6 +303,27 @@ public:
|
||||||
class Engine;
|
class Engine;
|
||||||
class Observer;
|
class Observer;
|
||||||
|
|
||||||
|
class PendingChanges {
|
||||||
|
public:
|
||||||
|
PendingChanges() {}
|
||||||
|
~PendingChanges() {}
|
||||||
|
|
||||||
|
void resetItem(ItemID id, const PayloadPointer& payload);
|
||||||
|
void removeItem(ItemID id);
|
||||||
|
void moveItem(ItemID id);
|
||||||
|
|
||||||
|
void merge(PendingChanges& changes);
|
||||||
|
|
||||||
|
Payloads _resetPayloads;
|
||||||
|
ItemIDs _resetItems;
|
||||||
|
ItemIDs _removedItems;
|
||||||
|
ItemIDs _movedItems;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
};
|
||||||
|
typedef std::queue<PendingChanges> PendingChangesQueue;
|
||||||
|
|
||||||
|
|
||||||
// Scene is a container for Items
|
// Scene is a container for Items
|
||||||
// Items are introduced, modified or erased in the scene through PendingChanges
|
// Items are introduced, modified or erased in the scene through PendingChanges
|
||||||
// Once per Frame, the PendingChanges are all flushed
|
// Once per Frame, the PendingChanges are all flushed
|
||||||
|
@ -340,26 +361,6 @@ public:
|
||||||
typedef std::shared_ptr< Observer > ObserverPointer;
|
typedef std::shared_ptr< Observer > ObserverPointer;
|
||||||
typedef std::vector< ObserverPointer > Observers;
|
typedef std::vector< ObserverPointer > Observers;
|
||||||
|
|
||||||
class PendingChanges {
|
|
||||||
public:
|
|
||||||
PendingChanges() {}
|
|
||||||
~PendingChanges() {}
|
|
||||||
|
|
||||||
void resetItem(ItemID id, const PayloadPointer& payload);
|
|
||||||
void removeItem(ItemID id);
|
|
||||||
void moveItem(ItemID id);
|
|
||||||
|
|
||||||
void merge(PendingChanges& changes);
|
|
||||||
|
|
||||||
Payloads _resetPayloads;
|
|
||||||
ItemIDs _resetItems;
|
|
||||||
ItemIDs _removedItems;
|
|
||||||
ItemIDs _movedItems;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
};
|
|
||||||
typedef std::queue<PendingChanges> PendingChangesQueue;
|
|
||||||
|
|
||||||
Scene();
|
Scene();
|
||||||
~Scene() {}
|
~Scene() {}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue