1 // 2 // Copyright 2019 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_PCP_DYNAMIC_FILE_FORMAT_CONTEXT_H 25 #define PXR_USD_PCP_DYNAMIC_FILE_FORMAT_CONTEXT_H 26 27 #include "pxr/pxr.h" 28 #include "pxr/usd/pcp/api.h" 29 #include "pxr/usd/pcp/node.h" 30 31 PXR_NAMESPACE_OPEN_SCOPE 32 33 class PcpPrimIndex_StackFrame; 34 class PcpCache; 35 36 /// \class PcpDynamicFileFormatContext 37 /// 38 /// Context object for the current state of a prim index that is being built 39 /// that allows implementations of PcpDynamicFileFormatInterface to compose 40 /// field values when generating dynamic file format arguments. The context 41 /// allows us to iterate over all nodes that have already been composed looking 42 /// for the strongest opinion for a relevant field. 43 class PcpDynamicFileFormatContext 44 { 45 public: 46 using VtValueVector = std::vector<VtValue>; 47 48 PCP_API 49 ~PcpDynamicFileFormatContext() = default; 50 51 /// Compose the \p value of the given \p field and return its current 52 /// strongest opinion. For dictionary valued fields this will be a 53 /// dictionary containing the strongest value for each individual key. 54 /// Returns true if a value for the field was found. 55 PCP_API 56 bool ComposeValue(const TfToken &field, VtValue *value) const; 57 58 /// Compose the \p values of the given \p field returning all available 59 /// opinions ordered from strongest to weakest. For dictionary valued 60 /// fields, the dictionaries from each opinion are not composed together 61 /// at each step and are instead returned in the list as is. 62 /// Returns true if a value for the field was found. 63 /// 64 /// Note that this is slower than ComposeValue, especially for 65 /// non-dictionary valued fields, and should only be used if knowing more 66 /// than just the strongest value is necessary. 67 PCP_API 68 bool ComposeValueStack(const TfToken &field, 69 VtValueVector *values) const; 70 71 private: 72 // Callback function for ComposeValue. This callback function will 73 // be passed values for the field given to ComposeValue from 74 // strongest to weakest available opinion and is free to copy or 75 // swap out the value as desired. 76 using _ComposeFunction = std::function<void(VtValue &&)>; 77 78 /// Constructs a context. 79 /// \p parentNode and \p previousFrame are used to traverse the 80 /// current state of the prim index graph when composing the opinions on 81 /// fields. \p composedFieldNames is the set of field names that is 82 /// to be updated with the names of fields that ComposeValue and 83 /// ComposeValueStack are called on for dependency tracking. 84 PcpDynamicFileFormatContext( 85 const PcpNodeRef &parentNode, 86 PcpPrimIndex_StackFrame *previousFrame, 87 TfToken::Set *composedFieldNames); 88 /// Access to private constructor. Should only be called by prim indexing. 89 friend PcpDynamicFileFormatContext Pcp_CreateDynamicFileFormatContext( 90 const PcpNodeRef &, PcpPrimIndex_StackFrame *, TfToken::Set *); 91 92 /// Returns whether the given \p field is allowed to be used to generate 93 /// file format arguments. It can also return whether the value type of 94 /// the field is a dictionary if needed. 95 bool _IsAllowedFieldForArguments( 96 const TfToken &field, bool *fieldValueIsDictionary = nullptr) const; 97 98 private: 99 PcpNodeRef _parentNode; 100 PcpPrimIndex_StackFrame *_previousStackFrame; 101 102 // Cached names of fields that had values composed by this context. 103 TfToken::Set *_composedFieldNames; 104 }; 105 106 PXR_NAMESPACE_CLOSE_SCOPE 107 108 #endif // PXR_USD_PCP_DYNAMIC_FILE_FORMAT_CONTEXT_H 109