noa-engine
An experimental voxel engine.
Usage
Under active development, best way to try it is to clone and hack on it:
(clone this repo)
cd noa
npm install
npm start # runs /examples/hello-world
npm test # runs /examples/test
Here are live versions of the examples:
To build a new world app, use noa
as a dependency:
npm install --save noa-engine
var engine = require('noa-engine')
var noa = engine({
inverseY: true,
// see source or examples for more options and usage
})
Docs
The source is pretty fully commented. There is a partial API reference at the end of this file, but I haven't been able to find a good way of generating JSDocs that I can live with, so for now it's best to consult the source.
Recent changes:
- 0.20.0
- Near chunks get loaded and distant ones get unloaded faster and more sensibly
- Greatly speeds up chunk init, meshing, and disposal (and fixes some new Chrome deopts)
- 0.19.0
- Revise per-block callbacks:
onLoad
when a block is created as part of a newly-loaded chunkonUnload
- when the block goes away because its chunk was unloadedonSet
- when a block gets set to that particular idonUnset
- when a block that had that id gets set to something elseonCustomMeshCreate
- when that block's custom mesh is instantiated (either due to load or set)
- Revise per-block callbacks:
- 0.18.0
- Simplifies block targeting. Instead of several accessor methods, now there's a persistent
noa.targetedBlock
with details on whatever block is currently targeted. noa
now emitstargetBlockChanged
- Built-in block highlighting can now be overridden or turned off with option
skipDefaultHighlighting
- Simplifies block targeting. Instead of several accessor methods, now there's a persistent
- 0.17.0
- Adds per-block callbacks:
onCreate
,onDestroy
,onCustomMeshCreate
- Adds per-block callbacks:
- 0.16.0
- Simplifies block registration - now takes an options argument, and the same API is used for custom mesh blocks
- Removes the idea of registration for meshes
Partial API reference:
noa
Main engine object.
Emits: tick, beforeRender, afterRender, targetBlockChanged
var noaEngine = require('noa-engine')
var noa = noaEngine(opts)
-
playerEntity - Entity id for the player entity
-
playerBody - reference to player entity's physics body
-
setPaused (paused) - Pausing the engine will also stop render/tick events, etc.
-
getBlock (x,y,z)
-
setBlock (x,y,z)
-
addBlock (id,x,y,z) - Adds a block unless obstructed by entities
-
getPlayerPosition()
-
getPlayerMesh()
-
setPlayerEyeOffset()
-
getPlayerEyePosition()
-
getCameraVector()
-
pick (pos, vec, dist) - Raycast through the world, returning a result object for any non-air block
noa.entities
Wrangles entities. This class is an instance of ECS, and as such implements the usual ECS methods. It's also decorated with helpers and accessor functions for getting component existence/state.
Expects entity definitions in a specific format - see source components
folder for examples.
-
names - Hash containing the component names of built-in components.
-
addComponentAgain (id,name,state)
-
isTerrainBlocked (x,y,z)
-
setEntitySize (x,y,z)
-
getEntitiesInAABB (box)
-
add (position, width, height..)
Helper to set up a general entity, and populate with some common components depending on arguments.
Parameters: position, width, height [, mesh, meshOffset, doPhysics, shadow]
noa.world
Module for managing the world, and its chunks
-
getBlockID (x,y,z)
-
getBlockSolidity (x,y,z)
-
getBlockOpacity (x,y,z)
-
getBlockTransparency (x,y,z)
-
getBlockFluidity (x,y,z)
-
getBlockProperties (x,y,z)
-
getBlockObjectMesh (x,y,z)
-
setBlockID (x,y,z)
-
isBoxUnobstructed (x,y,z)
-
setChunkData (id, array) - client should call this after creating a chunk's worth of data (as an ndarray)