From e3a2a0251dac86eff4358abab343b359eed0ab79 Mon Sep 17 00:00:00 2001 From: goynov Date: Tue, 5 Nov 2024 19:42:33 +0200 Subject: [PATCH] game objects module --- .gitignore | 3 ++ backend/app/bl/GameObjectsManager.js | 3 ++ src/gameEngine/index.js | 71 ++++++++++++++++++++++------ src/pages/game-objects/[[id]].vue | 42 +++++++++++----- 4 files changed, 93 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 3edf437..f31dc1e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ node_modules /out /repo +#temporary: +/public/static + # local env files .env.local .env.*.local diff --git a/backend/app/bl/GameObjectsManager.js b/backend/app/bl/GameObjectsManager.js index f144a49..4ef96b6 100644 --- a/backend/app/bl/GameObjectsManager.js +++ b/backend/app/bl/GameObjectsManager.js @@ -1,5 +1,7 @@ import decompress from "decompress"; import sharp from 'sharp'; +sharp.cache({ files : 0 }); + import fs from 'fs'; import path from 'path'; @@ -111,6 +113,7 @@ class GameObjectsManager{ let result = await decompress(src, def); object.asset.list = result.map(f=>f.path); object.asset.type = 'bundle'; + object.asset.name = `${object.id}/` + result.find(f=>f.path.endsWith('.gltf'))?.path; }else{ object.asset.type = 'single'; await fs.promises.copyFile(src, def + ext); diff --git a/src/gameEngine/index.js b/src/gameEngine/index.js index 9ae4b5f..8cc7615 100644 --- a/src/gameEngine/index.js +++ b/src/gameEngine/index.js @@ -1,33 +1,74 @@ import * as THREE from 'three'; +import { GLTFLoader } from 'three/examples/jsm/Addons.js'; +import { OrbitControls } from 'three/examples/jsm/Addons.js'; +import { MapControls } from 'three/addons/controls/MapControls.js'; +import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js'; +import { TransformControls } from 'three/addons/controls/TransformControls.js'; class GameEngine { - constructor() { - const width = window.innerWidth/2, height = window.innerHeight/2; + constructor(domNode) { + const width = 1200, height = 800; - const camera = new THREE.PerspectiveCamera(70, width / height, 0.01, 10); - camera.position.z = 1; + const camera = new THREE.PerspectiveCamera(70, width / height, 0.1, 10000); + //camera.position.set(-10, -10, 50); const scene = new THREE.Scene(); - - const geometry = new THREE.BoxGeometry(0.2, 0.2, 0.2); - const material = new THREE.MeshNormalMaterial(); - - const mesh = new THREE.Mesh(geometry, material); - scene.add(mesh); + // this.light = new THREE.AmbientLight( 0x404040, 0 ); // soft white light + // scene.add( this.light ); function animate(time) { - - mesh.rotation.x = time / 2000; - mesh.rotation.y = time / 1000; - renderer.render(scene, camera); + controls.update(); } - const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); + const renderer = new THREE.WebGLRenderer({ + antialias: true, + alpha: true, + preserveDrawingBuffer: true + }); + renderer.setPixelRatio( window.devicePixelRatio ); + const controls = new OrbitControls( camera, renderer.domElement ); + //const controls = new MapControls( camera, renderer.domElement ); + this.transformControls = new TransformControls( camera, renderer.domElement ); + this.transformControls.addEventListener( 'dragging-changed', function ( event ) { + controls.enabled = ! event.value; + } ); + // controls.enableDamping = true; + // controls.screenSpacePanning = true; renderer.setSize(width, height); renderer.setAnimationLoop(animate); this.renderer = renderer; + this.scene = scene; + this.loader = new GLTFLoader(); + this.camera = camera; + this.controls = controls; + domNode.appendChild(renderer.domElement); + + new THREE.TextureLoader().load('/static/textures/bck-preview.jpg', texture=>{ + texture.encoding = THREE.sRGBEncoding; + texture.mapping = THREE.EquirectangularReflectionMapping; + scene.background = new THREE.Color(0.7,0.8,1); + scene.environment = texture; + }) + } + + $ = THREE; + + async load(url, progress){ + return new Promise((resolve, reject)=>{ + this.loader.load(url, resolve, progress, reject) + }) + } + + async captureScreenshot(type = 'image/webp', quality = 80){ + return new Promise((resolve, reject)=>{ + this.renderer.domElement.toBlob(resolve, type, quality) + }) + } + + stop(){ + this.renderer.setAnimationLoop(null); } } diff --git a/src/pages/game-objects/[[id]].vue b/src/pages/game-objects/[[id]].vue index 15c53cf..8bccb47 100644 --- a/src/pages/game-objects/[[id]].vue +++ b/src/pages/game-objects/[[id]].vue @@ -17,16 +17,15 @@ - -
- + +
+