瀏覽代碼

Merge pull request #2037 from BabylonJS/build

New build system
David Catuhe 8 年之前
父節點
當前提交
5000674bdb

+ 40 - 4
Tools/DevLoader/BabylonLoader.js

@@ -185,11 +185,44 @@ var BABYLONDEVTOOLS;
             }
         }
 
+        Loader.prototype.processDependency = function(settings, dependency, filesToLoad) {
+            if (dependency.dependUpon) {
+                for (var i = 0; i < dependency.dependUpon.length; i++ ) {
+                    var dependencyName = dependency.dependUpon[i];
+                    var parent = settings.workloads[dependencyName];
+                    this.processDependency(settings, parent, filesToLoad);
+                }
+            }
+
+            for (var i = 0; i< dependency.files.length; i++) {
+                var file = dependency.files[i];
+
+                if (filesToLoad.indexOf(file) === -1) {
+                    filesToLoad.push(file);
+                }
+            }
+        }
+
         Loader.prototype.loadBJSScripts = function (settings) {
+            var loadModules = true;
 
+            // Main bjs files
             if (!useDist) {
-                this.loadScripts(settings.core.files);
-                this.loadScripts(settings.extras.files);
+                var currentConfig = settings.build.currentConfig;
+                var buildConfiguration = settings.buildConfigurations[currentConfig];
+                var filesToLoad = [];
+
+                for (var index = 0; index < buildConfiguration.length; index++) {
+                    var dependencyName = buildConfiguration[index];
+                    var dependency = settings.workloads[dependencyName];
+                    this.processDependency(settings, dependency, filesToLoad);
+                }
+
+                this.loadScripts(filesToLoad);
+
+                if (currentConfig !== "all") {
+                    loadModules = false;
+                }
             }
             else if (min) {
                 this.loadScript('/dist/preview release/babylon.js');
@@ -198,8 +231,11 @@ var BABYLONDEVTOOLS;
                 this.loadScript('/dist/preview release/babylon.max.js');
             }
 
-            for (var i = 0; i< settings.modules.length; i++) {
-                this.loadModule(settings[settings.modules[i]]);
+            // Modules
+            if (loadModules) {
+                for (var i = 0; i< settings.modules.length; i++) {
+                    this.loadModule(settings[settings.modules[i]]);
+                }
             }
         }
 

文件差異過大導致無法顯示
+ 810 - 209
Tools/Gulp/config.json


+ 0 - 205
Tools/Gulp/custom.config.json

@@ -1,205 +0,0 @@
-{
-  "build": {
-    "filename": "babylon.custom.max.js",
-    "minFilename": "babylon.custom.js",
-    "outputDirectory": "../../dist/preview release",
-    "srcOutputDirectory": "../../src/"
-  },
-  "core": {
-    "typescript": [
-      "../../src/**/*.ts",
-      "!../../src/**/*.d.ts"
-    ],
-    "files": [
-            "../../src/Math/babylon.math.js",
-            "../../src/babylon.mixins.js",
-            "../../src/Tools/babylon.decorators.js",
-            "../../src/Tools/babylon.observable.js",
-            "../../src/Tools/babylon.database.js",
-            "../../src/Tools/babylon.tga.js",
-            "../../src/Tools/babylon.smartArray.js",
-            "../../src/Tools/babylon.stringDictionary.js",
-            "../../src/Tools/babylon.tools.js",
-            "../../src/States/babylon.alphaCullingState.js",
-            "../../src/States/babylon.depthCullingState.js",
-            "../../src/States/babylon.stencilState.js",
-            "../../src/Tools/babylon.loadingScreen.js",
-            "../../src/babylon.engine.js",
-            "../../src/babylon.node.js",
-            "../../src/Tools/babylon.filesInput.js",
-            "../../src/Collisions/babylon.pickingInfo.js",
-            "../../src/Culling/babylon.boundingSphere.js",
-            "../../src/Culling/babylon.boundingBox.js",
-            "../../src/Culling/babylon.boundingInfo.js",
-            "../../src/Culling/babylon.ray.js",
-            "../../src/Debug/babylon.rayHelper.js",
-            "../../src/Mesh/babylon.abstractMesh.js",
-            "../../src/Lights/babylon.light.js",
-            "../../src/Lights/babylon.pointLight.js",
-            "../../src/Lights/babylon.spotLight.js",
-            "../../src/Lights/babylon.hemisphericLight.js",
-            "../../src/Lights/babylon.directionalLight.js",
-            "../../src/Lights/Shadows/babylon.shadowGenerator.js",
-            "../../src/Collisions/babylon.collider.js",
-            "../../src/Collisions/babylon.collisionCoordinator.js",
-            "../../src/Cameras/babylon.camera.js",
-            "../../src/Cameras/babylon.cameraInputsManager.js",
-            "../../src/Cameras/Inputs/babylon.freeCameraMouseInput.js",
-            "../../src/Cameras/Inputs/babylon.freeCameraKeyboardMoveInput.js",
-            "../../src/Cameras/Inputs/babylon.freeCameraTouchInput.js",
-            "../../src/Cameras/Inputs/babylon.freeCameraDeviceOrientationInput.js",
-            "../../src/Cameras/Inputs/babylon.freeCameraGamepadInput.js",
-            "../../src/Cameras/Inputs/babylon.arcRotateCameraKeyboardMoveInput.js",
-            "../../src/Cameras/Inputs/babylon.arcRotateCameraMouseWheelInput.js",
-            "../../src/Cameras/Inputs/babylon.arcRotateCameraPointersInput.js",
-            "../../src/Cameras/Inputs/babylon.arcRotateCameraGamepadInput.js",
-            "../../src/Cameras/Inputs/babylon.arcRotateCameraVRDeviceOrientationInput.js",
-            "../../src/Cameras/babylon.targetCamera.js",
-            "../../src/Cameras/babylon.freeCamera.js",
-            "../../src/Cameras/babylon.freeCameraInputsManager.js",
-            "../../src/Cameras/babylon.followCamera.js",
-            "../../src/Cameras/babylon.touchCamera.js",
-            "../../src/Cameras/babylon.arcRotateCamera.js",
-            "../../src/Cameras/babylon.arcRotateCameraInputsManager.js",
-            "../../src/Rendering/babylon.renderingManager.js",
-            "../../src/Rendering/babylon.renderingGroup.js",
-            "../../src/PostProcess/babylon.postProcessManager.js",
-            "../../src/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.js",
-            "../../src/Rendering/babylon.boundingBoxRenderer.js",
-            "../../src/babylon.scene.js",
-            "../../src/Mesh/babylon.buffer.js",
-            "../../src/Mesh/babylon.vertexBuffer.js",
-            "../../src/Mesh/babylon.instancedMesh.js",
-            "../../src/Mesh/babylon.mesh.js",
-            "../../src/Mesh/babylon.subMesh.js",
-            "../../src/Mesh/babylon.meshBuilder.js",
-            "../../src/Materials/Textures/babylon.baseTexture.js",
-            "../../src/Materials/Textures/babylon.texture.js",
-            "../../src/Materials/Textures/babylon.cubeTexture.js",
-            "../../src/Materials/Textures/babylon.renderTargetTexture.js",
-            "../../src/Materials/Textures/Procedurals/babylon.proceduralTexture.js",
-            "../../src/Materials/Textures/babylon.mirrorTexture.js",
-            "../../src/Materials/Textures/babylon.refractionTexture.js",
-            "../../src/Materials/Textures/babylon.dynamicTexture.js",
-            "../../src/Materials/Textures/babylon.videoTexture.js",
-            "../../src/Materials/Textures/Procedurals/babylon.customProceduralTexture.js",
-            "../../src/Materials/babylon.effect.js",
-            "../../src/Materials/babylon.materialHelper.js",
-            "../../src/Materials/babylon.fresnelParameters.js",
-            "../../src/Materials/babylon.material.js",
-            "../../src/Materials/babylon.pushMaterial.js",
-            "../../src/Materials/babylon.standardMaterial.js",
-            "../../src/Materials/babylon.multiMaterial.js",
-            "../../src/Loading/babylon.sceneLoader.js",
-            "../../src/Loading/Plugins/babylon.babylonFileLoader.js",
-            "../../src/Sprites/babylon.spriteManager.js",
-            "../../src/Sprites/babylon.sprite.js",
-            "../../src/Layer/babylon.layer.js",
-            "../../src/Particles/babylon.particle.js",
-            "../../src/Particles/babylon.particleSystem.js",
-            "../../src/Animations/babylon.animation.js",
-            "../../src/Animations/babylon.animatable.js",
-            "../../src/Animations/babylon.easing.js",
-            "../../src/Bones/babylon.bone.js",
-            "../../src/Bones/babylon.boneIKController.js",
-            "../../src/Bones/babylon.boneLookController.js",
-            "../../src/Bones/babylon.skeleton.js",
-            "../../src/PostProcess/babylon.postProcess.js",
-            "../../src/PostProcess/babylon.passPostProcess.js",
-            "../../src/Physics/babylon.physicsJoint.js",
-            "../../src/Physics/babylon.physicsImpostor.js",
-            "../../src/Physics/babylon.physicsEngine.js",
-            "../../src/Mesh/babylon.mesh.vertexData.js",
-            "../../src/Tools/babylon.tags.js",
-            "../../src/Tools/babylon.andOrNotEvaluator.js",
-            "../../src/PostProcess/RenderPipeline/babylon.postProcessRenderPass.js",
-            "../../src/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.js",
-            "../../src/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.js",
-            "../../src/Actions/babylon.condition.js",
-            "../../src/Actions/babylon.action.js",
-            "../../src/Actions/babylon.actionManager.js",
-            "../../src/Actions/babylon.interpolateValueAction.js",
-            "../../src/Actions/babylon.directActions.js",
-            "../../src/Mesh/babylon.geometry.js",
-            "../../src/Mesh/babylon.groundMesh.js",
-            "../../src/Mesh/babylon.instancedMesh.js",
-            "../../src/Mesh/babylon.linesMesh.js",
-            "../../src/Audio/babylon.audioEngine.js",
-            "../../src/Audio/babylon.sound.js",
-            "../../src/Audio/babylon.soundtrack.js",
-            "../../src/Layer/babylon.highlightlayer.js",
-            "../../src/Math/babylon.math.SIMD.js",
-            "../../src/Tools/babylon.rectPackingMap.js",
-            "../../src/Tools/babylon.dynamicFloatArray.js",
-            "../../src/Materials/Textures/babylon.mapTexture.js",
-            "../../src/Materials/babylon.shaderMaterial.js",
-            "../../src/Tools/babylon.dds.js",
-            "../../src/Tools/babylon.khronosTextureContainer.js",
-            "../../src/Physics/Plugins/babylon.cannonJSPlugin.js",
-            "../../src/Physics/Plugins/babylon.oimoJSPlugin.js",
-            "../../src/PostProcess/babylon.displayPassPostProcess.js",
-            "../../src/Mesh/babylon.meshSimplification.js",
-            "../../src/Tools/babylon.sceneSerializer.js",
-            "../../src/Tools/babylon.earcut.js",
-            "../../src/Mesh/babylon.csg.js",
-            "../../src/PostProcess/babylon.vrDistortionCorrectionPostProcess.js",
-            "../../src/Tools/babylon.virtualJoystick.js",
-            "../../src/Cameras/babylon.virtualJoysticksCamera.js",
-            "../../src/Cameras/Inputs/babylon.freeCameraVirtualJoystickInput.js",
-            "../../src/PostProcess/babylon.anaglyphPostProcess.js",
-            "../../src/Rendering/babylon.outlineRenderer.js",
-            "../../src/Tools/babylon.assetsManager.js",
-            "../../src/Cameras/VR/babylon.vrCameraMetrics.js",
-            "../../src/Cameras/VR/babylon.webVRCamera.js",
-            "../../src/Tools/babylon.sceneOptimizer.js",
-            "../../src/Mesh/babylon.meshLODLevel.js",
-            "../../src/Materials/Textures/babylon.rawTexture.js",
-            "../../src/Mesh/babylon.polygonMesh.js",
-            "../../src/Culling/Octrees/babylon.octree.js",
-            "../../src/Culling/Octrees/babylon.octreeBlock.js",
-            "../../src/PostProcess/babylon.blurPostProcess.js",
-            "../../src/PostProcess/babylon.refractionPostProcess.js",
-            "../../src/PostProcess/babylon.blackAndWhitePostProcess.js",
-            "../../src/PostProcess/babylon.convolutionPostProcess.js",
-            "../../src/PostProcess/babylon.filterPostProcess.js",
-            "../../src/PostProcess/babylon.fxaaPostProcess.js",
-            "../../src/PostProcess/babylon.stereoscopicInterlacePostProcess.js",
-            "../../src/LensFlare/babylon.lensFlare.js",
-            "../../src/LensFlare/babylon.lensFlareSystem.js",
-            "../../src/Cameras/babylon.deviceOrientationCamera.js",
-            "../../src/Cameras/VR/babylon.vrDeviceOrientationCamera.js",
-            "../../src/Cameras/babylon.universalCamera.js",
-            "../../src/Tools/babylon.gamepads.js",
-            "../../src/Tools/babylon.extendedGamepad.js",
-            "../../src/Cameras/babylon.gamepadCamera.js",
-            "../../src/Audio/babylon.analyser.js",
-            "../../src/Rendering/babylon.depthRenderer.js",
-            "../../src/PostProcess/babylon.ssaoRenderingPipeline.js",
-            "../../src/PostProcess/babylon.volumetricLightScatteringPostProcess.js",
-            "../../src/PostProcess/babylon.lensRenderingPipeline.js",
-            "../../src/PostProcess/babylon.colorCorrectionPostProcess.js",
-            "../../src/Cameras/babylon.stereoscopicCameras.js",
-            "../../src/PostProcess/babylon.hdrRenderingPipeline.js",
-            "../../src/Rendering/babylon.edgesRenderer.js",
-            "../../src/PostProcess/babylon.tonemapPostProcess.js",
-            "../../src/Probes/babylon.reflectionProbe.js",
-            "../../src/Particles/babylon.solidParticle.js",
-            "../../src/Particles/babylon.solidParticleSystem.js",
-            "../../src/Tools/HDR/babylon.cubemapToSphericalPolynomial.js",
-            "../../src/Tools/HDR/babylon.panoramaToCubemap.js",
-            "../../src/Tools/HDR/babylon.hdr.js",
-            "../../src/Tools/HDR/babylon.pmremgenerator.js",
-            "../../src/Materials/Textures/babylon.hdrCubeTexture.js",
-            "../../src/Debug/babylon.skeletonViewer.js",
-            "../../src/Debug/babylon.axesViewer.js",
-            "../../src/Debug/babylon.boneAxesViewer.js",
-            "../../src/Materials/Textures/babylon.colorGradingTexture.js",
-            "../../src/Materials/babylon.colorCurves.js",
-            "../../src/Materials/babylon.pbrMaterial.js",
-            "../../src/Debug/babylon.debugLayer.js",
-            "../../src/PostProcess/babylon.standardRenderingPipeline.js",
-            "../../src/Morph/babylon.morphTarget.js",
-            "../../src/Morph/babylon.morphTargetManager.js"
-    ]
-  }
-}

+ 76 - 70
Tools/Gulp/gulpfile.js

@@ -24,7 +24,6 @@ var webpack = require('webpack-stream');
 var zip = require('gulp-zip');
 
 var config = require("./config.json");
-var customConfig = require("./custom.config.json");
 
 var del = require('del');
 
@@ -58,6 +57,54 @@ var externalTsConfig = {
     isolatedModules: false
 };
 
+function processDependency(kind, dependency, filesToLoad) {
+    if (dependency.dependUpon) {
+        for (var i = 0; i < dependency.dependUpon.length; i++ ) {
+            var dependencyName = dependency.dependUpon[i];
+            var parent = config.workloads[dependencyName];
+            processDependency(kind, parent, filesToLoad);
+        }
+    }
+
+    var content = dependency[kind];
+    if (!content) {
+        return;
+    }
+
+    for (var i = 0; i< content.length; i++) {
+        var file = content[i];
+
+        if (filesToLoad.indexOf(file) === -1) {
+            filesToLoad.push(file);
+        }
+    }
+}
+
+function determineFilesToProcess(kind) {
+    var currentConfig = config.build.currentConfig;
+    var buildConfiguration = config.buildConfigurations[currentConfig];
+    var filesToLoad = [];
+
+    for (var index = 0; index < buildConfiguration.length; index++) {
+        var dependencyName = buildConfiguration[index];
+        var dependency = config.workloads[dependencyName];
+        processDependency(kind, dependency, filesToLoad);
+    }
+
+    if (kind === "shaderIncludes") {
+        for (var index = 0; index < filesToLoad.length; index++) {
+            filesToLoad[index] = "../../src/Shaders/ShadersInclude/" + filesToLoad[index] + ".fx";
+        }
+    } else if (kind === "shaders") {
+        for (var index = 0; index < filesToLoad.length; index++) {
+            var name = filesToLoad[index];
+            filesToLoad[index] = "../../src/Shaders/" + filesToLoad[index] + ".fx";
+        }
+    }
+
+    return filesToLoad;
+}
+
 /*
  * Shader Management.
  */
@@ -76,26 +123,24 @@ function includeShadersName(filename) {
  * Main necessary files stream Management.
  */
 gulp.task("includeShaders", function (cb) {
-    includeShadersStream = config.includeShadersDirectories.map(function (shadersDef) {
-        return gulp.src(shadersDef.files).
-            pipe(expect.real({ errorOnFailure: true }, shadersDef.files)).
-            pipe(uncommentShader()).
-            pipe(srcToVariable({
-            variableName: shadersDef.variable, asMap: true, namingCallback: includeShadersName
-        }));
-    });
+    var filesToProcess = determineFilesToProcess("shaderIncludes");
+    includeShadersStream = gulp.src(filesToProcess).
+        pipe(expect.real({ errorOnFailure: true }, filesToProcess)).
+        pipe(uncommentShader()).
+        pipe(srcToVariable({
+            variableName: "BABYLON.Effect.IncludesShadersStore", asMap: true, namingCallback: includeShadersName
+    }));
     cb();
 });
 
 gulp.task("shaders", ["includeShaders"], function (cb) {
-    shadersStream = config.shadersDirectories.map(function (shadersDef) {
-        return gulp.src(shadersDef.files).
-            pipe(expect.real({ errorOnFailure: true }, shadersDef.files)).
-            pipe(uncommentShader()).
-            pipe(srcToVariable({
-            variableName: shadersDef.variable, asMap: true, namingCallback: shadersName
-        }));
-    });
+    var filesToProcess = determineFilesToProcess("shaders");
+    shadersStream = gulp.src(filesToProcess).
+        pipe(expect.real({ errorOnFailure: true}, filesToProcess)).
+        pipe(uncommentShader()).
+        pipe(srcToVariable({
+            variableName: "BABYLON.Effect.ShadersStore", asMap: true, namingCallback: shadersName
+    }));
     cb();
 });
 
@@ -114,14 +159,16 @@ gulp.task("workers", function (cb) {
 /**
  * Build tasks to concat minify uflify optimise the BJS js in different flavor (workers...).
  */
-gulp.task("buildCore", ["shaders"], function () {
+gulp.task("buildWorker", ["workers", "shaders"], function () {
+    var filesToProcess = determineFilesToProcess("files");
     return merge2(
-        gulp.src(config.core.files).        
-            pipe(expect.real({ errorOnFailure: true }, config.core.files)),
+        gulp.src(filesToProcess).        
+            pipe(expect.real({ errorOnFailure: true }, filesToProcess)),
         shadersStream,
-        includeShadersStream
+        includeShadersStream,
+        workersStream
         )
-        .pipe(concat(config.build.minCoreFilename))
+        .pipe(concat(config.build.minWorkerFilename))
         .pipe(cleants())
         .pipe(replace(extendsSearchRegex, ""))
         .pipe(replace(decorateSearchRegex, ""))
@@ -131,35 +178,14 @@ gulp.task("buildCore", ["shaders"], function () {
         .pipe(gulp.dest(config.build.outputDirectory));
 });
 
-gulp.task("buildNoWorker", ["shaders"], function () {
+gulp.task("build", ["shaders"], function () {
+    var filesToProcess = determineFilesToProcess("files");
     return merge2(
-        gulp.src(config.core.files).        
-            pipe(expect.real({ errorOnFailure: true }, config.core.files)),
-        gulp.src(config.extras.files).        
-            pipe(expect.real({ errorOnFailure: true }, config.extras.files)),
+        gulp.src(filesToProcess).        
+            pipe(expect.real({ errorOnFailure: true }, filesToProcess)),
         shadersStream,
         includeShadersStream
         )
-        .pipe(concat(config.build.minNoWorkerFilename))
-        .pipe(cleants())
-        .pipe(replace(extendsSearchRegex, ""))
-        .pipe(replace(decorateSearchRegex, ""))
-        .pipe(addModuleExports("BABYLON"))
-        .pipe(uglify())
-        .pipe(optimisejs())
-        .pipe(gulp.dest(config.build.outputDirectory));
-});
-
-gulp.task("build", ["workers", "shaders"], function () {
-    return merge2(
-        gulp.src(config.core.files).        
-            pipe(expect.real({ errorOnFailure: true }, config.core.files)),
-        gulp.src(config.extras.files).        
-            pipe(expect.real({ errorOnFailure: true }, config.extras.files)),   
-        shadersStream,
-        includeShadersStream,
-        workersStream
-        )
         .pipe(concat(config.build.filename))
         .pipe(cleants())
         .pipe(replace(extendsSearchRegex, ""))
@@ -172,31 +198,11 @@ gulp.task("build", ["workers", "shaders"], function () {
         .pipe(gulp.dest(config.build.outputDirectory));
 });
 
-gulp.task("build-custom", ["shaders"], function () {
-    return merge2(
-        gulp.src(customConfig.core.files).        
-            pipe(expect.real({ errorOnFailure: true }, customConfig.core.files)),  
-        shadersStream,
-        includeShadersStream
-        )
-        .pipe(concat(customConfig.build.filename))
-        .pipe(cleants())
-        .pipe(replace(extendsSearchRegex, ""))
-        .pipe(replace(decorateSearchRegex, ""))
-        .pipe(addModuleExports("BABYLON"))
-        .pipe(gulp.dest(customConfig.build.outputDirectory))
-        .pipe(rename(customConfig.build.minFilename))
-        .pipe(uglify())
-        .pipe(optimisejs())
-        .pipe(gulp.dest(customConfig.build.outputDirectory));
-});
-
-
 /*
 * Compiles all typescript files and creating a js and a declaration file.
 */
 gulp.task('typescript-compile', function () {
-    var tsResult = gulp.src(config.core.typescript)
+    var tsResult = gulp.src(config.typescript)
         .pipe(sourcemaps.init())
         .pipe(tsProject());
 
@@ -307,7 +313,7 @@ var buildExternalLibrary= function(library, settings, watch) {
  * The default task, concat and min the main BJS files.
  */
 gulp.task('default', function (cb) {
-    runSequence("buildNoWorker", "build", "buildCore", cb);
+    runSequence("buildWorker", "build", cb);
 });
 
 /**
@@ -340,7 +346,7 @@ gulp.task("typescript-all", function (cb) {
  * Watch ts files and fire repective tasks.
  */
 gulp.task('watch', [], function () {
-    var tasks = [gulp.watch(config.core.typescript, ['typescript-compile'])];
+    var tasks = [gulp.watch(config.typescript, ['typescript-compile'])];
 
     config.modules.map(function (module) { 
         config[module].libraries.map(function (library) {            

二進制
assets/textures/grass.jpg


二進制
assets/textures/misc.jpg


二進制
assets/textures/room.hdr


二進制
assets/textures/tree.png


文件差異過大導致無法顯示
+ 0 - 31
dist/preview release/babylon.core.js


文件差異過大導致無法顯示
+ 3383 - 3382
dist/preview release/babylon.d.ts


文件差異過大導致無法顯示
+ 41 - 43
dist/preview release/babylon.js


文件差異過大導致無法顯示
+ 50578 - 50516
dist/preview release/babylon.max.js


文件差異過大導致無法顯示
+ 3383 - 3382
dist/preview release/babylon.module.d.ts


文件差異過大導致無法顯示
+ 0 - 41
dist/preview release/babylon.noworker.js


文件差異過大導致無法顯示
+ 43 - 0
dist/preview release/babylon.worker.js


+ 1 - 0
dist/preview release/what's new.md

@@ -16,6 +16,7 @@
  - babylon.fontTexture.ts was moved from babylon.js to canvas2D ([nockawa](https://github.com/nockawa))
  - Multi-platform Compressed Textures for Desktops & Mobile Devices with fall back.  Batch (dos) scripts to convert entire directories of .jpg's & .png's [Doc](http://doc.babylonjs.com/tutorials/multi-platform_compressed_textures) ([jcpalmer](https://github.com/Palmer-JC))
  - All deprecated functions and properties were removed ([deltakosh](https://github.com/deltakosh))
+ - New build system based on workloads. [More info here](DOC TO DO) ([deltakosh](https://github.com/deltakosh))
 
 ### Updates
 - Added `FIXED_EQUIRECTANGULAR_MIRRORED_MODE` mode for reflection texture. [Demo here](http://www.babylonjs-playground.com/#11GAIH#22) ([deltakosh](https://github.com/deltakosh))

+ 5 - 2
src/Cameras/babylon.arcRotateCamera.ts

@@ -187,7 +187,7 @@ module BABYLON {
         public onCollide: (collidedMesh: AbstractMesh) => void;
         public checkCollisions = false;
         public collisionRadius = new Vector3(0.5, 0.5, 0.5);
-        private _collider = new Collider();
+        private _collider: Collider;
         private _previousPosition = Vector3.Zero();
         private _collisionVelocity = Vector3.Zero();
         private _newPosition = Vector3.Zero();
@@ -214,7 +214,7 @@ module BABYLON {
 
             this.getViewMatrix();
             this.inputs = new ArcRotateCameraInputsManager(this);
-            this.inputs.addKeyboard().addMouseWheel().addPointers().addGamepad();
+            this.inputs.addKeyboard().addMouseWheel().addPointers();
         }      
 
         // Cache
@@ -437,6 +437,9 @@ module BABYLON {
             var target = this._getTargetPosition();
             target.addToRef(new Vector3(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb), this._newPosition);
             if (this.getScene().collisionsEnabled && this.checkCollisions) {
+                if (!this._collider) {
+                    this._collider = new Collider();
+                }
                 this._collider.radius = this.collisionRadius;
                 this._newPosition.subtractToRef(this.position, this._collisionVelocity);
                 this._collisionTriggered = true;

+ 6 - 1
src/Cameras/babylon.freeCamera.ts

@@ -76,7 +76,7 @@
         
         public onCollide: (collidedMesh: AbstractMesh) => void;
         
-        private _collider = new Collider();
+        private _collider: Collider;
         private _needMoveForGravity = false;
         private _oldPosition = Vector3.Zero();
         private _diffPosition = Vector3.Zero();
@@ -124,6 +124,11 @@
             }
 
             globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);
+
+            if (!this._collider) {
+                this._collider = new Collider();
+            }
+
             this._collider.radius = this.ellipsoid;
             this._collider.collisionMask = this._collisionMask;
 		

+ 1 - 1
src/Loading/babylon.sceneLoader.ts

@@ -146,7 +146,7 @@
                 return;
             }
 
-            var directLoad = SceneLoader._getDirectLoad(sceneFilename);
+            var directLoad =SceneLoader._getDirectLoad(sceneFilename);
 
             var loadingToken = {};
             scene._addPendingData(loadingToken);

+ 6 - 2
src/Materials/babylon.pbrMaterial.ts

@@ -1152,8 +1152,12 @@
 
                 var samplers = ["albedoSampler", "ambientSampler", "opacitySampler", "reflectionCubeSampler", "reflection2DSampler", "emissiveSampler", "reflectivitySampler", "microSurfaceSampler", "bumpSampler", "lightmapSampler", "refractionCubeSampler", "refraction2DSampler"];
                 
-                ColorCurves.PrepareUniforms(uniforms); 
-                ColorGradingTexture.PrepareUniformsAndSamplers(uniforms, samplers); 
+                if (this._defines.CAMERACOLORCURVES) {
+                    ColorCurves.PrepareUniforms(uniforms);
+                }
+                if (this._defines.CAMERACOLORGRADING) {
+                    ColorGradingTexture.PrepareUniformsAndSamplers(uniforms, samplers);
+                }
                 MaterialHelper.PrepareUniformsAndSamplersList(uniforms, samplers, this._defines, this.maxSimultaneousLights); 
                 
                 this._effect = scene.getEngine().createEffect("pbr",

+ 6 - 1
src/Mesh/babylon.abstractMesh.ts

@@ -258,7 +258,7 @@
         private _collisionGroup = -1;
         public ellipsoid = new Vector3(0.5, 1, 0.5);
         public ellipsoidOffset = new Vector3(0, 0, 0);
-        private _collider = new Collider();
+        private _collider: Collider;
         private _oldPositionForCollisions = new Vector3(0, 0, 0);
         private _diffPositionForCollisions = new Vector3(0, 0, 0);
         private _newPositionForCollisions = new Vector3(0, 0, 0);
@@ -1401,6 +1401,11 @@
 
             globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPositionForCollisions);
             this._oldPositionForCollisions.addInPlace(this.ellipsoidOffset);
+
+            if (!this._collider) {
+                this._collider = new Collider();
+            }
+
             this._collider.radius = this.ellipsoid;
 
             this.getScene().collisionCoordinator.getNewPosition(this._oldPositionForCollisions, velocity, this._collider, 3, this, this._onCollisionPositionChange, this.uniqueId);

+ 17 - 6
src/babylon.engine.ts

@@ -440,7 +440,7 @@
         public renderEvenInBackground = true;
         public preventCacheWipeBetweenFrames = false;
         // To enable/disable IDB support and avoid XHR on .manifest
-        public enableOfflineSupport = true;
+        public enableOfflineSupport = BABYLON.Database;
         public scenes = new Array<Scene>();
 
         //WebVR 
@@ -554,9 +554,7 @@
         constructor(canvas: HTMLCanvasElement, antialias?: boolean, options?: EngineOptions, adaptToDeviceRatio = false) {
             this._renderingCanvas = canvas;
 
-            Engine.Instances.push(this);
-
-            this._externalData = new StringDictionary<Object>();
+            Engine.Instances.push(this);            
 
             options = options || {};
 
@@ -3121,10 +3119,10 @@
 
             // Video
             var alreadyActivated = false;
-            if (texture instanceof VideoTexture) {
+            if ((<VideoTexture>texture).video) {
                 this.activateTexture(this._gl["TEXTURE" + channel]);
                 alreadyActivated = true;
-                texture.update();
+                (<VideoTexture>texture).update();
             } else if (texture.delayLoadState === Engine.DELAYLOADSTATE_NOTLOADED) { // Delay loading
                 texture.delayLoad();
                 return;
@@ -3237,6 +3235,9 @@
          * @return true if no such key were already present and the data was added successfully, false otherwise
          */
         public addExternalData<T>(key: string, data: T): boolean {
+            if (!this._externalData) {
+                this._externalData = new StringDictionary<Object>();
+            }
             return this._externalData.add(key, data);
         }
 
@@ -3246,6 +3247,9 @@
          * @return the associated data, if present (can be null), or undefined if not present
          */
         public getExternalData<T>(key: string): T {
+            if (!this._externalData) {
+                this._externalData = new StringDictionary<Object>();
+            }
             return <T>this._externalData.get(key);
         }
 
@@ -3256,6 +3260,9 @@
          * @return the associated data, can be null if the factory returned null.
          */
         public getOrAddExternalDataWithFactory<T>(key: string, factory: (k: string) => T): T {
+            if (!this._externalData) {
+                this._externalData = new StringDictionary<Object>();
+            }
             return <T>this._externalData.getOrAddWithFactory(key, factory);
         }
 
@@ -3265,6 +3272,10 @@
          * @return true if the data was successfully removed, false if it doesn't exist
          */
         public removeExternalData(key): boolean {
+            if (!this._externalData) {
+                this._externalData = new StringDictionary<Object>();
+            }
+            
             return this._externalData.remove(key);
         }
 

+ 67 - 28
src/babylon.scene.ts

@@ -582,7 +582,14 @@
         // Postprocesses
         public postProcessesEnabled = true;
         public postProcessManager: PostProcessManager;
-        public postProcessRenderPipelineManager: PostProcessRenderPipelineManager;
+        private _postProcessRenderPipelineManager: PostProcessRenderPipelineManager
+        public get postProcessRenderPipelineManager(): PostProcessRenderPipelineManager {
+            if (!this._postProcessRenderPipelineManager) {
+                this._postProcessRenderPipelineManager = new PostProcessRenderPipelineManager();
+            }
+
+            return this._postProcessRenderPipelineManager;
+        }
 
         // Customs render targets
         public renderTargetsEnabled = true;
@@ -714,18 +721,12 @@
             this._engine = engine || Engine.LastCreatedEngine;
 
             this._engine.scenes.push(this);
-
-            this._externalData = new StringDictionary<Object>();
             this._uid = null;
 
             this._renderingManager = new RenderingManager(this);
 
             this.postProcessManager = new PostProcessManager(this);
 
-            this.postProcessRenderPipelineManager = new PostProcessRenderPipelineManager();
-
-            this._boundingBoxRenderer = new BoundingBoxRenderer(this);
-
             if (OutlineRenderer) {
                 this._outlineRenderer = new OutlineRenderer(this);
             }
@@ -754,6 +755,9 @@
         }
 
         public set workerCollisions(enabled: boolean) {
+            if (!BABYLON.CollisionCoordinatorLegacy) {
+                return;
+            }
 
             enabled = (enabled && !!Worker);
 
@@ -808,6 +812,10 @@
         }
 
         public getBoundingBoxRenderer(): BoundingBoxRenderer {
+            if (!this._boundingBoxRenderer) {
+                this._boundingBoxRenderer = new BoundingBoxRenderer(this);
+            }
+
             return this._boundingBoxRenderer;
         }
 
@@ -940,7 +948,9 @@
                 if (!this._meshPickProceed) {
                     let pickResult = this.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, this.pointerDownPredicate, false, this.cameraToUseForPointers);
                     this._currentPickResult = pickResult;
-                    act = (pickResult.hit && pickResult.pickedMesh) ? pickResult.pickedMesh.actionManager : null;
+                    if (pickResult) {
+                        act = (pickResult.hit && pickResult.pickedMesh) ? pickResult.pickedMesh.actionManager : null;
+                    }
                     this._meshPickProceed = true;
                 }
                 return act;
@@ -965,7 +975,7 @@
                     let checkPicking = obs1.hasSpecificMask(PointerEventTypes.POINTERPICK) || obs2.hasSpecificMask(PointerEventTypes.POINTERPICK)
                                     || obs1.hasSpecificMask(PointerEventTypes.POINTERTAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERTAP)
                                     || obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP);
-                    if (!checkPicking && ActionManager.HasPickTriggers) {
+                    if (!checkPicking && BABYLON.ActionManager && ActionManager.HasPickTriggers) {
                         act = this._initActionManager(act, clickInfo);
                         if (act)
                             checkPicking = act.hasPickTriggers;
@@ -1097,7 +1107,7 @@
                 // Meshes
                 var pickResult = this.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, this.pointerMovePredicate, false, this.cameraToUseForPointers);
 
-                if (pickResult.hit && pickResult.pickedMesh) {
+                if (pickResult && pickResult.hit && pickResult.pickedMesh) {
                     this.setPointerOverSprite(null);
 
                     this.setPointerOverMesh(pickResult.pickedMesh);
@@ -1116,7 +1126,7 @@
                     // Sprites
                     pickResult = this.pickSprite(this._unTranslatedPointerX, this._unTranslatedPointerY, spritePredicate, false, this.cameraToUseForPointers);
 
-                    if (pickResult.hit && pickResult.pickedSprite) {
+                    if (pickResult && pickResult.hit && pickResult.pickedSprite) {
                         this.setPointerOverSprite(pickResult.pickedSprite);
                         if (this._pointerOverSprite.actionManager && this._pointerOverSprite.actionManager.hoverCursor) {
                             canvas.style.cursor = this._pointerOverSprite.actionManager.hoverCursor;
@@ -1176,7 +1186,7 @@
                 this._pickedDownMesh = null;
                 var pickResult = this.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, this.pointerDownPredicate, false, this.cameraToUseForPointers);
 
-                if (pickResult.hit && pickResult.pickedMesh) {
+                if (pickResult && pickResult.hit && pickResult.pickedMesh) {
                     this._pickedDownMesh = pickResult.pickedMesh;
                     var actionManager = pickResult.pickedMesh.actionManager;
                     if (actionManager) {
@@ -1201,7 +1211,7 @@
                                     (mesh: AbstractMesh): boolean => mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasSpecificTrigger(ActionManager.OnLongPressTrigger) && mesh == this._pickedDownMesh,
                                     false, this.cameraToUseForPointers);
 
-                                if (pickResult.hit && pickResult.pickedMesh) {
+                                if (pickResult && pickResult.hit && pickResult.pickedMesh) {
                                     if (this._isButtonPressed &&
                                         ((new Date().getTime() - this._startingPointerTime) > Scene.LongPressDelay) &&
                                         (Math.abs(this._startingPointerPosition.x - this._pointerX) < Scene.DragMovementThreshold &&
@@ -1230,7 +1240,7 @@
                 if (this.spriteManagers.length > 0) {
                     pickResult = this.pickSprite(this._unTranslatedPointerX, this._unTranslatedPointerY, spritePredicate, false, this.cameraToUseForPointers);
 
-                    if (pickResult.hit && pickResult.pickedSprite) {
+                    if (pickResult && pickResult.hit && pickResult.pickedSprite) {
                         if (pickResult.pickedSprite.actionManager) {
                             this._pickedDownSprite = pickResult.pickedSprite;
                             switch (evt.button) {
@@ -1303,14 +1313,14 @@
                     }
 
                     // Meshes
-                    if (!this._meshPickProceed && (ActionManager.HasTriggers || this.onPointerObservable.hasObservers())) {
+                    if (!this._meshPickProceed && (BABYLON.ActionManager && ActionManager.HasTriggers || this.onPointerObservable.hasObservers())) {
                         this._initActionManager(null, clickInfo);
                     }
                     if (!pickResult) {
                         pickResult = this._currentPickResult;
                     }
 
-                    if (pickResult && pickResult.pickedMesh) {
+                    if (pickResult && pickResult && pickResult.pickedMesh) {
                         this._pickedUpMesh = pickResult.pickedMesh;
                         if (this._pickedDownMesh === this._pickedUpMesh) {
                             if (this.onPointerPick) {
@@ -1696,7 +1706,9 @@
             var position = this.meshes.push(newMesh);
 
             //notify the collision coordinator
-            this.collisionCoordinator.onMeshAdded(newMesh);
+            if (this.collisionCoordinator) {
+                this.collisionCoordinator.onMeshAdded(newMesh);
+            }
 
             this.onNewMeshAddedObservable.notifyObservers(newMesh);
         }
@@ -1708,7 +1720,9 @@
                 this.meshes.splice(index, 1);
             }
             //notify the collision coordinator
-            this.collisionCoordinator.onMeshRemoved(toRemove);
+            if (this.collisionCoordinator) {
+                this.collisionCoordinator.onMeshRemoved(toRemove);
+            }
 
             this.onMeshRemovedObservable.notifyObservers(toRemove);
 
@@ -2040,7 +2054,9 @@
             this._geometries.push(geometry);
 
             //notify the collision coordinator
-            this.collisionCoordinator.onGeometryAdded(geometry);
+            if (this.collisionCoordinator) {
+                this.collisionCoordinator.onGeometryAdded(geometry);
+            }
 
             this.onNewGeometryAddedObservable.notifyObservers(geometry);
 
@@ -2059,7 +2075,9 @@
                 this._geometries.splice(index, 1);
 
                 //notify the collision coordinator
-                this.collisionCoordinator.onGeometryDeleted(geometry);
+                if (this.collisionCoordinator) {
+                    this.collisionCoordinator.onGeometryDeleted(geometry);
+                }
 
                 this.onGeometryRemovedObservable.notifyObservers(geometry);
                 return true;
@@ -2343,7 +2361,7 @@
                 var material = subMesh.getMaterial();
 
                 if (mesh.showSubMeshesBoundingBox) {
-                    this._boundingBoxRenderer.renderList.push(subMesh.getBoundingInfo().boundingBox);
+                    this.getBoundingBoxRenderer().renderList.push(subMesh.getBoundingInfo().boundingBox);
                 }
 
                 if (material) {
@@ -2375,7 +2393,9 @@
             this._activeParticleSystems.reset();
             this._activeSkeletons.reset();
             this._softwareSkinnedMeshes.reset();
-            this._boundingBoxRenderer.reset();
+            if (this._boundingBoxRenderer) {
+                this._boundingBoxRenderer.reset();
+            }
             this._edgesRenderers.reset();
 
             // Meshes
@@ -2464,7 +2484,7 @@
             }
 
             if (sourceMesh.showBoundingBox || this.forceShowBoundingBoxes) {
-                this._boundingBoxRenderer.renderList.push(sourceMesh.getBoundingInfo().boundingBox);
+                this.getBoundingBoxRenderer().renderList.push(sourceMesh.getBoundingInfo().boundingBox);
             }
 
             if (sourceMesh._edgesRenderer) {
@@ -2628,7 +2648,9 @@
             Tools.EndPerformanceCounter("Main render");
 
             // Bounding boxes
-            this._boundingBoxRenderer.render();
+            if (this._boundingBoxRenderer) {
+                this._boundingBoxRenderer.render();
+            }
 
             // Edges
             for (var edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {
@@ -2860,7 +2882,9 @@
             }
 
             // RenderPipeline
-            this.postProcessRenderPipelineManager.update();
+            if (this._postProcessRenderPipelineManager) {
+                this._postProcessRenderPipelineManager.update();
+            }
 
             // Multi-cameras?
             if (this.activeCameras.length > 0) {
@@ -3070,8 +3094,6 @@
             this.skeletons = [];
             this.morphTargetManagers = [];
 
-            this._boundingBoxRenderer.dispose();
-
             if (this._depthRenderer) {
                 this._depthRenderer.dispose();
             }
@@ -3087,7 +3109,9 @@
             this._activeParticleSystems.dispose();
             this._activeSkeletons.dispose();
             this._softwareSkinnedMeshes.dispose();
-            this._boundingBoxRenderer.dispose();
+            if (this._boundingBoxRenderer) {
+                this._boundingBoxRenderer.dispose();
+            }
             this._edgesRenderers.dispose();
             this._meshesForIntersections.dispose();
             this._toBeDisposed.dispose();
@@ -3249,6 +3273,10 @@
         }
 
         public createPickingRayInCameraSpace(x: number, y: number, camera: Camera): Ray {
+            if (!BABYLON.PickingInfo) {
+                return null;
+            }
+
             var engine = this._engine;
 
             if (!camera) {
@@ -3269,6 +3297,10 @@
         }
 
         private _internalPick(rayFunction: (world: Matrix) => Ray, predicate: (mesh: AbstractMesh) => boolean, fastCheck?: boolean): PickingInfo {
+            if (!BABYLON.PickingInfo) {
+                return null;
+            }
+
             var pickingInfo = null;
 
             for (var meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {
@@ -3303,6 +3335,9 @@
         }
 
         private _internalMultiPick(rayFunction: (world: Matrix) => Ray, predicate: (mesh: AbstractMesh) => boolean): PickingInfo[] {
+            if (!BABYLON.PickingInfo) {
+                return null;
+            }            
             var pickingInfos = new Array<PickingInfo>();
 
             for (var meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {
@@ -3331,6 +3366,10 @@
 
 
         private _internalPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): PickingInfo {
+            if (!BABYLON.PickingInfo) {
+                return null;
+            }
+
             var pickingInfo = null;
 
             camera = camera || this.activeCamera;