Skip to content
This repository was archived by the owner on Apr 2, 2021. It is now read-only.

Commit a1ef811

Browse files
committed
Faster and improved hashing functions, reduces large scale patterning
1 parent e4258ce commit a1ef811

File tree

1 file changed

+16
-18
lines changed

1 file changed

+16
-18
lines changed

Diff for: FastNoiseSIMD/FastNoiseSIMD_internal.cpp

+16-18
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,6 @@ static SIMDi SIMDi_NUM(14);
486486
static SIMDi SIMDi_NUM(15);
487487
static SIMDi SIMDi_NUM(255);
488488
static SIMDi SIMDi_NUM(60493);
489-
static SIMDi SIMDi_NUM(0x40000000);
490489
static SIMDi SIMDi_NUM(0x7fffffff);
491490

492491
static SIMDi SIMDi_NUM(xPrime);
@@ -528,7 +527,7 @@ void FUNC(InitSIMDValues)()
528527
SIMDf_NUM(G3) = SIMDf_SET(1.f / 6.f);
529528
SIMDf_NUM(G32) = SIMDf_SET(2.f / 6.f);
530529
SIMDf_NUM(G33) = SIMDf_SET(3.f / 6.f);
531-
SIMDf_NUM(hash2Float) = SIMDf_SET(1.f / 1073741824.f);
530+
SIMDf_NUM(hash2Float) = SIMDf_SET(1.f / 2147483648.f);
532531
SIMDf_NUM(vectorSize) = SIMDf_SET(VECTOR_SIZE);
533532

534533
#if SIMD_LEVEL == FN_AVX2
@@ -550,7 +549,6 @@ void FUNC(InitSIMDValues)()
550549
SIMDi_NUM(15) = SIMDi_SET(15);
551550
SIMDi_NUM(255) = SIMDi_SET(255);
552551
SIMDi_NUM(60493) = SIMDi_SET(60493);
553-
SIMDi_NUM(0x40000000) = SIMDi_SET(0x40000000);
554552
SIMDi_NUM(0x7fffffff) = SIMDi_SET(0x7fffffff);
555553

556554
SIMDi_NUM(xPrime) = SIMDi_SET(1619);
@@ -599,9 +597,9 @@ static SIMDi VECTORCALL FUNC(Hash)(const SIMDi& seed, const SIMDi& x, const SIMD
599597
{
600598
SIMDi hash = seed;
601599

602-
hash = SIMDi_ADD(SIMDi_MUL(x, SIMDi_NUM(xPrime)), hash);
603-
hash = SIMDi_ADD(SIMDi_MUL(y, SIMDi_NUM(yPrime)), hash);
604-
hash = SIMDi_ADD(SIMDi_MUL(z, SIMDi_NUM(zPrime)), hash);
600+
hash = SIMDi_XOR(SIMDi_MUL(x, SIMDi_NUM(xPrime)), hash);
601+
hash = SIMDi_XOR(SIMDi_MUL(y, SIMDi_NUM(yPrime)), hash);
602+
hash = SIMDi_XOR(SIMDi_MUL(z, SIMDi_NUM(zPrime)), hash);
605603

606604
hash = SIMDi_MUL(SIMDi_MUL(SIMDi_MUL(hash, hash), SIMDi_NUM(60493)), hash);
607605
hash = SIMDi_XOR(SIMDi_SHIFT_R(hash, 13), hash);
@@ -613,10 +611,10 @@ static SIMDi VECTORCALL FUNC(HashHB)(const SIMDi& seed, const SIMDi& x, const SI
613611
{
614612
SIMDi hash = seed;
615613

616-
hash = SIMDi_ADD(SIMDi_MUL(x, SIMDi_NUM(xPrime)), hash);
617-
hash = SIMDi_ADD(SIMDi_MUL(y, SIMDi_NUM(yPrime)), hash);
618-
hash = SIMDi_ADD(SIMDi_MUL(z, SIMDi_NUM(zPrime)), hash);
619-
hash = SIMDi_XOR(SIMDi_SHIFT_R(hash, 13), hash);
614+
hash = SIMDi_XOR(SIMDi_MUL(x, SIMDi_NUM(xPrime)), hash);
615+
hash = SIMDi_XOR(SIMDi_MUL(y, SIMDi_NUM(yPrime)), hash);
616+
hash = SIMDi_XOR(SIMDi_MUL(z, SIMDi_NUM(zPrime)), hash);
617+
//hash = SIMDi_XOR(SIMDi_SHIFT_R(hash, 13), hash);
620618

621619
hash = SIMDi_MUL(SIMDi_MUL(SIMDi_MUL(hash, hash), SIMDi_NUM(60493)), hash);
622620

@@ -628,14 +626,14 @@ static SIMDf VECTORCALL FUNC(ValCoord)(const SIMDi& seed, const SIMDi& x, const
628626
// High bit hash
629627
SIMDi hash = seed;
630628

631-
hash = SIMDi_ADD(SIMDi_MUL(x, SIMDi_NUM(xPrime)), hash);
632-
hash = SIMDi_ADD(SIMDi_MUL(y, SIMDi_NUM(yPrime)), hash);
633-
hash = SIMDi_ADD(SIMDi_MUL(z, SIMDi_NUM(zPrime)), hash);
634-
hash = SIMDi_XOR(SIMDi_SHIFT_R(hash, 13), hash);
629+
hash = SIMDi_XOR(SIMDi_MUL(x, SIMDi_NUM(xPrime)), hash);
630+
hash = SIMDi_XOR(SIMDi_MUL(y, SIMDi_NUM(yPrime)), hash);
631+
hash = SIMDi_XOR(SIMDi_MUL(z, SIMDi_NUM(zPrime)), hash);
632+
//hash = SIMDi_XOR(SIMDi_SHIFT_R(hash, 13), hash);
635633

636-
hash = SIMDi_AND(SIMDi_MUL(SIMDi_MUL(SIMDi_MUL(hash, hash), SIMDi_NUM(60493)), hash), SIMDi_NUM(0x7fffffff));
634+
hash = SIMDi_MUL(SIMDi_MUL(SIMDi_MUL(hash, hash), SIMDi_NUM(60493)), hash);
637635

638-
return SIMDf_MUL(SIMDf_NUM(hash2Float), SIMDf_CONVERT_TO_FLOAT(SIMDi_SUB(hash, SIMDi_NUM(0x40000000))));
636+
return SIMDf_MUL(SIMDf_NUM(hash2Float), SIMDf_CONVERT_TO_FLOAT(hash));
639637
}
640638

641639
#if SIMD_LEVEL == FN_AVX2
@@ -1422,7 +1420,7 @@ static SIMDf VECTORCALL FUNC(CellularValue##distanceFunc##Single)(const SIMDi& s
14221420
yd = SIMDf_MUL_ADD(yd, invMag, ycf);\
14231421
zd = SIMDf_MUL_ADD(zd, invMag, SIMDf_SUB(SIMDf_CONVERT_TO_FLOAT(zc), z));\
14241422
\
1425-
SIMDf newCellValue = SIMDf_MUL(SIMDf_NUM(hash2Float), SIMDf_CONVERT_TO_FLOAT(SIMDi_SUB(SIMDi_AND(hash, SIMDi_NUM(0x7fffffff)), SIMDi_NUM(0x40000000))));\
1423+
SIMDf newCellValue = SIMDf_MUL(SIMDf_NUM(hash2Float), SIMDf_CONVERT_TO_FLOAT(hash));\
14261424
SIMDf newDistance = distanceFunc##_DISTANCE(xd, yd, zd);\
14271425
\
14281426
SIMDf closer = SIMDf_LESS_THAN(newDistance, distance);\
@@ -1516,7 +1514,7 @@ static SIMDf VECTORCALL FUNC(CellularLookup##distanceFunc##Single)(const SIMDi&
15161514
yCellNew = SIMDf_ADD(yCellNew, ycf); \
15171515
zCellNew = SIMDf_ADD(zCellNew, zcf); \
15181516
\
1519-
SIMDf newCellValue = SIMDf_MUL(SIMDf_NUM(hash2Float), SIMDf_CONVERT_TO_FLOAT(SIMDi_SUB(SIMDi_AND(hash, SIMDi_NUM(0x7fffffff)), SIMDi_NUM(0x40000000))));\
1517+
SIMDf newCellValue = SIMDf_MUL(SIMDf_NUM(hash2Float), SIMDf_CONVERT_TO_FLOAT(hash));\
15201518
SIMDf newDistance = distanceFunc##_DISTANCE(xd, yd, zd);\
15211519
\
15221520
SIMDf closer = SIMDf_LESS_THAN(newDistance, distance);\

0 commit comments

Comments
 (0)