Enzo
Loading...
Searching...
No Matches
NodePacket.h
1#pragma once
2#include "Engine/Primitives/Primitive.h"
3#include <memory>
4#include <vector>
5
6namespace enzo {
7
9{
10 public:
11 // Lazy forward iterator that flattens transforms across all primitives.
12 // See NodePacket.cpp for Iterator method implementations.
14 {
15 struct Iterator
16 {
17 using iterator_category = std::forward_iterator_tag;
18 using difference_type = std::ptrdiff_t;
19 using value_type = Transform;
20
22 std::vector<geo::PrimPtr>& primitives,
23 TransformClass transformClass,
24 size_t primIdx
25 );
26
27 Transform operator*() const;
28 Iterator& operator++();
29 Iterator operator++(int);
30 friend bool operator==(const Iterator& a, const Iterator& b)
31 {
32 return a.primIdx_ == b.primIdx_ && a.offset_ == b.offset_;
33 }
34 friend bool operator!=(const Iterator& a, const Iterator& b) { return !(a == b); }
35
36 private:
37 std::vector<geo::PrimPtr>& primitives_;
38 TransformClass transformClass_;
39 size_t primIdx_;
40 Offset offset_ = 0;
41 std::shared_ptr<attr::Attribute> curAttrib_;
42 size_t curSize_ = 0;
43
44 void advance();
45 };
46
47 Transforms(std::vector<geo::PrimPtr>& primitives, TransformClass transformClass)
48 : primitives_(primitives), transformClass_(transformClass)
49 {
50 }
51
52 Iterator begin() { return Iterator(primitives_, transformClass_, 0); }
53 Iterator end() { return Iterator(primitives_, transformClass_, primitives_.size()); }
54
55 private:
56 std::vector<geo::PrimPtr>& primitives_;
57 TransformClass transformClass_;
58 };
59
60 void addPrimitive(std::shared_ptr<enzo::geo::Primitive> primitive);
61 void attemptMerge(geo::PrimPtr prim);
62
63 std::shared_ptr<enzo::geo::Primitive> getPrimitive(unsigned int index);
64 std::shared_ptr<const enzo::geo::Primitive> getPrimitive(unsigned int index) const;
65 geo::PrimPtr getPrimAtPath(const std::string& path);
66 std::shared_ptr<const geo::Primitive> getPrimAtPath(const std::string& path) const;
67
68 const std::vector<std::shared_ptr<enzo::geo::Primitive>>& getPrimitives() const
69 {
70 return primitives_;
71 }
72 std::vector<geo::PrimPtr> getPrimitives(enzo::geo::PrimType type) const;
73 void removePrim(std::string path);
74
75 Transforms getTransforms(TransformClass transformClass)
76 {
77 return Transforms(primitives_, transformClass);
78 }
79
80 size_t size() const;
81 NodePacket deepCopy() const;
82
83 private:
84 std::vector<geo::PrimPtr> primitives_;
85};
86
87} // namespace enzo
size_t Offset
enzo::Offset is the internal discontinuous index of an element in a given AttributeOwner.
Definition Types.h:100
Definition NodePacket.h:9
An affine transform that composes translation, rotation, and scale.
Definition NodePacket.h:16
Definition NodePacket.h:14