meta-client
Version:
redefining space
230 lines (181 loc) • 4.99 kB
JavaScript
//TODO no more globals!
//TODO there must be some more in WORLD: livings
import {Object3D, WebGLRenderer, Scene, PerspectiveCamera, CubeGeometry, MeshBasicMaterial, Mesh} from 'three';
import {CSS3DRenderer, CSS3DObject} from './lib/three/CSS3D';
import {Events} from './Utilities';
//WebGLRenderer
global.renderer = new WebGLRenderer({antialias:true})
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.sortObjects = false;
document.body.style.overflow = "hidden";
document.body.style.margin = "0";
document.body.style.padding = "0";
//CSS3D Renderer
global.renderer2 = new CSS3DRenderer();
renderer2.setSize(window.innerWidth, window.innerHeight);
renderer2.domElement.style.position = "fixed";
renderer2.domElement.style.left = "0";
renderer2.domElement.style.top = "0";
document.body.appendChild(renderer2.domElement);
//Livings
let livings = [];
//human
let HUMAN = false; //TODO NOT SO SWEET (see Device.js)
class World extends Object3D{
constructor(){
super();
if(typeof WORLD != 'undefined')
SCENE.remove(WORLD);
SCENE.add(this);
}
isFor(theGuy){
HUMAN = theGuy;
}
live(animation){
livings.push([animation]);
}
}
class Container extends Object3D{
constructor(){
super();
let that = this;
this.events = {};
return;
if(typeof HUMAN != undefined){
HUMAN.on('touch', (data) => {
if(data != undefined && data.object != undefined && data.object.parent != undefined && data.object.parent===that)
that.go('touch');
});
HUMAN.on('release', (data) => {
if(data != undefined && data.object != undefined && data.object.parent != undefined && data.object.parent===that)
that.go('release');
});
}
}
on(eventName, callback){
if(this.events[eventName]){
this.events[eventName].push(callback);
}else{
this.events[eventName] = [callback];
}
}
go(eventName, ...rest){
if(this.events[eventName]){
this.events[eventName].forEach(cb =>{
cb(...rest);
})
}
}
live(animation){
livings.push(animation);
}
}
let theHuman = false;
class F {
constructor(){
console.log('there is an F now.')
}
static what(){
console.log('you are able to make an F');
}
}
F.what();
class Matter extends Mesh {
constructor( geometry, material){
super( geometry, material);
let that = this;
this.events = {};
livings.push([]);
this.living = livings.length-1;
if(HUMAN != undefined){
HUMAN.on('touch', (data) => {
if(data!=undefined && data.object===that)
that.go('touch');
});
HUMAN.on('release', (data) => {
if(data!=undefined && data.object===that)
that.go('release');
});
}
}
on(eventName, callback){
if(this.events[eventName]){
this.events[eventName].push(callback);
}else{
this.events[eventName] = [callback];
}
}
go(eventName, ...rest){
if(this.events[eventName]){
this.events[eventName].forEach(cb => {
cb(...rest);
})
}
}
live(mode, animation){
/*
if(typeof mode && mode != undefined)
return;
*/
switch(mode){
case 'on':
livings[this.living].push(animation);
break;
case 'again':
livings[this.living] = [];
livings[this.living].push(animation);
break;
}
}
}
//WebGL Scene
global.SCENE = new Scene(); //TODO INTER!
//CSS3D Scene
global.SCENE2 = new Scene(); //TODO INTER!
SCENE.add(SCENE2);
global.CAMERA = new PerspectiveCamera( 50, window.innerWidth / window.innerHeight, .001, 10000 );
SCENE.add(CAMERA)
global.CAMERA2D = new PerspectiveCamera( 50, window.innerWidth / window.innerHeight, .001, 10000 );
SCENE2.add(CAMERA2D)
global.CONTROLS = false;
function live(){
if(CONTROLS)
CONTROLS.update();
for(var i=0;i<livings.length;i++){
//are there any living beeings?
if(livings.length>0){
//does it have more than one life?
for(var j=0;j<livings[i].length;j++){
if(livings[i].length>0){
livings[i][j]();
}else{
livings[i]();
}
}
}
}
if(typeof EFFECT != 'undefined'){
EFFECT.requestAnimationFrame(live);
EFFECT.render( SCENE, CAMERA );
renderer2.render(SCENE2, CAMERA2D);
}else{
requestAnimationFrame(live);
renderer.render(SCENE, CAMERA);
renderer2.render(SCENE2, CAMERA2D);
}
}
live();
addEventListener('load', () => {
document.body.appendChild(renderer.domElement)
});
addEventListener('resize', function(){
renderer.setSize(innerWidth, innerHeight);
CAMERA.aspect = window.innerWidth / window.innerHeight;
CAMERA.updateProjectionMatrix();
renderer2.setSize(innerWidth, innerHeight);
CAMERA2D.aspect = window.innerWidth / window.innerHeight;
CAMERA2D.updateProjectionMatrix();
})
export default World;
export {Container, Matter}