perlin 0.1.0pre1-x86-mingw32 → 0.1.0-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +47 -10
- data/Rakefile +1 -30
- data/ext/perlin/extconf.rb +3 -1
- data/lib/perlin/1.8/perlin.so +0 -0
- data/lib/perlin/1.9/perlin.so +0 -0
- metadata +67 -15
- data/lib/perlin.rb +0 -13
- data/lib/perlin/generator.rb +0 -161
- data/lib/perlin/version.rb +0 -5
data/README.md
CHANGED
@@ -1,14 +1,36 @@
|
|
1
1
|
Perlin
|
2
2
|
======
|
3
3
|
|
4
|
-
A Perlin noise
|
5
|
-
|
4
|
+
A fast Perlin/Simplex noise generator.
|
5
|
+
Implemented as a Ruby C extension, it is considerably faster than the pure Ruby equivalent, [perlin_noise](https://github.com/junegunn/perlin_noise).
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
By default, the noise generated uses Perlin's Simplex functions, but can produce "Classic" Perlin noise
|
8
|
+
(not recommended, since it is significantly slower).
|
9
|
+
|
10
|
+
If a large number of noise values are required, requesting chunks of values can be faster, which can then be iterated
|
11
|
+
through at leisure (or use the block version of #chunk).
|
12
|
+
|
13
|
+
- [Benchmarks](https://github.com/Spooner/ruby-perlin/blob/master/bench/benchmarks.txt)
|
14
|
+
|
15
|
+
CREDITS
|
16
|
+
-------
|
17
|
+
|
18
|
+
- Written by Brian 'bojo' Jones (mojobojo@gmail.com)
|
19
|
+
- Optimizations thanks to Camille Goudeseune, Univ of Illinois, (cog@illinois.edu)
|
9
20
|
- Made into gem and extended by Bil Bas (bil.bagpuss@gmail.com)
|
10
21
|
|
11
22
|
- [Simplex noise functions copyright (c) 2007-2012 Eliot Eshelman](http://www.6by9.net/b/2012/02/03/simplex-noise-for-c-and-python)
|
23
|
+
- "Classic" noise functions based on http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
|
24
|
+
|
25
|
+
USE CASES
|
26
|
+
---------
|
27
|
+
|
28
|
+
One use for this gem would be to generate "randomness" for games, such as building levels for a rogue-alike game.
|
29
|
+
|
30
|
+
If generating textures, it is advised to use a Simplex noise shader instead of this gem, since shaders are considerably
|
31
|
+
faster than setting pixels, for example by using TexPlay. The issue is not so much that generating the noise is faster,
|
32
|
+
but that setting individual pixel colours from Ruby is very slow. However, if graphics shaders are not available, then
|
33
|
+
this could be used, but would be painfully slow for anything but tiny images.
|
12
34
|
|
13
35
|
INSTALL
|
14
36
|
-------
|
@@ -21,13 +43,28 @@ USAGE
|
|
21
43
|
require 'perlin'
|
22
44
|
|
23
45
|
# Takes values seed, persistence, and octaves
|
24
|
-
|
46
|
+
gen = Perlin::Generator.new 123, 1.0, 1
|
25
47
|
|
26
|
-
# Returns a 'height' value for
|
27
|
-
|
48
|
+
# Returns a 'height' value for 2 or 3-dimensional noise.
|
49
|
+
gen[10, 20] #=> 0.0011919947855197324
|
50
|
+
gen[5, 22.2, 99.8] #=> 0.692631933498385
|
28
51
|
|
29
52
|
# Returns a 2D array of 'heights' for a range (x, y, size_x, size_y, interval)
|
30
|
-
|
53
|
+
noise = gen.chunk 1, 1, 2, 3, 1
|
54
|
+
|
55
|
+
noise[1][2] #=> 0.28406014362476045
|
56
|
+
p noise #= > [[-0.9227624778765608, -0.0016387049134645594, -0.4764434188330739],
|
57
|
+
# [0.24490384926510073, -0.4764434188330739, 0.28406014362476045]]
|
58
|
+
|
59
|
+
|
60
|
+
# Returns a 3D array of 'heights' for a range (x, y, size_x, size_y, interval)
|
61
|
+
noise = gen.chunk 0, 0, 0, 2, 3, 4, 0.5
|
62
|
+
noise.size #=> 2
|
63
|
+
noise[0].size #=> 3
|
64
|
+
noise[0][0].size #=> 4
|
65
|
+
noise[1][2][3] #=> -0.1585322813268602
|
66
|
+
|
67
|
+
# Can run in "Classic" Perlin mode (Not recommended - SLOW!)
|
31
68
|
|
32
|
-
|
33
|
-
|
69
|
+
gen.classic = true
|
70
|
+
gen[10, 20] #=> -0.19936732947826385
|
data/Rakefile
CHANGED
@@ -11,38 +11,9 @@ begin
|
|
11
11
|
rescue LoadError
|
12
12
|
end
|
13
13
|
|
14
|
-
require File.expand_path('../lib/perlin/version', __FILE__)
|
15
|
-
|
16
14
|
CLOBBER << "coverage"
|
17
15
|
|
18
|
-
|
19
|
-
spec = Gem::Specification.new do |s|
|
20
|
-
s.name = 'perlin'
|
21
|
-
s.version = Perlin::VERSION
|
22
|
-
s.date = Time.now.strftime '%Y-%m-%d'
|
23
|
-
s.authors = ["Brian 'bojo' Jones", 'Camille Goudeseune', 'Bil Bas']
|
24
|
-
|
25
|
-
s.summary = 'Perlin Noise C extension'
|
26
|
-
s.description = <<-END
|
27
|
-
#{s.summary}
|
28
|
-
|
29
|
-
A Perlin/Simplex noise implementation based of
|
30
|
-
<http://freespace.virgin.net/hugo.elias/models/m_perlin.htm>. Implemented as a Ruby C extension.
|
31
|
-
END
|
32
|
-
|
33
|
-
s.email = %w<mojobojo@gmail.com>
|
34
|
-
s.files = Dir.glob %w<CHANGELOG LICENSE Rakefile README.md lib/**/*.* lib ext/**/*.* examples/**/*.*>
|
35
|
-
s.homepage = 'https://github.com/boj/ruby-perlin'
|
36
|
-
s.licenses = %w<MIT>
|
37
|
-
s.extensions << 'ext/perlin/extconf.rb'
|
38
|
-
s.rubyforge_project = 'ruby-perlin'
|
39
|
-
s.test_files = []
|
40
|
-
s.has_rdoc = 'yard'
|
41
|
-
|
42
|
-
s.add_development_dependency 'rake-compile', '~> 0.8.1'
|
43
|
-
s.add_development_dependency 'simplecov', '~> 0.6.4'
|
44
|
-
s.add_development_dependency 'launchy', '~> 2.1.0'
|
45
|
-
end
|
16
|
+
spec = Gem::Specification.load Dir["*.gemspec"][0]
|
46
17
|
|
47
18
|
Gem::PackageTask.new spec do
|
48
19
|
end
|
data/ext/perlin/extconf.rb
CHANGED
@@ -9,7 +9,9 @@ dir_config(extension_name)
|
|
9
9
|
$CFLAGS += ' -DRUBY_19' if RUBY_VERSION =~ /^1.9/
|
10
10
|
|
11
11
|
# let's use c99
|
12
|
-
#$CFLAGS += " -std=c99"
|
13
12
|
$CFLAGS += " -std=gnu99"
|
14
13
|
|
14
|
+
# Avoid warnings since we are using C99, not C90!
|
15
|
+
$warnflags.gsub!('-Wdeclaration-after-statement', '') if $warnflags
|
16
|
+
|
15
17
|
create_makefile(extension_name)
|
Binary file
|
data/lib/perlin/1.9/perlin.so
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perlin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
6
|
platform: x86-mingw32
|
7
7
|
authors:
|
8
8
|
- Brian 'bojo' Jones
|
@@ -11,10 +11,58 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-07-
|
14
|
+
date: 2012-07-16 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: RedCloth
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 4.2.9
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 4.2.9
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: yard
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ~>
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.8.2.1
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.2.1
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 2.10.0
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 2.10.0
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: rake-compiler
|
18
66
|
requirement: !ruby/object:Gem::Requirement
|
19
67
|
none: false
|
20
68
|
requirements:
|
@@ -80,25 +128,23 @@ files:
|
|
80
128
|
- LICENSE
|
81
129
|
- Rakefile
|
82
130
|
- README.md
|
83
|
-
- lib/perlin/1.9/perlin.so
|
84
|
-
- lib/perlin/generator.rb
|
85
|
-
- lib/perlin/version.rb
|
86
|
-
- lib/perlin.rb
|
87
131
|
- ext/perlin/classic.c
|
88
|
-
- ext/perlin/classic.h
|
89
|
-
- ext/perlin/extconf.rb
|
90
132
|
- ext/perlin/generator.c
|
91
|
-
- ext/perlin/generator.h
|
92
133
|
- ext/perlin/perlin.c
|
93
|
-
- ext/perlin/perlin.h
|
94
134
|
- ext/perlin/simplex.c
|
135
|
+
- ext/perlin/classic.h
|
136
|
+
- ext/perlin/generator.h
|
137
|
+
- ext/perlin/perlin.h
|
95
138
|
- ext/perlin/simplex.h
|
139
|
+
- ext/perlin/extconf.rb
|
96
140
|
- examples/chunk_in_2d.rb
|
97
141
|
- examples/chunk_in_3d.rb
|
98
142
|
- examples/index_in_2d.rb
|
99
143
|
- examples/index_in_3d.rb
|
100
144
|
- examples/ogl/README.md
|
101
145
|
- examples/ogl/run.rb
|
146
|
+
- lib/perlin/1.8/perlin.so
|
147
|
+
- lib/perlin/1.9/perlin.so
|
102
148
|
homepage: https://github.com/boj/ruby-perlin
|
103
149
|
licenses:
|
104
150
|
- MIT
|
@@ -112,15 +158,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
158
|
- - ! '>='
|
113
159
|
- !ruby/object:Gem::Version
|
114
160
|
version: '0'
|
161
|
+
segments:
|
162
|
+
- 0
|
163
|
+
hash: 1024176461
|
115
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
165
|
none: false
|
117
166
|
requirements:
|
118
|
-
- - ! '
|
167
|
+
- - ! '>='
|
119
168
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
169
|
+
version: '0'
|
170
|
+
segments:
|
171
|
+
- 0
|
172
|
+
hash: 1024176461
|
121
173
|
requirements: []
|
122
174
|
rubyforge_project: ruby-perlin
|
123
|
-
rubygems_version: 1.8.
|
175
|
+
rubygems_version: 1.8.24
|
124
176
|
signing_key:
|
125
177
|
specification_version: 3
|
126
178
|
summary: Perlin Noise C extension
|
data/lib/perlin.rb
DELETED
data/lib/perlin/generator.rb
DELETED
@@ -1,161 +0,0 @@
|
|
1
|
-
module Perlin
|
2
|
-
# Perlin noise generator.
|
3
|
-
#
|
4
|
-
# @!attribute [rw] seed
|
5
|
-
# @return [Integer]
|
6
|
-
#
|
7
|
-
# @!attribute [r] persistence
|
8
|
-
# @return [Float]
|
9
|
-
#
|
10
|
-
# @!attribute [r] octave
|
11
|
-
# @return [Integer]
|
12
|
-
class Generator
|
13
|
-
attr_reader :seed, :octave, :persistence
|
14
|
-
def classic?; @classic; end
|
15
|
-
|
16
|
-
# @!method initialize(seed, persistence, octave)
|
17
|
-
# Create a noise generator.
|
18
|
-
#
|
19
|
-
# Using the same seed will always produce the same pattern. Animate a perlin 'texture' by altering the seed based on time.
|
20
|
-
#
|
21
|
-
# @param seed [Integer] Seed value to create a different pattern.
|
22
|
-
# @param persistence [Float] Used to generate different frequencies/amplitudes of output.
|
23
|
-
# @param octave [Integer] Number of iterations to run (higher number of octaves takes more time)
|
24
|
-
# @option options :classic [Boolean] (false) Whether to use the slower Classic algorithm, rather than default (and much faster) Simplex.
|
25
|
-
def initialize(seed, persistence, octave, options = {})
|
26
|
-
options = {
|
27
|
-
:classic => false,
|
28
|
-
}.merge! options
|
29
|
-
|
30
|
-
initialize_(seed, persistence, octave, options[:classic])
|
31
|
-
end
|
32
|
-
protected :initialize_ # Underlying C implementation.
|
33
|
-
|
34
|
-
# @overload chunk(x, y, steps_x, steps_y, interval)
|
35
|
-
# Calculates a rectangular section of height (n) values and returns them as a 2D array.
|
36
|
-
#
|
37
|
-
# This is much faster than accessing each point separately using {#[]}
|
38
|
-
#
|
39
|
-
# @example
|
40
|
-
# noise = Perlin::Generator.new 123, 1.0, 1
|
41
|
-
# arr = noise.chunk 1, 1, 2, 3, 1.5
|
42
|
-
#
|
43
|
-
# # access position 1, 2 (remember that arr is offset by the x, y value of the chunk)
|
44
|
-
# puts arr[0, 1] #=> -0.2208995521068573
|
45
|
-
#
|
46
|
-
# p arr #= > [[0.05753844603896141, -0.2208995521068573, 0.3973901569843292], [0.1383310854434967, -0.22248442471027374, 0.15600799024105072]]
|
47
|
-
#
|
48
|
-
# @param x [Float]
|
49
|
-
# @param y [Float]
|
50
|
-
# @param steps_x [Integer]
|
51
|
-
# @param steps_y [Integer]
|
52
|
-
# @param interval [Float]
|
53
|
-
#
|
54
|
-
# @return [Array<Array<Float>>] height (n) values within the rectangle.
|
55
|
-
#
|
56
|
-
# @overload chunk(x, y, steps_x, steps_y, interval) {|h, x, y| }
|
57
|
-
# Calculates a rectangular section of height (n) values and returns them as a 2D array.
|
58
|
-
#
|
59
|
-
# This is much faster than accessing each point separately using {#[]}
|
60
|
-
#
|
61
|
-
# @example
|
62
|
-
# noise = Perlin::Generator.new 123, 0.5, 3
|
63
|
-
# noise.chunk 1.0, 2.3, 3, 2, 1.5 do |h, x, y|
|
64
|
-
# # Use the height value, which is at x, y.
|
65
|
-
# end
|
66
|
-
#
|
67
|
-
# @param x [Float]
|
68
|
-
# @param y [Float]
|
69
|
-
# @param steps_x [Integer]
|
70
|
-
# @param steps_y [Integer]
|
71
|
-
# @param interval [Float]
|
72
|
-
#
|
73
|
-
# @yieldparam h [Float] Height at x, y
|
74
|
-
# @yieldparam x [Float]
|
75
|
-
# @yieldparam y [Float]
|
76
|
-
#
|
77
|
-
# @return [nil]
|
78
|
-
#
|
79
|
-
# @overload chunk(x, y, z, size_x, size_y, size_z, interval)
|
80
|
-
# Calculates a rectangular section of height (n) values and returns them as a 3D array.
|
81
|
-
#
|
82
|
-
# This is much faster than accessing each point separately using {#[]}
|
83
|
-
#
|
84
|
-
# @example
|
85
|
-
# noise = Perlin::Generator.new 123, 0.5, 5
|
86
|
-
# arr = noise.chunk 6.0, 5.0, 4.0, 3, 2, 1, 1.5
|
87
|
-
#
|
88
|
-
# # access position 2, 1, 0 (remember that arr is offset by the x, y and z value of the chunk)
|
89
|
-
# puts arr[2, 1, 0] #=>
|
90
|
-
#
|
91
|
-
# p arr #= >
|
92
|
-
#
|
93
|
-
# @param x [Float]
|
94
|
-
# @param y [Float]
|
95
|
-
# @param z [Float]
|
96
|
-
# @param steps_x [Integer]
|
97
|
-
# @param steps_y [Integer]
|
98
|
-
# @param steps_z [Integer]
|
99
|
-
# @param interval [Float]
|
100
|
-
#
|
101
|
-
# @return [Array<Array<Float>>] height (n) values within the rectangle.
|
102
|
-
#
|
103
|
-
# @overload chunk(x, y, z, size_x, size_y, size_z, interval) {|h, x, y| }
|
104
|
-
# Calculates a rectangular section of height (n) values and returns them as a 3D array.
|
105
|
-
#
|
106
|
-
# This is much faster than accessing each point separately using {#[]}
|
107
|
-
#
|
108
|
-
# @example
|
109
|
-
# noise = Perlin::Generator.new 123, 0.8, 3
|
110
|
-
# noise.chunk 6.0, 5.0, 4.0, 3, 2, 1, 1.5 do |h, x, y, z|
|
111
|
-
# # Use the height value, which is at x, y, z.
|
112
|
-
# end
|
113
|
-
#
|
114
|
-
# @param x [Float]
|
115
|
-
# @param y [Float]
|
116
|
-
# @param z [Float]
|
117
|
-
# @param steps_x [Integer]
|
118
|
-
# @param steps_y [Integer]
|
119
|
-
# @param steps_z [Integer]
|
120
|
-
# @param interval [Float]
|
121
|
-
#
|
122
|
-
# @yieldparam h [Float] Height at x, y, z
|
123
|
-
# @yieldparam x [Float]
|
124
|
-
# @yieldparam y [Float]
|
125
|
-
# @yieldparam z [Float]
|
126
|
-
#
|
127
|
-
# @return [nil]
|
128
|
-
|
129
|
-
# Gets height (n) at a point in 2D or 3D space.
|
130
|
-
#
|
131
|
-
# This is much slower, if accessing many points, than using {#chunk}
|
132
|
-
#
|
133
|
-
# @overload [](x, y)
|
134
|
-
# Gets height (n) value at a specific 2D position.
|
135
|
-
#
|
136
|
-
# @example
|
137
|
-
# noise = Perlin::Generator.new 123, 1.0, 1
|
138
|
-
#
|
139
|
-
# # Returns a 'height' value for (x, y)
|
140
|
-
# puts noise[10, 20] #=> 0.9004574418067932
|
141
|
-
#
|
142
|
-
# @param x [Float]
|
143
|
-
# @param y [Float]
|
144
|
-
# @return [Float] height (n) value at the position
|
145
|
-
#
|
146
|
-
# @overload [](x, y, z)
|
147
|
-
# Gets height (n) value at a specific 3D position.
|
148
|
-
#
|
149
|
-
# @example
|
150
|
-
# noise = Perlin::Generator.new 123, 1.0, 1
|
151
|
-
#
|
152
|
-
# # Returns a 'height' value for (x, y, z)
|
153
|
-
# puts noise[10, 20, 30] #=> 0.017745036631822586
|
154
|
-
#
|
155
|
-
# @param x [Float]
|
156
|
-
# @param y [Float]
|
157
|
-
# @param z [Float]
|
158
|
-
# @return [Float] height (n) value at the position
|
159
|
-
alias_method :run, :[]
|
160
|
-
end
|
161
|
-
end
|