Created
September 26, 2012 14:16
A simple helper for mapping a three.js scene to an impact Game
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
impact3D = {}; | |
impact3D.models = impact3D.models || {}; | |
impact3D.entities = impact3D.entities || {}; | |
impact3D.player = impact3D.player || {}; | |
impact3D.scene = null; | |
impact3D.updateCount = 0; | |
impact3D.clock = new THREE.Clock(); | |
impact3D.init = function(scene) | |
{ | |
console.log(" ***impact3D Init *** "); | |
this.scene = scene; | |
var newObject; | |
for(var i = 0; i < ig.game.entities.length; i++) | |
{ | |
var entity = ig.game.entities[i]; | |
if(entity.model && this.models[entity.model]) | |
{ | |
console.log(this.models[entity.model].animated) | |
if(this.models[entity.model].animated) | |
{ | |
/*var r = "media/cube/pisa/"; | |
var urls = [ r + "px.png", r + "nx.png", | |
r + "py.png", r + "ny.png", | |
r + "pz.png", r + "nz.png" ]; | |
var textureCube = THREE.ImageUtils.loadTextureCube( urls ); | |
*/ | |
var texture = THREE.ImageUtils.loadTexture("player.png"); | |
var material = new THREE.MeshPhongMaterial( {morphTargets:true} ); | |
// material.envMap = textureCube; | |
material.map = texture; | |
material.combine = THREE.MixOperation; | |
material.reflectivity = .55; | |
material.opacity = 1; | |
newObject = new THREE.MorphAnimMesh( this.models[entity.model], material); | |
newObject.animated = true; | |
newObject.duration = 1000*20; | |
} else newObject = new THREE.Mesh( this.models[entity.model], new THREE.MeshFaceMaterial()); | |
newObject.castShadow = true; | |
if(this.models[entity.model].extraRotation) | |
newObject.extraRotation = this.models[entity.model].extraRotation; | |
else newObject.extraRotation = 0; | |
//cube.receiveShadow = true; | |
} | |
else | |
{ | |
newObject = new THREE.Mesh( new THREE.CubeGeometry( entity.size.x, entity.size.y, 8 ), new THREE.MeshPhongMaterial({color:0xff00ff}) ); | |
newObject.castShadow = true; | |
//cube.receiveShadow = true; | |
newObject.extraRotation = 0; | |
} | |
if(entity.type == 1) | |
{ | |
this.player = newObject; | |
} | |
this.entities[entity.id] = newObject; | |
this.scene.add(newObject); | |
} | |
} | |
impact3D.generateLevel = function(collisionRects) | |
{ var tilesize = 8; | |
var physicsScale = 1; | |
for( var i = 0; i < collisionRects.length; i++ ) { | |
var rect = collisionRects[i]; | |
newObject = new THREE.Mesh( new THREE.CubeGeometry( rect.width * tilesize, rect.height * tilesize, 30 + Math.random() * 100 ), new THREE.MeshPhongMaterial({color:0x444444}) ); | |
newObject.geometry.computeBoundingBox(); | |
newObject.position.x = rect.x * tilesize * physicsScale + rect.width * tilesize / 2 * physicsScale, | |
newObject.position.y = (rect.y * tilesize * physicsScale + rect.height * tilesize / 2 * physicsScale) * -1 | |
newObject.castShadow = true; | |
newObject.receiveShadow = true; | |
scene.add(newObject); | |
} | |
} | |
impact3D.addModel = function(geometry,type,settings) | |
{ | |
this.models[type] = geometry; | |
if(settings == null) settings = {}; | |
if(settings.smooth) | |
geometry.computeVertexNormals(); | |
if(settings.animated) | |
geometry.animated = settings.animated; | |
else geometry.animated = false; | |
if(settings.extraRotation) | |
geometry.extraRotation = settings.extraRotation; | |
else geometry.extraRotation = 0; | |
console.log("settings" + settings.animated) | |
} | |
impact3D.update = function() | |
{ | |
var time = new Date().getTime(); | |
var delta = time - oldTime; | |
var oldTime = time; | |
if (isNaN(delta) || delta > 1000 || delta == 0 ) | |
{ | |
delta = 1000/60; | |
} | |
this.updateCount++; | |
var obj; | |
for(var i = 0; i < ig.game.entities.length; i++) | |
{ | |
var entity = ig.game.entities[i]; | |
var entity3D = this.entities[entity.id]; | |
// If object doesn't exist create it | |
if(!entity3D) | |
{ | |
//console.log(entity.type) | |
if(entity.model && this.models[entity.model]) | |
{ | |
obj = new THREE.Mesh( this.models[entity.model], new THREE.MeshBasicMaterial()); | |
} | |
else | |
{ | |
obj = new THREE.Mesh( new THREE.CubeGeometry( 4, 2, 2 ), new THREE.MeshNormalMaterial() ); | |
} | |
obj.castShadow = true; | |
//cube.receiveShadow = true; | |
obj.extraRotation = 0; | |
this.entities[entity.id] = obj; | |
this.scene.add(obj); | |
} | |
entity3D.position.x = entity.pos.x + 4; // half entity width instead of 4 | |
entity3D.position.y = (entity.pos.y - entity.offset.y ) * -1 - entity.size.y/2 ; | |
entity3D.rotation.z = entity.angle*-1; | |
entity3D.updated = this.updateCount; | |
if(entity3D.animated && entity.animSpeed) | |
{ | |
if(entity.anim) | |
{ | |
entity3D.setFrameRange(entity.anim.min,entity.anim.max); | |
} | |
entity3D.updateAnimation(delta * entity.animSpeed); | |
} | |
if(ig.game.entities[i].flip) | |
{ | |
entity3D.rotation.y = -Math.PI - entity3D.extraRotation; | |
} | |
else | |
{ | |
entity3D.rotation.y = 0 - entity3D.extraRotation; | |
} | |
} | |
for(var prop in this.entities) | |
{ | |
if(this.entities[prop] && this.entities[prop].updated != c) | |
{ | |
this.scene.remove(this.entities[prop]); | |
this.entities[prop] = null; | |
} | |
prop = null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment