render-engine.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import * as three from "three-js";
  2. class render_engine {
  3. #renderer;
  4. #scene;
  5. #camera;
  6. #canvas;
  7. #actors;
  8. constructor(canvas, context) {
  9. if (!(canvas instanceof HTMLCanvasElement)) {
  10. throw TypeError("Canvas must be an HTMLCanvasElement.");
  11. }
  12. if (!(context instanceof WebGL2RenderingContext)) {
  13. throw TypeError("Context must be WebGL2 RenderingContext.");
  14. }
  15. this.#actors = {};
  16. this.#canvas = canvas;
  17. this.#scene = new three.Scene();
  18. this.#camera = new three.PerspectiveCamera(75, 1, 0.1, 1000);
  19. this.#renderer = new three.WebGLRenderer({
  20. canvas: this.#canvas,
  21. context: context
  22. });
  23. this.#update_camera();
  24. this.#resize_canvas();
  25. window.addEventListener("resize", () => {
  26. this.#resize_canvas();
  27. this.#update_camera();
  28. });
  29. }
  30. #resize_canvas() {
  31. this.#canvas.width = window.innerWidth;
  32. this.#canvas.height = window.innerHeight;
  33. this.#renderer.setSize(window.innerWidth, window.innerHeight);
  34. }
  35. #update_camera() {
  36. this.#camera.aspect = this.#canvas.width / this.#canvas.height;
  37. }
  38. run() {
  39. this.#init();
  40. this.#renderer.setAnimationLoop(() => { this.#render(); });
  41. }
  42. #init() {
  43. const geometry = new three.BoxGeometry(1, 1, 1);
  44. const material = new three.MeshBasicMaterial({ color: 0x004000 });
  45. this.#actors.cube = new three.Mesh(geometry, material);
  46. this.#scene.add(this.#actors.cube);
  47. this.#camera.position.z = 5;
  48. }
  49. #render() {
  50. this.#actors.cube.rotation.x += 0.01;
  51. this.#actors.cube.rotation.y += 0.01;
  52. this.#renderer.render(this.#scene, this.#camera);
  53. }
  54. }
  55. export { render_engine };