Spaces:
Sleeping
Sleeping
| /** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved. | |
| * NVIDIA CORPORATION and its licensors retain all intellectual property | |
| * and proprietary rights in and to this software, related documentation | |
| * and any modifications thereto. Any use, reproduction, disclosure or | |
| * distribution of this software and related documentation without an express | |
| * license agreement from NVIDIA CORPORATION is strictly prohibited. | |
| */ | |
| namespace wp | |
| { | |
| inline CUDA_CALLABLE float smootherstep(float t) | |
| { | |
| return t * t * t * (t * (t * 6.f - 15.f) + 10.f); | |
| } | |
| inline CUDA_CALLABLE float smootherstep_gradient(float t) | |
| { | |
| return 30.f * t * t * (t * (t - 2.f) + 1.f); | |
| } | |
| inline CUDA_CALLABLE float smoothstep(float t) | |
| { | |
| return t * t * (3.f - t * 2.f); | |
| } | |
| inline CUDA_CALLABLE float smoothstep_gradient(float t) | |
| { | |
| return 6.f * t * (1.f - t); | |
| } | |
| inline CUDA_CALLABLE float interpolate(float a0, float a1, float t) | |
| { | |
| return (a1 - a0) * smootherstep(t) + a0; | |
| // return (a1 - a0) * smoothstep(t) + a0; | |
| // return (a1 - a0) * t + a0; | |
| } | |
| inline CUDA_CALLABLE float interpolate_gradient(float a0, float a1, float t, float d_a0, float d_a1, float d_t) | |
| { | |
| return (d_a1 - d_a0) * smootherstep(t) + (a1 - a0) * smootherstep_gradient(t) * d_t + d_a0; | |
| // return (d_a1 - d_a0) * smoothstep(t) + (a1 - a0) * smoothstep_gradient(t) * d_t + d_a0; | |
| // return (d_a1 - d_a0) * t + (a1 - a0) * d_t + d_a0; | |
| } | |
| inline CUDA_CALLABLE vec2 interpolate_gradient_2d(float a0, float a1, float t, vec2& d_a0, vec2& d_a1, vec2& d_t) | |
| { | |
| return (d_a1 - d_a0) * smootherstep(t) + (a1 - a0) * smootherstep_gradient(t) * d_t + d_a0; | |
| } | |
| inline CUDA_CALLABLE vec3 interpolate_gradient_3d(float a0, float a1, float t, vec3& d_a0, vec3& d_a1, vec3& d_t) | |
| { | |
| return (d_a1 - d_a0) * smootherstep(t) + (a1 - a0) * smootherstep_gradient(t) * d_t + d_a0; | |
| } | |
| inline CUDA_CALLABLE vec4 interpolate_gradient_4d(float a0, float a1, float t, vec4& d_a0, vec4& d_a1, vec4& d_t) | |
| { | |
| return (d_a1 - d_a0) * smootherstep(t) + (a1 - a0) * smootherstep_gradient(t) * d_t + d_a0; | |
| } | |
| inline CUDA_CALLABLE float random_gradient_1d(uint32 state, int ix) | |
| { | |
| const uint32 p1 = 73856093; | |
| uint32 idx = ix*p1 + state; | |
| return randf(idx, -1.f, 1.f); | |
| } | |
| inline CUDA_CALLABLE vec2 random_gradient_2d(uint32 state, int ix, int iy) | |
| { | |
| const uint32 p1 = 73856093; | |
| const uint32 p2 = 19349663; | |
| uint32 idx = ix*p1 ^ iy*p2 + state; | |
| return normalize(sample_unit_square(idx)); | |
| } | |
| inline CUDA_CALLABLE vec3 random_gradient_3d(uint32 state, int ix, int iy, int iz) | |
| { | |
| const uint32 p1 = 73856093; | |
| const uint32 p2 = 19349663; | |
| const uint32 p3 = 53471161; | |
| uint32 idx = ix*p1 ^ iy*p2 ^ iz*p3 + state; | |
| return normalize(sample_unit_cube(idx)); | |
| } | |
| inline CUDA_CALLABLE vec4 random_gradient_4d(uint32 state, int ix, int iy, int iz, int it) | |
| { | |
| const uint32 p1 = 73856093; | |
| const uint32 p2 = 19349663; | |
| const uint32 p3 = 53471161; | |
| const uint32 p4 = 10000019; | |
| uint32 idx = ix*p1 ^ iy*p2 ^ iz*p3 ^ it*p4 + state; | |
| return normalize(sample_unit_hypercube(idx)); | |
| } | |
| inline CUDA_CALLABLE float dot_grid_gradient_1d(uint32 state, int ix, float dx) | |
| { | |
| float gradient = random_gradient_1d(state, ix); | |
| return dx*gradient; | |
| } | |
| inline CUDA_CALLABLE float dot_grid_gradient_2d(uint32 state, int ix, int iy, float dx, float dy) | |
| { | |
| vec2 gradient = random_gradient_2d(state, ix, iy); | |
| return (dx*gradient[0] + dy*gradient[1]); | |
| } | |
| inline CUDA_CALLABLE float dot_grid_gradient_3d(uint32 state, int ix, int iy, int iz, float dx, float dy, float dz) | |
| { | |
| vec3 gradient = random_gradient_3d(state, ix, iy, iz); | |
| return (dx*gradient[0] + dy*gradient[1] + dz*gradient[2]); | |
| } | |
| inline CUDA_CALLABLE float dot_grid_gradient_4d(uint32 state, int ix, int iy, int iz, int it, float dx, float dy, float dz, float dt) | |
| { | |
| vec4 gradient = random_gradient_4d(state, ix, iy, iz, it); | |
| return (dx*gradient[0] + dy*gradient[1] + dz*gradient[2] + dt*gradient[3]); | |
| } | |
| inline CUDA_CALLABLE float noise_1d(uint32 state, int x0, int x1, float dx) | |
| { | |
| //vX | |
| float v0 = dot_grid_gradient_1d(state, x0, dx); | |
| float v1 = dot_grid_gradient_1d(state, x1, dx-1.f); | |
| return interpolate(v0, v1, dx); | |
| } | |
| inline CUDA_CALLABLE float noise_1d_gradient(uint32 state, int x0, int x1, float dx) | |
| { | |
| float gradient_x0 = random_gradient_1d(state, x0); | |
| float v0 = dx * gradient_x0; | |
| float gradient_x1 = random_gradient_1d(state, x1); | |
| float v1 = (dx-1.f) * gradient_x1; | |
| return interpolate_gradient(v0, v1, dx, gradient_x0, gradient_x1, 1.f); | |
| } | |
| inline CUDA_CALLABLE float noise_2d(uint32 state, int x0, int y0, int x1, int y1, float dx, float dy) | |
| { | |
| //vXY | |
| float v00 = dot_grid_gradient_2d(state, x0, y0, dx, dy); | |
| float v10 = dot_grid_gradient_2d(state, x1, y0, dx-1.f, dy); | |
| float xi0 = interpolate(v00, v10, dx); | |
| float v01 = dot_grid_gradient_2d(state, x0, y1, dx, dy-1.f); | |
| float v11 = dot_grid_gradient_2d(state, x1, y1, dx-1.f, dy-1.f); | |
| float xi1 = interpolate(v01, v11, dx); | |
| return interpolate(xi0, xi1, dy); | |
| } | |
| inline CUDA_CALLABLE vec2 noise_2d_gradient(uint32 state, int x0, int y0, int x1, int y1, float dx, float dy) | |
| { | |
| vec2 d00 = vec2(dx, dy); | |
| vec2 gradient_v00 = random_gradient_2d(state, x0, y0); | |
| float v00 = dot(d00, gradient_v00); | |
| vec2 d10 = vec2(dx-1.f, dy); | |
| vec2 gradient_v10 = random_gradient_2d(state, x1, y0); | |
| float v10 = dot(d10, gradient_v10); | |
| vec2 d01 = vec2(dx, dy-1.f); | |
| vec2 gradient_v01 = random_gradient_2d(state, x0, y1); | |
| float v01 = dot(d01, gradient_v01); | |
| vec2 d11 = vec2(dx-1.f, dy-1.f); | |
| vec2 gradient_v11 = random_gradient_2d(state, x1, y1); | |
| float v11 = dot(d11, gradient_v11); | |
| vec2 dx_dt = vec2(1.f, 0.f); | |
| float xi0 = interpolate(v00, v10, dx); | |
| vec2 gradient_xi0 = interpolate_gradient_2d(v00, v10, dx, gradient_v00, gradient_v10, dx_dt); | |
| float xi1 = interpolate(v01, v11, dx); | |
| vec2 gradient_xi1 = interpolate_gradient_2d(v01, v11, dx, gradient_v01, gradient_v11, dx_dt); | |
| vec2 dy_dt = vec2(0.f, 1.f); | |
| vec2 gradient = interpolate_gradient_2d(xi0, xi1, dy, gradient_xi0, gradient_xi1, dy_dt); | |
| return gradient; | |
| } | |
| inline CUDA_CALLABLE float noise_3d(uint32 state, int x0, int y0, int z0, int x1, int y1, int z1, float dx, float dy, float dz) | |
| { | |
| //vXYZ | |
| float v000 = dot_grid_gradient_3d(state, x0, y0, z0, dx, dy, dz); | |
| float v100 = dot_grid_gradient_3d(state, x1, y0, z0, dx-1.f, dy, dz); | |
| float xi00 = interpolate(v000, v100, dx); | |
| float v010 = dot_grid_gradient_3d(state, x0, y1, z0, dx, dy-1.f, dz); | |
| float v110 = dot_grid_gradient_3d(state, x1, y1, z0, dx-1.f, dy-1.f, dz); | |
| float xi10 = interpolate(v010, v110, dx); | |
| float yi0 = interpolate(xi00, xi10, dy); | |
| float v001 = dot_grid_gradient_3d(state, x0, y0, z1, dx, dy, dz-1.f); | |
| float v101 = dot_grid_gradient_3d(state, x1, y0, z1, dx-1.f, dy, dz-1.f); | |
| float xi01 = interpolate(v001, v101, dx); | |
| float v011 = dot_grid_gradient_3d(state, x0, y1, z1, dx, dy-1.f, dz-1.f); | |
| float v111 = dot_grid_gradient_3d(state, x1, y1, z1, dx-1.f, dy-1.f, dz-1.f); | |
| float xi11 = interpolate(v011, v111, dx); | |
| float yi1 = interpolate(xi01, xi11, dy); | |
| return interpolate(yi0, yi1, dz); | |
| } | |
| inline CUDA_CALLABLE vec3 noise_3d_gradient(uint32 state, int x0, int y0, int z0, int x1, int y1, int z1, float dx, float dy, float dz) | |
| { | |
| vec3 d000 = vec3(dx, dy, dz); | |
| vec3 gradient_v000 = random_gradient_3d(state, x0, y0, z0); | |
| float v000 = dot(d000, gradient_v000); | |
| vec3 d100 = vec3(dx-1.f, dy, dz); | |
| vec3 gradient_v100 = random_gradient_3d(state, x1, y0, z0); | |
| float v100 = dot(d100, gradient_v100); | |
| vec3 d010 = vec3(dx, dy-1.f, dz); | |
| vec3 gradient_v010 = random_gradient_3d(state, x0, y1, z0); | |
| float v010 = dot(d010, gradient_v010); | |
| vec3 d110 = vec3(dx-1.f, dy-1.f, dz); | |
| vec3 gradient_v110 = random_gradient_3d(state, x1, y1, z0); | |
| float v110 = dot(d110, gradient_v110); | |
| vec3 d001 = vec3(dx, dy, dz-1.f); | |
| vec3 gradient_v001 = random_gradient_3d(state, x0, y0, z1); | |
| float v001 = dot(d001, gradient_v001); | |
| vec3 d101 = vec3(dx-1.f, dy, dz-1.f); | |
| vec3 gradient_v101 = random_gradient_3d(state, x1, y0, z1); | |
| float v101 = dot(d101, gradient_v101); | |
| vec3 d011 = vec3(dx, dy-1.f, dz-1.f); | |
| vec3 gradient_v011 = random_gradient_3d(state, x0, y1, z1); | |
| float v011 = dot(d011, gradient_v011); | |
| vec3 d111 = vec3(dx-1.f, dy-1.f, dz-1.f); | |
| vec3 gradient_v111 = random_gradient_3d(state, x1, y1, z1); | |
| float v111 = dot(d111, gradient_v111); | |
| vec3 dx_dt = vec3(1.f, 0.f, 0.f); | |
| float xi00 = interpolate(v000, v100, dx); | |
| vec3 gradient_xi00 = interpolate_gradient_3d(v000, v100, dx, gradient_v000, gradient_v100, dx_dt); | |
| float xi10 = interpolate(v010, v110, dx); | |
| vec3 gradient_xi10 = interpolate_gradient_3d(v010, v110, dx, gradient_v010, gradient_v110, dx_dt); | |
| float xi01 = interpolate(v001, v101, dx); | |
| vec3 gradient_xi01 = interpolate_gradient_3d(v001, v101, dx, gradient_v001, gradient_v101, dx_dt); | |
| float xi11 = interpolate(v011, v111, dx); | |
| vec3 gradient_xi11 = interpolate_gradient_3d(v011, v111, dx, gradient_v011, gradient_v111, dx_dt); | |
| vec3 dy_dt = vec3(0.f, 1.f, 0.f); | |
| float yi0 = interpolate(xi00, xi10, dy); | |
| vec3 gradient_yi0 = interpolate_gradient_3d(xi00, xi10, dy, gradient_xi00, gradient_xi10, dy_dt); | |
| float yi1 = interpolate(xi01, xi11, dy); | |
| vec3 gradient_yi1 = interpolate_gradient_3d(xi01, xi11, dy, gradient_xi01, gradient_xi11, dy_dt); | |
| vec3 dz_dt = vec3(0.f, 0.f, 1.f); | |
| vec3 gradient = interpolate_gradient_3d(yi0, yi1, dz, gradient_yi0, gradient_yi1, dz_dt); | |
| return gradient; | |
| } | |
| inline CUDA_CALLABLE float noise_4d(uint32 state, int x0, int y0, int z0, int t0, int x1, int y1, int z1, int t1, float dx, float dy, float dz, float dt) | |
| { | |
| //vXYZT | |
| float v0000 = dot_grid_gradient_4d(state, x0, y0, z0, t0, dx, dy, dz, dt); | |
| float v1000 = dot_grid_gradient_4d(state, x1, y0, z0, t0, dx-1.f, dy, dz, dt); | |
| float xi000 = interpolate(v0000, v1000, dx); | |
| float v0100 = dot_grid_gradient_4d(state, x0, y1, z0, t0, dx, dy-1.f, dz, dt); | |
| float v1100 = dot_grid_gradient_4d(state, x1, y1, z0, t0, dx-1.f, dy-1.f, dz, dt); | |
| float xi100 = interpolate(v0100, v1100, dx); | |
| float yi00 = interpolate(xi000, xi100, dy); | |
| float v0010 = dot_grid_gradient_4d(state, x0, y0, z1, t0, dx, dy, dz-1.f, dt); | |
| float v1010 = dot_grid_gradient_4d(state, x1, y0, z1, t0, dx-1.f, dy, dz-1.f, dt); | |
| float xi010 = interpolate(v0010, v1010, dx); | |
| float v0110 = dot_grid_gradient_4d(state, x0, y1, z1, t0, dx, dy-1.f, dz-1.f, dt); | |
| float v1110 = dot_grid_gradient_4d(state, x1, y1, z1, t0, dx-1.f, dy-1.f, dz-1.f, dt); | |
| float xi110 = interpolate(v0110, v1110, dx); | |
| float yi10 = interpolate(xi010, xi110, dy); | |
| float zi0 = interpolate(yi00, yi10, dz); | |
| float v0001 = dot_grid_gradient_4d(state, x0, y0, z0, t1, dx, dy, dz, dt-1.f); | |
| float v1001 = dot_grid_gradient_4d(state, x1, y0, z0, t1, dx-1.f, dy, dz, dt-1.f); | |
| float xi001 = interpolate(v0001, v1001, dx); | |
| float v0101 = dot_grid_gradient_4d(state, x0, y1, z0, t1, dx, dy-1.f, dz, dt-1.f); | |
| float v1101 = dot_grid_gradient_4d(state, x1, y1, z0, t1, dx-1.f, dy-1.f, dz, dt-1.f); | |
| float xi101 = interpolate(v0101, v1101, dx); | |
| float yi01 = interpolate(xi001, xi101, dy); | |
| float v0011 = dot_grid_gradient_4d(state, x0, y0, z1, t1, dx, dy, dz-1.f, dt-1.f); | |
| float v1011 = dot_grid_gradient_4d(state, x1, y0, z1, t1, dx-1.f, dy, dz-1.f, dt-1.f); | |
| float xi011 = interpolate(v0011, v1011, dx); | |
| float v0111 = dot_grid_gradient_4d(state, x0, y1, z1, t1, dx, dy-1.f, dz-1.f, dt-1.f); | |
| float v1111 = dot_grid_gradient_4d(state, x1, y1, z1, t1, dx-1.f, dy-1.f, dz-1.f, dt-1.f); | |
| float xi111 = interpolate(v0111, v1111, dx); | |
| float yi11 = interpolate(xi011, xi111, dy); | |
| float zi1 = interpolate(yi01, yi11, dz); | |
| return interpolate(zi0, zi1, dt); | |
| } | |
| inline CUDA_CALLABLE vec4 noise_4d_gradient(uint32 state, int x0, int y0, int z0, int t0, int x1, int y1, int z1, int t1, float dx, float dy, float dz, float dt) | |
| { | |
| vec4 d0000 = vec4(dx, dy, dz, dt); | |
| vec4 gradient_v0000 = random_gradient_4d(state, x0, y0, z0, t0); | |
| float v0000 = dot(d0000, gradient_v0000); | |
| vec4 d1000 = vec4(dx-1.f, dy, dz, dt); | |
| vec4 gradient_v1000 = random_gradient_4d(state, x1, y0, z0, t0); | |
| float v1000 = dot(d1000, gradient_v1000); | |
| vec4 d0100 = vec4(dx, dy-1.f, dz, dt); | |
| vec4 gradient_v0100 = random_gradient_4d(state, x0, y1, z0, t0); | |
| float v0100 = dot(d0100, gradient_v0100); | |
| vec4 d1100 = vec4(dx-1.f, dy-1.f, dz, dt); | |
| vec4 gradient_v1100 = random_gradient_4d(state, x1, y1, z0, t0); | |
| float v1100 = dot(d1100, gradient_v1100); | |
| vec4 d0010 = vec4(dx, dy, dz-1.f, dt); | |
| vec4 gradient_v0010 = random_gradient_4d(state, x0, y0, z1, t0); | |
| float v0010 = dot(d0010, gradient_v0010); | |
| vec4 d1010 = vec4(dx-1.f, dy, dz-1.f, dt); | |
| vec4 gradient_v1010 = random_gradient_4d(state, x1, y0, z1, t0); | |
| float v1010 = dot(d1010, gradient_v1010); | |
| vec4 d0110 = vec4(dx, dy-1.f, dz-1.f, dt); | |
| vec4 gradient_v0110 = random_gradient_4d(state, x0, y1, z1, t0); | |
| float v0110 = dot(d0110, gradient_v0110); | |
| vec4 d1110 = vec4(dx-1.f, dy-1.f, dz-1.f, dt); | |
| vec4 gradient_v1110 = random_gradient_4d(state, x1, y1, z1, t0); | |
| float v1110 = dot(d1110, gradient_v1110); | |
| vec4 d0001 = vec4(dx, dy, dz, dt-1.f); | |
| vec4 gradient_v0001 = random_gradient_4d(state, x0, y0, z0, t1); | |
| float v0001 = dot(d0001, gradient_v0001); | |
| vec4 d1001 = vec4(dx-1.f, dy, dz, dt-1.f); | |
| vec4 gradient_v1001 = random_gradient_4d(state, x1, y0, z0, t1); | |
| float v1001 = dot(d1001, gradient_v1001); | |
| vec4 d0101 = vec4(dx, dy-1.f, dz, dt-1.f); | |
| vec4 gradient_v0101 = random_gradient_4d(state, x0, y1, z0, t1); | |
| float v0101 = dot(d0101, gradient_v0101); | |
| vec4 d1101 = vec4(dx-1.f, dy-1.f, dz, dt-1.f); | |
| vec4 gradient_v1101 = random_gradient_4d(state, x1, y1, z0, t1); | |
| float v1101 = dot(d1101, gradient_v1101); | |
| vec4 d0011 = vec4(dx, dy, dz-1.f, dt-1.f); | |
| vec4 gradient_v0011 = random_gradient_4d(state, x0, y0, z1, t1); | |
| float v0011 = dot(d0011, gradient_v0011); | |
| vec4 d1011 = vec4(dx-1.f, dy, dz-1.f, dt-1.f); | |
| vec4 gradient_v1011 = random_gradient_4d(state, x1, y0, z1, t1); | |
| float v1011 = dot(d1011, gradient_v1011); | |
| vec4 d0111 = vec4(dx, dy-1.f, dz-1.f, dt-1.f); | |
| vec4 gradient_v0111 = random_gradient_4d(state, x0, y1, z1, t1); | |
| float v0111 = dot(d0111, gradient_v0111); | |
| vec4 d1111 = vec4(dx-1.f, dy-1.f, dz-1.f, dt-1.f); | |
| vec4 gradient_v1111 = random_gradient_4d(state, x1, y1, z1, t1); | |
| float v1111 = dot(d1111, gradient_v1111); | |
| vec4 dx_dt = vec4(1.f, 0.f, 0.f, 0.f); | |
| float xi000 = interpolate(v0000, v1000, dx); | |
| vec4 gradient_xi000 = interpolate_gradient_4d(v0000, v1000, dx, gradient_v0000, gradient_v1000, dx_dt); | |
| float xi100 = interpolate(v0100, v1100, dx); | |
| vec4 gradient_xi100 = interpolate_gradient_4d(v0100, v1100, dx, gradient_v0100, gradient_v1100, dx_dt); | |
| float xi010 = interpolate(v0010, v1010, dx); | |
| vec4 gradient_xi010 = interpolate_gradient_4d(v0010, v1010, dx, gradient_v0010, gradient_v1010, dx_dt); | |
| float xi110 = interpolate(v0110, v1110, dx); | |
| vec4 gradient_xi110 = interpolate_gradient_4d(v0110, v1110, dx, gradient_v0110, gradient_v1110, dx_dt); | |
| float xi001 = interpolate(v0001, v1001, dx); | |
| vec4 gradient_xi001 = interpolate_gradient_4d(v0001, v1001, dx, gradient_v0001, gradient_v1001, dx_dt); | |
| float xi101 = interpolate(v0101, v1101, dx); | |
| vec4 gradient_xi101 = interpolate_gradient_4d(v0101, v1101, dx, gradient_v0101, gradient_v1101, dx_dt); | |
| float xi011 = interpolate(v0011, v1011, dx); | |
| vec4 gradient_xi011 = interpolate_gradient_4d(v0011, v1011, dx, gradient_v0011, gradient_v1011, dx_dt); | |
| float xi111 = interpolate(v0111, v1111, dx); | |
| vec4 gradient_xi111 = interpolate_gradient_4d(v0111, v1111, dx, gradient_v0111, gradient_v1111, dx_dt); | |
| vec4 dy_dt = vec4(0.f, 1.f, 0.f, 0.f); | |
| float yi00 = interpolate(xi000, xi100, dy); | |
| vec4 gradient_yi00 = interpolate_gradient_4d(xi000, xi100, dy, gradient_xi000, gradient_xi100, dy_dt); | |
| float yi10 = interpolate(xi010, xi110, dy); | |
| vec4 gradient_yi10 = interpolate_gradient_4d(xi010, xi110, dy, gradient_xi010, gradient_xi110, dy_dt); | |
| float yi01 = interpolate(xi001, xi101, dy); | |
| vec4 gradient_yi01 = interpolate_gradient_4d(xi001, xi101, dy, gradient_xi001, gradient_xi101, dy_dt); | |
| float yi11 = interpolate(xi011, xi111, dy); | |
| vec4 gradient_yi11 = interpolate_gradient_4d(xi011, xi111, dy, gradient_xi011, gradient_xi111, dy_dt); | |
| vec4 dz_dt = vec4(0.f, 0.f, 1.f, 0.f); | |
| float zi0 = interpolate(yi00, yi10, dz); | |
| vec4 gradient_zi0 = interpolate_gradient_4d(yi00, yi10, dz, gradient_yi00, gradient_yi10, dz_dt); | |
| float zi1 = interpolate(yi01, yi11, dz); | |
| vec4 gradient_zi1 = interpolate_gradient_4d(yi01, yi11, dz, gradient_yi01, gradient_yi11, dz_dt); | |
| vec4 dt_dt = vec4(0.f, 0.f, 0.f, 1.f); | |
| vec4 gradient = interpolate_gradient_4d(zi0, zi1, dt, gradient_zi0, gradient_zi1, dt_dt); | |
| return gradient; | |
| } | |
| // non-periodic Perlin noise | |
| inline CUDA_CALLABLE float noise(uint32 state, float x) | |
| { | |
| float dx = x - floor(x); | |
| int x0 = (int)floor(x); | |
| int x1 = x0 + 1; | |
| return noise_1d(state, x0, x1, dx); | |
| } | |
| inline CUDA_CALLABLE void adj_noise(uint32 state, float x, uint32& adj_state, float& adj_x, const float adj_ret) | |
| { | |
| float dx = x - floor(x); | |
| int x0 = (int)floor(x); | |
| int x1 = x0 + 1; | |
| float gradient = noise_1d_gradient(state, x0, x1, dx); | |
| adj_x += gradient * adj_ret; | |
| } | |
| inline CUDA_CALLABLE float noise(uint32 state, const vec2& xy) | |
| { | |
| float dx = xy[0] - floor(xy[0]); | |
| float dy = xy[1] - floor(xy[1]); | |
| int x0 = (int)floor(xy[0]); | |
| int y0 = (int)floor(xy[1]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| return noise_2d(state, x0, y0, x1, y1, dx, dy); | |
| } | |
| inline CUDA_CALLABLE void adj_noise(uint32 state, const vec2& xy, uint32& adj_state, vec2& adj_xy, const float adj_ret) | |
| { | |
| float dx = xy[0] - floor(xy[0]); | |
| float dy = xy[1] - floor(xy[1]); | |
| int x0 = (int)floor(xy[0]); | |
| int y0 = (int)floor(xy[1]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| vec2 gradient = noise_2d_gradient(state, x0, y0, x1, y1, dx, dy); | |
| adj_xy[0] += gradient[0] * adj_ret; | |
| adj_xy[1] += gradient[1] * adj_ret; | |
| } | |
| inline CUDA_CALLABLE float noise(uint32 state, const vec3& xyz) | |
| { | |
| float dx = xyz[0] - floor(xyz[0]); | |
| float dy = xyz[1] - floor(xyz[1]); | |
| float dz = xyz[2] - floor(xyz[2]); | |
| int x0 = (int)floor(xyz[0]); | |
| int y0 = (int)floor(xyz[1]); | |
| int z0 = (int)floor(xyz[2]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| int z1 = z0 + 1; | |
| return noise_3d(state, x0, y0, z0, x1, y1, z1, dx, dy, dz); | |
| } | |
| inline CUDA_CALLABLE void adj_noise(uint32 state, const vec3& xyz, uint32& adj_state, vec3& adj_xyz, const float adj_ret) | |
| { | |
| float dx = xyz[0] - floor(xyz[0]); | |
| float dy = xyz[1] - floor(xyz[1]); | |
| float dz = xyz[2] - floor(xyz[2]); | |
| int x0 = (int)floor(xyz[0]); | |
| int y0 = (int)floor(xyz[1]); | |
| int z0 = (int)floor(xyz[2]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| int z1 = z0 + 1; | |
| vec3 gradient = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz); | |
| adj_xyz[0] += gradient[0] * adj_ret; | |
| adj_xyz[1] += gradient[1] * adj_ret; | |
| adj_xyz[2] += gradient[2] * adj_ret; | |
| } | |
| inline CUDA_CALLABLE float noise(uint32 state, const vec4& xyzt) | |
| { | |
| float dx = xyzt[0] - floor(xyzt[0]); | |
| float dy = xyzt[1] - floor(xyzt[1]); | |
| float dz = xyzt[2] - floor(xyzt[2]); | |
| float dt = xyzt[3] - floor(xyzt[3]); | |
| int x0 = (int)floor(xyzt[0]); | |
| int y0 = (int)floor(xyzt[1]); | |
| int z0 = (int)floor(xyzt[2]); | |
| int t0 = (int)floor(xyzt[3]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| int z1 = z0 + 1; | |
| int t1 = t0 + 1; | |
| return noise_4d(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt); | |
| } | |
| inline CUDA_CALLABLE void adj_noise(uint32 state, const vec4& xyzt, uint32& adj_state, vec4& adj_xyzt, const float adj_ret) | |
| { | |
| float dx = xyzt[0] - floor(xyzt[0]); | |
| float dy = xyzt[1] - floor(xyzt[1]); | |
| float dz = xyzt[2] - floor(xyzt[2]); | |
| float dt = xyzt[3] - floor(xyzt[3]); | |
| int x0 = (int)floor(xyzt[0]); | |
| int y0 = (int)floor(xyzt[1]); | |
| int z0 = (int)floor(xyzt[2]); | |
| int t0 = (int)floor(xyzt[3]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| int z1 = z0 + 1; | |
| int t1 = t0 + 1; | |
| vec4 gradient = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt); | |
| adj_xyzt[0] += gradient[0] * adj_ret; | |
| adj_xyzt[1] += gradient[1] * adj_ret; | |
| adj_xyzt[2] += gradient[2] * adj_ret; | |
| adj_xyzt[3] += gradient[3] * adj_ret; | |
| } | |
| // periodic Perlin noise | |
| inline CUDA_CALLABLE float pnoise(uint32 state, float x, int px) | |
| { | |
| float dx = x - floor(x); | |
| int x0 = mod(((int)floor(x)), px); | |
| int x1 = mod((x0 + 1), px); | |
| return noise_1d(state, x0, x1, dx); | |
| } | |
| inline CUDA_CALLABLE void adj_pnoise(uint32 state, float x, int px, uint32& adj_state, float& adj_x, int& adj_px, const float adj_ret) | |
| { | |
| float dx = x - floor(x); | |
| int x0 = mod(((int)floor(x)), px); | |
| int x1 = mod((x0 + 1), px); | |
| float gradient = noise_1d_gradient(state, x0, x1, dx); | |
| adj_x += gradient * adj_ret; | |
| } | |
| inline CUDA_CALLABLE float pnoise(uint32 state, const vec2& xy, int px, int py) | |
| { | |
| float dx = xy[0] - floor(xy[0]); | |
| float dy = xy[1] - floor(xy[1]); | |
| int x0 = mod(((int)floor(xy[0])), px); | |
| int y0 = mod(((int)floor(xy[1])), py); | |
| int x1 = mod((x0 + 1), px); | |
| int y1 = mod((y0 + 1), py); | |
| return noise_2d(state, x0, y0, x1, y1, dx, dy); | |
| } | |
| inline CUDA_CALLABLE void adj_pnoise(uint32 state, const vec2& xy, int px, int py, uint32& adj_state, vec2& adj_xy, int& adj_px, int& adj_py, const float adj_ret) | |
| { | |
| float dx = xy[0] - floor(xy[0]); | |
| float dy = xy[1] - floor(xy[1]); | |
| int x0 = mod(((int)floor(xy[0])), px); | |
| int y0 = mod(((int)floor(xy[1])), py); | |
| int x1 = mod((x0 + 1), px); | |
| int y1 = mod((y0 + 1), py); | |
| vec2 gradient = noise_2d_gradient(state, x0, y0, x1, y1, dx, dy); | |
| adj_xy[0] += gradient[0] * adj_ret; | |
| adj_xy[1] += gradient[1] * adj_ret; | |
| } | |
| inline CUDA_CALLABLE float pnoise(uint32 state, const vec3& xyz, int px, int py, int pz) | |
| { | |
| float dx = xyz[0] - floor(xyz[0]); | |
| float dy = xyz[1] - floor(xyz[1]); | |
| float dz = xyz[2] - floor(xyz[2]); | |
| int x0 = mod(((int)floor(xyz[0])), px); | |
| int y0 = mod(((int)floor(xyz[1])), py); | |
| int z0 = mod(((int)floor(xyz[2])), pz); | |
| int x1 = mod((x0 + 1), px); | |
| int y1 = mod((y0 + 1), py); | |
| int z1 = mod((z0 + 1), pz); | |
| return noise_3d(state, x0, y0, z0, x1, y1, z1, dx, dy, dz); | |
| } | |
| inline CUDA_CALLABLE void adj_pnoise(uint32 state, const vec3& xyz, int px, int py, int pz, uint32& adj_state, vec3& adj_xyz, int& adj_px, int& adj_py, int& adj_pz, const float adj_ret) | |
| { | |
| float dx = xyz[0] - floor(xyz[0]); | |
| float dy = xyz[1] - floor(xyz[1]); | |
| float dz = xyz[2] - floor(xyz[2]); | |
| int x0 = mod(((int)floor(xyz[0])), px); | |
| int y0 = mod(((int)floor(xyz[1])), py); | |
| int z0 = mod(((int)floor(xyz[2])), pz); | |
| int x1 = mod((x0 + 1), px); | |
| int y1 = mod((y0 + 1), py); | |
| int z1 = mod((z0 + 1), pz); | |
| vec3 gradient = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz); | |
| adj_xyz[0] += gradient[0] * adj_ret; | |
| adj_xyz[1] += gradient[1] * adj_ret; | |
| adj_xyz[2] += gradient[2] * adj_ret; | |
| } | |
| inline CUDA_CALLABLE float pnoise(uint32 state, const vec4& xyzt, int px, int py, int pz, int pt) | |
| { | |
| float dx = xyzt[0] - floor(xyzt[0]); | |
| float dy = xyzt[1] - floor(xyzt[1]); | |
| float dz = xyzt[2] - floor(xyzt[2]); | |
| float dt = xyzt[3] - floor(xyzt[3]); | |
| int x0 = mod(((int)floor(xyzt[0])), px); | |
| int y0 = mod(((int)floor(xyzt[1])), py); | |
| int z0 = mod(((int)floor(xyzt[2])), pz); | |
| int t0 = mod(((int)floor(xyzt[3])), pt); | |
| int x1 = mod((x0 + 1), px); | |
| int y1 = mod((y0 + 1), py); | |
| int z1 = mod((z0 + 1), pz); | |
| int t1 = mod((t0 + 1), pt); | |
| return noise_4d(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt); | |
| } | |
| inline CUDA_CALLABLE void adj_pnoise(uint32 state, const vec4& xyzt, int px, int py, int pz, int pt, uint32& adj_state, vec4& adj_xyzt, int& adj_px, int& adj_py, int& adj_pz, int& adj_pt, const float adj_ret) | |
| { | |
| float dx = xyzt[0] - floor(xyzt[0]); | |
| float dy = xyzt[1] - floor(xyzt[1]); | |
| float dz = xyzt[2] - floor(xyzt[2]); | |
| float dt = xyzt[3] - floor(xyzt[3]); | |
| int x0 = mod(((int)floor(xyzt[0])), px); | |
| int y0 = mod(((int)floor(xyzt[1])), py); | |
| int z0 = mod(((int)floor(xyzt[2])), pz); | |
| int t0 = mod(((int)floor(xyzt[3])), pt); | |
| int x1 = mod((x0 + 1), px); | |
| int y1 = mod((y0 + 1), py); | |
| int z1 = mod((z0 + 1), pz); | |
| int t1 = mod((t0 + 1), pt); | |
| vec4 gradient = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt); | |
| adj_xyzt[0] += gradient[0] * adj_ret; | |
| adj_xyzt[1] += gradient[1] * adj_ret; | |
| adj_xyzt[2] += gradient[2] * adj_ret; | |
| adj_xyzt[3] += gradient[3] * adj_ret; | |
| } | |
| // curl noise | |
| inline CUDA_CALLABLE vec2 curlnoise(uint32 state, const vec2& xy, const uint32 octaves, const float lacunarity, const float gain) | |
| { | |
| vec2 curl_sum = vec2(0.f); | |
| float freq = 1.f; | |
| float amplitude = 1.f; | |
| for (int i = 0; i < octaves; i++) | |
| { | |
| vec2 pt = freq * xy; | |
| float dx = pt[0] - floor(pt[0]); | |
| float dy = pt[1] - floor(pt[1]); | |
| int x0 = (int)floor(pt[0]); | |
| int y0 = (int)floor(pt[1]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| vec2 grad_field = noise_2d_gradient(state, x0, y0, x1, y1, dx, dy); | |
| curl_sum += amplitude * grad_field; | |
| amplitude *= gain; | |
| freq *= lacunarity; | |
| } | |
| return vec2(-curl_sum[1], curl_sum[0]); | |
| } | |
| inline CUDA_CALLABLE void adj_curlnoise(uint32 state, const vec2& xy, const uint32 octaves, const float lacunarity, const float gain, uint32& adj_state, vec2& adj_xy, const uint32& adj_octaves, const float& adj_lacunarity, const float& adj_gain, const vec2& adj_ret) {} | |
| inline CUDA_CALLABLE vec3 curlnoise(uint32 state, const vec3& xyz, const uint32 octaves, const float lacunarity, const float gain) | |
| { | |
| vec3 curl_sum_1 = vec3(0.f); | |
| vec3 curl_sum_2 = vec3(0.f); | |
| vec3 curl_sum_3 = vec3(0.f); | |
| float freq = 1.f; | |
| float amplitude = 1.f; | |
| for(int i = 0; i < octaves; i++) | |
| { | |
| vec3 pt = freq * xyz; | |
| float dx = pt[0] - floor(pt[0]); | |
| float dy = pt[1] - floor(pt[1]); | |
| float dz = pt[2] - floor(pt[2]); | |
| int x0 = (int)floor(pt[0]); | |
| int y0 = (int)floor(pt[1]); | |
| int z0 = (int)floor(pt[2]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| int z1 = z0 + 1; | |
| vec3 grad_field_1 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz); | |
| state = rand_init(state, 10019689); | |
| vec3 grad_field_2 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz); | |
| state = rand_init(state, 13112221); | |
| vec3 grad_field_3 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz); | |
| curl_sum_1 += amplitude * grad_field_1; | |
| curl_sum_2 += amplitude * grad_field_2; | |
| curl_sum_3 += amplitude * grad_field_3; | |
| amplitude *= gain; | |
| freq *= lacunarity; | |
| } | |
| return vec3( | |
| curl_sum_3[1] - curl_sum_2[2], | |
| curl_sum_1[2] - curl_sum_3[0], | |
| curl_sum_2[0] - curl_sum_1[1]); | |
| } | |
| inline CUDA_CALLABLE void adj_curlnoise(uint32 state, const vec3& xyz, const uint32 octaves, const float lacunarity, const float gain, uint32& adj_state, vec3& adj_xyz, const uint32& adj_octaves, const float& adj_lacunarity, const float& adj_gain, vec3& adj_ret) {} | |
| inline CUDA_CALLABLE vec3 curlnoise(uint32 state, const vec4& xyzt, const uint32 octaves, const float lacunarity, const float gain) | |
| { | |
| vec4 curl_sum_1 = vec4(0.f); | |
| vec4 curl_sum_2 = vec4(0.f); | |
| vec4 curl_sum_3 = vec4(0.f); | |
| float freq = 1.f; | |
| float amplitude = 1.f; | |
| for(int i = 0; i < octaves; i++) | |
| { | |
| vec4 pt = freq * xyzt; | |
| float dx = pt[0] - floor(pt[0]); | |
| float dy = pt[1] - floor(pt[1]); | |
| float dz = pt[2] - floor(pt[2]); | |
| float dt = pt[3] - floor(pt[3]); | |
| int x0 = (int)floor(pt[0]); | |
| int y0 = (int)floor(pt[1]); | |
| int z0 = (int)floor(pt[2]); | |
| int t0 = (int)floor(pt[3]); | |
| int x1 = x0 + 1; | |
| int y1 = y0 + 1; | |
| int z1 = z0 + 1; | |
| int t1 = t0 + 1; | |
| vec4 grad_field_1 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt); | |
| state = rand_init(state, 10019689); | |
| vec4 grad_field_2 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt); | |
| state = rand_init(state, 13112221); | |
| vec4 grad_field_3 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt); | |
| curl_sum_1 += amplitude * grad_field_1; | |
| curl_sum_2 += amplitude * grad_field_2; | |
| curl_sum_3 += amplitude * grad_field_3; | |
| amplitude *= gain; | |
| freq *= lacunarity; | |
| } | |
| return vec3( | |
| curl_sum_3[1] - curl_sum_2[2], | |
| curl_sum_1[2] - curl_sum_3[0], | |
| curl_sum_2[0] - curl_sum_1[1]); | |
| } | |
| inline CUDA_CALLABLE void adj_curlnoise(uint32 state, const vec4& xyzt, const uint32 octaves, const float lacunarity, const float gain, uint32& adj_state, vec4& adj_xyzt, const uint32& adj_octaves, const float& adj_lacunarity, const float& adj_gain, const vec3& adj_ret) {} | |
| } // namespace wp | |