-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathtiledGrid.js
More file actions
99 lines (85 loc) · 2.5 KB
/
tiledGrid.js
File metadata and controls
99 lines (85 loc) · 2.5 KB
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
var gridVertices = function (subdivisions, size) {
var vertices = new Float32Array(3 * (subdivisions + 1) * (subdivisions + 1));
var i = 0;
for (var y = 0; y <= subdivisions; y++) {
for (var x = 0; x <= subdivisions; x++) {
vertices[i * 3 + 0] = x * size / subdivisions;
vertices[i * 3 + 1] = y * size / subdivisions;
vertices[i * 3 + 2] = 0;
i++;
}
}
return vertices;
};
var gridUvs = function (subdivisions) {
var uvs = new Float32Array(2 * (subdivisions + 1) * (subdivisions + 1));
var i = 0;
for (var y = 0; y <= subdivisions; y++) {
for (var x = 0; x <= subdivisions; x++) {
uvs[i * 2 + 0] = x / subdivisions;
uvs[i * 2 + 1] = y / subdivisions;
i++;
}
}
return uvs;
};
var gridIndices = function (subdivisions) {
var numPrimitives = 2 * subdivisions * subdivisions;
var indices = new Float32Array(3 * numPrimitives);
var i = 0;
for (var y = 0; y < subdivisions; y++) {
for (var x = 0; x < subdivisions; x++) {
// 0___1
// | /
// |/
// 2
indices[i * 3 + 0] = y * (subdivisions + 1) + x;
indices[i * 3 + 1] = y * (subdivisions + 1) + x + 1;
indices[i * 3 + 2] = (y + 1) * (subdivisions + 1) + x;
i++;
// 0
// /|
// /_|
// 2 1
indices[i * 3 + 0] = y * (subdivisions + 1) + x + 1;
indices[i * 3 + 1] = (y + 1) * (subdivisions + 1) + x + 1;
indices[i * 3 + 2] = (y + 1) * (subdivisions + 1) + x;
i++;
}
}
return indices;
};
var createMeshTiles = function (parameters) {
var maxTileSize = parameters.maxTileSize;
var vertexShader = parameters.vertexShader;
var fragmentShader = parameters.fragmentShader;
var nTiles1d = gridResolution / maxTileSize;
var tiles = [];
var vertices = gridVertices(gridResolution / nTiles1d, gridSize / nTiles1d);
var uvs = gridUvs(gridResolution / nTiles1d);
var indices = gridIndices(gridResolution / nTiles1d);
var normals = GLOW.Geometry.faceNormals(vertices, indices);
for (var y = 0; y < nTiles1d; y++) {
for (var x = 0; x < nTiles1d; x++) {
tiles.push(new GLOW.Shader({
vertexShader: loadSynchronous("shaders/" + vertexShader + ".glsl"),
fragmentShader: loadSynchronous("shaders/" + fragmentShader + ".glsl"),
data: _.extend(parameters.data, {
vertices: vertices,
uvs: uvs,
nTiles1d: new GLOW.Float(nTiles1d),
tileWidth: new GLOW.Float(gridSize / nTiles1d),
x: new GLOW.Float(x),
y: new GLOW.Float(y),
normals: normals
}),
interleave: {
vertices: false,
uvs: false
},
indices: indices
}));
}
}
return tiles;
};