diff --git a/libraries/render/src/render/Engine.cpp b/libraries/render/src/render/Engine.cpp new file mode 100644 index 0000000000..ff147f23cf --- /dev/null +++ b/libraries/render/src/render/Engine.cpp @@ -0,0 +1,17 @@ +// +// Engine.cpp +// render/src/render +// +// Created by Sam Gateau on 3/3/15. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "Engine.h" + +using namespace render; + + + + diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h new file mode 100644 index 0000000000..2d6414c879 --- /dev/null +++ b/libraries/render/src/render/Engine.h @@ -0,0 +1,32 @@ +// +// Engine.h +// render/src/render +// +// Created by Sam Gateau on 3/3/15. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_render_Engine_h +#define hifi_render_Engine_h + +#include "Scene.h" + +namespace render { + + +class Engine { +public: + + Engine() {} + ~Engine() {} + +protected: + +}; + +} + +#endif // hifi_render_Engine_h diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index f1a166c65e..8da01928f6 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -12,11 +12,48 @@ using namespace render; +void Scene::ChangeBatch::resetItem(ID id, ItemDataPointer& itemData) { + _resetItems.push_back(id); + _resetItemDatas.push_back(itemData); +} -Item::ID Scene::addItem(ItemDataPointer& itemData) { - ID id = _items.size(); +void Scene::ChangeBatch::removeItem(ID id) { + _removedItems.push_back(id); +} + +void Scene::ChangeBatch::moveItem(ID id) { + _movedItems.push_back(id); +} + +Scene::Scene() : + _IDAllocator(0) +{ +} + +Item::ID Scene::allocateID() { + // Just increment and return the proevious value initialized at 0 + return _IDAllocator.fetch_add(1); +} + +/// Enqueue change batch to the scene +void Scene::enqueueChangeBatch(const ChangeBatch& changeBatch) { + _changeQueueMutex.lock(); + _changeQueue.push_back(changeBatch); + _changeQueueMutex.unlock(); +} + +void Scene::processChangeBatchQueue() { + _itemsMutex.lock(); + for (auto changeBatch : _changeQueue) { + for (auto reset : + } + _itemsMutex.unlock(); +} + +void Scene::resetItem(ID id, ItemDataPointer& itemData) { + /*ID id = _items.size(); _items.push_back(Item(itemData)); - return id; + */ } void Scene::removeItem(ID id) { diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index e130392ee1..a34bd34d95 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -17,6 +17,8 @@ #include #include #include +#include +#include namespace render { @@ -35,7 +37,7 @@ public: VIEW_SPACE, // Transformed in view space, and not in world space DYNAMIC, // Dynamic and bound will change unlike static item DEFORMED, // Deformed within bound, not solid - UNVISIBLE, // Visible or not? could be just here to cast shadow + INVISIBLE, // Visible or not? could be just here to cast shadow SHADOW_CASTER, // Item cast shadows PICKABLE, // Item can be picked/selected @@ -92,8 +94,8 @@ public: bool isDynamic() const { return _state[DYNAMIC]; } bool isDeformed() const { return _state[DEFORMED]; } - bool isVisible() const { return !_state[UNVISIBLE]; } - bool isUnvisible() const { return _state[UNVISIBLE]; } + bool isVisible() const { return !_state[INVISIBLE]; } + bool isUnvisible() const { return _state[INVISIBLE]; } bool isShadowCaster() const { return _state[SHADOW_CASTER]; } @@ -112,6 +114,9 @@ protected: typedef Item::PayloadInterface ItemData; typedef Item::PayloadPointer ItemDataPointer; +typedef std::vector< ItemDataPointer > ItemDataVector; + +class Engine; class Scene { public: @@ -120,40 +125,55 @@ public: typedef std::vector ItemList; typedef std::map ItemLists; - enum ChangeType { - ADD = 0, - REMOVE, - MOVE, - RESET, - - NUM_CHANGE_TYPES, - }; - typedef ItemList ChangeLists[NUM_CHANGE_TYPES]; - class ChangePacket { + class ChangeBatch { public: - ChangePacket(int frame) : - _frame(frame) {} - ~ChangePacket(); + ChangeBatch() {} + ~ChangeBatch(); + + void resetItem(ID id, ItemDataPointer& itemData); + void removeItem(ID id); + void moveItem(ID id); + + ItemDataVector _resetItemDatas; + ItemList _resetItems; + ItemList _removedItems; + ItemList _movedItems; - int _frame; - ChangeLists _changeLists; protected: }; + typedef std::vector ChangeBatchQueue; - Scene() {} + Scene(); ~Scene() {} + /// This call is thread safe, can be called from anywhere to allocate a new ID + ID allocateID(); - ID addItem(ItemDataPointer& itemData); + /// Enqueue change batch to the scene + void enqueueChangeBatch(const ChangeBatch& changeBatch); + +protected: + // Thread safe elements that can be accessed from anywhere + std::atomic _IDAllocator; + std::mutex _changeBatchQueueMutex; + ChangeBatchQueue _changeBatchQueue; + + // The actual database + std::mutex _itemsMutex; + Items _items; + ItemLists _buckets; + + void processChangeBatchQueue(); + void resetItem(ID id, ItemDataPointer& itemData); void removeItem(ID id); void moveItem(ID id); - -protected: - Items _items; - ItemLists _buckets; + friend class Engine; }; +typedef std::shared_ptr ScenePointer; +typedef std::vector Scenes; + } #endif // hifi_render_Scene_h