Procházet zdrojové kódy

Fix occlusion error due to non solid impostor

David Catuhe před 6 roky
rodič
revize
5bf296fa54
1 změnil soubory, kde provedl 15 přidání a 3 odebrání
  1. 15 3
      src/Rendering/boundingBoxRenderer.ts

+ 15 - 3
src/Rendering/boundingBoxRenderer.ts

@@ -5,7 +5,7 @@ import { AbstractMesh } from "../Meshes/abstractMesh";
 import { VertexData } from "../Meshes/mesh.vertexData";
 import { Color3, Matrix } from "../Maths/math";
 import { SmartArray } from "../Misc/smartArray";
-import { Nullable, FloatArray } from "../types";
+import { Nullable, FloatArray, IndicesArray } from "../types";
 import { ISceneComponent, SceneComponentConstants } from "../sceneComponent";
 import { BoundingBox } from "../Culling/boundingBox";
 import { Effect } from "../Materials/effect";
@@ -125,6 +125,8 @@ export class BoundingBoxRenderer implements ISceneComponent {
     private _colorShader: ShaderMaterial;
     private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};
     private _indexBuffer: DataBuffer;
+    private _fillIndexBuffer: Nullable<DataBuffer> = null;
+    private _fillIndexData: Nullable<IndicesArray> = null;
 
     /**
      * Instantiates a new bounding box renderer in a scene.
@@ -181,6 +183,7 @@ export class BoundingBoxRenderer implements ISceneComponent {
         var boxdata = VertexData.CreateBox({ size: 1.0 });
         this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, <FloatArray>boxdata.positions, VertexBuffer.PositionKind, false);
         this._createIndexBuffer();
+        this._fillIndexData = boxdata.indices;
     }
 
     private _createIndexBuffer(): void {
@@ -280,6 +283,10 @@ export class BoundingBoxRenderer implements ISceneComponent {
         }
 
         var engine = this.scene.getEngine();
+        if (!this._fillIndexBuffer) {
+            this._fillIndexBuffer = engine.createIndexBuffer(this._fillIndexData!);
+        }
+
         engine.setDepthWrite(false);
         engine.setColorWrite(false);
         this._colorShader._preBind();
@@ -294,13 +301,13 @@ export class BoundingBoxRenderer implements ISceneComponent {
             .multiply(Matrix.Translation(median.x, median.y, median.z))
             .multiply(boundingBox.getWorldMatrix());
 
-        engine.bindBuffers(this._vertexBuffers, this._indexBuffer, <Effect>this._colorShader.getEffect());
+        engine.bindBuffers(this._vertexBuffers, this._fillIndexBuffer, <Effect>this._colorShader.getEffect());
 
         engine.setDepthFunctionToLess();
         this.scene.resetCachedMaterial();
         this._colorShader.bind(worldMatrix);
 
-        engine.drawElementsType(Material.LineListDrawMode, 0, 24);
+        engine.drawElementsType(Material.TriangleFillMode, 0, 36);
 
         this._colorShader.unbind();
         engine.setDepthFunctionToLessOrEqual();
@@ -326,5 +333,10 @@ export class BoundingBoxRenderer implements ISceneComponent {
             this._vertexBuffers[VertexBuffer.PositionKind] = null;
         }
         this.scene.getEngine()._releaseBuffer(this._indexBuffer);
+
+        if (this._fillIndexBuffer) {
+            this.scene.getEngine()._releaseBuffer(this._fillIndexBuffer);
+            this._fillIndexBuffer = null;
+        }
     }
 }