vbAccelerator - Contents of code file: cPerlin3D.cls

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "cPerlin3D"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

'
' vbAccelerator.com
' Perlin Noise
' Pretyy much optimal algorithm for calculation, converted to VB from
'// JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.
' http://mrl.nyu.edu/~perlin/noise/
' See also http://www.noisemachine.com/
'
' Takes approx 30ms for a 100x100 grid with all optimisations on,
' using AMD Athlon 2k.
'
Private p() As Long
Private permutation() As Long

Public Function Noise(ByVal x As Double, ByVal y As Double, ByVal z As Double)
 As Double
Dim iX As Long
Dim iY As Long
Dim iZ As Long
Dim u As Double
Dim v As Double
Dim w As Double
Dim a As Long
Dim aa As Long
Dim ab As Long
Dim b As Long
Dim ba As Long
Dim bb As Long

   ' Find unit cube that contains point:
   iX = Int(x) And &HFF&
   iY = Int(y) And &HFF&
   iZ = Int(z) And &HFF&
   
   ' Find relative x,y,z of point in cube:
   x = x - Int(x)
   y = y - Int(y)
   z = z - Int(z)
   
   ' Compute fade curves for each of x,y,z
   u = fade(x)
   v = fade(y)
   w = fade(z)
   
   ' Hash coordinates of the 8 cube corners:
   a = p(iX) + iY
   aa = p(a) + iZ
   ab = p(a + 1) + iZ
   b = p(iX + 1) + iY
   ba = p(b) + iZ
   bb = p(b + 1) + iZ
   
   ' Add the blended results from 8 corners of the cube:
   Noise = lerp(w, lerp(v, lerp(u, grad(p(aa), x, y, z), _
                              grad(p(ba), x - 1, y, z)), _
                           lerp(u, grad(p(ab), x, y - 1, z), _
                              grad(p(bb), x - 1, y - 1, z))), _
                     lerp(v, lerp(u, grad(p(aa + 1), x, y, z - 1), _
                              grad(p(ba + 1), x - 1, y, z - 1)), _
                           lerp(u, grad(p(ab + 1), x, y - 1, z - 1), _
                              grad(p(bb + 1), x - 1, y - 1, z - 1))))
   
End Function

Private Function fade(ByVal t As Double) As Double
   fade = t * t * t * (t * (t * 6# - 15#) + 10#)
End Function
Private Function lerp(ByVal t As Double, ByVal a As Double, ByVal b As Double)
 As Double
   lerp = a + t * (b - a)
End Function
Private Function grad(ByVal hash As Long, ByVal x As Double, ByVal y As Double,
 ByVal z As Double) As Double
Dim h As Long
Dim u As Double
Dim v As Double
Dim g As Double

   '// CONVERT LO 4 BITS OF HASH CODE
   h = hash And &HF&
   
   '// INTO 12 GRADIENT DIRECTIONS.
   If (h < 8) Or (h = 12) Or (h = 13) Then
      u = x
   Else
      u = y
   End If
   
   If (h < 4) Or (h = 12) Or (h = 13) Then
      v = y
   Else
      y = z
   End If
   
   If ((h And 1) = 0) Then
      g = u
   Else
      g = -u
   End If
   
   If ((h And 2) = 0) Then
      g = g + v
   Else
      g = g - v
   End If
   
   grad = g
   
End Function

Private Sub Class_Initialize()
   ReDim p(0 To 511) As Long
   ReDim permutation(0 To 255) As Long
   
   ' What would I do for variable and particularly
   ' array variable initialisers in VB...
   permutation(0) = 151
   permutation(1) = 160
   permutation(2) = 137
   permutation(3) = 91
   permutation(4) = 90
   permutation(5) = 15
   permutation(6) = 131
   permutation(7) = 13
   permutation(8) = 201
   permutation(9) = 95
   permutation(10) = 96
   permutation(11) = 53
   permutation(12) = 194
   permutation(13) = 233
   permutation(14) = 7
   permutation(15) = 225
   permutation(16) = 140
   permutation(17) = 36
   permutation(18) = 103
   permutation(19) = 30
   permutation(20) = 69
   permutation(21) = 142
   permutation(22) = 8
   permutation(23) = 99
   permutation(24) = 37
   permutation(25) = 240
   permutation(26) = 21
   permutation(27) = 10
   permutation(28) = 23
   permutation(29) = 190
   permutation(30) = 6
   permutation(31) = 148
   permutation(32) = 247
   permutation(33) = 120
   permutation(34) = 234
   permutation(35) = 75
   permutation(36) = 0
   permutation(37) = 26
   permutation(38) = 197
   permutation(39) = 62
   permutation(40) = 94
   permutation(41) = 252
   permutation(42) = 219
   permutation(43) = 203
   permutation(44) = 117
   permutation(45) = 35
   permutation(46) = 11
   permutation(47) = 32
   permutation(48) = 57
   permutation(49) = 177
   permutation(50) = 33
   permutation(51) = 88
   permutation(52) = 237
   permutation(53) = 149
   permutation(54) = 56
   permutation(55) = 87
   permutation(56) = 174
   permutation(57) = 20
   permutation(58) = 125
   permutation(59) = 136
   permutation(60) = 171
   permutation(61) = 168
   permutation(62) = 68
   permutation(63) = 175
   permutation(64) = 74
   permutation(65) = 165
   permutation(66) = 71
   permutation(67) = 134
   permutation(68) = 139
   permutation(69) = 48
   permutation(70) = 27
   permutation(71) = 166
   permutation(72) = 77
   permutation(73) = 146
   permutation(74) = 158
   permutation(75) = 231
   permutation(76) = 83
   permutation(77) = 111
   permutation(78) = 229
   permutation(79) = 122
   permutation(80) = 60
   permutation(81) = 211
   permutation(82) = 133
   permutation(83) = 230
   permutation(84) = 220
   permutation(85) = 105
   permutation(86) = 92
   permutation(87) = 41
   permutation(88) = 55
   permutation(89) = 46
   permutation(90) = 245
   permutation(91) = 40
   permutation(92) = 244
   permutation(93) = 102
   permutation(94) = 143
   permutation(95) = 54
   permutation(96) = 65
   permutation(97) = 25
   permutation(98) = 63
   permutation(99) = 161
   permutation(100) = 1
   permutation(101) = 216
   permutation(102) = 80
   permutation(103) = 73
   permutation(104) = 209
   permutation(105) = 76
   permutation(106) = 132
   permutation(107) = 187
   permutation(108) = 208
   permutation(109) = 89
   permutation(110) = 18
   permutation(111) = 169
   permutation(112) = 200
   permutation(113) = 196
   permutation(114) = 135
   permutation(115) = 130
   permutation(116) = 116
   permutation(117) = 188
   permutation(118) = 159
   permutation(119) = 86
   permutation(120) = 164
   permutation(121) = 100
   permutation(122) = 109
   permutation(123) = 198
   permutation(124) = 173
   permutation(125) = 186
   permutation(126) = 3
   permutation(127) = 64
   permutation(128) = 52
   permutation(129) = 217
   permutation(130) = 226
   permutation(131) = 250
   permutation(132) = 124
   permutation(133) = 123
   permutation(134) = 5
   permutation(135) = 202
   permutation(136) = 38
   permutation(137) = 147
   permutation(138) = 118
   permutation(139) = 126
   permutation(140) = 255
   permutation(141) = 82
   permutation(142) = 85
   permutation(143) = 212
   permutation(144) = 207
   permutation(145) = 206
   permutation(146) = 59
   permutation(147) = 227
   permutation(148) = 47
   permutation(149) = 16
   permutation(150) = 58
   permutation(151) = 17
   permutation(152) = 182
   permutation(153) = 189
   permutation(154) = 28
   permutation(155) = 42
   permutation(156) = 223
   permutation(157) = 183
   permutation(158) = 170
   permutation(159) = 213
   permutation(160) = 119
   permutation(161) = 248
   permutation(162) = 152
   permutation(163) = 2
   permutation(164) = 44
   permutation(165) = 154
   permutation(166) = 163
   permutation(167) = 70
   permutation(168) = 221
   permutation(169) = 153
   permutation(170) = 101
   permutation(171) = 155
   permutation(172) = 167
   permutation(173) = 43
   permutation(174) = 172
   permutation(175) = 9
   permutation(176) = 129
   permutation(177) = 22
   permutation(178) = 39
   permutation(179) = 253
   permutation(180) = 19
   permutation(181) = 98
   permutation(182) = 108
   permutation(183) = 110
   permutation(184) = 79
   permutation(185) = 113
   permutation(186) = 224
   permutation(187) = 232
   permutation(188) = 178
   permutation(189) = 185
   permutation(190) = 112
   permutation(191) = 104
   permutation(192) = 218
   permutation(193) = 246
   permutation(194) = 97
   permutation(195) = 228
   permutation(196) = 251
   permutation(197) = 34
   permutation(198) = 242
   permutation(199) = 193
   permutation(200) = 238
   permutation(201) = 210
   permutation(202) = 144
   permutation(203) = 12
   permutation(204) = 191
   permutation(205) = 179
   permutation(206) = 162
   permutation(207) = 241
   permutation(208) = 81
   permutation(209) = 51
   permutation(210) = 145
   permutation(211) = 235
   permutation(212) = 249
   permutation(213) = 14
   permutation(214) = 239
   permutation(215) = 107
   permutation(216) = 49
   permutation(217) = 192
   permutation(218) = 214
   permutation(219) = 31
   permutation(220) = 181
   permutation(221) = 199
   permutation(222) = 106
   permutation(223) = 157
   permutation(224) = 184
   permutation(225) = 84
   permutation(226) = 204
   permutation(227) = 176
   permutation(228) = 115
   permutation(229) = 121
   permutation(230) = 50
   permutation(231) = 45
   permutation(232) = 127
   permutation(233) = 4
   permutation(234) = 150
   permutation(235) = 254
   permutation(236) = 138
   permutation(237) = 236
   permutation(238) = 205
   permutation(239) = 93
   permutation(240) = 222
   permutation(241) = 114
   permutation(242) = 67
   permutation(243) = 29
   permutation(244) = 24
   permutation(245) = 72
   permutation(246) = 243
   permutation(247) = 141
   permutation(248) = 128
   permutation(249) = 195
   permutation(250) = 78
   permutation(251) = 66
   permutation(252) = 215
   permutation(253) = 61
   permutation(254) = 156
   permutation(255) = 180
      
   Dim i As Long
   For i = 0 To 255
      p(i) = permutation(i)
      p(256 + i) = p(i)
   Next i
   
End Sub