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_USD_RESOLVE_INFO_H
25 #define PXR_USD_USD_RESOLVE_INFO_H
26 
27 /// \file usd/resolveInfo.h
28 
29 #include "pxr/pxr.h"
30 #include "pxr/usd/usd/api.h"
31 #include "pxr/usd/usd/stage.h"
32 #include "pxr/usd/sdf/layerOffset.h"
33 #include "pxr/usd/sdf/path.h"
34 #include "pxr/usd/pcp/node.h"
35 
36 #include "pxr/base/tf/declarePtrs.h"
37 
38 #include <limits>
39 
40 PXR_NAMESPACE_OPEN_SCOPE
41 
42 
43 TF_DECLARE_WEAK_PTRS(PcpLayerStack);
44 
45 /// \enum UsdResolveInfoSource
46 ///
47 /// Describes the various sources of attribute values.
48 ///
49 /// For more details, see \ref Usd_ValueResolution.
50 ///
51 enum UsdResolveInfoSource
52 {
53     UsdResolveInfoSourceNone,            ///< No value
54 
55     UsdResolveInfoSourceFallback,        ///< Built-in fallback value
56     UsdResolveInfoSourceDefault,         ///< Attribute default value
57     UsdResolveInfoSourceTimeSamples,     ///< Attribute time samples
58     UsdResolveInfoSourceValueClips,      ///< Value clips
59 };
60 
61 /// \class UsdResolveInfo
62 ///
63 /// Container for information about the source of an attribute's value, i.e.
64 /// the 'resolved' location of the attribute.
65 ///
66 /// For more details, see \ref Usd_ValueResolution.
67 ///
68 class UsdResolveInfo
69 {
70 public:
UsdResolveInfo()71     UsdResolveInfo()
72         : _source(UsdResolveInfoSourceNone)
73         , _valueIsBlocked(false)
74     {
75     }
76 
77     /// Return the source of the associated attribute's value.
GetSource()78     UsdResolveInfoSource GetSource() const {
79         return _source;
80     }
81 
82     /// Return true if this UsdResolveInfo represents an attribute that has an
83     /// authored value opinion.  This will return `true` if there is *any*
84     /// authored value opinion, including a \ref Usd_AttributeBlocking "block"
85     ///
86     /// This is equivalent to `HasAuthoredValue() || ValueIsBlocked()`
HasAuthoredValueOpinion()87     bool HasAuthoredValueOpinion() const {
88         return
89             _source == UsdResolveInfoSourceDefault ||
90             _source == UsdResolveInfoSourceTimeSamples ||
91             _source == UsdResolveInfoSourceValueClips ||
92             _valueIsBlocked;
93     }
94 
95     /// Return true if this UsdResolveInfo represents an attribute that has an
96     /// authored value that is not \ref Usd_AttributeBlocking "blocked"
HasAuthoredValue()97     bool HasAuthoredValue() const {
98         return
99             _source == UsdResolveInfoSourceDefault ||
100             _source == UsdResolveInfoSourceTimeSamples ||
101             _source == UsdResolveInfoSourceValueClips;
102     }
103 
104     /// Return the node within the containing PcpPrimIndex that provided
105     /// the resolved value opinion.
GetNode()106     PcpNodeRef GetNode() const {
107         return _node;
108     }
109 
110     /// Return true if this UsdResolveInfo represents an attribute whose
111     /// value is blocked.
112     ///
113     /// \see UsdAttribute::Block()
ValueIsBlocked()114     bool ValueIsBlocked() const {
115         return _valueIsBlocked;
116     }
117 
118 private:
119     /// The LayerStack that provides the strongest value opinion.
120     ///
121     /// If \p source is either \p UsdResolveInfoSourceDefault
122     /// or \p UsdResolveInfoTimeSamples, the source will be a layer
123     /// in this LayerStack (\sa _layer).
124     ///
125     /// If \p source is UsdResolveInfoSourceValueClips, the source clips
126     /// will have been introduced in this LayerStack.
127     ///
128     /// Otherwise, this LayerStack will be invalid.
129     PcpLayerStackPtr _layerStack;
130 
131     /// The layer in \p layerStack that provides the strongest time sample or
132     /// default opinion.
133     ///
134     /// This is valid only if \p source is either
135     /// \p UsdResolveInfoSourceDefault or \p UsdResolveInfoTimeSamples.
136     SdfLayerHandle _layer;
137 
138     /// The node within the containing PcpPrimIndex that provided
139     /// the strongest value opinion.
140     PcpNodeRef _node;
141 
142     /// If \p source is \p UsdResolveInfoTimeSamples, the time
143     /// offset that maps time in the strongest resolved layer
144     /// to the stage.
145     /// If no offset applies, this will be the identity offset.
146     SdfLayerOffset _layerToStageOffset;
147 
148     /// The path to the prim that owns the attribute to query in
149     /// \p layerStack to retrieve the strongest value opinion.
150     ///
151     /// If \p source is either \p UsdResolveInfoSourceDefault or
152     /// \p UsdResolveInfoTimeSamples, this is the path to the prim
153     /// specs in \p layerStack that own the attribute spec containing
154     /// strongest value opinion.
155     ///
156     /// If \p source is UsdResolveInfoSourceValueClips, this is the
157     /// path to the prim that should be used to query clips for attribute
158     /// values.
159     SdfPath _primPathInLayerStack;
160 
161     /// The source of the associated attribute's value.
162     UsdResolveInfoSource _source;
163 
164     /// If \p source is \p UsdResolveInfoSourceNone or
165     /// \p UsdResolveInfoSourceFallback, this indicates whether or not
166     /// this due to the value being blocked.
167     bool _valueIsBlocked;
168 
169     friend class UsdAttribute;
170     friend class UsdStage;
171     friend class UsdStage_ResolveInfoAccess;
172     friend class UsdAttributeQuery;
173 };
174 
175 
176 PXR_NAMESPACE_CLOSE_SCOPE
177 
178 #endif // PXR_USD_USD_RESOLVE_INFO_H
179