45static float nextfr(
RNG *rng,
float min,
float max)
50static float gaussRand(
RNG *rng)
60 x = nextfr(rng, -1, 1);
61 y = nextfr(rng, -1, 1);
71MINLINE float catrom(
float p0,
float p1,
float p2,
float p3,
float f)
73 return 0.5f * ((2.0f * p1) + (-p0 + p2) * f + (2.0f * p0 - 5.0f * p1 + 4.0f * p2 - p3) * f * f +
74 (-p0 + 3.0f * p1 - 3.0f * p2 + p3) * f * f * f);
77MINLINE float omega(
float k,
float depth)
83static float Ph(
Ocean *o,
float kx,
float kz)
86 float k2 = kx * kx + kz * kz;
93 tmp = (o->_wx * kx + o->_wz * kz) /
sqrtf(k2);
95 tmp *= o->_damp_reflections;
98 return o->_A *
expf(-1.0f / (k2 * (o->_L * o->_L))) *
expf(-k2 * (o->_l * o->_l)) *
99 powf(
fabsf(tmp), o->_wind_alignment) / (k2 * k2);
102static void compute_eigenstuff(
OceanResult *ocr,
float jxx,
float jzz,
float jxz)
104 float a,
b, qplus, qminus;
106 b =
sqrt((jxx - jzz) * (jxx - jzz) + 4 * jxz * jxz);
109 ocr->
Jplus = 0.5f * (a +
b);
111 qplus = (ocr->
Jplus - jxx) / jxz;
112 qminus = (ocr->
Jminus - jxx) / jxz;
114 a =
sqrt(1 + qplus * qplus);
115 b =
sqrt(1 + qminus * qminus);
117 ocr->
Eplus[0] = 1.0f / a;
118 ocr->
Eplus[1] = 0.0f;
119 ocr->
Eplus[2] = qplus / a;
131static void init_complex(fftw_complex cmpl,
float real,
float image)
137static void add_comlex_c(fftw_complex res,
const fftw_complex cmpl1,
const fftw_complex cmpl2)
139 res[0] = cmpl1[0] + cmpl2[0];
140 res[1] = cmpl1[1] + cmpl2[1];
143static void mul_complex_f(fftw_complex res,
const fftw_complex cmpl,
float f)
145 res[0] = cmpl[0] * double(f);
146 res[1] = cmpl[1] * double(f);
149static void mul_complex_c(fftw_complex res,
const fftw_complex cmpl1,
const fftw_complex cmpl2)
152 temp[0] = cmpl1[0] * cmpl2[0] - cmpl1[1] * cmpl2[1];
153 temp[1] = cmpl1[0] * cmpl2[1] + cmpl1[1] * cmpl2[0];
158static float real_c(fftw_complex cmpl)
163static float image_c(fftw_complex cmpl)
168static void conj_complex(fftw_complex res,
const fftw_complex cmpl1)
174static void exp_complex(fftw_complex res, fftw_complex cmpl)
176 float r =
expf(cmpl[0]);
178 res[0] =
cosf(cmpl[1]) * r;
179 res[1] =
sinf(cmpl[1]) * r;
184 float foam = jminus * -0.005f + coverage;
185 CLAMP(foam, 0.0f, 1.0f);
192 float frac_x, frac_z;
227 interpf(interpf(m[i1 * oc->_N + j1], m[i0 * oc->_N + j1], frac_x), \
228 interpf(m[i1 * oc->_N + j0], m[i0 * oc->_N + j0], frac_x), \
232 if (oc->_do_disp_y) {
233 ocr->
disp[1] = BILERP(oc->_disp_y);
236 if (oc->_do_normals) {
237 ocr->
normal[0] = BILERP(oc->_N_x);
238 ocr->
normal[1] = oc->_N_y ;
239 ocr->
normal[2] = BILERP(oc->_N_z);
243 ocr->
disp[0] = BILERP(oc->_disp_x);
244 ocr->
disp[2] = BILERP(oc->_disp_z);
251 if (oc->_do_jacobian) {
252 compute_eigenstuff(ocr, BILERP(oc->_Jxx), BILERP(oc->_Jzz), BILERP(oc->_Jxz));
262 int i0, i1, i2, i3, j0, j1, j2, j3;
263 float frac_x, frac_z;
299 i0 = i0 < 0 ? i0 + oc->_M : i0;
300 i3 = i3 >= oc->_M ? i3 - oc->_M : i3;
304 j0 = j0 < 0 ? j0 + oc->_N : j0;
305 j3 = j3 >= oc->_N ? j3 - oc->_N : j3;
308 catrom(catrom(m[i0 * oc->_N + j0], \
309 m[i1 * oc->_N + j0], \
310 m[i2 * oc->_N + j0], \
311 m[i3 * oc->_N + j0], \
313 catrom(m[i0 * oc->_N + j1], \
314 m[i1 * oc->_N + j1], \
315 m[i2 * oc->_N + j1], \
316 m[i3 * oc->_N + j1], \
318 catrom(m[i0 * oc->_N + j2], \
319 m[i1 * oc->_N + j2], \
320 m[i2 * oc->_N + j2], \
321 m[i3 * oc->_N + j2], \
323 catrom(m[i0 * oc->_N + j3], \
324 m[i1 * oc->_N + j3], \
325 m[i2 * oc->_N + j3], \
326 m[i3 * oc->_N + j3], \
331 if (oc->_do_disp_y) {
332 ocr->
disp[1] = INTERP(oc->_disp_y);
334 if (oc->_do_normals) {
335 ocr->
normal[0] = INTERP(oc->_N_x);
336 ocr->
normal[1] = oc->_N_y ;
337 ocr->
normal[2] = INTERP(oc->_N_z);
340 ocr->
disp[0] = INTERP(oc->_disp_x);
341 ocr->
disp[2] = INTERP(oc->_disp_z);
348 if (oc->_do_jacobian) {
349 compute_eigenstuff(ocr, INTERP(oc->_Jxx), INTERP(oc->_Jzz), INTERP(oc->_Jxz));
374 ocr->
disp[1] = oc->_do_disp_y ?
float(oc->_disp_y[
i * oc->_N + j]) : 0.0f;
377 ocr->
disp[0] = oc->_disp_x[
i * oc->_N + j];
378 ocr->
disp[2] = oc->_disp_z[
i * oc->_N + j];
385 if (oc->_do_normals) {
386 ocr->
normal[0] = oc->_N_x[
i * oc->_N + j];
387 ocr->
normal[1] = oc->_N_y ;
388 ocr->
normal[2] = oc->_N_z[
i * oc->_N + j];
393 if (oc->_do_jacobian) {
395 ocr, oc->_Jxx[
i * oc->_N + j], oc->_Jzz[
i * oc->_N + j], oc->_Jxz[
i * oc->_N + j]);
401struct OceanSimulateData {
408static void ocean_compute_htilda(
void *__restrict userdata,
412 OceanSimulateData *osd =
static_cast<OceanSimulateData *
>(userdata);
413 const Ocean *o = osd->o;
414 const float scale = osd->scale;
415 const float t = osd->t;
421 for (j = 0; j <= o->_N / 2; j++) {
422 fftw_complex exp_param1;
423 fftw_complex exp_param2;
424 fftw_complex conj_param;
426 init_complex(exp_param1, 0.0, omega(o->_k[
i * (1 + o->_N / 2) + j], o->_depth) * t);
427 init_complex(exp_param2, 0.0, -omega(o->_k[
i * (1 + o->_N / 2) + j], o->_depth) * t);
428 exp_complex(exp_param1, exp_param1);
429 exp_complex(exp_param2, exp_param2);
430 conj_complex(conj_param, o->_h0_minus[
i * o->_N + j]);
432 mul_complex_c(exp_param1, o->_h0[
i * o->_N + j], exp_param1);
433 mul_complex_c(exp_param2, conj_param, exp_param2);
435 add_comlex_c(o->_htilda[
i * (1 + o->_N / 2) + j], exp_param1, exp_param2);
436 mul_complex_f(o->_fft_in[
i * (1 + o->_N / 2) + j], o->_htilda[
i * (1 + o->_N / 2) + j], scale);
440static void ocean_compute_displacement_y(
TaskPool *__restrict pool,
void * )
443 const Ocean *o = osd->o;
445 fftw_execute(o->_disp_y_plan);
448static void ocean_compute_displacement_x(
TaskPool *__restrict pool,
void * )
451 const Ocean *o = osd->o;
452 const float scale = osd->scale;
453 const float chop_amount = osd->chop_amount;
456 for (
i = 0;
i < o->_M;
i++) {
457 for (j = 0; j <= o->_N / 2; j++) {
458 fftw_complex mul_param;
459 fftw_complex minus_i;
461 init_complex(minus_i, 0.0, -1.0);
462 init_complex(mul_param, -scale, 0);
463 mul_complex_f(mul_param, mul_param, chop_amount);
464 mul_complex_c(mul_param, mul_param, minus_i);
465 mul_complex_c(mul_param, mul_param, o->_htilda[
i * (1 + o->_N / 2) + j]);
466 mul_complex_f(mul_param,
468 ((o->_k[
i * (1 + o->_N / 2) + j] == 0.0f) ?
470 o->_kx[
i] / o->_k[
i * (1 + o->_N / 2) + j]));
471 init_complex(o->_fft_in_x[
i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
474 fftw_execute(o->_disp_x_plan);
477static void ocean_compute_displacement_z(
TaskPool *__restrict pool,
void * )
480 const Ocean *o = osd->o;
481 const float scale = osd->scale;
482 const float chop_amount = osd->chop_amount;
485 for (
i = 0;
i < o->_M;
i++) {
486 for (j = 0; j <= o->_N / 2; j++) {
487 fftw_complex mul_param;
488 fftw_complex minus_i;
490 init_complex(minus_i, 0.0, -1.0);
491 init_complex(mul_param, -scale, 0);
492 mul_complex_f(mul_param, mul_param, chop_amount);
493 mul_complex_c(mul_param, mul_param, minus_i);
494 mul_complex_c(mul_param, mul_param, o->_htilda[
i * (1 + o->_N / 2) + j]);
495 mul_complex_f(mul_param,
497 ((o->_k[
i * (1 + o->_N / 2) + j] == 0.0f) ?
499 o->_kz[j] / o->_k[
i * (1 + o->_N / 2) + j]));
500 init_complex(o->_fft_in_z[
i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
503 fftw_execute(o->_disp_z_plan);
506static void ocean_compute_jacobian_jxx(
TaskPool *__restrict pool,
void * )
509 const Ocean *o = osd->o;
510 const float chop_amount = osd->chop_amount;
513 for (
i = 0;
i < o->_M;
i++) {
514 for (j = 0; j <= o->_N / 2; j++) {
515 fftw_complex mul_param;
518 init_complex(mul_param, -1, 0);
520 mul_complex_f(mul_param, mul_param, chop_amount);
521 mul_complex_c(mul_param, mul_param, o->_htilda[
i * (1 + o->_N / 2) + j]);
522 mul_complex_f(mul_param,
524 ((o->_k[
i * (1 + o->_N / 2) + j] == 0.0f) ?
526 o->_kx[
i] * o->_kx[
i] / o->_k[
i * (1 + o->_N / 2) + j]));
527 init_complex(o->_fft_in_jxx[
i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
530 fftw_execute(o->_Jxx_plan);
532 for (
i = 0;
i < o->_M;
i++) {
533 for (j = 0; j < o->_N; j++) {
534 o->_Jxx[
i * o->_N + j] += 1.0;
539static void ocean_compute_jacobian_jzz(
TaskPool *__restrict pool,
void * )
542 const Ocean *o = osd->o;
543 const float chop_amount = osd->chop_amount;
546 for (
i = 0;
i < o->_M;
i++) {
547 for (j = 0; j <= o->_N / 2; j++) {
548 fftw_complex mul_param;
551 init_complex(mul_param, -1, 0);
553 mul_complex_f(mul_param, mul_param, chop_amount);
554 mul_complex_c(mul_param, mul_param, o->_htilda[
i * (1 + o->_N / 2) + j]);
555 mul_complex_f(mul_param,
557 ((o->_k[
i * (1 + o->_N / 2) + j] == 0.0f) ?
559 o->_kz[j] * o->_kz[j] / o->_k[
i * (1 + o->_N / 2) + j]));
560 init_complex(o->_fft_in_jzz[
i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
563 fftw_execute(o->_Jzz_plan);
565 for (
i = 0;
i < o->_M;
i++) {
566 for (j = 0; j < o->_N; j++) {
567 o->_Jzz[
i * o->_N + j] += 1.0;
572static void ocean_compute_jacobian_jxz(
TaskPool *__restrict pool,
void * )
575 const Ocean *o = osd->o;
576 const float chop_amount = osd->chop_amount;
579 for (
i = 0;
i < o->_M;
i++) {
580 for (j = 0; j <= o->_N / 2; j++) {
581 fftw_complex mul_param;
584 init_complex(mul_param, -1, 0);
586 mul_complex_f(mul_param, mul_param, chop_amount);
587 mul_complex_c(mul_param, mul_param, o->_htilda[
i * (1 + o->_N / 2) + j]);
588 mul_complex_f(mul_param,
590 ((o->_k[
i * (1 + o->_N / 2) + j] == 0.0f) ?
592 o->_kx[
i] * o->_kz[j] / o->_k[
i * (1 + o->_N / 2) + j]));
593 init_complex(o->_fft_in_jxz[
i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
596 fftw_execute(o->_Jxz_plan);
599static void ocean_compute_normal_x(
TaskPool *__restrict pool,
void * )
602 const Ocean *o = osd->o;
605 for (
i = 0;
i < o->_M;
i++) {
606 for (j = 0; j <= o->_N / 2; j++) {
607 fftw_complex mul_param;
609 init_complex(mul_param, 0.0, -1.0);
610 mul_complex_c(mul_param, mul_param, o->_htilda[
i * (1 + o->_N / 2) + j]);
611 mul_complex_f(mul_param, mul_param, o->_kx[
i]);
612 init_complex(o->_fft_in_nx[
i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
615 fftw_execute(o->_N_x_plan);
618static void ocean_compute_normal_z(
TaskPool *__restrict pool,
void * )
621 const Ocean *o = osd->o;
624 for (
i = 0;
i < o->_M;
i++) {
625 for (j = 0; j <= o->_N / 2; j++) {
626 fftw_complex mul_param;
628 init_complex(mul_param, 0.0, -1.0);
629 mul_complex_c(mul_param, mul_param, o->_htilda[
i * (1 + o->_N / 2) + j]);
630 mul_complex_f(mul_param, mul_param, o->_kz[
i]);
631 init_complex(o->_fft_in_nz[
i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
634 fftw_execute(o->_N_z_plan);
639 return o->_k !=
nullptr;
646 OceanSimulateData osd;
648 scale *= o->normalize_factor;
653 osd.chop_amount = chop_amount;
681 if (o->_do_jacobian) {
687 if (o->_do_normals) {
690 o->_N_y = 1.0f /
scale;
700static void set_height_normalize_factor(
Ocean *oc)
707 if (!oc->_do_disp_y) {
711 oc->normalize_factor = 1.0;
717 for (
i = 0;
i < oc->_M;
i++) {
718 for (j = 0; j < oc->_N; j++) {
719 max_h = std::max<double>(max_h,
fabs(oc->_disp_y[
i * oc->_N + j]));
729 res = 1.0f / (max_h);
731 oc->normalize_factor = res;
747 if (omd->
ocean->_M == resolution * resolution) {
761 short do_heightfield, do_chop, do_normals, do_jacobian, do_spray;
763 do_heightfield =
true;
772 resolution * resolution,
773 resolution * resolution,
810 float sharpen_peak_jonswap,
811 short do_height_field,
828 o->_damp_reflections = 1.0f - damp;
829 o->_wind_alignment = alignment * 10.0f;
835 o->_L =
V *
V / GRAVITY;
839 o->_spectrum = spectrum;
842 o->_fetch_jonswap = fetch_jonswap;
843 o->_sharpen_peak_jonswap = sharpen_peak_jonswap * 10.0f;
867 o->_do_disp_y = do_height_field;
868 o->_do_normals = do_normals;
869 o->_do_spray = do_spray;
870 o->_do_chop = do_chop;
871 o->_do_jacobian = do_jacobian;
874 if (o->_Lx == 0.0f) {
878 if (o->_Lz == 0.0f) {
883 for (
i = 0;
i <= o->_M / 2;
i++) {
888 for (
i = o->_M - 1, ii = 0;
i > o->_M / 2;
i--, ii++) {
889 o->_kx[
i] = -2.0f *
float(
M_PI) * ii / o->_Lx;
893 for (
i = 0;
i <= o->_N / 2;
i++) {
898 for (
i = o->_N - 1, ii = 0;
i > o->_N / 2;
i--, ii++) {
899 o->_kz[
i] = -2.0f *
float(
M_PI) * ii / o->_Lz;
903 for (
i = 0;
i < o->_M;
i++) {
904 for (j = 0; j <= o->_N / 2; j++) {
905 o->_k[size_t(
i) * (1 + o->_N / 2) + j] =
sqrt(o->_kx[
i] * o->_kx[
i] + o->_kz[j] * o->_kz[j]);
911 for (
i = 0;
i < o->_M;
i++) {
912 for (j = 0; j < o->_N; j++) {
917 const int hash_x = o->_kx[
i] * 360.0f;
918 const int hash_z = o->_kz[j] * 360.0f;
922 float r1 = gaussRand(rng);
923 float r2 = gaussRand(rng);
926 init_complex(r1r2, r1, r2);
927 switch (o->_spectrum) {
929 mul_complex_f(o->_h0[
i * o->_N + j],
932 mul_complex_f(o->_h0_minus[
i * o->_N + j],
938 o->_h0[
i * o->_N + j],
942 o->_h0_minus[
i * o->_N + j],
947 mul_complex_f(o->_h0[
i * o->_N + j],
951 o->_h0_minus[
i * o->_N + j],
956 mul_complex_f(o->_h0[
i * o->_N + j], r1r2,
sqrt(Ph(o, o->_kx[
i], o->_kz[j]) / 2.0f));
958 o->_h0_minus[
i * o->_N + j], r1r2,
sqrt(Ph(o, -o->_kx[
i], -o->_kz[j]) / 2.0f));
973 o->_disp_y_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in, o->_disp_y, FFTW_ESTIMATE);
976 if (o->_do_normals) {
986 o->_N_x_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_nx, o->_N_x, FFTW_ESTIMATE);
987 o->_N_z_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_nz, o->_N_z, FFTW_ESTIMATE);
999 o->_disp_x_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_x, o->_disp_x, FFTW_ESTIMATE);
1000 o->_disp_z_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_z, o->_disp_z, FFTW_ESTIMATE);
1002 if (o->_do_jacobian) {
1004 "ocean_fft_in_jxx");
1006 "ocean_fft_in_jzz");
1008 "ocean_fft_in_jxz");
1014 o->_Jxx_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jxx, o->_Jxx, FFTW_ESTIMATE);
1015 o->_Jzz_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jzz, o->_Jzz, FFTW_ESTIMATE);
1016 o->_Jxz_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jxz, o->_Jxz, FFTW_ESTIMATE);
1023 set_height_normalize_factor(o);
1040 if (oc->_do_disp_y) {
1041 fftw_destroy_plan(oc->_disp_y_plan);
1045 if (oc->_do_normals) {
1048 fftw_destroy_plan(oc->_N_x_plan);
1049 fftw_destroy_plan(oc->_N_z_plan);
1058 fftw_destroy_plan(oc->_disp_x_plan);
1059 fftw_destroy_plan(oc->_disp_z_plan);
1064 if (oc->_do_jacobian) {
1068 fftw_destroy_plan(oc->_Jxx_plan);
1069 fftw_destroy_plan(oc->_Jzz_plan);
1070 fftw_destroy_plan(oc->_Jxz_plan);
1111# define CACHE_TYPE_DISPLACE 1
1112# define CACHE_TYPE_FOAM 2
1113# define CACHE_TYPE_NORMAL 3
1114# define CACHE_TYPE_SPRAY 4
1115# define CACHE_TYPE_SPRAY_INVERSE 5
1117static void cache_filepath(
1118 char *filepath,
const char *
dirname,
const char *relbase,
int frame,
int type)
1121 const char *filename;
1124 case CACHE_TYPE_FOAM:
1127 case CACHE_TYPE_NORMAL:
1128 filename =
"normal_";
1130 case CACHE_TYPE_SPRAY:
1131 filename =
"spray_";
1133 case CACHE_TYPE_SPRAY_INVERSE:
1134 filename =
"spray_inverse_";
1136 case CACHE_TYPE_DISPLACE:
1147 "Path parsing errors should only occur when a variable map is provided.");
1152MINLINE void rgb_to_rgba_unit_alpha(
float r_rgba[4],
const float rgb[3])
1159MINLINE void value_to_rgba_unit_alpha(
float r_rgba[4],
const float value)
1306 const char *relbase,
1311 float foam_coverage,
1334 "spray_inverse imbuf pointer array");
1337 och->
time =
nullptr;
1349 const int f = frame - och->
start;
1359 cache_filepath(filepath, och->
bakepath, och->
relbase, frame, CACHE_TYPE_DISPLACE);
1362 cache_filepath(filepath, och->
bakepath, och->
relbase, frame, CACHE_TYPE_FOAM);
1365 cache_filepath(filepath, och->
bakepath, och->
relbase, frame, CACHE_TYPE_SPRAY);
1368 cache_filepath(filepath, och->
bakepath, och->
relbase, frame, CACHE_TYPE_SPRAY_INVERSE);
1371 cache_filepath(filepath, och->
bakepath, och->
relbase, frame, CACHE_TYPE_NORMAL);
1377 void (*update_cb)(
void *,
float progress,
int *cancel),
1378 void *update_cb_data)
1386 int f,
i = 0,
x,
y, cancel = 0;
1389 ImBuf *ibuf_foam, *ibuf_disp, *ibuf_normal, *ibuf_spray, *ibuf_spray_inverse;
1400 if (o->_do_jacobian) {
1402 "previous frame foam bake data");
1405 prev_foam =
nullptr;
1415 for (f = och->
start,
i = 0; f <= och->end; f++,
i++) {
1427 for (
y = 0;
y < res_y;
y++) {
1428 for (
x = 0;
x < res_x;
x++) {
1435 if (o->_do_jacobian) {
1438 float pr = 0.0f, foam_result;
1439 float neg_disp, neg_eplus;
1445 pr = prev_foam[res_x *
y +
x];
1456 neg_disp = ocr.
disp[1] < 0.0f ? 1.0f + ocr.
disp[1] : 1.0f;
1457 neg_disp = neg_disp < 0.0f ? 0.0f : neg_disp;
1460 neg_eplus = ocr.
Eplus[2] < 0.0f ? 1.0f + ocr.
Eplus[2] : 1.0f;
1461 neg_eplus = neg_eplus < 0.0f ? 0.0f : neg_eplus;
1467 pr *= och->
foam_fade * (0.75f + neg_eplus * 0.25f);
1472 prev_foam[res_x *
y +
x] = foam_result;
1487 if (o->_do_normals) {
1494 cache_filepath(filepath, och->
bakepath, och->
relbase, f, CACHE_TYPE_DISPLACE);
1496 printf(
"Cannot save Displacement File Output to %s\n", filepath);
1499 if (o->_do_jacobian) {
1500 cache_filepath(filepath, och->
bakepath, och->
relbase, f, CACHE_TYPE_FOAM);
1502 printf(
"Cannot save Foam File Output to %s\n", filepath);
1506 cache_filepath(filepath, och->
bakepath, och->
relbase, f, CACHE_TYPE_SPRAY);
1508 printf(
"Cannot save Spray File Output to %s\n", filepath);
1511 cache_filepath(filepath, och->
bakepath, och->
relbase, f, CACHE_TYPE_SPRAY_INVERSE);
1513 printf(
"Cannot save Spray Inverse File Output to %s\n", filepath);
1518 if (o->_do_normals) {
1519 cache_filepath(filepath, och->
bakepath, och->
relbase, f, CACHE_TYPE_NORMAL);
1521 printf(
"Cannot save Normal File Output to %s\n", filepath);
1533 update_cb(update_cb_data, progress, &cancel);
1654 void (*update_cb)(
void *,
float progress,
int *cancel),
bool BKE_imbuf_write(ImBuf *ibuf, const char *filepath, const ImageFormatData *imf)
bool BKE_ocean_ensure(struct OceanModifierData *omd, int resolution)
float BLI_ocean_spectrum_piersonmoskowitz(const struct Ocean *oc, float kx, float kz)
float BLI_ocean_spectrum_jonswap(const struct Ocean *oc, float kx, float kz)
bool BKE_ocean_is_valid(const struct Ocean *o)
float BLI_ocean_spectrum_texelmarsenarsloe(const struct Ocean *oc, float kx, float kz)
#define BLI_assert_msg(a, msg)
BLI_INLINE unsigned int BLI_hash_int_2d(unsigned int kx, unsigned int ky)
MINLINE float min_ff(float a, float b)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
#define BLI_path_join(...)
struct RNG * BLI_rng_new(unsigned int seed)
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
void BLI_rng_seed(struct RNG *rng, unsigned int seed) ATTR_NONNULL(1)
float BLI_rng_get_float(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_task_pool_user_data(TaskPool *pool)
void BLI_task_pool_work_and_wait(TaskPool *pool)
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
TaskPool * BLI_task_pool_create(void *userdata, eTaskPriority priority)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
void BLI_task_pool_free(TaskPool *pool)
void BLI_task_pool_push(TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
void BLI_rw_mutex_end(ThreadRWMutex *mutex)
void BLI_thread_unlock(int type)
void BLI_thread_lock(int type)
#define THREAD_LOCK_WRITE
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
void BLI_rw_mutex_init(ThreadRWMutex *mutex)
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
#define UNUSED_VARS_NDEBUG(...)
const char * dirname(char *path)
@ MOD_OCEAN_GENERATE_NORMALS
@ MOD_OCEAN_GENERATE_FOAM
@ MOD_OCEAN_GENERATE_SPRAY
@ MOD_OCEAN_SPECTRUM_TEXEL_MARSEN_ARSLOE
@ MOD_OCEAN_SPECTRUM_JONSWAP
@ MOD_OCEAN_SPECTRUM_PIERSON_MOSKOWITZ
ImBuf * IMB_load_image_from_filepath(const char *filepath, const int flags, char r_colorspace[IM_MAX_SPACE]=nullptr)
void IMB_freeImBuf(ImBuf *ibuf)
ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
static unsigned long seed
SIMD_FORCE_INLINE btScalar length2() const
Return the length of the vector squared.
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 fmod(const float2 a, const float b)
ccl_device_inline float2 fabs(const float2 a)
MatBase< T, NumCol, NumRow > scale(const MatBase< T, NumCol, NumRow > &mat, const VectorT &scale)
bool BKE_ocean_init_from_modifier(Ocean *, OceanModifierData const *, int)
bool BKE_ocean_init(Ocean *, int, int, float, float, float, float, float, float, float, float, float, float, int, float, float, short, short, short, short, short, int)
void BKE_ocean_eval_ij(Ocean *, OceanResult *, int, int)
OceanCache * BKE_ocean_init_cache(const char *, const char *, int, int, float, float, float, float, int)
void BKE_ocean_free_cache(OceanCache *och)
float BKE_ocean_jminus_to_foam(float, float)
void BKE_ocean_free_modifier_cache(OceanModifierData *omd)
void BKE_ocean_bake(Ocean *, OceanCache *, void(*update_cb)(void *, float progress, int *cancel), void *)
void BKE_ocean_free_data(Ocean *)
void BKE_ocean_cache_eval_ij(OceanCache *, OceanResult *, int, int, int)
void BKE_ocean_free(Ocean *oc)
void BKE_ocean_eval_xz(Ocean *, OceanResult *, float, float)
void BKE_ocean_eval_uv_catrom(Ocean *, OceanResult *, float, float)
void BKE_ocean_eval_uv(Ocean *, OceanResult *, float, float)
void BKE_ocean_simulate_cache(OceanCache *, int)
void BKE_ocean_eval_xz_catrom(Ocean *, OceanResult *, float, float)
void BKE_ocean_cache_eval_uv(OceanCache *, OceanResult *, int, float, float)
void BKE_ocean_simulate(Ocean *, float, float, float)
ImBufFloatBuffer float_buffer
struct ImBuf ** ibufs_disp
struct ImBuf ** ibufs_spray
struct ImBuf ** ibufs_norm
struct ImBuf ** ibufs_foam
struct ImBuf ** ibufs_spray_inverse
struct OceanCache * oceancache
float sharpen_peak_jonswap
void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float result[4])
CCL_NAMESPACE_BEGIN struct Window V