28 params->radius_scaled[0] = radius * radius_e[0];
29 params->radius_scaled[1] =
params->radius_scaled[0] * radius_e[1];
30 params->radius_scaled[2] =
params->radius_scaled[1] * radius_e[2];
37 const int num_iterations)
41 const float *radius_scaled =
params->radius_scaled;
43 for (
int i = 0; i < num_iterations; i++) {
48 for (
int i = 0; i < num_iterations; i++) {
49 kelvinlet[i] = ((a -
b) / radius_e[i]) + ((
b *
pow2f(radius)) /
pow3f(radius_e[i])) +
50 ((a *
pow2f(radius_scaled[i])) / (2.0f *
pow3f(radius_e[i])));
56 const float elem_orig_co[3],
57 const float brush_location[3],
58 const float brush_delta[3])
60 float radius_e[3], kelvinlet[3];
62 const float radius =
len_v3v3(brush_location, elem_orig_co);
66 const float fade = kelvinlet[0] * c;
73 const float elem_orig_co[3],
74 const float brush_location[3],
75 const float brush_delta[3])
77 float radius_e[3], kelvinlet[3];
79 const float *radius_scaled =
params->radius_scaled;
80 float radius =
len_v3v3(brush_location, elem_orig_co);
84 const float u = kelvinlet[0] - kelvinlet[1];
85 const float fade = u * c / ((1.0f / radius_scaled[0]) - (1.0f / radius_scaled[1]));
92 const float elem_orig_co[3],
93 const float brush_location[3],
94 const float brush_delta[3])
96 float radius_e[3], kelvinlet[3], weights[3];
98 const float *radius_scaled =
params->radius_scaled;
99 const float radius =
len_v3v3(brush_location, elem_orig_co);
104 weights[1] = -((
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[0])) /
105 (
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[1])));
106 weights[2] = ((
pow2f(radius_scaled[1]) -
pow2f(radius_scaled[0])) /
107 (
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[1])));
109 const float u = weights[0] * kelvinlet[0] + weights[1] * kelvinlet[1] +
110 weights[2] * kelvinlet[2];
111 const float fade = u * c /
112 (weights[0] / radius_scaled[0] + weights[1] / radius_scaled[1] +
113 weights[2] / radius_scaled[2]);
119 void (*)(
float[3],
const float *,
const float *,
const float *,
const KelvinletParams *);
123 const float vertex_co[3],
124 const float location[3],
125 const float normal[3],
128 float k[4][3], k_it[4][3];
129 kelvinlet(k[0], vertex_co, location, normal, p);
133 kelvinlet(k[1], k_it[0], location, normal, p);
137 kelvinlet(k[2], k_it[1], location, normal, p);
141 kelvinlet(k[3], k_it[2], location, normal, p);
151 const float vertex_co[3],
152 const float location[3],
156 float radius_vertex[3];
158 const float radius =
len_v3(radius_vertex);
160 const float u = (2.0f * p->
b - p->
a) * (1.0f /
pow3f(radius_e)) +
162 const float fade = u * p->
c;
168 const float elem_orig_co[3],
169 const float brush_location[3],
170 const float surface_normal[3])
178 const float vertex_co[3],
179 const float location[3],
180 const float normal[3],
183 float radius_vertex[3], q_r[3];
185 const float radius =
len_v3(radius_vertex);
187 const float u = -p->
a * (1.0f /
pow3f(radius_e)) +
189 const float fade = u * p->
c;
196 const float elem_orig_co[3],
197 const float brush_location[3],
198 const float surface_normal[3])
#define KELVINLET_MAX_ITERATIONS
MINLINE float pow2f(float x)
MINLINE float pow3f(float x)
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
void(*)(float[3], const float *, const float *, const float *, const KelvinletParams *) kelvinlet_fn
void BKE_kelvinlet_grab(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
void BKE_kelvinlet_grab_triscale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
static void init_kelvinlet_grab(float radius_e[3], float kelvinlet[3], const float radius, const KelvinletParams *params, const int num_iterations)
void BKE_kelvinlet_init_params(KelvinletParams *params, float radius, float force, float shear_modulus, float poisson_ratio)
void BKE_kelvinlet_grab_biscale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
static void sculpt_kelvinet_integrate(kelvinlet_fn kelvinlet, float r_disp[3], const float vertex_co[3], const float location[3], const float normal[3], const KelvinletParams *p)
static void kelvinlet_scale(float disp[3], const float vertex_co[3], const float location[3], const float[3], const KelvinletParams *p)
void BKE_kelvinlet_scale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float surface_normal[3])
static void kelvinlet_twist(float disp[3], const float vertex_co[3], const float location[3], const float normal[3], const KelvinletParams *p)
void BKE_kelvinlet_twist(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float surface_normal[3])
MINLINE float pow5f(float x)
CCL_NAMESPACE_BEGIN ccl_device float fade(float t)
float radius_scaled[KELVINLET_MAX_ITERATIONS]