From e1ad62f785229e62b8b35efe4f3fe8248a36106a Mon Sep 17 00:00:00 2001 From: andyhall Date: Mon, 1 May 2023 17:16:39 +0900 Subject: [PATCH] Updates **many** jsdoc comments to improve generated docs Renames several internals to public: `rendering._engine` to `engine` `rendering._camera` to `camera` `rendering._scene` to `scene` `rendering._light` to `light` --- .eslintrc.js | 2 +- package.json | 1 + src/components/movement.js | 4 -- src/index.js | 27 ++++++---- src/lib/camera.js | 6 +-- src/lib/chunk.js | 5 +- src/lib/container.js | 14 +++--- src/lib/entities.js | 6 +-- src/lib/inputs.js | 7 +-- src/lib/objectMesher.js | 14 +++--- src/lib/physics.js | 7 +-- src/lib/registry.js | 9 ++-- src/lib/rendering.js | 93 +++++++++++++++++++---------------- src/lib/sceneOctreeManager.js | 8 ++- src/lib/terrainMaterials.js | 3 +- src/lib/terrainMesher.js | 13 +++-- src/lib/util.js | 28 +++++------ src/lib/world.js | 17 ++++--- tsconfig.json | 24 +++------ 19 files changed, 133 insertions(+), 155 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d263a6fb..dbc827f6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,7 +10,7 @@ module.exports = { "es6": true, }, "parserOptions": { - "ecmaVersion": 10, + "ecmaVersion": 13, "sourceType": "module", }, "rules": { diff --git a/package.json b/package.json index 12e27c2e..7cca8fe2 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "eslint": "^8.3.0", "js-beautify": "^1.14.0", "typedoc": "^0.24.6", + "typedoc-plugin-missing-exports": "^2.0.0", "typescript": "^5.0.4" }, "keywords": [ diff --git a/src/components/movement.js b/src/components/movement.js index 18a2fc58..222fec21 100644 --- a/src/components/movement.js +++ b/src/components/movement.js @@ -1,7 +1,3 @@ -/** - * @module - * @internal - */ import vec3 from 'gl-vec3' diff --git a/src/index.js b/src/index.js index 3185393a..c2db4bb6 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,3 @@ -/** @module noa */ /*! * noa: an experimental voxel game engine. @@ -18,8 +17,8 @@ import { Inputs } from './lib/inputs' import { Container } from './lib/container' import { Camera } from './lib/camera' import { Entities } from './lib/entities' -import ObjectMesher from './lib/objectMesher' -import TerrainMesher from './lib/terrainMesher' +import { ObjectMesher } from './lib/objectMesher' +import { TerrainMesher } from './lib/terrainMesher' import { Registry } from './lib/registry' import { Rendering } from './lib/rendering' import { Physics } from './lib/physics' @@ -73,12 +72,6 @@ var defaultOptions = { * child modules ({@link Rendering}, {@link Container}, etc). * See docs for each module for their options. * - * @emits tick(dt) - * @emits beforeRender(dt) - * @emits afterRender(dt) - * @emits targetBlockChanged(blockDesc) - * @emits addingTerrainMesh(mesh) - * @emits removingTerrainMesh(mesh) */ export class Engine extends EventEmitter { @@ -105,6 +98,20 @@ export class Engine extends EventEmitter { * originRebaseDistance: 25, * } * ``` + * + * **Events:** + * + `tick => (dt)` + * Tick update, `dt` is (fixed) tick duration in ms + * + `beforeRender => (dt)` + * `dt` is the time (in ms) since the most recent tick + * + `afterRender => (dt)` + * `dt` is the time (in ms) since the most recent tick + * + `targetBlockChanged => (blockInfo)` + * Emitted each time the user's targeted world block changes + * + `addingTerrainMesh => (mesh)` + * Alerts client about a terrain mesh being added to the scene + * + `removingTerrainMesh => (mesh)` + * Alerts client before a terrain mesh is removed. */ constructor(opts = {}) { super() @@ -313,7 +320,7 @@ export class Engine extends EventEmitter { win.noa = this win.vec3 = vec3 win.ndarray = ndarray - win.scene = this.rendering._scene + win.scene = this.rendering.scene } // add hooks to throw helpful errors when using deprecated methods diff --git a/src/lib/camera.js b/src/lib/camera.js index fe3e41c4..0b4da914 100644 --- a/src/lib/camera.js +++ b/src/lib/camera.js @@ -1,7 +1,3 @@ -/** - * The Camera class is found at [[Camera | `noa.camera`]]. - * @module noa.camera - */ import vec3 from 'gl-vec3' import aabb from 'aabb-3d' @@ -36,7 +32,7 @@ var originVector = vec3.create() * mouse sensitivity, and so on. * * This module uses the following default options (from the options - * object passed to the [[Engine]]): + * object passed to the {@link Engine}): * ```js * var defaults = { * inverseX: false, diff --git a/src/lib/chunk.js b/src/lib/chunk.js index 476f308a..dc170fb8 100644 --- a/src/lib/chunk.js +++ b/src/lib/chunk.js @@ -1,7 +1,3 @@ -/** - * @module - * @internal - */ import { LocationQueue } from './util' import ndarray from 'ndarray' @@ -73,6 +69,7 @@ export function Chunk(noa, requestID, ci, cj, ck, size, dataArray, fillVoxelID = this._timesMeshed = 0 // location queue of voxels in this chunk with block handlers (assume it's rare) + /** @internal */ this._blockHandlerLocs = new LocationQueue() // passes through voxel contents, calling block handlers etc. diff --git a/src/lib/container.js b/src/lib/container.js index 874ee13f..c2cb7201 100644 --- a/src/lib/container.js +++ b/src/lib/container.js @@ -1,7 +1,3 @@ -/** - * The Container class is found at [[Container | `noa.container`]]. - * @module noa.container - */ import { EventEmitter } from 'events' import { MicroGameShell } from 'micro-game-shell' @@ -16,9 +12,13 @@ import { MicroGameShell } from 'micro-game-shell' * * This module wraps `micro-game-shell`, which does most of the implementation. * - * @emits DOMready - * @emits gainedPointerLock - * @emits lostPointerLock + * **Events** + * + `DOMready => ()` + * Relays the browser DOMready event, after noa does some initialization + * + `gainedPointerLock => ()` + * Fires when the game container gains pointerlock. + * + `lostPointerLock => ()` + * Fires when the game container loses pointerlock. */ export class Container extends EventEmitter { diff --git a/src/lib/entities.js b/src/lib/entities.js index 47a6ba4f..5600907a 100644 --- a/src/lib/entities.js +++ b/src/lib/entities.js @@ -1,7 +1,3 @@ -/** - * The ECS manager, found at [[Entities | `noa.entities`]] or [[Entities | `noa.ents`]]. - * @module noa.entities - */ import ECS from 'ent-comp' import vec3 from 'gl-vec3' @@ -40,7 +36,7 @@ var defaultOptions = { * folder for examples. * * This module uses the following default options (from the options - * object passed to the [[Engine]]): + * object passed to the {@link Engine}): * * ```js * var defaults = { diff --git a/src/lib/inputs.js b/src/lib/inputs.js index d1de9c80..e59e538c 100644 --- a/src/lib/inputs.js +++ b/src/lib/inputs.js @@ -1,8 +1,3 @@ -/** - * The Inputs class is found at [[Inputs | `noa.inputs`]]. - * @module noa.inputs - */ - import { GameInputs } from 'game-inputs' @@ -32,7 +27,7 @@ var defaultBindings = { * for full docs. * * This module uses the following default options (from the options - * object passed to the [[Engine]]): + * object passed to the {@link Engine}): * * ```js * defaultBindings: { diff --git a/src/lib/objectMesher.js b/src/lib/objectMesher.js index 09a9a341..aeedc882 100644 --- a/src/lib/objectMesher.js +++ b/src/lib/objectMesher.js @@ -1,13 +1,8 @@ -/** - * @module - * @internal exclude this file from API docs -*/ import { TransformNode } from '@babylonjs/core/Meshes/transformNode' import { makeProfileHook } from './util' import '@babylonjs/core/Meshes/thinInstanceMesh' -export default ObjectMesher var PROFILE = 0 @@ -26,11 +21,14 @@ var PROFILE = 0 */ -/** @param {import('../index').Engine} noa*/ -function ObjectMesher(noa) { +/** + * @internal + * @param {import('../index').Engine} noa +*/ +export function ObjectMesher(noa) { // transform node for all instance meshes to be parented to - this.rootNode = new TransformNode('objectMeshRoot', noa.rendering._scene) + this.rootNode = new TransformNode('objectMeshRoot', noa.rendering.scene) // tracking rebase amount inside matrix data var rebaseOffset = [0, 0, 0] diff --git a/src/lib/physics.js b/src/lib/physics.js index bbfa825b..b77bb1b5 100644 --- a/src/lib/physics.js +++ b/src/lib/physics.js @@ -1,8 +1,3 @@ -/** - * The Physics class is found at [[Physics | `noa.physics`]]. - * @module noa.physics - */ - import { Physics as VoxelPhysics } from 'voxel-physics-engine' @@ -23,7 +18,7 @@ var defaultOptions = { * for full docs. * * This module uses the following default options (from the options - * object passed to the [[Engine]]): + * object passed to the {@link Engine}): * * ```js * { diff --git a/src/lib/registry.js b/src/lib/registry.js index 6ecbc3c2..7011f9e5 100644 --- a/src/lib/registry.js +++ b/src/lib/registry.js @@ -1,7 +1,3 @@ -/** - * The Registry class is found at [[Registry | `noa.registry`]]. - * @module noa.registry - */ var defaults = { @@ -20,7 +16,7 @@ var MAX_BLOCK_ID = (1 << 16) - 1 * materials, properties, and events. * * This module uses the following default options (from the options - * object passed to the [[Engine]]): + * object passed to the {@link Engine}): * * ```js * var defaults = { @@ -178,7 +174,7 @@ export class Registry { this.registerMaterial = function (name = '?', options = null) { // catch calls to earlier signature - if (Array.isArray(options) || arguments[2]) { + if (Array.isArray(options)) { throw 'This API changed signatures in v0.33, please use: `noa.registry.registerMaterial("name", optionsObj)`' } @@ -266,6 +262,7 @@ export class Registry { /** * Given a texture URL, does any material using that * texture need alpha? + * @internal * @returns {boolean} */ this._textureNeedsAlpha = function (tex = '') { diff --git a/src/lib/rendering.js b/src/lib/rendering.js index 27d2469b..ef8e9848 100644 --- a/src/lib/rendering.js +++ b/src/lib/rendering.js @@ -1,7 +1,3 @@ -/** - * The Rendering class is found at [[Rendering | `noa.rendering`]]. - * @module noa.rendering - */ import glvec3 from 'gl-vec3' import { makeProfileHook } from './util' @@ -50,7 +46,7 @@ var defaults = { * Manages all rendering, and the BABYLON scene, materials, etc. * * This module uses the following default options (from the options - * object passed to the [[Engine]]): + * object passed to the {@link Engine}): * ```js * { * showFPS: false, @@ -95,14 +91,17 @@ export class Rendering { /** @internal */ this.meshingCutoffTime = 6 // ms - // set up babylon scene - /** @internal */ - this._scene = null - /** @internal */ - this._engine = null - /** @internal */ - this._octreeManager = null - this.initScene(canvas, opts) + /** the Babylon.js Engine object for the scene */ + this.engine = null + /** the Babylon.js Scene object for the world */ + this.scene = null + /** a Babylon.js DirectionalLight that is added to the scene */ + this.light = null + /** the Babylon.js FreeCamera that renders the scene */ + this.camera = null + + // sets up babylon scene, lights, etc + this._initScene(canvas, opts) // for debugging if (opts.showFPS) setUpFPS() @@ -111,15 +110,18 @@ export class Rendering { - // Constructor helper - set up the Babylon.js scene and basic components - initScene(canvas, opts) { + /** + * Constructor helper - set up the Babylon.js scene and basic components + * @internal + */ + _initScene(canvas, opts) { // init internal properties - this._engine = new Engine(canvas, opts.antiAlias, { + this.engine = new Engine(canvas, opts.antiAlias, { preserveDrawingBuffer: opts.preserveDrawingBuffer, }) - this._scene = new Scene(this._engine) - var scene = this._scene + var scene = new Scene(this.engine) + this.scene = scene // remove built-in listeners scene.detachControl() @@ -129,33 +131,38 @@ export class Rendering { // octree manager class var blockSize = Math.round(opts.octreeBlockSize) + /** @internal */ this._octreeManager = new SceneOctreeManager(this, blockSize) // camera, and a node to hold it and accumulate rotations + /** @internal */ this._cameraHolder = new TransformNode('camHolder', scene) - this._camera = new FreeCamera('camera', new Vector3(0, 0, 0), scene) - this._camera.parent = this._cameraHolder - this._camera.minZ = .01 + this.camera = new FreeCamera('camera', new Vector3(0, 0, 0), scene) + this.camera.parent = this._cameraHolder + this.camera.minZ = .01 // plane obscuring the camera - for overlaying an effect on the whole view + /** @internal */ this._camScreen = CreatePlane('camScreen', { size: 10 }, scene) this.addMeshToScene(this._camScreen) this._camScreen.position.z = .1 - this._camScreen.parent = this._camera + this._camScreen.parent = this.camera + /** @internal */ this._camScreenMat = this.makeStandardMaterial('camera_screen_mat') this._camScreen.material = this._camScreenMat this._camScreen.setEnabled(false) this._camScreenMat.freeze() + /** @internal */ this._camLocBlock = 0 // apply some defaults - var lightVec = Vector3.FromArray(opts.lightVector) - this._light = new DirectionalLight('light', lightVec, scene) - scene.clearColor = Color4.FromArray(opts.clearColor) scene.ambientColor = Color3.FromArray(opts.ambientColor) - this._light.diffuse = Color3.FromArray(opts.lightDiffuse) - this._light.specular = Color3.FromArray(opts.lightSpecular) + + var lightVec = Vector3.FromArray(opts.lightVector) + this.light = new DirectionalLight('light', lightVec, scene) + this.light.diffuse = Color3.FromArray(opts.lightDiffuse) + this.light.specular = Color3.FromArray(opts.lightSpecular) // scene options scene.skipPointerMovePicking = true @@ -171,7 +178,7 @@ export class Rendering { /** The Babylon `scene` object representing the game world. */ Rendering.prototype.getScene = function () { - return this._scene + return this.scene } // per-tick listener for rendering-related stuff @@ -188,12 +195,12 @@ Rendering.prototype.render = function () { profile_hook('start') updateCameraForRender(this) profile_hook('updateCamera') - this._engine.beginFrame() + this.engine.beginFrame() profile_hook('beginFrame') - this._scene.render() + this.scene.render() profile_hook('render') fps_hook() - this._engine.endFrame() + this.engine.endFrame() profile_hook('endFrame') profile_hook('end') } @@ -207,9 +214,9 @@ Rendering.prototype.postRender = function () { /** @internal */ Rendering.prototype.resize = function () { - this._engine.resize() + this.engine.resize() if (this.noa._paused && this.renderOnResize) { - this._scene.render() + this.scene.render() } } @@ -245,7 +252,7 @@ var hlpos = [] * Adds a mesh to the engine's selection/octree logic so that it renders. * * @param mesh the mesh to add to the scene - * @param isStatic pass in true if mesh never moves (i.e. change octree blocks) + * @param isStatic pass in true if mesh never moves (i.e. never changes chunks) * @param pos (optional) global position where the mesh should be * @param containingChunk (optional) chunk to which the mesh is statically bound */ @@ -307,7 +314,7 @@ Rendering.prototype.setMeshVisibility = function (mesh, visible = false) { * @returns {StandardMaterial} */ Rendering.prototype.makeStandardMaterial = function (name) { - var mat = new StandardMaterial(name, this._scene) + var mat = new StandardMaterial(name, this.scene) mat.specularColor.copyFromFloats(0, 0, 0) mat.ambientColor.copyFromFloats(1, 1, 1) mat.diffuseColor.copyFromFloats(1, 1, 1) @@ -357,7 +364,7 @@ Rendering.prototype.disposeChunkForRendering = function (chunk) { Rendering.prototype._rebaseOrigin = function (delta) { var dvec = new Vector3(delta[0], delta[1], delta[2]) - this._scene.meshes.forEach(mesh => { + this.scene.meshes.forEach(mesh => { // parented meshes don't live in the world coord system if (mesh.parent) return @@ -386,7 +393,7 @@ function updateCameraForRender(self) { self._cameraHolder.position.copyFromFloats(tgtLoc[0], tgtLoc[1], tgtLoc[2]) self._cameraHolder.rotation.x = cam.pitch self._cameraHolder.rotation.y = cam.heading - self._camera.position.z = -cam.currentZoom + self.camera.position.z = -cam.currentZoom // applies screen effect when camera is inside a transparent voxel var cloc = cam._localGetPosition() @@ -432,7 +439,7 @@ function checkCameraEffect(self, id) { function getHighlightMesh(rendering) { var mesh = rendering._highlightMesh if (!mesh) { - mesh = CreatePlane("highlight", { size: 1.0 }, rendering._scene) + mesh = CreatePlane("highlight", { size: 1.0 }, rendering.scene) var hlm = rendering.makeStandardMaterial('block_highlight_mat') hlm.backFaceCulling = false hlm.emissiveColor = new Color3(1, 1, 1) @@ -450,7 +457,7 @@ function getHighlightMesh(rendering) { new Vector3(-s, s, 0), new Vector3(s, s, 0) ] - }, rendering._scene) + }, rendering.scene) lines.color = new Color3(1, 1, 1) lines.parent = mesh @@ -477,13 +484,13 @@ function getHighlightMesh(rendering) { */ /** @internal */ Rendering.prototype.debug_SceneCheck = function () { - var meshes = this._scene.meshes - var octree = this._scene._selectionOctree + var meshes = this.scene.meshes + var octree = this.scene._selectionOctree var dyns = octree.dynamicContent var octs = [] var numOcts = 0 var numSubs = 0 - var mats = this._scene.materials + var mats = this.scene.materials var allmats = [] mats.forEach(mat => { // @ts-ignore @@ -549,7 +556,7 @@ Rendering.prototype.debug_SceneCheck = function () { /** @internal */ Rendering.prototype.debug_MeshCount = function () { var ct = {} - this._scene.meshes.forEach(m => { + this.scene.meshes.forEach(m => { var n = m.name || '' n = n.replace(/-\d+.*/, '#') n = n.replace(/\d+.*/, '#') diff --git a/src/lib/sceneOctreeManager.js b/src/lib/sceneOctreeManager.js index e127b438..88c522ec 100644 --- a/src/lib/sceneOctreeManager.js +++ b/src/lib/sceneOctreeManager.js @@ -1,7 +1,3 @@ -/** - * @module - * @internal exclude this file from API docs -*/ import { Vector3 } from '@babylonjs/core/Maths/math.vector' import { Octree } from '@babylonjs/core/Culling/Octrees/octree' @@ -21,10 +17,12 @@ import { locationHasher, removeUnorderedListItem } from './util' * */ +/** @internal */ export class SceneOctreeManager { + /** @internal */ constructor(rendering, blockSize) { - var scene = rendering._scene + var scene = rendering.scene scene._addComponent(new OctreeSceneComponent(scene)) // mesh metadata flags diff --git a/src/lib/terrainMaterials.js b/src/lib/terrainMaterials.js index ca2704e6..bda32ee2 100644 --- a/src/lib/terrainMaterials.js +++ b/src/lib/terrainMaterials.js @@ -5,8 +5,6 @@ import { MaterialPluginBase } from '@babylonjs/core/Materials/materialPluginBase import { RawTexture2DArray } from '@babylonjs/core/Materials/Textures/rawTexture2DArray' /** - * @module - * @internal exclude this file from API docs * * * This module creates and manages Materials for terrain meshes. @@ -14,6 +12,7 @@ import { RawTexture2DArray } from '@babylonjs/core/Materials/Textures/rawTexture * the same material (and should thus be joined into a single mesh), * and also creates the materials when needed. * + * @internal */ export class TerrainMatManager { diff --git a/src/lib/terrainMesher.js b/src/lib/terrainMesher.js index 3e7b47ff..362d3f79 100644 --- a/src/lib/terrainMesher.js +++ b/src/lib/terrainMesher.js @@ -1,12 +1,9 @@ -/** - * @module - * @internal exclude this file from API docs -*/ import ndarray from 'ndarray' import { Mesh } from '@babylonjs/core/Meshes/mesh' import { VertexData } from '@babylonjs/core/Meshes/mesh.vertexData' import { TerrainMatManager } from './terrainMaterials' +import { makeProfileHook } from './util' @@ -31,8 +28,11 @@ var PROFILE_EVERY = 0 */ -/** @param {import('../index').Engine} noa */ -export default function TerrainMesher(noa) { +/** + * @internal + * @param {import('../index').Engine} noa +*/ +export function TerrainMesher(noa) { // wrangles which block materials can be merged into the same mesh var terrainMatManager = new TerrainMatManager(noa) @@ -979,7 +979,6 @@ function unpackAOMask(aomask) { -import { makeProfileHook } from './util' var profile_hook = (PROFILE_EVERY) ? makeProfileHook(PROFILE_EVERY, 'Meshing') : () => { } diff --git a/src/lib/util.js b/src/lib/util.js index d41ec92e..8e22bc21 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -1,7 +1,5 @@ -/** - * @module - * @internal exclude this file from API docs -*/ + + // helper to swap item to end and pop(), instead of splice()ing @@ -139,21 +137,22 @@ export function locationHasher(i, j, k) { * */ -export function ChunkStorage() { - var hash = {} +/** @internal */ +export class ChunkStorage { + constructor() { + this.hash = {} + } /** @returns {import('./chunk').Chunk} */ - this.getChunkByIndexes = (i = 0, j = 0, k = 0) => { - return hash[locationHasher(i, j, k)] || null + getChunkByIndexes(i = 0, j = 0, k = 0) { + return this.hash[locationHasher(i, j, k)] || null } - /** @param {import('./chunk').Chunk} chunk */ - this.storeChunkByIndexes = (i = 0, j = 0, k = 0, chunk) => { - hash[locationHasher(i, j, k)] = chunk + storeChunkByIndexes(i = 0, j = 0, k = 0, chunk) { + this.hash[locationHasher(i, j, k)] = chunk } - - this.removeChunkByIndexes = (i = 0, j = 0, k = 0) => { - delete hash[locationHasher(i, j, k)] + removeChunkByIndexes(i = 0, j = 0, k = 0) { + delete this.hash[locationHasher(i, j, k)] } } @@ -170,6 +169,7 @@ export function ChunkStorage() { * */ +/** @internal */ export class LocationQueue { constructor() { this.arr = [] diff --git a/src/lib/world.js b/src/lib/world.js index 1dffbb23..d81f7a6b 100644 --- a/src/lib/world.js +++ b/src/lib/world.js @@ -1,8 +1,3 @@ -/** - * The World class is found at [[World | `noa.world`]]. - * @module noa.world - */ - import EventEmitter from 'events' import { Chunk } from './chunk' @@ -28,7 +23,7 @@ var defaultOptions = { * `noa.world` - manages world data, chunks, voxels. * * This module uses the following default options (from the options - * object passed to the [[Engine]]): + * object passed to the {@link Engine}): * ```js * var defaultOptions = { * chunkSize: 24, @@ -38,6 +33,16 @@ var defaultOptions = { * manuallyControlChunkLoading: false, * } * ``` + * + * **Events:** + * + `worldDataNeeded = (requestID, dataArr, x, y, z, worldName)` + * Alerts client that a new chunk of world data is needed. + * + `playerEnteredChunk => (i, j, k)` + * Fires when player enters a new chunk + * + `chunkAdded => (chunk)` + * Fires after a new chunk object is added to the world + * + `chunkBeingRemoved = (requestID, dataArr, userData)` + * Fires before a chunk is removed from world */ export class World extends EventEmitter { diff --git a/tsconfig.json b/tsconfig.json index 3f4bdc01..27ede9ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -39,27 +39,19 @@ "typedocOptions": { "entryPoints": [ "src/index.js", - "src/lib/", - "src/components/movement.js", - "src/components/physics.js", - "src/components/position.js", + ], + "plugin": [ + "typedoc-plugin-missing-exports", ], "entryPointStrategy": "expand", "name": "noa API reference", "out": "docs/API", "readme": "docs/api-header.md", - "excludeInternal": true, - "includeVersion": true, + "excludeInternal": true, // excludes stuff tagged @internal + "excludeExternals": true, // excludes imports matching below + "externalPattern": [ + "node_modules/!(game-inputs|voxel-physics-engine)/**", + ], "disableSources": true, - "intentionallyNotExported": [ - "ECS", - "EventEmitter", - "MovementState", - "PhysicsState", - "PositionState", - "MatDef", - "MaterialOptions", - "BlockOptions", - ] }, }