Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var e2in2Directory = document.querySelector('script[src$="E2in2Engine.js"]').getAttribute('src');
- var page = e2in2Directory.split('/').pop();
- e2in2Directory = e2in2Directory.replace('/'+page,"");
- var includesF = [
- '/three.js-master/build/three.js',
- '/three.js-master/examples/js/libs/stats.min.js',
- '/three.js-master/examples/js/loaders/MTLLoader.js',
- '/three.js-master/examples/js/loaders/OBJLoader.js',
- // AAOO
- '/three.js-master/examples/js/shaders/SSAOShader.js',
- '/three.js-master/examples/js/shaders/CopyShader.js',
- '/three.js-master/examples/js/postprocessing/EffectComposer.js',
- '/three.js-master/examples/js/postprocessing/RenderPass.js',
- '/three.js-master/examples/js/postprocessing/ShaderPass.js',
- '/three.js-master/examples/js/postprocessing/MaskPass.js',
- // ENGINE
- '/cannon.js',
- '/Utils.class.js',
- '/E2in2TargetCamera.js',
- '/E2in2PhysicPerson.js',
- '/E2in2PhysicVehicle.js',
- '/E2in2VehicleController.js',
- '/E2in2PersonController.js',
- '/E2in2JsonSkinnedMeshLoader.js',
- '/E2in2ObjLoader.js',
- '/E2in2ObjLoaderThreat.js',
- '/wwobjloader/OBJLoader2.js',
- '/wwobjloader/WWOBJLoader2.js',
- '/wwobjloader/WWOBJLoader2Director.js'];
- for(var n = 0, f = includesF.length; n < f; n++) document.write('<script type="text/javascript" src="'+e2in2Directory+includesF[n]+'"></script>');
- var PHYSIC_CONSTANTS = {"initialize": 0,
- "update": 1,
- "receiveUpdate": 2,
- "addPerson": 3,
- "addVehicle": 4,
- "setController": 5,
- "addBoundingBox": 6,
- "loadCol": 7,
- "setPersonVelocity": 8,
- "setVehicleAction": 9,
- "hideCol": 10,
- "showCol": 11,
- "unloadCol": 12,
- "showCollisionPreview": 13,
- "addVehiclePreview": 14};
- /**
- * Engine contructor
- * @class
- * @constructor
- */
- E2in2Engine = function() {
- "use strict";
- var target = null;
- var stats;
- this.currentController = null;
- this.targetCamera = null;
- this.scene = null;
- var renderer = null;
- this.ontickF = null;
- var prevTime = null;
- this.physicWW = null;
- //this.world = null;
- var persons = {};
- var personIdPossess = null;
- var vehicles = {};
- var vehicleIdPossess = null;
- // AAOO
- var aaoo = false;
- var depthMaterial = null;
- var effectComposer = null;
- var depthRenderTarget = null;
- var ssaoPass;
- // character animation
- this.mixer = null;
- /**
- * Init WebGL Context
- * @param {Object} jsonIn
- * @param {HTMLDivElement} jsonIn.target
- */
- this.initialize = function(jsonIn) {
- prevTime = performance.now();
- target = (jsonIn !== undefined && jsonIn.target !== undefined) ? jsonIn.target : undefined;
- this.scene = new THREE.Scene();
- this.scene.background = new THREE.Color().setHSL( 0.6, 0, 1 );
- this.scene.fog = new THREE.Fog( this.scene.background, 125, 150 );
- // LIGHTS
- //this.scene.add( new THREE.AmbientLight( 0x444444 ) );
- /*var light1 = new THREE.DirectionalLight( 0xffffff, 0.5 );
- light1.position.set( 1, 1, 1 );
- this.scene.add( light1 );
- var light2 = new THREE.DirectionalLight( 0xffffff, 1.5 );
- light2.position.set( 0, -1, 0 );
- this.scene.add( light2 );*/
- var hemiLight = new THREE.HemisphereLight( 0xffffff, 0xffffff, 0.05 );
- hemiLight.color.setHSL( 0.6, 1, 0.6 );
- hemiLight.groundColor.setHSL( 0.095, 1, 0.75 );
- hemiLight.position.set( 0, 50, 0 );
- this.scene.add( hemiLight );
- var dirLight = new THREE.DirectionalLight( 0xffffff, 1 );
- dirLight.color.setHSL( 0.1, 1, 0.95 );
- dirLight.position.set( -1, 0.75, 1 );
- dirLight.position.multiplyScalar( 30 );
- this.scene.add( dirLight );
- dirLight.castShadow = true;
- dirLight.shadow.mapSize.width = dirLight.shadow.mapSize.height = 1024*2;
- var d = 50;
- dirLight.shadow.camera.left = -d;
- dirLight.shadow.camera.right = d;
- dirLight.shadow.camera.top = d;
- dirLight.shadow.camera.bottom = -d;
- dirLight.shadow.camera.far = 3500;
- dirLight.shadow.bias = -0.0001;
- // SKYDOME
- var vertexShader =
- "varying vec3 vWorldPosition;"+
- "void main() {"+
- "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );"+
- "vWorldPosition = worldPosition.xyz;"+
- "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );"+
- "}";
- var fragmentShader =
- "uniform vec3 topColor;"+
- "uniform vec3 bottomColor;"+
- "uniform float offset;"+
- "uniform float exponent;"+
- "varying vec3 vWorldPosition;"+
- "void main() {"+
- "float h = normalize( vWorldPosition + offset ).y;"+
- "gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h , 0.0), exponent ), 0.0 ) ), 1.0 );"+
- "}";
- var uniforms = {
- topColor: { value: new THREE.Color( 0x0077ff ) },
- bottomColor: { value: new THREE.Color( 0xCCCCCC ) },
- offset: { value: -140 },
- exponent: { value: 0.6 }
- };
- uniforms.topColor.value.copy( hemiLight.color );
- this.scene.fog.color.copy( uniforms.bottomColor.value );
- var skyGeo = new THREE.SphereGeometry( 4000, 32, 15 );
- var skyMat = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: uniforms, side: THREE.BackSide } );
- var sky = new THREE.Mesh( skyGeo, skyMat );
- this.scene.add( sky );
- // CAMERA
- this.targetCamera = new E2in2TargetCamera();
- this.targetCamera.initialize({"scene": this.scene});
- // GRID HELPER
- var size = 10;
- var divisions = 10;
- var gridHelper = new THREE.GridHelper( size, divisions );
- this.scene.add( gridHelper );
- // PHYSICS
- this.physicWW = new Worker("js/e2in2engine/E2in2PhysicWW.js");
- this.physicWW.postMessage = this.physicWW.webkitPostMessage || this.physicWW.postMessage;
- this.physicWW.onmessage = (function(e) {
- if(e.data.cmd === PHYSIC_CONSTANTS.receiveUpdate) {
- // update target camera
- if(this.currentController instanceof E2in2PersonController) {
- this.currentController.targetCamera.target.position.copy({ "x": e.data.transforms.persons[personIdPossess].person.position.x,
- "y": e.data.transforms.persons[personIdPossess].person.position.y,
- "z": e.data.transforms.persons[personIdPossess].person.position.z});
- } else if(this.currentController instanceof E2in2VehicleController) {
- this.currentController.targetCamera.target.position.copy({ "x": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.x,
- "y": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.y,
- "z": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.z});
- }
- // update vehicles
- for(var key in vehicles) {
- var vehicleJson = vehicles[key];
- if(vehicleJson !== null && vehicleJson.mesh !== null) {
- var offsetY = (vehicleJson.showPreview === false) ? vehicleJson.mesh.offsetY : 0.0;
- vehicleJson.mesh.position.copy({"x": e.data.transforms.vehicles[key].vehicle.position.x,
- "y": e.data.transforms.vehicles[key].vehicle.position.y+offsetY,
- "z": e.data.transforms.vehicles[key].vehicle.position.z});
- vehicleJson.mesh.quaternion.copy({ "x": e.data.transforms.vehicles[key].vehicle.quat.x,
- "y": e.data.transforms.vehicles[key].vehicle.quat.y,
- "z": e.data.transforms.vehicles[key].vehicle.quat.z,
- "w": e.data.transforms.vehicles[key].vehicle.quat.w});
- if(vehicleJson.showPreview === false) {
- vehicleJson.mesh.rotateX( Math.PI / 2 );
- vehicleJson.mesh.rotateY( Math.PI / 2 );
- }
- for(var i = 0; i < 4; i++) {
- vehicleJson.meshWheels[i].position.copy({"x": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].position.x,
- "y": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].position.y,
- "z": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].position.z});
- vehicleJson.meshWheels[i].quaternion.copy({ "x": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.x,
- "y": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.y,
- "z": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.z,
- "w": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.w});
- if(vehicleJson.showPreview === false) {
- vehicleJson.meshWheels[i].rotateX( Math.PI / 2 );
- vehicleJson.meshWheels[i].rotateY( Math.PI / 2 );
- }
- }
- }
- }
- // update persons
- for(var key in persons) {
- var personJson = persons[key];
- if(personJson !== null) {
- personJson.mesh.position.copy({ "x": e.data.transforms.persons[key].person.position.x,
- "y": e.data.transforms.persons[key].person.position.y+personJson.mesh.offsetY,
- "z": e.data.transforms.persons[key].person.position.z});
- //personJson.mesh.quaternion.copy(e.data.transforms.persons[key].person.quat);
- }
- }
- if(this.currentController instanceof E2in2VehicleController && personJson.mesh.visible === true) {
- persons[personIdPossess].mesh.position.copy({ "x": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.x,
- "y": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.y,
- "z": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.z});
- persons[personIdPossess].mesh.quaternion.copy({ "x": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.x,
- "y": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.y,
- "z": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.z,
- "w": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.w})
- persons[personIdPossess].mesh.rotateX( Math.PI / 2 );
- persons[personIdPossess].mesh.rotateY( Math.PI / 2 );
- }
- requestAnimationFrame(this.start.bind(this));
- } else if(e.data.cmd === PHYSIC_CONSTANTS.showCollisionPreview) {
- for(var key in e.data.meshesVisual) {
- var meshVisual = e.data.meshesVisual[key];
- for(var nb=0; nb < meshVisual.verts.length; nb++)
- meshVisual.verts[nb] = new CANNON.Vec3(meshVisual.verts[nb][0], meshVisual.verts[nb][1], meshVisual.verts[nb][2]);
- var convexShape = new CANNON.ConvexPolyhedron(meshVisual.verts, meshVisual.faces);
- var convexBody = new CANNON.Body({mass: 0});
- convexBody.addShape(convexShape);
- this.scene.add(this.addVisual(convexBody));
- }
- } else if(e.data.cmd === PHYSIC_CONSTANTS.addVehiclePreview) {
- vehicles[e.data.vehicleId].mesh = new THREE.Mesh(new THREE.BoxGeometry(e.data.sizeBody.x * 2, e.data.sizeBody.y * 2, e.data.sizeBody.z * 2));
- this.scene.add(vehicles[e.data.vehicleId].mesh);
- for(var i=0; i<vehicles[e.data.vehicleId].meshWheels.length; i++) {
- vehicles[e.data.vehicleId].meshWheels[i] = new THREE.Mesh(new THREE.CylinderGeometry(e.data.sizeWheel, e.data.sizeWheel, e.data.sizeWheel));
- this.scene.add(vehicles[e.data.vehicleId].meshWheels[i]);
- }
- }
- }).bind(this);
- this.physicWW.postMessage({
- "cmd": PHYSIC_CONSTANTS.initialize,
- "cannonUrl" : document.location.href.replace(/\/[^/]*$/,"/")+"js/e2in2engine/cannon.min.js"
- });
- // START THREEJS RENDERER
- renderer = new THREE.WebGLRenderer({"antialias": false});
- renderer.setPixelRatio(window.devicePixelRatio);
- renderer.setSize(window.innerWidth, window.innerHeight);
- renderer.gammaInput = true;
- renderer.gammaOutput = true;
- renderer.shadowMap.enabled = true;
- renderer.shadowMap.renderReverseSided = false;
- renderer.shadowMap.type = THREE.PCFSoftShadowMap;
- target.appendChild( renderer.domElement );
- stats = new Stats();
- target.appendChild(stats.dom);
- // AAOO
- function radiusChange(value) {
- ssaoPass.uniforms['radius'].value = value;
- }
- function renderModeChange(value) {
- ssaoPass.uniforms['onlyAO'].value = value;
- }
- if(aaoo === true) {
- // Setup render pass
- var renderPass = new THREE.RenderPass(this.scene, this.currentController.targetCamera.camera);
- // Setup depth pass
- depthMaterial = new THREE.MeshDepthMaterial();
- depthMaterial.depthPacking = THREE.RGBADepthPacking;
- depthMaterial.blending = THREE.NoBlending;
- var pars = {minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter};
- depthRenderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, pars);
- depthRenderTarget.texture.name = "SSAOShader.rt";
- // Setup SSAO pass
- ssaoPass = new THREE.ShaderPass(THREE.SSAOShader);
- ssaoPass.renderToScreen = true;
- //ssaoPass.uniforms[ "tDiffuse" ].value will be set by ShaderPass
- ssaoPass.uniforms["tDepth"].value = depthRenderTarget.texture;
- ssaoPass.uniforms['size'].value.set( window.innerWidth, window.innerHeight );
- ssaoPass.uniforms['cameraNear'].value = this.currentController.targetCamera.camera.near;
- ssaoPass.uniforms['cameraFar'].value = this.currentController.targetCamera.camera.far;
- // Add pass to effect composer
- effectComposer = new THREE.EffectComposer(renderer);
- effectComposer.addPass(renderPass);
- effectComposer.addPass(ssaoPass);
- }
- // HANDLE RESIZE
- window.addEventListener( 'resize', this.onWindowResize.bind(this), false );
- };
- this.onWindowResize = function() {
- this.currentController.targetCamera.camera.aspect = window.innerWidth / window.innerHeight;
- this.currentController.targetCamera.camera.updateProjectionMatrix();
- renderer.setSize( window.innerWidth, window.innerHeight );
- };
- this.start = function() {
- this.render();
- stats.update();
- };
- this.ontick = function(fn) {
- this.ontickF = fn;
- };
- this.render = function() {
- if(this.currentController !== null && this.currentController.mesh !== undefined) {
- var time = performance.now();
- var delta = (time - prevTime) / 1000;
- this.currentController.update(delta);
- prevTime = time;
- this.physicWW.postMessage({
- "cmd": PHYSIC_CONSTANTS.update,
- "delta": delta
- });
- for(var key in persons) {
- var personJson = persons[key];
- if(personJson !== null && this.currentController instanceof E2in2PersonController) {
- if(personJson.mesh.mixer !== null)
- personJson.mesh.mixer.update(delta);
- }
- }
- if(this.ontickF !== null)
- this.ontickF(delta);
- if(aaoo === true) {
- // Render depth into depthRenderTarget
- this.scene.overrideMaterial = depthMaterial;
- renderer.render(this.scene, this.currentController.targetCamera.camera, depthRenderTarget, true);
- // Render renderPass and SSAO shaderPass
- this.scene.overrideMaterial = null;
- effectComposer.render();
- } else {
- renderer.render(this.scene, this.currentController.targetCamera.camera);
- }
- }
- };
- /**
- * @returns {THREE.Scene}
- */
- this.getScene = function() {
- return this.scene;
- };
- /**
- * @returns {Worker}
- */
- this.getPhysicWW = function() {
- return this.physicWW;
- };
- /**
- * @param {Object} jsonIn
- * @param {String} jsonIn.jsonMeshUrl
- * @param {String} jsonIn.jsonTextureMeshUrl
- * @param {float} jsonIn.offsetY
- * @param {THREE.Vector3} jsonIn.position
- * @param {bool} [jsonIn.showSkeleton=false]
- * @param {Object} jsonIn.initialClip
- * @param {String} jsonIn.initialClip.name
- * @param {float} jsonIn.initialClip.offset
- * @param {Object} jsonIn.idleClip
- * @param {String} jsonIn.idleClip.name
- * @param {float} jsonIn.idleClip.offset
- * @param {Object} jsonIn.walkClip
- * @param {String} jsonIn.walkClip.name
- * @param {float} jsonIn.walkClip.offset
- * @param {float} jsonIn.walkClip.velocity
- * @param {Function} jsonIn.onload
- */
- this.addPerson = function(jsonIn) {
- var loader = new E2in2JsonSkinnedMeshLoader();
- loader.initialize(jsonIn, (function(playerMesh, skeleton) {
- var physicPerson = new E2in2PhysicPerson();
- var personId = Object.keys(persons).length;
- persons[personId] = physicPerson.initialize({ "physicWW": this.physicWW,
- "personId": personId,
- "mesh": playerMesh, // playerMesh.mixer playerMesh.actions
- "offsetY": jsonIn.offsetY,
- "startPosition": jsonIn.position});
- this.scene.add(persons[personId].mesh);
- if(skeleton !== null)
- this.scene.add(skeleton);
- if(jsonIn.onload !== null)
- jsonIn.onload(personId);
- }).bind(this));
- };
- /**
- * @param {Object} jsonIn
- * @param {String} jsonIn.directory
- * @param {String} jsonIn.chasisObj
- * @param {String} jsonIn.chasisMtl
- * @param {String} jsonIn.wheelObj
- * @param {String} jsonIn.wheelMtl
- * @param {Array<float>} jsonIn.chasisDimensions
- * @param {float} jsonIn.chasisOffsetY
- * @param {THREE.Vector3} jsonIn.position
- * @param {float} jsonIn.frontWheelsOffsetZ
- * @param {float} jsonIn.frontWheelsOffsetX
- * @param {float} jsonIn.backWheelsOffsetZ
- * @param {float} jsonIn.backWheelsOffsetX
- * @param {bool} [jsonIn.showPreview=false]
- * @param {Function} jsonIn.onload
- */
- this.addVehicle = function(jsonIn) {
- var obj = new E2in2ObjLoader();
- obj.initialize({"directory": jsonIn.directory,
- "obj": jsonIn.chasisObj,
- "mtl": jsonIn.chasisMtl,
- "transparent": false,
- "computeBoundingBox": false}, (function(jsonIn, meshChasis, boundingBox) {
- var objWheel = new E2in2ObjLoader();
- objWheel.initialize({ "directory": jsonIn.directory,
- "obj": jsonIn.wheelObj,
- "mtl": jsonIn.wheelMtl,
- "transparent": false,
- "computeBoundingBox": false}, (function(meshChasis, meshWheel, boundingBox) {
- var meshesWheels = [];
- meshesWheels.push(meshWheel);
- meshesWheels.push(meshWheel.clone());
- meshesWheels.push(meshWheel.clone());
- meshesWheels.push(meshWheel.clone());
- var physicVehicle = new E2in2PhysicVehicle();
- var vehicleId = Object.keys(vehicles).length;
- vehicles[vehicleId] = physicVehicle.initialize({"physicWW": this.physicWW,
- "vehicleId": vehicleId,
- "meshChasis": meshChasis,
- "meshWheels": meshesWheels,
- "chasisDimensions": jsonIn.chasisDimensions,
- "chasisOffsetY": jsonIn.chasisOffsetY,
- "position": jsonIn.position,
- "frontWheelsOffsetZ": jsonIn.frontWheelsOffsetZ,
- "frontWheelsOffsetX": jsonIn.frontWheelsOffsetX,
- "backWheelsOffsetZ": jsonIn.backWheelsOffsetZ,
- "backWheelsOffsetX": jsonIn.backWheelsOffsetX,
- "showPreview": jsonIn.showPreview});
- if(jsonIn.showPreview === false) {
- this.scene.add(vehicles[vehicleId].mesh);
- for(var n=0; n < vehicles[vehicleId].meshWheels.length; n++)
- this.scene.add(vehicles[vehicleId].meshWheels[n]);
- }
- if(jsonIn.onload !== null)
- jsonIn.onload(vehicleId);
- }).bind(this, meshChasis));
- }).bind(this, jsonIn));
- };
- /**
- * @returns {Object}
- */
- this.getPlayerPosition = function() {
- return ((this.currentController instanceof E2in2PersonController) ? persons[personIdPossess].mesh.position : vehicles[vehicleIdPossess].mesh.position);
- };
- /**
- * @param {String} type
- * @param {int} id
- */
- this.setController = function(type, id) {
- if(type === "person") {
- personIdPossess = id;
- this.currentController = new E2in2PersonController();
- this.currentController.initialize({ "targetCamera": this.targetCamera,
- "mesh": persons[personIdPossess].mesh,
- "physicWW": this.physicWW});
- // fix player rotation
- var vector = new THREE.Vector3();
- this.targetCamera.camera.getWorldDirection(vector);
- vector = new THREE.Vector3(vector.x, 0, vector.z);
- var pos = new THREE.Vector3(persons[personIdPossess].mesh.position.x, persons[personIdPossess].mesh.position.y, persons[personIdPossess].mesh.position.z);
- pos = pos.add(vector);
- persons[personIdPossess].mesh.lookAt(pos);
- } else if(type === "vehicle") {
- vehicleIdPossess = id;
- this.currentController = new E2in2VehicleController();
- this.currentController.initialize({ "targetCamera": this.targetCamera,
- "mesh": vehicles[vehicleIdPossess].mesh,
- "physicWW": this.physicWW,
- "showPreview": vehicles[vehicleIdPossess].showPreview});
- }
- this.physicWW.postMessage({
- "cmd": PHYSIC_CONSTANTS.setController,
- "type": type,
- "startPosition": [persons[personIdPossess].mesh.startPosition.x, persons[personIdPossess].mesh.startPosition.y, persons[personIdPossess].mesh.startPosition.z],
- "id": id
- });
- };
- document.onkeydown = (function(event) {
- if(event.keyCode === 13) {
- if(this.currentController instanceof E2in2PersonController) {
- for(var key in vehicles) {
- var posPerson = persons[personIdPossess].mesh.position;
- var posVehicle = vehicles[key].mesh.position;
- if(posPerson.distanceTo(posVehicle) < 5) {
- this.setController("vehicle", key);
- break;
- }
- }
- } else if(this.currentController instanceof E2in2VehicleController)
- this.setController("person", personIdPossess);
- }
- }).bind(this);
- this.addVisual = function(body) {
- var obj = new THREE.Object3D();
- this.currentMaterial = new THREE.MeshLambertMaterial( { color: 0xdddddd } );
- for (var l = 0; l < body.shapes.length; l++) {
- var shape = body.shapes[l];
- var mesh;
- if(shape.type === CANNON.Shape.types.CONVEXPOLYHEDRON) {
- var geo = new THREE.Geometry();
- // Add vertices
- for (var i = 0; i < shape.vertices.length; i++) {
- var v = shape.vertices[i];
- geo.vertices.push(new THREE.Vector3(v.x, v.y, v.z));
- }
- for(var i=0; i < shape.faces.length; i++){
- var face = shape.faces[i];
- // add triangles
- var a = face[0];
- for (var j = 1; j < face.length - 1; j++) {
- var b = face[j];
- var c = face[j + 1];
- geo.faces.push(new THREE.Face3(a, b, c));
- }
- }
- geo.computeBoundingSphere();
- geo.computeFaceNormals();
- mesh = new THREE.Mesh( geo, this.currentMaterial );
- } else if(shape.type === CANNON.Shape.types.TRIMESH) {
- var geometry = new THREE.Geometry();
- var v0 = new CANNON.Vec3();
- var v1 = new CANNON.Vec3();
- var v2 = new CANNON.Vec3();
- for (var i = 0; i < shape.indices.length / 3; i++) {
- shape.getTriangleVertices(i, v0, v1, v2);
- geometry.vertices.push(
- new THREE.Vector3(v0.x, v0.y, v0.z),
- new THREE.Vector3(v1.x, v1.y, v1.z),
- new THREE.Vector3(v2.x, v2.y, v2.z)
- );
- var j = geometry.vertices.length - 3;
- geometry.faces.push(new THREE.Face3(j, j+1, j+2));
- }
- geometry.computeBoundingSphere();
- geometry.computeFaceNormals();
- mesh = new THREE.Mesh(geometry, this.currentMaterial);
- }
- mesh.receiveShadow = true;
- mesh.castShadow = true;
- if(mesh.children){
- for(var i=0; i<mesh.children.length; i++){
- mesh.children[i].castShadow = true;
- mesh.children[i].receiveShadow = true;
- if(mesh.children[i]){
- for(var j=0; j<mesh.children[i].length; j++){
- mesh.children[i].children[j].castShadow = true;
- mesh.children[i].children[j].receiveShadow = true;
- }
- }
- }
- }
- var o = body.shapeOffsets[l];
- var q = body.shapeOrientations[l];
- mesh.position.set(o.x, o.y, o.z);
- mesh.quaternion.set(q.x, q.y, q.z, q.w);
- obj.add(mesh);
- }
- return obj;
- };
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement