From 8e073effa84835d81e7e1388a5fe4f635155febb Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Sun, 4 Jun 2023 09:33:36 +0300 Subject: [PATCH] add license, more objects --- LICENSE | 19 ++++++ README.md | 11 +++ package.json | 4 +- packages/client/package.json | 2 + packages/editor/package.json | 2 + packages/editor/src/editor/core/editor.ts | 1 + packages/editor/src/editor/core/workspace.ts | 17 +++-- packages/engine/package.json | 2 +- packages/engine/src/components/environment.ts | 5 +- packages/engine/src/core/renderer.ts | 4 ++ .../engine/src/gameobjects/brick.object.ts | 24 ++++--- packages/engine/src/gameobjects/factory.ts | 41 ++++++++++++ packages/engine/src/gameobjects/index.ts | 3 + .../src/gameobjects/wedge-corner.object.ts | 13 ++++ .../gameobjects/wedge-inner-corner.object.ts | 13 ++++ .../engine/src/gameobjects/wedge.object.ts | 13 ++++ packages/engine/src/types/game-object.ts | 67 ++++++++++++++++--- 17 files changed, 212 insertions(+), 29 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 packages/engine/src/gameobjects/wedge-corner.object.ts create mode 100644 packages/engine/src/gameobjects/wedge-inner-corner.object.ts create mode 100644 packages/engine/src/gameobjects/wedge.object.ts diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2f72dcf --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2023 Evert Prants + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..db9d431 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Freeblox monorepo + +Simple game platform front-end powered by THREE.js and Vue. + +## Develop + +1. Install PNPM `npm i -g pnpm`. +2. Install dependencies `pnpm install`. +3. Watch engine changes `pnpm --filter engine dev` +4. Watch editor changes `pnpm --filter editor dev` +5. Watch client changes `pnpm --filter client dev` diff --git a/package.json b/package.json index a06edf2..a839b2e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,6 @@ "pnpm": ">=6" }, "keywords": [], - "author": "", - "license": "ISC" + "author": "Evert Prants ", + "license": "MIT" } diff --git a/packages/client/package.json b/packages/client/package.json index b8c6fbe..b9c9345 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -13,6 +13,8 @@ "require": "./dist/client.umd.cjs" } }, + "author": "Evert Prants ", + "license": "MIT", "scripts": { "dev": "vite", "build": "vue-tsc && vite build", diff --git a/packages/editor/package.json b/packages/editor/package.json index f9e2524..d956d47 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -13,6 +13,8 @@ "require": "./dist/editor.umd.cjs" } }, + "author": "Evert Prants ", + "license": "MIT", "scripts": { "dev": "vite", "build": "vue-tsc && vite build", diff --git a/packages/editor/src/editor/core/editor.ts b/packages/editor/src/editor/core/editor.ts index 0bc3531..8c74f8a 100644 --- a/packages/editor/src/editor/core/editor.ts +++ b/packages/editor/src/editor/core/editor.ts @@ -62,5 +62,6 @@ export class Editor extends GameRunner { this.viewport.cleanUp(); this.workspace.cleanUp(); this.mouse.cleanUp(); + this.render.cleanUp(); } } diff --git a/packages/editor/src/editor/core/workspace.ts b/packages/editor/src/editor/core/workspace.ts index d3f5412..7328632 100644 --- a/packages/editor/src/editor/core/workspace.ts +++ b/packages/editor/src/editor/core/workspace.ts @@ -7,6 +7,9 @@ import { MouseButtonEvent, Renderer, Sphere, + Wedge, + WedgeCorner, + WedgeInnerCorner, } from '@freeblox/engine'; import { AxesHelper, @@ -70,12 +73,18 @@ export class WorkspaceComponent extends EngineComponent { scene.add(this.background, this.world, this.helpers); const test = new Brick(); - test.position.set(2, 2, 2); + test.position.set(2, 0, 2); const test2 = new Cylinder(); - test2.position.set(0, 2, 2); + test2.position.set(0, 0, 2); const test3 = new Sphere(); - test3.position.set(0, 2, 0); - this.world.add(test, test2, test3); + test3.position.set(0, 0, 0); + const test4 = new Wedge(); + test4.position.set(2, 0, 0); + const test5 = new WedgeCorner(); + test5.position.set(4, 0, 0); + const test6 = new WedgeInnerCorner(); + test6.position.set(4, 0, 2); + this.world.add(test, test2, test3, test4, test5, test6); } private removeFromScene(scene: Object3D) { diff --git a/packages/engine/package.json b/packages/engine/package.json index f4f6d7c..a3f6b53 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -15,7 +15,7 @@ "engine", "three" ], - "author": "Evert", + "author": "Evert Prants ", "license": "MIT", "devDependencies": { "@types/three": "^0.152.1", diff --git a/packages/engine/src/components/environment.ts b/packages/engine/src/components/environment.ts index ab489f6..22b1582 100644 --- a/packages/engine/src/components/environment.ts +++ b/packages/engine/src/components/environment.ts @@ -25,12 +25,11 @@ export class EnvironmentComponent extends EngineComponent { this.renderer.scene.add(this.ambient); this.renderer.scene.add(this.directional); - } - - update(delta: number): void { this.handlerCleanUp = this.initializeEvents(); } + update(delta: number): void {} + cleanUp(): void { this.renderer.scene.remove(this.ambient); this.renderer.scene.remove(this.directional); diff --git a/packages/engine/src/core/renderer.ts b/packages/engine/src/core/renderer.ts index 22dac26..01ab6c1 100644 --- a/packages/engine/src/core/renderer.ts +++ b/packages/engine/src/core/renderer.ts @@ -28,4 +28,8 @@ export class Renderer { render() { this.renderer.render(this.scene, this.camera); } + + cleanUp() { + this.renderer.dispose(); + } } diff --git a/packages/engine/src/gameobjects/brick.object.ts b/packages/engine/src/gameobjects/brick.object.ts index 9461d52..81f57d0 100644 --- a/packages/engine/src/gameobjects/brick.object.ts +++ b/packages/engine/src/gameobjects/brick.object.ts @@ -6,26 +6,30 @@ import { Mesh, MeshPhongMaterial, } from 'three'; -import { GameObject3D } from '../types/game-object'; +import { + EditorProperties, + GameObject3D, + gameObject3DEditorProperties, +} from '../types/game-object'; import { Property } from '../types/property'; import { gameObjectFactory } from './factory'; +export const brickEditorProperties: EditorProperties = { + ...gameObject3DEditorProperties, + color: new Property('color', Color, true, []), + transparency: new Property('transparency', Number, true, []), +}; + export class Brick extends GameObject3D { public objectType = Brick.name; protected material = new MeshPhongMaterial(); protected mesh: Mesh = new Mesh(this.geometry, this.material); constructor( - protected geometry: BufferGeometry = gameObjectFactory.boxGeometry + protected geometry: BufferGeometry = gameObjectFactory.boxGeometry, + public editorProperties: EditorProperties = brickEditorProperties ) { - super(); - this.editorProperties.color = new Property('color', Color, true, []); - this.editorProperties.transparency = new Property( - 'transparency', - Number, - true, - [] - ); + super(editorProperties); this.add(this.mesh); } diff --git a/packages/engine/src/gameobjects/factory.ts b/packages/engine/src/gameobjects/factory.ts index 1fb9689..43ca663 100644 --- a/packages/engine/src/gameobjects/factory.ts +++ b/packages/engine/src/gameobjects/factory.ts @@ -4,6 +4,47 @@ class GameObjectFactory { public boxGeometry = new BoxGeometry(); public sphereGeometry = new SphereGeometry(0.5); public cylinderGeometry = new CylinderGeometry(0.5, 0.5); + public wedgeGeometry = new BoxGeometry(); + public wedgeCornerGeometry = new BoxGeometry(); + public wedgeInnerCornerGeometry = new BoxGeometry(); + + constructor() { + this.makeProceduralShapes(); + this.finalize(); + } + + private makeProceduralShapes() { + const pos = this.wedgeGeometry.attributes.position; + for (let i = 0; i < pos.count; i++) { + if (pos.getX(i) < 0 && pos.getY(i) > 0) pos.setY(i, -0.5); + } + this.wedgeGeometry.computeVertexNormals(); + + const pos2 = this.wedgeCornerGeometry.attributes.position; + for (let i = 0; i < pos2.count; i++) { + if (pos2.getY(i) > 0 && (pos2.getX(i) !== 0.5 || pos2.getZ(i) !== -0.5)) { + pos2.setY(i, -0.5); + } + } + this.wedgeCornerGeometry.computeVertexNormals(); + + const pos3 = this.wedgeInnerCornerGeometry.attributes.position; + for (let i = 0; i < pos3.count; i++) { + if (pos3.getY(i) > 0 && pos3.getX(i) === 0.5 && pos3.getZ(i) === 0.5) { + pos3.setY(i, -0.5); + } + } + this.wedgeInnerCornerGeometry.computeVertexNormals(); + } + + private finalize() { + this.boxGeometry.computeBoundingBox(); + this.sphereGeometry.computeBoundingBox(); + this.cylinderGeometry.computeBoundingBox(); + this.wedgeGeometry.computeBoundingBox(); + this.wedgeCornerGeometry.computeBoundingBox(); + this.wedgeInnerCornerGeometry.computeBoundingBox(); + } } export const gameObjectFactory = new GameObjectFactory(); diff --git a/packages/engine/src/gameobjects/index.ts b/packages/engine/src/gameobjects/index.ts index f1d3c03..e79194a 100644 --- a/packages/engine/src/gameobjects/index.ts +++ b/packages/engine/src/gameobjects/index.ts @@ -1,3 +1,6 @@ export * from './brick.object'; export * from './cylinder.object'; export * from './sphere.object'; +export * from './wedge.object'; +export * from './wedge-corner.object'; +export * from './wedge-inner-corner.object'; diff --git a/packages/engine/src/gameobjects/wedge-corner.object.ts b/packages/engine/src/gameobjects/wedge-corner.object.ts new file mode 100644 index 0000000..477f6d9 --- /dev/null +++ b/packages/engine/src/gameobjects/wedge-corner.object.ts @@ -0,0 +1,13 @@ +import { Mesh, Color } from 'three'; +import { Property } from '../types/property'; +import { Brick } from './brick.object'; +import { gameObjectFactory } from './factory'; + +export class WedgeCorner extends Brick { + public objectType = WedgeCorner.name; + protected mesh = new Mesh(this.geometry, this.material); + + constructor() { + super(gameObjectFactory.wedgeCornerGeometry); + } +} diff --git a/packages/engine/src/gameobjects/wedge-inner-corner.object.ts b/packages/engine/src/gameobjects/wedge-inner-corner.object.ts new file mode 100644 index 0000000..eaa8203 --- /dev/null +++ b/packages/engine/src/gameobjects/wedge-inner-corner.object.ts @@ -0,0 +1,13 @@ +import { Mesh, Color } from 'three'; +import { Property } from '../types/property'; +import { Brick } from './brick.object'; +import { gameObjectFactory } from './factory'; + +export class WedgeInnerCorner extends Brick { + public objectType = WedgeInnerCorner.name; + protected mesh = new Mesh(this.geometry, this.material); + + constructor() { + super(gameObjectFactory.wedgeInnerCornerGeometry); + } +} diff --git a/packages/engine/src/gameobjects/wedge.object.ts b/packages/engine/src/gameobjects/wedge.object.ts new file mode 100644 index 0000000..3e0155c --- /dev/null +++ b/packages/engine/src/gameobjects/wedge.object.ts @@ -0,0 +1,13 @@ +import { Mesh, Color } from 'three'; +import { Property } from '../types/property'; +import { Brick } from './brick.object'; +import { gameObjectFactory } from './factory'; + +export class Wedge extends Brick { + public objectType = Wedge.name; + protected mesh = new Mesh(this.geometry, this.material); + + constructor() { + super(gameObjectFactory.wedgeGeometry); + } +} diff --git a/packages/engine/src/types/game-object.ts b/packages/engine/src/types/game-object.ts index 02c6b37..f321cb2 100644 --- a/packages/engine/src/types/game-object.ts +++ b/packages/engine/src/types/game-object.ts @@ -1,19 +1,68 @@ import { Euler, Object3D, Vector3 } from 'three'; import { Property } from './property'; +export type EditorProperties = { [x: string]: Property }; +export const gameObjectEditorProperties: EditorProperties = { + name: new Property('name', String, true, []), + visible: new Property('visible', Boolean, true, []), +}; + +export const gameObject3DEditorProperties: EditorProperties = { + ...gameObjectEditorProperties, + position: new Property('position', Vector3, true, []), + scale: new Property('scale', Vector3, true, []), + rotation: new Property('rotation', Euler, true, []), +}; + export class GameObject extends Object3D { public objectType = 'GameObject'; - public editorProperties: { [x: string]: Property } = { - name: new Property('name', String, true, []), - }; + constructor( + public editorProperties: EditorProperties = gameObjectEditorProperties + ) { + super(); + } + + /** + * Serialize GameObject for exporting + */ + serialize() { + const object: SerializedObject = { + name: this.name, + objectType: this.objectType, + children: this.children + .filter((entry) => entry instanceof GameObject) + .map((entry) => (entry as GameObject).serialize()), + visible: this.visible, + }; + + const keys = Object.keys(this.editorProperties); + + Object.assign( + object, + keys.reduce<{ [x: string]: unknown }>( + (obj, key) => ({ + ...obj, + [key]: (this as Record)[key], + }), + {} + ) + ); + + return object; + } } export class GameObject3D extends GameObject { public objectType = 'GameObject3D'; - public editorProperties: { [x: string]: Property } = { - name: new Property('name', String, true, []), - position: new Property('position', Vector3, true, []), - scale: new Property('scale', Vector3, true, []), - rotation: new Property('rotation', Euler, true, []), - }; + constructor(public editorProperties = gameObject3DEditorProperties) { + super(editorProperties); + } +} + +export interface SerializedObject { + [x: string]: unknown; + name: string; + objectType: string; + children: SerializedObject[]; + visible: boolean; }