瀏覽代碼

Missing LinesMesh file
First try with Tools.ValidateXHRData

David Catuhe 11 年之前
父節點
當前提交
04fcd70407

+ 54 - 0
Babylon/Mesh/babylon.linesMesh.ts

@@ -0,0 +1,54 @@
+module BABYLON {
+    export class LinesMesh extends Mesh {
+        public color = new BABYLON.Color3(1, 1, 1);
+
+        private _colorShader: ShaderMaterial;
+        private _ib: WebGLBuffer;
+
+        private _indicesLength: number;
+        private _indices = new Array<number>();
+
+        constructor(name: string, scene: Scene, updatable = false) {
+            super(name, scene);
+
+            this._colorShader = new ShaderMaterial("colorShader", scene, "color",
+                {
+                    attributes: ["position"],
+                    uniforms: ["worldViewProjection", "color"]
+                });
+        }
+
+        public get material(): Material {
+            return this._colorShader;
+        }
+
+        public _bind(subMesh: SubMesh, effect: Effect, wireframe?: boolean): void {
+            var engine = this.getScene().getEngine();
+
+            var indexToBind = this._geometry.getIndexBuffer();
+
+            // VBOs
+            engine.bindBuffers(this._geometry.getVertexBuffer(VertexBuffer.PositionKind).getBuffer(), indexToBind, [3], 3 * 4, this._colorShader.getEffect());
+
+            // Color
+            this._colorShader.setColor3("color", this.color);
+        }
+
+        public _draw(subMesh: SubMesh, useTriangles: boolean, instancesCount?: number): void {
+            if (!this._geometry || !this._geometry.getVertexBuffers() || !this._geometry.getIndexBuffer()) {
+                return;
+            }
+
+            var engine = this.getScene().getEngine();
+
+            // Draw order
+            engine.draw(false, subMesh.indexStart, subMesh.indexCount);
+        }
+
+        public dispose(doNotRecurse?: boolean): void {
+            this._colorShader.dispose();
+
+            super.dispose(doNotRecurse);
+        }
+    }
+} 

+ 2 - 2
Babylon/Tools/babylon.database.js

@@ -55,7 +55,7 @@ var BABYLON = BABYLON || {};
         xhr.open("GET", manifestURL, false);
 
         xhr.addEventListener("load", function () {
-            if (xhr.status === 200) {
+            if (xhr.status === 200 || BABYLON.Tools.ValidateXHRData(xhr, 1)) {
                 try {
                     var manifestFile = JSON.parse(xhr.response);
                     that.enableSceneOffline = manifestFile.enableSceneOffline;
@@ -474,7 +474,7 @@ var BABYLON = BABYLON || {};
             xhr.onprogress = progressCallback;
             
             xhr.addEventListener("load", function () {
-                if (xhr.status === 200) {
+                if (xhr.status === 200 || BABYLON.Tools.ValidateXHRData(xhr, 1)) {
                     // Blob as response (XHR2)
                     sceneText = xhr.responseText;
 

+ 41 - 1
Babylon/Tools/babylon.tools.js

@@ -225,7 +225,7 @@ var BABYLON;
 
                 request.onreadystatechange = function () {
                     if (request.readyState == 4) {
-                        if (request.status == 200) {
+                        if (request.status == 200 && BABYLON.Tools.ValidateXHRData(request, !useArrayBuffer ? 1 : 6)) {
                             callback(!useArrayBuffer ? request.responseText : request.response);
                         } else {
                             throw new Error("Error status: " + request.status + " - Unable to load " + loadUrl);
@@ -505,6 +505,46 @@ var BABYLON;
             }
         };
 
+        // XHR response validator for local file scenario
+        Tools.ValidateXHRData = function (xhr, dataType) {
+            if (typeof dataType === "undefined") { dataType = 7; }
+            try  {
+                if (dataType & 1) {
+                    if (xhr.responseText && xhr.responseText.length > 0) {
+                        return true;
+                    } else if (dataType === 1) {
+                        return false;
+                    }
+                }
+
+                if (dataType & 2) {
+                    // Check header width and height since there is no "TGA" magic number
+                    var tgaHeader = BABYLON.Internals.TGATools.GetTGAHeader(xhr.response);
+
+                    if (tgaHeader.width && tgaHeader.height && tgaHeader.width > 0 && tgaHeader.height > 0) {
+                        return true;
+                    } else if (dataType === 2) {
+                        return false;
+                    }
+                }
+
+                if (dataType & 4) {
+                    // Check for the "DDS" magic number
+                    var ddsHeader = new Uint8Array(xhr.response, 0, 3);
+
+                    if (ddsHeader[0] == 68 && ddsHeader[1] == 68 && ddsHeader[2] == 83) {
+                        return true;
+                    } else {
+                        return false;
+                    }
+                }
+            } catch (e) {
+                // Global protection
+            }
+
+            return false;
+        };
+
         Object.defineProperty(Tools, "NoneLogLevel", {
             get: function () {
                 return Tools._NoneLogLevel;

+ 45 - 3
Babylon/Tools/babylon.tools.ts

@@ -76,11 +76,11 @@ module BABYLON {
             return angle * Math.PI / 180;
         }
 
-        public static ExtractMinAndMaxIndexed(positions: number[], indices: number[], indexStart:number, indexCount: number): { minimum: Vector3; maximum: Vector3 } {
+        public static ExtractMinAndMaxIndexed(positions: number[], indices: number[], indexStart: number, indexCount: number): { minimum: Vector3; maximum: Vector3 } {
             var minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
             var maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
 
-            for (var index = indexStart; index < indexStart + indexCount; index ++) {
+            for (var index = indexStart; index < indexStart + indexCount; index++) {
                 var current = new Vector3(positions[indices[index] * 3], positions[indices[index] * 3 + 1], positions[indices[index] * 3 + 2]);
 
                 minimum = BABYLON.Vector3.Minimize(current, minimum);
@@ -248,7 +248,7 @@ module BABYLON {
 
                 request.onreadystatechange = () => {
                     if (request.readyState == 4) {
-                        if (request.status == 200) {
+                        if (request.status == 200 && BABYLON.Tools.ValidateXHRData(request, !useArrayBuffer ? 1 : 6)) {
                             callback(!useArrayBuffer ? request.responseText : request.response);
                         } else { // Failed
                             throw new Error("Error status: " + request.status + " - Unable to load " + loadUrl);
@@ -546,6 +546,48 @@ module BABYLON {
             }
         }
 
+        // XHR response validator for local file scenario
+        public static ValidateXHRData(xhr: XMLHttpRequest, dataType = 7): boolean {
+            // 1 for text (.babylon, manifest and shaders), 2 for TGA, 4 for DDS, 7 for all
+
+            try {
+                if (dataType & 1) {
+                    if (xhr.responseText && xhr.responseText.length > 0) {
+                        return true;
+                    } else if (dataType === 1) {
+                        return false;
+                    }
+                }
+
+                if (dataType & 2) {
+                    // Check header width and height since there is no "TGA" magic number
+                    var tgaHeader = BABYLON.Internals.TGATools.GetTGAHeader(xhr.response);
+
+                    if (tgaHeader.width && tgaHeader.height && tgaHeader.width > 0 && tgaHeader.height > 0) {
+                        return true;
+                    } else if (dataType === 2) {
+                        return false;
+                    }
+                }
+
+                if (dataType & 4) {
+                    // Check for the "DDS" magic number
+                    var ddsHeader = new Uint8Array(xhr.response, 0, 3);
+
+                    if (ddsHeader[0] == 68 && ddsHeader[1] == 68 && ddsHeader[2] == 83) {
+                        return true;
+                    } else {
+                        return false;
+                    }
+                }
+
+            } catch (e) {
+                // Global protection
+            }
+
+            return false;
+        }
+
         // Logs
         private static _NoneLogLevel = 0;
         private static _MessageLogLevel = 1;

文件差異過大導致無法顯示
+ 2 - 2
babylon.1.13-beta-debug.js


文件差異過大導致無法顯示
+ 5 - 5
babylon.1.13-beta.js