warp-lang 1.0.0b2__py3-none-win_amd64.whl → 1.0.0b6__py3-none-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (271) hide show
  1. docs/conf.py +17 -5
  2. examples/env/env_ant.py +1 -1
  3. examples/env/env_cartpole.py +1 -1
  4. examples/env/env_humanoid.py +1 -1
  5. examples/env/env_usd.py +4 -1
  6. examples/env/environment.py +8 -9
  7. examples/example_dem.py +34 -33
  8. examples/example_diffray.py +364 -337
  9. examples/example_fluid.py +32 -23
  10. examples/example_jacobian_ik.py +97 -93
  11. examples/example_marching_cubes.py +6 -16
  12. examples/example_mesh.py +6 -16
  13. examples/example_mesh_intersect.py +16 -14
  14. examples/example_nvdb.py +14 -16
  15. examples/example_raycast.py +14 -13
  16. examples/example_raymarch.py +16 -23
  17. examples/example_render_opengl.py +19 -10
  18. examples/example_sim_cartpole.py +82 -78
  19. examples/example_sim_cloth.py +45 -48
  20. examples/example_sim_fk_grad.py +51 -44
  21. examples/example_sim_fk_grad_torch.py +47 -40
  22. examples/example_sim_grad_bounce.py +108 -133
  23. examples/example_sim_grad_cloth.py +99 -113
  24. examples/example_sim_granular.py +5 -6
  25. examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
  26. examples/example_sim_neo_hookean.py +51 -55
  27. examples/example_sim_particle_chain.py +4 -4
  28. examples/example_sim_quadruped.py +126 -81
  29. examples/example_sim_rigid_chain.py +54 -61
  30. examples/example_sim_rigid_contact.py +66 -70
  31. examples/example_sim_rigid_fem.py +3 -3
  32. examples/example_sim_rigid_force.py +1 -1
  33. examples/example_sim_rigid_gyroscopic.py +3 -4
  34. examples/example_sim_rigid_kinematics.py +28 -39
  35. examples/example_sim_trajopt.py +112 -110
  36. examples/example_sph.py +9 -8
  37. examples/example_wave.py +7 -7
  38. examples/fem/bsr_utils.py +30 -17
  39. examples/fem/example_apic_fluid.py +85 -69
  40. examples/fem/example_convection_diffusion.py +97 -93
  41. examples/fem/example_convection_diffusion_dg.py +142 -149
  42. examples/fem/example_convection_diffusion_dg0.py +141 -136
  43. examples/fem/example_deformed_geometry.py +146 -0
  44. examples/fem/example_diffusion.py +115 -84
  45. examples/fem/example_diffusion_3d.py +116 -86
  46. examples/fem/example_diffusion_mgpu.py +102 -79
  47. examples/fem/example_mixed_elasticity.py +139 -100
  48. examples/fem/example_navier_stokes.py +175 -162
  49. examples/fem/example_stokes.py +143 -111
  50. examples/fem/example_stokes_transfer.py +186 -157
  51. examples/fem/mesh_utils.py +59 -97
  52. examples/fem/plot_utils.py +138 -17
  53. tools/ci/publishing/build_nodes_info.py +54 -0
  54. warp/__init__.py +4 -3
  55. warp/__init__.pyi +1 -0
  56. warp/bin/warp-clang.dll +0 -0
  57. warp/bin/warp.dll +0 -0
  58. warp/build.py +5 -3
  59. warp/build_dll.py +29 -9
  60. warp/builtins.py +836 -492
  61. warp/codegen.py +864 -553
  62. warp/config.py +3 -1
  63. warp/context.py +389 -172
  64. warp/fem/__init__.py +24 -6
  65. warp/fem/cache.py +318 -25
  66. warp/fem/dirichlet.py +7 -3
  67. warp/fem/domain.py +14 -0
  68. warp/fem/field/__init__.py +30 -38
  69. warp/fem/field/field.py +149 -0
  70. warp/fem/field/nodal_field.py +244 -138
  71. warp/fem/field/restriction.py +8 -6
  72. warp/fem/field/test.py +127 -59
  73. warp/fem/field/trial.py +117 -60
  74. warp/fem/geometry/__init__.py +5 -1
  75. warp/fem/geometry/deformed_geometry.py +271 -0
  76. warp/fem/geometry/element.py +24 -1
  77. warp/fem/geometry/geometry.py +86 -14
  78. warp/fem/geometry/grid_2d.py +112 -54
  79. warp/fem/geometry/grid_3d.py +134 -65
  80. warp/fem/geometry/hexmesh.py +953 -0
  81. warp/fem/geometry/partition.py +85 -33
  82. warp/fem/geometry/quadmesh_2d.py +532 -0
  83. warp/fem/geometry/tetmesh.py +451 -115
  84. warp/fem/geometry/trimesh_2d.py +197 -92
  85. warp/fem/integrate.py +534 -268
  86. warp/fem/operator.py +58 -31
  87. warp/fem/polynomial.py +11 -0
  88. warp/fem/quadrature/__init__.py +1 -1
  89. warp/fem/quadrature/pic_quadrature.py +150 -58
  90. warp/fem/quadrature/quadrature.py +209 -57
  91. warp/fem/space/__init__.py +230 -53
  92. warp/fem/space/basis_space.py +489 -0
  93. warp/fem/space/collocated_function_space.py +105 -0
  94. warp/fem/space/dof_mapper.py +49 -2
  95. warp/fem/space/function_space.py +90 -39
  96. warp/fem/space/grid_2d_function_space.py +149 -496
  97. warp/fem/space/grid_3d_function_space.py +173 -538
  98. warp/fem/space/hexmesh_function_space.py +352 -0
  99. warp/fem/space/partition.py +129 -76
  100. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  101. warp/fem/space/restriction.py +46 -34
  102. warp/fem/space/shape/__init__.py +15 -0
  103. warp/fem/space/shape/cube_shape_function.py +738 -0
  104. warp/fem/space/shape/shape_function.py +103 -0
  105. warp/fem/space/shape/square_shape_function.py +611 -0
  106. warp/fem/space/shape/tet_shape_function.py +567 -0
  107. warp/fem/space/shape/triangle_shape_function.py +429 -0
  108. warp/fem/space/tetmesh_function_space.py +132 -1039
  109. warp/fem/space/topology.py +295 -0
  110. warp/fem/space/trimesh_2d_function_space.py +104 -742
  111. warp/fem/types.py +13 -11
  112. warp/fem/utils.py +335 -60
  113. warp/native/array.h +120 -34
  114. warp/native/builtin.h +101 -72
  115. warp/native/bvh.cpp +73 -325
  116. warp/native/bvh.cu +406 -23
  117. warp/native/bvh.h +22 -40
  118. warp/native/clang/clang.cpp +1 -0
  119. warp/native/crt.h +2 -0
  120. warp/native/cuda_util.cpp +8 -3
  121. warp/native/cuda_util.h +1 -0
  122. warp/native/exports.h +1522 -1243
  123. warp/native/intersect.h +19 -4
  124. warp/native/intersect_adj.h +8 -8
  125. warp/native/mat.h +76 -17
  126. warp/native/mesh.cpp +33 -108
  127. warp/native/mesh.cu +114 -18
  128. warp/native/mesh.h +395 -40
  129. warp/native/noise.h +272 -329
  130. warp/native/quat.h +51 -8
  131. warp/native/rand.h +44 -34
  132. warp/native/reduce.cpp +1 -1
  133. warp/native/sparse.cpp +4 -4
  134. warp/native/sparse.cu +163 -155
  135. warp/native/spatial.h +2 -2
  136. warp/native/temp_buffer.h +18 -14
  137. warp/native/vec.h +103 -21
  138. warp/native/warp.cpp +2 -1
  139. warp/native/warp.cu +28 -3
  140. warp/native/warp.h +4 -3
  141. warp/render/render_opengl.py +261 -109
  142. warp/sim/__init__.py +1 -2
  143. warp/sim/articulation.py +385 -185
  144. warp/sim/import_mjcf.py +59 -48
  145. warp/sim/import_urdf.py +15 -15
  146. warp/sim/import_usd.py +174 -102
  147. warp/sim/inertia.py +17 -18
  148. warp/sim/integrator_xpbd.py +4 -3
  149. warp/sim/model.py +330 -250
  150. warp/sim/render.py +1 -1
  151. warp/sparse.py +625 -152
  152. warp/stubs.py +341 -309
  153. warp/tape.py +9 -6
  154. warp/tests/__main__.py +3 -6
  155. warp/tests/assets/curlnoise_golden.npy +0 -0
  156. warp/tests/assets/pnoise_golden.npy +0 -0
  157. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  158. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  159. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  160. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  161. warp/tests/aux_test_unresolved_func.py +14 -0
  162. warp/tests/aux_test_unresolved_symbol.py +14 -0
  163. warp/tests/disabled_kinematics.py +239 -0
  164. warp/tests/run_coverage_serial.py +31 -0
  165. warp/tests/test_adam.py +103 -106
  166. warp/tests/test_arithmetic.py +94 -74
  167. warp/tests/test_array.py +82 -101
  168. warp/tests/test_array_reduce.py +57 -23
  169. warp/tests/test_atomic.py +64 -28
  170. warp/tests/test_bool.py +22 -12
  171. warp/tests/test_builtins_resolution.py +1292 -0
  172. warp/tests/test_bvh.py +18 -18
  173. warp/tests/test_closest_point_edge_edge.py +54 -57
  174. warp/tests/test_codegen.py +165 -134
  175. warp/tests/test_compile_consts.py +28 -20
  176. warp/tests/test_conditional.py +108 -24
  177. warp/tests/test_copy.py +10 -12
  178. warp/tests/test_ctypes.py +112 -88
  179. warp/tests/test_dense.py +21 -14
  180. warp/tests/test_devices.py +98 -0
  181. warp/tests/test_dlpack.py +75 -75
  182. warp/tests/test_examples.py +237 -0
  183. warp/tests/test_fabricarray.py +22 -24
  184. warp/tests/test_fast_math.py +15 -11
  185. warp/tests/test_fem.py +1034 -124
  186. warp/tests/test_fp16.py +23 -16
  187. warp/tests/test_func.py +187 -86
  188. warp/tests/test_generics.py +194 -49
  189. warp/tests/test_grad.py +123 -181
  190. warp/tests/test_grad_customs.py +176 -0
  191. warp/tests/test_hash_grid.py +35 -34
  192. warp/tests/test_import.py +10 -23
  193. warp/tests/test_indexedarray.py +24 -25
  194. warp/tests/test_intersect.py +18 -9
  195. warp/tests/test_large.py +141 -0
  196. warp/tests/test_launch.py +14 -41
  197. warp/tests/test_lerp.py +64 -65
  198. warp/tests/test_lvalue.py +493 -0
  199. warp/tests/test_marching_cubes.py +12 -13
  200. warp/tests/test_mat.py +517 -2898
  201. warp/tests/test_mat_lite.py +115 -0
  202. warp/tests/test_mat_scalar_ops.py +2889 -0
  203. warp/tests/test_math.py +103 -9
  204. warp/tests/test_matmul.py +304 -69
  205. warp/tests/test_matmul_lite.py +410 -0
  206. warp/tests/test_mesh.py +60 -22
  207. warp/tests/test_mesh_query_aabb.py +21 -25
  208. warp/tests/test_mesh_query_point.py +111 -22
  209. warp/tests/test_mesh_query_ray.py +12 -24
  210. warp/tests/test_mlp.py +30 -22
  211. warp/tests/test_model.py +92 -89
  212. warp/tests/test_modules_lite.py +39 -0
  213. warp/tests/test_multigpu.py +88 -114
  214. warp/tests/test_noise.py +12 -11
  215. warp/tests/test_operators.py +16 -20
  216. warp/tests/test_options.py +11 -11
  217. warp/tests/test_pinned.py +17 -18
  218. warp/tests/test_print.py +32 -11
  219. warp/tests/test_quat.py +275 -129
  220. warp/tests/test_rand.py +18 -16
  221. warp/tests/test_reload.py +38 -34
  222. warp/tests/test_rounding.py +50 -43
  223. warp/tests/test_runlength_encode.py +168 -20
  224. warp/tests/test_smoothstep.py +9 -11
  225. warp/tests/test_snippet.py +143 -0
  226. warp/tests/test_sparse.py +261 -63
  227. warp/tests/test_spatial.py +276 -243
  228. warp/tests/test_streams.py +110 -85
  229. warp/tests/test_struct.py +268 -63
  230. warp/tests/test_tape.py +39 -21
  231. warp/tests/test_torch.py +90 -86
  232. warp/tests/test_transient_module.py +10 -12
  233. warp/tests/test_types.py +363 -0
  234. warp/tests/test_utils.py +451 -0
  235. warp/tests/test_vec.py +354 -2050
  236. warp/tests/test_vec_lite.py +73 -0
  237. warp/tests/test_vec_scalar_ops.py +2099 -0
  238. warp/tests/test_volume.py +418 -376
  239. warp/tests/test_volume_write.py +124 -134
  240. warp/tests/unittest_serial.py +35 -0
  241. warp/tests/unittest_suites.py +291 -0
  242. warp/tests/unittest_utils.py +342 -0
  243. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  244. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  245. warp/thirdparty/appdirs.py +36 -45
  246. warp/thirdparty/unittest_parallel.py +589 -0
  247. warp/types.py +622 -211
  248. warp/utils.py +54 -393
  249. warp_lang-1.0.0b6.dist-info/METADATA +238 -0
  250. warp_lang-1.0.0b6.dist-info/RECORD +409 -0
  251. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  252. examples/example_cache_management.py +0 -40
  253. examples/example_multigpu.py +0 -54
  254. examples/example_struct.py +0 -65
  255. examples/fem/example_stokes_transfer_3d.py +0 -210
  256. warp/bin/warp-clang.so +0 -0
  257. warp/bin/warp.so +0 -0
  258. warp/fem/field/discrete_field.py +0 -80
  259. warp/fem/space/nodal_function_space.py +0 -233
  260. warp/tests/test_all.py +0 -223
  261. warp/tests/test_array_scan.py +0 -60
  262. warp/tests/test_base.py +0 -208
  263. warp/tests/test_unresolved_func.py +0 -7
  264. warp/tests/test_unresolved_symbol.py +0 -7
  265. warp_lang-1.0.0b2.dist-info/METADATA +0 -26
  266. warp_lang-1.0.0b2.dist-info/RECORD +0 -380
  267. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  268. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  269. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  270. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  271. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
warp/native/noise.h CHANGED
@@ -8,8 +8,8 @@
8
8
 
9
9
  #pragma once
10
10
 
11
- #ifndef M_PI
12
- #define M_PI 3.14159265358979323846f
11
+ #ifndef M_PI_F
12
+ #define M_PI_F 3.14159265358979323846f
13
13
  #endif
14
14
 
15
15
  namespace wp
@@ -27,7 +27,7 @@ inline CUDA_CALLABLE float smootherstep_gradient(float t)
27
27
 
28
28
  inline CUDA_CALLABLE float smoothstep(float t)
29
29
  {
30
- return t * t * (3.0 - t * 2.0);
30
+ return t * t * (3.f - t * 2.f);
31
31
  }
32
32
 
33
33
  inline CUDA_CALLABLE float smoothstep_gradient(float t)
@@ -49,22 +49,35 @@ inline CUDA_CALLABLE float interpolate_gradient(float a0, float a1, float t, flo
49
49
  // return (d_a1 - d_a0) * t + (a1 - a0) * d_t + d_a0;
50
50
  }
51
51
 
52
+ inline CUDA_CALLABLE vec2 interpolate_gradient_2d(float a0, float a1, float t, vec2& d_a0, vec2& d_a1, vec2& d_t)
53
+ {
54
+ return (d_a1 - d_a0) * smootherstep(t) + (a1 - a0) * smootherstep_gradient(t) * d_t + d_a0;
55
+ }
56
+
57
+ inline CUDA_CALLABLE vec3 interpolate_gradient_3d(float a0, float a1, float t, vec3& d_a0, vec3& d_a1, vec3& d_t)
58
+ {
59
+ return (d_a1 - d_a0) * smootherstep(t) + (a1 - a0) * smootherstep_gradient(t) * d_t + d_a0;
60
+ }
61
+
62
+ inline CUDA_CALLABLE vec4 interpolate_gradient_4d(float a0, float a1, float t, vec4& d_a0, vec4& d_a1, vec4& d_t)
63
+ {
64
+ return (d_a1 - d_a0) * smootherstep(t) + (a1 - a0) * smootherstep_gradient(t) * d_t + d_a0;
65
+ }
66
+
52
67
  inline CUDA_CALLABLE float random_gradient_1d(uint32 state, int ix)
53
68
  {
54
- const uint32_t p1 = 73856093;
69
+ const uint32 p1 = 73856093;
55
70
  uint32 idx = ix*p1 + state;
56
71
  return randf(idx, -1.f, 1.f);
57
72
  }
58
73
 
59
74
  inline CUDA_CALLABLE vec2 random_gradient_2d(uint32 state, int ix, int iy)
60
75
  {
61
- const uint32_t p1 = 73856093;
62
- const uint32_t p2 = 19349663;
76
+ const uint32 p1 = 73856093;
77
+ const uint32 p2 = 19349663;
63
78
  uint32 idx = ix*p1 ^ iy*p2 + state;
64
- float phi = randf(idx, 0.f, 2.f*M_PI);
65
- float x = cos(phi);
66
- float y = sin(phi);
67
- return vec2(x, y);
79
+
80
+ return normalize(sample_unit_square(idx));
68
81
  }
69
82
 
70
83
  inline CUDA_CALLABLE vec3 random_gradient_3d(uint32 state, int ix, int iy, int iz)
@@ -74,11 +87,7 @@ inline CUDA_CALLABLE vec3 random_gradient_3d(uint32 state, int ix, int iy, int i
74
87
  const uint32 p3 = 53471161;
75
88
  uint32 idx = ix*p1 ^ iy*p2 ^ iz*p3 + state;
76
89
 
77
- float x = randn(idx);
78
- float y = randn(idx);
79
- float z = randn(idx);
80
-
81
- return normalize(vec3(x, y, z));
90
+ return normalize(sample_unit_cube(idx));
82
91
  }
83
92
 
84
93
  inline CUDA_CALLABLE vec4 random_gradient_4d(uint32 state, int ix, int iy, int iz, int it)
@@ -89,12 +98,7 @@ inline CUDA_CALLABLE vec4 random_gradient_4d(uint32 state, int ix, int iy, int i
89
98
  const uint32 p4 = 10000019;
90
99
  uint32 idx = ix*p1 ^ iy*p2 ^ iz*p3 ^ it*p4 + state;
91
100
 
92
- float x = randn(idx);
93
- float y = randn(idx);
94
- float z = randn(idx);
95
- float t = randn(idx);
96
-
97
- return normalize(vec4(x, y, z, t));
101
+ return normalize(sample_unit_hypercube(idx));
98
102
  }
99
103
 
100
104
  inline CUDA_CALLABLE float dot_grid_gradient_1d(uint32 state, int ix, float dx)
@@ -103,48 +107,24 @@ inline CUDA_CALLABLE float dot_grid_gradient_1d(uint32 state, int ix, float dx)
103
107
  return dx*gradient;
104
108
  }
105
109
 
106
- inline CUDA_CALLABLE float dot_grid_gradient_1d_gradient(uint32 state, int ix, float d_dx)
107
- {
108
- float gradient = random_gradient_1d(state, ix);
109
- return d_dx*gradient;
110
- }
111
-
112
110
  inline CUDA_CALLABLE float dot_grid_gradient_2d(uint32 state, int ix, int iy, float dx, float dy)
113
111
  {
114
112
  vec2 gradient = random_gradient_2d(state, ix, iy);
115
113
  return (dx*gradient[0] + dy*gradient[1]);
116
114
  }
117
115
 
118
- inline CUDA_CALLABLE float dot_grid_gradient_2d_gradient(uint32 state, int ix, int iy, float d_dx, float d_dy)
119
- {
120
- vec2 gradient = random_gradient_2d(state, ix, iy);
121
- return (d_dx*gradient[0] + d_dy*gradient[1]);
122
- }
123
-
124
116
  inline CUDA_CALLABLE float dot_grid_gradient_3d(uint32 state, int ix, int iy, int iz, float dx, float dy, float dz)
125
117
  {
126
118
  vec3 gradient = random_gradient_3d(state, ix, iy, iz);
127
119
  return (dx*gradient[0] + dy*gradient[1] + dz*gradient[2]);
128
120
  }
129
121
 
130
- inline CUDA_CALLABLE float dot_grid_gradient_3d_gradient(uint32 state, int ix, int iy, int iz, float d_dx, float d_dy, float d_dz)
131
- {
132
- vec3 gradient = random_gradient_3d(state, ix, iy, iz);
133
- return (d_dx*gradient[0] + d_dy*gradient[1] + d_dz*gradient[2]);
134
- }
135
-
136
122
  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)
137
123
  {
138
124
  vec4 gradient = random_gradient_4d(state, ix, iy, iz, it);
139
125
  return (dx*gradient[0] + dy*gradient[1] + dz*gradient[2] + dt*gradient[3]);
140
126
  }
141
127
 
142
- inline CUDA_CALLABLE float dot_grid_gradient_4d_gradient(uint32 state, int ix, int iy, int iz, int it, float d_dx, float d_dy, float d_dz, float d_dt)
143
- {
144
- vec4 gradient = random_gradient_4d(state, ix, iy, iz, it);
145
- return (d_dx*gradient[0] + d_dy*gradient[1] + d_dz*gradient[2] + d_dt*gradient[3]);
146
- }
147
-
148
128
  inline CUDA_CALLABLE float noise_1d(uint32 state, int x0, int x1, float dx)
149
129
  {
150
130
  //vX
@@ -156,13 +136,13 @@ inline CUDA_CALLABLE float noise_1d(uint32 state, int x0, int x1, float dx)
156
136
 
157
137
  inline CUDA_CALLABLE float noise_1d_gradient(uint32 state, int x0, int x1, float dx)
158
138
  {
159
- float v0 = dot_grid_gradient_1d(state, x0, dx);
160
- float d_v0_dx = dot_grid_gradient_1d_gradient(state, x0, 1.f);
139
+ float gradient_x0 = random_gradient_1d(state, x0);
140
+ float v0 = dx * gradient_x0;
161
141
 
162
- float v1 = dot_grid_gradient_1d(state, x1, dx-1.f);
163
- float d_v1_dx = dot_grid_gradient_1d_gradient(state, x1, 1.f);
142
+ float gradient_x1 = random_gradient_1d(state, x1);
143
+ float v1 = (dx-1.f) * gradient_x1;
164
144
 
165
- return interpolate_gradient(v0, v1, dx, d_v0_dx, d_v1_dx, 1.f);
145
+ return interpolate_gradient(v0, v1, dx, gradient_x0, gradient_x1, 1.f);
166
146
  }
167
147
 
168
148
  inline CUDA_CALLABLE float noise_2d(uint32 state, int x0, int y0, int x1, int y1, float dx, float dy)
@@ -181,34 +161,35 @@ inline CUDA_CALLABLE float noise_2d(uint32 state, int x0, int y0, int x1, int y1
181
161
 
182
162
  inline CUDA_CALLABLE vec2 noise_2d_gradient(uint32 state, int x0, int y0, int x1, int y1, float dx, float dy)
183
163
  {
184
- float v00 = dot_grid_gradient_2d(state, x0, y0, dx, dy);
185
- float d_v00_dx = dot_grid_gradient_2d_gradient(state, x0, y0, 1.f, 0.f);
186
- float d_v00_dy = dot_grid_gradient_2d_gradient(state, x0, y0, 0.0, 1.f);
187
-
188
- float v10 = dot_grid_gradient_2d(state, x1, y0, dx-1.f, dy);
189
- float d_v10_dx = dot_grid_gradient_2d_gradient(state, x1, y0, 1.f, 0.f);
190
- float d_v10_dy = dot_grid_gradient_2d_gradient(state, x1, y0, 0.0, 1.f);
164
+ vec2 d00 = vec2(dx, dy);
165
+ vec2 gradient_v00 = random_gradient_2d(state, x0, y0);
166
+ float v00 = dot(d00, gradient_v00);
191
167
 
192
- float v01 = dot_grid_gradient_2d(state, x0, y1, dx, dy-1.f);
193
- float d_v01_dx = dot_grid_gradient_2d_gradient(state, x0, y1, 1.f, 0.f);
194
- float d_v01_dy = dot_grid_gradient_2d_gradient(state, x0, y1, 0.0, 1.f);
168
+ vec2 d10 = vec2(dx-1.f, dy);
169
+ vec2 gradient_v10 = random_gradient_2d(state, x1, y0);
170
+ float v10 = dot(d10, gradient_v10);
195
171
 
196
- float v11 = dot_grid_gradient_2d(state, x1, y1, dx-1.f, dy-1.f);
197
- float d_v11_dx = dot_grid_gradient_2d_gradient(state, x1, y1, 1.f, 0.f);
198
- float d_v11_dy = dot_grid_gradient_2d_gradient(state, x1, y1, 0.0, 1.f);
172
+ vec2 d01 = vec2(dx, dy-1.f);
173
+ vec2 gradient_v01 = random_gradient_2d(state, x0, y1);
174
+ float v01 = dot(d01, gradient_v01);
175
+
176
+ vec2 d11 = vec2(dx-1.f, dy-1.f);
177
+ vec2 gradient_v11 = random_gradient_2d(state, x1, y1);
178
+ float v11 = dot(d11, gradient_v11);
179
+
180
+ vec2 dx_dt = vec2(1.f, 0.f);
199
181
 
200
182
  float xi0 = interpolate(v00, v10, dx);
201
- float d_xi0_dx = interpolate_gradient(v00, v10, dx, d_v00_dx, d_v10_dx, 1.f);
202
- float d_xi0_dy = interpolate_gradient(v00, v10, dx, d_v00_dy, d_v10_dy, 0.0);
183
+ vec2 gradient_xi0 = interpolate_gradient_2d(v00, v10, dx, gradient_v00, gradient_v10, dx_dt);
203
184
 
204
185
  float xi1 = interpolate(v01, v11, dx);
205
- float d_xi1_dx = interpolate_gradient(v01, v11, dx, d_v01_dx, d_v11_dx, 1.f);
206
- float d_xi1_dy = interpolate_gradient(v01, v11, dx, d_v01_dy, d_v11_dy, 0.0);
186
+ vec2 gradient_xi1 = interpolate_gradient_2d(v01, v11, dx, gradient_v01, gradient_v11, dx_dt);
207
187
 
208
- float gradient_x = interpolate_gradient(xi0, xi1, dy, d_xi0_dx, d_xi1_dx, 0.0);
209
- float gradient_y = interpolate_gradient(xi0, xi1, dy, d_xi0_dy, d_xi1_dy, 1.f);
188
+ vec2 dy_dt = vec2(0.f, 1.f);
210
189
 
211
- return vec2(gradient_x, gradient_y);
190
+ vec2 gradient = interpolate_gradient_2d(xi0, xi1, dy, gradient_xi0, gradient_xi1, dy_dt);
191
+
192
+ return gradient;
212
193
  }
213
194
 
214
195
  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)
@@ -239,81 +220,65 @@ inline CUDA_CALLABLE float noise_3d(uint32 state, int x0, int y0, int z0, int x1
239
220
 
240
221
  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)
241
222
  {
242
- float v000 = dot_grid_gradient_3d(state, x0, y0, z0, dx, dy, dz);
243
- float d_v000_dx = dot_grid_gradient_3d_gradient(state, x0, y0, z0, 1.f, 0.f, 0.f);
244
- float d_v000_dy = dot_grid_gradient_3d_gradient(state, x0, y0, z0, 0.f, 1.f, 0.f);
245
- float d_v000_dz = dot_grid_gradient_3d_gradient(state, x0, y0, z0, 0.f, 0.f, 1.f);
223
+ vec3 d000 = vec3(dx, dy, dz);
224
+ vec3 gradient_v000 = random_gradient_3d(state, x0, y0, z0);
225
+ float v000 = dot(d000, gradient_v000);
246
226
 
247
- float v100 = dot_grid_gradient_3d(state, x1, y0, z0, dx-1.f, dy, dz);
248
- float d_v100_dx = dot_grid_gradient_3d_gradient(state, x1, y0, z0, 1.f, 0.f, 0.f);
249
- float d_v100_dy = dot_grid_gradient_3d_gradient(state, x1, y0, z0, 0.f, 1.f, 0.f);
250
- float d_v100_dz = dot_grid_gradient_3d_gradient(state, x1, y0, z0, 0.f, 0.f, 1.f);
227
+ vec3 d100 = vec3(dx-1.f, dy, dz);
228
+ vec3 gradient_v100 = random_gradient_3d(state, x1, y0, z0);
229
+ float v100 = dot(d100, gradient_v100);
251
230
 
252
- float v010 = dot_grid_gradient_3d(state, x0, y1, z0, dx, dy-1.f, dz);
253
- float d_v010_dx = dot_grid_gradient_3d_gradient(state, x0, y1, z0, 1.f, 0.f, 0.f);
254
- float d_v010_dy = dot_grid_gradient_3d_gradient(state, x0, y1, z0, 0.f, 1.f, 0.f);
255
- float d_v010_dz = dot_grid_gradient_3d_gradient(state, x0, y1, z0, 0.f, 0.f, 1.f);
256
-
257
- float v110 = dot_grid_gradient_3d(state, x1, y1, z0, dx-1.f, dy-1.f, dz);
258
- float d_v110_dx = dot_grid_gradient_3d_gradient(state, x1, y1, z0, 1.f, 0.f, 0.f);
259
- float d_v110_dy = dot_grid_gradient_3d_gradient(state, x1, y1, z0, 0.f, 1.f, 0.f);
260
- float d_v110_dz = dot_grid_gradient_3d_gradient(state, x1, y1, z0, 0.f, 0.f, 1.f);
231
+ vec3 d010 = vec3(dx, dy-1.f, dz);
232
+ vec3 gradient_v010 = random_gradient_3d(state, x0, y1, z0);
233
+ float v010 = dot(d010, gradient_v010);
234
+
235
+ vec3 d110 = vec3(dx-1.f, dy-1.f, dz);
236
+ vec3 gradient_v110 = random_gradient_3d(state, x1, y1, z0);
237
+ float v110 = dot(d110, gradient_v110);
261
238
 
262
- float v001 = dot_grid_gradient_3d(state, x0, y0, z1, dx, dy, dz-1.f);
263
- float d_v001_dx = dot_grid_gradient_3d_gradient(state, x0, y0, z1, 1.f, 0.f, 0.f);
264
- float d_v001_dy = dot_grid_gradient_3d_gradient(state, x0, y0, z1, 0.f, 1.f, 0.f);
265
- float d_v001_dz = dot_grid_gradient_3d_gradient(state, x0, y0, z1, 0.f, 0.f, 1.f);
239
+ vec3 d001 = vec3(dx, dy, dz-1.f);
240
+ vec3 gradient_v001 = random_gradient_3d(state, x0, y0, z1);
241
+ float v001 = dot(d001, gradient_v001);
266
242
 
267
- float v101 = dot_grid_gradient_3d(state, x1, y0, z1, dx-1.f, dy, dz-1.f);
268
- float d_v101_dx = dot_grid_gradient_3d_gradient(state, x1, y0, z1, 1.f, 0.f, 0.f);
269
- float d_v101_dy = dot_grid_gradient_3d_gradient(state, x1, y0, z1, 0.f, 1.f, 0.f);
270
- float d_v101_dz = dot_grid_gradient_3d_gradient(state, x1, y0, z1, 0.f, 0.f, 1.f);
243
+ vec3 d101 = vec3(dx-1.f, dy, dz-1.f);
244
+ vec3 gradient_v101 = random_gradient_3d(state, x1, y0, z1);
245
+ float v101 = dot(d101, gradient_v101);
271
246
 
272
- float v011 = dot_grid_gradient_3d(state, x0, y1, z1, dx, dy-1.f, dz-1.f);
273
- float d_v011_dx = dot_grid_gradient_3d_gradient(state, x0, y1, z1, 1.f, 0.f, 0.f);
274
- float d_v011_dy = dot_grid_gradient_3d_gradient(state, x0, y1, z1, 0.f, 1.f, 0.f);
275
- float d_v011_dz = dot_grid_gradient_3d_gradient(state, x0, y1, z1, 0.f, 0.f, 1.f);
247
+ vec3 d011 = vec3(dx, dy-1.f, dz-1.f);
248
+ vec3 gradient_v011 = random_gradient_3d(state, x0, y1, z1);
249
+ float v011 = dot(d011, gradient_v011);
276
250
 
277
- float v111 = dot_grid_gradient_3d(state, x1, y1, z1, dx-1.f, dy-1.f, dz-1.f);
278
- float d_v111_dx = dot_grid_gradient_3d_gradient(state, x1, y1, z1, 1.f, 0.f, 0.f);
279
- float d_v111_dy = dot_grid_gradient_3d_gradient(state, x1, y1, z1, 0.f, 1.f, 0.f);
280
- float d_v111_dz = dot_grid_gradient_3d_gradient(state, x1, y1, z1, 0.f, 0.f, 1.f);
251
+ vec3 d111 = vec3(dx-1.f, dy-1.f, dz-1.f);
252
+ vec3 gradient_v111 = random_gradient_3d(state, x1, y1, z1);
253
+ float v111 = dot(d111, gradient_v111);
254
+
255
+ vec3 dx_dt = vec3(1.f, 0.f, 0.f);
281
256
 
282
257
  float xi00 = interpolate(v000, v100, dx);
283
- float d_xi00_dx = interpolate_gradient(v000, v100, dx, d_v000_dx, d_v100_dx, 1.f);
284
- float d_xi00_dy = interpolate_gradient(v000, v100, dx, d_v000_dy, d_v100_dy, 0.f);
285
- float d_xi00_dz = interpolate_gradient(v000, v100, dx, d_v000_dz, d_v100_dz, 0.f);
258
+ vec3 gradient_xi00 = interpolate_gradient_3d(v000, v100, dx, gradient_v000, gradient_v100, dx_dt);
286
259
 
287
260
  float xi10 = interpolate(v010, v110, dx);
288
- float d_xi10_dx = interpolate_gradient(v010, v110, dx, d_v010_dx, d_v110_dx, 1.f);
289
- float d_xi10_dy = interpolate_gradient(v010, v110, dx, d_v010_dy, d_v110_dy, 0.f);
290
- float d_xi10_dz = interpolate_gradient(v010, v110, dx, d_v010_dz, d_v110_dz, 0.f);
261
+ vec3 gradient_xi10 = interpolate_gradient_3d(v010, v110, dx, gradient_v010, gradient_v110, dx_dt);
291
262
 
292
263
  float xi01 = interpolate(v001, v101, dx);
293
- float d_xi01_dx = interpolate_gradient(v001, v101, dx, d_v001_dx, d_v101_dx, 1.f);
294
- float d_xi01_dy = interpolate_gradient(v001, v101, dx, d_v001_dy, d_v101_dy, 0.f);
295
- float d_xi01_dz = interpolate_gradient(v001, v101, dx, d_v001_dz, d_v101_dz, 0.f);
296
-
264
+ vec3 gradient_xi01 = interpolate_gradient_3d(v001, v101, dx, gradient_v001, gradient_v101, dx_dt);
265
+
297
266
  float xi11 = interpolate(v011, v111, dx);
298
- float d_xi11_dx = interpolate_gradient(v011, v111, dx, d_v011_dx, d_v111_dx, 1.f);
299
- float d_xi11_dy = interpolate_gradient(v011, v111, dx, d_v011_dy, d_v111_dy, 0.f);
300
- float d_xi11_dz = interpolate_gradient(v011, v111, dx, d_v011_dz, d_v111_dz, 0.f);
267
+ vec3 gradient_xi11 = interpolate_gradient_3d(v011, v111, dx, gradient_v011, gradient_v111, dx_dt);
268
+
269
+ vec3 dy_dt = vec3(0.f, 1.f, 0.f);
301
270
 
302
271
  float yi0 = interpolate(xi00, xi10, dy);
303
- float d_yi0_dx = interpolate_gradient(xi00, xi10, dy, d_xi00_dx, d_xi10_dx, 0.f);
304
- float d_yi0_dy = interpolate_gradient(xi00, xi10, dy, d_xi00_dy, d_xi10_dy, 1.f);
305
- float d_yi0_dz = interpolate_gradient(xi00, xi10, dy, d_xi00_dz, d_xi10_dz, 0.f);
272
+ vec3 gradient_yi0 = interpolate_gradient_3d(xi00, xi10, dy, gradient_xi00, gradient_xi10, dy_dt);
306
273
 
307
274
  float yi1 = interpolate(xi01, xi11, dy);
308
- float d_yi1_dx = interpolate_gradient(xi01, xi11, dy, d_xi01_dx, d_xi11_dx, 0.f);
309
- float d_yi1_dy = interpolate_gradient(xi01, xi11, dy, d_xi01_dy, d_xi11_dy, 1.f);
310
- float d_yi1_dz = interpolate_gradient(xi01, xi11, dy, d_xi01_dz, d_xi11_dz, 0.f);
275
+ vec3 gradient_yi1 = interpolate_gradient_3d(xi01, xi11, dy, gradient_xi01, gradient_xi11, dy_dt);
276
+
277
+ vec3 dz_dt = vec3(0.f, 0.f, 1.f);
311
278
 
312
- float gradient_x = interpolate_gradient(yi0, yi1, dz, d_yi0_dy, d_yi1_dy, 0.f);
313
- float gradient_y = interpolate_gradient(yi0, yi1, dz, d_yi0_dx, d_yi1_dx, 0.f);
314
- float gradient_z = interpolate_gradient(yi0, yi1, dz, d_yi0_dz, d_yi1_dz, 1.f);
279
+ vec3 gradient = interpolate_gradient_3d(yi0, yi1, dz, gradient_yi0, gradient_yi1, dz_dt);
315
280
 
316
- return vec3(gradient_x, gradient_y, gradient_z);
281
+ return gradient;
317
282
  }
318
283
 
319
284
  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)
@@ -368,192 +333,123 @@ inline CUDA_CALLABLE float noise_4d(uint32 state, int x0, int y0, int z0, int t0
368
333
 
369
334
  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)
370
335
  {
371
- float v0000 = dot_grid_gradient_4d(state, x0, y0, z0, t0, dx, dy, dz, dt);
372
- float d_v0000_dx = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t0, 1.f, 0.f, 0.f, 0.f);
373
- float d_v0000_dy = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t0, 0.f, 1.f, 0.f, 0.f);
374
- float d_v0000_dz = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t0, 0.f, 0.f, 1.f, 0.f);
375
- float d_v0000_dt = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t0, 0.f, 0.f, 0.f, 1.f);
336
+ vec4 d0000 = vec4(dx, dy, dz, dt);
337
+ vec4 gradient_v0000 = random_gradient_4d(state, x0, y0, z0, t0);
338
+ float v0000 = dot(d0000, gradient_v0000);
376
339
 
377
- float v1000 = dot_grid_gradient_4d(state, x1, y0, z0, t0, dx-1.f, dy, dz, dt);
378
- float d_v1000_dx = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t0, 1.f, 0.f, 0.f, 0.f);
379
- float d_v1000_dy = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t0, 0.f, 1.f, 0.f, 0.f);
380
- float d_v1000_dz = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t0, 0.f, 0.f, 1.f, 0.f);
381
- float d_v1000_dt = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t0, 0.f, 0.f, 0.f, 1.f);
340
+ vec4 d1000 = vec4(dx-1.f, dy, dz, dt);
341
+ vec4 gradient_v1000 = random_gradient_4d(state, x1, y0, z0, t0);
342
+ float v1000 = dot(d1000, gradient_v1000);
382
343
 
383
- float v0100 = dot_grid_gradient_4d(state, x0, y1, z0, t0, dx, dy-1.f, dz, dt);
384
- float d_v0100_dx = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t0, 1.f, 0.f, 0.f, 0.f);
385
- float d_v0100_dy = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t0, 0.f, 1.f, 0.f, 0.f);
386
- float d_v0100_dz = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t0, 0.f, 0.f, 1.f, 0.f);
387
- float d_v0100_dt = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t0, 0.f, 0.f, 0.f, 1.f);
344
+ vec4 d0100 = vec4(dx, dy-1.f, dz, dt);
345
+ vec4 gradient_v0100 = random_gradient_4d(state, x0, y1, z0, t0);
346
+ float v0100 = dot(d0100, gradient_v0100);
388
347
 
389
- float v1100 = dot_grid_gradient_4d(state, x1, y1, z0, t0, dx-1.f, dy-1.f, dz, dt);
390
- float d_v1100_dx = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t0, 1.f, 0.f, 0.f, 0.f);
391
- float d_v1100_dy = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t0, 0.f, 1.f, 0.f, 0.f);
392
- float d_v1100_dz = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t0, 0.f, 0.f, 1.f, 0.f);
393
- float d_v1100_dt = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t0, 0.f, 0.f, 0.f, 1.f);
348
+ vec4 d1100 = vec4(dx-1.f, dy-1.f, dz, dt);
349
+ vec4 gradient_v1100 = random_gradient_4d(state, x1, y1, z0, t0);
350
+ float v1100 = dot(d1100, gradient_v1100);
394
351
 
395
- float v0010 = dot_grid_gradient_4d(state, x0, y0, z1, t0, dx, dy, dz-1.f, dt);
396
- float d_v0010_dx = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t0, 1.f, 0.f, 0.f, 0.f);
397
- float d_v0010_dy = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t0, 0.f, 1.f, 0.f, 0.f);
398
- float d_v0010_dz = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t0, 0.f, 0.f, 1.f, 0.f);
399
- float d_v0010_dt = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t0, 0.f, 0.f, 0.f, 1.f);
352
+ vec4 d0010 = vec4(dx, dy, dz-1.f, dt);
353
+ vec4 gradient_v0010 = random_gradient_4d(state, x0, y0, z1, t0);
354
+ float v0010 = dot(d0010, gradient_v0010);
400
355
 
401
- float v1010 = dot_grid_gradient_4d(state, x1, y0, z1, t0, dx-1.f, dy, dz-1.f, dt);
402
- float d_v1010_dx = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t0, 1.f, 0.f, 0.f, 0.f);
403
- float d_v1010_dy = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t0, 0.f, 1.f, 0.f, 0.f);
404
- float d_v1010_dz = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t0, 0.f, 0.f, 1.f, 0.f);
405
- float d_v1010_dt = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t0, 0.f, 0.f, 0.f, 1.f);
406
-
407
- float v0110 = dot_grid_gradient_4d(state, x0, y1, z1, t0, dx, dy-1.f, dz-1.f, dt);
408
- float d_v0110_dx = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t0, 1.f, 0.f, 0.f, 0.f);
409
- float d_v0110_dy = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t0, 0.f, 1.f, 0.f, 0.f);
410
- float d_v0110_dz = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t0, 0.f, 0.f, 1.f, 0.f);
411
- float d_v0110_dt = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t0, 0.f, 0.f, 0.f, 1.f);
356
+ vec4 d1010 = vec4(dx-1.f, dy, dz-1.f, dt);
357
+ vec4 gradient_v1010 = random_gradient_4d(state, x1, y0, z1, t0);
358
+ float v1010 = dot(d1010, gradient_v1010);
412
359
 
413
- float v1110 = dot_grid_gradient_4d(state, x1, y1, z1, t0, dx-1.f, dy-1.f, dz-1.f, dt);
414
- float d_v1110_dx = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t0, 1.f, 0.f, 0.f, 0.f);
415
- float d_v1110_dy = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t0, 0.f, 1.f, 0.f, 0.f);
416
- float d_v1110_dz = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t0, 0.f, 0.f, 1.f, 0.f);
417
- float d_v1110_dt = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t0, 0.f, 0.f, 0.f, 1.f);
360
+ vec4 d0110 = vec4(dx, dy-1.f, dz-1.f, dt);
361
+ vec4 gradient_v0110 = random_gradient_4d(state, x0, y1, z1, t0);
362
+ float v0110 = dot(d0110, gradient_v0110);
418
363
 
419
- float v0001 = dot_grid_gradient_4d(state, x0, y0, z0, t1, dx, dy, dz, dt-1.f);
420
- float d_v0001_dx = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t1, 1.f, 0.f, 0.f, 0.f);
421
- float d_v0001_dy = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t1, 0.f, 1.f, 0.f, 0.f);
422
- float d_v0001_dz = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t1, 0.f, 0.f, 1.f, 0.f);
423
- float d_v0001_dt = dot_grid_gradient_4d_gradient(state, x0, y0, z0, t1, 0.f, 0.f, 0.f, 1.f);
364
+ vec4 d1110 = vec4(dx-1.f, dy-1.f, dz-1.f, dt);
365
+ vec4 gradient_v1110 = random_gradient_4d(state, x1, y1, z1, t0);
366
+ float v1110 = dot(d1110, gradient_v1110);
424
367
 
425
- float v1001 = dot_grid_gradient_4d(state, x1, y0, z0, t1, dx-1.f, dy, dz, dt-1.f);
426
- float d_v1001_dx = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t1, 1.f, 0.f, 0.f, 0.f);
427
- float d_v1001_dy = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t1, 0.f, 1.f, 0.f, 0.f);
428
- float d_v1001_dz = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t1, 0.f, 0.f, 1.f, 0.f);
429
- float d_v1001_dt = dot_grid_gradient_4d_gradient(state, x1, y0, z0, t1, 0.f, 0.f, 0.f, 1.f);
430
-
431
- float v0101 = dot_grid_gradient_4d(state, x0, y1, z0, t1, dx, dy-1.f, dz, dt-1.f);
432
- float d_v0101_dx = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t1, 1.f, 0.f, 0.f, 0.f);
433
- float d_v0101_dy = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t1, 0.f, 1.f, 0.f, 0.f);
434
- float d_v0101_dz = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t1, 0.f, 0.f, 1.f, 0.f);
435
- float d_v0101_dt = dot_grid_gradient_4d_gradient(state, x0, y1, z0, t1, 0.f, 0.f, 0.f, 1.f);
368
+ vec4 d0001 = vec4(dx, dy, dz, dt-1.f);
369
+ vec4 gradient_v0001 = random_gradient_4d(state, x0, y0, z0, t1);
370
+ float v0001 = dot(d0001, gradient_v0001);
436
371
 
437
- float v1101 = dot_grid_gradient_4d(state, x1, y1, z0, t1, dx-1.f, dy-1.f, dz, dt-1.f);
438
- float d_v1101_dx = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t1, 1.f, 0.f, 0.f, 0.f);
439
- float d_v1101_dy = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t1, 0.f, 1.f, 0.f, 0.f);
440
- float d_v1101_dz = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t1, 0.f, 0.f, 1.f, 0.f);
441
- float d_v1101_dt = dot_grid_gradient_4d_gradient(state, x1, y1, z0, t1, 0.f, 0.f, 0.f, 1.f);
442
-
443
- float v0011 = dot_grid_gradient_4d(state, x0, y0, z1, t1, dx, dy, dz-1.f, dt-1.f);
444
- float d_v0011_dx = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t1, 1.f, 0.f, 0.f, 0.f);
445
- float d_v0011_dy = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t1, 0.f, 1.f, 0.f, 0.f);
446
- float d_v0011_dz = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t1, 0.f, 0.f, 1.f, 0.f);
447
- float d_v0011_dt = dot_grid_gradient_4d_gradient(state, x0, y0, z1, t1, 0.f, 0.f, 0.f, 1.f);
372
+ vec4 d1001 = vec4(dx-1.f, dy, dz, dt-1.f);
373
+ vec4 gradient_v1001 = random_gradient_4d(state, x1, y0, z0, t1);
374
+ float v1001 = dot(d1001, gradient_v1001);
448
375
 
449
- float v1011 = dot_grid_gradient_4d(state, x1, y0, z1, t1, dx-1.f, dy, dz-1.f, dt-1.f);
450
- float d_v1011_dx = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t1, 1.f, 0.f, 0.f, 0.f);
451
- float d_v1011_dy = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t1, 0.f, 1.f, 0.f, 0.f);
452
- float d_v1011_dz = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t1, 0.f, 0.f, 1.f, 0.f);
453
- float d_v1011_dt = dot_grid_gradient_4d_gradient(state, x1, y0, z1, t1, 0.f, 0.f, 0.f, 1.f);
376
+ vec4 d0101 = vec4(dx, dy-1.f, dz, dt-1.f);
377
+ vec4 gradient_v0101 = random_gradient_4d(state, x0, y1, z0, t1);
378
+ float v0101 = dot(d0101, gradient_v0101);
454
379
 
455
- float v0111 = dot_grid_gradient_4d(state, x0, y1, z1, t1, dx, dy-1.f, dz-1.f, dt-1.f);
456
- float d_v0111_dx = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t1, 1.f, 0.f, 0.f, 0.f);
457
- float d_v0111_dy = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t1, 0.f, 1.f, 0.f, 0.f);
458
- float d_v0111_dz = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t1, 0.f, 0.f, 1.f, 0.f);
459
- float d_v0111_dt = dot_grid_gradient_4d_gradient(state, x0, y1, z1, t1, 0.f, 0.f, 0.f, 1.f);
380
+ vec4 d1101 = vec4(dx-1.f, dy-1.f, dz, dt-1.f);
381
+ vec4 gradient_v1101 = random_gradient_4d(state, x1, y1, z0, t1);
382
+ float v1101 = dot(d1101, gradient_v1101);
460
383
 
461
- float v1111 = dot_grid_gradient_4d(state, x1, y1, z1, t1, dx-1.f, dy-1.f, dz-1.f, dt-1.f);
462
- float d_v1111_dx = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t1, 1.f, 0.f, 0.f, 0.f);
463
- float d_v1111_dy = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t1, 0.f, 1.f, 0.f, 0.f);
464
- float d_v1111_dz = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t1, 0.f, 0.f, 1.f, 0.f);
465
- float d_v1111_dt = dot_grid_gradient_4d_gradient(state, x1, y1, z1, t1, 0.f, 0.f, 0.f, 1.f);
384
+ vec4 d0011 = vec4(dx, dy, dz-1.f, dt-1.f);
385
+ vec4 gradient_v0011 = random_gradient_4d(state, x0, y0, z1, t1);
386
+ float v0011 = dot(d0011, gradient_v0011);
387
+
388
+ vec4 d1011 = vec4(dx-1.f, dy, dz-1.f, dt-1.f);
389
+ vec4 gradient_v1011 = random_gradient_4d(state, x1, y0, z1, t1);
390
+ float v1011 = dot(d1011, gradient_v1011);
391
+
392
+ vec4 d0111 = vec4(dx, dy-1.f, dz-1.f, dt-1.f);
393
+ vec4 gradient_v0111 = random_gradient_4d(state, x0, y1, z1, t1);
394
+ float v0111 = dot(d0111, gradient_v0111);
395
+
396
+ vec4 d1111 = vec4(dx-1.f, dy-1.f, dz-1.f, dt-1.f);
397
+ vec4 gradient_v1111 = random_gradient_4d(state, x1, y1, z1, t1);
398
+ float v1111 = dot(d1111, gradient_v1111);
399
+
400
+ vec4 dx_dt = vec4(1.f, 0.f, 0.f, 0.f);
466
401
 
467
402
  float xi000 = interpolate(v0000, v1000, dx);
468
- float d_xi000_dx = interpolate_gradient(v0000, v1000, dx, d_v0000_dx, d_v1000_dx, 1.f);
469
- float d_xi000_dy = interpolate_gradient(v0000, v1000, dx, d_v0000_dy, d_v1000_dy, 0.f);
470
- float d_xi000_dz = interpolate_gradient(v0000, v1000, dx, d_v0000_dz, d_v1000_dz, 0.f);
471
- float d_xi000_dt = interpolate_gradient(v0000, v1000, dx, d_v0000_dt, d_v1000_dt, 0.f);
403
+ vec4 gradient_xi000 = interpolate_gradient_4d(v0000, v1000, dx, gradient_v0000, gradient_v1000, dx_dt);
472
404
 
473
405
  float xi100 = interpolate(v0100, v1100, dx);
474
- float d_xi100_dx = interpolate_gradient(v0100, v1100, dx, d_v0100_dx, d_v1100_dx, 1.f);
475
- float d_xi100_dy = interpolate_gradient(v0100, v1100, dx, d_v0100_dy, d_v1100_dy, 0.f);
476
- float d_xi100_dz = interpolate_gradient(v0100, v1100, dx, d_v0100_dz, d_v1100_dz, 0.f);
477
- float d_xi100_dt = interpolate_gradient(v0100, v1100, dx, d_v0100_dt, d_v1100_dt, 0.f);
406
+ vec4 gradient_xi100 = interpolate_gradient_4d(v0100, v1100, dx, gradient_v0100, gradient_v1100, dx_dt);
478
407
 
479
408
  float xi010 = interpolate(v0010, v1010, dx);
480
- float d_xi010_dx = interpolate_gradient(v0010, v1010, dx, d_v0010_dx, d_v1010_dx, 1.f);
481
- float d_xi010_dy = interpolate_gradient(v0010, v1010, dx, d_v0010_dy, d_v1010_dy, 0.f);
482
- float d_xi010_dz = interpolate_gradient(v0010, v1010, dx, d_v0010_dz, d_v1010_dz, 0.f);
483
- float d_xi010_dt = interpolate_gradient(v0010, v1010, dx, d_v0010_dt, d_v1010_dt, 0.f);
409
+ vec4 gradient_xi010 = interpolate_gradient_4d(v0010, v1010, dx, gradient_v0010, gradient_v1010, dx_dt);
484
410
 
485
411
  float xi110 = interpolate(v0110, v1110, dx);
486
- float d_xi110_dx = interpolate_gradient(v0110, v1110, dx, d_v0110_dx, d_v1110_dx, 1.f);
487
- float d_xi110_dy = interpolate_gradient(v0110, v1110, dx, d_v0110_dy, d_v1110_dy, 0.f);
488
- float d_xi110_dz = interpolate_gradient(v0110, v1110, dx, d_v0110_dz, d_v1110_dz, 0.f);
489
- float d_xi110_dt = interpolate_gradient(v0110, v1110, dx, d_v0110_dt, d_v1110_dt, 0.f);
412
+ vec4 gradient_xi110 = interpolate_gradient_4d(v0110, v1110, dx, gradient_v0110, gradient_v1110, dx_dt);
490
413
 
491
414
  float xi001 = interpolate(v0001, v1001, dx);
492
- float d_xi001_dx = interpolate_gradient(v0001, v1001, dx, d_v0001_dx, d_v1001_dx, 1.f);
493
- float d_xi001_dy = interpolate_gradient(v0001, v1001, dx, d_v0001_dy, d_v1001_dy, 0.f);
494
- float d_xi001_dz = interpolate_gradient(v0001, v1001, dx, d_v0001_dz, d_v1001_dz, 0.f);
495
- float d_xi001_dt = interpolate_gradient(v0001, v1001, dx, d_v0001_dt, d_v1001_dt, 0.f);
415
+ vec4 gradient_xi001 = interpolate_gradient_4d(v0001, v1001, dx, gradient_v0001, gradient_v1001, dx_dt);
496
416
 
497
417
  float xi101 = interpolate(v0101, v1101, dx);
498
- float d_xi101_dx = interpolate_gradient(v0101, v1101, dx, d_v0101_dx, d_v1101_dx, 1.f);
499
- float d_xi101_dy = interpolate_gradient(v0101, v1101, dx, d_v0101_dy, d_v1101_dy, 0.f);
500
- float d_xi101_dz = interpolate_gradient(v0101, v1101, dx, d_v0101_dz, d_v1101_dz, 0.f);
501
- float d_xi101_dt = interpolate_gradient(v0101, v1101, dx, d_v0101_dt, d_v1101_dt, 0.f);
418
+ vec4 gradient_xi101 = interpolate_gradient_4d(v0101, v1101, dx, gradient_v0101, gradient_v1101, dx_dt);
502
419
 
503
420
  float xi011 = interpolate(v0011, v1011, dx);
504
- float d_xi011_dx = interpolate_gradient(v0011, v1011, dx, d_v0011_dx, d_v1011_dx, 1.f);
505
- float d_xi011_dy = interpolate_gradient(v0011, v1011, dx, d_v0011_dy, d_v1011_dy, 0.f);
506
- float d_xi011_dz = interpolate_gradient(v0011, v1011, dx, d_v0011_dz, d_v1011_dz, 0.f);
507
- float d_xi011_dt = interpolate_gradient(v0011, v1011, dx, d_v0011_dt, d_v1011_dt, 0.f);
508
-
421
+ vec4 gradient_xi011 = interpolate_gradient_4d(v0011, v1011, dx, gradient_v0011, gradient_v1011, dx_dt);
422
+
509
423
  float xi111 = interpolate(v0111, v1111, dx);
510
- float d_xi111_dx = interpolate_gradient(v0111, v1111, dx, d_v0111_dx, d_v1111_dx, 1.f);
511
- float d_xi111_dy = interpolate_gradient(v0111, v1111, dx, d_v0111_dy, d_v1111_dy, 0.f);
512
- float d_xi111_dz = interpolate_gradient(v0111, v1111, dx, d_v0111_dz, d_v1111_dz, 0.f);
513
- float d_xi111_dt = interpolate_gradient(v0111, v1111, dx, d_v0111_dt, d_v1111_dt, 0.f);
424
+ vec4 gradient_xi111 = interpolate_gradient_4d(v0111, v1111, dx, gradient_v0111, gradient_v1111, dx_dt);
425
+
426
+ vec4 dy_dt = vec4(0.f, 1.f, 0.f, 0.f);
514
427
 
515
428
  float yi00 = interpolate(xi000, xi100, dy);
516
- float d_yi00_dx = interpolate_gradient(xi000, xi100, dy, d_xi000_dx, d_xi100_dx, 0.f);
517
- float d_yi00_dy = interpolate_gradient(xi000, xi100, dy, d_xi000_dy, d_xi100_dy, 1.f);
518
- float d_yi00_dz = interpolate_gradient(xi000, xi100, dy, d_xi000_dz, d_xi100_dz, 0.f);
519
- float d_yi00_dt = interpolate_gradient(xi000, xi100, dy, d_xi000_dt, d_xi100_dt, 0.f);
429
+ vec4 gradient_yi00 = interpolate_gradient_4d(xi000, xi100, dy, gradient_xi000, gradient_xi100, dy_dt);
520
430
 
521
431
  float yi10 = interpolate(xi010, xi110, dy);
522
- float d_yi10_dx = interpolate_gradient(xi010, xi110, dy, d_xi010_dx, d_xi110_dx, 0.f);
523
- float d_yi10_dy = interpolate_gradient(xi010, xi110, dy, d_xi010_dy, d_xi110_dy, 1.f);
524
- float d_yi10_dz = interpolate_gradient(xi010, xi110, dy, d_xi010_dz, d_xi110_dz, 0.f);
525
- float d_yi10_dt = interpolate_gradient(xi010, xi110, dy, d_xi010_dt, d_xi110_dt, 0.f);
432
+ vec4 gradient_yi10 = interpolate_gradient_4d(xi010, xi110, dy, gradient_xi010, gradient_xi110, dy_dt);
526
433
 
527
434
  float yi01 = interpolate(xi001, xi101, dy);
528
- float d_yi01_dx = interpolate_gradient(xi001, xi101, dy, d_xi001_dx, d_xi101_dx, 0.f);
529
- float d_yi01_dy = interpolate_gradient(xi001, xi101, dy, d_xi001_dy, d_xi101_dy, 1.f);
530
- float d_yi01_dz = interpolate_gradient(xi001, xi101, dy, d_xi001_dz, d_xi101_dz, 0.f);
531
- float d_yi01_dt = interpolate_gradient(xi001, xi101, dy, d_xi001_dt, d_xi101_dt, 0.f);
435
+ vec4 gradient_yi01 = interpolate_gradient_4d(xi001, xi101, dy, gradient_xi001, gradient_xi101, dy_dt);
532
436
 
533
437
  float yi11 = interpolate(xi011, xi111, dy);
534
- float d_yi11_dx = interpolate_gradient(xi011, xi111, dy, d_xi011_dx, d_xi111_dx, 0.f);
535
- float d_yi11_dy = interpolate_gradient(xi011, xi111, dy, d_xi011_dy, d_xi111_dy, 1.f);
536
- float d_yi11_dz = interpolate_gradient(xi011, xi111, dy, d_xi011_dz, d_xi111_dz, 0.f);
537
- float d_yi11_dt = interpolate_gradient(xi011, xi111, dy, d_xi011_dt, d_xi111_dt, 0.f);
438
+ vec4 gradient_yi11 = interpolate_gradient_4d(xi011, xi111, dy, gradient_xi011, gradient_xi111, dy_dt);
439
+
440
+ vec4 dz_dt = vec4(0.f, 0.f, 1.f, 0.f);
538
441
 
539
442
  float zi0 = interpolate(yi00, yi10, dz);
540
- float d_zi0_dx = interpolate_gradient(yi00, yi10, dz, d_yi00_dx, d_yi10_dx, 0.f);
541
- float d_zi0_dy = interpolate_gradient(yi00, yi10, dz, d_yi00_dy, d_yi10_dy, 0.f);
542
- float d_zi0_dz = interpolate_gradient(yi00, yi10, dz, d_yi00_dz, d_yi10_dz, 1.f);
543
- float d_zi0_dt = interpolate_gradient(yi00, yi10, dz, d_yi00_dt, d_yi10_dt, 0.f);
443
+ vec4 gradient_zi0 = interpolate_gradient_4d(yi00, yi10, dz, gradient_yi00, gradient_yi10, dz_dt);
544
444
 
545
445
  float zi1 = interpolate(yi01, yi11, dz);
546
- float d_zi1_dx = interpolate_gradient(yi01, yi11, dz, d_yi01_dx, d_yi11_dx, 0.f);
547
- float d_zi1_dy = interpolate_gradient(yi01, yi11, dz, d_yi01_dy, d_yi11_dy, 0.f);
548
- float d_zi1_dz = interpolate_gradient(yi01, yi11, dz, d_yi01_dz, d_yi11_dz, 1.f);
549
- float d_zi1_dt = interpolate_gradient(yi01, yi11, dz, d_yi01_dt, d_yi11_dt, 0.f);
446
+ vec4 gradient_zi1 = interpolate_gradient_4d(yi01, yi11, dz, gradient_yi01, gradient_yi11, dz_dt);
550
447
 
551
- float gradient_x = interpolate_gradient(zi0, zi1, dt, d_zi0_dx, d_zi1_dx, 0.f);
552
- float gradient_y = interpolate_gradient(zi0, zi1, dt, d_zi0_dy, d_zi1_dy, 0.f);
553
- float gradient_z = interpolate_gradient(zi0, zi1, dt, d_zi0_dz, d_zi1_dz, 0.f);
554
- float gradient_t = interpolate_gradient(zi0, zi1, dt, d_zi0_dt, d_zi1_dt, 1.f);
448
+ vec4 dt_dt = vec4(0.f, 0.f, 0.f, 1.f);
555
449
 
556
- return vec4(gradient_x, gradient_y, gradient_z, gradient_t);
450
+ vec4 gradient = interpolate_gradient_4d(zi0, zi1, dt, gradient_zi0, gradient_zi1, dt_dt);
451
+
452
+ return gradient;
557
453
  }
558
454
 
559
455
  // non-periodic Perlin noise
@@ -830,78 +726,125 @@ inline CUDA_CALLABLE void adj_pnoise(uint32 state, const vec4& xyzt, int px, int
830
726
 
831
727
  // curl noise
832
728
 
833
- inline CUDA_CALLABLE vec2 curlnoise(uint32 state, const vec2& xy)
834
- {
835
- float dx = xy[0] - floor(xy[0]);
836
- float dy = xy[1] - floor(xy[1]);
729
+ inline CUDA_CALLABLE vec2 curlnoise(uint32 state, const vec2& xy, const uint32 octaves, const float lacunarity, const float gain)
730
+ {
731
+ vec2 curl_sum = vec2(0.f);
732
+ float freq = 1.f;
733
+ float amplitude = 1.f;
837
734
 
838
- int x0 = (int)floor(xy[0]);
839
- int y0 = (int)floor(xy[1]);
735
+ for (int i = 0; i < octaves; i++)
736
+ {
737
+ vec2 pt = freq * xy;
738
+ float dx = pt[0] - floor(pt[0]);
739
+ float dy = pt[1] - floor(pt[1]);
840
740
 
841
- int x1 = x0 + 1;
842
- int y1 = y0 + 1;
741
+ int x0 = (int)floor(pt[0]);
742
+ int y0 = (int)floor(pt[1]);
843
743
 
844
- vec2 grad_field = noise_2d_gradient(state, x0, y0, x1, y1, dx, dy);
845
- return vec2(-grad_field[1], grad_field[0]);
846
- }
847
- inline CUDA_CALLABLE void adj_curlnoise(uint32 state, const vec2& xy, uint32& adj_state, vec2& adj_xy, const vec2& adj_ret) {}
744
+ int x1 = x0 + 1;
745
+ int y1 = y0 + 1;
848
746
 
849
- inline CUDA_CALLABLE vec3 curlnoise(uint32 state, const vec3& xyz)
850
- {
851
- float dx = xyz[0] - floor(xyz[0]);
852
- float dy = xyz[1] - floor(xyz[1]);
853
- float dz = xyz[2] - floor(xyz[2]);
854
-
855
- int x0 = (int)floor(xyz[0]);
856
- int y0 = (int)floor(xyz[1]);
857
- int z0 = (int)floor(xyz[2]);
747
+ vec2 grad_field = noise_2d_gradient(state, x0, y0, x1, y1, dx, dy);
748
+ curl_sum += amplitude * grad_field;
858
749
 
859
- int x1 = x0 + 1;
860
- int y1 = y0 + 1;
861
- int z1 = z0 + 1;
750
+ amplitude *= gain;
751
+ freq *= lacunarity;
752
+ }
753
+ return vec2(-curl_sum[1], curl_sum[0]);
754
+ }
755
+ 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) {}
862
756
 
863
- vec3 grad_field_1 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz);
864
- state = rand_init(state, 10019689);
865
- vec3 grad_field_2 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz);
866
- state = rand_init(state, 13112221);
867
- vec3 grad_field_3 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz);
757
+ inline CUDA_CALLABLE vec3 curlnoise(uint32 state, const vec3& xyz, const uint32 octaves, const float lacunarity, const float gain)
758
+ {
759
+ vec3 curl_sum_1 = vec3(0.f);
760
+ vec3 curl_sum_2 = vec3(0.f);
761
+ vec3 curl_sum_3 = vec3(0.f);
762
+
763
+ float freq = 1.f;
764
+ float amplitude = 1.f;
765
+
766
+ for(int i = 0; i < octaves; i++)
767
+ {
768
+ vec3 pt = freq * xyz;
769
+ float dx = pt[0] - floor(pt[0]);
770
+ float dy = pt[1] - floor(pt[1]);
771
+ float dz = pt[2] - floor(pt[2]);
772
+
773
+ int x0 = (int)floor(pt[0]);
774
+ int y0 = (int)floor(pt[1]);
775
+ int z0 = (int)floor(pt[2]);
776
+
777
+ int x1 = x0 + 1;
778
+ int y1 = y0 + 1;
779
+ int z1 = z0 + 1;
780
+
781
+ vec3 grad_field_1 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz);
782
+ state = rand_init(state, 10019689);
783
+ vec3 grad_field_2 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz);
784
+ state = rand_init(state, 13112221);
785
+ vec3 grad_field_3 = noise_3d_gradient(state, x0, y0, z0, x1, y1, z1, dx, dy, dz);
786
+
787
+ curl_sum_1 += amplitude * grad_field_1;
788
+ curl_sum_2 += amplitude * grad_field_2;
789
+ curl_sum_3 += amplitude * grad_field_3;
868
790
 
791
+ amplitude *= gain;
792
+ freq *= lacunarity;
793
+ }
869
794
 
870
795
  return vec3(
871
- grad_field_3[1] - grad_field_2[2],
872
- grad_field_1[2] - grad_field_3[0],
873
- grad_field_2[0] - grad_field_1[1]);
796
+ curl_sum_3[1] - curl_sum_2[2],
797
+ curl_sum_1[2] - curl_sum_3[0],
798
+ curl_sum_2[0] - curl_sum_1[1]);
874
799
  }
875
- inline CUDA_CALLABLE void adj_curlnoise(uint32 state, const vec3& xyz, uint32& adj_state, vec3& adj_xyz, const vec3& adj_ret) {}
800
+ 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) {}
876
801
 
877
- inline CUDA_CALLABLE vec3 curlnoise(uint32 state, const vec4& xyzt)
802
+ inline CUDA_CALLABLE vec3 curlnoise(uint32 state, const vec4& xyzt, const uint32 octaves, const float lacunarity, const float gain)
878
803
  {
879
- float dx = xyzt[0] - floor(xyzt[0]);
880
- float dy = xyzt[1] - floor(xyzt[1]);
881
- float dz = xyzt[2] - floor(xyzt[2]);
882
- float dt = xyzt[3] - floor(xyzt[3]);
883
-
884
- int x0 = (int)floor(xyzt[0]);
885
- int y0 = (int)floor(xyzt[1]);
886
- int z0 = (int)floor(xyzt[2]);
887
- int t0 = (int)floor(xyzt[3]);
888
-
889
- int x1 = x0 + 1;
890
- int y1 = y0 + 1;
891
- int z1 = z0 + 1;
892
- int t1 = t0 + 1;
893
-
894
- vec4 grad_field_1 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt);
895
- state = rand_init(state, 10019689);
896
- vec4 grad_field_2 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt);
897
- state = rand_init(state, 13112221);
898
- vec4 grad_field_3 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt);
804
+ vec4 curl_sum_1 = vec4(0.f);
805
+ vec4 curl_sum_2 = vec4(0.f);
806
+ vec4 curl_sum_3 = vec4(0.f);
807
+
808
+ float freq = 1.f;
809
+ float amplitude = 1.f;
810
+
811
+ for(int i = 0; i < octaves; i++)
812
+ {
813
+ vec4 pt = freq * xyzt;
814
+ float dx = pt[0] - floor(pt[0]);
815
+ float dy = pt[1] - floor(pt[1]);
816
+ float dz = pt[2] - floor(pt[2]);
817
+ float dt = pt[3] - floor(pt[3]);
818
+
819
+ int x0 = (int)floor(pt[0]);
820
+ int y0 = (int)floor(pt[1]);
821
+ int z0 = (int)floor(pt[2]);
822
+ int t0 = (int)floor(pt[3]);
823
+
824
+ int x1 = x0 + 1;
825
+ int y1 = y0 + 1;
826
+ int z1 = z0 + 1;
827
+ int t1 = t0 + 1;
828
+
829
+ vec4 grad_field_1 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt);
830
+ state = rand_init(state, 10019689);
831
+ vec4 grad_field_2 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt);
832
+ state = rand_init(state, 13112221);
833
+ vec4 grad_field_3 = noise_4d_gradient(state, x0, y0, z0, t0, x1, y1, z1, t1, dx, dy, dz, dt);
834
+
835
+ curl_sum_1 += amplitude * grad_field_1;
836
+ curl_sum_2 += amplitude * grad_field_2;
837
+ curl_sum_3 += amplitude * grad_field_3;
838
+
839
+ amplitude *= gain;
840
+ freq *= lacunarity;
841
+ }
899
842
 
900
843
  return vec3(
901
- grad_field_3[1] - grad_field_2[2],
902
- grad_field_1[2] - grad_field_3[0],
903
- grad_field_2[0] - grad_field_1[1]);
844
+ curl_sum_3[1] - curl_sum_2[2],
845
+ curl_sum_1[2] - curl_sum_3[0],
846
+ curl_sum_2[0] - curl_sum_1[1]);
904
847
  }
905
- inline CUDA_CALLABLE void adj_curlnoise(uint32 state, const vec4& xyzt, uint32& adj_state, vec4& adj_xyzt, const vec3& adj_ret) {}
848
+ 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) {}
906
849
 
907
850
  } // namespace wp