Open Barteks2x opened 3 years ago
One solution is to deprecate the existing method, and introduce a new one with the proper implementation. Another is to change this on a breaking version.
We already have the beginnings of a 'compatibility mode' in https://github.com/SpongePowered/noise/pull/20 -- that needs to be changed to not modify global state, and the compatibility mode could additionally include this behaviour change.
This has been found by DaPorkchop_ while working on another project
This method:
https://github.com/SpongePowered/noise/blob/213f04e0fc78bd19160c5700981b0620f45e9f98/src/main/java/org/spongepowered/noise/Utils.java#L114-L122
has been originally ported from the following C code in libnoise:
But because of operator precedence in java, the java code is actually equivalent to this
Where in the original C code, modulo should take precedence.
For values of
n
betweenk * 1073741824
andk * 1073741824 + 536870912
for integerk >= 1
(and similar for negative range) this just happens to output the same values, but otherwise forn > 1073741824
the result will be always negative (and similarly forn < -1073741824
the result will be always positive) instead of repeating the entire range from-1073741824
to1073741824
.Changing this now may be considered a breaking change as there could be terrain generators that would generate different terrain with this fixed.