25 params->radius_scaled[0] = radius * radius_e[0];
26 params->radius_scaled[1] =
params->radius_scaled[0] * radius_e[1];
27 params->radius_scaled[2] =
params->radius_scaled[1] * radius_e[2];
34 const int num_iterations)
38 const float *radius_scaled =
params->radius_scaled;
40 for (
int i = 0; i < num_iterations; i++) {
45 for (
int i = 0; i < num_iterations; i++) {
46 kelvinlet[i] = ((
a -
b) / radius_e[i]) + ((
b *
pow2f(radius)) /
pow3f(radius_e[i])) +
47 ((
a *
pow2f(radius_scaled[i])) / (2.0f *
pow3f(radius_e[i])));
53 const float elem_orig_co[3],
54 const float brush_location[3],
55 const float brush_delta[3])
57 float radius_e[3], kelvinlet[3];
59 const float radius =
len_v3v3(brush_location, elem_orig_co);
63 const float fade = kelvinlet[0] *
c;
70 const float elem_orig_co[3],
71 const float brush_location[3],
72 const float brush_delta[3])
74 float radius_e[3], kelvinlet[3];
76 const float *radius_scaled =
params->radius_scaled;
77 float radius =
len_v3v3(brush_location, elem_orig_co);
81 const float u = kelvinlet[0] - kelvinlet[1];
82 const float fade = u *
c / ((1.0f / radius_scaled[0]) - (1.0f / radius_scaled[1]));
89 const float elem_orig_co[3],
90 const float brush_location[3],
91 const float brush_delta[3])
93 float radius_e[3], kelvinlet[3], weights[3];
95 const float *radius_scaled =
params->radius_scaled;
96 const float radius =
len_v3v3(brush_location, elem_orig_co);
101 weights[1] = -((
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[0])) /
102 (
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[1])));
103 weights[2] = ((
pow2f(radius_scaled[1]) -
pow2f(radius_scaled[0])) /
104 (
pow2f(radius_scaled[2]) -
pow2f(radius_scaled[1])));
106 const float u = weights[0] * kelvinlet[0] + weights[1] * kelvinlet[1] +
107 weights[2] * kelvinlet[2];
108 const float fade = u *
c /
109 (weights[0] / radius_scaled[0] + weights[1] / radius_scaled[1] +
110 weights[2] / radius_scaled[2]);
116 float[3],
const float *,
const float *,
const float *,
const KelvinletParams *);
120 const float vertex_co[3],
121 const float location[3],
125 float k[4][3], k_it[4][3];
126 kelvinlet(k[0], vertex_co, location,
normal, p);
130 kelvinlet(k[1], k_it[0], location,
normal, p);
134 kelvinlet(k[2], k_it[1], location,
normal, p);
138 kelvinlet(k[3], k_it[2], location,
normal, p);
148 const float vertex_co[3],
149 const float location[3],
153 float radius_vertex[3];
155 const float radius =
len_v3(radius_vertex);
157 const float u = (2.0f * p->
b - p->
a) * ((1.0f /
pow3f(radius_e))) +
159 const float fade = u * p->
c;
165 const float elem_orig_co[3],
166 const float brush_location[3],
167 const float surface_normal[3])
175 const float vertex_co[3],
176 const float location[3],
180 float radius_vertex[3], q_r[3];
182 const float radius =
len_v3(radius_vertex);
184 const float u = -p->
a * ((1.0f /
pow3f(radius_e))) +
186 const float fade = u * p->
c;
193 const float elem_orig_co[3],
194 const float brush_location[3],
195 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
SyclQueue void void size_t num_bytes void
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)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
CCL_NAMESPACE_BEGIN ccl_device float fade(float t)
float radius_scaled[KELVINLET_MAX_ITERATIONS]