Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

“Fatal error: Array index is out of range” crash in GradientNoise2D evaluate(_:Double,_:Double) #11

Open
capnslipp opened this issue Mar 7, 2023 · 1 comment

Comments

@capnslipp
Copy link

I'm getting consistent “Fatal error: Array index is out of range” crashes in GradientNoise2D's evaluate(_ x:Double, _ y:Double) at gradient.swift on line 540.

The issue seems to be that the staticGradientNoise2D.points is initialized to have 32 members on line 354 , then when evaluate(…) is called, base_vertex_index:Int ends up with value of 32 (Int((2*sample_uv_rel.y - sample_uv_rel.x - Double(a))*0.5 + 1) << 4 with sample_uv_rel = (1, 0) & a = 0Int((2*1 - 0 - Double(0))*0.5 + 1) << 4Int(2*0.5 + 1) << 4Int(2) << 432, on line 457).

Finally on line 540, the code attempts to iterate in a for loop over GradientNoise2D.points[base_vertex_index ..< base_vertex_index + 4]… so GradientNoise2D.points[32..<36] when GradientNoise2D.points is only 32 elements long.

I don't really know how this noise math is meant to work, so I can't speculate as to what a fix should be other than… missing modulus? IDK.

capnslipp added a commit to capnslipp/metal-voxel-planet that referenced this issue Mar 7, 2023
Fix for “Fatal error: Array index is out of range” crashes in `GradientNoise2D evaluate(_:Double,_:Double)`.  Issue has already been reported at tayloraswift/swift-noise#11 , so this is just a workaround based on my limited understanding of how the noise generation works.

* Worked around crashes by running a modulus (division remainder) on the position before passing it to `noise.evaluate(…)`.  Modulusing against a new `noisePeriod` (`20`) ivar, the reciprocal of the existing noise `frequency` (`0.05`).

BIG NOTE: Again, no idea if this is the correct math.  The output voxel chunks look repeated, so it might not be.  I'm not sure how else to fix it though.
@capnslipp
Copy link
Author

Looks like it's dependent on inputs. This is calling it with x: 80, y: -80, and frequency: 0.05.

capnslipp added a commit to capnslipp/metal-voxel-planet that referenced this issue Apr 14, 2023
Fix for “Fatal error: Array index is out of range” crashes in `GradientNoise2D evaluate(_:Double,_:Double)`.  Issue has already been reported at tayloraswift/swift-noise#11 , so this is just a workaround based on my limited understanding of how the noise generation works.

* Worked around crashes by running a modulus (division remainder) on the position before passing it to `noise.evaluate(…)`.  Modulusing against a new `noisePeriod` (`20`) ivar, the reciprocal of the existing noise `frequency` (`0.05`).

BIG NOTE: Again, no idea if this is the correct math.  The output voxel chunks look repeated, so it might not be.  I'm not sure how else to fix it though.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant