2#include "Engine/Attribute/Attribute.h"
3#include "Engine/Attribute/AttributeHandle.h"
4#include "Engine/Attribute/Point.h"
5#include "Engine/Attribute/Transform.h"
34 using iterator_category = std::forward_iterator_tag;
35 using difference_type = std::ptrdiff_t;
38 value_type operator*()
const {
return curOffset_; }
41 : primitive_(primitive), curOffset_(current)
64 return a.curOffset_ == b.curOffset_;
68 return a.curOffset_ != b.curOffset_;
76 const Offset end = primitive_.getNumPoints();
77 while (curOffset_ < end && !primitive_.isValidPoint(curOffset_))
82 Iterator end() {
return Iterator(primitive_, primitive_.getNumPoints()); }
87 Primitive(std::string_view path =
"/prim");
88 Primitive(
const Primitive& other);
89 Primitive& operator=(
const Primitive& rhs);
90 virtual ~Primitive() =
default;
92 virtual PrimType getType()
const = 0;
93 virtual std::shared_ptr<Primitive> clone()
const = 0;
94 virtual TransformClass transformType()
const = 0;
95 virtual void applyTransform(
const Matrix4& mat, TransformClass transformClass) = 0;
96 void applyTransform(
const Transform& transform, TransformClass transformClass)
98 applyTransform(transform.getMatrix(), transformClass);
100 virtual bool canMerge()
const {
return false; }
101 virtual void merge(std::shared_ptr<Primitive> other) {}
102 void incrementVersion();
104 virtual bool hasPoints()
const {
return false; }
106 virtual PointOffsets getPoints() {
return PointOffsets(*
this); }
107 virtual bool isValidPoint(Offset offset)
const {
return true; }
108 virtual void deletePoints(
const std::vector<Offset>& pointOffsets) {}
121 bool intrinsic =
false,
122 bool isPrivate =
false
129 std::shared_ptr<attr::Attribute>
137 std::shared_ptr<const attr::Attribute> getAttribByName(
140 bool includeIntrinsics =
false
143 std::weak_ptr<const attr::Attribute>
161 const std::string& name,
162 const std::vector<Offset>& offsets
168 std::shared_ptr<attr::Attribute>
177 std::weak_ptr<const attr::Attribute>
184 return createGroup(attr::AttributeOwner::POINT, std::move(name));
190 return createGroup(attr::AttributeOwner::PRIMITIVE, std::move(name));
195 addToGroup(attr::AttributeOwner::POINT, name, offsets);
200 addToGroup(attr::AttributeOwner::PRIMITIVE, name, offsets);
203 String getPath()
const {
return path_; };
204 void setPath(
const String& path) { path_ = path; };
207 virtual attr::attribVector& getAttributeStore(
const attr::AttributeOwner& owner);
208 virtual const attr::attribVector& getAttributeStore(
const attr::AttributeOwner& owner)
const;
209 virtual attr::attribVector& getGroupStore(
const attr::AttributeOwner& owner);
210 virtual const attr::attribVector& getGroupStore(
const attr::AttributeOwner& owner)
const;
211 attr::attribVector deepCopyAttributes(attr::attribVector source);
219 std::string path_ =
"/prim";
220 attr::attribVector pointAttributes_;
221 attr::attribVector primitiveAttributes_;
222 attr::attribVector pointGroups_;
223 attr::attribVector primitiveGroups_;
226using PrimPtr = std::shared_ptr<Primitive>;
Basic attribute, parameter, and node types for Enzo.
size_t Offset
enzo::Offset is the internal discontinuous index of an element in a given AttributeOwner.
Definition Types.h:100
AttributeOwner
The segment of geometry that owns a particular attribute.
Definition Types.h:22
Read write accessor for enzo::attr::Attribute.
Base class for all primitive types in the engine.
attr::AttributeHandleBool createPrimitiveGroup(std::string name)
Creates a primitive group.
Definition Primitive.h:188
std::weak_ptr< const attr::Attribute > getGroupByIndex(attr::AttributeOwner owner, unsigned int index) const
Returns the group at the given index in the owner's group store.
Definition Primitive.cpp:206
std::shared_ptr< attr::Attribute > getGroupByName(attr::AttributeOwner owner, const std::string &name) const
Looks up a group by name.
Definition Primitive.cpp:191
size_t getElementCount(const attr::AttributeOwner &owner) const
Returns the number of elements in the given owner's store.
Definition Primitive.cpp:154
attr::AttributeHandleBool createGroup(attr::AttributeOwner owner, std::string name)
Creates a group on the given owner.
Definition Primitive.cpp:166
void addToPointGroup(const std::string &name, const std::vector< Offset > &offsets)
Marks the given offsets as members of the point group.
Definition Primitive.h:193
void addToPrimitiveGroup(const std::string &name, const std::vector< Offset > &offsets)
Marks the given offsets as members of the primitive group.
Definition Primitive.h:198
size_t getNumGroups(attr::AttributeOwner owner) const
Returns how many groups live on the given owner.
Definition Primitive.cpp:200
attr::AttributeHandleBool createPointGroup(std::string name)
Creates a point group.
Definition Primitive.h:182
virtual void defragment()
Compacts storage, removing entries marked invalid so offsets are contiguous again.
Definition Primitive.h:114
void addToGroup(attr::AttributeOwner owner, const std::string &name, const std::vector< Offset > &offsets)
Marks the given offsets as members of the group.
Definition Primitive.cpp:175
Definition Primitive.h:33
Definition Primitive.h:30