forked from colinfizgig/aframe_Components
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrefract-cube-env.js
134 lines (114 loc) · 3.59 KB
/
refract-cube-env.js
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* Specifies an envMap on an entity, without replacing any existing material
* properties.
*/
AFRAME.registerComponent('refract-cube-env', {
schema: {
resolution: { type:'number', default: 128},
distance: {type:'number', default: 100000},
refractionratio: {type:'float', default: 1.1},
interval: { type:'number', default: 1000},
repeat: { type:'boolean', default: false}
},
/**
* Set if component needs multiple instancing.
*/
multiple: false,
/**
* Called once when component is attached. Generally for initial setup.
*/
init: function(){
this.counter = this.data.interval;
this.cam = new THREE.CubeCamera( 1.0, this.data.distance, this.data.resolution);
this.cam.renderTarget.texture.minFilter = THREE.LinearMipMapLinearFilter;
this.cam.renderTarget.texture.mapping = THREE.CubeRefractionMapping;
this.cam.renderTarget.texture.generateMipmaps = true;
this.el.object3D.add( this.cam );
this.done = false;
var myCam = this.cam;
var myRatio = this.data.refractionratio;
var myEl = this.el;
var myMesh = this.el.getObject3D('mesh');
this.el.addEventListener('model-loaded', () => {
// Grab the mesh / scene.
const obj = this.el.getObject3D('mesh');
// Go over the submeshes and modify materials we want.
obj.traverse(node => {
if (node.type.indexOf('Mesh') !== -1) {
node.material.envMap = myCam.renderTarget.texture;
node.material.refractionRatio = myRatio;
node.material.needsUpdate = true;
}
});
});
},
tick: function(t,dt){
if(!this.done){
if( this.counter > 0){
this.counter-=dt;
}else{
myRedraw(this.cam, this.el, this.el.getObject3D('mesh'));
if(!this.data.repeat){
this.done = true;
this.counter = this.data.interval;
}
}
}
function myRedraw(myCam, myEl, myMesh){
myMesh.visible = false;
AFRAME.scenes[0].renderer.autoClear = true;
var camVector = new THREE.Vector3();
myEl.object3D.getWorldPosition(camVector);
myCam.position.copy(myEl.object3D.worldToLocal(camVector));
myCam.update( AFRAME.scenes[0].renderer, myEl.sceneEl.object3D );
if(myMesh){
myMesh.traverse( function( child ) {
if ( child instanceof THREE.Mesh ) {
}
});
}
myMesh.visible = true;
}
},
/**
* Called when component is attached and when component data changes.
* Generally modifies the entity based on the data.
*/
update: function (oldData) {
myUpdate(this.cam, this.el, this.el.getObject3D('mesh'));
function myUpdate(myCam, myEl, myMesh){
myMesh.visible = false;
AFRAME.scenes[0].renderer.autoClear = true;
var camVector = new THREE.Vector3();
myEl.object3D.getWorldPosition(camVector);
myCam.position.copy(myEl.object3D.worldToLocal(camVector));
myCam.update( AFRAME.scenes[0].renderer, myEl.sceneEl.object3D );
if(myMesh){
myMesh.traverse( function( child ) {
if ( child instanceof THREE.Mesh ) {
}
});
}
myMesh.visible = true;
}
},
/**
* Called when a component is removed (e.g., via removeAttribute).
* Generally undoes all modifications to the entity.
*/
remove: function () {},
/**
* Called on each scene tick.
*/
// tick: function (t) { },
/**
* Called when entity pauses.
* Use to stop or remove any dynamic or background behavior such as events.
*/
pause: function () { },
/**
* Called when entity resumes.
* Use to continue or add any dynamic or background behavior such as events.
*/
play: function () { }
});