Skip to content

Instantly share code, notes, and snippets.

@chribbe
Created September 26, 2012 14:16
A simple helper for mapping a three.js scene to an impact Game
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