Problem using asymetric frustum

If left and right frustum absolute values is not equal the following problems appear:

1: Using dynamic culling; wrong objects are culled (AbstractCamera.java)



[java]### Eclipse Workspace Patch 1.0

#P jMonkeyEngine

Index: src/com/jme/renderer/AbstractCamera.java

===================================================================

— src/com/jme/renderer/AbstractCamera.java (revision 4862)

+++ src/com/jme/renderer/AbstractCamera.java (working copy)

@@ -814,11 +814,11 @@

float topSquared = frustumTop * frustumTop;



float inverseLength = FastMath.invSqrt( nearSquared + leftSquared );

  •        coeffLeft[0] = frustumNear * inverseLength;<br />
    
  •        coeffLeft[0] = -frustumNear * inverseLength;<br />
    

coeffLeft[1] = -frustumLeft * inverseLength;



inverseLength = FastMath.invSqrt( nearSquared + rightSquared );

  •        coeffRight[0] = -frustumNear * inverseLength;<br />
    
  •        coeffRight[0] = frustumNear * inverseLength;<br />
    

coeffRight[1] = frustumRight * inverseLength;



inverseLength = FastMath.invSqrt( nearSquared + bottomSquared );

[/java]



2: The projecte grid (water) boundaries are wrong (ProjectedGrid.java)



[java]### Eclipse Workspace Patch 1.0

#P jMonkeyEngine

Index: src/com/jmex/effects/water/ProjectedGrid.java

===================================================================

— src/com/jmex/effects/water/ProjectedGrid.java (revision 5365)

+++ src/com/jmex/effects/water/ProjectedGrid.java (working copy)

@@ -56,7 +56,7 @@

  • @author Rikard Herlitz (MrCoder)

    */

    public class ProjectedGrid extends TriMesh {
  • private static final long serialVersionUID = 1L;
  • private static final long serialVersionUID = 1L;



    private int sizeX;

    private int sizeY;

    @@ -153,6 +153,17 @@

    super.draw( r );

    }


  • protected Matrix4f updateProjectionMatrix(Camera cam, Matrix4f m) {
  • ProjectedTextureUtil.matrixFrustum(cam.getFrustumLeft() - 0.2f,
  •                                   cam.getFrustumRight() + 0.9f,<br />
    
  •                                   cam.getFrustumBottom() - 0.6f,<br />
    
  •                                   cam.getFrustumTop(),<br />
    
  •                                   cam.getFrustumNear(),<br />
    
  •                                   cam.getFrustumFar(),<br />
    
  •                                   m );<br />
    
  • return m;
  • }

    +

    public void update() {

    if( freezeProjector ) return;



    @@ -189,7 +200,7 @@

    }



    ProjectedTextureUtil.matrixLookAt( projectorLoc, realPoint, Vector3f.UNIT_Y, modelViewMatrix );
  •   ProjectedTextureUtil.matrixProjection( fovY + 10.0f, getAspectRatio(), cam.getFrustumNear(), cam.getFrustumFar(), projectionMatrix );<br />
    
  •   projectionMatrix = updateProjectionMatrix(cam, projectionMatrix);<br />
    

modelViewProjectionInverse.set( modelViewMatrix ).multLocal( projectionMatrix );

modelViewProjectionInverse.invertLocal();



[/java]



[java]### Eclipse Workspace Patch 1.0

#P jMonkeyEngine

Index: src/com/jmex/effects/ProjectedTextureUtil.java

===================================================================

— src/com/jmex/effects/ProjectedTextureUtil.java (revision 4862)

+++ src/com/jmex/effects/ProjectedTextureUtil.java (working copy)

@@ -162,8 +162,8 @@



checkCamera();


  •    camera.setFrustum( frustumFar, frustumFar, frustumLeft, frustumRight,<br />
    
  •            frustumTop, frustumFar );<br />
    
  •    camera.setFrustum( frustumNear, frustumFar, frustumLeft, frustumRight,<br />
    
  •            frustumTop, frustumBottom);<br />
    

result.set( camera.getProjectionMatrix() );
}
[/java]

FYI:



This bug (at least the culling) is also wrong in jME3