48 size_t curve_key_size = 0;
49 size_t curve_size = 0;
50 size_t curve_segment_size = 0;
52 size_t point_size = 0;
54 size_t patch_size = 0;
56 foreach (
Geometry *geom, scene->geometry) {
58 Mesh *mesh =
static_cast<Mesh *
>(geom);
60 vert_size += mesh->verts.size();
63 if (mesh->get_num_subd_faces()) {
64 Mesh::SubdFace last = mesh->get_subd_face(mesh->get_num_subd_faces() - 1);
68 if (mesh->patch_table) {
69 mesh->patch_table_offset = patch_size;
70 patch_size += mesh->patch_table->total_size();
75 Hair *hair =
static_cast<Hair *
>(geom);
77 curve_key_size += hair->get_curve_keys().size();
79 curve_segment_size += hair->num_segments();
90 progress.
set_status(
"Updating Mesh",
"Computing normals");
105 foreach (
Geometry *geom, scene->geometry) {
107 Mesh *mesh =
static_cast<Mesh *
>(geom);
109 if (mesh->shader_is_modified() || mesh->smooth_is_modified() ||
110 mesh->triangles_is_modified() || copy_all_data)
112 mesh->
pack_shaders(scene, &tri_shader[mesh->prim_offset]);
115 if (mesh->verts_is_modified() || copy_all_data) {
116 mesh->pack_normals(&vnormal[mesh->vert_offset]);
119 if (mesh->verts_is_modified() || mesh->triangles_is_modified() ||
120 mesh->vert_patch_uv_is_modified() || copy_all_data)
122 mesh->pack_verts(&tri_verts[mesh->vert_offset],
123 &tri_vindex[mesh->prim_offset],
124 &tri_patch[mesh->prim_offset],
125 &tri_patch_uv[mesh->vert_offset]);
135 progress.
set_status(
"Updating Mesh",
"Copying Mesh to device");
145 if (curve_segment_size != 0) {
146 progress.
set_status(
"Updating Mesh",
"Copying Curves to device");
156 foreach (
Geometry *geom, scene->geometry) {
158 Hair *hair =
static_cast<Hair *
>(geom);
160 bool curve_keys_co_modified = hair->curve_radius_is_modified() ||
161 hair->curve_keys_is_modified();
162 bool curve_data_modified = hair->curve_shader_is_modified() ||
163 hair->curve_first_key_is_modified();
165 if (!curve_keys_co_modified && !curve_data_modified && !copy_all_data) {
170 &curve_keys[hair->curve_key_offset],
171 &curves[hair->prim_offset],
172 &curve_segments[hair->curve_segment_offset]);
184 if (point_size != 0) {
185 progress.
set_status(
"Updating Mesh",
"Copying Point clouds to device");
190 foreach (
Geometry *geom, scene->geometry) {
206 progress.
set_status(
"Updating Mesh",
"Copying Patches to device");
210 foreach (
Geometry *geom, scene->geometry) {
212 Mesh *mesh =
static_cast<Mesh *
>(geom);
215 if (mesh->patch_table) {
216 mesh->patch_table->copy_adjusting_offsets(&patch_data[mesh->patch_table_offset],
217 mesh->patch_table_offset);