43 const size_t max_step = num_steps - 1;
44 const size_t step =
min((
size_t)(time * max_step), max_step - 1);
45 const float t = time * max_step - step;
52 r_verts[0] = (1.0f - t) * curr_verts[0] + t * next_verts[0];
53 r_verts[1] = (1.0f - t) * curr_verts[1] + t * next_verts[1];
54 r_verts[2] = (1.0f - t) * curr_verts[2] + t * next_verts[2];
64 const size_t center_step = ((num_steps - 1) / 2);
65 if (step == center_step) {
73 if (step > center_step) {
76 size_t offset = step * num_verts;
77 r_verts[0] = vert_steps[offset +
v[0]];
78 r_verts[1] = vert_steps[offset +
v[1]];
79 r_verts[2] = vert_steps[offset +
v[2]];
89 const float normlen =
len(
norm);
90 if (normlen == 0.0f) {
93 return norm / normlen;
126 static NodeEnum subdivision_type_enum;
134 subd_vert_creases_weight,
"Subdivision Vertex Crease Weights",
array<float>());
146 SOCKET_FLOAT(subd_dicing_rate,
"Subdivision Dicing Rate", 1.0f)
147 SOCKET_INT(subd_max_level,
"Max Subdivision Level", 1);
172 return get_subd_params() && (verts_is_modified() || subd_dicing_rate_is_modified() ||
173 subd_objecttoworld_is_modified() || subd_max_level_is_modified());
206 verts.resize(numverts);
207 triangles.resize(numtris * 3);
208 shader.resize(numtris);
209 smooth.resize(numtris);
212 triangle_patch.resize(numtris);
213 vert_patch_uv.resize(numverts);
222 verts.reserve(numverts);
223 triangles.reserve(numtris * 3);
224 shader.reserve(numtris);
225 smooth.reserve(numtris);
228 triangle_patch.reserve(numtris);
229 vert_patch_uv.reserve(numverts);
232 attributes.resize(
true);
237 subd_start_corner.resize(numfaces);
238 subd_num_corners.resize(numfaces);
239 subd_shader.resize(numfaces);
240 subd_smooth.resize(numfaces);
241 subd_ptex_offset.resize(numfaces);
242 subd_face_corners.resize(numcorners);
243 num_ngons = num_ngons_;
244 num_subd_faces = numfaces;
251 subd_start_corner.reserve(numfaces);
252 subd_num_corners.reserve(numfaces);
253 subd_shader.reserve(numfaces);
254 subd_smooth.reserve(numfaces);
255 subd_ptex_offset.reserve(numfaces);
256 subd_face_corners.reserve(numcorners);
257 num_ngons = num_ngons_;
258 num_subd_faces = numfaces;
265 subd_creases_edge.reserve(num_creases * 2);
266 subd_creases_weight.reserve(num_creases);
276 vert_to_stitching_key_map.clear();
277 vert_stitching_map.clear();
293 triangle_patch.clear();
294 vert_patch_uv.clear();
296 subd_start_corner.clear();
297 subd_num_corners.clear();
300 subd_ptex_offset.clear();
301 subd_face_corners.clear();
303 subd_creases_edge.clear();
304 subd_creases_weight.clear();
307 attributes.clear(preserve_voxel_data);
316 clear(preserve_shaders,
false);
321 verts.push_back_reserved(
P);
322 tag_verts_modified();
326 tag_vert_patch_uv_modified();
333 tag_verts_modified();
337 tag_vert_patch_uv_modified();
343 triangles.push_back_reserved(v0);
344 triangles.push_back_reserved(v1);
345 triangles.push_back_reserved(
v2);
346 shader.push_back_reserved(shader_);
347 smooth.push_back_reserved(smooth_);
349 tag_triangles_modified();
350 tag_shader_modified();
351 tag_smooth_modified();
354 triangle_patch.push_back_reserved(-1);
355 tag_triangle_patch_modified();
361 int start_corner = subd_face_corners.size();
363 for (
int i = 0; i < num_corners; i++) {
364 subd_face_corners.push_back_reserved(corners[i]);
370 if (subd_shader.size()) {
372 ptex_offset = s.ptex_offset + s.num_ptex_faces();
375 subd_start_corner.push_back_reserved(start_corner);
376 subd_num_corners.push_back_reserved(num_corners);
377 subd_shader.push_back_reserved(shader_);
378 subd_smooth.push_back_reserved(smooth_);
379 subd_ptex_offset.push_back_reserved(ptex_offset);
381 tag_subd_face_corners_modified();
382 tag_subd_start_corner_modified();
383 tag_subd_num_corners_modified();
384 tag_subd_shader_modified();
385 tag_subd_smooth_modified();
386 tag_subd_ptex_offset_modified();
393 s.num_corners = subd_num_corners[
index];
394 s.smooth = subd_smooth[
index];
395 s.ptex_offset = subd_ptex_offset[
index];
396 s.start_corner = subd_start_corner[
index];
402 subd_creases_edge.push_back_slow(v0);
403 subd_creases_edge.push_back_slow(v1);
404 subd_creases_weight.push_back_slow(weight);
406 tag_subd_creases_edge_modified();
407 tag_subd_creases_edge_modified();
408 tag_subd_creases_weight_modified();
413 subd_vert_creases.push_back_slow(
v);
414 subd_vert_creases_weight.push_back_slow(weight);
416 tag_subd_vert_creases_modified();
417 tag_subd_vert_creases_weight_modified();
429 size_t numverts =
verts.size();
447 attr = attributes.find(map);
464 if (verts_size > 0) {
465 for (
size_t i = 0; i < verts_size; i++) {
470 if (use_motion_blur && attr) {
471 size_t steps_size =
verts.size() * (motion_steps - 1);
474 for (
size_t i = 0; i < steps_size; i++) {
475 bnds.
grow(vert_steps[i]);
483 for (
size_t i = 0; i < verts_size; i++) {
487 if (use_motion_blur && attr) {
488 size_t steps_size =
verts.size() * (motion_steps - 1);
491 for (
size_t i = 0; i < steps_size; i++) {
511 for (
size_t i = 0; i <
verts.size(); i++) {
515 tag_verts_modified();
517 if (apply_to_motion) {
521 size_t steps_size =
verts.size() * (motion_steps - 1);
524 for (
size_t i = 0; i < steps_size; i++) {
533 size_t steps_size =
verts.size() * (motion_steps - 1);
536 for (
size_t i = 0; i < steps_size; i++) {
557 if (triangles_size) {
560 for (
size_t i = 0; i < triangles_size; i++) {
569 for (
size_t i = 0; i < triangles_size; i++) {
578 size_t verts_size =
verts.size();
593 for (
size_t i = 0; i < triangles_size; i++) {
594 for (
size_t j = 0; j < 3; j++) {
600 for (
size_t i = 0; i < verts_size; i++) {
605 for (
size_t i = 0; i < verts_size; i++) {
619 for (
int step = 0; step < motion_steps - 1; step++) {
626 for (
size_t i = 0; i < triangles_size; i++) {
629 for (
size_t j = 0; j < 3; j++) {
635 for (
size_t i = 0; i < verts_size; i++) {
640 for (
size_t i = 0; i < verts_size; i++) {
658 float3 fN = face.normal(
this);
660 for (
size_t j = 0; j < face.num_corners; j++) {
661 size_t corner = subd_face_corners[face.start_corner + j];
667 for (
size_t i = 0; i < verts_size; i++) {
672 for (
size_t i = 0; i < verts_size; i++) {
704 memcpy(data,
verts.data(), size);
711 uint last_shader = -1;
712 bool last_smooth =
false;
715 const int *shader_ptr = shader.data();
716 const bool *smooth_ptr = smooth.data();
718 for (
size_t i = 0; i < triangles_size; i++) {
719 const int new_shader = shader_ptr ? shader_ptr[i] : INT_MAX;
720 const bool new_smooth = smooth_ptr ? smooth_ptr[i] :
false;
722 if (new_shader != last_shader || last_smooth != new_smooth) {
723 last_shader = new_shader;
724 last_smooth = new_smooth;
725 Shader *shader = (last_shader < used_shaders.size()) ?
726 static_cast<Shader *
>(used_shaders[last_shader]) :
727 scene->default_surface;
728 shader_id = scene->shader_manager->get_shader_id(shader, last_smooth);
731 tri_shader[i] = shader_id;
738 if (attr_vN ==
NULL) {
747 size_t verts_size =
verts.size();
750 for (
size_t i = 0; i < verts_size; i++) {
755 for (
size_t i = 0; i < verts_size; i++) {
766 size_t verts_size =
verts.size();
768 const int *p_tris = triangles.data();
771 float2 *vert_patch_uv_ptr = vert_patch_uv.data();
773 for (
size_t i = 0; i < verts_size; i++) {
774 tri_verts[i] =
verts[i];
775 tri_patch_uv[i] = vert_patch_uv_ptr[i];
777 for (
size_t i = 0; i < triangles_size; i++) {
779 p_tris[off + 1] + vert_offset,
780 p_tris[off + 2] + vert_offset);
781 tri_patch[i] = triangle_patch[i] * 8 + patch_offset;
786 for (
size_t i = 0; i < verts_size; i++) {
787 tri_verts[i] =
verts[i];
789 for (
size_t i = 0; i < triangles_size; i++) {
791 p_tris[off + 1] + vert_offset,
792 p_tris[off + 2] + vert_offset);
804 for (
size_t f = 0; f < num_faces; f++) {
807 if (face.is_quad()) {
809 memcpy(c, &subd_face_corners[face.start_corner],
sizeof(
int) * 4);
811 *(patch_data++) = c[0] + vert_offset;
812 *(patch_data++) = c[1] + vert_offset;
813 *(patch_data++) = c[2] + vert_offset;
814 *(patch_data++) = c[3] + vert_offset;
816 *(patch_data++) = f + face_offset;
817 *(patch_data++) = face.num_corners;
818 *(patch_data++) = face.start_corner + corner_offset;
822 for (
int i = 0; i < face.num_corners; i++) {
824 c[0] = subd_face_corners[face.start_corner +
mod(i + 0, face.num_corners)];
825 c[1] = subd_face_corners[face.start_corner +
mod(i + 1, face.num_corners)];
826 c[2] =
verts.size() - num_subd_verts + ngons;
827 c[3] = subd_face_corners[face.start_corner +
mod(i - 1, face.num_corners)];
829 *(patch_data++) = c[0] + vert_offset;
830 *(patch_data++) = c[1] + vert_offset;
831 *(patch_data++) = c[2] + vert_offset;
832 *(patch_data++) = c[3] + vert_offset;
834 *(patch_data++) = f + face_offset;
835 *(patch_data++) = face.num_corners | (i << 16);
836 *(patch_data++) = face.start_corner + corner_offset;
837 *(patch_data++) = subd_face_corners.size() + ngons + corner_offset;
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
Attribute * add(ustring name, TypeDesc type, AttributeElement element)
Attribute * find(ustring name) const
void resize(bool reserve_only=false)
void clear(bool preserve_voxel_data=false)
void get_uv_tiles(Geometry *geom, AttributePrimitive prim, unordered_set< int > &tiles) const
size_t buffer_size(Geometry *geom, AttributePrimitive prim) const
size_t data_sizeof() const
Transform transform_normal
int motion_step(float time) const
bool has_motion_blur() const
bool transform_negative_scaled
virtual void clear(bool preserve_shaders=false)
#define CCL_NAMESPACE_END
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
@ PRIMITIVE_MOTION_TRIANGLE
@ ATTR_STD_MOTION_VERTEX_NORMAL
@ ATTR_STD_POSITION_UNDISPLACED
@ ATTR_STD_MOTION_VERTEX_POSITION
CCL_NAMESPACE_BEGIN ccl_device_inline float2 zero_float2()
ccl_device_inline float2 safe_normalize(const float2 a)
ccl_device_inline float cross(const float2 a, const float2 b)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
#define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value,...)
#define SOCKET_POINT_ARRAY(name, ui_name, default_value,...)
#define SOCKET_POINT2_ARRAY(name, ui_name, default_value,...)
#define SOCKET_FLOAT(name, ui_name, default_value,...)
#define SOCKET_INT(name, ui_name, default_value,...)
#define SOCKET_FLOAT_ARRAY(name, ui_name, default_value,...)
#define SOCKET_TRANSFORM(name, ui_name, default_value,...)
#define SOCKET_INT_ARRAY(name, ui_name, default_value,...)
#define NODE_DEFINE(structname)
#define SOCKET_ENUM(name, ui_name, values, default_value,...)
__forceinline bool valid() const
__forceinline float3 size() const
__forceinline void grow_safe(const float3 &pt)
__forceinline void grow(const float3 &pt)
float3 normal(const Mesh *mesh) const
bool valid(const float3 *verts) const
void motion_verts(const float3 *verts, const float3 *vert_steps, size_t num_verts, size_t num_steps, float time, float3 r_verts[3]) const
void verts_for_step(const float3 *verts, const float3 *vert_steps, size_t num_verts, size_t num_steps, size_t step, float3 r_verts[3]) const
void bounds_grow(const float3 *verts, BoundBox &bounds) const
float3 compute_normal(const float3 *verts) const
SubdParams * get_subd_params()
void reserve_subd_faces(int numfaces, int num_ngons, int numcorners)
size_t get_num_subd_faces() const
void add_edge_crease(int v0, int v1, float weight)
void reserve_subd_creases(size_t num_creases)
void compute_bounds() override
void add_vertex_normals()
AttributeSet subd_attributes
Triangle get_triangle(size_t i) const
void copy_center_to_motion_step(const int motion_step)
void clear(bool preserve_shaders=false) override
void resize_subd_faces(int numfaces, int num_ngons, int numcorners)
void pack_patches(uint *patch_data)
void pack_verts(packed_float3 *tri_verts, packed_uint3 *tri_vindex, uint *tri_patch, float2 *tri_patch_uv)
void reserve_mesh(int numverts, int numfaces)
void add_vertex_slow(float3 P)
@ SUBDIVISION_CATMULL_CLARK
size_t num_triangles() const
void pack_normals(packed_float3 *vnormal)
void add_vertex(float3 P)
void get_uv_tiles(ustring map, unordered_set< int > &tiles) override
void add_vertex_crease(int v, float weight)
void add_triangle(int v0, int v1, int v2, int shader, bool smooth)
SubdFace get_subd_face(size_t index) const
void pack_shaders(Scene *scene, uint *shader)
PrimitiveType primitive_type() const override
void resize_mesh(int numverts, int numfaces)
void add_subd_face(const int *corners, int num_corners, int shader_, bool smooth_)
void apply_transform(const Transform &tfm, const bool apply_to_motion) override
void insert(const char *x, int y)
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
ccl_device_inline packed_uint3 make_packed_uint3(uint x, uint y, uint z)
ccl_device_inline int mod(int x, int m)
ccl_device_inline bool isfinite_safe(float f)