1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef SCENEPLUGIN_ENTITYCOLLECTION_H 17 #define SCENEPLUGIN_ENTITYCOLLECTION_H 18 19 #include <scene_plugin/interface/intf_entity_collection.h> 20 21 #include <base/containers/unique_ptr.h> 22 #include <base/containers/unordered_map.h> 23 24 SCENE_BEGIN_NAMESPACE() 25 26 class EntityCollection : public IEntityCollection, private IEntityCollection::IListener { 27 public: 28 using Ptr = BASE_NS::unique_ptr<EntityCollection, Deleter>; 29 30 EntityCollection(CORE_NS::IEcs& ecs, BASE_NS::string_view uri, BASE_NS::string_view contextUri); 31 32 void AddListener(IEntityCollection::IListener& listener) override; 33 void RemoveListener(IEntityCollection::IListener& listener) override; 34 35 // 36 // From IEntityCollection 37 // 38 39 IEntityCollection::Ptr CreateNewEntityCollection( 40 BASE_NS::string_view uri, BASE_NS::string_view contextUri) override; 41 42 CORE_NS::IEcs& GetEcs() const override; 43 BASE_NS::string GetUri() const override; 44 void SetUri(const BASE_NS::string& uri) override; 45 46 BASE_NS::string GetContextUri() const override; 47 48 BASE_NS::string GetSrc() const override; 49 void SetSrc(BASE_NS::string_view src) override; 50 51 BASE_NS::string GetType() const override; 52 void SetType(BASE_NS::string_view type) override; 53 54 size_t GetEntityCount() const override; 55 CORE_NS::EntityReference GetEntity(size_t collectionIndex) const override; 56 CORE_NS::EntityReference GetEntity(BASE_NS::string_view localContextId) const override; 57 CORE_NS::EntityReference GetEntityRecursive(BASE_NS::string_view localContextId) const override; 58 BASE_NS::array_view<const CORE_NS::EntityReference> GetEntities() const override; 59 void AddEntity(CORE_NS::EntityReference entitity) override; 60 void AddEntities(BASE_NS::array_view<const CORE_NS::EntityReference> entities) override; 61 bool RemoveEntity(CORE_NS::EntityReference entitity) override; 62 void RemoveEntities(BASE_NS::array_view<const CORE_NS::EntityReference> entities) override; 63 void RemoveEntityRecursive(CORE_NS::Entity entity) override; 64 65 void SetId(BASE_NS::string_view id, CORE_NS::EntityReference entity) override; 66 BASE_NS::string_view GetId(CORE_NS::Entity entity) const override; 67 BASE_NS::string_view GetIdRecursive(CORE_NS::Entity entity) const override; 68 69 void SetUniqueIdentifier(BASE_NS::string_view id, CORE_NS::EntityReference entity) override; 70 BASE_NS::string_view GetUniqueIdentifier(CORE_NS::Entity entity) const override; 71 BASE_NS::string_view GetUniqueIdentifierRecursive(CORE_NS::Entity entity) const override; 72 73 size_t GetSubCollectionCount() const override; 74 IEntityCollection* GetSubCollection(size_t index) override; 75 const IEntityCollection* GetSubCollection(size_t index) const override; 76 int32_t GetSubCollectionIndex(BASE_NS::string_view uri) const override; 77 int32_t GetSubCollectionIndexByRoot(CORE_NS::Entity entity) const override; 78 IEntityCollection& AddSubCollection( 79 BASE_NS::string_view uri, BASE_NS::string_view contextUri, bool serializable) override; 80 IEntityCollection& AddSubCollectionClone(IEntityCollection& collection, BASE_NS::string_view uri) override; 81 void RemoveSubCollection(size_t index) override; 82 83 size_t GetEntityCountRecursive(bool includeDestroyed, bool includeNonSerialized = true) const override; 84 void GetEntitiesRecursive(bool includeDestroyed, BASE_NS::vector<CORE_NS::EntityReference>& entitiesOut, 85 bool includeNonSerialized = true) const override; 86 87 bool Contains(CORE_NS::Entity entity) const override; 88 bool IsExternal(CORE_NS::Entity entity) const override; 89 bool isSubCollectionRoot(CORE_NS::Entity entity) const override; 90 CORE_NS::EntityReference GetReference(CORE_NS::Entity entity) const override; 91 92 void SetActive(bool active) override; 93 bool IsActive() const override; 94 95 void MarkDestroyed(bool destroyed) override; 96 bool IsMarkedDestroyed() const override; 97 98 void MarkModified(bool modified) override; 99 void MarkModified(bool modified, bool recursive) override; 100 bool IsMarkedModified() const override; 101 102 void Clear() override; 103 104 void CopyContents(IEntityCollection& srcCollection) override; 105 106 BASE_NS::vector<CORE_NS::EntityReference> CopyContentsWithSerialization(IEntityCollection& srcCollection) override; 107 BASE_NS::vector<CORE_NS::EntityReference> CopyContentsWithSerialization( 108 IEntityCollection& srcCollection, BASE_NS::array_view<const CORE_NS::EntityReference> entities) override; 109 110 bool MarkComponentSerialized(CORE_NS::Entity entity, BASE_NS::Uid component, bool serialize) override; 111 bool MarkAllPropertiesSerialized(CORE_NS::Entity entity, BASE_NS::Uid component) override; 112 bool MarkPropertySerialized( 113 CORE_NS::Entity entity, BASE_NS::Uid component, BASE_NS::string_view propertyPath, bool serialize) override; 114 bool IsPropertySerialized( 115 CORE_NS::Entity entity, BASE_NS::Uid component, BASE_NS::string_view propertyPath) override; 116 const PropertyList* GetSerializedProperties(CORE_NS::Entity entity, BASE_NS::Uid component) const override; 117 118 void AddEntityToSubcollection( 119 BASE_NS::string_view collection, BASE_NS::string_view name, CORE_NS::Entity entity, bool makeUnique) override; 120 121 bool IsSerialized() const override; 122 void SetSerialized(bool serialize) override; 123 124 protected: 125 void Destroy() override; 126 ~EntityCollection() override; 127 128 private: 129 // Prevent copying. 130 EntityCollection(const EntityCollection&) = delete; 131 EntityCollection& operator=(const EntityCollection&) = delete; 132 133 // From IEntityCollection::IListener 134 void ModifiedChanged(IEntityCollection& entityCollection, bool modified) override; 135 136 void DoGetEntitiesRecursive( 137 bool includeDestroyed, bool includeNonSerialized, BASE_NS::vector<CORE_NS::EntityReference>& entitiesOut) const; 138 139 void ClonePrivate(EntityCollection& dst) const; 140 void DoCloneRecursive(EntityCollection& dst) const; 141 142 // TODO: Create a better data structure for this information. 143 // Components to be serialized in an entity. 144 using ComponentMap = BASE_NS::unordered_map<BASE_NS::Uid, PropertyList>; 145 BASE_NS::unordered_map<CORE_NS::Entity, ComponentMap> serializationInfo_; 146 147 CORE_NS::IEcs& ecs_; 148 BASE_NS::string uri_; 149 BASE_NS::string contextUri_; 150 151 BASE_NS::string src_ {}; 152 BASE_NS::string type_ {}; 153 154 BASE_NS::unordered_map<BASE_NS::string, CORE_NS::EntityReference> namedEntities_; 155 BASE_NS::unordered_map<BASE_NS::string, CORE_NS::EntityReference> entityIdentifiers_; 156 BASE_NS::vector<CORE_NS::EntityReference> entities_; 157 158 BASE_NS::vector<EntityCollection::Ptr> collections_; 159 160 bool isActive_ { true }; 161 bool isMarkedDestroyed_ { false }; 162 bool isMarkedModified_ { false }; 163 bool isSerialized_ { true }; 164 165 BASE_NS::vector<IEntityCollection::IListener*> listeners_; 166 }; 167 168 SCENE_END_NAMESPACE() 169 170 #endif // SCENEPLUGIN_ENTITYCOLLECTION_H 171