/
Viewer.coffee
87 lines (78 loc) · 2.35 KB
/
Viewer.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
class Viewer
@FRAGMENT: 0
@VERTEX: 1
constructor: (@dom, @app) ->
@time = 0.0
@rotate = false
@currentModel = null
@rotateRate = 0.005
@renderer = new THREE.WebGLRenderer(antialias: on)
@canvas = @renderer.domElement
@dom.appendChild(@canvas)
@scene = new THREE.Scene()
@camera = new THREE.PerspectiveCamera(35, @dom.clientWidth/@dom.clientHeight, 1, 3000)
@controls = new THREE.OrbitControls(@camera, @dom)
@scene.add(@camera)
@loader = new THREE.JSONLoader()
@material = @defaultMaterial()
@loadModel('models/suzanne_high.js')
@onResize()
window.addEventListener('resize', (() => @onResize()), off)
update: ->
@controls.update()
@time += 0.001
@uniforms.time.value = @time
@model.rotation.y += @rotateRate if @model and @rotate
@renderer.render(@scene, @camera)
onResize: ->
if @camera
@camera.aspect = @dom.clientWidth/@dom.clientHeight
@camera.updateProjectionMatrix()
@camera.position.z = 900/@dom.clientWidth*4
@camera.lookAt(@scene.position)
if @uniforms
@uniforms.resolution.value.x = @dom.clientWidth
@uniforms.resolution.value.y = @dom.clientHeight
@renderer.setSize(@dom.clientWidth, @dom.clientHeight)
loadModel: (key) ->
@loader.load(key, (geo) =>
@initModel(geo, key)
)
@app.ui.showModelLoader()
initModel: (geo, key) ->
@currentModel = key
data = shdr.Models[key]
if @model?
old = @model.geometry
@scene.remove(@model)
old.dispose()
@model = new THREE.Mesh(geo, @material)
if data?
@model.scale.set(data.scale, data.scale, data.scale) if data.scale?
@scene.add(@model)
@app.ui.hideModelLoader()
updateShader: (shader, mode=Viewer.FRAGMENT) ->
if mode is Viewer.FRAGMENT
@fs = shader
@material.fragmentShader = shader
else
@vs = shader
@material.vertexShader = shader
@material.needsUpdate = true
defaultMaterial: ->
@uniforms =
time:
type: 'f'
value: 0.0
resolution:
type: 'v2'
value: new THREE.Vector2(@dom.clientWidth, @dom.clientHeight)
@vs = shdr.Snippets.DefaultVertex
@fs = shdr.Snippets.DefaultFragment
return new THREE.ShaderMaterial(
uniforms: @uniforms
vertexShader: @vs
fragmentShader: @fs
)
@shdr ||= {}
@shdr.Viewer = Viewer