12 #ifndef hifi_EntityTreeElement_h
13 #define hifi_EntityTreeElement_h
17 #include <OctreeElement.h>
20 #include "EntityEditPacketSender.h"
21 #include "EntityItem.h"
23 #include <PickFilter.h>
26 class EntityTreeElement;
28 using EntityItems = QVector<EntityItemPointer>;
29 using EntityTreeElementWeakPointer = std::weak_ptr<EntityTreeElement>;
30 using EntityTreeElementPointer = std::shared_ptr<EntityTreeElement>;
31 using EntityItemFilter = std::function<bool(EntityItemPointer&)>;
33 class EntityTreeUpdateArgs {
35 EntityTreeUpdateArgs() :
41 QList<EntityItemPointer> _movingEntities;
47 class EntityTreeElementExtraEncodeData :
public OctreeElementExtraEncodeDataBase {
49 EntityTreeElementExtraEncodeData() :
50 elementCompleted(false),
51 subtreeCompleted(false),
53 memset(childCompleted, 0,
sizeof(childCompleted));
55 bool elementCompleted;
56 bool subtreeCompleted;
57 bool childCompleted[NUMBER_OF_CHILDREN];
58 QMap<EntityItemID, EntityPropertyFlags> entities;
60 using EntityTreeElementExtraEncodeDataPointer = std::shared_ptr<EntityTreeElementExtraEncodeData>;
62 inline QDebug operator<<(QDebug debug,
const EntityTreeElementExtraEncodeDataPointer data) {
64 debug <<
" elementCompleted: " << data->elementCompleted <<
", ";
65 debug <<
" subtreeCompleted: " << data->subtreeCompleted <<
", ";
66 debug <<
" childCompleted[]: ";
67 for (
int i = 0; i < NUMBER_OF_CHILDREN; i++) {
68 debug <<
" " << i <<
":" << data->childCompleted[i] <<
", ";
70 debug <<
" entities.size: " << data->entities.size() <<
"}";
75 class SendModelsOperationArgs {
81 class EntityTreeElement :
public OctreeElement, ReadWriteLockable {
82 friend class EntityTree;
84 EntityTreeElement(
unsigned char* octalCode = NULL);
86 virtual OctreeElementPointer createNewElement(
unsigned char* octalCode = NULL)
override;
89 virtual ~EntityTreeElement();
92 EntityTreeElementPointer getChildAtIndex(
int index)
const {
93 return std::static_pointer_cast<EntityTreeElement>(OctreeElement::getChildAtIndex(index));
99 virtual OctreeElementPointer addChildAtIndex(
int index)
override;
102 virtual void calculateAverageFromChildren()
override;
105 virtual bool collapseChildren()
override;
109 virtual bool hasContent()
const override {
return hasEntities(); }
113 virtual bool hasDetailedContent()
const override {
return hasEntities(); }
118 virtual void splitChildren()
override { }
121 virtual bool requiresSplit()
const override {
return false; }
123 virtual void debugExtraEncodeData(EncodeBitstreamParams& params)
const override;
127 virtual int readElementDataFromBuffer(
const unsigned char* data,
int bytesLeftToRead,
128 ReadBitstreamToTreeParams& args)
override;
134 virtual bool isRendered()
const override {
return getShouldRender(); }
135 virtual bool deleteApproved()
const override {
return !hasEntities(); }
137 static bool checkFilterSettings(
const EntityItemPointer& entity, PickFilter searchFilter);
138 virtual bool canPickIntersect()
const override {
return hasEntities(); }
139 virtual EntityItemID evalRayIntersection(
const glm::vec3& origin,
const glm::vec3& direction,
const glm::vec3& viewFrustumPos,
140 OctreeElementPointer& element,
float& distance, BoxFace& face, glm::vec3& surfaceNormal,
141 const QVector<EntityItemID>& entityIdsToInclude,
const QVector<EntityItemID>& entityIdsToDiscard,
142 PickFilter searchFilter, QVariantMap& extraInfo);
143 virtual EntityItemID evalDetailedRayIntersection(
const glm::vec3& origin,
const glm::vec3& direction,
144 const glm::vec3& viewFrustumPos, OctreeElementPointer& element,
float& distance,
145 BoxFace& face, glm::vec3& surfaceNormal,
const QVector<EntityItemID>& entityIdsToInclude,
146 const QVector<EntityItemID>& entityIdsToDiscard, PickFilter searchFilter, QVariantMap& extraInfo);
147 virtual bool findSpherePenetration(
const glm::vec3& center,
float radius,
148 glm::vec3& penetration,
void** penetratedObject)
const override;
150 virtual EntityItemID evalParabolaIntersection(
const glm::vec3& origin,
const glm::vec3& velocity,
151 const glm::vec3& acceleration,
const glm::vec3& viewFrustumPos, OctreeElementPointer& element,
float& parabolicDistance,
152 BoxFace& face, glm::vec3& surfaceNormal,
const QVector<EntityItemID>& entityIdsToInclude,
153 const QVector<EntityItemID>& entityIdsToDiscard, PickFilter searchFilter, QVariantMap& extraInfo);
154 virtual EntityItemID evalDetailedParabolaIntersection(
const glm::vec3& origin,
const glm::vec3& velocity,
155 const glm::vec3& normal,
const glm::vec3& acceleration,
const glm::vec3& viewFrustumPos, OctreeElementPointer& element,
156 float& parabolicDistance, BoxFace& face, glm::vec3& surfaceNormal,
const QVector<EntityItemID>& entityIdsToInclude,
157 const QVector<EntityItemID>& entityIdsToDiscard, PickFilter searchFilter, QVariantMap& extraInfo);
159 template <
typename F>
160 void forEachEntity(F f)
const {
162 foreach(EntityItemPointer entityItem, _entityItems) {
168 virtual uint16_t size()
const;
169 bool hasEntities()
const {
return size() > 0; }
171 void setTree(EntityTreePointer tree) { _myTree = tree; }
172 EntityTreePointer getTree()
const {
return _myTree; }
174 void addEntityItem(EntityItemPointer entity);
176 QUuid evalClosetEntity(
const glm::vec3& position, PickFilter searchFilter,
float& closestDistanceSquared)
const;
177 void evalEntitiesInSphere(
const glm::vec3& position,
float radius, PickFilter searchFilter, QVector<QUuid>& foundEntities)
const;
178 void evalEntitiesInSphereWithType(
const glm::vec3& position,
float radius, EntityTypes::EntityType type, PickFilter searchFilter, QVector<QUuid>& foundEntities)
const;
179 void evalEntitiesInSphereWithName(
const glm::vec3& position,
float radius,
const QString& name,
bool caseSensitive, PickFilter searchFilter, QVector<QUuid>& foundEntities)
const;
180 void evalEntitiesInCube(
const AACube& cube, PickFilter searchFilter, QVector<QUuid>& foundEntities)
const;
181 void evalEntitiesInBox(
const AABox& box, PickFilter searchFilter, QVector<QUuid>& foundEntities)
const;
182 void evalEntitiesInFrustum(
const ViewFrustum& frustum, PickFilter searchFilter, QVector<QUuid>& foundEntities)
const;
187 void getEntities(EntityItemFilter& filter, QVector<EntityItemPointer>& foundEntities);
189 EntityItemPointer getEntityWithID(uint32_t
id)
const;
190 EntityItemPointer getEntityWithEntityItemID(
const EntityItemID&
id)
const;
191 void getEntitiesInside(
const AACube& box, QVector<EntityItemPointer>& foundEntities);
193 void cleanupDomainAndNonOwnedEntities();
194 void cleanupEntities();
195 bool removeEntityItem(EntityItemPointer entity,
bool deletion =
false);
197 bool containsEntityBounds(EntityItemPointer entity)
const;
198 bool bestFitEntityBounds(EntityItemPointer entity)
const;
203 bool containsBounds(
const AACube& bounds)
const;
204 bool bestFitBounds(
const AACube& bounds)
const;
206 bool containsBounds(
const AABox& bounds)
const;
207 bool bestFitBounds(
const AABox& bounds)
const;
209 bool containsBounds(
const glm::vec3& minPoint,
const glm::vec3& maxPoint)
const;
210 bool bestFitBounds(
const glm::vec3& minPoint,
const glm::vec3& maxPoint)
const;
214 bool pruneChildren();
216 void expandExtentsToContents(Extents& extents);
218 EntityTreeElementPointer getThisPointer() {
219 return std::static_pointer_cast<EntityTreeElement>(shared_from_this());
221 OctreeElementPointer getThisOctreeElementPointer() {
222 return std::static_pointer_cast<OctreeElement>(shared_from_this());
224 const ConstOctreeElementPointer getConstThisOctreeElementPointer()
const {
225 return std::static_pointer_cast<const OctreeElement>(shared_from_this());
229 virtual void init(
unsigned char * octalCode)
override;
230 EntityTreePointer _myTree;
231 EntityItems _entityItems;
Utility for processing, packing, queueing and sending of outbound edit voxel messages.
Definition: EntityEditPacketSender.h:25
Abstract ID for editing model items. Used in EntityItem JS API.
Definition: EntityItemID.h:28
Definition: EntityItemProperties.h:106