Procházet zdrojové kódy

fixing geometrybuffer renderer

Benjamin Guignabert před 4 roky
rodič
revize
da3e3549b7
1 změnil soubory, kde provedl 21 přidání a 4 odebrání
  1. 21 4
      src/Rendering/geometryBufferRenderer.ts

+ 21 - 4
src/Rendering/geometryBufferRenderer.ts

@@ -19,6 +19,7 @@ import { _DevTools } from '../Misc/devTools';
 import { Observer } from '../Misc/observable';
 import { Engine } from '../Engines/engine';
 import { Nullable } from '../types';
+import { Material } from '../Materials/material';
 
 import "../Shaders/geometry.fragment";
 import "../Shaders/geometry.vertex";
@@ -558,9 +559,6 @@ export class GeometryBufferRenderer {
                 }
             }
 
-            // Culling
-            engine.setState(material.backFaceCulling, 0, false, scene.useRightHandedSystem);
-
             // Managing instances
             var batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());
 
@@ -574,11 +572,30 @@ export class GeometryBufferRenderer {
             if (this.isReady(subMesh, hardwareInstancedRendering)) {
                 engine.enableEffect(this._effect);
                 renderingMesh._bind(subMesh, this._effect, material.fillMode);
-
+                
                 this._effect.setMatrix("viewProjection", scene.getTransformMatrix());
                 this._effect.setMatrix("view", scene.getViewMatrix());
 
                 if (material) {
+                    var sideOrientation: Nullable<number>;
+                    let instanceDataStorage = (effectiveMesh as Mesh)._instanceDataStorage;
+
+                    if (!instanceDataStorage.isFrozen &&
+                        (material.backFaceCulling || material.overrideMaterialSideOrientation !== null)) {
+                        let mainDeterminant = effectiveMesh._getWorldMatrixDeterminant();
+                        sideOrientation = material.overrideMaterialSideOrientation;
+                        if (sideOrientation == null) {
+                            sideOrientation = material.sideOrientation;
+                        }
+                        if (mainDeterminant < 0) {
+                            sideOrientation = (sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation);
+                        }
+                    } else {
+                        sideOrientation = instanceDataStorage.sideOrientation;
+                    }
+
+                    material._preBind(this._effect, sideOrientation);
+
                     // Alpha test
                     if (material.needAlphaTesting()) {
                         var alphaTexture = material.getAlphaTestTexture();