-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmain.js
More file actions
118 lines (91 loc) · 2.92 KB
/
main.js
File metadata and controls
118 lines (91 loc) · 2.92 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
var controls = new THREE.OrbitControls(camera);
var gui = new dat.GUI();
gui.add(controls, 'autoRotate');
var renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const ledcount = 10520;
// Prepare the dome shader
var uniforms = {
texture: { value: new THREE.TextureLoader().load( "spark1.png" ) }
};
var colours = [];
for (var i = 0; i < ledcount; i++) {
colours.push(1.0, 1.0, 1.0)
}
var vertShader = `\
varying vec3 vColor;
void main() {
vColor = color;
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_PointSize = 0.05 * ( 300.0 / -mvPosition.z );
gl_Position = projectionMatrix * mvPosition;
}`
var fragShader = `\
uniform sampler2D texture;
varying vec3 vColor;
void main() {
gl_FragColor = vec4( vColor, 1.0 );
gl_FragColor = gl_FragColor * texture2D( texture, gl_PointCoord );
}`
var ledsmaterial = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: vertShader,
fragmentShader: fragShader,
blending: THREE.AdditiveBlending,
depthTest: false,
transparent: true,
vertexColors: true
});
var led_particle_geo = new THREE.BufferGeometry();
led_particle_geo.addAttribute('color', new THREE.Float32BufferAttribute(colours, 3).setDynamic(true));
// Load the LED geometry
var loader = new THREE.FileLoader();
loader.load(
'dome.config',
// onLoad callback
function ( data ) {
var leds = JSON.parse(data).led_list;
var leds_destructured = leds.reduce((wip, led) => wip.concat(led));
led_particle_geo.addAttribute('position', new THREE.Float32BufferAttribute(leds_destructured, 3));
var ledparticles = new THREE.Points(led_particle_geo, ledsmaterial);
scene.add(ledparticles);
},
);
var axesHelper = new THREE.AxesHelper( 5 );
scene.add( axesHelper );
gui.add(axesHelper, 'visible').name('Show Axes');
camera.position.x = 5;
// camera.position.y = 3;
animate();
function animate() {
requestAnimationFrame( animate );
controls.update();
render();
}
var event_data = new EventSource("/sub");
var dome_data = "";
var receiving_domeage = false;
event_data.onmessage = function (event) {
receiving_domeage = true;
dome_data = event.data;
};
function handleDomeData() {
// Handle an incoming packet of base64-encoded domey goodness
if (!receiving_domeage) {
return;
}
var dome_binary = atob(dome_data);
var colours = led_particle_geo.attributes.color.array;
for ( var i = 0; i < ledcount * 3; i++ ) {
colours[i] = dome_binary.charCodeAt(i) / 255;
}
led_particle_geo.attributes.color.needsUpdate = true;
}
function render() {
handleDomeData();
renderer.render( scene, camera );
}