| <!-- |
| Copyright 2022 The Fuchsia Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| --> |
| <html> |
| <head> |
| <meta content="text/html;charset=utf-8" http-equiv="Content-Type"/> |
| </head> |
| <body> |
| <main> |
| <select name="rive-animations" id="rive"> |
| <option value="juice.riv">juice.riv</option> |
| <option value="knight.riv">knight.riv</option> |
| <option value="marty.riv">marty.riv</option> |
| </select> |
| <input type="checkbox" id="partials" name="partials"> |
| <label for="partials">Visualize partial updates</label> |
| <p id="fps">FPS: ??? (???/???)</p> |
| <canvas id="drawing" width="1000" height="1000" style="width: 500;"></canvas> |
| <script type="module"> |
| const rive = document.getElementById('rive'); |
| const partials = document.getElementById('partials'); |
| |
| const canvas = document.getElementById('drawing'); |
| const ctx = canvas.getContext('2d'); |
| |
| const worker = new Worker(new URL('./worker.js', import.meta.url), { |
| type: 'module' |
| }); |
| worker.postMessage({ |
| 'width': canvas.width, |
| 'height': canvas.height, |
| 'partials': partials.checked, |
| 'rive': rive.value, |
| }); |
| |
| const fps = document.getElementById('fps'); |
| |
| let timings = []; |
| function pushTiming(timing) { |
| timings.push(timing); |
| |
| if (timings.length == 50) { |
| const sum = timings.reduce((a, b) => a + b, 0); |
| const avg = (sum / timings.length) || 0; |
| const min = Math.min(...timings); |
| const max = Math.max(...timings); |
| |
| fps.innerHTML = 'FPS: ' + (1 / avg).toFixed(2) + ' (' + (1 / max).toFixed(2) + '/' + (1 / min).toFixed(2) + ')'; |
| |
| timings = []; |
| } |
| } |
| |
| let last_timestamp = 0; |
| function animation(timestamp) { |
| const elapsed = timestamp - last_timestamp; |
| last_timestamp = timestamp; |
| |
| pushTiming(elapsed / 1000); |
| |
| worker.postMessage({ |
| 'elapsed': elapsed, |
| 'width': canvas.width, |
| 'height': canvas.height, |
| 'partials': partials.checked, |
| 'rive': rive.value, |
| }); |
| } |
| |
| worker.onmessage = function(message) { |
| ctx.putImageData(new ImageData( |
| new Uint8ClampedArray(message.data), |
| canvas.width, |
| canvas.height |
| ), 0, 0); |
| |
| window.requestAnimationFrame(animation); |
| } |
| </script> |
| </main> |
| </body> |
| </html> |