22 if (b_ob_info.
object_data.is_a(&RNA_Curves) || use_particle_hair) {
42 BL::Material material_override = view_layer.material_override;
43 Shader *default_shader = (b_ob.type() == BL::Object::type_VOLUME) ? scene->default_volume :
44 scene->default_surface;
46 array<Node *> used_shaders;
48 for (BL::MaterialSlot &b_slot : b_ob.material_slots) {
49 if (material_override) {
50 find_shader(material_override, used_shaders, default_shader);
53 BL::ID b_material(b_slot.material());
54 find_shader(b_material, used_shaders, default_shader);
58 if (used_shaders.
size() == 0) {
59 if (material_override) {
60 find_shader(material_override, used_shaders, default_shader);
70Geometry *BlenderSync::sync_geometry(BL::Depsgraph &b_depsgraph,
73 bool use_particle_hair,
82 GeometryKey key(b_key_id.ptr.data, geom_type);
85 array<Node *> used_shaders = find_used_shaders(b_ob_info.
iter_object);
88 Geometry *geom = geometry_map.find(key);
90 if (geometry_synced.find(geom) != geometry_synced.end()) {
100 geom = scene->create_node<Hair>();
103 geom = scene->create_node<
Volume>();
109 geom = scene->create_node<
Mesh>();
111 geometry_map.add(key, geom);
115 sync = geometry_map.update(geom, b_key_id);
125 else if (geom->get_used_shaders() != used_shaders) {
131 bool attribute_recalc =
false;
133 foreach (Node *node, geom->get_used_shaders()) {
136 attribute_recalc =
true;
140 if (!attribute_recalc) {
146 geometry_synced.insert(geom);
151 geom->set_used_shaders(used_shaders);
154 if (progress.get_cancel()) {
158 progress.set_sync_status(
"Synchronizing object", b_ob_info.
real_object.name());
161 Hair *hair =
static_cast<Hair *
>(geom);
162 sync_hair(b_depsgraph, b_ob_info, hair);
166 sync_volume(b_ob_info, volume);
170 sync_pointcloud(pointcloud, b_ob_info);
173 Mesh *mesh =
static_cast<Mesh *
>(geom);
174 sync_mesh(b_depsgraph, b_ob_info, mesh);
189void BlenderSync::sync_geometry_motion(BL::Depsgraph &b_depsgraph,
193 bool use_particle_hair,
197 Geometry *geom =
object->get_geometry();
199 if (geometry_motion_synced.find(geom) != geometry_motion_synced.end() ||
200 geometry_motion_attribute_synced.find(geom) != geometry_motion_attribute_synced.end())
205 geometry_motion_synced.insert(geom);
209 if (geometry_synced.find(geom) == geometry_synced.end()) {
215 if (motion_step < 0) {
220 if (progress.get_cancel()) {
224 if (b_ob_info.
object_data.is_a(&RNA_Curves) || use_particle_hair) {
225 Hair *hair =
static_cast<Hair *
>(geom);
226 sync_hair_motion(b_depsgraph, b_ob_info, hair, motion_step);
228 else if (b_ob_info.
object_data.is_a(&RNA_Volume) ||
233 else if (b_ob_info.
object_data.is_a(&RNA_PointCloud)) {
235 sync_pointcloud_motion(pointcloud, b_ob_info, motion_step);
238 Mesh *mesh =
static_cast<Mesh *
>(geom);
239 sync_mesh_motion(b_depsgraph, b_ob_info, mesh, motion_step);
struct PointCloud PointCloud
static CCL_NAMESPACE_BEGIN Geometry::Type determine_geom_type(BObjectInfo &b_ob_info, bool use_particle_hair)
int motion_step(float time) const
bool need_update_geometry() const
void push_back_slow(const T &t)
static BL::FluidDomainSettings object_fluid_gas_domain_find(BL::Object &b_ob)
#define CCL_NAMESPACE_END
static PyObject * sync_func(PyObject *, PyObject *args)
bool is_real_object_data() const
void push(TaskRunFunction &&task)