41 params->radius_scaled[0] = radius * radius_e[0];
42 params->radius_scaled[1] =
params->radius_scaled[0] * radius_e[1];
43 params->radius_scaled[2] =
params->radius_scaled[1] * radius_e[2];
50 const int num_iterations)
54 const float *radius_scaled =
params->radius_scaled;
56 for (
int i = 0; i < num_iterations; i++) {
61 for (
int i = 0; i < num_iterations; i++) {
62 kelvinlet[i] = ((
a - b) / radius_e[i]) + ((b *
pow2f(radius)) /
pow3f(radius_e[i])) +
63 ((
a *
pow2f(radius_scaled[i])) / (2.0f *
pow3f(radius_e[i])));
69 const float elem_orig_co[3],
70 const float brush_location[3],
71 const float brush_delta[3])
73 float radius_e[3], kelvinlet[3];
75 const float radius =
len_v3v3(brush_location, elem_orig_co);
79 const float fade = kelvinlet[0] *
c;
86 const float elem_orig_co[3],
87 const float brush_location[3],
88 const float brush_delta[3])
90 float radius_e[3], kelvinlet[3];
92 const float *radius_scaled =
params->radius_scaled;
93 float radius =
len_v3v3(brush_location, elem_orig_co);
97 const float u = kelvinlet[0] - kelvinlet[1];
98 const float fade = u *
c / ((1.0f / radius_scaled[0]) - (1.0f / radius_scaled[1]));
105 const float elem_orig_co[3],
106 const float brush_location[3],
107 const float brush_delta[3])
109 float radius_e[3], kelvinlet[3], weights[3];
111 const float *radius_scaled =
params->radius_scaled;
112 const float radius =
len_v3v3(brush_location, elem_orig_co);
117 weights[1] = -((
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[0])) /
118 (
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[1])));
119 weights[2] = ((
pow2f(radius_scaled[1]) -
pow2f(radius_scaled[0])) /
120 (
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[1])));
122 const float u = weights[0] * kelvinlet[0] + weights[1] * kelvinlet[1] +
123 weights[2] * kelvinlet[2];
124 const float fade = u *
c /
125 (weights[0] / radius_scaled[0] + weights[1] / radius_scaled[1] +
126 weights[2] / radius_scaled[2]);
132 float[3],
const float *,
const float *,
const float *,
const KelvinletParams *);
136 const float vertex_co[3],
137 const float location[3],
141 float k[4][3], k_it[4][3];
142 kelvinlet(k[0], vertex_co, location,
normal, p);
146 kelvinlet(k[1], k_it[0], location,
normal, p);
150 kelvinlet(k[2], k_it[1], location,
normal, p);
154 kelvinlet(k[3], k_it[2], location,
normal, p);
164 const float vertex_co[3],
165 const float location[3],
169 float radius_vertex[3];
171 const float radius =
len_v3(radius_vertex);
173 const float u = (2.0f * p->
b - p->
a) * ((1.0f /
pow3f(radius_e))) +
175 const float fade = u * p->
c;
181 const float elem_orig_co[3],
182 const float brush_location[3],
183 const float surface_normal[3])
191 const float vertex_co[3],
192 const float location[3],
196 float radius_vertex[3], q_r[3];
198 const float radius =
len_v3(radius_vertex);
200 const float u = -p->
a * ((1.0f /
pow3f(radius_e))) +
202 const float fade = u * p->
c;
209 const float elem_orig_co[3],
210 const float brush_location[3],
211 const float surface_normal[3])
typedef float(TangentPoint)[2]
#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
IconTextureDrawCall normal
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)
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)
static void kelvinlet_scale(float disp[3], const float vertex_co[3], const float location[3], const float UNUSED(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])
void(* kelvinlet_fn)(float[3], const float *, const float *, const float *, const KelvinletParams *)
MINLINE float pow5f(float x)
float radius_scaled[KELVINLET_MAX_ITERATIONS]
CCL_NAMESPACE_BEGIN ccl_device float fade(float t)