196 {
197
198 const u64 F3 = 1431655764;
199 const u64 G3 = 715827884;
200
201
203 fl::u32 i = ((
x>>1) + (s>>1)) >> 11;
204 fl::u32 j = ((
y>>1) + (s>>1)) >> 11;
205 fl::u32 k = ((
z>>1) + (s>>1)) >> 11;
206
211 fl::i32 x0 = ((
u64)
x<<2) - (X0>>18);
212 fl::i32 y0 = ((
u64)
y<<2) - (Y0>>18);
213 fl::i32 z0 = ((
u64)
z<<2) - (Z0>>18);
214
215
216
217 fl::u32 i1, j1, k1;
218 fl::u32 i2, j2, k2;
219
220
221 if (x0 >= y0) {
222 if (y0 >= z0) {
223 i1 = 1;
224 j1 = 0;
225 k1 = 0;
226 i2 = 1;
227 j2 = 1;
228 k2 = 0;
229 } else if (x0 >= z0) {
230 i1 = 1;
231 j1 = 0;
232 k1 = 0;
233 i2 = 1;
234 j2 = 0;
235 k2 = 1;
236 } else {
237 i1 = 0;
238 j1 = 0;
239 k1 = 1;
240 i2 = 1;
241 j2 = 0;
242 k2 = 1;
243 }
244 } else {
245 if (y0 < z0) {
246 i1 = 0;
247 j1 = 0;
248 k1 = 1;
249 i2 = 0;
250 j2 = 1;
251 k2 = 1;
252 } else if (x0 < z0) {
253 i1 = 0;
254 j1 = 1;
255 k1 = 0;
256 i2 = 0;
257 j2 = 1;
258 k2 = 1;
259 } else {
260 i1 = 0;
261 j1 = 1;
262 k1 = 0;
263 i2 = 1;
264 j2 = 1;
265 k2 = 0;
266 }
267 }
268
269
270
271
272
273
274 fl::i32 x1 = x0 - ((fl::i32)i1<<14) + ((fl::i32)(G3>>18));
275 fl::i32 y1 = y0 - ((fl::i32)j1<<14) + ((fl::i32)(G3>>18));
276 fl::i32 z1 = z0 - ((fl::i32)k1<<14) + ((fl::i32)(G3>>18));
277 fl::i32 x2 = x0 - ((fl::i32)i2<<14) + ((fl::i32)(2*G3)>>18);
278 fl::i32 y2 = y0 - ((fl::i32)j2<<14) + ((fl::i32)(2*G3)>>18);
279 fl::i32 z2 = z0 - ((fl::i32)k2<<14) + ((fl::i32)(2*G3)>>18);
280 fl::i32 x3 = x0 - (1 << 14) + (fl::i32)((3*G3)>>18);
281 fl::i32 y3 = y0 - (1 << 14) + (fl::i32)((3*G3)>>18);
282 fl::i32 z3 = z0 - (1 << 14) + (fl::i32)((3*G3)>>18);
283
284
285 fl::i32 n0 = 0, n1 = 0, n2 = 0, n3 = 0;
286 const fl::i32 fix0_6 = 161061274;
287
288 fl::i32 t0 = (fix0_6 - x0*x0 - y0*y0 - z0*z0) >> 12;
289 if (t0 > 0) {
290 t0 = (t0 * t0) >> 16;
291 t0 = (t0 * t0) >> 16;
292
294 }
295
296 fl::i32 t1 = (fix0_6 - x1*x1 - y1*y1 - z1*z1) >> 12;
297 if (t1 > 0) {
298 t1 = (t1 * t1) >> 16;
299 t1 = (t1 * t1) >> 16;
300
302 }
303
304 fl::i32 t2 = (fix0_6 - x2*x2 - y2*y2 - z2*z2) >> 12;
305 if (t2 > 0) {
306 t2 = (t2 * t2) >> 16;
307 t2 = (t2 * t2) >> 16;
308
310 }
311
312 fl::i32 t3 = (fix0_6 - x3*x3 - y3*y3 - z3*z3) >> 12;
313 if (t3 > 0) {
314 t3 = (t3 * t3) >> 16;
315 t3 = (t3 * t3) >> 16;
316
318 }
319
320
321
322 fl::i32 n = n0 + n1 + n2 + n3;
323 n = ((n >> 8) * 16748) >> 16 ;
324 return (fl::u16)n + 0x8000;
325}
static fl::i32 grad(fl::u8 hash, fl::i32 x)