Enzo
Loading...
Searching...
No Matches
Primitive.h
1#pragma once
2#include "Engine/Operator/Attribute.h"
3#include "Engine/Operator/AttributeHandle.h"
4#include "Engine/Operator/Point.h"
5#include "Engine/Operator/Transform.h"
6#include "Engine/Types.h"
7#include <memory>
8#include <string>
9
10namespace enzo::geo {
11
25class Primitive {
26 public:
27 // Transform Iterator
28 struct PointOffsets {
29 PointOffsets(Primitive &primitive) : primitive_(primitive) {}
30 struct Iterator {
31 using iterator_category = std::forward_iterator_tag;
32 using difference_type = std::ptrdiff_t;
33 using value_type = ga::Offset;
34
35 value_type operator*() const { return curOffset_; }
36
37 Iterator(Primitive &primitive, ga::Offset current)
38 : primitive_(primitive), curOffset_(current) {}
39
40 // Prefix increment
41 Iterator &operator++() {
42 curOffset_++;
43 return *this;
44 }
45
46 // Postfix increment
47 Iterator operator++(int) {
48 Iterator tmp = *this;
49 ++(*this);
50 return tmp;
51 }
52
53 friend bool operator==(const Iterator &a, const Iterator &b) {
54 return a.curOffset_ == b.curOffset_;
55 };
56 friend bool operator!=(const Iterator &a, const Iterator &b) {
57 return a.curOffset_ != b.curOffset_;
58 };
59
60 private:
61 enzo::geo::Primitive &primitive_;
62 ga::Offset curOffset_ = 0;
63 };
64 Iterator begin() { return Iterator(primitive_, 0); }
65 Iterator end() { return Iterator(primitive_, primitive_.getNumPoints()); }
66
67 private:
68 enzo::geo::Primitive &primitive_;
69 };
70 Primitive();
71 Primitive(const Primitive &other);
72 Primitive &operator=(const Primitive &rhs);
73 virtual ~Primitive() = default;
74
75 virtual PrimType getType() const = 0;
76 virtual std::shared_ptr<Primitive> clone() const = 0;
77 virtual TransformClass transformType() const = 0;
78 virtual void applyTransform(const bt::Matrix4 &mat, TransformClass transformClass) = 0;
79 void applyTransform(const Transform &transform, TransformClass transformClass) {
80 applyTransform(transform.getMatrix(), transformClass);
81 }
82 virtual bool canMerge() const { return false; }
83 virtual void merge(std::shared_ptr<Primitive> other) {}
84 void incrementVersion();
85
86 virtual bool hasPoints() const { return false; }
87 virtual ga::Offset getNumPoints() const { return 0; }
88 virtual PointOffsets getPoints() { return PointOffsets(*this); }
89
90 ga::AttributeHandle<bt::intT> addIntAttribute(ga::AttributeOwner owner, std::string name,
91 bool intrinsic = false);
92 ga::AttributeHandleBool addBoolAttribute(ga::AttributeOwner owner, std::string name,
93 bool intrinsic = false);
94 ga::AttributeHandle<bt::Vector3> addVector3Attribute(ga::AttributeOwner owner, std::string name,
95 bool intrinsic = false);
96 ga::AttributeHandle<bt::Matrix4> addMatrix4Attribute(ga::AttributeOwner owner, std::string name,
97 bool intrinsic = false);
98
99 std::shared_ptr<ga::Attribute> getAttribByName(ga::AttributeOwner owner, std::string name,
100 bool includeIntrinsics = false);
101 const size_t getNumAttributes(const ga::AttributeOwner owner) const;
102 std::weak_ptr<const ga::Attribute> getAttributeByIndex(ga::AttributeOwner owner,
103 unsigned int index) const;
104 bool attributeExists(ga::AttributeOwner owner, std::string name);
105
106 bt::String getPath() const { return path_; };
107 void setPath(const bt::String &path) { path_ = path; };
108
109 protected:
110 virtual ga::attribVector &getAttributeStore(const ga::AttributeOwner &owner);
111 virtual const ga::attribVector &getAttributeStore(const ga::AttributeOwner &owner) const;
112 ga::attribVector deepCopyAttributes(ga::attribVector source);
113
114 std::string path_ = "/prim";
115 ga::attribVector pointAttributes_;
116 ga::attribVector primitiveAttributes_;
117};
118} // namespace enzo::geo
Basic attribute, parameter, and node types for Enzo.
size_t Offset
ga::Offset is the index of an element in a given AttributeOwner.
Definition Types.h:43
Definition Transform.h:7
Base class for all primitive types in the engine.
Definition Primitive.h:28