39 pxr::SdfPath
const &delegate_id,
42 : HdSceneDelegate(parent_index, delegate_id),
44 camera_delegate_(camera_delegate)
46 instancer_data_ = std::make_unique<InstancerData>(
this, instancer_prim_id());
47 world_data_ = std::make_unique<WorldData>(
this, world_prim_id());
54 return m_data->topology(
id);
71 ObjectData *obj_data = object_data(
id);
75 return pxr::GfMatrix4d();
81 ObjectData *obj_data = object_data(
id);
85 MaterialData *mat_data = material_data(
id);
93 return pxr::VtValue();
97 pxr::TfToken
const &key)
104 return pxr::VtValue();
108 pxr::SdfPath
const &
id, pxr::HdInterpolation interpolation)
113 return m_data->primvar_descriptors(interpolation);
123 return pxr::HdPrimvarDescriptorVector();
129 ObjectData *obj_data = object_data(rprim_id);
133 return pxr::SdfPath();
139 MaterialData *mat_data = material_data(
id);
143 return pxr::VtValue();
149 if (
id == world_prim_id()) {
156 return object_data(
id)->visible;
162 return mesh_data(
id)->double_sided(
id);
168 return mesh_data(
id)->cull_style(
id);
175 if (i_data && mesh_data(prim_id)) {
178 return pxr::SdfPath();
189 pxr::SdfPath
const &prototype_id)
193 return i_data->
indices(prototype_id);
204 pxr::SdfPath
const &volume_id)
213 bool is_populated =
depsgraph !=
nullptr;
224 set_light_shading_settings();
225 set_world_shading_settings();
227 world_data_->update();
233 for (
auto &obj_data : objects_.values()) {
237 instancer_data_->remove();
238 for (
auto &mat_data : materials_.values()) {
249pxr::SdfPath HydraSceneDelegate::prim_id(
const ID *
id,
const char *prefix)
const
254 return GetDelegateID().AppendElementString(
name);
257pxr::SdfPath HydraSceneDelegate::object_prim_id(
const Object *
object)
const
259 return prim_id((
ID *)
object,
"O");
262pxr::SdfPath HydraSceneDelegate::material_prim_id(
const Material *mat)
const
264 return prim_id((
ID *)mat,
"M");
267pxr::SdfPath HydraSceneDelegate::hair_prim_id(
Object *parent_obj,
const ParticleSystem *psys)
const
272 object_prim_id(parent_obj).GetName().c_str(),
273 prim_id((
ID *)psys,
"PS").GetName().c_str());
274 return GetDelegateID().AppendElementString(
name);
277pxr::SdfPath HydraSceneDelegate::instancer_prim_id()
const
279 return GetDelegateID().AppendElementString(
"Instancer");
282pxr::SdfPath HydraSceneDelegate::world_prim_id()
const
284 return GetDelegateID().AppendElementString(
"World");
287ObjectData *HydraSceneDelegate::object_data(pxr::SdfPath
const &
id)
const
289 if (
id == world_prim_id()) {
290 return world_data_.get();
292 auto name =
id.GetName();
296 const auto *obj_data = objects_.lookup_ptr(p_id);
298 return obj_data->get();
300 InstancerData *i_data = instancer_data(p_id,
true);
302 return i_data->object_data(
id);
307MeshData *HydraSceneDelegate::mesh_data(pxr::SdfPath
const &
id)
const
309 return dynamic_cast<MeshData *
>(object_data(
id));
312CurvesData *HydraSceneDelegate::curves_data(pxr::SdfPath
const &
id)
const
314 return dynamic_cast<CurvesData *
>(object_data(
id));
317VolumeData *HydraSceneDelegate::volume_data(pxr::SdfPath
const &
id)
const
319 return dynamic_cast<VolumeData *
>(object_data(
id));
322LightData *HydraSceneDelegate::light_data(pxr::SdfPath
const &
id)
const
324 return dynamic_cast<LightData *
>(object_data(
id));
327MaterialData *HydraSceneDelegate::material_data(pxr::SdfPath
const &
id)
const
329 const auto *mat_data = materials_.lookup_ptr(
id);
333 return mat_data->get();
336HairData *HydraSceneDelegate::hair_data(pxr::SdfPath
const &
id)
const
338 return dynamic_cast<HairData *
>(object_data(
id));
341InstancerData *HydraSceneDelegate::instancer_data(pxr::SdfPath
const &
id,
bool child_id)
const
347 int n =
id.GetPathElementCount();
349 p_id =
id.GetParentPath();
352 p_id =
id.GetParentPath().GetParentPath();
359 if (instancer_data_ && p_id == instancer_data_->prim_id) {
360 return instancer_data_.get();
365void HydraSceneDelegate::check_updates()
367 bool do_update_collection =
false;
368 bool do_update_world =
false;
370 if (set_world_shading_settings()) {
371 do_update_world =
true;
374 if (set_light_shading_settings()) {
375 do_update_collection =
true;
378 DEGIDIterData
data = {
nullptr};
380 data.only_updated =
true;
386 std::bitset<32>(id->recalc).to_string().c_str());
388 switch (
GS(id->name)) {
390 do_update_collection =
true;
394 MaterialData *mat_data = material_data(material_prim_id((
Material *)
id));
401 camera_delegate_->update(
id);
406 do_update_world =
true;
414 do_update_collection =
true;
417 do_update_world =
true;
428 if (do_update_world) {
429 world_data_->update();
431 if (do_update_collection) {
436void HydraSceneDelegate::update_collection()
438 Set<std::string> available_objects;
440 DEGObjectIterSettings settings = {
nullptr};
443 DEGObjectIterData
data = {
nullptr};
444 data.settings = &settings;
448 instancer_data_->pre_update();
450 auto update_psys = [
this, &available_objects](
Object *object) {
456 pxr::SdfPath
id = hair_prim_id(
object, psys);
457 HairData *h_data = hair_data(
id);
462 h_data =
dynamic_cast<HairData *
>(
463 objects_.lookup_or_add(
id, std::make_unique<HairData>(
this,
object,
id, psys))
468 available_objects.
add(
id.GetName());
473 auto update_object = [
this, &available_objects](
Object *object) {
480 available_objects.
add(object_prim_id(
object).GetName());
482 pxr::SdfPath
id = object_prim_id(
object);
483 ObjectData *obj_data = object_data(
id);
500 if (
data.dupli_object_current) {
501 DupliObject *dupli =
data.dupli_object_current;
509 instancer_data_->update_instance(dupli);
514 update_object(
object);
518 instancer_data_->post_update();
521 objects_.remove_if([&](
auto item) {
522 bool ret = !available_objects.
contains(item.key.GetName());
524 item.value->remove();
530 Set<pxr::SdfPath> available_materials;
531 for (
auto &val : objects_.values()) {
532 MeshData *
m_data =
dynamic_cast<MeshData *
>(val.get());
534 m_data->available_materials(available_materials);
536 CurvesData *c_data =
dynamic_cast<CurvesData *
>(val.get());
538 c_data->available_materials(available_materials);
540 VolumeData *v_data =
dynamic_cast<VolumeData *
>(val.get());
542 v_data->available_materials(available_materials);
545 instancer_data_->available_materials(available_materials);
547 materials_.remove_if([&](
auto item) {
548 bool ret = !available_materials.
contains(item.key);
550 item.value->remove();
556bool HydraSceneDelegate::set_light_shading_settings()
566bool 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 CLOG_DEBUG(clg_ref,...)
#define CLG_LOGREF_DECLARE_GLOBAL(var, id)
#define CLOG_INFO(clg_ref,...)
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
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
HydraSceneDelegate(pxr::HdRenderIndex *parent_index, pxr::SdfPath const &delegate_id, CameraDelegate *camera_delegate, bool use_materialx)
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