Checking GUI Culling

Currently, CullHint of GUI Node have to be CullHint.Never.

It makes gui node rendered always even if it is beyond the screen.

I added camera.containsGui() method to check this.



[patch]

Index: src/core/com/jme3/scene/Spatial.java

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

— src/core/com/jme3/scene/Spatial.java (revision 7142)

+++ src/core/com/jme3/scene/Spatial.java (working copy)

@@ -51,6 +51,7 @@

import com.jme3.renderer.RenderManager;

import com.jme3.renderer.ViewPort;

import com.jme3.renderer.queue.RenderQueue;

+import com.jme3.renderer.queue.RenderQueue.Bucket;

import com.jme3.renderer.queue.RenderQueue.ShadowMode;

import com.jme3.scene.control.Control;

import com.jme3.util.TempVars;

@@ -247,11 +248,15 @@

: Camera.FrustumIntersect.Intersects);



if (frustrumIntersects == Camera.FrustumIntersect.Intersects) {

  •        int state = cam.getPlaneState();<br />
    

-

  •        frustrumIntersects = cam.contains(getWorldBound());<br />
    

-

  •        cam.setPlaneState(state);<br />
    
  •        if (getQueueBucket() == Bucket.Gui) {<br />
    
  •            return cam.containsGui(getWorldBound());<br />
    
  •        } else {<br />
    
  •            int state = cam.getPlaneState();<br />
    

+

  •            frustrumIntersects = cam.contains(getWorldBound());<br />
    

+

  •            cam.setPlaneState(state);<br />
    
  •        }<br />
    

}



return frustrumIntersects != Camera.FrustumIntersect.Outside;

Index: src/core/com/jme3/renderer/Camera.java

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

— src/core/com/jme3/renderer/Camera.java (revision 7142)

+++ src/core/com/jme3/renderer/Camera.java (working copy)

@@ -31,6 +31,7 @@

*/

package com.jme3.renderer;



+import com.jme3.bounding.BoundingBox;

import com.jme3.bounding.BoundingVolume;

import com.jme3.export.JmeExporter;

import com.jme3.export.JmeImporter;

@@ -205,6 +206,7 @@

protected Matrix4f viewMatrix = new Matrix4f();

protected Matrix4f projectionMatrix = new Matrix4f();

protected Matrix4f viewProjectionMatrix = new Matrix4f();

  • private BoundingBox guiBounding = new BoundingBox();



    /**
  • Constructor instantiates a new <code>Camera</code> object. All

    @@ -962,6 +964,10 @@



    return rVal;

    }

    +
  • public boolean containsGui(BoundingVolume bound) {
  •    return guiBounding.intersects(bound);<br />
    
  • }



    /**
  • @return the view matrix of the camera.

    @@ -1042,6 +1048,16 @@

    */

    public void onViewPortChange() {

    viewportChanged = true;
  •    setGuiBounding();<br />
    
  • }

    +
  • private void setGuiBounding() {
  •    int xExtent = width/2;<br />
    
  •    int yExtent = height/2;<br />
    
  •    guiBounding.setCenter(new Vector3f(xExtent, yExtent, 0));<br />
    
  •    guiBounding.setXExtent(xExtent);<br />
    
  •    guiBounding.setYExtent(yExtent);<br />
    
  •    guiBounding.setZExtent(Float.MAX_VALUE);<br />
    

}



/**



[/patch]

This is a cool idea!

But it won’t work if any of the Camera.setViewPort***() methods are called, see TestMultiViews on how those methods are used.

Thank you for the review. :slight_smile:

If I get it right, how about this?

From

[java]

private void setGuiBounding() {

int xExtent = width/2;

int yExtent = height/2;

guiBounding.setCenter(new Vector3f(xExtent, yExtent, 0));

guiBounding.setXExtent(xExtent);

guiBounding.setYExtent(yExtent);

guiBounding.setZExtent(Float.MAX_VALUE);

}

[/java]

To

[java]

private void setGuiBounding() {

float sx = widthviewPortLeft;

float ex = width
viewPortRight;

float sy = heightviewPortBottom;

float ey = height
viewPortTop;

float xExtent = (ex-sx)/2;

float yExtent = (ey-sy)/2;

guiBounding.setCenter(new Vector3f(sx+xExtent, sy+yExtent, 0));

guiBounding.setXExtent(xExtent);

guiBounding.setYExtent(yExtent);

guiBounding.setZExtent(Float.MAX_VALUE);

}

[/java]



Patch

[patch]

Index: src/core/com/jme3/renderer/Camera.java

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

— src/core/com/jme3/renderer/Camera.java (revision 7142)

+++ src/core/com/jme3/renderer/Camera.java (working copy)

@@ -31,6 +31,7 @@

*/

package com.jme3.renderer;



+import com.jme3.bounding.BoundingBox;

import com.jme3.bounding.BoundingVolume;

import com.jme3.export.JmeExporter;

import com.jme3.export.JmeImporter;

@@ -205,6 +206,7 @@

protected Matrix4f viewMatrix = new Matrix4f();

protected Matrix4f projectionMatrix = new Matrix4f();

protected Matrix4f viewProjectionMatrix = new Matrix4f();

  • private BoundingBox guiBounding = new BoundingBox();



    /**
  • Constructor instantiates a new <code>Camera</code> object. All

    @@ -962,6 +964,10 @@



    return rVal;

    }

    +
  • public boolean containsGui(BoundingVolume bound) {
  •    return guiBounding.intersects(bound);<br />
    
  • }



    /**
  • @return the view matrix of the camera.

    @@ -1042,6 +1048,20 @@

    */

    public void onViewPortChange() {

    viewportChanged = true;
  •    setGuiBounding();<br />
    
  • }

    +
  • private void setGuiBounding() {
  •    float sx = width*viewPortLeft;<br />
    
  •    float ex = width*viewPortRight;<br />
    
  •    float sy = height*viewPortBottom;<br />
    
  •    float ey = height*viewPortTop;<br />
    
  •    float xExtent = (ex-sx)/2;<br />
    
  •    float yExtent = (ey-sy)/2;<br />
    
  •    guiBounding.setCenter(new Vector3f(sx+xExtent, sy+yExtent, 0));<br />
    
  •    guiBounding.setXExtent(xExtent);<br />
    
  •    guiBounding.setYExtent(yExtent);<br />
    
  •    guiBounding.setZExtent(Float.MAX_VALUE);<br />
    

}



/**

Index: src/core/com/jme3/scene/Spatial.java

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

— src/core/com/jme3/scene/Spatial.java (revision 7142)

+++ src/core/com/jme3/scene/Spatial.java (working copy)

@@ -51,6 +51,7 @@

import com.jme3.renderer.RenderManager;

import com.jme3.renderer.ViewPort;

import com.jme3.renderer.queue.RenderQueue;

+import com.jme3.renderer.queue.RenderQueue.Bucket;

import com.jme3.renderer.queue.RenderQueue.ShadowMode;

import com.jme3.scene.control.Control;

import com.jme3.util.TempVars;

@@ -247,11 +248,15 @@

: Camera.FrustumIntersect.Intersects);



if (frustrumIntersects == Camera.FrustumIntersect.Intersects) {

  •        int state = cam.getPlaneState();<br />
    

-

  •        frustrumIntersects = cam.contains(getWorldBound());<br />
    

-

  •        cam.setPlaneState(state);<br />
    
  •        if (getQueueBucket() == Bucket.Gui) {<br />
    
  •            return cam.containsGui(getWorldBound());<br />
    
  •        } else {<br />
    
  •            int state = cam.getPlaneState();<br />
    

+

  •            frustrumIntersects = cam.contains(getWorldBound());<br />
    

+

  •            cam.setPlaneState(state);<br />
    
  •        }<br />
    

}



return frustrumIntersects != Camera.FrustumIntersect.Outside;



[/patch]

Okay, looking good

committed. rev. 7145.