15#include <pxr/base/gf/quatf.h>
16#include <pxr/base/gf/vec2f.h>
17#include <pxr/base/gf/vec3f.h>
18#include <pxr/base/vt/array.h>
20#include <pxr/usd/sdf/types.h>
21#include <pxr/usd/sdf/valueTypeName.h>
22#include <pxr/usd/usd/timeCode.h>
23#include <pxr/usd/usdGeom/primvar.h>
24#include <pxr/usd/usdUtils/sparseValueWriter.h>
31inline const pxr::TfToken
displayColor(
"displayColor", pxr::TfToken::Immortal);
50template<
typename From,
typename To>
inline To
convert_value(
const From value)
57 return pxr::GfVec2f(value[0], value[1]);
61 return pxr::GfVec3f(value[0], value[1], value[2]);
65 return pxr::GfVec3f(value.
r, value.
g, value.
b);
69 return pxr::GfVec4f(value.
r, value.
g, value.
b, value.
a);
74 return pxr::GfVec3f(color4f.
r, color4f.
g, color4f.
b);
79 return pxr::GfVec4f(color4f.
r, color4f.
g, color4f.
b, color4f.
a);
83 return pxr::GfQuatf(value.
w, value.
x, value.
y, value.
z);
88 return float2(value[0], value[1]);
92 return float3(value[0], value[1], value[2]);
104 const pxr::GfVec3f &img = value.GetImaginary();
109template<
class T>
struct is_vt_array<pxr::VtArray<T>> : std::true_type {};
114 bool use_color3f_type =
false);
122template<
typename USDT>
125 pxr::UsdTimeCode time,
126 pxr::UsdUtilsSparseValueWriter &value_writer)
133 if (!attr.HasValue()) {
134 attr.Set(value, pxr::UsdTimeCode::Default());
137 value_writer.SetAttribute(attr, pxr::VtValue(value), time);
144template<
typename USDT>
146 pxr::VtArray<USDT> &value,
147 pxr::UsdTimeCode time,
148 pxr::UsdUtilsSparseValueWriter &value_writer)
150 if (!attr.HasValue()) {
151 attr.Set(value, pxr::UsdTimeCode::Default());
154 pxr::VtValue val = pxr::VtValue::Take(value);
155 value_writer.SetAttribute(attr, &val, time);
159template<
typename BlenderT,
typename USDT>
161 const pxr::UsdTimeCode time,
162 const pxr::UsdGeomPrimvar &primvar,
163 pxr::UsdUtilsSparseValueWriter &value_writer)
165 constexpr bool is_same = std::is_same_v<BlenderT, USDT>;
168 pxr::VtArray<USDT> usd_data;
169 if (
const std::optional<BlenderT> value = buffer.
get_if_single()) {
174 if constexpr (is_same || is_compatible) {
178 usd_data.resize(
data.size());
179 for (
const int i :
data.index_range()) {
190 const pxr::UsdTimeCode time,
191 const pxr::UsdGeomPrimvar &primvar,
192 pxr::UsdUtilsSparseValueWriter &value_writer);
195pxr::VtArray<T>
get_primvar_array(
const pxr::UsdGeomPrimvar &primvar,
const pxr::UsdTimeCode time)
197 pxr::VtValue primvar_val;
198 if (!primvar.ComputeFlattened(&primvar_val, time)) {
202 if (!primvar_val.CanCast<pxr::VtArray<T>>()) {
206 return primvar_val.Cast<pxr::VtArray<T>>().
template UncheckedGet<pxr::VtArray<T>>();
209template<
typename USDT,
typename BlenderT>
211 const pxr::UsdTimeCode time,
216 if (usd_data.empty()) {
220 constexpr bool is_same = std::is_same_v<USDT, BlenderT>;
223 const pxr::TfToken pv_interp = primvar.GetInterpolation();
224 if (pv_interp == pxr::UsdGeomTokens->constant) {
228 else if (pv_interp == pxr::UsdGeomTokens->faceVarying) {
229 if (!
faces.is_empty()) {
231 for (
const int i :
faces.index_range()) {
234 const int rev_index = face.
last(j);
240 if constexpr (is_same || is_compatible) {
241 const Span<USDT> src(usd_data.data(), usd_data.size());
253 if (usd_data.size() == attribute.
size()) {
254 if constexpr (is_same || is_compatible) {
255 const Span<USDT> src(usd_data.data(), usd_data.size());
268 const pxr::UsdTimeCode time,
BMesh const char void * data
constexpr int64_t last(const int64_t n=0) const
constexpr int64_t start() const
constexpr IndexRange index_range() const
constexpr int64_t size() const
constexpr void fill(const T &value) const
constexpr IndexRange index_range() const
constexpr void copy_from(Span< T > values) const
std::optional< T > get_if_single() const
BLI_INLINE ColorSceneLinear4f< Alpha > decode(const ColorSceneLinearByteEncoded4b< Alpha > &color)
To convert_value(const From value)
void copy_blender_attribute_to_primvar(const GVArray &attribute, const bke::AttrType data_type, const pxr::UsdTimeCode time, const pxr::UsdGeomPrimvar &primvar, pxr::UsdUtilsSparseValueWriter &value_writer)
pxr::VtArray< T > get_primvar_array(const pxr::UsdGeomPrimvar &primvar, const pxr::UsdTimeCode time)
std::optional< pxr::SdfValueTypeName > convert_blender_type_to_usd(const bke::AttrType blender_type, bool use_color3f_type)
void copy_blender_buffer_to_primvar(const VArray< BlenderT > &buffer, const pxr::UsdTimeCode time, const pxr::UsdGeomPrimvar &primvar, pxr::UsdUtilsSparseValueWriter &value_writer)
void copy_primvar_to_blender_attribute(const pxr::UsdGeomPrimvar &primvar, const pxr::UsdTimeCode time, const bke::AttrType data_type, const bke::AttrDomain domain, const OffsetIndices< int > face_indices, bke::MutableAttributeAccessor attributes)
void copy_primvar_to_blender_buffer(const pxr::UsdGeomPrimvar &primvar, const pxr::UsdTimeCode time, const OffsetIndices< int > faces, MutableSpan< BlenderT > attribute)
std::optional< bke::AttrType > convert_usd_type_to_blender(const pxr::SdfValueTypeName usd_type)
void set_attribute(const pxr::UsdAttribute &attr, const USDT value, pxr::UsdTimeCode time, pxr::UsdUtilsSparseValueWriter &value_writer)
QuaternionBase< float > Quaternion
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
ColorSceneLinearByteEncoded4b< eAlpha::Premultiplied > ColorGeometry4b
const pxr::TfToken displayColor("displayColor", pxr::TfToken::Immortal)