36 mesh->resize_mesh(mesh->get_verts().size() + num_verts, mesh->num_triangles());
37 mesh->reserve_mesh(mesh->get_verts().size() + num_verts, mesh->num_triangles() + num_triangles);
53 assert(index < params.mesh->
verts.size());
77 int outer_T = sub.
edges[edge].
T;
78 int inner_T = ((edge % 2) == 0) ? Mv - 2 : Mu - 2;
80 if (inner_T < 0 || outer_T < 0) {
88 for (
size_t i = 0, j = 0; i < inner_T || j < outer_T;) {
97 else if (i == inner_T) {
152 int t = sub.
edges[edge].
T;
155 for (
int i = 0; i < t; i++) {
156 float f = i / (
float)t;
193 for (
int i = 0; i < 3; i++) {
194 for (
int j = 0; j < 3; j++) {
207 float Ntris = Apatch / Atri;
213 float D = 4.0f *
N * Mu * Mv + (Mu + Mv) * (Mu + Mv);
214 float S = (Mu + Mv +
sqrtf(
max(D, 0.0f))) / (2 * Mu * Mv);
222 float du = 1.0f / (
float)Mu;
223 float dv = 1.0f / (
float)Mv;
225 for (
int j = 1; j < Mv; j++) {
226 for (
int i = 1; i < Mu; i++) {
230 set_vert(sub, offset + (i - 1) + (j - 1) * (Mu - 1), u,
v);
232 if (i < Mu - 1 && j < Mv - 1) {
233 int i1 = offset + (i - 1) + (j - 1) * (Mu - 1);
234 int i2 = offset + i + (j - 1) * (Mu - 1);
235 int i3 = offset + i + j * (Mu - 1);
236 int i4 = offset + (i - 1) + j * (Mu - 1);
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
Attribute * add(ustring name, TypeDesc type, AttributeElement element)
void reserve(int num_verts, int num_triangles)
void add_triangle(Patch *patch, int v0, int v1, int v2)
void stitch_triangles(Subpatch &sub, int edge)
void set_vert(Patch *patch, int index, float2 uv)
EdgeDice(const SubdParams ¶ms)
virtual void eval(float3 *P, float3 *dPdu, float3 *dPdv, float3 *N, float u, float v)=0
QuadDice(const SubdParams ¶ms)
float scale_factor(Subpatch &sub, int Mu, int Mv)
float2 map_uv(Subpatch &sub, float u, float v)
void add_grid(Subpatch &sub, int Mu, int Mv, int offset)
float3 eval_projected(Subpatch &sub, float u, float v)
void set_vert(Subpatch &sub, int index, float u, float v)
float quad_area(const float3 &a, const float3 &b, const float3 &c, const float3 &d)
void set_side(Subpatch &sub, int edge)
int get_vert_along_grid_edge(int edge, int n) const
int inner_grid_vert_offset
int get_vert_along_edge(int e, int n) const
local_group_size(16, 16) .push_constant(Type b
ccl_device_inline float3 transform_perspective(ccl_private const ProjectionTransform *t, const float3 a)
#define CCL_NAMESPACE_END
#define set_vert(a, b, quarter)
draw_view in_light_buf[] float
ccl_device_inline float len_squared(const float2 a)
ccl_device_inline float2 interp(const float2 a, const float2 b, float t)
ProjectionTransform worldtoraster
size_t num_triangles() const
void add_triangle(int v0, int v1, int v2, int shader, bool smooth)
CCL_NAMESPACE_END CCL_NAMESPACE_BEGIN ccl_device_inline float triangle_area(ccl_private const float3 &v1, ccl_private const float3 &v2, ccl_private const float3 &v3)