mulova
1
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) {
-
-
-
if (getQueueBucket() == Bucket.Gui) {<br />
-
return cam.containsGui(getWorldBound());<br />
-
} else {<br />
-
int state = cam.getPlaneState();<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;
}
+
-
@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.
mulova
3
Thank you for the review.
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 = widthviewPortRight;
float sy = heightviewPortBottom;
float ey = heightviewPortTop;
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;
}
+
-
@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) {
-
-
-
if (getQueueBucket() == Bucket.Gui) {<br />
-
return cam.containsGui(getWorldBound());<br />
-
} else {<br />
-
int state = cam.getPlaneState();<br />
+
+
}
return frustrumIntersects != Camera.FrustumIntersect.Outside;
[/patch]