1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 | 1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
| var chunker = require('./chunker')
var ndarray = require('ndarray')
module.exports = function(opts) {
if (!opts.generateVoxelChunk) opts.generateVoxelChunk = function(low, high) {
return generate(low, high, module.exports.generator['Valley'])
}
return chunker(opts)
}
module.exports.meshers = {
culled: require('./meshers/culled').mesher,
greedy: require('./meshers/greedy').mesher,
transgreedy: require('./meshers/transgreedy').mesher,
monotone: require('./meshers/monotone').mesher,
stupid: require('./meshers/stupid').mesher
}
module.exports.Chunker = chunker.Chunker
module.exports.geometry = {}
module.exports.generator = {}
module.exports.generate = generate
function generate(lo, hi, fn, game) {
// To fix the display gaps, we need to pad the bounds
lo[0]--
lo[1]--
lo[2]--
hi[0]++
hi[1]++
hi[2]++
var dims = [hi[2]-lo[2], hi[1]-lo[1], hi[0]-lo[0]]
var data = ndarray(new Uint16Array(dims[2] * dims[1] * dims[0]), dims)
for (var k = lo[2]; k < hi[2]; k++)
for (var j = lo[1]; j < hi[1]; j++)
for(var i = lo[0]; i < hi[0]; i++) {
data.set(k-lo[2], j-lo[1], i-lo[0], fn(i, j, k))
}
return data
}
// shape and terrain generator functions
module.exports.generator['Sphere'] = function(i,j,k) {
return i*i+j*j+k*k <= 16*16 ? 1 : 0
}
module.exports.generator['Noise'] = function(i,j,k) {
return Math.random() < 0.1 ? Math.random() * 0xffffff : 0;
}
module.exports.generator['Dense Noise'] = function(i,j,k) {
return Math.round(Math.random() * 0xffffff);
}
module.exports.generator['Checker'] = function(i,j,k) {
return !!((i+j+k)&1) ? (((i^j^k)&2) ? 1 : 0xffffff) : 0;
}
module.exports.generator['Hill'] = function(i,j,k) {
return j <= 16 * Math.exp(-(i*i + k*k) / 64) ? 1 : 0;
}
module.exports.generator['Valley'] = function(i,j,k) {
return j <= (i*i + k*k) * 31 / (32*32*2) + 1 ? 1 + (1<<15) : 0;
}
module.exports.generator['Hilly Terrain'] = function(i,j,k) {
var h0 = 3.0 * Math.sin(Math.PI * i / 12.0 - Math.PI * k * 0.1) + 27;
if(j > h0+1) {
return 0;
}
if(h0 <= j) {
return 1;
}
var h1 = 2.0 * Math.sin(Math.PI * i * 0.25 - Math.PI * k * 0.3) + 20;
if(h1 <= j) {
return 2;
}
if(2 < j) {
return Math.random() < 0.1 ? 0x222222 : 0xaaaaaa;
}
return 3;
}
module.exports.scale = function ( x, fromLow, fromHigh, toLow, toHigh ) {
return ( x - fromLow ) * ( toHigh - toLow ) / ( fromHigh - fromLow ) + toLow
}
// convenience function that uses the above functions to prebake some simple voxel geometries
module.exports.generateExamples = function() {
return {
'Sphere': generate([-16,-16,-16], [16,16,16], module.exports.generator['Sphere']),
'Noise': generate([0,0,0], [16,16,16], module.exports.generator['Noise']),
'Dense Noise': generate([0,0,0], [16,16,16], module.exports.generator['Dense Noise']),
'Checker': generate([0,0,0], [8,8,8], module.exports.generator['Checker']),
'Hill': generate([-16, 0, -16], [16,16,16], module.exports.generator['Hill']),
'Valley': generate([0,0,0], [32,32,32], module.exports.generator['Valley']),
'Hilly Terrain': generate([0, 0, 0], [32,32,32], module.exports.generator['Hilly Terrain'])
}
}
|