19 const int num_triangles,
25 mesh->num_subd_added_verts = num_verts - mesh->get_verts().
size();
33 mesh_P = mesh->verts.data();
37 Attribute *attr_ptex_face_id = params.mesh->attributes.add(ATTR_STD_PTEX_FACE_ID);
38 Attribute *attr_ptex_uv = params.mesh->attributes.add(ATTR_STD_PTEX_UV);
40 mesh_ptex_face_id = attr_ptex_face_id->data_float();
41 mesh_ptex_uv = attr_ptex_uv->data_float2();
51 sub.
patch->
eval(&
P,
nullptr,
nullptr,
nullptr, uv.
x, uv.
y);
69 for (
int i = 0;
i < 3;
i++) {
70 for (
int j = 0; j < 3; j++) {
77 const float A3 =
quad_area(
P[0][1],
P[1][1],
P[0][2],
P[1][2]);
78 const float A4 =
quad_area(
P[1][1],
P[2][1],
P[1][2],
P[2][2]);
82 const float Atri =
params.dicing_rate *
params.dicing_rate * 0.5f;
83 const float Ntris = Apatch / Atri;
90 const float D = (4.0f *
N * Mu * Mv) + ((Mu + Mv) * (Mu + Mv));
91 const float S = (Mu + Mv +
sqrtf(
max(
D, 0.0f))) / (2 * Mu * Mv);
114 const int triangle_index,
122 assert(triangle_index * 3 <
params.mesh->triangles.size());
142 float2 uv[3] = {uv0, uv1, uv2};
150 const float du = 1.0f / (
float)Mu;
151 const float dv = 1.0f / (
float)Mv;
156 for (
int j = 1; j < Mv; j++) {
157 for (
int i = 1;
i < Mu;
i++) {
158 const float u =
i * du;
159 const float v = j * dv;
160 const int center_i = grid_vertex_offset + (
i - 1) + (j - 1) * (Mu - 1);
164 if (
i < Mu - 1 && j < Mv - 1) {
165 const int i1 = grid_vertex_offset + (
i - 1) + (j - 1) * (Mu - 1);
166 const int i2 = grid_vertex_offset +
i + (j - 1) * (Mu - 1);
167 const int i3 = grid_vertex_offset +
i + j * (Mu - 1);
168 const int i4 = grid_vertex_offset + (
i - 1) + j * (Mu - 1);
175 set_triangle(sub, triangle_index++, i1, i2, i3, uv1, uv2, uv3);
176 set_triangle(sub, triangle_index++, i1, i3, i4, uv1, uv3, uv4);
182 for (
int edge = 0; edge < 4; edge++) {
184 const int inner_T = ((edge % 2) == 0) ? Mu - 2 : Mv - 2;
186 float2 inner_uv, outer_uv, inner_uv_step, outer_uv_step;
192 outer_uv_step =
make_float2(1.0f / (
float)outer_T, 0.0f);
198 outer_uv_step =
make_float2(0.0f, 1.0f / (
float)outer_T);
204 outer_uv_step =
make_float2(-1.0f / (
float)outer_T, 0.0f);
211 outer_uv_step =
make_float2(0.0f, -1.0f / (
float)outer_T);
218 for (
size_t i = 0, j = 0;
i < inner_T || j < outer_T;) {
229 inner_uv += inner_uv_step;
230 uv2 = sub.
map_uv(inner_uv);
232 else if (
i == inner_T) {
234 outer_uv += outer_uv_step;
235 uv2 = sub.
map_uv(outer_uv);
248 outer_uv += outer_uv_step;
249 uv2 = sub.
map_uv(outer_uv);
254 inner_uv += inner_uv_step;
255 uv2 = sub.
map_uv(inner_uv);
268 const int left_T = sub.
edges[left_edge].
edge->
T;
269 const int right_T = sub.
edges[right_edge].
edge->
T;
271 float2 left_uv, right_uv, left_uv_step, right_uv_step;
272 if (right_edge == 0) {
275 left_uv_step =
make_float2(1.0f / (
float)left_T, 0.0f);
276 right_uv_step =
make_float2(1.0f / (
float)right_T, 0.0f);
281 left_uv_step =
make_float2(0.0f, 1.0f / (
float)left_T);
282 right_uv_step =
make_float2(0.0f, 1.0f / (
float)right_T);
290 for (
size_t i = 0, j = 0;
i < left_T || j < right_T;) {
301 left_uv += left_uv_step;
302 uv2 = sub.
map_uv(left_uv);
304 else if (
i == left_T) {
306 right_uv += right_uv_step;
307 uv2 = sub.
map_uv(right_uv);
320 right_uv += right_uv_step;
321 uv2 = sub.
map_uv(right_uv);
326 left_uv += left_uv_step;
327 uv2 = sub.
map_uv(left_uv);
338 for (
int edge = 0; edge < 4; edge++) {
344 for (
int i = i_start;
i < i_end;
i++) {
345 const float f =
i / (
float)t;
388 const int grid_Mu =
max((
int)
ceilf(S * Mu), 1);
389 const int grid_Mv =
max((
int)
ceilf(S * Mv), 1);
399 for (
int edge = 0; edge < 3; edge++) {
405 for (
int i = i_start;
i < i_end;
i++) {
406 const float f =
i / (
float)t;
431 const float d = 1.0f / (
float)(
M + 1);
452 for (
int i = 0;
i < 3;
i++) {
461 if (split_0 == 0 && sub.
edges[2].
edge->
T == 2) {
465 const int split_1 = (split_0 + 1) % 3;
466 const int split_2 = (split_0 + 2) % 3;
481 if (num_split == 3) {
487 set_triangle(sub, triangle_index++,
v[0], mid_v[0], mid_v[2], uv[0], mid_uv[0], mid_uv[2]);
488 set_triangle(sub, triangle_index++,
v[1], mid_v[1], mid_v[0], uv[1], mid_uv[1], mid_uv[0]);
489 set_triangle(sub, triangle_index++,
v[2], mid_v[2], mid_v[1], uv[2], mid_uv[2], mid_uv[1]);
491 sub, triangle_index++, mid_v[0], mid_v[1], mid_v[2], mid_uv[0], mid_uv[1], mid_uv[2]);
507 if (num_split == 1) {
545 const int inner_M =
M - 2;
547 for (
int j = 0; j < inner_M; j++) {
548 for (
int i = 0;
i < j + 1;
i++) {
549 const int i_next =
i + 1;
550 const int j_next = j + 1;
563 if (j == inner_M - 1) {
576 set_triangle(sub, triangle_index++, v0, v3, v1, uv0, uv3, uv1);
584 for (
int edge = 0; edge < 3; edge++) {
586 const int inner_T = inner_M;
588 float2 inner_uv, outer_uv, inner_uv_step, outer_uv_step;
594 outer_uv_step =
make_float2(1.0f / (
float)outer_T, 0.0f);
600 outer_uv_step =
make_float2(-1.0f / (
float)outer_T, 1.0f / (
float)outer_T);
607 outer_uv_step =
make_float2(0.0f, -1.0f / (
float)outer_T);
614 for (
size_t i = 0, j = 0;
i < inner_T || j < outer_T;) {
625 inner_uv += inner_uv_step;
626 uv2 = sub.
map_uv(inner_uv);
628 else if (
i == inner_T) {
630 outer_uv += outer_uv_step;
631 uv2 = sub.
map_uv(outer_uv);
644 outer_uv += outer_uv_step;
645 uv2 = sub.
map_uv(outer_uv);
650 inner_uv += inner_uv_step;
651 uv2 = sub.
map_uv(inner_uv);
665 const size_t num_subpatches =
split.get_num_subpatches();
669 parallel_for(blocked_range<size_t>(0, num_subpatches, 8), [&](
const blocked_range<size_t> &r) {
670 for (
size_t i = r.begin();
i != r.end();
i++) {
682 parallel_for(blocked_range<size_t>(0, num_subpatches, 8), [&](
const blocked_range<size_t> &r) {
683 for (
size_t i = r.begin();
i != r.end();
i++) {
static void split(const char *text, const char *seps, char ***str, int *count)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Attribute * add(ustring name, const TypeDesc type, AttributeElement element)
void tri_set_sides(const SubPatch &sub)
void set_vertex(const SubPatch &sub, const int index, const float2 uv)
void quad_dice(const SubPatch &sub)
void add_triangle_strip(const SubPatch &sub, const int left_edge, const int right_edge)
float quad_area(const float3 &a, const float3 &b, const float3 &c, const float3 &d)
float * mesh_ptex_face_id
float3 eval_projected(const SubPatch &sub, const float2 uv)
float scale_factor(const SubPatch &sub, const int Mu, const int Mv)
void tri_dice(const SubPatch &sub)
SubdAttributeInterpolation & interpolation
void add_grid_triangles_and_stitch(const SubPatch &sub, const int Mu, const int Mv)
EdgeDice(const SubdParams ¶ms, const int num_verts, const int num_triangles, SubdAttributeInterpolation &interpolation)
void quad_set_sides(const SubPatch &sub)
void set_triangle(const SubPatch &sub, const int triangle_index, const int v0, const int v1, const int v2, const float2 uv0, const float2 uv1, const float2 uv2)
void dice(const DiagSplit &split)
virtual void eval(float3 *P, float3 *dPdu, float3 *dPdv, float3 *N, const float u, float v) const =0
int get_inner_grid_vert_triangle(int i, int j) const
enum SubPatch::@271217051357320143155373165321151177022113114126 shape
int get_vert_along_edge_reverse(const int edge, const int n) const
int get_vert_along_edge(const int edge, const int n) const
int inner_grid_vert_offset
int calc_num_triangles() const
int get_vert_along_grid_edge(const int edge, const int n) const
float2 map_uv(float2 uv) const
CCL_NAMESPACE_END CCL_NAMESPACE_BEGIN ccl_device_inline float3 transform_perspective(const ccl_private ProjectionTransform *t, const float3 a)
#define CCL_NAMESPACE_END
#define assert(assertion)
ccl_device_inline float len_squared(const float2 a)
ccl_device_inline float triangle_area(const ccl_private float3 &v1, const ccl_private float3 &v2, const ccl_private float3 &v3)
void resize_mesh(const int numverts, const int numtris)
int start_vert_index() const
std::function< void(const int, const int, const int, const int *, const float2 *, const int)> interp