-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathregl.js
174 lines (158 loc) · 4.64 KB
/
regl.js
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import { Camera } from '../index';
import Mesh from './mesh';
const domready = require('domready');
const mapboxgl = require('mapbox-gl');
mapboxgl.accessToken = process.env.MAPBOX_TOKEN;
const REGL = require('regl');
const mat4 = require('gl-mat4');
const createCube = require('primitive-cube');
const createRoundedCube = require('primitive-rounded-cube');
const groundGeom = createCube(1, 1, 0.001, 3, 3, 3);
const roundedCube = createRoundedCube(1, 1, 1, 10, 10, 10, 0.15);
const mapCenter = [13.418314, 52.49871, 3.5];
let t = 0;
const camera = new Camera();
function getModelMatrix (lngLatAlt, scale) {
const modelMat = new Float64Array(16);
mat4.identity(modelMat);
mat4.translate(modelMat, modelMat, camera.positionFromLngLatAlt(lngLatAlt));
mat4.scale(modelMat, modelMat, [scale, scale, scale]);
return modelMat;
}
const createScene = function (gl) {
let regl = REGL(gl);
const drawScope = regl({
context: {
tick: () => t
},
vert: `
precision mediump float;
attribute vec3 position;
attribute vec3 normal;
uniform mat4 model, view, projection, viewProjection, comp;
varying vec3 vposition;
varying vec3 vnormal;
void main() {
vposition = position;
vnormal = normal;
gl_Position = comp * model * vec4(position, 1);
}`,
frag: `
precision mediump float;
struct Light {
vec3 color;
vec3 position;
};
uniform Light lights[4];
varying vec3 vposition;
varying vec3 vnormal;
void main() {
vec3 normal = normalize(vnormal);
vec3 light = vec3(0, 0, 0);
for (int i = 0; i < 4; ++i) {
vec3 lightDir = normalize(lights[i].position - vposition);
float diffuse = max(0.0, dot(lightDir, normal));
light += diffuse * lights[i].color;
}
gl_FragColor = vec4(light, 1);
}`,
uniforms: {
view: regl.prop('view'),
projection: regl.prop('projection'),
viewProjection: regl.prop('viewProjection'),
// comp: regl.prop('comp'),
'lights[0].color': [1, 0, 0],
'lights[1].color': [0, 1, 0],
'lights[2].color': [0, 0, 1],
'lights[3].color': [1, 1, 0],
'lights[0].position': ({tick}) => {
const t = 0.1 * tick;
return [
10 * Math.cos(0.09 * (t)),
10 * Math.sin(0.09 * (2 * t)),
10 * Math.cos(0.09 * (3 * t))
];
},
'lights[1].position': ({tick}) => {
const t = 0.1 * tick;
return [
10 * Math.cos(0.05 * (5 * t + 1)),
10 * Math.sin(0.05 * (4 * t)),
10 * Math.cos(0.05 * (0.1 * t))
];
},
'lights[2].position': ({tick}) => {
const t = 0.1 * tick;
return [
10 * Math.cos(0.05 * (9 * t)),
10 * Math.sin(0.05 * (0.25 * t)),
10 * Math.cos(0.05 * (4 * t))
];
},
'lights[3].position': ({tick}) => {
const t = 0.1 * tick;
return [
10 * Math.cos(0.1 * (0.3 * t)),
10 * Math.sin(0.1 * (2.1 * t)),
10 * Math.cos(0.1 * (1.3 * t))
];
}
},
depth: {
enable: true,
mask: true
},
cull: {
enable: true,
face: 'back'
}
});
const mapMeshPos = camera.positionFromLngLatAlt(mapCenter);
const groundMesh = new Mesh(regl, [mapMeshPos[0], mapMeshPos[1], 0], [0, 0, 0], 1.0, groundGeom);
const roundedCubeMesh = new Mesh(regl, mapMeshPos, [0, 0, 0], 0.1, roundedCube);
const roundedCubeMesh2 = new Mesh(regl, mapMeshPos, [1.1, 0.1, 0.1], 0.1, roundedCube);
const roundedCubeMesh3 = new Mesh(regl, camera.positionFromLngLatAlt([mapMeshPos[0] + 0.0003, mapMeshPos[1], mapMeshPos[2]]), [0, 0, 0], 0.15, roundedCube);
const render = function (camera) {
drawScope({
view: camera.view,
projection: camera.projection,
viewProjection: camera.viewProjection
}, () => {
// groundMesh.draw(camera);
roundedCubeMesh.draw(camera);
roundedCubeMesh2.draw(camera);
roundedCubeMesh3.draw(camera);
});
t++;
};
return { render };
};
const createMap = () => {
const mapInstance = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/dark-v9',
center: mapCenter,
zoom: 17.5,
pitch: 60,
renderWorldCopies: false,
hash: false
});
let scene;
mapInstance.on('style.load', () => {
mapInstance.addLayer({
id: 'custom_layer',
type: 'custom',
onAdd: function (map, gl) {
scene = createScene(gl);
},
render: function (gl, matrix) {
camera.update(mapInstance, matrix);
scene.render(camera);
mapInstance.triggerRepaint();
}
});
});
};
domready(() => {
createMap();
});