Bläddra i källkod

Fixing a bug when instances are used with a mesh with submeshes.length > 1

David Catuhe 11 år sedan
förälder
incheckning
39d2404438

+ 4 - 4
Babylon/Lights/Shadows/babylon.shadowGenerator.js

@@ -32,7 +32,7 @@
                 engine.setState(subMesh.getMaterial().backFaceCulling);
                 engine.setState(subMesh.getMaterial().backFaceCulling);
 
 
                 // Managing instances
                 // Managing instances
-                var batch = mesh._getInstancesRenderList();
+                var batch = mesh._getInstancesRenderList(subMesh._id);
 
 
                 if (batch.mustReturn) {
                 if (batch.mustReturn) {
                     return;
                     return;
@@ -70,9 +70,9 @@
                             mesh._draw(subMesh, true);
                             mesh._draw(subMesh, true);
                         }
                         }
 
 
-                        if (batch.visibleInstances) {
-                            for (var instanceIndex = 0; instanceIndex < batch.visibleInstances.length; instanceIndex++) {
-                                var instance = batch.visibleInstances[instanceIndex];
+                        if (batch.visibleInstances[subMesh._id]) {
+                            for (var instanceIndex = 0; instanceIndex < batch.visibleInstances[subMesh._id].length; instanceIndex++) {
+                                var instance = batch.visibleInstances[subMesh._id][instanceIndex];
 
 
                                 _this._effect.setMatrix("world", instance.getWorldMatrix());
                                 _this._effect.setMatrix("world", instance.getWorldMatrix());
 
 

+ 4 - 4
Babylon/Lights/Shadows/babylon.shadowGenerator.ts

@@ -40,7 +40,7 @@
                 engine.setState(subMesh.getMaterial().backFaceCulling);
                 engine.setState(subMesh.getMaterial().backFaceCulling);
 
 
                 // Managing instances
                 // Managing instances
-                var batch = mesh._getInstancesRenderList();
+                var batch = mesh._getInstancesRenderList(subMesh._id);
 
 
                 if (batch.mustReturn) {
                 if (batch.mustReturn) {
                     return;
                     return;
@@ -78,9 +78,9 @@
                             mesh._draw(subMesh, true);
                             mesh._draw(subMesh, true);
                         }
                         }
 
 
-                        if (batch.visibleInstances) {
-                            for (var instanceIndex = 0; instanceIndex < batch.visibleInstances.length; instanceIndex++) {
-                                var instance = batch.visibleInstances[instanceIndex];
+                        if (batch.visibleInstances[subMesh._id]) {
+                            for (var instanceIndex = 0; instanceIndex < batch.visibleInstances[subMesh._id].length; instanceIndex++) {
+                                var instance = batch.visibleInstances[subMesh._id][instanceIndex];
 
 
                                 this._effect.setMatrix("world", instance.getWorldMatrix());
                                 this._effect.setMatrix("world", instance.getWorldMatrix());
 
 

+ 11 - 10
Babylon/Loading/Plugins/babylon.babylonFileLoader.js

@@ -388,7 +388,7 @@ var BABYLON = BABYLON || {};
             return null; // null since geometry could be something else than a box...
             return null; // null since geometry could be something else than a box...
         }
         }
 
 
-        var box = new BABYLON.Geometry.Primitives.Box(parsedBox.id, scene.getEngine(), parsedBox.size, parsedBox.canBeRegenerated, null);
+        var box = new BABYLON.Geometry.Primitives.Box(parsedBox.id, scene, parsedBox.size, parsedBox.canBeRegenerated, null);
         BABYLON.Tags.AddTagsTo(box, parsedBox.tags);
         BABYLON.Tags.AddTagsTo(box, parsedBox.tags);
 
 
         scene.pushGeometry(box, true);
         scene.pushGeometry(box, true);
@@ -401,7 +401,7 @@ var BABYLON = BABYLON || {};
             return null; // null since geometry could be something else than a sphere...
             return null; // null since geometry could be something else than a sphere...
         }
         }
 
 
-        var sphere = new BABYLON.Geometry.Primitives.Sphere(parsedSphere.id, scene.getEngine(), parsedSphere.segments, parsedSphere.diameter, parsedSphere.canBeRegenerated, null);
+        var sphere = new BABYLON.Geometry.Primitives.Sphere(parsedSphere.id, scene, parsedSphere.segments, parsedSphere.diameter, parsedSphere.canBeRegenerated, null);
         BABYLON.Tags.AddTagsTo(sphere, parsedSphere.tags);
         BABYLON.Tags.AddTagsTo(sphere, parsedSphere.tags);
 
 
         scene.pushGeometry(sphere, true);
         scene.pushGeometry(sphere, true);
@@ -414,7 +414,7 @@ var BABYLON = BABYLON || {};
             return null; // null since geometry could be something else than a cylinder...
             return null; // null since geometry could be something else than a cylinder...
         }
         }
 
 
-        var cylinder = new BABYLON.Geometry.Primitives.Cylinder(parsedCylinder.id, scene.getEngine(), parsedCylinder.height, parsedCylinder.diameterTop, parsedCylinder.diameterBottom, parsedCylinder.tessellation, parsedCylinder.canBeRegenerated, null);
+        var cylinder = new BABYLON.Geometry.Primitives.Cylinder(parsedCylinder.id, scene, parsedCylinder.height, parsedCylinder.diameterTop, parsedCylinder.diameterBottom, parsedCylinder.tessellation, parsedCylinder.canBeRegenerated, null);
         BABYLON.Tags.AddTagsTo(cylinder, parsedCylinder.tags);
         BABYLON.Tags.AddTagsTo(cylinder, parsedCylinder.tags);
 
 
         scene.pushGeometry(cylinder, true);
         scene.pushGeometry(cylinder, true);
@@ -427,7 +427,7 @@ var BABYLON = BABYLON || {};
             return null; // null since geometry could be something else than a torus...
             return null; // null since geometry could be something else than a torus...
         }
         }
 
 
-        var torus = new BABYLON.Geometry.Primitives.Torus(parsedTorus.id, scene.getEngine(), parsedTorus.diameter, parsedTorus.thickness, parsedTorus.tessellation, parsedTorus.canBeRegenerated, null);
+        var torus = new BABYLON.Geometry.Primitives.Torus(parsedTorus.id, scene, parsedTorus.diameter, parsedTorus.thickness, parsedTorus.tessellation, parsedTorus.canBeRegenerated, null);
         BABYLON.Tags.AddTagsTo(torus, parsedTorus.tags);
         BABYLON.Tags.AddTagsTo(torus, parsedTorus.tags);
 
 
         scene.pushGeometry(torus, true);
         scene.pushGeometry(torus, true);
@@ -440,7 +440,7 @@ var BABYLON = BABYLON || {};
             return null; // null since geometry could be something else than a ground...
             return null; // null since geometry could be something else than a ground...
         }
         }
 
 
-        var ground = new BABYLON.Geometry.Primitives.Ground(parsedGround.id, scene.getEngine(), parsedGround.width, parsedGround.height, parsedGround.subdivisions, parsedGround.canBeRegenerated, null);
+        var ground = new BABYLON.Geometry.Primitives.Ground(parsedGround.id, scene, parsedGround.width, parsedGround.height, parsedGround.subdivisions, parsedGround.canBeRegenerated, null);
         BABYLON.Tags.AddTagsTo(ground, parsedGround.tags);
         BABYLON.Tags.AddTagsTo(ground, parsedGround.tags);
 
 
         scene.pushGeometry(ground, true);
         scene.pushGeometry(ground, true);
@@ -453,7 +453,7 @@ var BABYLON = BABYLON || {};
             return null; // null since geometry could be something else than a plane...
             return null; // null since geometry could be something else than a plane...
         }
         }
 
 
-        var plane = new BABYLON.Geometry.Primitives.Plane(parsedPlane.id, scene.getEngine(), parsedPlane.size, parsedPlane.canBeRegenerated, null);
+        var plane = new BABYLON.Geometry.Primitives.Plane(parsedPlane.id, scene, parsedPlane.size, parsedPlane.canBeRegenerated, null);
         BABYLON.Tags.AddTagsTo(plane, parsedPlane.tags);
         BABYLON.Tags.AddTagsTo(plane, parsedPlane.tags);
 
 
         scene.pushGeometry(plane, true);
         scene.pushGeometry(plane, true);
@@ -466,7 +466,7 @@ var BABYLON = BABYLON || {};
             return null; // null since geometry could be something else than a torusKnot...
             return null; // null since geometry could be something else than a torusKnot...
         }
         }
 
 
-        var torusKnot = new BABYLON.Geometry.Primitives.TorusKnot(parsedTorusKnot.id, scene.getEngine(), parsedTorusKnot.radius, parsedTorusKnot.tube, parsedTorusKnot.radialSegments, parsedTorusKnot.tubularSegments, parsedTorusKnot.p, parsedTorusKnot.q, parsedTorusKnot.canBeRegenerated, null);
+        var torusKnot = new BABYLON.Geometry.Primitives.TorusKnot(parsedTorusKnot.id, scene, parsedTorusKnot.radius, parsedTorusKnot.tube, parsedTorusKnot.radialSegments, parsedTorusKnot.tubularSegments, parsedTorusKnot.p, parsedTorusKnot.q, parsedTorusKnot.canBeRegenerated, null);
         BABYLON.Tags.AddTagsTo(torusKnot, parsedTorusKnot.tags);
         BABYLON.Tags.AddTagsTo(torusKnot, parsedTorusKnot.tags);
 
 
         scene.pushGeometry(torusKnot, true);
         scene.pushGeometry(torusKnot, true);
@@ -823,15 +823,16 @@ var BABYLON = BABYLON || {};
             }
             }
         }
         }
 
 
-        // Update
-        mesh.computeWorldMatrix(true);
-
         // Flat shading
         // Flat shading
         if (mesh._shouldGenerateFlatShading) {
         if (mesh._shouldGenerateFlatShading) {
             mesh.convertToFlatShadedMesh();
             mesh.convertToFlatShadedMesh();
             delete mesh._shouldGenerateFlatShading;
             delete mesh._shouldGenerateFlatShading;
         }
         }
 
 
+        // Update
+        mesh.computeWorldMatrix(true);
+
+        // Octree
         if (scene._selectionOctree) {
         if (scene._selectionOctree) {
             scene._selectionOctree.addMesh(mesh);
             scene._selectionOctree.addMesh(mesh);
         }
         }

+ 23 - 20
Babylon/Mesh/babylon.mesh.js

@@ -9,7 +9,8 @@ var BABYLON;
     var _InstancesBatch = (function () {
     var _InstancesBatch = (function () {
         function _InstancesBatch() {
         function _InstancesBatch() {
             this.mustReturn = false;
             this.mustReturn = false;
-            this.renderSelf = true;
+            this.visibleInstances = new Array();
+            this.renderSelf = new Array();
         }
         }
         return _InstancesBatch;
         return _InstancesBatch;
     })();
     })();
@@ -24,7 +25,7 @@ var BABYLON;
             this.instances = new Array();
             this.instances = new Array();
             this._onBeforeRenderCallbacks = [];
             this._onBeforeRenderCallbacks = [];
             this._visibleInstances = {};
             this._visibleInstances = {};
-            this._renderIdForInstances = -1;
+            this._renderIdForInstances = new Array();
             this._batchCache = new _InstancesBatch();
             this._batchCache = new _InstancesBatch();
             this._instancesBufferSize = 32 * 16 * 4;
             this._instancesBufferSize = 32 * 16 * 4;
         }
         }
@@ -262,34 +263,34 @@ var BABYLON;
             }
             }
         };
         };
 
 
-        Mesh.prototype._getInstancesRenderList = function () {
+        Mesh.prototype._getInstancesRenderList = function (subMeshId) {
             var scene = this.getScene();
             var scene = this.getScene();
             this._batchCache.mustReturn = false;
             this._batchCache.mustReturn = false;
-            this._batchCache.renderSelf = true;
-            this._batchCache.visibleInstances = null;
+            this._batchCache.renderSelf[subMeshId] = true;
+            this._batchCache.visibleInstances[subMeshId] = null;
 
 
             if (this._visibleInstances) {
             if (this._visibleInstances) {
                 var currentRenderId = scene.getRenderId();
                 var currentRenderId = scene.getRenderId();
-                this._batchCache.visibleInstances = this._visibleInstances[currentRenderId];
+                this._batchCache.visibleInstances[subMeshId] = this._visibleInstances[currentRenderId];
                 var selfRenderId = this._renderId;
                 var selfRenderId = this._renderId;
 
 
-                if (!this._batchCache.visibleInstances && this._visibleInstances.defaultRenderId) {
-                    this._batchCache.visibleInstances = this._visibleInstances[this._visibleInstances.defaultRenderId];
+                if (!this._batchCache.visibleInstances[subMeshId] && this._visibleInstances.defaultRenderId) {
+                    this._batchCache.visibleInstances[subMeshId] = this._visibleInstances[this._visibleInstances.defaultRenderId];
                     currentRenderId = this._visibleInstances.defaultRenderId;
                     currentRenderId = this._visibleInstances.defaultRenderId;
                     selfRenderId = this._visibleInstances.selfDefaultRenderId;
                     selfRenderId = this._visibleInstances.selfDefaultRenderId;
                 }
                 }
 
 
-                if (this._batchCache.visibleInstances && this._batchCache.visibleInstances.length) {
-                    if (this._renderIdForInstances === currentRenderId) {
+                if (this._batchCache.visibleInstances[subMeshId] && this._batchCache.visibleInstances[subMeshId].length) {
+                    if (this._renderIdForInstances[subMeshId] === currentRenderId) {
                         this._batchCache.mustReturn = true;
                         this._batchCache.mustReturn = true;
                         return this._batchCache;
                         return this._batchCache;
                     }
                     }
 
 
                     if (currentRenderId !== selfRenderId) {
                     if (currentRenderId !== selfRenderId) {
-                        this._batchCache.renderSelf = false;
+                        this._batchCache.renderSelf[subMeshId] = false;
                     }
                     }
                 }
                 }
-                this._renderIdForInstances = currentRenderId;
+                this._renderIdForInstances[subMeshId] = currentRenderId;
             }
             }
 
 
             return this._batchCache;
             return this._batchCache;
@@ -316,14 +317,16 @@ var BABYLON;
             var instancesCount = 0;
             var instancesCount = 0;
 
 
             var world = this.getWorldMatrix();
             var world = this.getWorldMatrix();
-            if (batch.renderSelf) {
+            if (batch.renderSelf[subMesh._id]) {
                 world.copyToArray(this._worldMatricesInstancesArray, offset);
                 world.copyToArray(this._worldMatricesInstancesArray, offset);
                 offset += 16;
                 offset += 16;
                 instancesCount++;
                 instancesCount++;
             }
             }
 
 
-            for (var instanceIndex = 0; instanceIndex < batch.visibleInstances.length; instanceIndex++) {
-                var instance = batch.visibleInstances[instanceIndex];
+            var visibleInstances = batch.visibleInstances[subMesh._id];
+
+            for (var instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {
+                var instance = visibleInstances[instanceIndex];
                 instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
                 instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
                 offset += 16;
                 offset += 16;
                 instancesCount++;
                 instancesCount++;
@@ -347,7 +350,7 @@ var BABYLON;
             var scene = this.getScene();
             var scene = this.getScene();
 
 
             // Managing instances
             // Managing instances
-            var batch = this._getInstancesRenderList();
+            var batch = this._getInstancesRenderList(subMesh._id);
 
 
             if (batch.mustReturn) {
             if (batch.mustReturn) {
                 return;
                 return;
@@ -363,7 +366,7 @@ var BABYLON;
             }
             }
 
 
             var engine = scene.getEngine();
             var engine = scene.getEngine();
-            var hardwareInstancedRendering = (engine.getCaps().instancedArrays !== null) && (batch.visibleInstances !== null);
+            var hardwareInstancedRendering = (engine.getCaps().instancedArrays !== null) && (batch.visibleInstances[subMesh._id] !== null);
 
 
             // Material
             // Material
             var effectiveMaterial = subMesh.getMaterial();
             var effectiveMaterial = subMesh.getMaterial();
@@ -391,9 +394,9 @@ var BABYLON;
                     this._draw(subMesh, !wireFrame);
                     this._draw(subMesh, !wireFrame);
                 }
                 }
 
 
-                if (batch.visibleInstances) {
-                    for (var instanceIndex = 0; instanceIndex < batch.visibleInstances.length; instanceIndex++) {
-                        var instance = batch.visibleInstances[instanceIndex];
+                if (batch.visibleInstances[subMesh._id]) {
+                    for (var instanceIndex = 0; instanceIndex < batch.visibleInstances[subMesh._id].length; instanceIndex++) {
+                        var instance = batch.visibleInstances[subMesh._id][instanceIndex];
 
 
                         // World
                         // World
                         world = instance.getWorldMatrix();
                         world = instance.getWorldMatrix();

+ 23 - 21
Babylon/Mesh/babylon.mesh.ts

@@ -1,8 +1,8 @@
 module BABYLON {
 module BABYLON {
     export class _InstancesBatch {
     export class _InstancesBatch {
         public mustReturn = false;
         public mustReturn = false;
-        public visibleInstances: InstancedMesh[];
-        public renderSelf = true;
+        public visibleInstances = new Array<Array<InstancedMesh>>();
+        public renderSelf = new  Array<boolean>();
     }
     }
 
 
     export class Mesh extends AbstractMesh implements IGetSetVerticesData {
     export class Mesh extends AbstractMesh implements IGetSetVerticesData {
@@ -17,7 +17,7 @@
         private _delayInfo; //ANY
         private _delayInfo; //ANY
         private _delayLoadingFunction: (any, Mesh) => void;
         private _delayLoadingFunction: (any, Mesh) => void;
         public _visibleInstances: any = {};
         public _visibleInstances: any = {};
-        private _renderIdForInstances = -1;
+        private _renderIdForInstances = new Array<number>();
         private _batchCache = new _InstancesBatch();
         private _batchCache = new _InstancesBatch();
         private _worldMatricesInstancesBuffer: WebGLBuffer;
         private _worldMatricesInstancesBuffer: WebGLBuffer;
         private _worldMatricesInstancesArray: Float32Array;
         private _worldMatricesInstancesArray: Float32Array;
@@ -265,35 +265,35 @@
             }
             }
         }
         }
 
 
-        public _getInstancesRenderList(): _InstancesBatch {
+        public _getInstancesRenderList(subMeshId: number): _InstancesBatch {
             var scene = this.getScene();
             var scene = this.getScene();
             this._batchCache.mustReturn = false;
             this._batchCache.mustReturn = false;
-            this._batchCache.renderSelf = true;
-            this._batchCache.visibleInstances = null;
+            this._batchCache.renderSelf[subMeshId]  = true;
+            this._batchCache.visibleInstances[subMeshId] = null;
 
 
             if (this._visibleInstances) {
             if (this._visibleInstances) {
                 var currentRenderId = scene.getRenderId();
                 var currentRenderId = scene.getRenderId();
-                this._batchCache.visibleInstances = this._visibleInstances[currentRenderId];
+                this._batchCache.visibleInstances[subMeshId]  = this._visibleInstances[currentRenderId];
                 var selfRenderId = this._renderId;
                 var selfRenderId = this._renderId;
 
 
-                if (!this._batchCache.visibleInstances && this._visibleInstances.defaultRenderId) {
-                    this._batchCache.visibleInstances = this._visibleInstances[this._visibleInstances.defaultRenderId];
+                if (!this._batchCache.visibleInstances[subMeshId] && this._visibleInstances.defaultRenderId) {
+                    this._batchCache.visibleInstances[subMeshId] = this._visibleInstances[this._visibleInstances.defaultRenderId];
                     currentRenderId = this._visibleInstances.defaultRenderId;
                     currentRenderId = this._visibleInstances.defaultRenderId;
                     selfRenderId = this._visibleInstances.selfDefaultRenderId;
                     selfRenderId = this._visibleInstances.selfDefaultRenderId;
                 }
                 }
 
 
-                if (this._batchCache.visibleInstances && this._batchCache.visibleInstances.length) {
-                    if (this._renderIdForInstances === currentRenderId) {
+                if (this._batchCache.visibleInstances[subMeshId] && this._batchCache.visibleInstances[subMeshId].length) {
+                    if (this._renderIdForInstances[subMeshId] === currentRenderId) {
                         this._batchCache.mustReturn = true;
                         this._batchCache.mustReturn = true;
                         return this._batchCache;
                         return this._batchCache;
                     }
                     }
 
 
                     if (currentRenderId !== selfRenderId) {
                     if (currentRenderId !== selfRenderId) {
-                        this._batchCache.renderSelf = false;
+                        this._batchCache.renderSelf[subMeshId]  = false;
                     }
                     }
 
 
                 }
                 }
-                this._renderIdForInstances = currentRenderId;
+                this._renderIdForInstances[subMeshId] = currentRenderId;
             }
             }
 
 
             return this._batchCache;
             return this._batchCache;
@@ -320,14 +320,16 @@
             var instancesCount = 0;
             var instancesCount = 0;
 
 
             var world = this.getWorldMatrix();
             var world = this.getWorldMatrix();
-            if (batch.renderSelf) {
+            if (batch.renderSelf[subMesh._id]) {
                 world.copyToArray(this._worldMatricesInstancesArray, offset);
                 world.copyToArray(this._worldMatricesInstancesArray, offset);
                 offset += 16;
                 offset += 16;
                 instancesCount++;
                 instancesCount++;
             }
             }
 
 
-            for (var instanceIndex = 0; instanceIndex < batch.visibleInstances.length; instanceIndex++) {
-                var instance = batch.visibleInstances[instanceIndex];
+            var visibleInstances = batch.visibleInstances[subMesh._id];
+
+            for (var instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {
+                var instance = visibleInstances[instanceIndex];
                 instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
                 instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
                 offset += 16;
                 offset += 16;
                 instancesCount++;
                 instancesCount++;
@@ -351,7 +353,7 @@
             var scene = this.getScene();
             var scene = this.getScene();
 
 
             // Managing instances
             // Managing instances
-            var batch = this._getInstancesRenderList();
+            var batch = this._getInstancesRenderList(subMesh._id);
 
 
             if (batch.mustReturn) {
             if (batch.mustReturn) {
                 return;
                 return;
@@ -367,7 +369,7 @@
             }
             }
 
 
             var engine = scene.getEngine();
             var engine = scene.getEngine();
-            var hardwareInstancedRendering = (engine.getCaps().instancedArrays !== null) && (batch.visibleInstances !== null); 
+            var hardwareInstancedRendering = (engine.getCaps().instancedArrays !== null) && (batch.visibleInstances[subMesh._id] !== null); 
 
 
             // Material
             // Material
             var effectiveMaterial = subMesh.getMaterial();
             var effectiveMaterial = subMesh.getMaterial();
@@ -395,9 +397,9 @@
                     this._draw(subMesh, !wireFrame);
                     this._draw(subMesh, !wireFrame);
                 }
                 }
 
 
-                if (batch.visibleInstances) {
-                    for (var instanceIndex = 0; instanceIndex < batch.visibleInstances.length; instanceIndex++) {
-                        var instance = batch.visibleInstances[instanceIndex];
+                if (batch.visibleInstances[subMesh._id]) {
+                    for (var instanceIndex = 0; instanceIndex < batch.visibleInstances[subMesh._id].length; instanceIndex++) {
+                        var instance = batch.visibleInstances[subMesh._id][instanceIndex];
 
 
                         // World
                         // World
                         world = instance.getWorldMatrix();
                         world = instance.getWorldMatrix();

+ 2 - 0
Babylon/Mesh/babylon.subMesh.js

@@ -13,6 +13,8 @@
             this._renderingMesh = renderingMesh || mesh;
             this._renderingMesh = renderingMesh || mesh;
             mesh.subMeshes.push(this);
             mesh.subMeshes.push(this);
 
 
+            this._id = mesh.subMeshes.length - 1;
+
             if (createBoundingBox) {
             if (createBoundingBox) {
                 this.refreshBoundingInfo();
                 this.refreshBoundingInfo();
             }
             }

+ 3 - 0
Babylon/Mesh/babylon.subMesh.ts

@@ -12,12 +12,15 @@
 
 
         public _renderId = 0;
         public _renderId = 0;
         public _distanceToCamera: number;
         public _distanceToCamera: number;
+        public _id: number;
 
 
         constructor(public materialIndex: number, public verticesStart: number, public verticesCount: number, public indexStart, public indexCount: number, mesh: AbstractMesh, renderingMesh?: Mesh, createBoundingBox: boolean = true) {
         constructor(public materialIndex: number, public verticesStart: number, public verticesCount: number, public indexStart, public indexCount: number, mesh: AbstractMesh, renderingMesh?: Mesh, createBoundingBox: boolean = true) {
             this._mesh = mesh;
             this._mesh = mesh;
             this._renderingMesh = renderingMesh || <Mesh>mesh;
             this._renderingMesh = renderingMesh || <Mesh>mesh;
             mesh.subMeshes.push(this);
             mesh.subMeshes.push(this);
 
 
+            this._id = mesh.subMeshes.length - 1;
+
             if (createBoundingBox) {
             if (createBoundingBox) {
                 this.refreshBoundingInfo();
                 this.refreshBoundingInfo();
             }
             }

+ 7 - 0
Babylon/babylon.engine.js

@@ -137,6 +137,7 @@
             this._compiledEffects = {};
             this._compiledEffects = {};
             this._depthMask = false;
             this._depthMask = false;
             this._renderingCanvas = canvas;
             this._renderingCanvas = canvas;
+            this._canvasClientRect = this._renderingCanvas.getBoundingClientRect();
 
 
             options = options || {};
             options = options || {};
             options.antialias = antialias;
             options.antialias = antialias;
@@ -316,6 +317,10 @@
             return this._renderingCanvas;
             return this._renderingCanvas;
         };
         };
 
 
+        Engine.prototype.getRenderingCanvasClientRect = function () {
+            return this._renderingCanvas.getBoundingClientRect();
+        };
+
         Engine.prototype.setHardwareScalingLevel = function (level) {
         Engine.prototype.setHardwareScalingLevel = function (level) {
             this._hardwareScalingLevel = level;
             this._hardwareScalingLevel = level;
             this.resize();
             this.resize();
@@ -446,6 +451,8 @@
         Engine.prototype.resize = function () {
         Engine.prototype.resize = function () {
             this._renderingCanvas.width = this._renderingCanvas.clientWidth / this._hardwareScalingLevel;
             this._renderingCanvas.width = this._renderingCanvas.clientWidth / this._hardwareScalingLevel;
             this._renderingCanvas.height = this._renderingCanvas.clientHeight / this._hardwareScalingLevel;
             this._renderingCanvas.height = this._renderingCanvas.clientHeight / this._hardwareScalingLevel;
+
+            this._canvasClientRect = this._renderingCanvas.getBoundingClientRect();
         };
         };
 
 
         Engine.prototype.bindFramebuffer = function (texture) {
         Engine.prototype.bindFramebuffer = function (texture) {

+ 8 - 0
Babylon/babylon.engine.ts

@@ -213,12 +213,14 @@
         private _cachedIndexBuffer: WebGLBuffer;
         private _cachedIndexBuffer: WebGLBuffer;
         private _cachedEffectForVertexBuffers: Effect;
         private _cachedEffectForVertexBuffers: Effect;
         private _currentRenderTarget: WebGLTexture;
         private _currentRenderTarget: WebGLTexture;
+        private _canvasClientRect: ClientRect;
 
 
         private _workingCanvas: HTMLCanvasElement;
         private _workingCanvas: HTMLCanvasElement;
         private _workingContext: CanvasRenderingContext2D;
         private _workingContext: CanvasRenderingContext2D;
 
 
         constructor(canvas: HTMLCanvasElement, antialias?: boolean, options?) {
         constructor(canvas: HTMLCanvasElement, antialias?: boolean, options?) {
             this._renderingCanvas = canvas;
             this._renderingCanvas = canvas;
+            this._canvasClientRect = this._renderingCanvas.getBoundingClientRect();
 
 
             options = options || {};
             options = options || {};
             options.antialias = antialias;
             options.antialias = antialias;
@@ -345,6 +347,10 @@
             return this._renderingCanvas;
             return this._renderingCanvas;
         }
         }
 
 
+        public getRenderingCanvasClientRect(): ClientRect {
+            return this._renderingCanvas.getBoundingClientRect();
+        }
+
         public setHardwareScalingLevel(level: number): void {
         public setHardwareScalingLevel(level: number): void {
             this._hardwareScalingLevel = level;
             this._hardwareScalingLevel = level;
             this.resize();
             this.resize();
@@ -473,6 +479,8 @@
         public resize(): void {
         public resize(): void {
             this._renderingCanvas.width = this._renderingCanvas.clientWidth / this._hardwareScalingLevel;
             this._renderingCanvas.width = this._renderingCanvas.clientWidth / this._hardwareScalingLevel;
             this._renderingCanvas.height = this._renderingCanvas.clientHeight / this._hardwareScalingLevel;
             this._renderingCanvas.height = this._renderingCanvas.clientHeight / this._hardwareScalingLevel;
+
+            this._canvasClientRect = this._renderingCanvas.getBoundingClientRect();
         }
         }
 
 
         public bindFramebuffer(texture: WebGLTexture): void {
         public bindFramebuffer(texture: WebGLTexture): void {

+ 16 - 4
Babylon/babylon.scene.js

@@ -172,14 +172,21 @@
             return this._renderId;
             return this._renderId;
         };
         };
 
 
+        Scene.prototype._updatePointerPosition = function (evt) {
+            var canvasRect = this._engine.getRenderingCanvasClientRect();
+
+            this._pointerX = evt.clientX - canvasRect.left;
+            this._pointerY = evt.clientY - canvasRect.top;
+        };
+
         // Pointers handling
         // Pointers handling
         Scene.prototype.attachControl = function () {
         Scene.prototype.attachControl = function () {
             var _this = this;
             var _this = this;
             this._onPointerMove = function (evt) {
             this._onPointerMove = function (evt) {
                 var canvas = _this._engine.getRenderingCanvas();
                 var canvas = _this._engine.getRenderingCanvas();
 
 
-                _this._pointerX = evt.offsetX || evt.layerX;
-                _this._pointerY = evt.offsetY || evt.layerY;
+                _this._updatePointerPosition(evt);
+
                 var pickResult = _this.pick(_this._pointerX, _this._pointerY, function (mesh) {
                 var pickResult = _this.pick(_this._pointerX, _this._pointerY, function (mesh) {
                     return mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady();
                     return mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady();
                 });
                 });
@@ -205,7 +212,9 @@
                     };
                     };
                 }
                 }
 
 
-                var pickResult = _this.pick(evt.offsetX || evt.layerX, evt.offsetY || evt.layerY, predicate);
+                _this._updatePointerPosition(evt);
+
+                var pickResult = _this.pick(_this._pointerX, _this._pointerY, predicate);
 
 
                 if (pickResult.hit) {
                 if (pickResult.hit) {
                     if (pickResult.pickedMesh.actionManager) {
                     if (pickResult.pickedMesh.actionManager) {
@@ -895,7 +904,7 @@
             }
             }
 
 
             // Animations
             // Animations
-            var deltaTime = Math.max(1.0, Math.min(BABYLON.Tools.GetDeltaTime(), 1000.0));
+            var deltaTime = Math.max(Scene.MinDeltaTime, Math.min(BABYLON.Tools.GetDeltaTime(), Scene.MaxDeltaTime));
             this._animationRatio = deltaTime * (60.0 / 1000.0);
             this._animationRatio = deltaTime * (60.0 / 1000.0);
             this._animate();
             this._animate();
 
 
@@ -1295,6 +1304,9 @@
         Scene.FOGMODE_EXP = 1;
         Scene.FOGMODE_EXP = 1;
         Scene.FOGMODE_EXP2 = 2;
         Scene.FOGMODE_EXP2 = 2;
         Scene.FOGMODE_LINEAR = 3;
         Scene.FOGMODE_LINEAR = 3;
+
+        Scene.MinDeltaTime = 1.0;
+        Scene.MaxDeltaTime = 1000.0;
         return Scene;
         return Scene;
     })();
     })();
     BABYLON.Scene = Scene;
     BABYLON.Scene = Scene;

+ 16 - 4
Babylon/babylon.scene.ts

@@ -10,6 +10,9 @@
         public static FOGMODE_EXP2 = 2;
         public static FOGMODE_EXP2 = 2;
         public static FOGMODE_LINEAR = 3;
         public static FOGMODE_LINEAR = 3;
 
 
+        public static MinDeltaTime = 1.0;
+        public static MaxDeltaTime = 1000.0;
+
         // Members
         // Members
         public autoClear = true;
         public autoClear = true;
         public clearColor = new BABYLON.Color3(0.2, 0.2, 0.3);
         public clearColor = new BABYLON.Color3(0.2, 0.2, 0.3);
@@ -238,13 +241,20 @@
             return this._renderId;
             return this._renderId;
         }
         }
 
 
+        private _updatePointerPosition(evt: PointerEvent): void {
+            var canvasRect = this._engine.getRenderingCanvasClientRect();
+
+            this._pointerX = evt.clientX - canvasRect.left;
+            this._pointerY = evt.clientY - canvasRect.top;
+        }
+
         // Pointers handling
         // Pointers handling
         public attachControl() {
         public attachControl() {
             this._onPointerMove = (evt: PointerEvent) => {
             this._onPointerMove = (evt: PointerEvent) => {
                 var canvas = this._engine.getRenderingCanvas();
                 var canvas = this._engine.getRenderingCanvas();
 
 
-                this._pointerX = evt.offsetX || evt.layerX;
-                this._pointerY = evt.offsetY || evt.layerY;
+                this._updatePointerPosition(evt);
+
                 var pickResult = this.pick(this._pointerX, this._pointerY, (mesh: AbstractMesh): boolean => mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady());
                 var pickResult = this.pick(this._pointerX, this._pointerY, (mesh: AbstractMesh): boolean => mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady());
 
 
                 if (pickResult.hit) {
                 if (pickResult.hit) {
@@ -269,7 +279,9 @@
                     };
                     };
                 }
                 }
 
 
-                var pickResult = this.pick(evt.offsetX || evt.layerX, evt.offsetY || evt.layerY, predicate);
+                this._updatePointerPosition(evt);
+
+                var pickResult = this.pick(this._pointerX, this._pointerY, predicate);
 
 
                 if (pickResult.hit) {
                 if (pickResult.hit) {
                     if (pickResult.pickedMesh.actionManager) {
                     if (pickResult.pickedMesh.actionManager) {
@@ -962,7 +974,7 @@
             }
             }
 
 
             // Animations
             // Animations
-            var deltaTime = Math.max(1.0, Math.min(BABYLON.Tools.GetDeltaTime(), 1000.0));
+            var deltaTime = Math.max(Scene.MinDeltaTime, Math.min(BABYLON.Tools.GetDeltaTime(), Scene.MaxDeltaTime));
             this._animationRatio = deltaTime * (60.0 / 1000.0);
             this._animationRatio = deltaTime * (60.0 / 1000.0);
             this._animate();
             this._animate();
 
 

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 2 - 2
babylon.1.13-beta-debug.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 8 - 8
babylon.1.13-beta.js