import { Animator, BlinnPhongMaterial, Camera, CameraClearFlags, DirectLight, Engine, Entity, GLTFResource, Layer, MeshRenderer, PrimitiveMesh, UnlitMaterial, WebGLEngine } from "oasis-engine"; import { PaladinAdapter } from "./adapter/PaladinAdapter"; import { ARMode } from "./ar/AREnum"; import { ARManager } from "./ar/ARManager"; import { ARFeature } from "./ar/ARFeature"; import { ARCameraControl } from "./ar/ARCamera"; import { ARBackgroundControl } from "./control/ARBackgroundControl"; import { GlTFCollider } from "./control/GlTFCollider"; export enum CameraRenderOrder { ARBackground = 1, Scene = 2 } export enum GameState { // 未初始化 NotInit = 0, // 初始化引擎 InitEngine, // 初始化 AR InitAR, // 初始化 场景 InitScene, // 开始 Start } export class GameCtrl { // 单例 static _ins: GameCtrl; // 引擎 private _engine: WebGLEngine; // 当前的根节点 private _root: Entity; // 当前的状态 private _state: GameState = GameState.NotInit; /** * 获取单例 */ static get ins(): GameCtrl { if (!this._ins) { this._ins = new GameCtrl(); } return this._ins; } /** * 跳转到某个状态 * @param state - 状态 * @param arg - 携带参数 */ public jump(state: GameState, ...arg) { console.log("jump", state); if (this._state !== state) { switch (state) { case GameState.InitEngine: this.initEngine(); this.jump(GameState.InitAR); break; case GameState.InitAR: this.initAR(); break; case GameState.InitScene: this.initScene(); this.jump(GameState.Start); break; case GameState.Start: // 开始游戏 break; } } } /** * 初始化引擎 */ public initEngine(): void { const canvas = PaladinAdapter.canvas; const engine = (this._engine = new WebGLEngine(canvas)); // 初始化根节点 this._root = engine.sceneManager.activeScene.createRootEntity(); // 初始化相机 engine.run(); } /** * 初始化 AR */ public initAR(): void { const canvas = this._engine.canvas; // 初始化 AR ARManager.ins.create( this._engine, { mode: ARMode.Dof6, pixelWidth: canvas.width, pixelHeight: canvas.height, near: 0.01, far: 500 }, () => { ARManager.ins.start(() => { Engine.registerFeature(ARFeature); this._root.createChild("arBg").addComponent(ARBackgroundControl); this.jump(GameState.InitScene); }); } ); } /** * 初始化场景 */ public initScene(): void { const { _root: root, _engine: engine } = this; // 初始化虚拟相机 const cameraEntity = root.createChild("Camera"); const camera = cameraEntity.addComponent(Camera); cameraEntity.addComponent(ARCameraControl); camera.priority = CameraRenderOrder.Scene; camera.cullingMask = Layer.Layer0; camera.clearFlags = CameraClearFlags.Depth; // 添加方向光 const lightEntity = root.createChild("light"); lightEntity.addComponent(DirectLight); lightEntity.transform.setPosition(5, 5, 5); lightEntity.transform.setRotation(-30, 20, 0); // 添加 glTF engine.resourceManager .load("https://gw.alipayobjects.com/os/OasisHub/e8f12dec-a894-4273-8342-1c0d3b634ef7/oasis-file/1666063418841/untitled.gltf") .then((glTF: GLTFResource) => { const boxEntity = root.createChild("glTF"); boxEntity.transform.setScale(500, 500, 500); const glTFRoot = glTF.defaultSceneRoot; boxEntity.addChild(glTFRoot); const { animations } = glTF; if (animations?.length) { glTFRoot.getComponent(Animator).play(animations[0].name); } }); } }