Browse Source

completed line-for-line conversion from Java to Clojure

master
Inderjit Gill 11 years ago
parent
commit
e3b71b35d3
4 changed files with 147 additions and 9 deletions
  1. +24
    -0
      COPYING
  2. +14
    -4
      README
  3. +80
    -3
      src/perlin/core.clj
  4. +29
    -2
      test/perlin/core_test.clj

+ 24
- 0
COPYING View File

@ -0,0 +1,24 @@
Copyright (c) 2010 Inderjit Gill
Released under an MIT license.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

+ 14
- 4
README View File

@ -1,15 +1,25 @@
# perlin
FIXME: write description
A clojure implementation of Ken Perlin's improved noise algorithm
This is a straight line for line conversion without any optimisations
## Usage
FIXME: write
(noise x y z)
## Installation
FIXME: write
execute:
lein deps
lein compile-java
before running any of the tests
## License
FIXME: write
ImprovedNoise.java is released under whatever Ken Perlin says
Everything else is Copyright (c) 2010 Inderjit Gill
Released under an MIT license. See the file COPYING.

+ 80
- 3
src/perlin/core.clj View File

@ -1,6 +1,83 @@
(ns perlin.core
(:import (perlin ImprovedNoise)))
(ns perlin.core)
(def p [151 160 137 91 90 15 131 13 201 95 96 53 194 233 7 225
140 36 103 30 69 142 8 99 37 240 21 10 23 190 6 148
247 120 234 75 0 26 197 62 94 252 219 203 117 35 11 32
57 177 33 88 237 149 56 87 174 20 125 136 171 168 68 175
74 165 71 134 139 48 27 166 77 146 158 231 83 111 229 122
60 211 133 230 220 105 92 41 55 46 245 40 244 102 143 54
65 25 63 161 1 216 80 73 209 76 132 187 208 89 18 169
200 196 135 130 116 188 159 86 164 100 109 198 173 186 3 64
52 217 226 250 124 123 5 202 38 147 118 126 255 82 85 212
207 206 59 227 47 16 58 17 182 189 28 42 223 183 170 213
119 248 152 2 44 154 163 70 221 153 101 155 167 43 172 9
129 22 39 253 19 98 108 110 79 113 224 232 178 185 112 104
218 246 97 228 251 34 242 193 238 210 144 12 191 179 162 241
81 51 145 235 249 14 239 107 49 192 214 31 181 199 106 157
184 84 204 176 115 121 50 45 127 4 150 254 138 236 205 93
222 114 67 29 24 72 243 141 128 195 78 66 215 61 156 180
151 160 137 91 90 15 131 13 201 95 96 53 194 233 7 225
140 36 103 30 69 142 8 99 37 240 21 10 23 190 6 148
247 120 234 75 0 26 197 62 94 252 219 203 117 35 11 32
57 177 33 88 237 149 56 87 174 20 125 136 171 168 68 175
74 165 71 134 139 48 27 166 77 146 158 231 83 111 229 122
60 211 133 230 220 105 92 41 55 46 245 40 244 102 143 54
65 25 63 161 1 216 80 73 209 76 132 187 208 89 18 169
200 196 135 130 116 188 159 86 164 100 109 198 173 186 3 64
52 217 226 250 124 123 5 202 38 147 118 126 255 82 85 212
207 206 59 227 47 16 58 17 182 189 28 42 223 183 170 213
119 248 152 2 44 154 163 70 221 153 101 155 167 43 172 9
129 22 39 253 19 98 108 110 79 113 224 232 178 185 112 104
218 246 97 228 251 34 242 193 238 210 144 12 191 179 162 241
81 51 145 235 249 14 239 107 49 192 214 31 181 199 106 157
184 84 204 176 115 121 50 45 127 4 150 254 138 236 205 93
222 114 67 29 24 72 243 141 128 195 78 66 215 61 156 180])
; (. ImprovedNoise noise 1.0 1.0 1.0)
(defn fade
[t]
(* t t t (+ (* t (- (* t 6) 15.0)) 10.0)))
(defn lerp
[t a b]
(+ a (* t (- b a))))
(defn grad
[hash x y z]
(let [h (bit-and hash 15)
u (if (< h 8) x y)
v (if (< h 4) y (if (or (= h 12) (= h 14)) x z))]
(+ (if (= (bit-and h 1) 0) u (- u))
(if (= (bit-and h 2) 0) v (- v)))))
(defn noise
[x y z]
(let [X (bit-and (int (. Math floor x)) 255)
Y (bit-and (int (. Math floor y)) 255)
Z (bit-and (int (. Math floor z)) 255)
xx (- x (. Math floor x))
yy (- y (. Math floor y))
zz (- z (. Math floor z))
u (fade xx)
v (fade yy)
w (fade zz)
A (+ (p X) Y)
AA (+ (p A) Z)
AB (+ (p (+ A 1)) Z)
B (+ (p (+ X 1)) Y)
BA (+ (p B) Z)
BB (+ (p (+ B 1)) Z)]
(lerp w
(lerp v
(lerp u
(grad (p AA) xx yy zz)
(grad (p BA) (- xx 1) yy zz))
(lerp u
(grad (p AB) xx (- yy 1) zz)
(grad (p BB) (- xx 1) (- yy 1) zz)))
(lerp v
(lerp u
(grad (p (+ AA 1)) xx yy (- zz 1))
(grad (p (+ BA 1)) (- xx 1) yy (- zz 1)))
(lerp u
(grad (p (+ AB 1)) xx (- yy 1) (- zz 1))
(grad (p (+ BB 1)) (- xx 1) (- yy 1) (- zz 1)))))))

+ 29
- 2
test/perlin/core_test.clj View File

@ -1,6 +1,33 @@
(ns perlin.core-test
(:import (perlin Reference))
(:use [perlin.core] :reload-all)
(:use [clojure.test]))
(deftest replace-me ;; FIXME: write
(is false))
(deftest test-fade
(is (= (fade 0.0) (. Reference fade 0.0)))
(is (= (fade -1.0) (. Reference fade -1.0)))
(is (= (fade 1.5) (. Reference fade 1.5)))
(is (= (fade 20.0) (. Reference fade 20.0))))
(deftest test-lerp
(is (= (lerp 0.0 1.0 5.0) (. Reference lerp 0.0 1.0 5.0)))
(is (= (lerp 1.0 1.0 5.0) (. Reference lerp 1.0 1.0 5.0)))
(is (= (lerp 0.5 1.0 5.0) (. Reference lerp 0.5 1.0 5.0)))
(is (= (lerp -0.5 1.0 5.0) (. Reference lerp -0.5 1.0 5.0)))
(is (= (lerp 20.0 1.0 5.0) (. Reference lerp 20.0 1.0 5.0))))
(deftest test-grad
(is (= (grad 16 1.1 2.2 3.3) (. Reference grad 16 1.1 2.2 3.3))) ; h 0
(is (= (grad 15 1.1 2.2 3.3) (. Reference grad 15 1.1 2.2 3.3))) ; h 15
(is (= (grad 4 1.1 2.2 3.3) (. Reference grad 4 1.1 2.2 3.3))) ; h 4
(is (= (grad 12 1.1 2.2 3.3) (. Reference grad 12 1.1 2.2 3.3))) ; h 12
(is (= (grad 14 1.1 2.2 3.3) (. Reference grad 14 1.1 2.2 3.3))) ; h 14
(is (= (grad 11 1.1 2.2 3.3) (. Reference grad 11 1.1 2.2 3.3))) ; h 11
(is (= (grad 1 1.1 2.2 3.3) (. Reference grad 1 1.1 2.2 3.3))) ; h 1
(is (= (grad 2 1.1 2.2 3.3) (. Reference grad 2 1.1 2.2 3.3))) ; h 2
(is (= (grad 3 1.1 2.2 3.3) (. Reference grad 3 1.1 2.2 3.3))) ; h 3
)
(deftest test-noise
(is (= (noise 1.1 1.2 1.3) (. Reference noise 1.1 1.2 1.3)))
(is (= (noise 1.1 1.12 1.3) (. Reference noise 1.1 1.12 1.3))))

Loading…
Cancel
Save