[Bf-blender-cvs] [56ba20e08a7] cycles_procedural_api: add some flags to detect geometry addition and removal
Kévin Dietrich
noreply at git.blender.org
Mon Oct 26 23:27:06 CET 2020
Commit: 56ba20e08a7f0dc7247d43f27cb81354eb838ec6
Author: Kévin Dietrich
Date: Wed Oct 14 14:33:40 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rB56ba20e08a7f0dc7247d43f27cb81354eb838ec6
add some flags to detect geometry addition and removal
===================================================================
M intern/cycles/render/geometry.cpp
M intern/cycles/render/geometry.h
M intern/cycles/render/scene.cpp
===================================================================
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 4359956bb73..7553e56a751 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -953,7 +953,7 @@ void GeometryManager::device_update_mesh(
if (geom->geometry_type == Geometry::MESH || geom->geometry_type == Geometry::VOLUME) {
Mesh *mesh = static_cast<Mesh *>(geom);
- if (mesh->shader_is_modified() || mesh->smooth_is_modified() || mesh->triangles_is_modified() || (device_update_flags & (DEVICE_TRIANGLES_NEEDS_REALLOC | DEVICE_VERTEX_NEEDS_REALLOC))) {
+ if (mesh->shader_is_modified() || mesh->smooth_is_modified() || mesh->triangles_is_modified() || (device_update_flags & DEVICE_CURVE_DATA_NEEDS_REALLOC)) {
//std::cerr << "-- pack shaders for : " << mesh->name << '\n';
//number_packed_shaders += 1;
tri_shader_modified = true;
@@ -965,7 +965,7 @@ void GeometryManager::device_update_mesh(
tri_patch_uv_modified |= mesh->vert_patch_uv_is_modified();
vnormal_modified |= mesh->triangles_is_modified() || mesh->verts_is_modified();
- if (mesh->triangles_is_modified() || mesh->verts_is_modified() || (device_update_flags & (DEVICE_TRIANGLES_NEEDS_REALLOC | DEVICE_VERTEX_NEEDS_REALLOC))) {
+ if (mesh->triangles_is_modified() || mesh->verts_is_modified() || (device_update_flags & DEVICE_MESH_DATA_NEEDS_REALLOC)) {
//std::cerr << "-- pack verts for : " << mesh->name << '\n';
//number_packed_verts += 1;
mesh->pack_normals(&vnormal[mesh->vert_offset]);
@@ -1258,8 +1258,7 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro
Volume *volume = static_cast<Volume *>(geom);
create_volume_mesh(volume, progress);
- device_update_flags |= DEVICE_VERTEX_NEEDS_REALLOC;
- device_update_flags |= DEVICE_TRIANGLES_NEEDS_REALLOC;
+ device_update_flags |= DEVICE_MESH_DATA_NEEDS_REALLOC;
}
if (geom->is_hair()) {
@@ -1278,7 +1277,7 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro
}
}
- //geom->print_modified_sockets();
+ geom->print_modified_sockets();
if (geom->is_mesh()) {
Mesh *mesh = static_cast<Mesh *>(geom);
@@ -1295,7 +1294,15 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro
}
}
- //std::cerr << "device_update_flags: " << device_update_flags << '\n';
+ if (update_flags & (MESH_ADDED | MESH_REMOVED)) {
+ device_update_flags |= DEVICE_MESH_DATA_NEEDS_REALLOC;
+ }
+
+ if (update_flags & (HAIR_ADDED | HAIR_REMOVED)) {
+ device_update_flags |= DEVICE_CURVE_DATA_NEEDS_REALLOC;
+ }
+
+ std::cerr << "device_update_flags: " << device_update_flags << '\n';
need_flags_update = false;
}
@@ -1409,7 +1416,9 @@ void GeometryManager::device_update(Device *device,
if (shader->need_update_displacement) {
// todo: tag all displacement related sockets as modified
- geom->tag_modified();
+ if (geom->is_mesh()) {
+ geom->tag_modified();
+ }
}
}
@@ -1426,8 +1435,7 @@ void GeometryManager::device_update(Device *device,
}
/* Test if we need tessellation. */
- if (mesh->subdivision_type != Mesh::SUBDIVISION_NONE && mesh->num_subd_verts == 0 &&
- mesh->get_subd_params()) {
+ if (mesh->subdivision_type != Mesh::SUBDIVISION_NONE && mesh->get_subd_params() && (mesh->verts_is_modified() || mesh->subd_dicing_rate_is_modified() || mesh->subd_max_level_is_modified())) {
total_tess_needed++;
}
@@ -1463,8 +1471,7 @@ void GeometryManager::device_update(Device *device,
}
Mesh *mesh = static_cast<Mesh *>(geom);
- if (mesh->subdivision_type != Mesh::SUBDIVISION_NONE && mesh->num_subd_verts == 0 &&
- mesh->get_subd_params()) {
+ if (mesh->subdivision_type != Mesh::SUBDIVISION_NONE && mesh->get_subd_params() && (mesh->verts_is_modified() || mesh->subd_dicing_rate_is_modified() || mesh->subd_max_level_is_modified())) {
string msg = "Tessellating ";
if (mesh->name == "")
msg += string_printf("%u/%u", (uint)(i + 1), (uint)total_tess_needed);
@@ -1478,6 +1485,8 @@ void GeometryManager::device_update(Device *device,
DiagSplit dsplit(*mesh->subd_params);
mesh->tessellate(&dsplit);
+ device_update_flags |= DEVICE_MESH_DATA_NEEDS_REALLOC;
+
i++;
if (progress.get_cancel())
@@ -1651,6 +1660,7 @@ void GeometryManager::device_update(Device *device,
}
need_update = false;
+ update_flags = 0;
if (true_displacement_used) {
/* Re-tag flags for update, so they're re-evaluated
diff --git a/intern/cycles/render/geometry.h b/intern/cycles/render/geometry.h
index 31a6ad939d9..2b19d8e1b6d 100644
--- a/intern/cycles/render/geometry.h
+++ b/intern/cycles/render/geometry.h
@@ -161,12 +161,23 @@ class GeometryManager {
DEVICE_TRIANGLES_NEEDS_REALLOC = (1 << 1),
DEVICE_CURVES_NEEDS_REALLOC = (1 << 2),
DEVICE_CURVE_KEYS_NEEDS_REALLOC = (1 << 3),
+
+ DEVICE_MESH_DATA_NEEDS_REALLOC = (DEVICE_VERTEX_NEEDS_REALLOC | DEVICE_TRIANGLES_NEEDS_REALLOC),
+ DEVICE_CURVE_DATA_NEEDS_REALLOC = (DEVICE_CURVES_NEEDS_REALLOC | DEVICE_CURVE_KEYS_NEEDS_REALLOC),
};
DeviceUpdateFlags device_update_flags;
public:
+ enum {
+ MESH_ADDED = (1 << 0),
+ MESH_REMOVED = (1 << 1),
+ HAIR_ADDED = (1 << 2),
+ HAIR_REMOVED = (1 << 3),
+ };
+
/* Update Flags */
+ uint32_t update_flags = 0;
bool need_update;
bool need_flags_update;
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 93855ab2740..16fe11530b8 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -618,6 +618,7 @@ template<> Mesh *Scene::create_node<Mesh>()
node->set_owner(this);
geometry.push_back(node);
geometry_manager->tag_update(this);
+ geometry_manager->update_flags |= GeometryManager::MESH_ADDED;
return node;
}
@@ -627,6 +628,7 @@ template<> Hair *Scene::create_node<Hair>()
node->set_owner(this);
geometry.push_back(node);
geometry_manager->tag_update(this);
+ geometry_manager->update_flags |= GeometryManager::HAIR_ADDED;
return node;
}
@@ -636,6 +638,7 @@ template<> Volume *Scene::create_node<Volume>()
node->set_owner(this);
geometry.push_back(node);
geometry_manager->tag_update(this);
+ geometry_manager->update_flags |= GeometryManager::MESH_ADDED;
return node;
}
@@ -698,22 +701,32 @@ template<> void Scene::delete_node_impl(Mesh *node)
{
delete_node_from_array(geometry, static_cast<Geometry *>(node));
geometry_manager->tag_update(this);
+ geometry_manager->update_flags |= GeometryManager::MESH_REMOVED;
}
template<> void Scene::delete_node_impl(Hair *node)
{
delete_node_from_array(geometry, static_cast<Geometry *>(node));
geometry_manager->tag_update(this);
+ geometry_manager->update_flags |= GeometryManager::HAIR_REMOVED;
}
template<> void Scene::delete_node_impl(Volume *node)
{
delete_node_from_array(geometry, static_cast<Geometry *>(node));
geometry_manager->tag_update(this);
+ geometry_manager->update_flags |= GeometryManager::MESH_REMOVED;
}
template<> void Scene::delete_node_impl(Geometry *node)
{
+ if (node->is_hair()) {
+ geometry_manager->update_flags |= GeometryManager::HAIR_REMOVED;
+ }
+ else {
+ geometry_manager->update_flags |= GeometryManager::MESH_REMOVED;
+ }
+
delete_node_from_array(geometry, node);
geometry_manager->tag_update(this);
}
More information about the Bf-blender-cvs
mailing list