forked from blender/blender
Support several instancers on one object #24
@ -170,10 +170,10 @@ void BlenderSceneDelegate::add_update_object(Object *object)
|
|||||||
if ((object->transflag & OB_DUPLI) && InstancerData::supported(object)) {
|
if ((object->transflag & OB_DUPLI) && InstancerData::supported(object)) {
|
||||||
add_update_instancer(object);
|
add_update_instancer(object);
|
||||||
}
|
}
|
||||||
InstancerData *i_data = instancer_data(object);
|
//InstancerData *i_data = instancer_data(object);
|
||||||
if (i_data) {
|
//if (i_data) {
|
||||||
i_data->update();
|
// i_data->update();
|
||||||
}
|
//}
|
||||||
|
|
||||||
pxr::SdfPath id = ObjectData::prim_id(this, object);
|
pxr::SdfPath id = ObjectData::prim_id(this, object);
|
||||||
ObjectData *obj_data = object_data(id);
|
ObjectData *obj_data = object_data(id);
|
||||||
@ -197,7 +197,7 @@ void BlenderSceneDelegate::add_update_instancer(Object *object)
|
|||||||
i_data->update();
|
i_data->update();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
objects[id] = InstancerData::create(this, object);
|
instancers[id] = InstancerData::create(this, object);
|
||||||
i_data = instancer_data(id);
|
i_data = instancer_data(id);
|
||||||
i_data->update_visibility(view3d);
|
i_data->update_visibility(view3d);
|
||||||
}
|
}
|
||||||
@ -208,9 +208,8 @@ ObjectData *BlenderSceneDelegate::object_data(pxr::SdfPath const &id)
|
|||||||
if (it != objects.end()) {
|
if (it != objects.end()) {
|
||||||
return it->second.get();
|
return it->second.get();
|
||||||
}
|
}
|
||||||
it = objects.find(id.GetParentPath());
|
InstancerData *i_data = instancer_data(id.GetParentPath());
|
||||||
if (it != objects.end()) {
|
if (i_data) {
|
||||||
InstancerData *i_data = (InstancerData *)it->second.get();
|
|
||||||
return i_data->object_data(id);
|
return i_data->object_data(id);
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -237,18 +236,10 @@ MaterialData *BlenderSceneDelegate::material_data(pxr::SdfPath const &id)
|
|||||||
|
|
||||||
InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id)
|
InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id)
|
||||||
{
|
{
|
||||||
return dynamic_cast<InstancerData *>(object_data(id));
|
auto it = instancers.find(id);
|
||||||
|
if (it != instancers.end()) {
|
||||||
|
return it->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
InstancerData *BlenderSceneDelegate::instancer_data(Object *object)
|
|
||||||
{
|
|
||||||
//InstancerData *i_data;
|
|
||||||
//for (auto &it : objects) {
|
|
||||||
// i_data = dynamic_cast<InstancerData *>(it.second.get());
|
|
||||||
// if (i_data && i_data->is_base(object)) {
|
|
||||||
// return i_data;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,6 @@ class BlenderSceneDelegate : public pxr::HdSceneDelegate {
|
|||||||
LightData *light_data(pxr::SdfPath const &id);
|
LightData *light_data(pxr::SdfPath const &id);
|
||||||
MaterialData *material_data(pxr::SdfPath const &id);
|
MaterialData *material_data(pxr::SdfPath const &id);
|
||||||
InstancerData *instancer_data(pxr::SdfPath const &id);
|
InstancerData *instancer_data(pxr::SdfPath const &id);
|
||||||
InstancerData *instancer_data(Object *object);
|
|
||||||
|
|
||||||
void add_update_object(Object *object);
|
void add_update_object(Object *object);
|
||||||
void add_update_instancer(Object *object);
|
void add_update_instancer(Object *object);
|
||||||
@ -74,6 +73,7 @@ class BlenderSceneDelegate : public pxr::HdSceneDelegate {
|
|||||||
|
|
||||||
ObjectDataMap objects;
|
ObjectDataMap objects;
|
||||||
MaterialDataMap materials;
|
MaterialDataMap materials;
|
||||||
|
InstancerDataMap instancers;
|
||||||
std::unique_ptr<WorldData> world_data;
|
std::unique_ptr<WorldData> world_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -114,6 +114,18 @@ pxr::SdfPathVector InstancerData::prototypes()
|
|||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InstancerData::update(Object *object)
|
||||||
|
{
|
||||||
|
pxr::SdfPath path = ObjectData::prim_id(scene_delegate, object);
|
||||||
|
path = p_id.AppendElementString(path.GetName());
|
||||||
|
auto it = instances.find(path);
|
||||||
|
if (it == instances.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ObjectData *obj_data = it->second.obj_data.get();
|
||||||
|
obj_data->update();
|
||||||
|
}
|
||||||
|
|
||||||
void InstancerData::set_instances()
|
void InstancerData::set_instances()
|
||||||
{
|
{
|
||||||
transforms.clear();
|
transforms.clear();
|
||||||
|
@ -35,6 +35,7 @@ class InstancerData : public ObjectData {
|
|||||||
pxr::VtIntArray indices(pxr::SdfPath const &id);
|
pxr::VtIntArray indices(pxr::SdfPath const &id);
|
||||||
ObjectData *object_data(pxr::SdfPath const &id);
|
ObjectData *object_data(pxr::SdfPath const &id);
|
||||||
pxr::SdfPathVector prototypes();
|
pxr::SdfPathVector prototypes();
|
||||||
|
void update(Object *object);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void set_instances();
|
void set_instances();
|
||||||
@ -43,6 +44,9 @@ class InstancerData : public ObjectData {
|
|||||||
pxr::VtMatrix4dArray transforms;
|
pxr::VtMatrix4dArray transforms;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using InstancerDataMap =
|
||||||
|
pxr::TfHashMap<pxr::SdfPath, std::unique_ptr<InstancerData>, pxr::SdfPath::Hash>;
|
||||||
|
|
||||||
class InstanceMeshData : public MeshData {
|
class InstanceMeshData : public MeshData {
|
||||||
public:
|
public:
|
||||||
InstanceMeshData(BlenderSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &p_id);
|
InstanceMeshData(BlenderSceneDelegate *scene_delegate, Object *object, pxr::SdfPath const &p_id);
|
||||||
|
Loading…
Reference in New Issue
Block a user