annotate Platforms/WebAssembly/wasm-viewport.js @ 223:d30a10d574ec am

refactoring continued - not working
author am@osimis.io
date Thu, 14 Jun 2018 10:57:02 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
223
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
1 // http://stackoverflow.com/a/28900478/881731
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
2
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
3 function WebAssemblyViewport(module, canvasId) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
4 this.module = module;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
5
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
6 // Obtain a reference to the canvas element using its id
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
7 this.htmlCanvas = document.getElementById(canvasId);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
8
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
9 // Obtain a graphics context on the canvas element for drawing.
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
10 this.context = htmlCanvas.getContext('2d');
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
11
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
12 // ImageData structure that can be used to update the content of the canvas
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
13 this.imageData = null;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
14
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
15 // Temporary buffer in the WebAssembly heap that is used to render the pixels
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
16 this.renderingBuffer = null;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
17
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
18 // Get access to the WebAssembly functions
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
19 this.ViewportSetSize = this.module.cwrap('ViewportSetSize', null, [ 'number', 'number' ]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
20 this.ViewportRender = this.module.cwrap('ViewportRender', 'number', [ 'number', 'number', 'number' ]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
21 this.ViewportMouseDown = this.module.cwrap('ViewportMouseDown', null, [ 'number', 'number', 'number', 'number' ]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
22 this.ViewportMouseMove = this.module.cwrap('ViewportMouseMove', null, [ 'number', 'number' ]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
23 this.ViewportMouseUp = this.module.cwrap('ViewportMouseUp', null, [ ]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
24 this.ViewportMouseEnter = this.module.cwrap('ViewportMouseEnter', null, []);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
25 this.ViewportMouseLeave = this.module.cwrap('ViewportMouseLeave', null, []);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
26 this.ViewportMouseWheel = this.module.cwrap('ViewportMouseWheel', null, [ 'number', 'number', 'number', 'number' ]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
27 this.ViewportKeyPressed = this.module.cwrap('ViewportKeyPressed', null, [ 'string', 'number', 'number' ]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
28
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
29 this.Redraw = function() {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
30 if (this.imageData === null ||
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
31 this.renderingBuffer === null ||
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
32 ViewportRender(this.imageData.width,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
33 this.imageData.height,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
34 this.renderingBuffer) == 0) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
35 console.log('The rendering has failed');
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
36 } else {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
37 // Create an accessor to the rendering buffer (i.e. create a
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
38 // "window" above the heap of the WASM module), then copy it to
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
39 // the ImageData object
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
40 this.imageData.data.set(new Uint8ClampedArray(
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
41 this.module.buffer,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
42 this.renderingBuffer,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
43 this.imageData.width * this.imageData.height * 4));
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
44
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
45 this.context.putImageData(imageData, 0, 0);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
46 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
47 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
48
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
49 this.Resize = function() {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
50 if (this.imageData != null &&
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
51 (this.imageData.width != this.window.innerWidth ||
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
52 this.imageData.height != this.window.innerHeight)) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
53 this.imageData = null;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
54 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
55
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
56 this.htmlCanvas.width = window.innerWidth;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
57 this.htmlCanvas.height = window.innerHeight;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
58
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
59 if (this.imageData === null) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
60 this.imageData = context.getImageData(0, 0, this.htmlCanvas.width, this.htmlCanvas.height);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
61 ViewportSetSize(this.htmlCanvas.width, this.htmlCanvas.height);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
62
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
63 if (this.renderingBuffer != null) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
64 this.module._free(this.renderingBuffer);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
65 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
66
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
67 renderingBuffer = this.module._malloc(this.imageData.width * this.imageData.height * 4);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
68 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
69
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
70 this.Redraw();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
71 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
72
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
73 // Force the rendering of the viewport for the first time
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
74 this.Resize();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
75
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
76 // Register an event listener to call the Resize() function
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
77 // each time the window is resized.
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
78 window.addEventListener('resize', this.Resize, false);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
79
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
80 var that = this;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
81
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
82 this.htmlCanvas.addEventListener('contextmenu', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
83 // Prevent right click on the canvas
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
84 event.preventDefault();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
85 }, false);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
86
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
87 this.htmlCanvas.addEventListener('mouseleave', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
88 that.ViewportMouseLeave();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
89 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
90
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
91 this.htmlCanvas.addEventListener('mouseenter', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
92 that.ViewportMouseEnter();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
93 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
94
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
95 this.htmlCanvas.addEventListener('mousedown', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
96 var x = event.pageX - this.offsetLeft;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
97 var y = event.pageY - this.offsetTop;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
98 that.ViewportMouseDown(event.button, x, y, 0 /* TODO */);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
99 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
100
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
101 this.htmlCanvas.addEventListener('mousemove', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
102 var x = event.pageX - this.offsetLeft;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
103 var y = event.pageY - this.offsetTop;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
104 that.ViewportMouseMove(x, y);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
105 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
106
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
107 this.htmlCanvas.addEventListener('mouseup', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
108 that.ViewportMouseUp();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
109 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
110
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
111 window.addEventListener('keydown', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
112 that.ViewportKeyPressed(event.key, event.shiftKey, event.ctrlKey, event.altKey);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
113 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
114
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
115 this.htmlCanvas.addEventListener('wheel', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
116 var x = event.pageX - this.offsetLeft;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
117 var y = event.pageY - this.offsetTop;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
118 that.ViewportMouseWheel(event.deltaY, x, y, event.ctrlKey);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
119 event.preventDefault();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
120 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
121
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
122
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
123 // Touch events
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
124 this.touchTranslation = false;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
125 this.touchZoom = false;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
126
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
127 this.ResetTouch = function() {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
128 if (this.touchTranslation ||
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
129 this.touchZoom) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
130 this.ViewportMouseUp();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
131 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
132
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
133 this.touchTranslation = false;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
134 this.touchZoom = false;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
135 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
136
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
137 this.GetTouchTranslation = function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
138 var touch = event.targetTouches[0];
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
139 return [
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
140 touch.pageX,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
141 touch.pageY
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
142 ];
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
143 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
144
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
145 this.GetTouchZoom = function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
146 var touch1 = event.targetTouches[0];
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
147 var touch2 = event.targetTouches[1];
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
148 var dx = (touch1.pageX - touch2.pageX);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
149 var dy = (touch1.pageY - touch2.pageY);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
150 var d = Math.sqrt(dx * dx + dy * dy);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
151 return [
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
152 (touch1.pageX + touch2.pageX) / 2.0,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
153 (touch1.pageY + touch2.pageY) / 2.0,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
154 d
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
155 ];
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
156 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
157
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
158 this.htmlCanvas.addEventListener('touchstart', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
159 ResetTouch();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
160 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
161
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
162 this.htmlCanvas.addEventListener('touchend', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
163 ResetTouch();
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
164 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
165
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
166 this.htmlCanvas.addEventListener('touchmove', function(event) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
167 if (that.touchTranslation.length == 2) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
168 var t = GetTouchTranslation(event);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
169 that.ViewportMouseMove(t[0], t[1]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
170 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
171 else if (that.touchZoom.length == 3) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
172 var z0 = that.touchZoom;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
173 var z1 = GetTouchZoom(event);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
174 that.ViewportMouseMove(z0[0], z0[1] - z0[2] + z1[2]);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
175 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
176 else {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
177 // Realize the gesture event
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
178 if (event.targetTouches.length == 1) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
179 // Exactly one finger inside the canvas => Setup a translation
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
180 that.touchTranslation = GetTouchTranslation(event);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
181 that.ViewportMouseDown(1 /* middle button */,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
182 that.touchTranslation[0],
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
183 that.touchTranslation[1], 0);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
184 } else if (event.targetTouches.length == 2) {
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
185 // Exactly 2 fingers inside the canvas => Setup a pinch/zoom
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
186 that.touchZoom = GetTouchZoom(event);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
187 var z0 = that.touchZoom;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
188 that.ViewportMouseDown(2 /* right button */,
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
189 z0[0],
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
190 z0[1], 0);
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
191 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
192 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
193 });
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
194
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
195 return this;
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
196 }
d30a10d574ec refactoring continued - not working
am@osimis.io
parents:
diff changeset
197