浏览代码

Merge branch 'master' of https://github.com/BabylonJS/Babylon.js

Conflicts:
	babylon.1.14-RC.js
David Catuhe 11 年之前
父节点
当前提交
05cfc80a48
共有 35 个文件被更改,包括 1860 次插入4230 次删除
  1. 1 3
      Babylon/Cameras/babylon.camera.ts
  2. 73 23
      Babylon/Loading/Plugins/babylon.babylonFileLoader.js
  3. 87 26
      Babylon/Loading/Plugins/babylon.babylonFileLoader.ts
  4. 1 1
      Babylon/Mesh/babylon.abstractMesh.js
  5. 1 1
      Babylon/Mesh/babylon.abstractMesh.ts
  6. 10 65
      Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.js
  7. 12 67
      Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.ts
  8. 10 4
      Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.js
  9. 8 6
      Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts
  10. 7 7
      Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.js
  11. 14 14
      Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.ts
  12. 1 0
      Babylon/PostProcess/babylon.postProcess.ts
  13. 6 1
      Babylon/PostProcess/babylon.postProcessManager.js
  14. 6 1
      Babylon/PostProcess/babylon.postProcessManager.ts
  15. 2 0
      Babylon/babylon.node.ts
  16. 0 4
      Exporters/Blender/blender-test/TOB-out/.gitignore
  17. 0 74
      Exporters/Blender/blender-test/armature_JSON.html
  18. 0 63
      Exporters/Blender/blender-test/armature_inline.html
  19. 二进制
      Exporters/Blender/blender-test/blender-in/armature.blend
  20. 二进制
      Exporters/Blender/blender-test/blender-in/camera_anim.blend
  21. 二进制
      Exporters/Blender/blender-test/blender-in/mesh_parent.blend
  22. 二进制
      Exporters/Blender/blender-test/blender-in/tmage512.png
  23. 0 75
      Exporters/Blender/blender-test/camera_anim_JSON.html
  24. 0 63
      Exporters/Blender/blender-test/camera_anim_inline.html
  25. 0 2
      Exporters/Blender/blender-test/lib/.gitignore
  26. 0 53
      Exporters/Blender/blender-test/lib/mesh_parent_common.js
  27. 0 63
      Exporters/Blender/blender-test/mesh_parent_JSON.html
  28. 0 56
      Exporters/Blender/blender-test/mesh_parent_inline.html
  29. 0 18
      Exporters/Blender/blender-test/readme.md
  30. 1498 944
      Exporters/Blender/io_export_babylon.py
  31. 0 2480
      Exporters/Blender/io_tower_of_babel.py
  32. 4 0
      Exporters/Blender/readme.md
  33. 107 101
      babylon.1.14-RC-debug.js
  34. 7 7
      babylon.1.14-RC.js
  35. 5 8
      babylon.d.ts

+ 1 - 3
Babylon/Cameras/babylon.camera.ts

@@ -24,9 +24,7 @@
         public _projectionMatrix = new BABYLON.Matrix();
         public _projectionMatrix = new BABYLON.Matrix();
         private _worldMatrix: Matrix;
         private _worldMatrix: Matrix;
         public _postProcesses = new Array<PostProcess>();
         public _postProcesses = new Array<PostProcess>();
-        public _postProcessesTakenIndices = [];
-        
-        public _waitingParentId: string;
+        public _postProcessesTakenIndices = [];               
 
 
         constructor(name: string, public position: Vector3, scene: Scene) {
         constructor(name: string, public position: Vector3, scene: Scene) {
             super(name, scene);
             super(name, scene);

+ 73 - 23
Babylon/Loading/Plugins/babylon.babylonFileLoader.js

@@ -354,7 +354,54 @@
         };
         };
 
 
         var parseCamera = function (parsedCamera, scene) {
         var parseCamera = function (parsedCamera, scene) {
-            var camera = new BABYLON.FreeCamera(parsedCamera.name, BABYLON.Vector3.FromArray(parsedCamera.position), scene);
+            var camera;
+            var position = BABYLON.Vector3.FromArray(parsedCamera.position);
+            var lockedTargetMesh = (parsedCamera.lockedTargetId) ? scene.getLastMeshByID(parsedCamera.lockedTargetId) : null;
+
+            if (parsedCamera.type === "AnaglyphArcRotateCamera" || parsedCamera.type === "ArcRotateCamera") {
+                var alpha = parsedCamera.alpha;
+                var beta = parsedCamera.beta;
+                var radius = parsedCamera.radius;
+                if (parsedCamera.type === "AnaglyphArcRotateCamera") {
+                    var eye_space = parsedCamera.eye_space;
+                    camera = new BABYLON.AnaglyphArcRotateCamera(parsedCamera.name, alpha, beta, radius, lockedTargetMesh, eye_space, scene);
+                } else {
+                    camera = new BABYLON.ArcRotateCamera(parsedCamera.name, alpha, beta, radius, lockedTargetMesh, scene);
+                }
+            } else if (parsedCamera.type === "AnaglyphFreeCamera") {
+                var eye_space = parsedCamera.eye_space;
+                camera = new BABYLON.AnaglyphFreeCamera(parsedCamera.name, position, eye_space, scene);
+            } else if (parsedCamera.type === "DeviceOrientationCamera") {
+                camera = new BABYLON.DeviceOrientationCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "FollowCamera") {
+                camera = new BABYLON.FollowCamera(parsedCamera.name, position, scene);
+                camera.heightOffset = parsedCamera.heightOffset;
+                camera.radius = parsedCamera.radius;
+                camera.rotationOffset = parsedCamera.rotationOffset;
+                if (lockedTargetMesh)
+                    camera.target = lockedTargetMesh;
+            } else if (parsedCamera.type === "GamepadCamera") {
+                camera = new BABYLON.GamepadCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "OculusCamera") {
+                camera = new BABYLON.OculusCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "TouchCamera") {
+                camera = new BABYLON.TouchCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "VirtualJoysticksCamera") {
+                camera = new BABYLON.VirtualJoysticksCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "WebVRCamera") {
+                camera = new BABYLON.WebVRCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "VRDeviceOrientationCamera") {
+                camera = new BABYLON.VRDeviceOrientationCamera(parsedCamera.name, position, scene);
+            } else {
+                // Free Camera is the default value
+                camera = new BABYLON.FreeCamera(parsedCamera.name, position, scene);
+            }
+
+            // Test for lockedTargetMesh & FreeCamera outside of if-else-if nest, since things like GamepadCamera extend FreeCamera
+            if (lockedTargetMesh && camera instanceof BABYLON.FreeCamera) {
+                camera.lockedTarget = lockedTargetMesh;
+            }
+
             camera.id = parsedCamera.id;
             camera.id = parsedCamera.id;
 
 
             BABYLON.Tags.AddTagsTo(camera, parsedCamera.tags);
             BABYLON.Tags.AddTagsTo(camera, parsedCamera.tags);
@@ -371,11 +418,6 @@
                 camera.rotation = BABYLON.Vector3.FromArray(parsedCamera.rotation);
                 camera.rotation = BABYLON.Vector3.FromArray(parsedCamera.rotation);
             }
             }
 
 
-            // Locked target
-            if (parsedCamera.lockedTargetId) {
-                camera._waitingLockedTargetId = parsedCamera.lockedTargetId;
-            }
-
             camera.fov = parsedCamera.fov;
             camera.fov = parsedCamera.fov;
             camera.minZ = parsedCamera.minZ;
             camera.minZ = parsedCamera.minZ;
             camera.maxZ = parsedCamera.maxZ;
             camera.maxZ = parsedCamera.maxZ;
@@ -599,7 +641,7 @@
 
 
             // Parent
             // Parent
             if (parsedMesh.parentId) {
             if (parsedMesh.parentId) {
-                mesh.parent = scene.getLastEntryByID(parsedMesh.parentId);
+                mesh._waitingParentId = parsedMesh.parentId;
             }
             }
 
 
             // Geometry
             // Geometry
@@ -990,6 +1032,14 @@
                     }
                     }
                 }
                 }
 
 
+                for (index = 0; index < scene.meshes.length; index++) {
+                    var currentMesh = scene.meshes[index];
+                    if (currentMesh._waitingParentId) {
+                        currentMesh.parent = scene.getLastEntryByID(currentMesh._waitingParentId);
+                        currentMesh._waitingParentId = undefined;
+                    }
+                }
+
                 // Particles
                 // Particles
                 if (parsedData.particleSystems) {
                 if (parsedData.particleSystems) {
                     for (index = 0; index < parsedData.particleSystems.length; index++) {
                     for (index = 0; index < parsedData.particleSystems.length; index++) {
@@ -1027,15 +1077,6 @@
                     parseLight(parsedLight, scene);
                     parseLight(parsedLight, scene);
                 }
                 }
 
 
-                for (index = 0; index < parsedData.cameras.length; index++) {
-                    var parsedCamera = parsedData.cameras[index];
-                    parseCamera(parsedCamera, scene);
-                }
-
-                if (parsedData.activeCameraID) {
-                    scene.setActiveCameraByID(parsedData.activeCameraID);
-                }
-
                 // Materials
                 // Materials
                 if (parsedData.materials) {
                 if (parsedData.materials) {
                     for (index = 0; index < parsedData.materials.length; index++) {
                     for (index = 0; index < parsedData.materials.length; index++) {
@@ -1140,19 +1181,28 @@
                     parseMesh(parsedMesh, scene, rootUrl);
                     parseMesh(parsedMesh, scene, rootUrl);
                 }
                 }
 
 
+                for (index = 0; index < parsedData.cameras.length; index++) {
+                    var parsedCamera = parsedData.cameras[index];
+                    parseCamera(parsedCamera, scene);
+                }
+
+                if (parsedData.activeCameraID) {
+                    scene.setActiveCameraByID(parsedData.activeCameraID);
+                }
+
                 for (index = 0; index < scene.cameras.length; index++) {
                 for (index = 0; index < scene.cameras.length; index++) {
                     var camera = scene.cameras[index];
                     var camera = scene.cameras[index];
                     if (camera._waitingParentId) {
                     if (camera._waitingParentId) {
                         camera.parent = scene.getLastEntryByID(camera._waitingParentId);
                         camera.parent = scene.getLastEntryByID(camera._waitingParentId);
-                        delete camera._waitingParentId;
+                        camera._waitingParentId = undefined;
                     }
                     }
+                }
 
 
-                    if (camera instanceof BABYLON.FreeCamera) {
-                        var freecamera = camera;
-                        if (freecamera._waitingLockedTargetId) {
-                            freecamera.lockedTarget = scene.getLastEntryByID(freecamera._waitingLockedTargetId);
-                            delete freecamera._waitingLockedTargetId;
-                        }
+                for (index = 0; index < scene.meshes.length; index++) {
+                    var mesh = scene.meshes[index];
+                    if (mesh._waitingParentId) {
+                        mesh.parent = scene.getLastEntryByID(mesh._waitingParentId);
+                        mesh._waitingParentId = undefined;
                     }
                     }
                 }
                 }
 
 

+ 87 - 26
Babylon/Loading/Plugins/babylon.babylonFileLoader.ts

@@ -352,8 +352,65 @@
         }
         }
     };
     };
 
 
-    var parseCamera = (parsedCamera, scene) => {
-        var camera = new BABYLON.FreeCamera(parsedCamera.name, BABYLON.Vector3.FromArray(parsedCamera.position), scene);
+    var parseCamera = (parsedCamera, scene: Scene) => {
+        var camera;
+        var position = Vector3.FromArray(parsedCamera.position);
+        var lockedTargetMesh = (parsedCamera.lockedTargetId) ? scene.getLastMeshByID(parsedCamera.lockedTargetId) : null;
+
+        if (parsedCamera.type === "AnaglyphArcRotateCamera" || parsedCamera.type === "ArcRotateCamera") {
+            var alpha = parsedCamera.alpha;
+            var beta = parsedCamera.beta;
+            var radius = parsedCamera.radius;
+            if (parsedCamera.type === "AnaglyphArcRotateCamera") {
+                var eye_space = parsedCamera.eye_space;
+                camera = new AnaglyphArcRotateCamera(parsedCamera.name, alpha, beta, radius, lockedTargetMesh, eye_space, scene);
+            } else {
+                camera = new ArcRotateCamera(parsedCamera.name, alpha, beta, radius, lockedTargetMesh, scene);
+            }
+
+        } else if (parsedCamera.type === "AnaglyphFreeCamera") {
+            var eye_space = parsedCamera.eye_space;
+            camera = new AnaglyphFreeCamera(parsedCamera.name, position, eye_space, scene);
+
+        } else if (parsedCamera.type === "DeviceOrientationCamera") {
+            camera = new DeviceOrientationCamera(parsedCamera.name, position, scene);
+
+        } else if (parsedCamera.type === "FollowCamera") {
+            camera = new FollowCamera(parsedCamera.name, position, scene);
+            camera.heightOffset = parsedCamera.heightOffset;
+            camera.radius = parsedCamera.radius;
+            camera.rotationOffset = parsedCamera.rotationOffset;
+            if (lockedTargetMesh)
+                (<FollowCamera>camera).target = lockedTargetMesh;
+
+        } else if (parsedCamera.type === "GamepadCamera") {
+            camera = new GamepadCamera(parsedCamera.name, position, scene);
+
+        } else if (parsedCamera.type === "OculusCamera") {
+            camera = new OculusCamera(parsedCamera.name, position, scene);
+
+        } else if (parsedCamera.type === "TouchCamera") {
+            camera = new TouchCamera(parsedCamera.name, position, scene);
+
+        } else if (parsedCamera.type === "VirtualJoysticksCamera") {
+            camera = new VirtualJoysticksCamera(parsedCamera.name, position, scene);
+
+        } else if (parsedCamera.type === "WebVRCamera") {
+            camera = new WebVRCamera(parsedCamera.name, position, scene);
+
+        } else if (parsedCamera.type === "VRDeviceOrientationCamera") {
+            camera = new VRDeviceOrientationCamera(parsedCamera.name, position, scene);
+
+        } else {
+            // Free Camera is the default value
+            camera = new FreeCamera(parsedCamera.name, position, scene);
+        }
+
+        // Test for lockedTargetMesh & FreeCamera outside of if-else-if nest, since things like GamepadCamera extend FreeCamera
+        if (lockedTargetMesh && camera instanceof FreeCamera) {
+            (<FreeCamera>camera).lockedTarget = lockedTargetMesh;
+        }
+
         camera.id = parsedCamera.id;
         camera.id = parsedCamera.id;
 
 
         BABYLON.Tags.AddTagsTo(camera, parsedCamera.tags);
         BABYLON.Tags.AddTagsTo(camera, parsedCamera.tags);
@@ -370,11 +427,6 @@
             camera.rotation = BABYLON.Vector3.FromArray(parsedCamera.rotation);
             camera.rotation = BABYLON.Vector3.FromArray(parsedCamera.rotation);
         }
         }
 
 
-        // Locked target
-        if (parsedCamera.lockedTargetId) {
-            camera._waitingLockedTargetId = parsedCamera.lockedTargetId;
-        }
-
         camera.fov = parsedCamera.fov;
         camera.fov = parsedCamera.fov;
         camera.minZ = parsedCamera.minZ;
         camera.minZ = parsedCamera.minZ;
         camera.maxZ = parsedCamera.maxZ;
         camera.maxZ = parsedCamera.maxZ;
@@ -598,7 +650,7 @@
 
 
         // Parent
         // Parent
         if (parsedMesh.parentId) {
         if (parsedMesh.parentId) {
-            mesh.parent = scene.getLastEntryByID(parsedMesh.parentId);
+            mesh._waitingParentId = parsedMesh.parentId;
         }
         }
 
 
         // Geometry
         // Geometry
@@ -993,6 +1045,15 @@
                 }
                 }
             }
             }
 
 
+            // Connecting parents
+            for (index = 0; index < scene.meshes.length; index++) {
+                var currentMesh = scene.meshes[index];
+                if (currentMesh._waitingParentId) {
+                    currentMesh.parent = scene.getLastEntryByID(currentMesh._waitingParentId);
+                    currentMesh._waitingParentId = undefined;
+                }
+            }
+
             // Particles
             // Particles
             if (parsedData.particleSystems) {
             if (parsedData.particleSystems) {
                 for (index = 0; index < parsedData.particleSystems.length; index++) {
                 for (index = 0; index < parsedData.particleSystems.length; index++) {
@@ -1031,16 +1092,6 @@
                 parseLight(parsedLight, scene);
                 parseLight(parsedLight, scene);
             }
             }
 
 
-            // Cameras
-            for (index = 0; index < parsedData.cameras.length; index++) {
-                var parsedCamera = parsedData.cameras[index];
-                parseCamera(parsedCamera, scene);
-            }
-
-            if (parsedData.activeCameraID) {
-                scene.setActiveCameraByID(parsedData.activeCameraID);
-            }
-
             // Materials
             // Materials
             if (parsedData.materials) {
             if (parsedData.materials) {
                 for (index = 0; index < parsedData.materials.length; index++) {
                 for (index = 0; index < parsedData.materials.length; index++) {
@@ -1146,20 +1197,30 @@
                 parseMesh(parsedMesh, scene, rootUrl);
                 parseMesh(parsedMesh, scene, rootUrl);
             }
             }
 
 
-            // Connecting cameras parents and locked target
+            // Cameras
+            for (index = 0; index < parsedData.cameras.length; index++) {
+                var parsedCamera = parsedData.cameras[index];
+                parseCamera(parsedCamera, scene);
+            }
+
+            if (parsedData.activeCameraID) {
+                scene.setActiveCameraByID(parsedData.activeCameraID);
+            }
+
+            // Connecting parents
             for (index = 0; index < scene.cameras.length; index++) {
             for (index = 0; index < scene.cameras.length; index++) {
                 var camera = scene.cameras[index];
                 var camera = scene.cameras[index];
                 if (camera._waitingParentId) {
                 if (camera._waitingParentId) {
                     camera.parent = scene.getLastEntryByID(camera._waitingParentId);
                     camera.parent = scene.getLastEntryByID(camera._waitingParentId);
-                    delete camera._waitingParentId;
+                    camera._waitingParentId = undefined;
                 }
                 }
+            }
 
 
-                if (camera instanceof BABYLON.FreeCamera) {
-                    var freecamera = <FreeCamera>camera;
-                    if (freecamera._waitingLockedTargetId) {
-                        freecamera.lockedTarget = scene.getLastEntryByID(freecamera._waitingLockedTargetId);
-                        delete freecamera._waitingLockedTargetId;
-                    }
+            for (index = 0; index < scene.meshes.length; index++) {
+                var mesh = scene.meshes[index];
+                if (mesh._waitingParentId) {
+                    mesh.parent = scene.getLastEntryByID(mesh._waitingParentId);
+                    mesh._waitingParentId = undefined;
                 }
                 }
             }
             }
 
 

+ 1 - 1
Babylon/Mesh/babylon.abstractMesh.js

@@ -346,7 +346,7 @@ var BABYLON;
             this._localPivotScaling.multiplyToRef(this._localRotation, this._localPivotScalingRotation);
             this._localPivotScaling.multiplyToRef(this._localRotation, this._localPivotScalingRotation);
 
 
             // Billboarding
             // Billboarding
-            if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE) {
+            if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE && this.getScene().activeCamera) {
                 var localPosition = this.position.clone();
                 var localPosition = this.position.clone();
                 var zero = this.getScene().activeCamera.position.clone();
                 var zero = this.getScene().activeCamera.position.clone();
 
 

+ 1 - 1
Babylon/Mesh/babylon.abstractMesh.ts

@@ -340,7 +340,7 @@
             this._localPivotScaling.multiplyToRef(this._localRotation, this._localPivotScalingRotation);
             this._localPivotScaling.multiplyToRef(this._localRotation, this._localPivotScalingRotation);
 
 
             // Billboarding
             // Billboarding
-            if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE) {
+            if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE && this.getScene().activeCamera) {
                 var localPosition = this.position.clone();
                 var localPosition = this.position.clone();
                 var zero = this.getScene().activeCamera.position.clone();
                 var zero = this.getScene().activeCamera.position.clone();
 
 

+ 10 - 65
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.js

@@ -1,14 +1,13 @@
 var BABYLON;
 var BABYLON;
 (function (BABYLON) {
 (function (BABYLON) {
     var PostProcessRenderEffect = (function () {
     var PostProcessRenderEffect = (function () {
-        function PostProcessRenderEffect(engine, name, postProcessType, ratio, samplingMode, singleInstance) {
+        function PostProcessRenderEffect(engine, name, getPostProcess, singleInstance) {
             this._engine = engine;
             this._engine = engine;
             this._name = name;
             this._name = name;
-            this._postProcessType = postProcessType;
-            this._ratio = ratio || 1.0;
-            this._samplingMode = samplingMode || null;
             this._singleInstance = singleInstance || true;
             this._singleInstance = singleInstance || true;
 
 
+            this._getPostProcess = getPostProcess;
+
             this._cameras = [];
             this._cameras = [];
 
 
             this._postProcesses = [];
             this._postProcesses = [];
@@ -16,64 +15,7 @@ var BABYLON;
 
 
             this._renderPasses = [];
             this._renderPasses = [];
             this._renderEffectAsPasses = [];
             this._renderEffectAsPasses = [];
-
-            this.parameters = function (effect) {
-            };
         }
         }
-        PostProcessRenderEffect._GetInstance = function (engine, postProcessType, ratio, samplingMode) {
-            var postProcess;
-            var instance;
-            var args = [];
-
-            var parameters = PostProcessRenderEffect._GetParametersNames(postProcessType);
-            for (var i = 0; i < parameters.length; i++) {
-                switch (parameters[i]) {
-                    case "name":
-                        args[i] = postProcessType.toString();
-                        break;
-                    case "ratio":
-                        args[i] = ratio;
-                        break;
-                    case "camera":
-                        args[i] = null;
-                        break;
-                    case "samplingMode":
-                        args[i] = samplingMode;
-                        break;
-                    case "engine":
-                        args[i] = engine;
-                        break;
-                    case "reusable":
-                        args[i] = true;
-                        break;
-                    default:
-                        args[i] = null;
-                        break;
-                }
-            }
-
-            postProcess = function () {
-            };
-            postProcess.prototype = postProcessType.prototype;
-
-            instance = new postProcess();
-            postProcessType.apply(instance, args);
-
-            return instance;
-        };
-
-        PostProcessRenderEffect._GetParametersNames = function (func) {
-            var commentsRegex = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
-            var functWithoutComments = func.toString().replace(commentsRegex, '');
-
-            var parameters = functWithoutComments.slice(functWithoutComments.indexOf('(') + 1, functWithoutComments.indexOf(')')).match(/([^\s,]+)/g);
-
-            if (parameters === null)
-                parameters = [];
-
-            return parameters;
-        };
-
         PostProcessRenderEffect.prototype._update = function () {
         PostProcessRenderEffect.prototype._update = function () {
             for (var renderPassName in this._renderPasses) {
             for (var renderPassName in this._renderPasses) {
                 this._renderPasses[renderPassName]._update();
                 this._renderPasses[renderPassName]._update();
@@ -127,11 +69,11 @@ var BABYLON;
                     cameraKey = cameraName;
                     cameraKey = cameraName;
                 }
                 }
 
 
-                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || PostProcessRenderEffect._GetInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
+                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || this._getPostProcess();
 
 
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
 
 
-                if (this._indicesForCamera[cameraName] === null) {
+                if (!this._indicesForCamera[cameraName]) {
                     this._indicesForCamera[cameraName] = [];
                     this._indicesForCamera[cameraName] = [];
                 }
                 }
 
 
@@ -214,8 +156,11 @@ var BABYLON;
         PostProcessRenderEffect.prototype._linkParameters = function () {
         PostProcessRenderEffect.prototype._linkParameters = function () {
             var _this = this;
             var _this = this;
             for (var index in this._postProcesses) {
             for (var index in this._postProcesses) {
-                this._postProcesses[index].onApply = function (effect) {
-                    _this.parameters(effect);
+                if (this.applyParameters) {
+                    this.applyParameters(this._postProcesses[index]);
+                }
+
+                this._postProcesses[index].onBeforeRender = function (effect) {
                     _this._linkTextures(effect);
                     _this._linkTextures(effect);
                 };
                 };
             }
             }

+ 12 - 67
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.ts

@@ -3,10 +3,8 @@ module BABYLON {
         private _engine: Engine;
         private _engine: Engine;
 
 
         private _postProcesses: PostProcess[];
         private _postProcesses: PostProcess[];
-        private _postProcessType; //The type must inherit from PostProcess (example: BABYLON.BlackAndWhitePostProcess, like this without quotes).
+        private _getPostProcess: () => PostProcess;
 
 
-        private _ratio: number;
-        private _samplingMode: number;
         private _singleInstance: boolean;
         private _singleInstance: boolean;
 
 
         private _cameras: Camera[];
         private _cameras: Camera[];
@@ -18,16 +16,15 @@ module BABYLON {
         // private
         // private
         public _name: string;
         public _name: string;
 
 
-        public parameters: (effect: Effect) => void;
+        public applyParameters: (postProcess: PostProcess) => void;
 
 
-        constructor(engine: Engine, name: string, postProcessType, ratio?: number, samplingMode?: number, singleInstance?: boolean) {
+        constructor(engine: Engine, name: string, getPostProcess: () => PostProcess, singleInstance?: boolean) {
             this._engine = engine;
             this._engine = engine;
             this._name = name;
             this._name = name;
-            this._postProcessType = postProcessType;
-            this._ratio = ratio || 1.0;
-            this._samplingMode = samplingMode || null;
             this._singleInstance = singleInstance || true;
             this._singleInstance = singleInstance || true;
 
 
+            this._getPostProcess = getPostProcess;
+
             this._cameras = [];
             this._cameras = [];
 
 
             this._postProcesses = [];
             this._postProcesses = [];
@@ -35,61 +32,6 @@ module BABYLON {
 
 
             this._renderPasses = [];
             this._renderPasses = [];
             this._renderEffectAsPasses = [];
             this._renderEffectAsPasses = [];
-
-            this.parameters = (effect: Effect) => { };
-        }
-
-        private static _GetInstance(engine: Engine, postProcessType, ratio: number, samplingMode: number): PostProcess {
-            var postProcess;
-            var instance;
-            var args = [];
-
-            var parameters = PostProcessRenderEffect._GetParametersNames(postProcessType);
-            for (var i = 0; i < parameters.length; i++) {
-                switch (parameters[i]) {
-                    case "name":
-                        args[i] = postProcessType.toString();
-                        break;
-                    case "ratio":
-                        args[i] = ratio;
-                        break;
-                    case "camera":
-                        args[i] = null;
-                        break;
-                    case "samplingMode":
-                        args[i] = samplingMode;
-                        break;
-                    case "engine":
-                        args[i] = engine;
-                        break;
-                    case "reusable":
-                        args[i] = true;
-                        break;
-                    default:
-                        args[i] = null;
-                        break;
-                }
-            }
-
-            postProcess = function () { };
-            postProcess.prototype = postProcessType.prototype;
-
-            instance = new postProcess();
-            postProcessType.apply(instance, args);
-
-            return instance;
-        }
-
-        private static _GetParametersNames(func): string[] {
-            var commentsRegex = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
-            var functWithoutComments = func.toString().replace(commentsRegex, '');
-
-            var parameters = functWithoutComments.slice(functWithoutComments.indexOf('(') + 1, functWithoutComments.indexOf(')')).match(/([^\s,]+)/g);
-
-            if (parameters === null)
-                parameters = [];
-
-            return parameters;
         }
         }
 
 
         public _update(): void {
         public _update(): void {
@@ -149,11 +91,11 @@ module BABYLON {
                     cameraKey = cameraName;
                     cameraKey = cameraName;
                 }
                 }
 
 
-                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || PostProcessRenderEffect._GetInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
+                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || this._getPostProcess();
 
 
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
 
 
-                if (this._indicesForCamera[cameraName] === null) {
+                if (!this._indicesForCamera[cameraName]) {
                     this._indicesForCamera[cameraName] = [];
                     this._indicesForCamera[cameraName] = [];
                 }
                 }
 
 
@@ -245,8 +187,11 @@ module BABYLON {
 
 
         private _linkParameters(): void {
         private _linkParameters(): void {
             for (var index in this._postProcesses) {
             for (var index in this._postProcesses) {
-                this._postProcesses[index].onApply = (effect: Effect) => {
-                    this.parameters(effect);
+                if (this.applyParameters) {
+                    this.applyParameters(this._postProcesses[index]);
+                }
+
+                this._postProcesses[index].onBeforeRender = (effect: Effect) => {
                     this._linkTextures(effect);
                     this._linkTextures(effect);
                 };
                 };
             }
             }

+ 10 - 4
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.js

@@ -21,7 +21,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderEffects.enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
         };
 
 
         PostProcessRenderPipeline.prototype._disableEffect = function (renderEffectName, cameras) {
         PostProcessRenderPipeline.prototype._disableEffect = function (renderEffectName, cameras) {
@@ -31,7 +31,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderEffects.disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
         };
 
 
         PostProcessRenderPipeline.prototype._attachCameras = function (cameras, unique) {
         PostProcessRenderPipeline.prototype._attachCameras = function (cameras, unique) {
@@ -72,6 +72,7 @@ var BABYLON;
         };
         };
 
 
         PostProcessRenderPipeline.prototype._enableDisplayOnlyPass = function (passName, cameras) {
         PostProcessRenderPipeline.prototype._enableDisplayOnlyPass = function (passName, cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
 
             var pass = null;
             var pass = null;
@@ -98,7 +99,9 @@ var BABYLON;
                 var camera = _cam[i];
                 var camera = _cam[i];
                 var cameraName = camera.name;
                 var cameraName = camera.name;
 
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
@@ -106,13 +109,16 @@ var BABYLON;
         };
         };
 
 
         PostProcessRenderPipeline.prototype._disableDisplayOnlyPass = function (cameras) {
         PostProcessRenderPipeline.prototype._disableDisplayOnlyPass = function (cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
 
             for (var i = 0; i < _cam.length; i++) {
             for (var i = 0; i < _cam.length; i++) {
                 var camera = _cam[i];
                 var camera = _cam[i];
                 var cameraName = camera.name;
                 var cameraName = camera.name;
 
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
             }
             }
 
 

+ 8 - 6
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts

@@ -32,25 +32,25 @@ module BABYLON {
         public _enableEffect(renderEffectName: string, cameras: Camera);
         public _enableEffect(renderEffectName: string, cameras: Camera);
         public _enableEffect(renderEffectName: string, cameras: Camera[]);
         public _enableEffect(renderEffectName: string, cameras: Camera[]);
         public _enableEffect(renderEffectName: string, cameras: any): void {
         public _enableEffect(renderEffectName: string, cameras: any): void {
-            var renderEffects = this._renderEffects[renderEffectName];
+            var renderEffects: PostProcessRenderEffect = this._renderEffects[renderEffectName];
 
 
             if (!renderEffects) {
             if (!renderEffects) {
                 return;
                 return;
             }
             }
 
 
-            renderEffects.enable(Tools.MakeArray(cameras || this._cameras));
+            renderEffects._enable(Tools.MakeArray(cameras || this._cameras));
         }
         }
 
 
         public _disableEffect(renderEffectName: string, cameras: Camera);
         public _disableEffect(renderEffectName: string, cameras: Camera);
         public _disableEffect(renderEffectName: string, cameras: Camera[]);
         public _disableEffect(renderEffectName: string, cameras: Camera[]);
         public _disableEffect(renderEffectName: string, cameras): void {
         public _disableEffect(renderEffectName: string, cameras): void {
-            var renderEffects = this._renderEffects[renderEffectName];
+            var renderEffects: PostProcessRenderEffect = this._renderEffects[renderEffectName];
 
 
             if (!renderEffects) {
             if (!renderEffects) {
                 return;
                 return;
             }
             }
 
 
-            renderEffects.disable(Tools.MakeArray(cameras || this._cameras));
+            renderEffects._disable(Tools.MakeArray(cameras || this._cameras));
         }
         }
 
 
         public _attachCameras(cameras: Camera, unique: boolean);
         public _attachCameras(cameras: Camera, unique: boolean);
@@ -124,7 +124,8 @@ module BABYLON {
                 var camera = _cam[i];
                 var camera = _cam[i];
                 var cameraName = camera.name;
                 var cameraName = camera.name;
 
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME,
+                    () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, this._engine, true) });
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
@@ -140,7 +141,8 @@ module BABYLON {
                 var camera = _cam[i];
                 var camera = _cam[i];
                 var cameraName = camera.name;
                 var cameraName = camera.name;
 
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, 
+                                    () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, this._engine, true) });
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
             }
             }
 
 

+ 7 - 7
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.js

@@ -2,7 +2,7 @@ var BABYLON;
 (function (BABYLON) {
 (function (BABYLON) {
     var PostProcessRenderPipelineManager = (function () {
     var PostProcessRenderPipelineManager = (function () {
         function PostProcessRenderPipelineManager() {
         function PostProcessRenderPipelineManager() {
-            this._renderPipelines = [];
+            this._renderPipelines = new Array();
         }
         }
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
             this._renderPipelines[renderPipeline._name] = renderPipeline;
             this._renderPipelines[renderPipeline._name] = renderPipeline;
@@ -15,7 +15,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.attachCameras(cameras, unique);
+            renderPipeline._attachCameras(cameras, unique);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.detachCamerasFromRenderPipeline = function (renderPipelineName, cameras) {
         PostProcessRenderPipelineManager.prototype.detachCamerasFromRenderPipeline = function (renderPipelineName, cameras) {
@@ -25,7 +25,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.detachCameras(cameras);
+            renderPipeline._detachCameras(cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.enableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
         PostProcessRenderPipelineManager.prototype.enableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -35,7 +35,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.enableEffect(renderEffectName, cameras);
+            renderPipeline._enableEffect(renderEffectName, cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.disableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
         PostProcessRenderPipelineManager.prototype.disableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -45,7 +45,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.disableEffect(renderEffectName, cameras);
+            renderPipeline._disableEffect(renderEffectName, cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.enableDisplayOnlyPassInPipeline = function (renderPipelineName, passName, cameras) {
         PostProcessRenderPipelineManager.prototype.enableDisplayOnlyPassInPipeline = function (renderPipelineName, passName, cameras) {
@@ -55,7 +55,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.enableDisplayOnlyPass(passName, cameras);
+            renderPipeline._enableDisplayOnlyPass(passName, cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.disableDisplayOnlyPassInPipeline = function (renderPipelineName, cameras) {
         PostProcessRenderPipelineManager.prototype.disableDisplayOnlyPassInPipeline = function (renderPipelineName, cameras) {
@@ -65,7 +65,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.disableDisplayOnlyPass(cameras);
+            renderPipeline._disableDisplayOnlyPass(cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.update = function () {
         PostProcessRenderPipelineManager.prototype.update = function () {

+ 14 - 14
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.ts

@@ -1,9 +1,9 @@
 module BABYLON {
 module BABYLON {
     export class PostProcessRenderPipelineManager {
     export class PostProcessRenderPipelineManager {
-        private _renderPipelines: PostProcessRenderPipeline[];
+        private _renderPipelines: Array<PostProcessRenderPipeline>;
 
 
         constructor() {
         constructor() {
-            this._renderPipelines = [];
+            this._renderPipelines = new Array<PostProcessRenderPipeline>();
         }
         }
 
 
         public addPipeline(renderPipeline: PostProcessRenderPipeline): void {
         public addPipeline(renderPipeline: PostProcessRenderPipeline): void {
@@ -13,73 +13,73 @@ module BABYLON {
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera, unique?: boolean);
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera, unique?: boolean);
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera[], unique?: boolean);
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera[], unique?: boolean);
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: any, unique?: boolean): void {
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: any, unique?: boolean): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
 
             if (!renderPipeline) {
             if (!renderPipeline) {
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.attachCameras(cameras, unique);
+            renderPipeline._attachCameras(cameras, unique);
         }
         }
 
 
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera);
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera);
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera[]);
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera[]);
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: any): void {
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
 
             if (!renderPipeline) {
             if (!renderPipeline) {
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.detachCameras(cameras);
+            renderPipeline._detachCameras(cameras);
         }
         }
 
 
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera);
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera);
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[]);
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[]);
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: any): void {
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
 
             if (!renderPipeline) {
             if (!renderPipeline) {
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.enableEffect(renderEffectName, cameras);
+            renderPipeline._enableEffect(renderEffectName, cameras);
         }
         }
 
 
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera);
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera);
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[]);
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[]);
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: any): void {
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
 
             if (!renderPipeline) {
             if (!renderPipeline) {
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.disableEffect(renderEffectName, cameras);
+            renderPipeline._disableEffect(renderEffectName, cameras);
         }
         }
 
 
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: Camera);
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: Camera);
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: Camera[]);
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: Camera[]);
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: any): void {
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
 
             if (!renderPipeline) {
             if (!renderPipeline) {
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.enableDisplayOnlyPass(passName, cameras);
+            renderPipeline._enableDisplayOnlyPass(passName, cameras);
         }
         }
 
 
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: Camera);
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: Camera);
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: Camera[]);
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: Camera[]);
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: any): void {
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
 
             if (!renderPipeline) {
             if (!renderPipeline) {
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.disableDisplayOnlyPass(cameras);
+            renderPipeline._disableDisplayOnlyPass(cameras);
         }
         }
 
 
         public update(): void {
         public update(): void {

+ 1 - 0
Babylon/PostProcess/babylon.postProcess.ts

@@ -1,6 +1,7 @@
 module BABYLON {
 module BABYLON {
     export class PostProcess {
     export class PostProcess {
         public onApply: (Effect) => void;
         public onApply: (Effect) => void;
+        public onBeforeRender: (Effect) => void;
         public onSizeChanged: () => void;
         public onSizeChanged: () => void;
         public onActivate: (Camera) => void;
         public onActivate: (Camera) => void;
         public width = -1;
         public width = -1;

+ 6 - 1
Babylon/PostProcess/babylon.postProcessManager.js

@@ -64,9 +64,14 @@
                     break;
                     break;
                 }
                 }
 
 
-                var effect = postProcesses[postProcessesTakenIndices[index]].apply();
+                var pp = postProcesses[postProcessesTakenIndices[index]];
+                var effect = pp.apply();
 
 
                 if (effect) {
                 if (effect) {
+                    if (pp.onBeforeRender) {
+                        pp.onBeforeRender(effect);
+                    }
+
                     // VBOs
                     // VBOs
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
 
 

+ 6 - 1
Babylon/PostProcess/babylon.postProcessManager.ts

@@ -68,9 +68,14 @@
                     break;
                     break;
                 }
                 }
 
 
-                var effect = postProcesses[postProcessesTakenIndices[index]].apply();
+                var pp = postProcesses[postProcessesTakenIndices[index]];
+                var effect = pp.apply();
 
 
                 if (effect) {
                 if (effect) {
+                    if (pp.onBeforeRender) {
+                        pp.onBeforeRender(effect);
+                    }
+
                     // VBOs
                     // VBOs
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
 
 

+ 2 - 0
Babylon/babylon.node.ts

@@ -14,6 +14,8 @@
         private _isReady = true;
         private _isReady = true;
         public _currentRenderId = -1;
         public _currentRenderId = -1;
 
 
+        public _waitingParentId: string;
+
         private _scene: Scene;
         private _scene: Scene;
         public _cache;
         public _cache;
 
 

+ 0 - 4
Exporters/Blender/blender-test/TOB-out/.gitignore

@@ -1,4 +0,0 @@
-# Ignore everything in this directory, but not require tester to create dir
-*
-# Except this file
-!.gitignore

+ 0 - 74
Exporters/Blender/blender-test/armature_JSON.html

@@ -1,74 +0,0 @@
-<html>
-<head>
-    <meta charset="UTF-8">
-    <title>armature</title>
-    <!-- edit path - name of babylon library as required -->
-    <script src="./lib/babylon.js"></script>
-    <style>
-         html, body   { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } 
-         #renderCanvas{ width: 100%; height: 100%; } 
-         #button      {
-			color: white; background-color: Dimgray;
-			font-size: 14pt; font-weight: bold;
-			padding-left:4pt; padding-right:4pt;
-			
-			border: black outset 2pt; line-height: 2em;
-			cursor: pointer;
-		}     
-    </style>
-</head>
-<body>
-	<div id="buttonbar" style="background-color: Darkorange;">
-		<span id="button" onclick="pausePlay()"> Pause - Play </span>
-	</div>
-<canvas id="renderCanvas"></canvas>
-<script>
-    if (BABYLON.Engine.isSupported()) {
-        var canvas = document.getElementById("renderCanvas");
-        var engine = new BABYLON.Engine(canvas, true);
-        console.log("Babylon version:  " + BABYLON.Engine.Version);
-
-        var running = true;
-        var skeleton;
-        var scene;
-        var url = "./TOB-out/"; // edit when .babylon / texture files in a different dir than html
-        BABYLON.SceneLoader.Load(url, "armature.babylon", engine, 
-            function (newScene) {
-      	        scene = newScene; // assign so visible external function
-      	        
-                newScene.executeWhenReady(function () {
-                    skeleton = newScene.getSkeletonById(0); // leave integer due to legacy exporter
-                    newScene.beginAnimation(skeleton, 1, 45, true, 1);
-                    
-                   // Attach camera to canvas inputs
-                    newScene.activeCamera.attachControl(canvas);
-
-                    // Once the scene is loaded, register a render loop
-                    engine.runRenderLoop(function() {
-                        newScene.render();
-                    });
-                });
-            },
-            function (progress) {
-                // To do: give progress feedback to user
-            }
-        );
-    }else{
-        alert("WebGL not supported in this browser.\n\n" + 
-              "If in Safari browser, check 'Show Develop menu in menu bar' on the Advanced tab of Preferences.  " +
-              "On the 'Develop' menu, check the 'Enable WebGL' menu item.");
-    }
-
-    //Resize
-    window.addEventListener("resize", function () {
-        engine.resize();
-    });
-    function pausePlay() {
-        var animatable = scene.getAnimatableByTarget(skeleton);
-    	if (!running)animatable.restart();
-    	else animatable.pause();
-    	running = !running;
-    }
-</script>
-</body>
-</html>

+ 0 - 63
Exporters/Blender/blender-test/armature_inline.html

@@ -1,63 +0,0 @@
-<html>
-<head>
-    <meta charset="UTF-8">
-    <title>armature</title>
-    <!-- edit path - name of babylon library as required -->
-    <script src="./lib/babylon.js"></script>
-    <script src="./TOB-out/armature.js"></script>
-    <style>
-         html, body   { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } 
-         #renderCanvas{ width: 100%; height: 100%; } 
-         #button      {
-			color: white; background-color: Dimgray;
-			font-size: 14pt; font-weight: bold;
-			padding-left:4pt; padding-right:4pt;
-			
-			border: black outset 2pt; line-height: 2em;
-			cursor: pointer;
-		}     
-    </style>
-</head>
-<body>
-	<div id="buttonbar" style="background-color: Darkorange;">
-		<span id="button" onclick="pausePlay()"> Pause - Play </span>
-	</div>
-<canvas id="renderCanvas"></canvas>
-<script>
-    if (BABYLON.Engine.isSupported()) {
-        var canvas = document.getElementById("renderCanvas");
-        var engine = new BABYLON.Engine(canvas, true);
-        console.log("Babylon version:  " + BABYLON.Engine.Version);
-
-        var scene = new BABYLON.Scene(engine);
-        materialsRootDir = "./TOB-out"; // edit when texture files in a different dir than html
-        armature.initScene(scene, materialsRootDir);
-        
-        var skeleton = scene.getSkeletonById("0"); // string required for .js & .ts
-        scene.beginAnimation(skeleton, 1, 45, true, 1);
-        var running = true;
-        
-        scene.activeCamera.attachControl(canvas);
-        engine.runRenderLoop(function () {
-            scene.render();
-        });
-    }else{
-        alert("WebGL not supported in this browser.\n\n" + 
-              "If in Safari browser, check 'Show Develop menu in menu bar' on the Advanced tab of Preferences.  " +
-              "On the 'Develop' menu, check the 'Enable WebGL' menu item.");
-    }
-
-    //Resize
-    window.addEventListener("resize", function () {
-        engine.resize();
-    });
-	
-    function pausePlay() {
-        var animatable = scene.getAnimatableByTarget(skeleton);
-    	if (!running)animatable.restart();
-    	else animatable.pause();
-    	running = !running;
-    }
-</script>
-</body>
-</html>

二进制
Exporters/Blender/blender-test/blender-in/armature.blend


二进制
Exporters/Blender/blender-test/blender-in/camera_anim.blend


二进制
Exporters/Blender/blender-test/blender-in/mesh_parent.blend


二进制
Exporters/Blender/blender-test/blender-in/tmage512.png


+ 0 - 75
Exporters/Blender/blender-test/camera_anim_JSON.html

@@ -1,75 +0,0 @@
-<html>
-<head>
-    <meta charset="UTF-8">
-    <title>camera_anim</title>
-    <!-- edit path - name of babylon library as required -->
-    <script src="./lib/babylon.js"></script>
-    <style>
-         html, body   { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } 
-         #renderCanvas{ width: 100%; height: 100%; } 
-         #button      {
-			color: white; background-color: Dimgray;
-			font-size: 14pt; font-weight: bold;
-			padding-left:4pt; padding-right:4pt;
-			
-			border: black outset 2pt; line-height: 2em;
-			cursor: pointer;
-		}     
-    </style>
-</head>
-<body>
-	<div id="buttonbar" style="background-color: Darkorange;">
-		<span id="button" onclick="pausePlay()"> Pause - Play </span>
-	</div>
-<canvas id="renderCanvas"></canvas>
-<script>
-    if (BABYLON.Engine.isSupported()) {
-        var canvas = document.getElementById("renderCanvas");
-        var engine = new BABYLON.Engine(canvas, true);
-        console.log("Babylon version:  " + BABYLON.Engine.Version);
-
-        var running = true;
-        var myCam;
-        var scene;
-        var url = "./TOB-out/" // edit when .babylon / texture files in a different dir than html
-        BABYLON.SceneLoader.Load(url, "camera_anim.babylon", engine, 
-            function (newScene) {
-        	    scene = newScene; // assign so visible external function
-        	    
-                newScene.executeWhenReady(function () {
-                    myCam = newScene.getCameraByName("Camera");
-                    var myLight = newScene.getLightByID("Point"); 
-                    myLight.parent = myCam;
-                    // Attach camera to canvas inputs
-                    newScene.activeCamera.attachControl(canvas);
-
-                    // Once the scene is loaded, register a render loop
-                    engine.runRenderLoop(function() {
-                        newScene.render();
-                    });
-                });
-            },
-            function (progress) {
-                // To do: give progress feedback to user
-            }
-        );
-    }else{
-        alert("WebGL not supported in this browser.\n\n" + 
-              "If in Safari browser, check 'Show Develop menu in menu bar' on the Advanced tab of Preferences.  " +
-              "On the 'Develop' menu, check the 'Enable WebGL' menu item.");
-    }
-
-    // Resize
-    window.addEventListener("resize", function () {
-        engine.resize();
-    });
-	
-    function pausePlay() {
-        var animatable = scene.getAnimatableByTarget(myCam);
-    	if (!running)animatable.restart();
-    	else animatable.pause();
-    	running = !running;
-    }
-</script>
-</body>
-</html>

+ 0 - 63
Exporters/Blender/blender-test/camera_anim_inline.html

@@ -1,63 +0,0 @@
-<html>
-<head>
-    <meta charset="UTF-8">
-    <title>camera_anim</title>
-    <!-- edit path - name of babylon library as required -->
-    <script src="./lib/babylon.js"></script>
-    <script src="./TOB-out/camera_anim.js"></script>
-    <style>
-         html, body   { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } 
-         #renderCanvas{ width: 100%; height: 100%; } 
-         #button      {
-			color: white; background-color: Dimgray;
-			font-size: 14pt; font-weight: bold;
-			padding-left:4pt; padding-right:4pt;
-			
-			border: black outset 2pt; line-height: 2em;
-			cursor: pointer;
-		}     
-    </style>
-</head>
-<body>
-	<div id="buttonbar" style="background-color: Darkorange;">
-		<span id="button" onclick="pausePlay()"> Pause - Play </span>
-	</div>
-<canvas id="renderCanvas"></canvas>
-<script>
-    if (BABYLON.Engine.isSupported()) {
-        var canvas = document.getElementById("renderCanvas");
-        var engine = new BABYLON.Engine(canvas, true);
-        console.log("Babylon version:  " + BABYLON.Engine.Version);
-
-        var scene = new BABYLON.Scene(engine);
-        materialsRootDir = "./TOB-out"; // edit when texture files in a different dir than html
-        camera_anim.initScene(scene, materialsRootDir);
-        
-        var running = true;
-        var myCam = scene.getCameraByName("Camera");
-        var myLight = scene.getLightByID("Point"); 
-        myLight.parent = myCam;
-        scene.activeCamera.attachControl(canvas);
-        engine.runRenderLoop(function () {
-            scene.render();
-        });
-    }else{
-        alert("WebGL not supported in this browser.\n\n" + 
-              "If in Safari browser, check 'Show Develop menu in menu bar' on the Advanced tab of Preferences.  " +
-              "On the 'Develop' menu, check the 'Enable WebGL' menu item.");
-    }
-
-    // Resize
-    window.addEventListener("resize", function () {
-        engine.resize();
-    });
-	
-    function pausePlay() {
-        var animatable = scene.getAnimatableByTarget(myCam);
-    	if (!running)animatable.restart();
-    	else animatable.pause();
-    	running = !running;
-    }
-</script>
-</body>
-</html>

+ 0 - 2
Exporters/Blender/blender-test/lib/.gitignore

@@ -1,2 +0,0 @@
-# Ignore babylon.js in this directory, but not any other .js files that may be needed, which are not generated by TOB
-babylon.js

+ 0 - 53
Exporters/Blender/blender-test/lib/mesh_parent_common.js

@@ -1,53 +0,0 @@
-/**
- *  central location for mesh_parent script, called by mesh_parent_JSON.html & mesh_parent_inline.html 
- */
-var breadMan;
-var ground;
-var meshes;
-var delta = new BABYLON.Vector3(0, 0, -.1);
-var running = true;
-var parenting = true;
-definedFacingForward = true;
-        
-function animate(scene){
-	if (!breadMan) breadMan = scene.getMeshByID("Gus");
-	if (!ground  ) ground   = scene.getMeshByID("Ground");
-	if (!meshes  ) meshes   = scene.meshes;
-	
-	if (running){
-		breadMan.rotation.y += 0.02;
-	    breadMan.rotation.z += 0.02;
-	    movePOV(0, 0, 0.1);
-	}        	
-}
-/**  "Borrowed" from Automaton
- * Perform relative position change from the the point of view of behind the front of the mesh.
- * This is performed taking into account the meshes current rotation, so you do not have to care.
- * @param {number} amountRight
- * @param {number} amountUp
- * @param {number} amountForward
- */
- function movePOV(amountRight, amountUp, amountForward) {
-     var rotMatrix = new BABYLON.Matrix();
-     var rotQuaternion = (breadMan.rotationQuaternion) ? breadMan.rotationQuaternion : BABYLON.Quaternion.RotationYawPitchRoll(breadMan.rotation.y, breadMan.rotation.x, breadMan.rotation.z);
-     rotQuaternion.toRotationMatrix(rotMatrix);
-     
-     var translationDelta = BABYLON.Vector3.Zero();
-     var defForwardMult = definedFacingForward ? -1 : 1;
-     BABYLON.Vector3.TransformCoordinatesFromFloatsToRef(amountRight * defForwardMult, amountUp, amountForward * defForwardMult, rotMatrix, translationDelta);
-     breadMan.position.addInPlace(translationDelta);
- };
- 
- function pausePlay() {
- 	running = !running;
- }
- 
- function orphanConceive() {
-	 console.log("in orphan ");
-	 parenting = !parenting;
-     for (index = 0; index < meshes.length; index++) {
-         var mesh = meshes[index];
-         if (mesh === breadMan || mesh === ground) continue;
-         mesh.parent = parenting ? breadMan : null;
-     }
- }

+ 0 - 63
Exporters/Blender/blender-test/mesh_parent_JSON.html

@@ -1,63 +0,0 @@
-<html>
-<head>
-    <meta charset="UTF-8">
-    <title>mesh_parent</title>
-    <!-- edit path - name of babylon library as required -->
-    <script src="./lib/babylon.js"></script>
-    <script src="./lib/mesh_parent_common.js"></script>
-    <style>
-         html, body   { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } 
-         #renderCanvas{ width: 100%; height: 100%; } 
-         #button      {
-			color: white; background-color: Dimgray;
-			font-size: 14pt; font-weight: bold;
-			padding-left:4pt; padding-right:4pt;
-			
-			border: black outset 2pt; line-height: 2em;
-			cursor: pointer;
-		}     
-    </style>
-</head>
-<body>
-	<div id="buttonbar" style="background-color: Darkorange;">
-		<span id="button" onclick="pausePlay()"> Pause - Play </span>
-		<span id="button" onclick="orphanConceive()"> Orhpan - Conceive </span>
-	</div>
-<canvas id="renderCanvas"></canvas>
-<script>
-    if (BABYLON.Engine.isSupported()) {
-        var canvas = document.getElementById("renderCanvas");
-        var engine = new BABYLON.Engine(canvas, true);
-        console.log("Babylon version:  " + BABYLON.Engine.Version);
-
-        var url = "./TOB-out/"; // edit when .babylon / texture files in a different dir than html
-        BABYLON.SceneLoader.Load(url, "mesh_parent.babylon", engine, 
-            function (newScene) {
-                newScene.executeWhenReady(function () {
-                    // Attach camera to canvas inputs
-                    newScene.activeCamera.attachControl(canvas);
-                   
-                    // Once the scene is loaded, register a render loop
-                    engine.runRenderLoop(function() {
-                    	animate(newScene);
-                        newScene.render();
-                    });
-                });
-            },
-            function (progress) {
-                // To do: give progress feedback to user
-            }
-        );
-    }else{
-        alert("WebGL not supported in this browser.\n\n" + 
-              "If in Safari browser, check 'Show Develop menu in menu bar' on the Advanced tab of Preferences.  " +
-              "On the 'Develop' menu, check the 'Enable WebGL' menu item.");
-    }
-
-    //Resize
-    window.addEventListener("resize", function () {
-        engine.resize();
-    });
-</script>
-</body>
-</html>

+ 0 - 56
Exporters/Blender/blender-test/mesh_parent_inline.html

@@ -1,56 +0,0 @@
-<html>
-<head>
-    <meta charset="UTF-8">
-    <title>mesh_parent</title>
-    <!-- edit path - name of babylon library as required -->
-    <script src="./lib/babylon.js"></script>
-    <script src="./TOB-out/mesh_parent.js"></script>
-    <script src="./lib/mesh_parent_common.js"></script>
-    <style>
-         html, body   { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } 
-         #renderCanvas{ width: 100%; height: 100%; } 
-         #button      {
-			color: white; background-color: Dimgray;
-			font-size: 14pt; font-weight: bold;
-			padding-left:4pt; padding-right:4pt;
-			
-			border: black outset 2pt; line-height: 2em;
-			cursor: pointer;
-		}     
-    </style>
-</head>
-<body>
-	<div id="buttonbar" style="background-color: Darkorange;">
-		<span id="button" onclick="pausePlay()"> Pause - Play </span>
-		<span id="button" onclick="orphanConceive()"> Orhpan - Conceive </span>
-	</div>
-<canvas id="renderCanvas"></canvas>
-<script>
-    if (BABYLON.Engine.isSupported()) {
-        var canvas = document.getElementById("renderCanvas");
-        var engine = new BABYLON.Engine(canvas, true);
-        console.log("Babylon version:  " + BABYLON.Engine.Version);
-
-        var scene = new BABYLON.Scene(engine);
-        materialsRootDir = "./TOB-out"; // edit when texture files in a different dir than html
-        mesh_parent.initScene(scene, materialsRootDir);
-        scene.activeCamera.attachControl(canvas);
-        
-        engine.runRenderLoop(function () {
-            animate(scene);
-            scene.render();
-        });
-    }else{
-        alert("WebGL not supported in this browser.\n\n" + 
-              "If in Safari browser, check 'Show Develop menu in menu bar' on the Advanced tab of Preferences.  " +
-              "On the 'Develop' menu, check the 'Enable WebGL' menu item.");
-    }
-
-    //Resize
-    window.addEventListener("resize", function () {
-        engine.resize();
-    });
-    
-</script>
-</body>
-</html>

+ 0 - 18
Exporters/Blender/blender-test/readme.md

@@ -1,18 +0,0 @@
-This directory is for regression testing of the Tower of Babel.  It is assumed that the add-in has already been installed & enabled in Blender.
-
-Place the version of babylon.js you wish to use in the 'lib' directory.  The earliest supported is 1.14.  All of the html files reference it as 'babylon.js' to avoid having to edit them.  FYI, the htmls write a message into the browser console, listing the version, in-case you forget.  This is also for any scripts which should be common across a _JSON & _inline.html pair.
-
-The 'blender-in' directory holds each of the .blend files.  The name reflects the main thing being tested.  Refer to the table below, for a more complete list of features being tested.
-
-The 'TOB-out' directory is where you should direct the .babylon/.js/.ts/.html/.log output from Blender.  This directory is isolated, so that everything can easily be deleted.  This ensures that you are not actually running with stuff exported previously.  This directory is empty in Github (except for a .gitignore), so each .html  in this directory will not run unless, you open Blender with the respective .blend & export to this directory.
-
-Speaking of htmls, this directory has a xxx_JSON.html & xxx_inline.html for each .blend.
-
-Here is the list of tests & secondary features they test:
-
-.blend       secondary features
------------- ------------------------------------------------------------------------------
-armature     skeletal animation
-automaton    Camera LockedTarget, Automaton's embedded Action Manager, Single ShapeKeyGroup
-camera_anim  Multi-materials, textures
-mesh_parent  Shadows

文件差异内容过多而无法显示
+ 1498 - 944
Exporters/Blender/io_export_babylon.py


文件差异内容过多而无法显示
+ 0 - 2480
Exporters/Blender/io_tower_of_babel.py


+ 4 - 0
Exporters/Blender/readme.md

@@ -13,6 +13,8 @@ The [Blender export plugin](http://blogs.msdn.com/b/eternalcoding/archive/2013/0
  * Check collisions
  * Check collisions
  * Gravity
  * Gravity
  * Ellipsoid
  * Ellipsoid
+ * Animations
+ * All kind of Babylon.js cameras can be chosen from a custom dropdown list
 * **Lights**
 * **Lights**
  * Type (Point, directional (Sun), Spot, Hemispheric)
  * Type (Point, directional (Sun), Spot, Hemispheric)
  * Name
  * Name
@@ -23,6 +25,8 @@ The [Blender export plugin](http://blogs.msdn.com/b/eternalcoding/archive/2013/0
  * Energy
  * Energy
  * Diffuse color
  * Diffuse color
  * Specular color
  * Specular color
+ * Shadow maps (For directional lights)
+ * Animations
 * **Materials**
 * **Materials**
  * Name
  * Name
  * Ambient color
  * Ambient color

+ 107 - 101
babylon.1.14-RC-debug.js

@@ -9514,7 +9514,7 @@ var BABYLON;
             this._localPivotScaling.multiplyToRef(this._localRotation, this._localPivotScalingRotation);
             this._localPivotScaling.multiplyToRef(this._localRotation, this._localPivotScalingRotation);
 
 
            
            
-            if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE) {
+            if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE && this.getScene().activeCamera) {
                 var localPosition = this.position.clone();
                 var localPosition = this.position.clone();
                 var zero = this.getScene().activeCamera.position.clone();
                 var zero = this.getScene().activeCamera.position.clone();
 
 
@@ -15884,9 +15884,14 @@ var BABYLON;
                     break;
                     break;
                 }
                 }
 
 
-                var effect = postProcesses[postProcessesTakenIndices[index]].apply();
+                var pp = postProcesses[postProcessesTakenIndices[index]];
+                var effect = pp.apply();
 
 
                 if (effect) {
                 if (effect) {
+                    if (pp.onBeforeRender) {
+                        pp.onBeforeRender(effect);
+                    }
+
                    
                    
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
 
 
@@ -18265,7 +18270,54 @@ var BABYLON;
         };
         };
 
 
         var parseCamera = function (parsedCamera, scene) {
         var parseCamera = function (parsedCamera, scene) {
-            var camera = new BABYLON.FreeCamera(parsedCamera.name, BABYLON.Vector3.FromArray(parsedCamera.position), scene);
+            var camera;
+            var position = BABYLON.Vector3.FromArray(parsedCamera.position);
+            var lockedTargetMesh = (parsedCamera.lockedTargetId) ? scene.getLastMeshByID(parsedCamera.lockedTargetId) : null;
+
+            if (parsedCamera.type === "AnaglyphArcRotateCamera" || parsedCamera.type === "ArcRotateCamera") {
+                var alpha = parsedCamera.alpha;
+                var beta = parsedCamera.beta;
+                var radius = parsedCamera.radius;
+                if (parsedCamera.type === "AnaglyphArcRotateCamera") {
+                    var eye_space = parsedCamera.eye_space;
+                    camera = new BABYLON.AnaglyphArcRotateCamera(parsedCamera.name, alpha, beta, radius, lockedTargetMesh, eye_space, scene);
+                } else {
+                    camera = new BABYLON.ArcRotateCamera(parsedCamera.name, alpha, beta, radius, lockedTargetMesh, scene);
+                }
+            } else if (parsedCamera.type === "AnaglyphFreeCamera") {
+                var eye_space = parsedCamera.eye_space;
+                camera = new BABYLON.AnaglyphFreeCamera(parsedCamera.name, position, eye_space, scene);
+            } else if (parsedCamera.type === "DeviceOrientationCamera") {
+                camera = new BABYLON.DeviceOrientationCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "FollowCamera") {
+                camera = new BABYLON.FollowCamera(parsedCamera.name, position, scene);
+                camera.heightOffset = parsedCamera.heightOffset;
+                camera.radius = parsedCamera.radius;
+                camera.rotationOffset = parsedCamera.rotationOffset;
+                if (lockedTargetMesh)
+                    camera.target = lockedTargetMesh;
+            } else if (parsedCamera.type === "GamepadCamera") {
+                camera = new BABYLON.GamepadCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "OculusCamera") {
+                camera = new BABYLON.OculusCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "TouchCamera") {
+                camera = new BABYLON.TouchCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "VirtualJoysticksCamera") {
+                camera = new BABYLON.VirtualJoysticksCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "WebVRCamera") {
+                camera = new BABYLON.WebVRCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "VRDeviceOrientationCamera") {
+                camera = new BABYLON.VRDeviceOrientationCamera(parsedCamera.name, position, scene);
+            } else {
+               
+                camera = new BABYLON.FreeCamera(parsedCamera.name, position, scene);
+            }
+
+           
+            if (lockedTargetMesh && camera instanceof BABYLON.FreeCamera) {
+                camera.lockedTarget = lockedTargetMesh;
+            }
+
             camera.id = parsedCamera.id;
             camera.id = parsedCamera.id;
 
 
             BABYLON.Tags.AddTagsTo(camera, parsedCamera.tags);
             BABYLON.Tags.AddTagsTo(camera, parsedCamera.tags);
@@ -18282,11 +18334,6 @@ var BABYLON;
                 camera.rotation = BABYLON.Vector3.FromArray(parsedCamera.rotation);
                 camera.rotation = BABYLON.Vector3.FromArray(parsedCamera.rotation);
             }
             }
 
 
-           
-            if (parsedCamera.lockedTargetId) {
-                camera._waitingLockedTargetId = parsedCamera.lockedTargetId;
-            }
-
             camera.fov = parsedCamera.fov;
             camera.fov = parsedCamera.fov;
             camera.minZ = parsedCamera.minZ;
             camera.minZ = parsedCamera.minZ;
             camera.maxZ = parsedCamera.maxZ;
             camera.maxZ = parsedCamera.maxZ;
@@ -18510,7 +18557,7 @@ var BABYLON;
 
 
            
            
             if (parsedMesh.parentId) {
             if (parsedMesh.parentId) {
-                mesh.parent = scene.getLastEntryByID(parsedMesh.parentId);
+                mesh._waitingParentId = parsedMesh.parentId;
             }
             }
 
 
            
            
@@ -18901,6 +18948,14 @@ var BABYLON;
                     }
                     }
                 }
                 }
 
 
+                for (index = 0; index < scene.meshes.length; index++) {
+                    var currentMesh = scene.meshes[index];
+                    if (currentMesh._waitingParentId) {
+                        currentMesh.parent = scene.getLastEntryByID(currentMesh._waitingParentId);
+                        currentMesh._waitingParentId = undefined;
+                    }
+                }
+
                
                
                 if (parsedData.particleSystems) {
                 if (parsedData.particleSystems) {
                     for (index = 0; index < parsedData.particleSystems.length; index++) {
                     for (index = 0; index < parsedData.particleSystems.length; index++) {
@@ -18938,15 +18993,6 @@ var BABYLON;
                     parseLight(parsedLight, scene);
                     parseLight(parsedLight, scene);
                 }
                 }
 
 
-                for (index = 0; index < parsedData.cameras.length; index++) {
-                    var parsedCamera = parsedData.cameras[index];
-                    parseCamera(parsedCamera, scene);
-                }
-
-                if (parsedData.activeCameraID) {
-                    scene.setActiveCameraByID(parsedData.activeCameraID);
-                }
-
                
                
                 if (parsedData.materials) {
                 if (parsedData.materials) {
                     for (index = 0; index < parsedData.materials.length; index++) {
                     for (index = 0; index < parsedData.materials.length; index++) {
@@ -19051,19 +19097,28 @@ var BABYLON;
                     parseMesh(parsedMesh, scene, rootUrl);
                     parseMesh(parsedMesh, scene, rootUrl);
                 }
                 }
 
 
+                for (index = 0; index < parsedData.cameras.length; index++) {
+                    var parsedCamera = parsedData.cameras[index];
+                    parseCamera(parsedCamera, scene);
+                }
+
+                if (parsedData.activeCameraID) {
+                    scene.setActiveCameraByID(parsedData.activeCameraID);
+                }
+
                 for (index = 0; index < scene.cameras.length; index++) {
                 for (index = 0; index < scene.cameras.length; index++) {
                     var camera = scene.cameras[index];
                     var camera = scene.cameras[index];
                     if (camera._waitingParentId) {
                     if (camera._waitingParentId) {
                         camera.parent = scene.getLastEntryByID(camera._waitingParentId);
                         camera.parent = scene.getLastEntryByID(camera._waitingParentId);
-                        delete camera._waitingParentId;
+                        camera._waitingParentId = undefined;
                     }
                     }
+                }
 
 
-                    if (camera instanceof BABYLON.FreeCamera) {
-                        var freecamera = camera;
-                        if (freecamera._waitingLockedTargetId) {
-                            freecamera.lockedTarget = scene.getLastEntryByID(freecamera._waitingLockedTargetId);
-                            delete freecamera._waitingLockedTargetId;
-                        }
+                for (index = 0; index < scene.meshes.length; index++) {
+                    var mesh = scene.meshes[index];
+                    if (mesh._waitingParentId) {
+                        mesh.parent = scene.getLastEntryByID(mesh._waitingParentId);
+                        mesh._waitingParentId = undefined;
                     }
                     }
                 }
                 }
 
 
@@ -21765,14 +21820,13 @@ var BABYLON;
 var BABYLON;
 var BABYLON;
 (function (BABYLON) {
 (function (BABYLON) {
     var PostProcessRenderEffect = (function () {
     var PostProcessRenderEffect = (function () {
-        function PostProcessRenderEffect(engine, name, postProcessType, ratio, samplingMode, singleInstance) {
+        function PostProcessRenderEffect(engine, name, getPostProcess, singleInstance) {
             this._engine = engine;
             this._engine = engine;
             this._name = name;
             this._name = name;
-            this._postProcessType = postProcessType;
-            this._ratio = ratio || 1.0;
-            this._samplingMode = samplingMode || null;
             this._singleInstance = singleInstance || true;
             this._singleInstance = singleInstance || true;
 
 
+            this._getPostProcess = getPostProcess;
+
             this._cameras = [];
             this._cameras = [];
 
 
             this._postProcesses = [];
             this._postProcesses = [];
@@ -21780,64 +21834,7 @@ var BABYLON;
 
 
             this._renderPasses = [];
             this._renderPasses = [];
             this._renderEffectAsPasses = [];
             this._renderEffectAsPasses = [];
-
-            this.parameters = function (effect) {
-            };
         }
         }
-        PostProcessRenderEffect._GetInstance = function (engine, postProcessType, ratio, samplingMode) {
-            var postProcess;
-            var instance;
-            var args = [];
-
-            var parameters = PostProcessRenderEffect._GetParametersNames(postProcessType);
-            for (var i = 0; i < parameters.length; i++) {
-                switch (parameters[i]) {
-                    case "name":
-                        args[i] = postProcessType.toString();
-                        break;
-                    case "ratio":
-                        args[i] = ratio;
-                        break;
-                    case "camera":
-                        args[i] = null;
-                        break;
-                    case "samplingMode":
-                        args[i] = samplingMode;
-                        break;
-                    case "engine":
-                        args[i] = engine;
-                        break;
-                    case "reusable":
-                        args[i] = true;
-                        break;
-                    default:
-                        args[i] = null;
-                        break;
-                }
-            }
-
-            postProcess = function () {
-            };
-            postProcess.prototype = postProcessType.prototype;
-
-            instance = new postProcess();
-            postProcessType.apply(instance, args);
-
-            return instance;
-        };
-
-        PostProcessRenderEffect._GetParametersNames = function (func) {
-            var commentsRegex = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
-            var functWithoutComments = func.toString().replace(commentsRegex, '');
-
-            var parameters = functWithoutComments.slice(functWithoutComments.indexOf('(') + 1, functWithoutComments.indexOf(')')).match(/([^\s,]+)/g);
-
-            if (parameters === null)
-                parameters = [];
-
-            return parameters;
-        };
-
         PostProcessRenderEffect.prototype._update = function () {
         PostProcessRenderEffect.prototype._update = function () {
             for (var renderPassName in this._renderPasses) {
             for (var renderPassName in this._renderPasses) {
                 this._renderPasses[renderPassName]._update();
                 this._renderPasses[renderPassName]._update();
@@ -21891,11 +21888,11 @@ var BABYLON;
                     cameraKey = cameraName;
                     cameraKey = cameraName;
                 }
                 }
 
 
-                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || PostProcessRenderEffect._GetInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
+                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || this._getPostProcess();
 
 
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
 
 
-                if (this._indicesForCamera[cameraName] === null) {
+                if (!this._indicesForCamera[cameraName]) {
                     this._indicesForCamera[cameraName] = [];
                     this._indicesForCamera[cameraName] = [];
                 }
                 }
 
 
@@ -21978,8 +21975,11 @@ var BABYLON;
         PostProcessRenderEffect.prototype._linkParameters = function () {
         PostProcessRenderEffect.prototype._linkParameters = function () {
             var _this = this;
             var _this = this;
             for (var index in this._postProcesses) {
             for (var index in this._postProcesses) {
-                this._postProcesses[index].onApply = function (effect) {
-                    _this.parameters(effect);
+                if (this.applyParameters) {
+                    this.applyParameters(this._postProcesses[index]);
+                }
+
+                this._postProcesses[index].onBeforeRender = function (effect) {
                     _this._linkTextures(effect);
                     _this._linkTextures(effect);
                 };
                 };
             }
             }
@@ -22021,7 +22021,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderEffects.enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
         };
 
 
         PostProcessRenderPipeline.prototype._disableEffect = function (renderEffectName, cameras) {
         PostProcessRenderPipeline.prototype._disableEffect = function (renderEffectName, cameras) {
@@ -22031,7 +22031,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderEffects.disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
         };
 
 
         PostProcessRenderPipeline.prototype._attachCameras = function (cameras, unique) {
         PostProcessRenderPipeline.prototype._attachCameras = function (cameras, unique) {
@@ -22072,6 +22072,7 @@ var BABYLON;
         };
         };
 
 
         PostProcessRenderPipeline.prototype._enableDisplayOnlyPass = function (passName, cameras) {
         PostProcessRenderPipeline.prototype._enableDisplayOnlyPass = function (passName, cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
 
             var pass = null;
             var pass = null;
@@ -22098,7 +22099,9 @@ var BABYLON;
                 var camera = _cam[i];
                 var camera = _cam[i];
                 var cameraName = camera.name;
                 var cameraName = camera.name;
 
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
@@ -22106,13 +22109,16 @@ var BABYLON;
         };
         };
 
 
         PostProcessRenderPipeline.prototype._disableDisplayOnlyPass = function (cameras) {
         PostProcessRenderPipeline.prototype._disableDisplayOnlyPass = function (cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
 
             for (var i = 0; i < _cam.length; i++) {
             for (var i = 0; i < _cam.length; i++) {
                 var camera = _cam[i];
                 var camera = _cam[i];
                 var cameraName = camera.name;
                 var cameraName = camera.name;
 
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
             }
             }
 
 
@@ -22143,7 +22149,7 @@ var BABYLON;
 (function (BABYLON) {
 (function (BABYLON) {
     var PostProcessRenderPipelineManager = (function () {
     var PostProcessRenderPipelineManager = (function () {
         function PostProcessRenderPipelineManager() {
         function PostProcessRenderPipelineManager() {
-            this._renderPipelines = [];
+            this._renderPipelines = new Array();
         }
         }
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
             this._renderPipelines[renderPipeline._name] = renderPipeline;
             this._renderPipelines[renderPipeline._name] = renderPipeline;
@@ -22156,7 +22162,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.attachCameras(cameras, unique);
+            renderPipeline._attachCameras(cameras, unique);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.detachCamerasFromRenderPipeline = function (renderPipelineName, cameras) {
         PostProcessRenderPipelineManager.prototype.detachCamerasFromRenderPipeline = function (renderPipelineName, cameras) {
@@ -22166,7 +22172,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.detachCameras(cameras);
+            renderPipeline._detachCameras(cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.enableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
         PostProcessRenderPipelineManager.prototype.enableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -22176,7 +22182,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.enableEffect(renderEffectName, cameras);
+            renderPipeline._enableEffect(renderEffectName, cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.disableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
         PostProcessRenderPipelineManager.prototype.disableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -22186,7 +22192,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.disableEffect(renderEffectName, cameras);
+            renderPipeline._disableEffect(renderEffectName, cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.enableDisplayOnlyPassInPipeline = function (renderPipelineName, passName, cameras) {
         PostProcessRenderPipelineManager.prototype.enableDisplayOnlyPassInPipeline = function (renderPipelineName, passName, cameras) {
@@ -22196,7 +22202,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.enableDisplayOnlyPass(passName, cameras);
+            renderPipeline._enableDisplayOnlyPass(passName, cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.disableDisplayOnlyPassInPipeline = function (renderPipelineName, cameras) {
         PostProcessRenderPipelineManager.prototype.disableDisplayOnlyPassInPipeline = function (renderPipelineName, cameras) {
@@ -22206,7 +22212,7 @@ var BABYLON;
                 return;
                 return;
             }
             }
 
 
-            renderPipeline.disableDisplayOnlyPass(cameras);
+            renderPipeline._disableDisplayOnlyPass(cameras);
         };
         };
 
 
         PostProcessRenderPipelineManager.prototype.update = function () {
         PostProcessRenderPipelineManager.prototype.update = function () {

文件差异内容过多而无法显示
+ 7 - 7
babylon.1.14-RC.js


+ 5 - 8
babylon.d.ts

@@ -284,6 +284,7 @@ declare module BABYLON {
         private _isEnabled;
         private _isEnabled;
         private _isReady;
         private _isReady;
         public _currentRenderId: number;
         public _currentRenderId: number;
+        public _waitingParentId: string;
         private _scene;
         private _scene;
         public _cache: any;
         public _cache: any;
         constructor(name: string, scene: any);
         constructor(name: string, scene: any);
@@ -913,7 +914,6 @@ declare module BABYLON {
         private _worldMatrix;
         private _worldMatrix;
         public _postProcesses: PostProcess[];
         public _postProcesses: PostProcess[];
         public _postProcessesTakenIndices: any[];
         public _postProcessesTakenIndices: any[];
-        public _waitingParentId: string;
         constructor(name: string, position: Vector3, scene: Scene);
         constructor(name: string, position: Vector3, scene: Scene);
         public _initCache(): void;
         public _initCache(): void;
         public _updateCache(ignoreParentClass?: boolean): void;
         public _updateCache(ignoreParentClass?: boolean): void;
@@ -2910,6 +2910,7 @@ declare module BABYLON {
     class PostProcess {
     class PostProcess {
         public name: string;
         public name: string;
         public onApply: (Effect: any) => void;
         public onApply: (Effect: any) => void;
+        public onBeforeRender: (Effect: any) => void;
         public onSizeChanged: () => void;
         public onSizeChanged: () => void;
         public onActivate: (Camera: any) => void;
         public onActivate: (Camera: any) => void;
         public width: number;
         public width: number;
@@ -2957,19 +2958,15 @@ declare module BABYLON {
     class PostProcessRenderEffect {
     class PostProcessRenderEffect {
         private _engine;
         private _engine;
         private _postProcesses;
         private _postProcesses;
-        private _postProcessType;
-        private _ratio;
-        private _samplingMode;
+        private _getPostProcess;
         private _singleInstance;
         private _singleInstance;
         private _cameras;
         private _cameras;
         private _indicesForCamera;
         private _indicesForCamera;
         private _renderPasses;
         private _renderPasses;
         private _renderEffectAsPasses;
         private _renderEffectAsPasses;
         public _name: string;
         public _name: string;
-        public parameters: (effect: Effect) => void;
-        constructor(engine: Engine, name: string, postProcessType: any, ratio?: number, samplingMode?: number, singleInstance?: boolean);
-        private static _GetInstance(engine, postProcessType, ratio, samplingMode);
-        private static _GetParametersNames(func);
+        public applyParameters: (postProcess: PostProcess) => void;
+        constructor(engine: Engine, name: string, getPostProcess: () => PostProcess, singleInstance?: boolean);
         public _update(): void;
         public _update(): void;
         public addPass(renderPass: PostProcessRenderPass): void;
         public addPass(renderPass: PostProcessRenderPass): void;
         public removePass(renderPass: PostProcessRenderPass): void;
         public removePass(renderPass: PostProcessRenderPass): void;