space-scene.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. export class space_scene {
  2. #renderer;
  3. #canvas;
  4. #camera;
  5. #scene;
  6. #working;
  7. #framerate;
  8. constructor(canvas, context) {
  9. this.#framerate = 30;
  10. this.#canvas = canvas;
  11. this.#renderer = new THREE.WebGLRenderer({canvas, context: context});
  12. this.#camera = new THREE.PerspectiveCamera(75, 1);
  13. this.#scene = new THREE.Scene();
  14. this.update_size();
  15. }
  16. update_size(width, height) {
  17. this.#canvas.width = width;
  18. this.#canvas.height = height;
  19. this.#camera.aspect = width / height;
  20. this.#camera.updateProjectionMatrix();
  21. this.#renderer.setSize(width, height);
  22. }
  23. get scene() {
  24. return this.#scene;
  25. }
  26. start() {
  27. this.#working = true;
  28. setTimeout(() => { this.#rendering(); }, 1);
  29. }
  30. stop() {
  31. this.#working = false;
  32. }
  33. #rendering() {
  34. const before = performance.now();
  35. this.#renderer.render(this.#scene, this.#camera);
  36. if (!this.#working) {
  37. return;
  38. }
  39. const after = performance.now();
  40. const delta = after - before;
  41. const next = 1000 / 30 - ((delta >= 0) ? delta : 0);
  42. setTimeout(() => {
  43. requestAnimationFrame(() => { this.#rendering(); });
  44. }, (next > 0) ? next : 1);
  45. }
  46. }