2 * Copyright 2011-2013 Blender Foundation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "bvh/bvh_build.h"
20 #include "render/camera.h"
21 #include "render/curves.h"
22 #include "device/device.h"
23 #include "render/graph.h"
24 #include "render/shader.h"
25 #include "render/light.h"
26 #include "render/mesh.h"
27 #include "render/nodes.h"
28 #include "render/object.h"
29 #include "render/scene.h"
31 #include "kernel/osl/osl_globals.h"
33 #include "subd/subd_split.h"
34 #include "subd/subd_patch_table.h"
36 #include "util/util_foreach.h"
37 #include "util/util_logging.h"
38 #include "util/util_progress.h"
39 #include "util/util_set.h"
45 void Mesh::Triangle::bounds_grow(const float3 *verts, BoundBox& bounds) const
47 bounds.grow(verts[v[0]]);
48 bounds.grow(verts[v[1]]);
49 bounds.grow(verts[v[2]]);
52 void Mesh::Triangle::motion_verts(const float3 *verts,
53 const float3 *vert_steps,
57 float3 r_verts[3]) const
59 /* Figure out which steps we need to fetch and their interpolation factor. */
60 const size_t max_step = num_steps - 1;
61 const size_t step = min((int)(time * max_step), max_step - 1);
62 const float t = time*max_step - step;
63 /* Fetch vertex coordinates. */
78 /* Interpolate between steps. */
79 r_verts[0] = (1.0f - t)*curr_verts[0] + t*next_verts[0];
80 r_verts[1] = (1.0f - t)*curr_verts[1] + t*next_verts[1];
81 r_verts[2] = (1.0f - t)*curr_verts[2] + t*next_verts[2];
84 void Mesh::Triangle::verts_for_step(const float3 *verts,
85 const float3 *vert_steps,
89 float3 r_verts[3]) const
91 const size_t center_step = ((num_steps - 1) / 2);
92 if(step == center_step) {
93 /* Center step: regular vertex location. */
94 r_verts[0] = verts[v[0]];
95 r_verts[1] = verts[v[1]];
96 r_verts[2] = verts[v[2]];
99 /* Center step not stored in the attribute array array. */
100 if(step > center_step) {
103 size_t offset = step * num_verts;
104 r_verts[0] = vert_steps[offset + v[0]];
105 r_verts[1] = vert_steps[offset + v[1]];
106 r_verts[2] = vert_steps[offset + v[2]];
112 void Mesh::Curve::bounds_grow(const int k, const float3 *curve_keys, const float *curve_radius, BoundBox& bounds) const
116 P[0] = curve_keys[max(first_key + k - 1,first_key)];
117 P[1] = curve_keys[first_key + k];
118 P[2] = curve_keys[first_key + k + 1];
119 P[3] = curve_keys[min(first_key + k + 2, first_key + num_keys - 1)];
124 curvebounds(&lower.x, &upper.x, P, 0);
125 curvebounds(&lower.y, &upper.y, P, 1);
126 curvebounds(&lower.z, &upper.z, P, 2);
128 float mr = max(curve_radius[first_key + k], curve_radius[first_key + k + 1]);
130 bounds.grow(lower, mr);
131 bounds.grow(upper, mr);
134 void Mesh::Curve::bounds_grow(const int k,
135 const float3 *curve_keys,
136 const float *curve_radius,
137 const Transform& aligned_space,
138 BoundBox& bounds) const
142 P[0] = curve_keys[max(first_key + k - 1,first_key)];
143 P[1] = curve_keys[first_key + k];
144 P[2] = curve_keys[first_key + k + 1];
145 P[3] = curve_keys[min(first_key + k + 2, first_key + num_keys - 1)];
147 P[0] = transform_point(&aligned_space, P[0]);
148 P[1] = transform_point(&aligned_space, P[1]);
149 P[2] = transform_point(&aligned_space, P[2]);
150 P[3] = transform_point(&aligned_space, P[3]);
155 curvebounds(&lower.x, &upper.x, P, 0);
156 curvebounds(&lower.y, &upper.y, P, 1);
157 curvebounds(&lower.z, &upper.z, P, 2);
159 float mr = max(curve_radius[first_key + k], curve_radius[first_key + k + 1]);
161 bounds.grow(lower, mr);
162 bounds.grow(upper, mr);
165 void Mesh::Curve::bounds_grow(float4 keys[4], BoundBox& bounds) const
168 float4_to_float3(keys[0]),
169 float4_to_float3(keys[1]),
170 float4_to_float3(keys[2]),
171 float4_to_float3(keys[3]),
177 curvebounds(&lower.x, &upper.x, P, 0);
178 curvebounds(&lower.y, &upper.y, P, 1);
179 curvebounds(&lower.z, &upper.z, P, 2);
181 float mr = max(keys[1].w, keys[2].w);
183 bounds.grow(lower, mr);
184 bounds.grow(upper, mr);
187 void Mesh::Curve::motion_keys(const float3 *curve_keys,
188 const float *curve_radius,
189 const float3 *key_steps,
190 size_t num_curve_keys,
193 size_t k0, size_t k1,
194 float4 r_keys[2]) const
196 /* Figure out which steps we need to fetch and their interpolation factor. */
197 const size_t max_step = num_steps - 1;
198 const size_t step = min((int)(time * max_step), max_step - 1);
199 const float t = time*max_step - step;
200 /* Fetch vertex coordinates. */
203 keys_for_step(curve_keys,
211 keys_for_step(curve_keys,
219 /* Interpolate between steps. */
220 r_keys[0] = (1.0f - t)*curr_keys[0] + t*next_keys[0];
221 r_keys[1] = (1.0f - t)*curr_keys[1] + t*next_keys[1];
224 void Mesh::Curve::cardinal_motion_keys(const float3 *curve_keys,
225 const float *curve_radius,
226 const float3 *key_steps,
227 size_t num_curve_keys,
230 size_t k0, size_t k1,
231 size_t k2, size_t k3,
232 float4 r_keys[4]) const
234 /* Figure out which steps we need to fetch and their interpolation factor. */
235 const size_t max_step = num_steps - 1;
236 const size_t step = min((int)(time * max_step), max_step - 1);
237 const float t = time*max_step - step;
238 /* Fetch vertex coordinates. */
241 cardinal_keys_for_step(curve_keys,
249 cardinal_keys_for_step(curve_keys,
257 /* Interpolate between steps. */
258 r_keys[0] = (1.0f - t)*curr_keys[0] + t*next_keys[0];
259 r_keys[1] = (1.0f - t)*curr_keys[1] + t*next_keys[1];
260 r_keys[2] = (1.0f - t)*curr_keys[2] + t*next_keys[2];
261 r_keys[3] = (1.0f - t)*curr_keys[3] + t*next_keys[3];
264 void Mesh::Curve::keys_for_step(const float3 *curve_keys,
265 const float *curve_radius,
266 const float3 *key_steps,
267 size_t num_curve_keys,
270 size_t k0, size_t k1,
271 float4 r_keys[2]) const
274 k1 = min(k1, num_keys - 1);
275 const size_t center_step = ((num_steps - 1) / 2);
276 if(step == center_step) {
277 /* Center step: regular key location. */
278 /* TODO(sergey): Consider adding make_float4(float3, float)
281 r_keys[0] = make_float4(curve_keys[first_key + k0].x,
282 curve_keys[first_key + k0].y,
283 curve_keys[first_key + k0].z,
284 curve_radius[first_key + k0]);
285 r_keys[1] = make_float4(curve_keys[first_key + k1].x,
286 curve_keys[first_key + k1].y,
287 curve_keys[first_key + k1].z,
288 curve_radius[first_key + k1]);
291 /* Center step is not stored in this array. */
292 if(step > center_step) {
295 const size_t offset = first_key + step * num_curve_keys;
296 r_keys[0] = make_float4(key_steps[offset + k0].x,
297 key_steps[offset + k0].y,
298 key_steps[offset + k0].z,
299 curve_radius[first_key + k0]);
300 r_keys[1] = make_float4(key_steps[offset + k1].x,
301 key_steps[offset + k1].y,
302 key_steps[offset + k1].z,
303 curve_radius[first_key + k1]);
307 void Mesh::Curve::cardinal_keys_for_step(const float3 *curve_keys,
308 const float *curve_radius,
309 const float3 *key_steps,
310 size_t num_curve_keys,
313 size_t k0, size_t k1,
314 size_t k2, size_t k3,
315 float4 r_keys[4]) const
318 k3 = min(k3, num_keys - 1);
319 const size_t center_step = ((num_steps - 1) / 2);
320 if(step == center_step) {
321 /* Center step: regular key location. */
322 r_keys[0] = make_float4(curve_keys[first_key + k0].x,
323 curve_keys[first_key + k0].y,
324 curve_keys[first_key + k0].z,
325 curve_radius[first_key + k0]);
326 r_keys[1] = make_float4(curve_keys[first_key + k1].x,
327 curve_keys[first_key + k1].y,
328 curve_keys[first_key + k1].z,
329 curve_radius[first_key + k1]);
330 r_keys[2] = make_float4(curve_keys[first_key + k2].x,
331 curve_keys[first_key + k2].y,
332 curve_keys[first_key + k2].z,
333 curve_radius[first_key + k2]);
334 r_keys[3] = make_float4(curve_keys[first_key + k3].x,
335 curve_keys[first_key + k3].y,
336 curve_keys[first_key + k3].z,
337 curve_radius[first_key + k3]);
340 /* Center step is not stored in this array. */
341 if(step > center_step) {
344 const size_t offset = first_key + step * num_curve_keys;
345 r_keys[0] = make_float4(key_steps[offset + k0].x,
346 key_steps[offset + k0].y,
347 key_steps[offset + k0].z,
348 curve_radius[first_key + k0]);
349 r_keys[1] = make_float4(key_steps[offset + k1].x,
350 key_steps[offset + k1].y,
351 key_steps[offset + k1].z,
352 curve_radius[first_key + k1]);
353 r_keys[2] = make_float4(key_steps[offset + k2].x,
354 key_steps[offset + k2].y,
355 key_steps[offset + k2].z,
356 curve_radius[first_key + k2]);
357 r_keys[3] = make_float4(key_steps[offset + k3].x,
358 key_steps[offset + k3].y,
359 key_steps[offset + k3].z,
360 curve_radius[first_key + k3]);
366 float3 Mesh::SubdFace::normal(const Mesh *mesh) const
368 float3 v0 = mesh->verts[mesh->subd_face_corners[start_corner+0]];
369 float3 v1 = mesh->verts[mesh->subd_face_corners[start_corner+1]];
370 float3 v2 = mesh->verts[mesh->subd_face_corners[start_corner+2]];
372 return safe_normalize(cross(v1 - v0, v2 - v0));
379 NodeType* type = NodeType::add("mesh", create);
381 SOCKET_UINT(motion_steps, "Motion Steps", 3);
382 SOCKET_BOOLEAN(use_motion_blur, "Use Motion Blur", false);
384 SOCKET_INT_ARRAY(triangles, "Triangles", array<int>());
385 SOCKET_POINT_ARRAY(verts, "Vertices", array<float3>());
386 SOCKET_INT_ARRAY(shader, "Shader", array<int>());
387 SOCKET_BOOLEAN_ARRAY(smooth, "Smooth", array<bool>());
389 SOCKET_POINT_ARRAY(curve_keys, "Curve Keys", array<float3>());
390 SOCKET_FLOAT_ARRAY(curve_radius, "Curve Radius", array<float>());
391 SOCKET_INT_ARRAY(curve_first_key, "Curve First Key", array<int>());
392 SOCKET_INT_ARRAY(curve_shader, "Curve Shader", array<int>());
401 need_update_rebuild = false;
402 transform_applied = false;
403 transform_negative_scaled = false;
404 transform_normal = transform_identity();
405 bounds = BoundBox::empty;
421 attributes.triangle_mesh = this;
422 curve_attributes.curve_mesh = this;
423 subd_attributes.subd_mesh = this;
425 geometry_flags = GEOMETRY_NONE;
428 has_surface_bssrdf = false;
432 subdivision_type = SUBDIVISION_NONE;
445 void Mesh::resize_mesh(int numverts, int numtris)
447 verts.resize(numverts);
448 triangles.resize(numtris * 3);
449 shader.resize(numtris);
450 smooth.resize(numtris);
452 if(subd_faces.size()) {
453 triangle_patch.resize(numtris);
454 vert_patch_uv.resize(numverts);
460 void Mesh::reserve_mesh(int numverts, int numtris)
462 /* reserve space to add verts and triangles later */
463 verts.reserve(numverts);
464 triangles.reserve(numtris * 3);
465 shader.reserve(numtris);
466 smooth.reserve(numtris);
468 if(subd_faces.size()) {
469 triangle_patch.reserve(numtris);
470 vert_patch_uv.reserve(numverts);
473 attributes.resize(true);
476 void Mesh::resize_curves(int numcurves, int numkeys)
478 curve_keys.resize(numkeys);
479 curve_radius.resize(numkeys);
480 curve_first_key.resize(numcurves);
481 curve_shader.resize(numcurves);
483 curve_attributes.resize();
486 void Mesh::reserve_curves(int numcurves, int numkeys)
488 curve_keys.reserve(numkeys);
489 curve_radius.reserve(numkeys);
490 curve_first_key.reserve(numcurves);
491 curve_shader.reserve(numcurves);
493 curve_attributes.resize(true);
496 void Mesh::resize_subd_faces(int numfaces, int num_ngons_, int numcorners)
498 subd_faces.resize(numfaces);
499 subd_face_corners.resize(numcorners);
500 num_ngons = num_ngons_;
502 subd_attributes.resize();
505 void Mesh::reserve_subd_faces(int numfaces, int num_ngons_, int numcorners)
507 subd_faces.reserve(numfaces);
508 subd_face_corners.reserve(numcorners);
509 num_ngons = num_ngons_;
511 subd_attributes.resize(true);
516 /* clear all verts and triangles */
522 triangle_patch.clear();
523 vert_patch_uv.clear();
526 curve_radius.clear();
527 curve_first_key.clear();
528 curve_shader.clear();
531 subd_face_corners.clear();
535 subd_creases.clear();
538 curve_attributes.clear();
539 subd_attributes.clear();
540 used_shaders.clear();
542 transform_applied = false;
543 transform_negative_scaled = false;
544 transform_normal = transform_identity();
545 geometry_flags = GEOMETRY_NONE;
551 int Mesh::split_vertex(int vertex)
553 /* copy vertex location and vertex attributes */
554 add_vertex_slow(verts[vertex]);
556 foreach(Attribute& attr, attributes.attributes) {
557 if(attr.element == ATTR_ELEMENT_VERTEX) {
558 array<char> tmp(attr.data_sizeof());
559 memcpy(tmp.data(), attr.data() + tmp.size()*vertex, tmp.size());
560 attr.add(tmp.data());
564 foreach(Attribute& attr, subd_attributes.attributes) {
565 if(attr.element == ATTR_ELEMENT_VERTEX) {
566 array<char> tmp(attr.data_sizeof());
567 memcpy(tmp.data(), attr.data() + tmp.size()*vertex, tmp.size());
568 attr.add(tmp.data());
572 return verts.size() - 1;
575 void Mesh::add_vertex(float3 P)
577 verts.push_back_reserved(P);
579 if(subd_faces.size()) {
580 vert_patch_uv.push_back_reserved(make_float2(0.0f, 0.0f));
584 void Mesh::add_vertex_slow(float3 P)
586 verts.push_back_slow(P);
588 if(subd_faces.size()) {
589 vert_patch_uv.push_back_slow(make_float2(0.0f, 0.0f));
593 void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_)
595 triangles.push_back_reserved(v0);
596 triangles.push_back_reserved(v1);
597 triangles.push_back_reserved(v2);
598 shader.push_back_reserved(shader_);
599 smooth.push_back_reserved(smooth_);
601 if(subd_faces.size()) {
602 triangle_patch.push_back_reserved(-1);
606 void Mesh::add_curve_key(float3 co, float radius)
608 curve_keys.push_back_reserved(co);
609 curve_radius.push_back_reserved(radius);
612 void Mesh::add_curve(int first_key, int shader)
614 curve_first_key.push_back_reserved(first_key);
615 curve_shader.push_back_reserved(shader);
618 void Mesh::add_subd_face(int* corners, int num_corners, int shader_, bool smooth_)
620 int start_corner = subd_face_corners.size();
622 for(int i = 0; i < num_corners; i++) {
623 subd_face_corners.push_back_reserved(corners[i]);
628 if(subd_faces.size()) {
629 SubdFace& s = subd_faces[subd_faces.size()-1];
630 ptex_offset = s.ptex_offset + s.num_ptex_faces();
633 SubdFace face = {start_corner, num_corners, shader_, smooth_, ptex_offset};
634 subd_faces.push_back_reserved(face);
637 void Mesh::compute_bounds()
639 BoundBox bnds = BoundBox::empty;
640 size_t verts_size = verts.size();
641 size_t curve_keys_size = curve_keys.size();
643 if(verts_size + curve_keys_size > 0) {
644 for(size_t i = 0; i < verts_size; i++)
647 for(size_t i = 0; i < curve_keys_size; i++)
648 bnds.grow(curve_keys[i], curve_radius[i]);
650 Attribute *attr = attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
651 if(use_motion_blur && attr) {
652 size_t steps_size = verts.size() * (motion_steps - 1);
653 float3 *vert_steps = attr->data_float3();
655 for(size_t i = 0; i < steps_size; i++)
656 bnds.grow(vert_steps[i]);
659 Attribute *curve_attr = curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
660 if(use_motion_blur && curve_attr) {
661 size_t steps_size = curve_keys.size() * (motion_steps - 1);
662 float3 *key_steps = curve_attr->data_float3();
664 for(size_t i = 0; i < steps_size; i++)
665 bnds.grow(key_steps[i]);
669 bnds = BoundBox::empty;
671 /* skip nan or inf coordinates */
672 for(size_t i = 0; i < verts_size; i++)
673 bnds.grow_safe(verts[i]);
675 for(size_t i = 0; i < curve_keys_size; i++)
676 bnds.grow_safe(curve_keys[i], curve_radius[i]);
678 if(use_motion_blur && attr) {
679 size_t steps_size = verts.size() * (motion_steps - 1);
680 float3 *vert_steps = attr->data_float3();
682 for(size_t i = 0; i < steps_size; i++)
683 bnds.grow_safe(vert_steps[i]);
686 if(use_motion_blur && curve_attr) {
687 size_t steps_size = curve_keys.size() * (motion_steps - 1);
688 float3 *key_steps = curve_attr->data_float3();
690 for(size_t i = 0; i < steps_size; i++)
691 bnds.grow_safe(key_steps[i]);
698 bnds.grow(make_float3(0.0f, 0.0f, 0.0f));
704 static float3 compute_face_normal(const Mesh::Triangle& t, float3 *verts)
706 float3 v0 = verts[t.v[0]];
707 float3 v1 = verts[t.v[1]];
708 float3 v2 = verts[t.v[2]];
710 float3 norm = cross(v1 - v0, v2 - v0);
711 float normlen = len(norm);
714 return make_float3(1.0f, 0.0f, 0.0f);
716 return norm / normlen;
719 void Mesh::add_face_normals()
721 /* don't compute if already there */
722 if(attributes.find(ATTR_STD_FACE_NORMAL))
726 Attribute *attr_fN = attributes.add(ATTR_STD_FACE_NORMAL);
727 float3 *fN = attr_fN->data_float3();
729 /* compute face normals */
730 size_t triangles_size = num_triangles();
733 float3 *verts_ptr = verts.data();
735 for(size_t i = 0; i < triangles_size; i++) {
736 fN[i] = compute_face_normal(get_triangle(i), verts_ptr);
740 /* expected to be in local space */
741 if(transform_applied) {
742 Transform ntfm = transform_inverse(transform_normal);
744 for(size_t i = 0; i < triangles_size; i++)
745 fN[i] = normalize(transform_direction(&ntfm, fN[i]));
749 void Mesh::add_vertex_normals()
751 bool flip = transform_negative_scaled;
752 size_t verts_size = verts.size();
753 size_t triangles_size = num_triangles();
755 /* static vertex normals */
756 if(!attributes.find(ATTR_STD_VERTEX_NORMAL) && triangles_size) {
758 Attribute *attr_fN = attributes.find(ATTR_STD_FACE_NORMAL);
759 Attribute *attr_vN = attributes.add(ATTR_STD_VERTEX_NORMAL);
761 float3 *fN = attr_fN->data_float3();
762 float3 *vN = attr_vN->data_float3();
764 /* compute vertex normals */
765 memset(vN, 0, verts.size()*sizeof(float3));
767 for(size_t i = 0; i < triangles_size; i++) {
768 for(size_t j = 0; j < 3; j++) {
769 vN[get_triangle(i).v[j]] += fN[i];
773 for(size_t i = 0; i < verts_size; i++) {
774 vN[i] = normalize(vN[i]);
781 /* motion vertex normals */
782 Attribute *attr_mP = attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
783 Attribute *attr_mN = attributes.find(ATTR_STD_MOTION_VERTEX_NORMAL);
785 if(has_motion_blur() && attr_mP && !attr_mN && triangles_size) {
786 /* create attribute */
787 attr_mN = attributes.add(ATTR_STD_MOTION_VERTEX_NORMAL);
789 for(int step = 0; step < motion_steps - 1; step++) {
790 float3 *mP = attr_mP->data_float3() + step*verts.size();
791 float3 *mN = attr_mN->data_float3() + step*verts.size();
794 memset(mN, 0, verts.size()*sizeof(float3));
796 for(size_t i = 0; i < triangles_size; i++) {
797 for(size_t j = 0; j < 3; j++) {
798 float3 fN = compute_face_normal(get_triangle(i), mP);
799 mN[get_triangle(i).v[j]] += fN;
803 for(size_t i = 0; i < verts_size; i++) {
804 mN[i] = normalize(mN[i]);
812 /* subd vertex normals */
813 if(!subd_attributes.find(ATTR_STD_VERTEX_NORMAL) && subd_faces.size()) {
815 Attribute *attr_vN = subd_attributes.add(ATTR_STD_VERTEX_NORMAL);
816 float3 *vN = attr_vN->data_float3();
818 /* compute vertex normals */
819 memset(vN, 0, verts.size()*sizeof(float3));
821 for(size_t i = 0; i < subd_faces.size(); i++) {
822 SubdFace& face = subd_faces[i];
823 float3 fN = face.normal(this);
825 for(size_t j = 0; j < face.num_corners; j++) {
826 size_t corner = subd_face_corners[face.start_corner+j];
831 for(size_t i = 0; i < verts_size; i++) {
832 vN[i] = normalize(vN[i]);
840 void Mesh::add_undisplaced()
842 AttributeSet& attrs = (subdivision_type == SUBDIVISION_NONE) ? attributes : subd_attributes;
844 /* don't compute if already there */
845 if(attrs.find(ATTR_STD_POSITION_UNDISPLACED)) {
850 Attribute *attr = attrs.add(ATTR_STD_POSITION_UNDISPLACED);
851 attr->flags |= ATTR_SUBDIVIDED;
853 float3 *data = attr->data_float3();
856 size_t size = attr->buffer_size(this, (subdivision_type == SUBDIVISION_NONE) ? ATTR_PRIM_TRIANGLE : ATTR_PRIM_SUBD);
858 /* Center points for ngons aren't stored in Mesh::verts but are included in size since they will be
859 * calculated later, we subtract them from size here so we don't have an overflow while copying.
861 size -= num_ngons * attr->data_sizeof();
864 memcpy(data, verts.data(), size);
868 void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal)
870 Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
871 if(attr_vN == NULL) {
872 /* Happens on objects with just hair. */
876 float3 *vN = attr_vN->data_float3();
878 uint last_shader = -1;
879 bool last_smooth = false;
881 size_t triangles_size = num_triangles();
882 int *shader_ptr = shader.data();
884 bool do_transform = transform_applied;
885 Transform ntfm = transform_normal;
888 for(size_t i = 0; i < triangles_size; i++) {
889 if(shader_ptr[i] != last_shader || last_smooth != smooth[i]) {
890 last_shader = shader_ptr[i];
891 last_smooth = smooth[i];
892 Shader *shader = (last_shader < used_shaders.size()) ?
893 used_shaders[last_shader] : scene->default_surface;
894 shader_id = scene->shader_manager->get_shader_id(shader, last_smooth);
897 tri_shader[i] = shader_id;
900 size_t verts_size = verts.size();
902 for(size_t i = 0; i < verts_size; i++) {
906 vNi = normalize(transform_direction(&ntfm, vNi));
908 vnormal[i] = make_float4(vNi.x, vNi.y, vNi.z, 0.0f);
912 void Mesh::pack_verts(const vector<uint>& tri_prim_index,
915 float2 *tri_patch_uv,
919 size_t verts_size = verts.size();
921 if(verts_size && subd_faces.size()) {
922 float2 *vert_patch_uv_ptr = vert_patch_uv.data();
924 for(size_t i = 0; i < verts_size; i++) {
925 tri_patch_uv[i] = vert_patch_uv_ptr[i];
929 size_t triangles_size = num_triangles();
931 for(size_t i = 0; i < triangles_size; i++) {
932 Triangle t = get_triangle(i);
933 tri_vindex[i] = make_uint4(t.v[0] + vert_offset,
934 t.v[1] + vert_offset,
935 t.v[2] + vert_offset,
936 tri_prim_index[i + tri_offset]);
938 tri_patch[i] = (!subd_faces.size()) ? -1 : (triangle_patch[i]*8 + patch_offset);
942 void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, size_t curvekey_offset)
944 size_t curve_keys_size = curve_keys.size();
946 /* pack curve keys */
947 if(curve_keys_size) {
948 float3 *keys_ptr = curve_keys.data();
949 float *radius_ptr = curve_radius.data();
951 for(size_t i = 0; i < curve_keys_size; i++)
952 curve_key_co[i] = make_float4(keys_ptr[i].x, keys_ptr[i].y, keys_ptr[i].z, radius_ptr[i]);
955 /* pack curve segments */
956 size_t curve_num = num_curves();
958 for(size_t i = 0; i < curve_num; i++) {
959 Curve curve = get_curve(i);
960 int shader_id = curve_shader[i];
961 Shader *shader = (shader_id < used_shaders.size()) ?
962 used_shaders[shader_id] : scene->default_surface;
963 shader_id = scene->shader_manager->get_shader_id(shader, false);
965 curve_data[i] = make_float4(
966 __int_as_float(curve.first_key + curvekey_offset),
967 __int_as_float(curve.num_keys),
968 __int_as_float(shader_id),
973 void Mesh::pack_patches(uint *patch_data, uint vert_offset, uint face_offset, uint corner_offset)
975 size_t num_faces = subd_faces.size();
978 for(size_t f = 0; f < num_faces; f++) {
979 SubdFace face = subd_faces[f];
983 memcpy(c, &subd_face_corners[face.start_corner], sizeof(int)*4);
985 *(patch_data++) = c[0] + vert_offset;
986 *(patch_data++) = c[1] + vert_offset;
987 *(patch_data++) = c[2] + vert_offset;
988 *(patch_data++) = c[3] + vert_offset;
990 *(patch_data++) = f+face_offset;
991 *(patch_data++) = face.num_corners;
992 *(patch_data++) = face.start_corner + corner_offset;
996 for(int i = 0; i < face.num_corners; i++) {
998 c[0] = subd_face_corners[face.start_corner + mod(i + 0, face.num_corners)];
999 c[1] = subd_face_corners[face.start_corner + mod(i + 1, face.num_corners)];
1000 c[2] = verts.size() - num_subd_verts + ngons;
1001 c[3] = subd_face_corners[face.start_corner + mod(i - 1, face.num_corners)];
1003 *(patch_data++) = c[0] + vert_offset;
1004 *(patch_data++) = c[1] + vert_offset;
1005 *(patch_data++) = c[2] + vert_offset;
1006 *(patch_data++) = c[3] + vert_offset;
1008 *(patch_data++) = f+face_offset;
1009 *(patch_data++) = face.num_corners | (i << 16);
1010 *(patch_data++) = face.start_corner + corner_offset;
1011 *(patch_data++) = subd_face_corners.size() + ngons + corner_offset;
1019 void Mesh::compute_bvh(DeviceScene *dscene,
1020 SceneParams *params,
1025 if(progress->get_cancel())
1030 if(need_build_bvh()) {
1031 string msg = "Updating Mesh BVH ";
1033 msg += string_printf("%u/%u", (uint)(n+1), (uint)total);
1035 msg += string_printf("%s %u/%u", name.c_str(), (uint)(n+1), (uint)total);
1040 vector<Object*> objects;
1041 objects.push_back(&object);
1043 if(bvh && !need_update_rebuild) {
1044 progress->set_status(msg, "Refitting BVH");
1045 bvh->objects = objects;
1046 bvh->refit(*progress);
1049 progress->set_status(msg, "Building BVH");
1052 bparams.use_spatial_split = params->use_bvh_spatial_split;
1053 bparams.use_qbvh = params->use_qbvh;
1054 bparams.use_unaligned_nodes = dscene->data.bvh.have_curves &&
1055 params->use_bvh_unaligned_nodes;
1056 bparams.num_motion_triangle_steps = params->num_bvh_time_steps;
1057 bparams.num_motion_curve_steps = params->num_bvh_time_steps;
1060 bvh = BVH::create(bparams, objects);
1061 MEM_GUARDED_CALL(progress, bvh->build, *progress);
1065 need_update = false;
1066 need_update_rebuild = false;
1069 void Mesh::tag_update(Scene *scene, bool rebuild)
1074 need_update_rebuild = true;
1075 scene->light_manager->need_update = true;
1078 foreach(Shader *shader, used_shaders)
1079 if(shader->has_surface_emission)
1080 scene->light_manager->need_update = true;
1083 scene->mesh_manager->need_update = true;
1084 scene->object_manager->need_update = true;
1087 bool Mesh::has_motion_blur() const
1089 return (use_motion_blur &&
1090 (attributes.find(ATTR_STD_MOTION_VERTEX_POSITION) ||
1091 curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION)));
1094 bool Mesh::has_true_displacement() const
1096 foreach(Shader *shader, used_shaders) {
1097 if(shader->has_displacement && shader->displacement_method != DISPLACE_BUMP) {
1105 bool Mesh::need_build_bvh() const
1107 return !transform_applied || has_surface_bssrdf;
1110 bool Mesh::is_instanced() const
1112 /* Currently we treat subsurface objects as instanced.
1114 * While it might be not very optimal for ray traversal, it avoids having
1115 * duplicated BVH in the memory, saving quite some space.
1117 return !transform_applied || has_surface_bssrdf;
1122 MeshManager::MeshManager()
1126 need_flags_update = true;
1129 MeshManager::~MeshManager()
1134 void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<AttributeRequestSet>& mesh_attributes)
1137 /* for OSL, a hash map is used to lookup the attribute by name. */
1138 OSLGlobals *og = (OSLGlobals*)device->osl_memory();
1140 og->object_name_map.clear();
1141 og->attribute_map.clear();
1142 og->object_names.clear();
1144 og->attribute_map.resize(scene->objects.size()*ATTR_PRIM_TYPES);
1146 for(size_t i = 0; i < scene->objects.size(); i++) {
1147 /* set object name to object index map */
1148 Object *object = scene->objects[i];
1149 og->object_name_map[object->name] = i;
1150 og->object_names.push_back(object->name);
1152 /* set object attributes */
1153 foreach(ParamValue& attr, object->attributes) {
1154 OSLGlobals::Attribute osl_attr;
1156 osl_attr.type = attr.type();
1157 osl_attr.desc.element = ATTR_ELEMENT_OBJECT;
1158 osl_attr.value = attr;
1159 osl_attr.desc.offset = 0;
1160 osl_attr.desc.flags = 0;
1162 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_TRIANGLE][attr.name()] = osl_attr;
1163 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_CURVE][attr.name()] = osl_attr;
1164 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_SUBD][attr.name()] = osl_attr;
1167 /* find mesh attributes */
1170 for(j = 0; j < scene->meshes.size(); j++)
1171 if(scene->meshes[j] == object->mesh)
1174 AttributeRequestSet& attributes = mesh_attributes[j];
1176 /* set object attributes */
1177 foreach(AttributeRequest& req, attributes.requests) {
1178 OSLGlobals::Attribute osl_attr;
1180 if(req.triangle_desc.element != ATTR_ELEMENT_NONE) {
1181 osl_attr.desc = req.triangle_desc;
1183 if(req.triangle_type == TypeDesc::TypeFloat)
1184 osl_attr.type = TypeDesc::TypeFloat;
1185 else if(req.triangle_type == TypeDesc::TypeMatrix)
1186 osl_attr.type = TypeDesc::TypeMatrix;
1188 osl_attr.type = TypeDesc::TypeColor;
1190 if(req.std != ATTR_STD_NONE) {
1191 /* if standard attribute, add lookup by geom: name convention */
1192 ustring stdname(string("geom:") + string(Attribute::standard_name(req.std)));
1193 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_TRIANGLE][stdname] = osl_attr;
1195 else if(req.name != ustring()) {
1196 /* add lookup by mesh attribute name */
1197 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_TRIANGLE][req.name] = osl_attr;
1201 if(req.curve_desc.element != ATTR_ELEMENT_NONE) {
1202 osl_attr.desc = req.curve_desc;
1204 if(req.curve_type == TypeDesc::TypeFloat)
1205 osl_attr.type = TypeDesc::TypeFloat;
1206 else if(req.curve_type == TypeDesc::TypeMatrix)
1207 osl_attr.type = TypeDesc::TypeMatrix;
1209 osl_attr.type = TypeDesc::TypeColor;
1211 if(req.std != ATTR_STD_NONE) {
1212 /* if standard attribute, add lookup by geom: name convention */
1213 ustring stdname(string("geom:") + string(Attribute::standard_name(req.std)));
1214 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_CURVE][stdname] = osl_attr;
1216 else if(req.name != ustring()) {
1217 /* add lookup by mesh attribute name */
1218 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_CURVE][req.name] = osl_attr;
1222 if(req.subd_desc.element != ATTR_ELEMENT_NONE) {
1223 osl_attr.desc = req.subd_desc;
1225 if(req.subd_type == TypeDesc::TypeFloat)
1226 osl_attr.type = TypeDesc::TypeFloat;
1227 else if(req.subd_type == TypeDesc::TypeMatrix)
1228 osl_attr.type = TypeDesc::TypeMatrix;
1230 osl_attr.type = TypeDesc::TypeColor;
1232 if(req.std != ATTR_STD_NONE) {
1233 /* if standard attribute, add lookup by geom: name convention */
1234 ustring stdname(string("geom:") + string(Attribute::standard_name(req.std)));
1235 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_SUBD][stdname] = osl_attr;
1237 else if(req.name != ustring()) {
1238 /* add lookup by mesh attribute name */
1239 og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_SUBD][req.name] = osl_attr;
1247 (void)mesh_attributes;
1251 void MeshManager::update_svm_attributes(Device *device, DeviceScene *dscene, Scene *scene, vector<AttributeRequestSet>& mesh_attributes)
1253 /* for SVM, the attributes_map table is used to lookup the offset of an
1254 * attribute, based on a unique shader attribute id. */
1256 /* compute array stride */
1257 int attr_map_stride = 0;
1259 for(size_t i = 0; i < scene->meshes.size(); i++)
1260 attr_map_stride = max(attr_map_stride, (mesh_attributes[i].size() + 1)*ATTR_PRIM_TYPES);
1262 if(attr_map_stride == 0)
1265 /* create attribute map */
1266 uint4 *attr_map = dscene->attributes_map.resize(attr_map_stride*scene->objects.size());
1267 memset(attr_map, 0, dscene->attributes_map.size()*sizeof(uint));
1269 for(size_t i = 0; i < scene->objects.size(); i++) {
1270 Object *object = scene->objects[i];
1271 Mesh *mesh = object->mesh;
1273 /* find mesh attributes */
1276 for(j = 0; j < scene->meshes.size(); j++)
1277 if(scene->meshes[j] == mesh)
1280 AttributeRequestSet& attributes = mesh_attributes[j];
1282 /* set object attributes */
1283 int index = i*attr_map_stride;
1285 foreach(AttributeRequest& req, attributes.requests) {
1288 if(req.std == ATTR_STD_NONE)
1289 id = scene->shader_manager->get_attribute_id(req.name);
1291 id = scene->shader_manager->get_attribute_id(req.std);
1293 if(mesh->num_triangles()) {
1294 attr_map[index].x = id;
1295 attr_map[index].y = req.triangle_desc.element;
1296 attr_map[index].z = as_uint(req.triangle_desc.offset);
1298 if(req.triangle_type == TypeDesc::TypeFloat)
1299 attr_map[index].w = NODE_ATTR_FLOAT;
1300 else if(req.triangle_type == TypeDesc::TypeMatrix)
1301 attr_map[index].w = NODE_ATTR_MATRIX;
1303 attr_map[index].w = NODE_ATTR_FLOAT3;
1305 attr_map[index].w |= req.triangle_desc.flags << 8;
1310 if(mesh->num_curves()) {
1311 attr_map[index].x = id;
1312 attr_map[index].y = req.curve_desc.element;
1313 attr_map[index].z = as_uint(req.curve_desc.offset);
1315 if(req.curve_type == TypeDesc::TypeFloat)
1316 attr_map[index].w = NODE_ATTR_FLOAT;
1317 else if(req.curve_type == TypeDesc::TypeMatrix)
1318 attr_map[index].w = NODE_ATTR_MATRIX;
1320 attr_map[index].w = NODE_ATTR_FLOAT3;
1322 attr_map[index].w |= req.curve_desc.flags << 8;
1327 if(mesh->subd_faces.size()) {
1328 attr_map[index].x = id;
1329 attr_map[index].y = req.subd_desc.element;
1330 attr_map[index].z = as_uint(req.subd_desc.offset);
1332 if(req.subd_type == TypeDesc::TypeFloat)
1333 attr_map[index].w = NODE_ATTR_FLOAT;
1334 else if(req.subd_type == TypeDesc::TypeMatrix)
1335 attr_map[index].w = NODE_ATTR_MATRIX;
1337 attr_map[index].w = NODE_ATTR_FLOAT3;
1339 attr_map[index].w |= req.subd_desc.flags << 8;
1346 for(int j = 0; j < ATTR_PRIM_TYPES; j++) {
1347 attr_map[index].x = ATTR_STD_NONE;
1348 attr_map[index].y = 0;
1349 attr_map[index].z = 0;
1350 attr_map[index].w = 0;
1356 /* copy to device */
1357 dscene->data.bvh.attributes_map_stride = attr_map_stride;
1358 device->tex_alloc("__attributes_map", dscene->attributes_map);
1361 static void update_attribute_element_size(Mesh *mesh,
1363 AttributePrimitive prim,
1364 size_t *attr_float_size,
1365 size_t *attr_float3_size,
1366 size_t *attr_uchar4_size)
1369 size_t size = mattr->element_size(mesh, prim);
1371 if(mattr->element == ATTR_ELEMENT_VOXEL) {
1374 else if(mattr->element == ATTR_ELEMENT_CORNER_BYTE) {
1375 *attr_uchar4_size += size;
1377 else if(mattr->type == TypeDesc::TypeFloat) {
1378 *attr_float_size += size;
1380 else if(mattr->type == TypeDesc::TypeMatrix) {
1381 *attr_float3_size += size * 4;
1384 *attr_float3_size += size;
1389 static void update_attribute_element_offset(Mesh *mesh,
1390 vector<float>& attr_float,
1391 size_t& attr_float_offset,
1392 vector<float4>& attr_float3,
1393 size_t& attr_float3_offset,
1394 vector<uchar4>& attr_uchar4,
1395 size_t& attr_uchar4_offset,
1397 AttributePrimitive prim,
1399 AttributeDescriptor& desc)
1402 /* store element and type */
1403 desc.element = mattr->element;
1404 desc.flags = mattr->flags;
1407 /* store attribute data in arrays */
1408 size_t size = mattr->element_size(mesh, prim);
1410 AttributeElement& element = desc.element;
1411 int& offset = desc.offset;
1413 if(mattr->element == ATTR_ELEMENT_VOXEL) {
1414 /* store slot in offset value */
1415 VoxelAttribute *voxel_data = mattr->data_voxel();
1416 offset = voxel_data->slot;
1418 else if(mattr->element == ATTR_ELEMENT_CORNER_BYTE) {
1419 uchar4 *data = mattr->data_uchar4();
1420 offset = attr_uchar4_offset;
1422 assert(attr_uchar4.capacity() >= offset + size);
1423 for(size_t k = 0; k < size; k++) {
1424 attr_uchar4[offset+k] = data[k];
1426 attr_uchar4_offset += size;
1428 else if(mattr->type == TypeDesc::TypeFloat) {
1429 float *data = mattr->data_float();
1430 offset = attr_float_offset;
1432 assert(attr_float.capacity() >= offset + size);
1433 for(size_t k = 0; k < size; k++) {
1434 attr_float[offset+k] = data[k];
1436 attr_float_offset += size;
1438 else if(mattr->type == TypeDesc::TypeMatrix) {
1439 Transform *tfm = mattr->data_transform();
1440 offset = attr_float3_offset;
1442 assert(attr_float3.capacity() >= offset + size * 4);
1443 for(size_t k = 0; k < size*4; k++) {
1444 attr_float3[offset+k] = (&tfm->x)[k];
1446 attr_float3_offset += size * 4;
1449 float4 *data = mattr->data_float4();
1450 offset = attr_float3_offset;
1452 assert(attr_float3.capacity() >= offset + size);
1453 for(size_t k = 0; k < size; k++) {
1454 attr_float3[offset+k] = data[k];
1456 attr_float3_offset += size;
1459 /* mesh vertex/curve index is global, not per object, so we sneak
1460 * a correction for that in here */
1461 if(mesh->subdivision_type == Mesh::SUBDIVISION_CATMULL_CLARK && desc.flags & ATTR_SUBDIVIDED) {
1462 /* indices for subdivided attributes are retrieved
1463 * from patch table so no need for correction here*/
1465 else if(element == ATTR_ELEMENT_VERTEX)
1466 offset -= mesh->vert_offset;
1467 else if(element == ATTR_ELEMENT_VERTEX_MOTION)
1468 offset -= mesh->vert_offset;
1469 else if(element == ATTR_ELEMENT_FACE) {
1470 if(prim == ATTR_PRIM_TRIANGLE)
1471 offset -= mesh->tri_offset;
1473 offset -= mesh->face_offset;
1475 else if(element == ATTR_ELEMENT_CORNER || element == ATTR_ELEMENT_CORNER_BYTE) {
1476 if(prim == ATTR_PRIM_TRIANGLE)
1477 offset -= 3*mesh->tri_offset;
1479 offset -= mesh->corner_offset;
1481 else if(element == ATTR_ELEMENT_CURVE)
1482 offset -= mesh->curve_offset;
1483 else if(element == ATTR_ELEMENT_CURVE_KEY)
1484 offset -= mesh->curvekey_offset;
1485 else if(element == ATTR_ELEMENT_CURVE_KEY_MOTION)
1486 offset -= mesh->curvekey_offset;
1489 /* attribute not found */
1490 desc.element = ATTR_ELEMENT_NONE;
1495 void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
1497 progress.set_status("Updating Mesh", "Computing attributes");
1499 /* gather per mesh requested attributes. as meshes may have multiple
1500 * shaders assigned, this merges the requested attributes that have
1501 * been set per shader by the shader manager */
1502 vector<AttributeRequestSet> mesh_attributes(scene->meshes.size());
1504 for(size_t i = 0; i < scene->meshes.size(); i++) {
1505 Mesh *mesh = scene->meshes[i];
1507 scene->need_global_attributes(mesh_attributes[i]);
1509 foreach(Shader *shader, mesh->used_shaders) {
1510 mesh_attributes[i].add(shader->attributes);
1514 /* mesh attribute are stored in a single array per data type. here we fill
1515 * those arrays, and set the offset and element type to create attribute
1518 /* Pre-allocate attributes to avoid arrays re-allocation which would
1519 * take 2x of overall attribute memory usage.
1521 size_t attr_float_size = 0;
1522 size_t attr_float3_size = 0;
1523 size_t attr_uchar4_size = 0;
1524 for(size_t i = 0; i < scene->meshes.size(); i++) {
1525 Mesh *mesh = scene->meshes[i];
1526 AttributeRequestSet& attributes = mesh_attributes[i];
1527 foreach(AttributeRequest& req, attributes.requests) {
1528 Attribute *triangle_mattr = mesh->attributes.find(req);
1529 Attribute *curve_mattr = mesh->curve_attributes.find(req);
1530 Attribute *subd_mattr = mesh->subd_attributes.find(req);
1532 update_attribute_element_size(mesh,
1538 update_attribute_element_size(mesh,
1544 update_attribute_element_size(mesh,
1553 vector<float> attr_float(attr_float_size);
1554 vector<float4> attr_float3(attr_float3_size);
1555 vector<uchar4> attr_uchar4(attr_uchar4_size);
1557 size_t attr_float_offset = 0;
1558 size_t attr_float3_offset = 0;
1559 size_t attr_uchar4_offset = 0;
1561 /* Fill in attributes. */
1562 for(size_t i = 0; i < scene->meshes.size(); i++) {
1563 Mesh *mesh = scene->meshes[i];
1564 AttributeRequestSet& attributes = mesh_attributes[i];
1566 /* todo: we now store std and name attributes from requests even if
1567 * they actually refer to the same mesh attributes, optimize */
1568 foreach(AttributeRequest& req, attributes.requests) {
1569 Attribute *triangle_mattr = mesh->attributes.find(req);
1570 Attribute *curve_mattr = mesh->curve_attributes.find(req);
1571 Attribute *subd_mattr = mesh->subd_attributes.find(req);
1573 update_attribute_element_offset(mesh,
1574 attr_float, attr_float_offset,
1575 attr_float3, attr_float3_offset,
1576 attr_uchar4, attr_uchar4_offset,
1582 update_attribute_element_offset(mesh,
1583 attr_float, attr_float_offset,
1584 attr_float3, attr_float3_offset,
1585 attr_uchar4, attr_uchar4_offset,
1591 update_attribute_element_offset(mesh,
1592 attr_float, attr_float_offset,
1593 attr_float3, attr_float3_offset,
1594 attr_uchar4, attr_uchar4_offset,
1600 if(progress.get_cancel()) return;
1604 /* create attribute lookup maps */
1605 if(scene->shader_manager->use_osl())
1606 update_osl_attributes(device, scene, mesh_attributes);
1608 update_svm_attributes(device, dscene, scene, mesh_attributes);
1610 if(progress.get_cancel()) return;
1612 /* copy to device */
1613 progress.set_status("Updating Mesh", "Copying Attributes to device");
1615 if(attr_float.size()) {
1616 dscene->attributes_float.copy(&attr_float[0], attr_float.size());
1617 device->tex_alloc("__attributes_float", dscene->attributes_float);
1619 if(attr_float3.size()) {
1620 dscene->attributes_float3.copy(&attr_float3[0], attr_float3.size());
1621 device->tex_alloc("__attributes_float3", dscene->attributes_float3);
1623 if(attr_uchar4.size()) {
1624 dscene->attributes_uchar4.copy(&attr_uchar4[0], attr_uchar4.size());
1625 device->tex_alloc("__attributes_uchar4", dscene->attributes_uchar4);
1629 void MeshManager::mesh_calc_offset(Scene *scene)
1631 size_t vert_size = 0;
1632 size_t tri_size = 0;
1634 size_t curve_key_size = 0;
1635 size_t curve_size = 0;
1637 size_t patch_size = 0;
1638 size_t face_size = 0;
1639 size_t corner_size = 0;
1641 foreach(Mesh *mesh, scene->meshes) {
1642 mesh->vert_offset = vert_size;
1643 mesh->tri_offset = tri_size;
1645 mesh->curvekey_offset = curve_key_size;
1646 mesh->curve_offset = curve_size;
1648 mesh->patch_offset = patch_size;
1649 mesh->face_offset = face_size;
1650 mesh->corner_offset = corner_size;
1652 vert_size += mesh->verts.size();
1653 tri_size += mesh->num_triangles();
1655 curve_key_size += mesh->curve_keys.size();
1656 curve_size += mesh->num_curves();
1658 if(mesh->subd_faces.size()) {
1659 Mesh::SubdFace& last = mesh->subd_faces[mesh->subd_faces.size()-1];
1660 patch_size += (last.ptex_offset + last.num_ptex_faces()) * 8;
1662 /* patch tables are stored in same array so include them in patch_size */
1663 if(mesh->patch_table) {
1664 mesh->patch_table_offset = patch_size;
1665 patch_size += mesh->patch_table->total_size();
1668 face_size += mesh->subd_faces.size();
1669 corner_size += mesh->subd_face_corners.size();
1673 void MeshManager::device_update_mesh(Device *device,
1674 DeviceScene *dscene,
1676 bool for_displacement,
1680 size_t vert_size = 0;
1681 size_t tri_size = 0;
1683 size_t curve_key_size = 0;
1684 size_t curve_size = 0;
1686 size_t patch_size = 0;
1688 foreach(Mesh *mesh, scene->meshes) {
1689 vert_size += mesh->verts.size();
1690 tri_size += mesh->num_triangles();
1692 curve_key_size += mesh->curve_keys.size();
1693 curve_size += mesh->num_curves();
1695 if(mesh->subd_faces.size()) {
1696 Mesh::SubdFace& last = mesh->subd_faces[mesh->subd_faces.size()-1];
1697 patch_size += (last.ptex_offset + last.num_ptex_faces()) * 8;
1699 /* patch tables are stored in same array so include them in patch_size */
1700 if(mesh->patch_table) {
1701 mesh->patch_table_offset = patch_size;
1702 patch_size += mesh->patch_table->total_size();
1707 /* Create mapping from triangle to primitive triangle array. */
1708 vector<uint> tri_prim_index(tri_size);
1709 if(for_displacement) {
1710 /* For displacement kernels we do some trickery to make them believe
1711 * we've got all required data ready. However, that data is different
1712 * from final render kernels since we don't have BVH yet, so can't
1713 * really use same semantic of arrays.
1715 foreach(Mesh *mesh, scene->meshes) {
1716 for(size_t i = 0; i < mesh->num_triangles(); ++i) {
1717 tri_prim_index[i + mesh->tri_offset] = 3 * (i + mesh->tri_offset);
1722 PackedBVH& pack = bvh->pack;
1723 for(size_t i = 0; i < pack.prim_index.size(); ++i) {
1724 if((pack.prim_type[i] & PRIMITIVE_ALL_TRIANGLE) != 0) {
1725 tri_prim_index[pack.prim_index[i]] = pack.prim_tri_index[i];
1730 /* Fill in all the arrays. */
1733 progress.set_status("Updating Mesh", "Computing normals");
1735 uint *tri_shader = dscene->tri_shader.resize(tri_size);
1736 float4 *vnormal = dscene->tri_vnormal.resize(vert_size);
1737 uint4 *tri_vindex = dscene->tri_vindex.resize(tri_size);
1738 uint *tri_patch = dscene->tri_patch.resize(tri_size);
1739 float2 *tri_patch_uv = dscene->tri_patch_uv.resize(vert_size);
1741 foreach(Mesh *mesh, scene->meshes) {
1742 mesh->pack_normals(scene,
1743 &tri_shader[mesh->tri_offset],
1744 &vnormal[mesh->vert_offset]);
1745 mesh->pack_verts(tri_prim_index,
1746 &tri_vindex[mesh->tri_offset],
1747 &tri_patch[mesh->tri_offset],
1748 &tri_patch_uv[mesh->vert_offset],
1751 if(progress.get_cancel()) return;
1754 /* vertex coordinates */
1755 progress.set_status("Updating Mesh", "Copying Mesh to device");
1757 device->tex_alloc("__tri_shader", dscene->tri_shader);
1758 device->tex_alloc("__tri_vnormal", dscene->tri_vnormal);
1759 device->tex_alloc("__tri_vindex", dscene->tri_vindex);
1760 device->tex_alloc("__tri_patch", dscene->tri_patch);
1761 device->tex_alloc("__tri_patch_uv", dscene->tri_patch_uv);
1764 if(curve_size != 0) {
1765 progress.set_status("Updating Mesh", "Copying Strands to device");
1767 float4 *curve_keys = dscene->curve_keys.resize(curve_key_size);
1768 float4 *curves = dscene->curves.resize(curve_size);
1770 foreach(Mesh *mesh, scene->meshes) {
1771 mesh->pack_curves(scene, &curve_keys[mesh->curvekey_offset], &curves[mesh->curve_offset], mesh->curvekey_offset);
1772 if(progress.get_cancel()) return;
1775 device->tex_alloc("__curve_keys", dscene->curve_keys);
1776 device->tex_alloc("__curves", dscene->curves);
1779 if(patch_size != 0) {
1780 progress.set_status("Updating Mesh", "Copying Patches to device");
1782 uint *patch_data = dscene->patches.resize(patch_size);
1784 foreach(Mesh *mesh, scene->meshes) {
1785 mesh->pack_patches(&patch_data[mesh->patch_offset], mesh->vert_offset, mesh->face_offset, mesh->corner_offset);
1787 if(mesh->patch_table) {
1788 mesh->patch_table->copy_adjusting_offsets(&patch_data[mesh->patch_table_offset], mesh->patch_table_offset);
1791 if(progress.get_cancel()) return;
1794 device->tex_alloc("__patches", dscene->patches);
1797 if(for_displacement) {
1798 float4 *prim_tri_verts = dscene->prim_tri_verts.resize(tri_size * 3);
1799 foreach(Mesh *mesh, scene->meshes) {
1800 for(size_t i = 0; i < mesh->num_triangles(); ++i) {
1801 Mesh::Triangle t = mesh->get_triangle(i);
1802 size_t offset = 3 * (i + mesh->tri_offset);
1803 prim_tri_verts[offset + 0] = float3_to_float4(mesh->verts[t.v[0]]);
1804 prim_tri_verts[offset + 1] = float3_to_float4(mesh->verts[t.v[1]]);
1805 prim_tri_verts[offset + 2] = float3_to_float4(mesh->verts[t.v[2]]);
1808 device->tex_alloc("__prim_tri_verts", dscene->prim_tri_verts);
1812 void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
1815 progress.set_status("Updating Scene BVH", "Building");
1817 VLOG(1) << (scene->params.use_qbvh ? "Using QBVH optimization structure"
1818 : "Using regular BVH optimization structure");
1821 bparams.top_level = true;
1822 bparams.use_qbvh = scene->params.use_qbvh;
1823 bparams.use_spatial_split = scene->params.use_bvh_spatial_split;
1824 bparams.use_unaligned_nodes = dscene->data.bvh.have_curves &&
1825 scene->params.use_bvh_unaligned_nodes;
1826 bparams.num_motion_triangle_steps = scene->params.num_bvh_time_steps;
1827 bparams.num_motion_curve_steps = scene->params.num_bvh_time_steps;
1830 bvh = BVH::create(bparams, scene->objects);
1831 bvh->build(progress);
1833 if(progress.get_cancel()) return;
1835 /* copy to device */
1836 progress.set_status("Updating Scene BVH", "Copying BVH to device");
1838 PackedBVH& pack = bvh->pack;
1840 if(pack.nodes.size()) {
1841 dscene->bvh_nodes.reference((float4*)&pack.nodes[0], pack.nodes.size());
1842 device->tex_alloc("__bvh_nodes", dscene->bvh_nodes);
1844 if(pack.leaf_nodes.size()) {
1845 dscene->bvh_leaf_nodes.reference((float4*)&pack.leaf_nodes[0], pack.leaf_nodes.size());
1846 device->tex_alloc("__bvh_leaf_nodes", dscene->bvh_leaf_nodes);
1848 if(pack.object_node.size()) {
1849 dscene->object_node.reference((uint*)&pack.object_node[0], pack.object_node.size());
1850 device->tex_alloc("__object_node", dscene->object_node);
1852 if(pack.prim_tri_index.size()) {
1853 dscene->prim_tri_index.reference((uint*)&pack.prim_tri_index[0], pack.prim_tri_index.size());
1854 device->tex_alloc("__prim_tri_index", dscene->prim_tri_index);
1856 if(pack.prim_tri_verts.size()) {
1857 dscene->prim_tri_verts.reference((float4*)&pack.prim_tri_verts[0], pack.prim_tri_verts.size());
1858 device->tex_alloc("__prim_tri_verts", dscene->prim_tri_verts);
1860 if(pack.prim_type.size()) {
1861 dscene->prim_type.reference((uint*)&pack.prim_type[0], pack.prim_type.size());
1862 device->tex_alloc("__prim_type", dscene->prim_type);
1864 if(pack.prim_visibility.size()) {
1865 dscene->prim_visibility.reference((uint*)&pack.prim_visibility[0], pack.prim_visibility.size());
1866 device->tex_alloc("__prim_visibility", dscene->prim_visibility);
1868 if(pack.prim_index.size()) {
1869 dscene->prim_index.reference((uint*)&pack.prim_index[0], pack.prim_index.size());
1870 device->tex_alloc("__prim_index", dscene->prim_index);
1872 if(pack.prim_object.size()) {
1873 dscene->prim_object.reference((uint*)&pack.prim_object[0], pack.prim_object.size());
1874 device->tex_alloc("__prim_object", dscene->prim_object);
1876 if(pack.prim_time.size()) {
1877 dscene->prim_time.reference((float2*)&pack.prim_time[0], pack.prim_time.size());
1878 device->tex_alloc("__prim_time", dscene->prim_time);
1881 dscene->data.bvh.root = pack.root_index;
1882 dscene->data.bvh.use_qbvh = scene->params.use_qbvh;
1883 dscene->data.bvh.use_bvh_steps = (scene->params.num_bvh_time_steps != 0);
1886 void MeshManager::device_update_flags(Device * /*device*/,
1887 DeviceScene * /*dscene*/,
1889 Progress& /*progress*/)
1891 if(!need_update && !need_flags_update) {
1895 foreach(Mesh *mesh, scene->meshes) {
1896 mesh->has_volume = false;
1897 foreach(const Shader *shader, mesh->used_shaders) {
1898 if(shader->has_volume) {
1899 mesh->has_volume = true;
1901 if(shader->has_surface_bssrdf) {
1902 mesh->has_surface_bssrdf = true;
1906 need_flags_update = false;
1909 void MeshManager::device_update_displacement_images(Device *device,
1910 DeviceScene *dscene,
1914 progress.set_status("Updating Displacement Images");
1916 ImageManager *image_manager = scene->image_manager;
1917 set<int> bump_images;
1918 foreach(Mesh *mesh, scene->meshes) {
1919 if(mesh->need_update) {
1920 foreach(Shader *shader, mesh->used_shaders) {
1921 if(!shader->has_displacement || shader->displacement_method == DISPLACE_BUMP) {
1924 foreach(ShaderNode* node, shader->graph->nodes) {
1925 if(node->special_type != SHADER_SPECIAL_TYPE_IMAGE_SLOT) {
1928 if(device->info.pack_images) {
1929 /* If device requires packed images we need to update all
1930 * images now, even if they're not used for displacement.
1932 image_manager->device_update(device,
1938 ImageSlotTextureNode *image_node = static_cast<ImageSlotTextureNode*>(node);
1939 int slot = image_node->slot;
1941 bump_images.insert(slot);
1947 foreach(int slot, bump_images) {
1948 pool.push(function_bind(&ImageManager::device_update_slot,
1959 void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
1964 VLOG(1) << "Total " << scene->meshes.size() << " meshes.";
1966 /* Update normals. */
1967 foreach(Mesh *mesh, scene->meshes) {
1968 foreach(Shader *shader, mesh->used_shaders) {
1969 if(shader->need_update_attributes)
1970 mesh->need_update = true;
1973 if(mesh->need_update) {
1974 mesh->add_face_normals();
1975 mesh->add_vertex_normals();
1977 if(mesh->need_attribute(scene, ATTR_STD_POSITION_UNDISPLACED)) {
1978 mesh->add_undisplaced();
1981 if(progress.get_cancel()) return;
1985 /* Tessellate meshes that are using subdivision */
1986 size_t total_tess_needed = 0;
1987 foreach(Mesh *mesh, scene->meshes) {
1988 if(mesh->need_update &&
1989 mesh->subdivision_type != Mesh::SUBDIVISION_NONE &&
1990 mesh->num_subd_verts == 0 &&
1993 total_tess_needed++;
1998 foreach(Mesh *mesh, scene->meshes) {
1999 if(mesh->need_update &&
2000 mesh->subdivision_type != Mesh::SUBDIVISION_NONE &&
2001 mesh->num_subd_verts == 0 &&
2004 string msg = "Tessellating ";
2005 if(mesh->name == "")
2006 msg += string_printf("%u/%u", (uint)(i+1), (uint)total_tess_needed);
2008 msg += string_printf("%s %u/%u", mesh->name.c_str(), (uint)(i+1), (uint)total_tess_needed);
2010 progress.set_status("Updating Mesh", msg);
2012 DiagSplit dsplit(*mesh->subd_params);
2013 mesh->tessellate(&dsplit);
2017 if(progress.get_cancel()) return;
2021 /* Update images needed for true displacement. */
2022 bool true_displacement_used = false;
2023 bool old_need_object_flags_update = false;
2024 foreach(Mesh *mesh, scene->meshes) {
2025 if(mesh->need_update &&
2026 mesh->has_true_displacement())
2028 true_displacement_used = true;
2032 if(true_displacement_used) {
2033 VLOG(1) << "Updating images used for true displacement.";
2034 device_update_displacement_images(device, dscene, scene, progress);
2035 old_need_object_flags_update = scene->object_manager->need_flags_update;
2036 scene->object_manager->device_update_flags(device,
2043 /* Device update. */
2044 device_free(device, dscene);
2046 mesh_calc_offset(scene);
2047 if(true_displacement_used) {
2048 device_update_mesh(device, dscene, scene, true, progress);
2050 if(progress.get_cancel()) return;
2052 /* after mesh data has been copied to device memory we need to update
2053 * offsets for patch tables as this can't be known before hand */
2054 scene->object_manager->device_update_patch_map_offsets(device, dscene, scene);
2056 device_update_attributes(device, dscene, scene, progress);
2057 if(progress.get_cancel()) return;
2059 /* Update displacement. */
2060 bool displacement_done = false;
2061 foreach(Mesh *mesh, scene->meshes) {
2062 if(mesh->need_update &&
2063 displace(device, dscene, scene, mesh, progress))
2065 displacement_done = true;
2069 /* TODO: properly handle cancel halfway displacement */
2070 if(progress.get_cancel()) return;
2072 /* Device re-update after displacement. */
2073 if(displacement_done) {
2074 device_free(device, dscene);
2076 device_update_attributes(device, dscene, scene, progress);
2077 if(progress.get_cancel()) return;
2082 foreach(Mesh *mesh, scene->meshes) {
2083 if(mesh->need_update && mesh->need_build_bvh()) {
2091 foreach(Mesh *mesh, scene->meshes) {
2092 if(mesh->need_update) {
2093 pool.push(function_bind(&Mesh::compute_bvh,
2100 if(mesh->need_build_bvh()) {
2106 TaskPool::Summary summary;
2107 pool.wait_work(&summary);
2108 VLOG(2) << "Objects BVH build pool statistics:\n"
2109 << summary.full_report();
2111 foreach(Shader *shader, scene->shaders) {
2112 shader->need_update_attributes = false;
2115 #ifdef __OBJECT_MOTION__
2116 Scene::MotionType need_motion = scene->need_motion(device->info.advanced_shading);
2117 bool motion_blur = need_motion == Scene::MOTION_BLUR;
2119 bool motion_blur = false;
2122 /* Update objects. */
2123 vector<Object *> volume_objects;
2124 foreach(Object *object, scene->objects) {
2125 object->compute_bounds(motion_blur);
2128 if(progress.get_cancel()) return;
2130 device_update_bvh(device, dscene, scene, progress);
2131 if(progress.get_cancel()) return;
2133 device_update_mesh(device, dscene, scene, false, progress);
2134 if(progress.get_cancel()) return;
2136 need_update = false;
2138 if(true_displacement_used) {
2139 /* Re-tag flags for update, so they're re-evaluated
2140 * for meshes with correct bounding boxes.
2142 * This wouldn't cause wrong results, just true
2143 * displacement might be less optimal ot calculate.
2145 scene->object_manager->need_flags_update = old_need_object_flags_update;
2149 void MeshManager::device_free(Device *device, DeviceScene *dscene)
2151 device->tex_free(dscene->bvh_nodes);
2152 device->tex_free(dscene->bvh_leaf_nodes);
2153 device->tex_free(dscene->object_node);
2154 device->tex_free(dscene->prim_tri_verts);
2155 device->tex_free(dscene->prim_tri_index);
2156 device->tex_free(dscene->prim_type);
2157 device->tex_free(dscene->prim_visibility);
2158 device->tex_free(dscene->prim_index);
2159 device->tex_free(dscene->prim_object);
2160 device->tex_free(dscene->prim_time);
2161 device->tex_free(dscene->tri_shader);
2162 device->tex_free(dscene->tri_vnormal);
2163 device->tex_free(dscene->tri_vindex);
2164 device->tex_free(dscene->tri_patch);
2165 device->tex_free(dscene->tri_patch_uv);
2166 device->tex_free(dscene->curves);
2167 device->tex_free(dscene->curve_keys);
2168 device->tex_free(dscene->patches);
2169 device->tex_free(dscene->attributes_map);
2170 device->tex_free(dscene->attributes_float);
2171 device->tex_free(dscene->attributes_float3);
2172 device->tex_free(dscene->attributes_uchar4);
2174 dscene->bvh_nodes.clear();
2175 dscene->object_node.clear();
2176 dscene->prim_tri_verts.clear();
2177 dscene->prim_tri_index.clear();
2178 dscene->prim_type.clear();
2179 dscene->prim_visibility.clear();
2180 dscene->prim_index.clear();
2181 dscene->prim_object.clear();
2182 dscene->prim_time.clear();
2183 dscene->tri_shader.clear();
2184 dscene->tri_vnormal.clear();
2185 dscene->tri_vindex.clear();
2186 dscene->tri_patch.clear();
2187 dscene->tri_patch_uv.clear();
2188 dscene->curves.clear();
2189 dscene->curve_keys.clear();
2190 dscene->patches.clear();
2191 dscene->attributes_map.clear();
2192 dscene->attributes_float.clear();
2193 dscene->attributes_float3.clear();
2194 dscene->attributes_uchar4.clear();
2197 OSLGlobals *og = (OSLGlobals*)device->osl_memory();
2200 og->object_name_map.clear();
2201 og->attribute_map.clear();
2202 og->object_names.clear();
2207 void MeshManager::tag_update(Scene *scene)
2210 scene->object_manager->need_update = true;
2213 bool Mesh::need_attribute(Scene *scene, AttributeStandard std)
2215 if(std == ATTR_STD_NONE)
2218 if(scene->need_global_attribute(std))
2221 foreach(Shader *shader, used_shaders)
2222 if(shader->attributes.find(std))
2228 bool Mesh::need_attribute(Scene * /*scene*/, ustring name)
2230 if(name == ustring())
2233 foreach(Shader *shader, used_shaders)
2234 if(shader->attributes.find(name))