kiki/coffee/cage.coffee
monsterkodi 4f4d8556f0 levels
2016-08-25 01:26:09 +02:00

188 lines
7.7 KiB
CoffeeScript

# 0000000 0000000 0000000 00000000
# 000 000 000 000 000
# 000 000000000 000 0000 0000000
# 000 000 000 000 000 000
# 0000000 000 000 0000000 00000000
Material = require './material'
class Cage
constructor: (@size, gap) ->
Cage.gap = gap
geom = Cage.wallTiles @size, 'inside', 0
@raster = new THREE.Mesh geom, Material.raster
@raster.translateX -0.5
@raster.translateY -0.5
@raster.translateZ -0.5
@raster.receiveShadow = true
world.scene.add @raster
geom = Cage.wallTiles @size, 'inside', Cage.gap
@cage = new THREE.Mesh geom, Material.plate
@cage.translateX -0.5
@cage.translateY -0.5
@cage.translateZ -0.5
@cage.receiveShadow = true
world.scene.add @cage
del: ->
world.scene.remove @raster
world.scene.remove @cage
@wallTiles: (size, side, raster=Cage.gap) ->
faces = size.x * size.y * 2 + size.x * size.z * 2 + size.y * size.z * 2
triangles = faces * 2
positions = new Float32Array triangles * 3 * 3
normals = new Float32Array triangles * 3 * 3
s = 1-raster
o = raster
i = -1
offset = (side == 'outside' and -1 or 1) * raster/20
xyPlate = (x, y, z) ->
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z ; normals[i] = 1
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z ; normals[i] = 1
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z ; normals[i] = 1
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z ; normals[i] = 1
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z ; normals[i] = 1
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z ; normals[i] = 1
yxPlate = (x, y, z) ->
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z ; normals[i] = -1
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z ; normals[i] = -1
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z ; normals[i] = -1
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z ; normals[i] = -1
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z ; normals[i] = -1
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z ; normals[i] = -1
zxPlate = (x, y, z) ->
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y ; normals[i] = 1
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y ; normals[i] = 1
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y ; normals[i] = 1
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y ; normals[i] = 1
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y ; normals[i] = 1
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y ; normals[i] = 1
positions[i+=1] = z+s; normals[i] = 0
xzPlate = (x, y, z) ->
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y ; normals[i] = -1
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y ; normals[i] = -1
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y ; normals[i] = -1
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y ; normals[i] = -1
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x+o; normals[i] = 0
positions[i+=1] = y ; normals[i] = -1
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x+s; normals[i] = 0
positions[i+=1] = y ; normals[i] = -1
positions[i+=1] = z+o; normals[i] = 0
yzPlate = (x, y, z) ->
positions[i+=1] = x ; normals[i] = 1
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x ; normals[i] = 1
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x ; normals[i] = 1
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x ; normals[i] = 1
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x ; normals[i] = 1
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x ; normals[i] = 1
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z+s; normals[i] = 0
zyPlate = (x, y, z) ->
positions[i+=1] = x ; normals[i] = -1
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x ; normals[i] = -1
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x ; normals[i] = -1
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x ; normals[i] = -1
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z+o; normals[i] = 0
positions[i+=1] = x ; normals[i] = -1
positions[i+=1] = y+o; normals[i] = 0
positions[i+=1] = z+s; normals[i] = 0
positions[i+=1] = x ; normals[i] = -1
positions[i+=1] = y+s; normals[i] = 0
positions[i+=1] = z+s; normals[i] = 0
plates = side == 'outside' and [yxPlate, xyPlate, xzPlate, zxPlate, zyPlate, yzPlate] or [xyPlate, yxPlate, zxPlate, xzPlate, yzPlate, zyPlate]
for x in [0...size.x]
for y in [0...size.y]
plates[0] x, y, offset
plates[1] x, y, size.z - offset
for x in [0...size.x]
for z in [0...size.z]
plates[2] x, offset, z
plates[3] x, size.y - offset, z
for y in [0...size.y]
for z in [0...size.z]
plates[4] offset, y, z
plates[5] size.x-offset, y, z
geom = new THREE.BufferGeometry
geom.addAttribute 'position', new THREE.BufferAttribute positions, 3
geom.addAttribute 'normal', new THREE.BufferAttribute normals, 3
geom
module.exports = Cage