Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var e2in2Directory = document.querySelector('script[src$="E2in2Engine.js"]').getAttribute('src');
  2. var page = e2in2Directory.split('/').pop();
  3. e2in2Directory = e2in2Directory.replace('/'+page,"");
  4.  
  5. var includesF = [
  6.     '/three.js-master/build/three.js',
  7.     '/three.js-master/examples/js/libs/stats.min.js',
  8.     '/three.js-master/examples/js/loaders/MTLLoader.js',
  9.     '/three.js-master/examples/js/loaders/OBJLoader.js',
  10.     // AAOO
  11.     '/three.js-master/examples/js/shaders/SSAOShader.js',
  12.     '/three.js-master/examples/js/shaders/CopyShader.js',
  13.     '/three.js-master/examples/js/postprocessing/EffectComposer.js',
  14.     '/three.js-master/examples/js/postprocessing/RenderPass.js',
  15.     '/three.js-master/examples/js/postprocessing/ShaderPass.js',
  16.     '/three.js-master/examples/js/postprocessing/MaskPass.js',
  17.     // ENGINE
  18.     '/cannon.js',
  19.     '/Utils.class.js',
  20.     '/E2in2TargetCamera.js',
  21.     '/E2in2PhysicPerson.js',
  22.     '/E2in2PhysicVehicle.js',
  23.     '/E2in2VehicleController.js',
  24.     '/E2in2PersonController.js',
  25.     '/E2in2JsonSkinnedMeshLoader.js',
  26.     '/E2in2ObjLoader.js',
  27.     '/E2in2ObjLoaderThreat.js',
  28.     '/wwobjloader/OBJLoader2.js',
  29.     '/wwobjloader/WWOBJLoader2.js',
  30.     '/wwobjloader/WWOBJLoader2Director.js'];
  31. for(var n = 0, f = includesF.length; n < f; n++) document.write('<script type="text/javascript" src="'+e2in2Directory+includesF[n]+'"></script>');
  32.  
  33.  
  34. var PHYSIC_CONSTANTS = {"initialize": 0,
  35.                         "update": 1,
  36.                         "receiveUpdate": 2,
  37.                         "addPerson": 3,
  38.                         "addVehicle": 4,
  39.                         "setController": 5,
  40.                         "addBoundingBox": 6,
  41.                         "loadCol": 7,
  42.                         "setPersonVelocity": 8,
  43.                         "setVehicleAction": 9,
  44.                         "hideCol": 10,
  45.                         "showCol": 11,
  46.                         "unloadCol": 12,
  47.                         "showCollisionPreview": 13,
  48.                         "addVehiclePreview": 14};
  49.  
  50. /**
  51.  * Engine contructor
  52.  * @class
  53.  * @constructor
  54.  */
  55. E2in2Engine = function() {
  56.     "use strict";
  57.  
  58.     var target = null;
  59.  
  60.     var stats;
  61.  
  62.     this.currentController = null;
  63.     this.targetCamera = null;
  64.     this.scene = null;
  65.     var renderer = null;
  66.  
  67.     this.ontickF = null;
  68.     var prevTime = null;
  69.  
  70.     this.physicWW = null;
  71.     //this.world = null;
  72.  
  73.     var persons = {};
  74.     var personIdPossess = null;
  75.  
  76.     var vehicles = {};
  77.     var vehicleIdPossess = null;
  78.  
  79.     // AAOO
  80.     var aaoo = false;
  81.     var depthMaterial = null;
  82.     var effectComposer = null;
  83.     var depthRenderTarget = null;
  84.     var ssaoPass;
  85.  
  86.     // character animation
  87.     this.mixer = null;
  88.  
  89.  
  90.     /**
  91.      * Init WebGL Context
  92.      * @param {Object} jsonIn
  93.      * @param {HTMLDivElement} jsonIn.target
  94.      */
  95.     this.initialize = function(jsonIn) {
  96.         prevTime = performance.now();
  97.  
  98.         target = (jsonIn !== undefined && jsonIn.target !== undefined) ? jsonIn.target : undefined;
  99.  
  100.         this.scene = new THREE.Scene();
  101.         this.scene.background = new THREE.Color().setHSL( 0.6, 0, 1 );
  102.         this.scene.fog = new THREE.Fog( this.scene.background, 125, 150 );
  103.  
  104.  
  105.  
  106.         // LIGHTS
  107.         //this.scene.add( new THREE.AmbientLight( 0x444444 ) );
  108.         /*var light1 = new THREE.DirectionalLight( 0xffffff, 0.5 );
  109.         light1.position.set( 1, 1, 1 );
  110.         this.scene.add( light1 );
  111.         var light2 = new THREE.DirectionalLight( 0xffffff, 1.5 );
  112.         light2.position.set( 0, -1, 0 );
  113.         this.scene.add( light2 );*/
  114.  
  115.         var hemiLight = new THREE.HemisphereLight( 0xffffff, 0xffffff, 0.05 );
  116.         hemiLight.color.setHSL( 0.6, 1, 0.6 );
  117.         hemiLight.groundColor.setHSL( 0.095, 1, 0.75 );
  118.         hemiLight.position.set( 0, 50, 0 );
  119.         this.scene.add( hemiLight );
  120.  
  121.         var dirLight = new THREE.DirectionalLight( 0xffffff, 1 );
  122.         dirLight.color.setHSL( 0.1, 1, 0.95 );
  123.         dirLight.position.set( -1, 0.75, 1 );
  124.         dirLight.position.multiplyScalar( 30 );
  125.         this.scene.add( dirLight );
  126.         dirLight.castShadow = true;
  127.         dirLight.shadow.mapSize.width = dirLight.shadow.mapSize.height = 1024*2;
  128.         var d = 50;
  129.         dirLight.shadow.camera.left = -d;
  130.         dirLight.shadow.camera.right = d;
  131.         dirLight.shadow.camera.top = d;
  132.         dirLight.shadow.camera.bottom = -d;
  133.         dirLight.shadow.camera.far = 3500;
  134.         dirLight.shadow.bias = -0.0001;
  135.  
  136.         // SKYDOME
  137.         var vertexShader =
  138.             "varying vec3 vWorldPosition;"+
  139.  
  140.             "void main() {"+
  141.                 "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );"+
  142.                 "vWorldPosition = worldPosition.xyz;"+
  143.  
  144.                 "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );"+
  145.             "}";
  146.  
  147.         var fragmentShader =
  148.             "uniform vec3 topColor;"+
  149.             "uniform vec3 bottomColor;"+
  150.             "uniform float offset;"+
  151.             "uniform float exponent;"+
  152.  
  153.             "varying vec3 vWorldPosition;"+
  154.  
  155.             "void main() {"+
  156.                 "float h = normalize( vWorldPosition + offset ).y;"+
  157.                 "gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h , 0.0), exponent ), 0.0 ) ), 1.0 );"+
  158.             "}";
  159.         var uniforms = {
  160.             topColor:    { value: new THREE.Color( 0x0077ff ) },
  161.             bottomColor: { value: new THREE.Color( 0xCCCCCC ) },
  162.             offset:      { value: -140 },
  163.             exponent:    { value: 0.6 }
  164.         };
  165.         uniforms.topColor.value.copy( hemiLight.color );
  166.  
  167.         this.scene.fog.color.copy( uniforms.bottomColor.value );
  168.  
  169.         var skyGeo = new THREE.SphereGeometry( 4000, 32, 15 );
  170.         var skyMat = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: uniforms, side: THREE.BackSide } );
  171.  
  172.         var sky = new THREE.Mesh( skyGeo, skyMat );
  173.         this.scene.add( sky );
  174.  
  175.  
  176.  
  177.         // CAMERA
  178.         this.targetCamera = new E2in2TargetCamera();
  179.         this.targetCamera.initialize({"scene": this.scene});
  180.  
  181.  
  182.  
  183.         // GRID HELPER
  184.         var size = 10;
  185.         var divisions = 10;
  186.         var gridHelper = new THREE.GridHelper( size, divisions );
  187.         this.scene.add( gridHelper );
  188.  
  189.  
  190.  
  191.         // PHYSICS
  192.         this.physicWW = new Worker("js/e2in2engine/E2in2PhysicWW.js");
  193.         this.physicWW.postMessage = this.physicWW.webkitPostMessage || this.physicWW.postMessage;
  194.  
  195.         this.physicWW.onmessage = (function(e) {
  196.             if(e.data.cmd === PHYSIC_CONSTANTS.receiveUpdate) {
  197.                 // update target camera
  198.                 if(this.currentController instanceof E2in2PersonController) {
  199.                     this.currentController.targetCamera.target.position.copy({  "x": e.data.transforms.persons[personIdPossess].person.position.x,
  200.                                                                                 "y": e.data.transforms.persons[personIdPossess].person.position.y,
  201.                                                                                 "z": e.data.transforms.persons[personIdPossess].person.position.z});
  202.                 } else if(this.currentController instanceof E2in2VehicleController) {
  203.                     this.currentController.targetCamera.target.position.copy({  "x": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.x,
  204.                                                                                 "y": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.y,
  205.                                                                                 "z": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.z});
  206.                 }
  207.                 // update vehicles
  208.                 for(var key in vehicles) {
  209.                     var vehicleJson = vehicles[key];
  210.                     if(vehicleJson !== null && vehicleJson.mesh !== null) {
  211.                         var offsetY = (vehicleJson.showPreview === false) ? vehicleJson.mesh.offsetY : 0.0;
  212.                         vehicleJson.mesh.position.copy({"x": e.data.transforms.vehicles[key].vehicle.position.x,
  213.                                                         "y": e.data.transforms.vehicles[key].vehicle.position.y+offsetY,
  214.                                                         "z": e.data.transforms.vehicles[key].vehicle.position.z});
  215.                         vehicleJson.mesh.quaternion.copy({  "x": e.data.transforms.vehicles[key].vehicle.quat.x,
  216.                                                             "y": e.data.transforms.vehicles[key].vehicle.quat.y,
  217.                                                             "z": e.data.transforms.vehicles[key].vehicle.quat.z,
  218.                                                             "w": e.data.transforms.vehicles[key].vehicle.quat.w});
  219.                         if(vehicleJson.showPreview === false) {
  220.                             vehicleJson.mesh.rotateX( Math.PI / 2 );
  221.                             vehicleJson.mesh.rotateY( Math.PI / 2 );
  222.                         }
  223.  
  224.                         for(var i = 0; i < 4; i++) {
  225.                             vehicleJson.meshWheels[i].position.copy({"x": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].position.x,
  226.                                                                     "y": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].position.y,
  227.                                                                     "z": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].position.z});
  228.                             vehicleJson.meshWheels[i].quaternion.copy({ "x": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.x,
  229.                                                                         "y": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.y,
  230.                                                                         "z": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.z,
  231.                                                                         "w": e.data.transforms.vehicles[key].vehicleWheels[i.toString()].quat.w});
  232.                             if(vehicleJson.showPreview === false) {
  233.                                 vehicleJson.meshWheels[i].rotateX( Math.PI / 2 );
  234.                                 vehicleJson.meshWheels[i].rotateY( Math.PI / 2 );
  235.                             }
  236.                         }
  237.                     }
  238.                 }
  239.                 // update persons
  240.                 for(var key in persons) {
  241.                     var personJson = persons[key];
  242.                     if(personJson !== null) {
  243.                         personJson.mesh.position.copy({ "x": e.data.transforms.persons[key].person.position.x,
  244.                                                         "y": e.data.transforms.persons[key].person.position.y+personJson.mesh.offsetY,
  245.                                                         "z": e.data.transforms.persons[key].person.position.z});
  246.                         //personJson.mesh.quaternion.copy(e.data.transforms.persons[key].person.quat);
  247.                     }
  248.                 }
  249.                 if(this.currentController instanceof E2in2VehicleController && personJson.mesh.visible === true) {
  250.                     persons[personIdPossess].mesh.position.copy({   "x": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.x,
  251.                                                                     "y": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.y,
  252.                                                                     "z": e.data.transforms.vehicles[vehicleIdPossess].vehicle.position.z});
  253.                     persons[personIdPossess].mesh.quaternion.copy({ "x": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.x,
  254.                                                                     "y": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.y,
  255.                                                                     "z": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.z,
  256.                                                                     "w": e.data.transforms.vehicles[vehicleIdPossess].vehicle.quat.w})
  257.                     persons[personIdPossess].mesh.rotateX( Math.PI / 2 );
  258.                     persons[personIdPossess].mesh.rotateY( Math.PI / 2 );
  259.                 }
  260.                 requestAnimationFrame(this.start.bind(this));
  261.             } else if(e.data.cmd === PHYSIC_CONSTANTS.showCollisionPreview) {
  262.                 for(var key in e.data.meshesVisual) {
  263.                     var meshVisual = e.data.meshesVisual[key];
  264.  
  265.                     for(var nb=0; nb < meshVisual.verts.length; nb++)
  266.                         meshVisual.verts[nb] = new CANNON.Vec3(meshVisual.verts[nb][0], meshVisual.verts[nb][1], meshVisual.verts[nb][2]);
  267.  
  268.                     var convexShape = new CANNON.ConvexPolyhedron(meshVisual.verts, meshVisual.faces);
  269.                     var convexBody = new CANNON.Body({mass: 0});
  270.                     convexBody.addShape(convexShape);
  271.  
  272.                     this.scene.add(this.addVisual(convexBody));
  273.                 }
  274.             } else if(e.data.cmd === PHYSIC_CONSTANTS.addVehiclePreview) {
  275.                 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));
  276.                 this.scene.add(vehicles[e.data.vehicleId].mesh);
  277.  
  278.                 for(var i=0; i<vehicles[e.data.vehicleId].meshWheels.length; i++) {
  279.                     vehicles[e.data.vehicleId].meshWheels[i] = new THREE.Mesh(new THREE.CylinderGeometry(e.data.sizeWheel, e.data.sizeWheel, e.data.sizeWheel));
  280.                     this.scene.add(vehicles[e.data.vehicleId].meshWheels[i]);
  281.                 }
  282.             }
  283.         }).bind(this);
  284.  
  285.         this.physicWW.postMessage({
  286.             "cmd": PHYSIC_CONSTANTS.initialize,
  287.             "cannonUrl" : document.location.href.replace(/\/[^/]*$/,"/")+"js/e2in2engine/cannon.min.js"
  288.         });
  289.  
  290.  
  291.  
  292.         // START THREEJS RENDERER
  293.         renderer = new THREE.WebGLRenderer({"antialias": false});
  294.         renderer.setPixelRatio(window.devicePixelRatio);
  295.         renderer.setSize(window.innerWidth, window.innerHeight);
  296.         renderer.gammaInput = true;
  297.         renderer.gammaOutput = true;
  298.         renderer.shadowMap.enabled = true;
  299.         renderer.shadowMap.renderReverseSided = false;
  300.         renderer.shadowMap.type = THREE.PCFSoftShadowMap;
  301.         target.appendChild( renderer.domElement );
  302.  
  303.         stats = new Stats();
  304.         target.appendChild(stats.dom);
  305.  
  306.  
  307.  
  308.         // AAOO
  309.         function radiusChange(value) {
  310.             ssaoPass.uniforms['radius'].value = value;
  311.         }
  312.  
  313.         function renderModeChange(value) {
  314.             ssaoPass.uniforms['onlyAO'].value = value;
  315.         }
  316.         if(aaoo === true) {
  317.             // Setup render pass
  318.             var renderPass = new THREE.RenderPass(this.scene, this.currentController.targetCamera.camera);
  319.  
  320.             // Setup depth pass
  321.             depthMaterial = new THREE.MeshDepthMaterial();
  322.             depthMaterial.depthPacking = THREE.RGBADepthPacking;
  323.             depthMaterial.blending = THREE.NoBlending;
  324.  
  325.             var pars = {minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter};
  326.             depthRenderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, pars);
  327.             depthRenderTarget.texture.name = "SSAOShader.rt";
  328.  
  329.             // Setup SSAO pass
  330.             ssaoPass = new THREE.ShaderPass(THREE.SSAOShader);
  331.             ssaoPass.renderToScreen = true;
  332.             //ssaoPass.uniforms[ "tDiffuse" ].value will be set by ShaderPass
  333.             ssaoPass.uniforms["tDepth"].value = depthRenderTarget.texture;
  334.             ssaoPass.uniforms['size'].value.set( window.innerWidth, window.innerHeight );
  335.             ssaoPass.uniforms['cameraNear'].value = this.currentController.targetCamera.camera.near;
  336.             ssaoPass.uniforms['cameraFar'].value = this.currentController.targetCamera.camera.far;
  337.  
  338.             // Add pass to effect composer
  339.             effectComposer = new THREE.EffectComposer(renderer);
  340.             effectComposer.addPass(renderPass);
  341.             effectComposer.addPass(ssaoPass);
  342.         }
  343.  
  344.  
  345.  
  346.         // HANDLE RESIZE
  347.         window.addEventListener( 'resize', this.onWindowResize.bind(this), false );
  348.     };
  349.  
  350.     this.onWindowResize = function() {
  351.         this.currentController.targetCamera.camera.aspect = window.innerWidth / window.innerHeight;
  352.         this.currentController.targetCamera.camera.updateProjectionMatrix();
  353.  
  354.         renderer.setSize( window.innerWidth, window.innerHeight );
  355.     };
  356.  
  357.     this.start = function() {
  358.         this.render();
  359.         stats.update();
  360.     };
  361.  
  362.     this.ontick = function(fn) {
  363.         this.ontickF = fn;
  364.     };
  365.  
  366.     this.render = function() {
  367.         if(this.currentController !== null && this.currentController.mesh !== undefined) {
  368.             var time = performance.now();
  369.             var delta = (time - prevTime) / 1000;
  370.             this.currentController.update(delta);
  371.             prevTime = time;
  372.  
  373.             this.physicWW.postMessage({
  374.                 "cmd": PHYSIC_CONSTANTS.update,
  375.                 "delta": delta
  376.             });
  377.  
  378.             for(var key in persons) {
  379.                 var personJson = persons[key];
  380.                 if(personJson !== null && this.currentController instanceof E2in2PersonController) {
  381.                     if(personJson.mesh.mixer !== null)
  382.                         personJson.mesh.mixer.update(delta);
  383.                 }
  384.             }
  385.  
  386.             if(this.ontickF !== null)
  387.                 this.ontickF(delta);
  388.  
  389.             if(aaoo === true) {
  390.                 // Render depth into depthRenderTarget
  391.                 this.scene.overrideMaterial = depthMaterial;
  392.                 renderer.render(this.scene, this.currentController.targetCamera.camera, depthRenderTarget, true);
  393.  
  394.                 // Render renderPass and SSAO shaderPass
  395.                 this.scene.overrideMaterial = null;
  396.                 effectComposer.render();
  397.             } else {
  398.                 renderer.render(this.scene, this.currentController.targetCamera.camera);
  399.             }
  400.         }
  401.     };
  402.  
  403.     /**
  404.      * @returns {THREE.Scene}
  405.      */
  406.     this.getScene = function() {
  407.         return this.scene;
  408.     };
  409.  
  410.     /**
  411.      * @returns {Worker}
  412.      */
  413.     this.getPhysicWW = function() {
  414.         return this.physicWW;
  415.     };
  416.  
  417.     /**
  418.     * @param {Object} jsonIn
  419.     * @param {String} jsonIn.jsonMeshUrl
  420.     * @param {String} jsonIn.jsonTextureMeshUrl
  421.     * @param {float} jsonIn.offsetY
  422.     * @param {THREE.Vector3} jsonIn.position
  423.     * @param {bool} [jsonIn.showSkeleton=false]
  424.     * @param {Object} jsonIn.initialClip
  425.     * @param {String} jsonIn.initialClip.name
  426.     * @param {float} jsonIn.initialClip.offset
  427.     * @param {Object} jsonIn.idleClip
  428.     * @param {String} jsonIn.idleClip.name
  429.     * @param {float} jsonIn.idleClip.offset
  430.     * @param {Object} jsonIn.walkClip
  431.     * @param {String} jsonIn.walkClip.name
  432.     * @param {float} jsonIn.walkClip.offset
  433.     * @param {float} jsonIn.walkClip.velocity
  434.     * @param {Function} jsonIn.onload
  435.     */
  436.     this.addPerson = function(jsonIn) {
  437.         var loader = new E2in2JsonSkinnedMeshLoader();
  438.         loader.initialize(jsonIn, (function(playerMesh, skeleton) {
  439.             var physicPerson = new E2in2PhysicPerson();
  440.             var personId = Object.keys(persons).length;
  441.             persons[personId] = physicPerson.initialize({   "physicWW": this.physicWW,
  442.                                                             "personId": personId,
  443.                                                             "mesh": playerMesh, // playerMesh.mixer playerMesh.actions
  444.                                                             "offsetY": jsonIn.offsetY,
  445.                                                             "startPosition": jsonIn.position});
  446.             this.scene.add(persons[personId].mesh);
  447.  
  448.             if(skeleton !== null)
  449.                 this.scene.add(skeleton);
  450.  
  451.             if(jsonIn.onload !== null)
  452.                 jsonIn.onload(personId);
  453.         }).bind(this));
  454.  
  455.     };
  456.  
  457.     /**
  458.      * @param {Object} jsonIn
  459.      * @param {String} jsonIn.directory
  460.      * @param {String} jsonIn.chasisObj
  461.      * @param {String} jsonIn.chasisMtl
  462.      * @param {String} jsonIn.wheelObj
  463.      * @param {String} jsonIn.wheelMtl
  464.      * @param {Array<float>} jsonIn.chasisDimensions
  465.      * @param {float} jsonIn.chasisOffsetY
  466.      * @param {THREE.Vector3} jsonIn.position
  467.      * @param {float} jsonIn.frontWheelsOffsetZ
  468.      * @param {float} jsonIn.frontWheelsOffsetX
  469.      * @param {float} jsonIn.backWheelsOffsetZ
  470.      * @param {float} jsonIn.backWheelsOffsetX
  471.      * @param {bool} [jsonIn.showPreview=false]
  472.      * @param {Function} jsonIn.onload
  473.      */
  474.     this.addVehicle = function(jsonIn) {
  475.         var obj = new E2in2ObjLoader();
  476.         obj.initialize({"directory": jsonIn.directory,
  477.                         "obj": jsonIn.chasisObj,
  478.                         "mtl": jsonIn.chasisMtl,
  479.                         "transparent": false,
  480.                         "computeBoundingBox": false}, (function(jsonIn, meshChasis, boundingBox) {
  481.                             var objWheel = new E2in2ObjLoader();
  482.                             objWheel.initialize({   "directory": jsonIn.directory,
  483.                                                     "obj": jsonIn.wheelObj,
  484.                                                     "mtl": jsonIn.wheelMtl,
  485.                                                     "transparent": false,
  486.                                                     "computeBoundingBox": false}, (function(meshChasis, meshWheel, boundingBox) {
  487.                                                         var meshesWheels = [];
  488.                                                         meshesWheels.push(meshWheel);
  489.                                                         meshesWheels.push(meshWheel.clone());
  490.                                                         meshesWheels.push(meshWheel.clone());
  491.                                                         meshesWheels.push(meshWheel.clone());
  492.  
  493.                                                         var physicVehicle = new E2in2PhysicVehicle();
  494.                                                         var vehicleId = Object.keys(vehicles).length;
  495.                                                         vehicles[vehicleId] = physicVehicle.initialize({"physicWW": this.physicWW,
  496.                                                                                                         "vehicleId": vehicleId,
  497.                                                                                                         "meshChasis": meshChasis,
  498.                                                                                                         "meshWheels": meshesWheels,
  499.                                                                                                         "chasisDimensions": jsonIn.chasisDimensions,
  500.                                                                                                         "chasisOffsetY": jsonIn.chasisOffsetY,
  501.                                                                                                         "position": jsonIn.position,
  502.                                                                                                         "frontWheelsOffsetZ": jsonIn.frontWheelsOffsetZ,
  503.                                                                                                         "frontWheelsOffsetX": jsonIn.frontWheelsOffsetX,
  504.                                                                                                         "backWheelsOffsetZ": jsonIn.backWheelsOffsetZ,
  505.                                                                                                         "backWheelsOffsetX": jsonIn.backWheelsOffsetX,
  506.                                                                                                         "showPreview": jsonIn.showPreview});
  507.                                                         if(jsonIn.showPreview === false) {
  508.                                                             this.scene.add(vehicles[vehicleId].mesh);
  509.                                                             for(var n=0; n < vehicles[vehicleId].meshWheels.length; n++)
  510.                                                                 this.scene.add(vehicles[vehicleId].meshWheels[n]);
  511.                                                         }
  512.                                                         if(jsonIn.onload !== null)
  513.                                                             jsonIn.onload(vehicleId);
  514.                                                     }).bind(this, meshChasis));
  515.                         }).bind(this, jsonIn));
  516.     };
  517.  
  518.     /**
  519.      * @returns {Object}
  520.      */
  521.     this.getPlayerPosition = function() {
  522.         return ((this.currentController instanceof E2in2PersonController) ? persons[personIdPossess].mesh.position : vehicles[vehicleIdPossess].mesh.position);
  523.     };
  524.  
  525.     /**
  526.      * @param {String} type
  527.      * @param {int} id
  528.      */
  529.     this.setController = function(type, id) {
  530.         if(type === "person") {
  531.             personIdPossess = id;
  532.             this.currentController = new E2in2PersonController();
  533.             this.currentController.initialize({ "targetCamera": this.targetCamera,
  534.                                                 "mesh": persons[personIdPossess].mesh,
  535.                                                 "physicWW": this.physicWW});
  536.  
  537.             // fix player rotation
  538.             var vector = new THREE.Vector3();
  539.             this.targetCamera.camera.getWorldDirection(vector);
  540.             vector = new THREE.Vector3(vector.x, 0, vector.z);
  541.  
  542.             var pos = new THREE.Vector3(persons[personIdPossess].mesh.position.x, persons[personIdPossess].mesh.position.y, persons[personIdPossess].mesh.position.z);
  543.             pos = pos.add(vector);
  544.             persons[personIdPossess].mesh.lookAt(pos);
  545.         } else if(type === "vehicle") {
  546.             vehicleIdPossess = id;
  547.             this.currentController = new E2in2VehicleController();
  548.             this.currentController.initialize({ "targetCamera": this.targetCamera,
  549.                                                 "mesh": vehicles[vehicleIdPossess].mesh,
  550.                                                 "physicWW": this.physicWW,
  551.                                                 "showPreview": vehicles[vehicleIdPossess].showPreview});
  552.         }
  553.  
  554.         this.physicWW.postMessage({
  555.             "cmd": PHYSIC_CONSTANTS.setController,
  556.             "type": type,
  557.             "startPosition": [persons[personIdPossess].mesh.startPosition.x, persons[personIdPossess].mesh.startPosition.y, persons[personIdPossess].mesh.startPosition.z],
  558.             "id": id
  559.         });
  560.     };
  561.  
  562.     document.onkeydown = (function(event) {
  563.         if(event.keyCode === 13) {
  564.             if(this.currentController instanceof E2in2PersonController) {
  565.                 for(var key in vehicles) {
  566.                     var posPerson = persons[personIdPossess].mesh.position;
  567.                     var posVehicle = vehicles[key].mesh.position;
  568.                     if(posPerson.distanceTo(posVehicle) < 5) {
  569.                         this.setController("vehicle", key);
  570.                         break;
  571.                     }
  572.                 }
  573.             } else if(this.currentController instanceof E2in2VehicleController)
  574.                 this.setController("person", personIdPossess);
  575.         }
  576.     }).bind(this);
  577.  
  578.     this.addVisual = function(body) {
  579.         var obj = new THREE.Object3D();
  580.         this.currentMaterial = new THREE.MeshLambertMaterial( { color: 0xdddddd } );
  581.  
  582.         for (var l = 0; l < body.shapes.length; l++) {
  583.             var shape = body.shapes[l];
  584.  
  585.             var mesh;
  586.  
  587.             if(shape.type === CANNON.Shape.types.CONVEXPOLYHEDRON) {
  588.                 var geo = new THREE.Geometry();
  589.  
  590.                 // Add vertices
  591.                 for (var i = 0; i < shape.vertices.length; i++) {
  592.                     var v = shape.vertices[i];
  593.                     geo.vertices.push(new THREE.Vector3(v.x, v.y, v.z));
  594.                 }
  595.  
  596.                 for(var i=0; i < shape.faces.length; i++){
  597.                     var face = shape.faces[i];
  598.  
  599.                     // add triangles
  600.                     var a = face[0];
  601.                     for (var j = 1; j < face.length - 1; j++) {
  602.                         var b = face[j];
  603.                         var c = face[j + 1];
  604.                         geo.faces.push(new THREE.Face3(a, b, c));
  605.                     }
  606.                 }
  607.                 geo.computeBoundingSphere();
  608.                 geo.computeFaceNormals();
  609.                 mesh = new THREE.Mesh( geo, this.currentMaterial );
  610.             } else if(shape.type === CANNON.Shape.types.TRIMESH) {
  611.                 var geometry = new THREE.Geometry();
  612.  
  613.                 var v0 = new CANNON.Vec3();
  614.                 var v1 = new CANNON.Vec3();
  615.                 var v2 = new CANNON.Vec3();
  616.                 for (var i = 0; i < shape.indices.length / 3; i++) {
  617.                     shape.getTriangleVertices(i, v0, v1, v2);
  618.                     geometry.vertices.push(
  619.                         new THREE.Vector3(v0.x, v0.y, v0.z),
  620.                         new THREE.Vector3(v1.x, v1.y, v1.z),
  621.                         new THREE.Vector3(v2.x, v2.y, v2.z)
  622.                     );
  623.                     var j = geometry.vertices.length - 3;
  624.                     geometry.faces.push(new THREE.Face3(j, j+1, j+2));
  625.                 }
  626.                 geometry.computeBoundingSphere();
  627.                 geometry.computeFaceNormals();
  628.                 mesh = new THREE.Mesh(geometry, this.currentMaterial);
  629.             }
  630.  
  631.             mesh.receiveShadow = true;
  632.             mesh.castShadow = true;
  633.             if(mesh.children){
  634.                 for(var i=0; i<mesh.children.length; i++){
  635.                     mesh.children[i].castShadow = true;
  636.                     mesh.children[i].receiveShadow = true;
  637.                     if(mesh.children[i]){
  638.                         for(var j=0; j<mesh.children[i].length; j++){
  639.                             mesh.children[i].children[j].castShadow = true;
  640.                             mesh.children[i].children[j].receiveShadow = true;
  641.                         }
  642.                     }
  643.                 }
  644.             }
  645.  
  646.             var o = body.shapeOffsets[l];
  647.             var q = body.shapeOrientations[l];
  648.             mesh.position.set(o.x, o.y, o.z);
  649.             mesh.quaternion.set(q.x, q.y, q.z, q.w);
  650.  
  651.             obj.add(mesh);
  652.         }
  653.  
  654.         return obj;
  655.     };
  656. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement