Loading...
Searching...
No Matches
changeList.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the Apache License, Version 2.0 (the "Apache License")
5// with the following modification; you may not use this file except in
6// compliance with the Apache License and the following modification to it:
7// Section 6. Trademarks. is deleted and replaced with:
8//
9// 6. Trademarks. This License does not grant permission to use the trade
10// names, trademarks, service marks, or product names of the Licensor
11// and its affiliates, except as required to comply with Section 4(c) of
12// the License and to reproduce the content of the NOTICE file.
13//
14// You may obtain a copy of the Apache License at
15//
16// http://www.apache.org/licenses/LICENSE-2.0
17//
18// Unless required by applicable law or agreed to in writing, software
19// distributed under the Apache License with the above modification is
20// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21// KIND, either express or implied. See the Apache License for the specific
22// language governing permissions and limitations under the Apache License.
23//
24#ifndef PXR_USD_SDF_CHANGE_LIST_H
25#define PXR_USD_SDF_CHANGE_LIST_H
26
28
29#include "pxr/pxr.h"
30#include "pxr/usd/sdf/api.h"
31#include "pxr/usd/sdf/path.h"
32#include "pxr/usd/sdf/types.h"
34
35#include <set>
36#include <map>
37#include <unordered_map>
38#include <iosfwd>
39
40PXR_NAMESPACE_OPEN_SCOPE
41
42class SdfChangeList;
43typedef std::vector<
44 std::pair<SdfLayerHandle, SdfChangeList>
45 > SdfLayerChangeListVec;
46
53{
54public:
55
56 SdfChangeList() = default;
57 SDF_API SdfChangeList(SdfChangeList const &);
58 SdfChangeList(SdfChangeList &&) = default;
59 SDF_API SdfChangeList &operator=(SdfChangeList const &);
60 SdfChangeList &operator=(SdfChangeList &&) = default;
61
62 enum SubLayerChangeType {
63 SubLayerAdded,
64 SubLayerRemoved,
65 SubLayerOffset
66 };
67
68 void DidReplaceLayerContent();
69 void DidReloadLayerContent();
70 void DidChangeLayerResolvedPath();
71 void DidChangeLayerIdentifier(const std::string &oldIdentifier);
72 void DidChangeSublayerPaths(const std::string &subLayerPath,
73 SubLayerChangeType changeType);
74
75 void DidAddPrim(const SdfPath &primPath, bool inert);
76 void DidRemovePrim(const SdfPath &primPath, bool inert);
77 void DidMovePrim(const SdfPath &oldPath, const SdfPath &newPath);
78 void DidReorderPrims(const SdfPath &parentPath);
79 void DidChangePrimName(const SdfPath &oldPath, const SdfPath &newPath);
80 void DidChangePrimVariantSets(const SdfPath &primPath);
81 void DidChangePrimInheritPaths(const SdfPath &primPath);
82 void DidChangePrimReferences(const SdfPath &primPath);
83 void DidChangePrimSpecializes(const SdfPath &primPath);
84
85 void DidAddProperty(const SdfPath &propPath, bool hasOnlyRequiredFields);
86 void DidRemoveProperty(const SdfPath &propPath, bool hasOnlyRequiredFields);
87 void DidReorderProperties(const SdfPath &propPath);
88 void DidChangePropertyName(const SdfPath &oldPath, const SdfPath &newPath);
89
90 void DidChangeAttributeTimeSamples(const SdfPath &attrPath);
91 void DidChangeAttributeConnection(const SdfPath &attrPath);
92 void DidChangeRelationshipTargets(const SdfPath &relPath);
93 void DidAddTarget(const SdfPath &targetPath);
94 void DidRemoveTarget(const SdfPath &targetPath);
95
96 void DidChangeInfo(const SdfPath &path, const TfToken &key,
97 VtValue &&oldValue, const VtValue &newValue);
98
117 struct Entry {
118 // Map of info keys that have changed to (old, new) value pairs.
119 typedef std::pair<VtValue, VtValue> InfoChange;
120 // We usually change just a few fields on a spec in one go, so we store
121 // up to three locally (e.g. typeName, variability, default).
123 InfoChangeVec infoChanged;
124
127 InfoChangeVec::const_iterator
128 FindInfoChange(TfToken const &key) const {
129 InfoChangeVec::const_iterator iter = infoChanged.begin();
130 for (InfoChangeVec::const_iterator end = infoChanged.end();
131 iter != end; ++iter) {
132 if (iter->first == key) {
133 break;
134 }
135 }
136 return iter;
137 }
138
141 bool HasInfoChange(TfToken const &key) const {
142 return FindInfoChange(key) != infoChanged.end();
143 }
144
145 typedef std::pair<std::string, SubLayerChangeType> SubLayerChange;
146 std::vector<SubLayerChange> subLayerChanges;
147
148 // Empty if didRename is not set
149 SdfPath oldPath;
150
151 // Empty if didChangeIdentifier is not set
152 std::string oldIdentifier;
153
154 // Most changes are stored as simple bits.
155 struct _Flags {
156 _Flags() {
157 memset(this, 0, sizeof(*this));
158 }
159
160 // SdfLayer
161 bool didChangeIdentifier:1;
162 bool didChangeResolvedPath:1;
163 bool didReplaceContent:1;
164 bool didReloadContent:1;
165
166 // SdfLayer, SdfPrimSpec, SdfRelationshipTarget.
167 bool didReorderChildren:1;
168 bool didReorderProperties:1;
169
170 // SdfPrimSpec, SdfPropertySpec
171 bool didRename:1;
172
173 // SdfPrimSpec
174 bool didChangePrimVariantSets:1;
175 bool didChangePrimInheritPaths:1;
176 bool didChangePrimSpecializes:1;
177 bool didChangePrimReferences:1;
178
179 // SdfPropertySpec
180 bool didChangeAttributeTimeSamples:1;
181 bool didChangeAttributeConnection:1;
182 bool didChangeRelationshipTargets:1;
183 bool didAddTarget:1;
184 bool didRemoveTarget:1;
185
186 // SdfPrimSpec add/remove
187 bool didAddInertPrim:1;
188 bool didAddNonInertPrim:1;
189 bool didRemoveInertPrim:1;
190 bool didRemoveNonInertPrim:1;
191
192 // Property add/remove
193 bool didAddPropertyWithOnlyRequiredFields:1;
194 bool didAddProperty:1;
195 bool didRemovePropertyWithOnlyRequiredFields:1;
196 bool didRemoveProperty:1;
197 };
198
199 _Flags flags;
200 };
201
206
207public:
208 const EntryList & GetEntryList() const { return _entries; }
209
210 // Change accessors/mutators
211 SDF_API
212 Entry const &GetEntry( const SdfPath & ) const;
213
214 using const_iterator = EntryList::const_iterator;
215
216 SDF_API
217 const_iterator FindEntry(SdfPath const &) const;
218
219 const_iterator begin() const {
220 return _entries.begin();
221 }
222
223 const_iterator cbegin() const {
224 return _entries.cbegin();
225 }
226
227 const_iterator end() const {
228 return _entries.end();
229 }
230
231 const_iterator cend() const {
232 return _entries.cend();
233 }
234
235private:
236 friend void swap(SdfChangeList &a, SdfChangeList &b) {
237 a._entries.swap(b._entries);
238 a._entriesAccel.swap(b._entriesAccel);
239 }
240
241 Entry &_GetEntry(SdfPath const &);
242
243 // If no entry with `newPath` exists, create one. If an entry with
244 // `oldPath` exists, move its contents over `newPath`'s and erase it.
245 // Return a reference to `newPath`'s entry.
246 Entry &_MoveEntry(SdfPath const &oldPath, SdfPath const &newPath);
247
248 EntryList::iterator _MakeNonConstIterator(EntryList::const_iterator i);
249
250 Entry &_AddNewEntry(SdfPath const &path);
251
252 void _EraseEntry(SdfPath const &);
253
254 void _RebuildAccel();
255
256 EntryList _entries;
257 using _AccelTable = std::unordered_map<SdfPath, size_t, SdfPath::Hash>;
258 std::unique_ptr<_AccelTable> _entriesAccel;
259 static constexpr size_t _AccelThreshold = 64;
260};
261
262// Stream-output operator
263SDF_API std::ostream& operator<<(std::ostream&, const SdfChangeList &);
264
265PXR_NAMESPACE_CLOSE_SCOPE
266
267#endif // PXR_USD_SDF_CHANGE_LIST_H
A list of scene description modifications, organized by the namespace paths where the changes occur.
Definition: changeList.h:53
TfSmallVector< std::pair< SdfPath, Entry >, 1 > EntryList
Map of change entries at various paths in a layer.
Definition: changeList.h:205
A path value used to locate objects in layers or scenegraphs.
Definition: path.h:291
This is a small-vector class with local storage optimization, the local storage can be specified via ...
Definition: smallVector.h:179
void swap(TfSmallVector &rhs)
Swap two vector instances.
Definition: smallVector.h:330
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:88
Provides a container which may hold any type, and provides introspection and iteration over array typ...
Definition: value.h:165
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
Entry of changes at a single path in namespace.
Definition: changeList.h:117
bool HasInfoChange(TfToken const &key) const
Return true if this entry has an info change for key, false otherwise.
Definition: changeList.h:141
InfoChangeVec::const_iterator FindInfoChange(TfToken const &key) const
Return the iterator in infoChanged whose first element is key, or infoChanged.end() if there is no su...
Definition: changeList.h:128
Basic Sdf data types.