noa-engine
Version:
Experimental voxel game engine
61 lines (43 loc) • 1.63 kB
JavaScript
import vec3 from 'gl-vec3'
export default function (noa) {
return {
name: 'mesh',
order: 100,
state: {
mesh: null,
offset: null
},
onAdd: function (eid, state) {
// implicitly assume there's already a position component
var posDat = noa.ents.getPositionData(eid)
if (state.mesh) {
noa.rendering.addMeshToScene(state.mesh, false, posDat.position)
} else {
throw new Error('Mesh component added without a mesh - probably a bug!')
}
if (!state.offset) state.offset = vec3.create()
// set mesh to correct position
var rpos = posDat._renderPosition
state.mesh.position.copyFromFloats(
rpos[0] + state.offset[0],
rpos[1] + state.offset[1],
rpos[2] + state.offset[2])
},
onRemove: function (eid, state) {
state.mesh.dispose()
},
renderSystem: function (dt, states) {
// before render move each mesh to its render position,
// set by the physics engine or driving logic
for (var i = 0; i < states.length; i++) {
var state = states[i]
var id = state.__id
var rpos = noa.ents.getPositionData(id)._renderPosition
state.mesh.position.copyFromFloats(
rpos[0] + state.offset[0],
rpos[1] + state.offset[1],
rpos[2] + state.offset[2])
}
}
}
}