Package: libnoise0
X-Debbugs-Cc: cliffjki...@gmail.com
Version: 1.0.0+repack-1+b1
Severity: important
Tags: upstream

Dear Maintainer,

While investigating #1093633, I found a source of the problem in
GradientNoise3D.
Per the headers for GradientNoise3D, GradientNoise3D is supposed to return
in the domain {-1.0..1.0}

  /// A <i>gradient</i>-noise function generates better-quality noise than a
  /// <i>value</i>-noise function.  Most noise modules use gradient noise
for
  /// this reason, although it takes much longer to calculate.
  ///
  /// The return value ranges from -1.0 to +1.0.

Test cases
GradientNoise3D(0.95,-0.4,-0.95,0,-1,-1)=-1.14259
GradientNoise3D(0.95,-0.4,-0.9,0,-1,-1)=-1.13909
GradientNoise3D(0.95,-0.4,-0.85,0,-1,-1)=-1.13559
GradientNoise3D(0.95,-0.4,-0.8,0,-1,-1)=-1.13209
GradientNoise3D(0.95,-0.4,-0.75,0,-1,-1)=-1.12859
GradientNoise3D(0.95,-0.4,-0.7,0,-1,-1)=-1.12509
GradientNoise3D(0.95,-0.4,-0.65,0,-1,-1)=-1.1216
GradientNoise3D(0.95,-0.4,-0.6,0,-1,-1)=-1.1181
GradientNoise3D(0.95,-0.4,-0.55,0,-1,-1)=-1.1146
GradientNoise3D(0.95,-0.4,-0.5,0,-1,-1)=-1.1111
GradientNoise3D(0.95,-0.4,-0.45,0,-1,-1)=-1.1076
GradientNoise3D(0.95,-0.4,-0.4,0,-1,-1)=-1.1041
GradientNoise3D(0.95,-0.4,-0.35,0,-1,-1)=-1.1006
GradientNoise3D(0.95,-0.4,-0.3,0,-1,-1)=-1.0971
GradientNoise3D(0.95,-0.4,-0.25,0,-1,-1)=-1.0936
GradientNoise3D(0.95,-0.4,-0.2,0,-1,-1)=-1.0901
GradientNoise3D(0.95,-0.4,-0.15,0,-1,-1)=-1.0866
GradientNoise3D(0.95,-0.4,-0.1,0,-1,-1)=-1.0831
GradientNoise3D(0.95,-0.4,-0.05,0,-1,-1)=-1.0796
GradientNoise3D(0.95,-0.4,0.05,0,-1,0)=2.08144
GradientNoise3D(0.95,-0.4,0.1,0,-1,0)=2.12755
GradientNoise3D(0.95,-0.4,0.15,0,-1,0)=2.17366
GradientNoise3D(0.95,-0.4,0.2,0,-1,0)=2.21978
GradientNoise3D(0.95,-0.4,0.25,0,-1,0)=2.26589
GradientNoise3D(0.95,-0.4,0.3,0,-1,0)=2.31201
GradientNoise3D(0.95,-0.4,0.35,0,-1,0)=2.35812
GradientNoise3D(0.95,-0.4,0.4,0,-1,0)=2.40423
GradientNoise3D(0.95,-0.4,0.45,0,-1,0)=2.45035
GradientNoise3D(0.95,-0.4,0.5,0,-1,0)=2.49646
GradientNoise3D(0.95,-0.4,0.55,0,-1,0)=2.54257
GradientNoise3D(0.95,-0.4,0.6,0,-1,0)=2.58869
GradientNoise3D(0.95,-0.4,0.65,0,-1,0)=2.6348
GradientNoise3D(0.95,-0.4,0.7,0,-1,0)=2.68091
GradientNoise3D(0.95,-0.4,0.75,0,-1,0)=2.72703
GradientNoise3D(0.95,-0.4,0.8,0,-1,0)=2.77314
GradientNoise3D(0.95,-0.4,0.85,0,-1,0)=2.81925
GradientNoise3D(0.95,-0.4,0.9,0,-1,0)=2.86537
GradientNoise3D(0.95,-0.4,0.95,0,-1,0)=2.91148
GradientNoise3D(0.95,-0.35,-1,0,-1,-2)=-2.57093

Expected Result
The return value ranges from -1.0 to +1.0.

Probable root cause:
Wrong scale on return.
return ((xvGradient * xvPoint)
    + (yvGradient * yvPoint)
    + (zvGradient * zvPoint)) * 2.12;

The math works out to scale this to -1.0..1.0, it should be <1, not 2.12.

This is "important" not "normal" because if software was built on the
expectation this function returned within the stated domain, it will fail.

Reply via email to