38 pxr::SdfPath
const &delegate_id,
42 instancer_data_ = std::make_unique<InstancerData>(
this, instancer_prim_id());
43 world_data_ = std::make_unique<WorldData>(
this, world_prim_id());
50 return m_data->topology(
id);
67 ObjectData *obj_data = object_data(
id);
71 return pxr::GfMatrix4d();
77 ObjectData *obj_data = object_data(
id);
81 MaterialData *mat_data = material_data(
id);
89 return pxr::VtValue();
93 pxr::TfToken
const &key)
100 return pxr::VtValue();
104 pxr::SdfPath
const &
id, pxr::HdInterpolation interpolation)
109 return m_data->primvar_descriptors(interpolation);
119 return pxr::HdPrimvarDescriptorVector();
125 ObjectData *obj_data = object_data(rprim_id);
129 return pxr::SdfPath();
135 MaterialData *mat_data = material_data(
id);
139 return pxr::VtValue();
145 if (
id == world_prim_id()) {
152 return object_data(
id)->visible;
158 return mesh_data(
id)->double_sided(
id);
164 return mesh_data(
id)->cull_style(
id);
171 if (i_data && mesh_data(prim_id)) {
174 return pxr::SdfPath();
185 pxr::SdfPath
const &prototype_id)
189 return i_data->
indices(prototype_id);
200 pxr::SdfPath
const &volume_id)
209 bool is_populated =
depsgraph !=
nullptr;
220 set_light_shading_settings();
221 set_world_shading_settings();
223 world_data_->update();
229 for (
auto &obj_data : objects_.values()) {
233 instancer_data_->remove();
234 for (
auto &mat_data : materials_.values()) {
245pxr::SdfPath HydraSceneDelegate::prim_id(
const ID *
id,
const char *prefix)
const
249 SNPRINTF(name,
"%s_%p", prefix,
id);
250 return GetDelegateID().AppendElementString(name);
253pxr::SdfPath HydraSceneDelegate::object_prim_id(
const Object *
object)
const
255 return prim_id((
ID *)
object,
"O");
258pxr::SdfPath HydraSceneDelegate::material_prim_id(
const Material *mat)
const
260 return prim_id((
ID *)mat,
"M");
263pxr::SdfPath HydraSceneDelegate::hair_prim_id(
Object *parent_obj,
const ParticleSystem *psys)
const
268 object_prim_id(parent_obj).GetName().c_str(),
269 prim_id((
ID *)psys,
"PS").GetName().c_str());
270 return GetDelegateID().AppendElementString(name);
273pxr::SdfPath HydraSceneDelegate::instancer_prim_id()
const
275 return GetDelegateID().AppendElementString(
"Instancer");
278pxr::SdfPath HydraSceneDelegate::world_prim_id()
const
280 return GetDelegateID().AppendElementString(
"World");
283ObjectData *HydraSceneDelegate::object_data(pxr::SdfPath
const &
id)
const
285 if (
id == world_prim_id()) {
286 return world_data_.get();
288 auto name =
id.GetName();
289 pxr::SdfPath p_id = (
STRPREFIX(name.c_str(),
"SM_") ||
STRPREFIX(name.c_str(),
"VF_")) ?
292 const auto *obj_data = objects_.lookup_ptr(p_id);
294 return obj_data->get();
296 InstancerData *i_data = instancer_data(p_id,
true);
298 return i_data->object_data(
id);
303MeshData *HydraSceneDelegate::mesh_data(pxr::SdfPath
const &
id)
const
305 return dynamic_cast<MeshData *
>(object_data(
id));
308CurvesData *HydraSceneDelegate::curves_data(pxr::SdfPath
const &
id)
const
310 return dynamic_cast<CurvesData *
>(object_data(
id));
313VolumeData *HydraSceneDelegate::volume_data(pxr::SdfPath
const &
id)
const
315 return dynamic_cast<VolumeData *
>(object_data(
id));
318LightData *HydraSceneDelegate::light_data(pxr::SdfPath
const &
id)
const
320 return dynamic_cast<LightData *
>(object_data(
id));
323MaterialData *HydraSceneDelegate::material_data(pxr::SdfPath
const &
id)
const
325 const auto *mat_data = materials_.lookup_ptr(
id);
329 return mat_data->get();
332HairData *HydraSceneDelegate::hair_data(pxr::SdfPath
const &
id)
const
334 return dynamic_cast<HairData *
>(object_data(
id));
337InstancerData *HydraSceneDelegate::instancer_data(pxr::SdfPath
const &
id,
bool child_id)
const
343 int n =
id.GetPathElementCount();
345 p_id =
id.GetParentPath();
348 p_id =
id.GetParentPath().GetParentPath();
355 if (instancer_data_ && p_id == instancer_data_->prim_id) {
356 return instancer_data_.get();
361void HydraSceneDelegate::check_updates()
363 bool do_update_collection =
false;
364 bool do_update_world =
false;
366 if (set_world_shading_settings()) {
367 do_update_world =
true;
370 if (set_light_shading_settings()) {
371 do_update_collection =
true;
374 DEGIDIterData
data = {
nullptr};
376 data.only_updated =
true;
383 std::bitset<32>(id->recalc).to_string().c_str());
385 switch (
GS(id->name)) {
387 do_update_collection =
true;
391 MaterialData *mat_data = material_data(material_prim_id((
Material *)
id));
399 do_update_world =
true;
407 do_update_collection =
true;
410 do_update_world =
true;
421 if (do_update_world) {
422 world_data_->update();
424 if (do_update_collection) {
429void HydraSceneDelegate::update_collection()
431 Set<std::string> available_objects;
433 DEGObjectIterSettings settings = {
nullptr};
436 DEGObjectIterData
data = {
nullptr};
437 data.settings = &settings;
441 instancer_data_->pre_update();
443 auto update_psys = [
this, &available_objects](
Object *object) {
449 pxr::SdfPath
id = hair_prim_id(
object, psys);
450 HairData *h_data = hair_data(
id);
455 h_data =
dynamic_cast<HairData *
>(
456 objects_.lookup_or_add(
id, std::make_unique<HairData>(
this,
object,
id, psys))
461 available_objects.
add(
id.GetName());
466 auto update_object = [
this, &available_objects](
Object *object) {
473 available_objects.
add(object_prim_id(
object).GetName());
475 pxr::SdfPath
id = object_prim_id(
object);
476 ObjectData *obj_data = object_data(
id);
493 if (
data.dupli_object_current) {
494 DupliObject *dupli =
data.dupli_object_current;
502 instancer_data_->update_instance(dupli);
507 update_object(
object);
511 instancer_data_->post_update();
514 objects_.remove_if([&](
auto item) {
515 bool ret = !available_objects.
contains(item.key.GetName());
517 item.value->remove();
523 Set<pxr::SdfPath> available_materials;
524 for (
auto &val : objects_.values()) {
525 MeshData *
m_data =
dynamic_cast<MeshData *
>(val.get());
527 m_data->available_materials(available_materials);
529 CurvesData *c_data =
dynamic_cast<CurvesData *
>(val.get());
531 c_data->available_materials(available_materials);
533 VolumeData *v_data =
dynamic_cast<VolumeData *
>(val.get());
535 v_data->available_materials(available_materials);
538 instancer_data_->available_materials(available_materials);
540 materials_.remove_if([&](
auto item) {
541 bool ret = !available_materials.
contains(item.key);
543 item.value->remove();
549bool HydraSceneDelegate::set_light_shading_settings()
559bool HydraSceneDelegate::set_world_shading_settings()
bool psys_in_edit_mode(struct Depsgraph *depsgraph, const struct ParticleSystem *psys)
#define ITER_BEGIN(callback_begin, callback_next, callback_end, _data_in, _type, _instance)
#define LISTBASE_FOREACH(type, var, list)
#define SNPRINTF(dst, format,...)
#define CLG_LOGREF_DECLARE_GLOBAL(var, id)
#define CLOG_INFO(clg_ref, level,...)
void DEG_iterator_ids_begin(BLI_Iterator *iter, DEGIDIterData *data)
void DEG_iterator_objects_begin(BLI_Iterator *iter, DEGObjectIterData *data)
void DEG_iterator_objects_end(BLI_Iterator *iter)
void DEG_iterator_ids_end(BLI_Iterator *iter)
Main * DEG_get_bmain(const Depsgraph *graph)
#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_FLAGS
void DEG_iterator_objects_next(BLI_Iterator *iter)
void DEG_iterator_ids_next(BLI_Iterator *iter)
Scene * DEG_get_input_scene(const Depsgraph *graph)
struct ParticleSystem ParticleSystem
#define V3D_USES_SCENE_WORLD(v3d)
#define V3D_USES_SCENE_LIGHTS(v3d)
BMesh const char void * data
btAlignedObjectArray< btScalar > m_data
bool contains(const Key &key) const
pxr::HdBasisCurvesTopology topology() const
pxr::HdPrimvarDescriptorVector primvar_descriptors(pxr::HdInterpolation interpolation) const
static bool is_supported(const ParticleSystem *particle_system)
static bool is_visible(HydraSceneDelegate *scene_delegate, Object *object, ParticleSystem *particle_system)
pxr::VtValue GetMaterialResource(pxr::SdfPath const &material_id) override
bool GetVisible(pxr::SdfPath const &id) override
pxr::VtIntArray GetInstanceIndices(pxr::SdfPath const &instancer_id, pxr::SdfPath const &prototype_id) override
pxr::HdPrimvarDescriptorVector GetPrimvarDescriptors(pxr::SdfPath const &id, pxr::HdInterpolation interpolation) override
pxr::VtValue GetLightParamValue(pxr::SdfPath const &id, pxr::TfToken const &key) override
HydraSceneDelegate(pxr::HdRenderIndex *parent_index, pxr::SdfPath const &delegate_id, bool use_materialx)
pxr::HdVolumeFieldDescriptorVector GetVolumeFieldDescriptors(pxr::SdfPath const &volume_id) override
pxr::HdCullStyle GetCullStyle(pxr::SdfPath const &id) override
pxr::VtValue Get(pxr::SdfPath const &id, pxr::TfToken const &key) override
void populate(Depsgraph *depsgraph, View3D *v3d)
pxr::SdfPath GetMaterialId(pxr::SdfPath const &rprim_id) override
pxr::GfMatrix4d GetInstancerTransform(pxr::SdfPath const &instancer_id) override
pxr::HdBasisCurvesTopology GetBasisCurvesTopology(pxr::SdfPath const &id) override
pxr::GfMatrix4d GetTransform(pxr::SdfPath const &id) override
ShadingSettings shading_settings
pxr::SdfPath GetInstancerId(pxr::SdfPath const &prim_id) override
pxr::SdfPathVector GetInstancerPrototypes(pxr::SdfPath const &instancer_id) override
pxr::HdMeshTopology GetMeshTopology(pxr::SdfPath const &id) override
bool GetDoubleSided(pxr::SdfPath const &id) override
pxr::GfMatrix4d transform(pxr::SdfPath const &id) const
pxr::VtIntArray indices(pxr::SdfPath const &id) const
pxr::HdPrimvarDescriptorVector primvar_descriptors(pxr::HdInterpolation interpolation) const
pxr::VtValue get_data(pxr::TfToken const &key) const override
pxr::SdfPathVector prototypes() const
pxr::VtValue get_data(pxr::TfToken const &key) const override
pxr::VtValue get_material_resource() const
pxr::VtValue get_data(pxr::TfToken const &key) const override
pxr::GfMatrix4d transform
virtual pxr::SdfPath material_id() const
static bool is_visible(HydraSceneDelegate *scene_delegate, const Object *object, int mode=OB_VISIBLE_SELF)
static std::unique_ptr< ObjectData > create(HydraSceneDelegate *scene_delegate, const Object *object, pxr::SdfPath const &prim_id)
static bool is_supported(const Object *object)
virtual pxr::VtValue get_data(pxr::SdfPath const &id, pxr::TfToken const &key) const
pxr::HdVolumeFieldDescriptorVector field_descriptors() const
struct CLG_LogRef * LOG_HYDRA_SCENE
std::shared_ptr< const T > get(const GenericKey &key, FunctionRef< std::unique_ptr< T >()> compute_fn)
std::string studiolight_name
float studiolight_rotation
float studiolight_intensity
bool operator==(const ShadingSettings &other) const