58 static float nextfr(
RNG *rng,
float min,
float max)
63 static float gaussRand(
RNG *rng)
73 x = (
float)(nextfr(rng, -1, 1));
74 y = (
float)(nextfr(rng, -1, 1));
84 MINLINE float catrom(
float p0,
float p1,
float p2,
float p3,
float f)
86 return 0.5f * ((2.0f * p1) + (-p0 + p2) * f + (2.0f * p0 - 5.0f * p1 + 4.0f * p2 - p3) * f * f +
87 (-p0 + 3.0f * p1 - 3.0f * p2 + p3) * f * f * f);
90 MINLINE float omega(
float k,
float depth)
96 static float Ph(
struct Ocean *o,
float kx,
float kz)
99 float k2 = kx * kx + kz * kz;
106 tmp = (o->_wx * kx + o->_wz * kz) /
sqrtf(k2);
108 tmp *= o->_damp_reflections;
111 return o->_A *
expf(-1.0f / (k2 * (o->_L * o->_L))) *
expf(-k2 * (o->_l * o->_l)) *
112 powf(
fabsf(tmp), o->_wind_alignment) / (k2 * k2);
115 static void compute_eigenstuff(
struct OceanResult *ocr,
float jxx,
float jzz,
float jxz)
117 float a, b, qplus, qminus;
119 b =
sqrt((jxx - jzz) * (jxx - jzz) + 4 * jxz * jxz);
122 ocr->
Jplus = 0.5f * (
a + b);
124 qplus = (ocr->
Jplus - jxx) / jxz;
125 qminus = (ocr->
Jminus - jxx) / jxz;
127 a =
sqrt(1 + qplus * qplus);
128 b =
sqrt(1 + qminus * qminus);
131 ocr->
Eplus[1] = 0.0f;
132 ocr->
Eplus[2] = qplus /
a;
134 ocr->
Eminus[0] = 1.0f / b;
136 ocr->
Eminus[2] = qminus / b;
144 static void init_complex(fftw_complex cmpl,
float real,
float image)
150 static void add_comlex_c(fftw_complex res,
const fftw_complex cmpl1,
const fftw_complex cmpl2)
152 res[0] = cmpl1[0] + cmpl2[0];
153 res[1] = cmpl1[1] + cmpl2[1];
156 static void mul_complex_f(fftw_complex res,
const fftw_complex cmpl,
float f)
158 res[0] = cmpl[0] * (
double)f;
159 res[1] = cmpl[1] * (
double)f;
162 static void mul_complex_c(fftw_complex res,
const fftw_complex cmpl1,
const fftw_complex cmpl2)
165 temp[0] = cmpl1[0] * cmpl2[0] - cmpl1[1] * cmpl2[1];
166 temp[1] = cmpl1[0] * cmpl2[1] + cmpl1[1] * cmpl2[0];
171 static float real_c(fftw_complex cmpl)
176 static float image_c(fftw_complex cmpl)
181 static void conj_complex(fftw_complex res,
const fftw_complex cmpl1)
187 static void exp_complex(fftw_complex res, fftw_complex cmpl)
189 float r =
expf(cmpl[0]);
191 res[0] =
cosf(cmpl[1]) *
r;
192 res[1] =
sinf(cmpl[1]) *
r;
197 float foam = jminus * -0.005f + coverage;
198 CLAMP(foam, 0.0f, 1.0f);
205 float frac_x, frac_z;
240 (interpf(interpf(m[i1 * oc->_N + j1], m[i0 * oc->_N + j1], frac_x), \
241 interpf(m[i1 * oc->_N + j0], m[i0 * oc->_N + j0], frac_x), \
245 if (oc->_do_disp_y) {
246 ocr->
disp[1] = BILERP(oc->_disp_y);
249 if (oc->_do_normals) {
250 ocr->
normal[0] = BILERP(oc->_N_x);
251 ocr->
normal[1] = oc->_N_y ;
252 ocr->
normal[2] = BILERP(oc->_N_z);
256 ocr->
disp[0] = BILERP(oc->_disp_x);
257 ocr->
disp[2] = BILERP(oc->_disp_z);
264 if (oc->_do_jacobian) {
265 compute_eigenstuff(ocr, BILERP(oc->_Jxx), BILERP(oc->_Jzz), BILERP(oc->_Jxz));
276 int i0,
i1, i2, i3, j0, j1, j2, j3;
277 float frac_x, frac_z;
313 i0 = i0 < 0 ? i0 + oc->_M : i0;
314 i3 = i3 >= oc->_M ? i3 - oc->_M : i3;
318 j0 = j0 < 0 ? j0 + oc->_N : j0;
319 j3 = j3 >= oc->_N ? j3 - oc->_N : j3;
322 catrom(catrom(m[i0 * oc->_N + j0], \
323 m[i1 * oc->_N + j0], \
324 m[i2 * oc->_N + j0], \
325 m[i3 * oc->_N + j0], \
327 catrom(m[i0 * oc->_N + j1], \
328 m[i1 * oc->_N + j1], \
329 m[i2 * oc->_N + j1], \
330 m[i3 * oc->_N + j1], \
332 catrom(m[i0 * oc->_N + j2], \
333 m[i1 * oc->_N + j2], \
334 m[i2 * oc->_N + j2], \
335 m[i3 * oc->_N + j2], \
337 catrom(m[i0 * oc->_N + j3], \
338 m[i1 * oc->_N + j3], \
339 m[i2 * oc->_N + j3], \
340 m[i3 * oc->_N + j3], \
345 if (oc->_do_disp_y) {
346 ocr->
disp[1] = INTERP(oc->_disp_y);
348 if (oc->_do_normals) {
349 ocr->
normal[0] = INTERP(oc->_N_x);
350 ocr->
normal[1] = oc->_N_y ;
351 ocr->
normal[2] = INTERP(oc->_N_z);
354 ocr->
disp[0] = INTERP(oc->_disp_x);
355 ocr->
disp[2] = INTERP(oc->_disp_z);
362 if (oc->_do_jacobian) {
363 compute_eigenstuff(ocr, INTERP(oc->_Jxx), INTERP(oc->_Jzz), INTERP(oc->_Jxz));
390 ocr->
disp[1] = oc->_do_disp_y ? (
float)oc->_disp_y[i * oc->_N + j] : 0.0f;
393 ocr->
disp[0] = oc->_disp_x[i * oc->_N + j];
394 ocr->
disp[2] = oc->_disp_z[i * oc->_N + j];
401 if (oc->_do_normals) {
402 ocr->
normal[0] = oc->_N_x[i * oc->_N + j];
403 ocr->
normal[1] = oc->_N_y ;
404 ocr->
normal[2] = oc->_N_z[i * oc->_N + j];
409 if (oc->_do_jacobian) {
411 ocr, oc->_Jxx[i * oc->_N + j], oc->_Jzz[i * oc->_N + j], oc->_Jxz[i * oc->_N + j]);
417 typedef struct OceanSimulateData {
424 static void ocean_compute_htilda(
void *__restrict userdata,
428 OceanSimulateData *osd = userdata;
429 const Ocean *o = osd->o;
430 const float scale = osd->scale;
431 const float t = osd->t;
437 for (j = 0; j <= o->_N / 2; j++) {
438 fftw_complex exp_param1;
439 fftw_complex exp_param2;
440 fftw_complex conj_param;
442 init_complex(exp_param1, 0.0, omega(o->_k[i * (1 + o->_N / 2) + j], o->_depth) *
t);
443 init_complex(exp_param2, 0.0, -omega(o->_k[i * (1 + o->_N / 2) + j], o->_depth) *
t);
444 exp_complex(exp_param1, exp_param1);
445 exp_complex(exp_param2, exp_param2);
446 conj_complex(conj_param, o->_h0_minus[i * o->_N + j]);
448 mul_complex_c(exp_param1, o->_h0[i * o->_N + j], exp_param1);
449 mul_complex_c(exp_param2, conj_param, exp_param2);
451 add_comlex_c(o->_htilda[i * (1 + o->_N / 2) + j], exp_param1, exp_param2);
452 mul_complex_f(o->_fft_in[i * (1 + o->_N / 2) + j], o->_htilda[i * (1 + o->_N / 2) + j], scale);
456 static void ocean_compute_displacement_y(
TaskPool *__restrict
pool,
void *
UNUSED(taskdata))
459 const Ocean *o = osd->o;
461 fftw_execute(o->_disp_y_plan);
464 static void ocean_compute_displacement_x(
TaskPool *__restrict
pool,
void *
UNUSED(taskdata))
467 const Ocean *o = osd->o;
468 const float scale = osd->scale;
469 const float chop_amount = osd->chop_amount;
472 for (i = 0; i < o->_M; i++) {
473 for (j = 0; j <= o->_N / 2; j++) {
474 fftw_complex mul_param;
475 fftw_complex minus_i;
477 init_complex(minus_i, 0.0, -1.0);
478 init_complex(mul_param, -scale, 0);
479 mul_complex_f(mul_param, mul_param, chop_amount);
480 mul_complex_c(mul_param, mul_param, minus_i);
481 mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]);
482 mul_complex_f(mul_param,
484 ((o->_k[i * (1 + o->_N / 2) + j] == 0.0f) ?
486 o->_kx[i] / o->_k[i * (1 + o->_N / 2) + j]));
487 init_complex(o->_fft_in_x[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
490 fftw_execute(o->_disp_x_plan);
493 static void ocean_compute_displacement_z(
TaskPool *__restrict
pool,
void *
UNUSED(taskdata))
496 const Ocean *o = osd->o;
497 const float scale = osd->scale;
498 const float chop_amount = osd->chop_amount;
501 for (i = 0; i < o->_M; i++) {
502 for (j = 0; j <= o->_N / 2; j++) {
503 fftw_complex mul_param;
504 fftw_complex minus_i;
506 init_complex(minus_i, 0.0, -1.0);
507 init_complex(mul_param, -scale, 0);
508 mul_complex_f(mul_param, mul_param, chop_amount);
509 mul_complex_c(mul_param, mul_param, minus_i);
510 mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]);
511 mul_complex_f(mul_param,
513 ((o->_k[i * (1 + o->_N / 2) + j] == 0.0f) ?
515 o->_kz[j] / o->_k[i * (1 + o->_N / 2) + j]));
516 init_complex(o->_fft_in_z[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
519 fftw_execute(o->_disp_z_plan);
522 static void ocean_compute_jacobian_jxx(
TaskPool *__restrict
pool,
void *
UNUSED(taskdata))
525 const Ocean *o = osd->o;
526 const float chop_amount = osd->chop_amount;
529 for (i = 0; i < o->_M; i++) {
530 for (j = 0; j <= o->_N / 2; j++) {
531 fftw_complex mul_param;
534 init_complex(mul_param, -1, 0);
536 mul_complex_f(mul_param, mul_param, chop_amount);
537 mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]);
538 mul_complex_f(mul_param,
540 ((o->_k[i * (1 + o->_N / 2) + j] == 0.0f) ?
542 o->_kx[i] * o->_kx[i] / o->_k[i * (1 + o->_N / 2) + j]));
543 init_complex(o->_fft_in_jxx[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
546 fftw_execute(o->_Jxx_plan);
548 for (i = 0; i < o->_M; i++) {
549 for (j = 0; j < o->_N; j++) {
550 o->_Jxx[i * o->_N + j] += 1.0;
555 static void ocean_compute_jacobian_jzz(
TaskPool *__restrict
pool,
void *
UNUSED(taskdata))
558 const Ocean *o = osd->o;
559 const float chop_amount = osd->chop_amount;
562 for (i = 0; i < o->_M; i++) {
563 for (j = 0; j <= o->_N / 2; j++) {
564 fftw_complex mul_param;
567 init_complex(mul_param, -1, 0);
569 mul_complex_f(mul_param, mul_param, chop_amount);
570 mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]);
571 mul_complex_f(mul_param,
573 ((o->_k[i * (1 + o->_N / 2) + j] == 0.0f) ?
575 o->_kz[j] * o->_kz[j] / o->_k[i * (1 + o->_N / 2) + j]));
576 init_complex(o->_fft_in_jzz[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
579 fftw_execute(o->_Jzz_plan);
581 for (i = 0; i < o->_M; i++) {
582 for (j = 0; j < o->_N; j++) {
583 o->_Jzz[i * o->_N + j] += 1.0;
588 static void ocean_compute_jacobian_jxz(
TaskPool *__restrict
pool,
void *
UNUSED(taskdata))
591 const Ocean *o = osd->o;
592 const float chop_amount = osd->chop_amount;
595 for (i = 0; i < o->_M; i++) {
596 for (j = 0; j <= o->_N / 2; j++) {
597 fftw_complex mul_param;
600 init_complex(mul_param, -1, 0);
602 mul_complex_f(mul_param, mul_param, chop_amount);
603 mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]);
604 mul_complex_f(mul_param,
606 ((o->_k[i * (1 + o->_N / 2) + j] == 0.0f) ?
608 o->_kx[i] * o->_kz[j] / o->_k[i * (1 + o->_N / 2) + j]));
609 init_complex(o->_fft_in_jxz[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
612 fftw_execute(o->_Jxz_plan);
618 const Ocean *o = osd->o;
621 for (i = 0; i < o->_M; i++) {
622 for (j = 0; j <= o->_N / 2; j++) {
623 fftw_complex mul_param;
625 init_complex(mul_param, 0.0, -1.0);
626 mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]);
627 mul_complex_f(mul_param, mul_param, o->_kx[i]);
628 init_complex(o->_fft_in_nx[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
631 fftw_execute(o->_N_x_plan);
637 const Ocean *o = osd->o;
640 for (i = 0; i < o->_M; i++) {
641 for (j = 0; j <= o->_N / 2; j++) {
642 fftw_complex mul_param;
644 init_complex(mul_param, 0.0, -1.0);
645 mul_complex_c(mul_param, mul_param, o->_htilda[i * (1 + o->_N / 2) + j]);
646 mul_complex_f(mul_param, mul_param, o->_kz[i]);
647 init_complex(o->_fft_in_nz[i * (1 + o->_N / 2) + j], real_c(mul_param), image_c(mul_param));
650 fftw_execute(o->_N_z_plan);
657 OceanSimulateData osd;
659 scale *= o->normalize_factor;
664 osd.chop_amount = chop_amount;
692 if (o->_do_jacobian) {
698 if (o->_do_normals) {
701 o->_N_y = 1.0f / scale;
711 static void set_height_normalize_factor(
struct Ocean *oc)
718 if (!oc->_do_disp_y) {
722 oc->normalize_factor = 1.0;
728 for (i = 0; i < oc->_M; i++) {
729 for (j = 0; j < oc->_N; j++) {
730 if (max_h <
fabs(oc->_disp_y[i * oc->_N + j])) {
731 max_h =
fabs(oc->_disp_y[i * oc->_N + j]);
742 res = 1.0f / (max_h);
744 oc->normalize_factor = res;
760 if (omd->
ocean->_M == resolution * resolution) {
774 const int resolution)
776 short do_heightfield, do_chop, do_normals, do_jacobian, do_spray;
778 do_heightfield =
true;
787 resolution * resolution,
788 resolution * resolution,
825 float sharpen_peak_jonswap,
826 short do_height_field,
844 o->_damp_reflections = 1.0f - damp;
845 o->_wind_alignment = alignment * 10.0f;
851 o->_L =
V *
V / GRAVITY;
855 o->_spectrum = spectrum;
858 o->_fetch_jonswap = fetch_jonswap;
859 o->_sharpen_peak_jonswap = sharpen_peak_jonswap * 10.0f;
861 o->_do_disp_y = do_height_field;
862 o->_do_normals = do_normals;
863 o->_do_spray = do_spray;
864 o->_do_chop = do_chop;
865 o->_do_jacobian = do_jacobian;
868 o->_h0 = (fftw_complex *)
MEM_mallocN(
M *
N *
sizeof(fftw_complex),
"ocean_h0");
869 o->_h0_minus = (fftw_complex *)
MEM_mallocN(
M *
N *
sizeof(fftw_complex),
"ocean_h0_minus");
870 o->_kx = (
float *)
MEM_mallocN(o->_M *
sizeof(
float),
"ocean_kx");
871 o->_kz = (
float *)
MEM_mallocN(o->_N *
sizeof(
float),
"ocean_kz");
874 if (o->_Lx == 0.0f) {
878 if (o->_Lz == 0.0f) {
883 for (i = 0; i <= o->_M / 2; i++) {
884 o->_kx[i] = 2.0f * (
float)
M_PI * i / o->_Lx;
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++) {
894 o->_kz[i] = 2.0f * (
float)
M_PI * i / o->_Lz;
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[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],
933 o->_h0_minus[i * o->_N + j],
939 o->_h0[i * o->_N + j],
943 o->_h0_minus[i * o->_N + j],
950 o->_h0[i * o->_N + j],
954 o->_h0_minus[i * o->_N + j],
961 o->_h0[i * o->_N + j], r1r2, (
float)(
sqrt(Ph(o, o->_kx[i], o->_kz[j]) / 2.0f)));
962 mul_complex_f(o->_h0_minus[i * o->_N + j],
964 (
float)(
sqrt(Ph(o, -o->_kx[i], -o->_kz[j]) / 2.0f)));
970 o->_fft_in = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
972 o->_htilda = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
978 o->_disp_y = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_disp_y");
979 o->_disp_y_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in, o->_disp_y, FFTW_ESTIMATE);
982 if (o->_do_normals) {
983 o->_fft_in_nx = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
985 o->_fft_in_nz = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
988 o->_N_x = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_N_x");
990 o->_N_z = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_N_z");
992 o->_N_x_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_nx, o->_N_x, FFTW_ESTIMATE);
993 o->_N_z_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_nz, o->_N_z, FFTW_ESTIMATE);
997 o->_fft_in_x = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
999 o->_fft_in_z = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
1002 o->_disp_x = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_disp_x");
1003 o->_disp_z = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_disp_z");
1005 o->_disp_x_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_x, o->_disp_x, FFTW_ESTIMATE);
1006 o->_disp_z_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_z, o->_disp_z, FFTW_ESTIMATE);
1008 if (o->_do_jacobian) {
1009 o->_fft_in_jxx = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
1010 "ocean_fft_in_jxx");
1011 o->_fft_in_jzz = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
1012 "ocean_fft_in_jzz");
1013 o->_fft_in_jxz = (fftw_complex *)
MEM_mallocN(o->_M * (1 + o->_N / 2) *
sizeof(fftw_complex),
1014 "ocean_fft_in_jxz");
1016 o->_Jxx = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_Jxx");
1017 o->_Jzz = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_Jzz");
1018 o->_Jxz = (
double *)
MEM_mallocN(o->_M * o->_N *
sizeof(
double),
"ocean_Jxz");
1020 o->_Jxx_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jxx, o->_Jxx, FFTW_ESTIMATE);
1021 o->_Jzz_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jzz, o->_Jzz, FFTW_ESTIMATE);
1022 o->_Jxz_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jxz, o->_Jxz, FFTW_ESTIMATE);
1029 set_height_normalize_factor(o);
1044 if (oc->_do_disp_y) {
1045 fftw_destroy_plan(oc->_disp_y_plan);
1049 if (oc->_do_normals) {
1052 fftw_destroy_plan(oc->_N_x_plan);
1053 fftw_destroy_plan(oc->_N_z_plan);
1062 fftw_destroy_plan(oc->_disp_x_plan);
1063 fftw_destroy_plan(oc->_disp_z_plan);
1068 if (oc->_do_jacobian) {
1072 fftw_destroy_plan(oc->_Jxx_plan);
1073 fftw_destroy_plan(oc->_Jzz_plan);
1074 fftw_destroy_plan(oc->_Jxz_plan);
1115 # define CACHE_TYPE_DISPLACE 1
1116 # define CACHE_TYPE_FOAM 2
1117 # define CACHE_TYPE_NORMAL 3
1118 # define CACHE_TYPE_SPRAY 4
1119 # define CACHE_TYPE_SPRAY_INVERSE 5
1121 static void cache_filename(
1122 char *
string,
const char *path,
const char *relbase,
int frame,
int type)
1128 case CACHE_TYPE_FOAM:
1131 case CACHE_TYPE_NORMAL:
1134 case CACHE_TYPE_SPRAY:
1137 case CACHE_TYPE_SPRAY_INVERSE:
1138 fname =
"spray_inverse_";
1140 case CACHE_TYPE_DISPLACE:
1153 MINLINE void rgb_to_rgba_unit_alpha(
float r_rgba[4],
const float rgb[3])
1160 MINLINE void value_to_rgba_unit_alpha(
float r_rgba[4],
const float value)
1177 for (i = och->
start, f = 0; i <= och->end; i++, f++) {
1186 for (i = och->
start, f = 0; i <= och->end; i++, f++) {
1195 for (i = och->
start, f = 0; i <= och->end; i++, f++) {
1204 for (i = och->
start, f = 0; i <= och->end; i++, f++) {
1213 for (i = och->
start, f = 0; i <= och->end; i++, f++) {
1333 "displacement imbuf pointer array");
1337 "spray_inverse imbuf pointer array");
1353 f = frame - och->
start;
1363 cache_filename(
string, och->
bakepath, och->
relbase, frame, CACHE_TYPE_DISPLACE);
1366 cache_filename(
string, och->
bakepath, och->
relbase, frame, CACHE_TYPE_FOAM);
1369 cache_filename(
string, och->
bakepath, och->
relbase, frame, CACHE_TYPE_SPRAY);
1372 cache_filename(
string, och->
bakepath, och->
relbase, frame, CACHE_TYPE_SPRAY_INVERSE);
1375 cache_filename(
string, och->
bakepath, och->
relbase, frame, CACHE_TYPE_NORMAL);
1381 void (*
update_cb)(
void *,
float progress,
int *cancel),
1382 void *update_cb_data)
1391 int f, i = 0,
x,
y, cancel = 0;
1394 ImBuf *ibuf_foam, *ibuf_disp, *ibuf_normal, *ibuf_spray, *ibuf_spray_inverse;
1405 if (o->_do_jacobian) {
1406 prev_foam =
MEM_callocN(res_x * res_y *
sizeof(
float),
"previous frame foam bake data");
1419 for (f = och->
start, i = 0; f <= och->
end; f++, i++) {
1431 for (
y = 0;
y < res_y;
y++) {
1432 for (
x = 0;
x < res_x;
x++) {
1437 rgb_to_rgba_unit_alpha(&ibuf_disp->
rect_float[4 * (res_x *
y +
x)], ocr.
disp);
1439 if (o->_do_jacobian) {
1442 float pr = 0.0f, foam_result;
1443 float neg_disp, neg_eplus;
1449 pr = prev_foam[res_x *
y +
x];
1460 neg_disp = ocr.
disp[1] < 0.0f ? 1.0f + ocr.
disp[1] : 1.0f;
1461 neg_disp = neg_disp < 0.0f ? 0.0f : neg_disp;
1464 neg_eplus = ocr.
Eplus[2] < 0.0f ? 1.0f + ocr.
Eplus[2] : 1.0f;
1465 neg_eplus = neg_eplus < 0.0f ? 0.0f : neg_eplus;
1471 pr *= och->
foam_fade * (0.75f + neg_eplus * 0.25f);
1476 prev_foam[res_x *
y +
x] = foam_result;
1480 value_to_rgba_unit_alpha(&ibuf_foam->
rect_float[4 * (res_x *
y +
x)], foam_result);
1484 rgb_to_rgba_unit_alpha(&ibuf_spray->
rect_float[4 * (res_x *
y +
x)], ocr.
Eplus);
1485 rgb_to_rgba_unit_alpha(&ibuf_spray_inverse->
rect_float[4 * (res_x *
y +
x)],
1490 if (o->_do_normals) {
1497 cache_filename(
string, och->
bakepath, och->
relbase, f, CACHE_TYPE_DISPLACE);
1499 printf(
"Cannot save Displacement File Output to %s\n",
string);
1502 if (o->_do_jacobian) {
1503 cache_filename(
string, och->
bakepath, och->
relbase, f, CACHE_TYPE_FOAM);
1505 printf(
"Cannot save Foam File Output to %s\n",
string);
1509 cache_filename(
string, och->
bakepath, och->
relbase, f, CACHE_TYPE_SPRAY);
1511 printf(
"Cannot save Spray File Output to %s\n",
string);
1514 cache_filename(
string, och->
bakepath, och->
relbase, f, CACHE_TYPE_SPRAY_INVERSE);
1516 printf(
"Cannot save Spray Inverse File Output to %s\n",
string);
1521 if (o->_do_normals) {
1522 cache_filename(
string, och->
bakepath, och->
relbase, f, CACHE_TYPE_NORMAL);
1524 printf(
"Cannot save Normal File Output to %s\n",
string);
1536 update_cb(update_cb_data, progress, &cancel);
1625 float UNUSED(fetch_jonswap),
1626 float UNUSED(sharpen_peak_jonswap),
1627 short UNUSED(do_height_field),
1630 short UNUSED(do_normals),
1631 short UNUSED(do_jacobian),
1676 const char *
UNUSED(relbase),
1679 float UNUSED(wave_scale),
1680 float UNUSED(chop_amount),
1681 float UNUSED(foam_coverage),
1696 void (*
update_cb)(
void *,
float progress,
int *cancel),
1697 void *
UNUSED(update_cb_data))
typedef float(TangentPoint)[2]
int BKE_imbuf_write(struct ImBuf *ibuf, const char *name, const struct ImageFormatData *imf)
void BKE_image_path_from_imtype(char *string, const char *base, const char *relbase, int frame, const char imtype, const bool use_ext, const bool use_frames, const char *suffix)
float BLI_ocean_spectrum_texelmarsenarsloe(const struct Ocean *oc, const float kx, const float kz)
float BLI_ocean_spectrum_piersonmoskowitz(const struct Ocean *oc, const float kx, const float kz)
bool BKE_ocean_ensure(struct OceanModifierData *omd, const int resolution)
float BLI_ocean_spectrum_jonswap(const struct Ocean *oc, const float kx, const float kz)
BLI_INLINE unsigned int BLI_hash_int_2d(unsigned int kx, unsigned int ky)
MINLINE float min_ff(float a, float b)
MINLINE float normalize_v3(float r[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void BLI_join_dirfile(char *__restrict dst, const size_t maxlen, const char *__restrict dir, const char *__restrict file) ATTR_NONNULL()
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
void BLI_rng_seed(struct RNG *rng, unsigned int seed) ATTR_NONNULL(1)
struct RNG * BLI_rng_new(unsigned int seed)
float BLI_rng_get_float(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_task_parallel_range(const int start, const int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
void * BLI_task_pool_user_data(TaskPool *pool)
void BLI_task_pool_work_and_wait(TaskPool *pool)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
TaskPool * BLI_task_pool_create(void *userdata, TaskPriority priority)
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)
typedef double(DMatrix)[4][4]
@ MOD_OCEAN_SPECTRUM_TEXEL_MARSEN_ARSLOE
@ MOD_OCEAN_SPECTRUM_JONSWAP
@ MOD_OCEAN_SPECTRUM_PIERSON_MOSKOWITZ
@ MOD_OCEAN_GENERATE_NORMALS
@ MOD_OCEAN_GENERATE_FOAM
@ MOD_OCEAN_GENERATE_SPRAY
#define R_IMF_EXR_CODEC_ZIP
#define R_IMF_IMTYPE_OPENEXR
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint i1
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
struct ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_freeImBuf(struct ImBuf *ibuf)
struct ImBuf * IMB_loadiffname(const char *filepath, int flags, char colorspace[IM_MAX_SPACE])
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
Group RGB to Bright Vector Camera CLAMP
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
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_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
INLINE Rall1d< T, V, S > sin(const Rall1d< T, V, S > &arg)
void BKE_ocean_eval_xz(struct Ocean *UNUSED(oc), struct OceanResult *UNUSED(ocr), float UNUSED(x), float UNUSED(z))
void BKE_ocean_cache_eval_ij(struct OceanCache *UNUSED(och), struct OceanResult *UNUSED(ocr), int UNUSED(f), int UNUSED(i), int UNUSED(j))
void BKE_ocean_simulate(struct Ocean *UNUSED(o), float UNUSED(t), float UNUSED(scale), float UNUSED(chop_amount))
void BKE_ocean_free_data(struct Ocean *UNUSED(oc))
void BKE_ocean_free_modifier_cache(struct OceanModifierData *omd)
void BKE_ocean_free_cache(struct OceanCache *och)
OceanCache * BKE_ocean_init_cache(const char *UNUSED(bakepath), const char *UNUSED(relbase), int UNUSED(start), int UNUSED(end), float UNUSED(wave_scale), float UNUSED(chop_amount), float UNUSED(foam_coverage), float UNUSED(foam_fade), int UNUSED(resolution))
void BKE_ocean_cache_eval_uv(struct OceanCache *UNUSED(och), struct OceanResult *UNUSED(ocr), int UNUSED(f), float UNUSED(u), float UNUSED(v))
void BKE_ocean_init_from_modifier(struct Ocean *UNUSED(ocean), struct OceanModifierData const *UNUSED(omd), int UNUSED(resolution))
struct Ocean * BKE_ocean_add(void)
void BKE_ocean_eval_xz_catrom(struct Ocean *UNUSED(oc), struct OceanResult *UNUSED(ocr), float UNUSED(x), float UNUSED(z))
void BKE_ocean_eval_uv(struct Ocean *UNUSED(oc), struct OceanResult *UNUSED(ocr), float UNUSED(u), float UNUSED(v))
void BKE_ocean_eval_ij(struct Ocean *UNUSED(oc), struct OceanResult *UNUSED(ocr), int UNUSED(i), int UNUSED(j))
void BKE_ocean_init(struct Ocean *UNUSED(o), int UNUSED(M), int UNUSED(N), float UNUSED(Lx), float UNUSED(Lz), float UNUSED(V), float UNUSED(l), float UNUSED(A), float UNUSED(w), float UNUSED(damp), float UNUSED(alignment), float UNUSED(depth), float UNUSED(time), int UNUSED(spectrum), float UNUSED(fetch_jonswap), float UNUSED(sharpen_peak_jonswap), short UNUSED(do_height_field), short UNUSED(do_chop), short UNUSED(do_spray), short UNUSED(do_normals), short UNUSED(do_jacobian), int UNUSED(seed))
void BKE_ocean_free(struct Ocean *oc)
void BKE_ocean_simulate_cache(struct OceanCache *UNUSED(och), int UNUSED(frame))
float BKE_ocean_jminus_to_foam(float UNUSED(jminus), float UNUSED(coverage))
void BKE_ocean_bake(struct Ocean *UNUSED(o), struct OceanCache *UNUSED(och), void(*update_cb)(void *, float progress, int *cancel), void *UNUSED(update_cb_data))
void BKE_ocean_eval_uv_catrom(struct Ocean *UNUSED(oc), struct OceanResult *UNUSED(ocr), float UNUSED(u), float UNUSED(v))
static void update_cb(PBVHNode *node, void *rebuild)
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])
__forceinline const avxi abs(const avxi &a)
ccl_device_inline float2 floor(const float2 &a)
ccl_device_inline float2 fabs(const float2 &a)
CCL_NAMESPACE_BEGIN struct View V