diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java
index 6f9d93f36e..d03a91fbb4 100644
--- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java
+++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java
@@ -1814,12 +1814,12 @@ public void updateRenderTexture(FrameBuffer fb, RenderBuffer rb) {
convertAttachmentSlot(rb.getSlot()),
convertTextureType(tex.getType(), image.getMultiSamples(), rb.getFace()),
image.getId(),
- 0);
+ rb.getLevel());
} else {
glfbo.glFramebufferTextureLayerEXT(GLFbo.GL_FRAMEBUFFER_EXT,
convertAttachmentSlot(rb.getSlot()),
image.getId(),
- 0,
+ rb.getLevel(),
rb.getLayer());
}
}
diff --git a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java
index 3bd74a016a..09af36069c 100644
--- a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java
+++ b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java
@@ -90,7 +90,7 @@ public class FrameBuffer extends NativeObject {
* buffer that will be rendered to. RenderBuffers
* are attached to an attachment slot on a FrameBuffer.
*/
- public class RenderBuffer {
+ public static class RenderBuffer {
Texture tex;
Image.Format format;
@@ -98,6 +98,12 @@ public class RenderBuffer {
int slot = SLOT_UNDEF;
int face = -1;
int layer = -1;
+ int level = 0;
+
+
+ public int getLevel() {
+ return this.level;
+ }
/**
* @return The image format of the render buffer.
@@ -167,6 +173,108 @@ public int getLayer() {
}
}
+
+ public static class FrameBufferTextureTarget extends RenderBuffer {
+ private FrameBufferTextureTarget(){}
+ void setTexture(Texture tx){
+ this.tex=tx;
+ this.format=tx.getImage().getFormat();
+ }
+
+ void setFormat(Format f){
+ this.format=f;
+ }
+
+ public FrameBufferTextureTarget layer(int i){
+ this.layer=i;
+ return this;
+ }
+
+ public FrameBufferTextureTarget level(int i){
+ this.level=i;
+ return this;
+ }
+
+ public FrameBufferTextureTarget face(TextureCubeMap.Face f){
+ return face(f.ordinal());
+ }
+
+ public FrameBufferTextureTarget face(int f){
+ this.face=f;
+ return this;
+ }
+
+ }
+
+ public static class FrameBufferBufferTarget extends RenderBuffer {
+ private FrameBufferBufferTarget(){}
+ void setFormat(Format f){
+ this.format=f;
+ }
+ }
+
+ public static class FrameBufferTarget {
+ public static FrameBufferTextureTarget newTarget(Texture tx){
+ FrameBufferTextureTarget t=new FrameBufferTextureTarget();
+ t.setTexture(tx);
+ return t;
+ }
+
+ public static FrameBufferBufferTarget newTarget(Format format){
+ FrameBufferBufferTarget t=new FrameBufferBufferTarget();
+ t.setFormat(format);
+ return t;
+ }
+ }
+
+
+ public void addColorTarget(FrameBufferBufferTarget colorBuf){
+ colorBuf.slot=colorBufs.size();
+ colorBufs.add(colorBuf);
+ }
+
+ public void addColorTarget(FrameBufferTextureTarget colorBuf){
+ // checkSetTexture(colorBuf.getTexture(), false); // TODO: this won't work for levels.
+ colorBuf.slot=colorBufs.size();
+ colorBufs.add(colorBuf);
+ }
+
+ public void setDepthTarget(FrameBufferBufferTarget depthBuf){
+ if (!depthBuf.getFormat().isDepthFormat())
+ throw new IllegalArgumentException("Depth buffer format must be depth.");
+ this.depthBuf = depthBuf;
+ this.depthBuf.slot = this.depthBuf.getFormat().isDepthStencilFormat() ? SLOT_DEPTH_STENCIL : SLOT_DEPTH;
+ }
+
+ public void setDepthTarget(FrameBufferTextureTarget depthBuf){
+ checkSetTexture(depthBuf.getTexture(), true);
+ this.depthBuf = depthBuf;
+ this.depthBuf.slot = depthBuf.getTexture().getImage().getFormat().isDepthStencilFormat() ? SLOT_DEPTH_STENCIL : SLOT_DEPTH;
+ }
+
+ public int getNumColorTargets(){
+ return colorBufs.size();
+ }
+
+ public RenderBuffer getColorTarget(int index){
+ return colorBufs.get(index);
+ }
+
+ public RenderBuffer getColorTarget() {
+ if (colorBufs.isEmpty())
+ return null;
+ if (colorBufIndex<0 || colorBufIndex>=colorBufs.size()) {
+ return colorBufs.get(0);
+ }
+ return colorBufs.get(colorBufIndex);
+ }
+
+ public RenderBuffer getDepthTarget() {
+ return depthBuf;
+ }
+
+
+
/**
*
* Creates a new FrameBuffer with the given width, height, and number
@@ -213,7 +321,9 @@ protected FrameBuffer(FrameBuffer src) {
*
* @param format The format to use for the depth buffer.
* @throws IllegalArgumentException If format is not a depth format.
+ * @deprecated Use setDepthTarget
*/
+ @Deprecated
public void setDepthBuffer(Image.Format format) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -233,7 +343,9 @@ public void setDepthBuffer(Image.Format format) {
*
* @param format The format to use for the color buffer.
* @throws IllegalArgumentException If format is not a color format.
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void setColorBuffer(Image.Format format) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -337,7 +449,9 @@ public int getTargetIndex() {
* only target.
*
* @param tex The color texture to set.
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void setColorTexture(Texture2D tex) {
clearColorTargets();
addColorTexture(tex);
@@ -350,7 +464,9 @@ public void setColorTexture(Texture2D tex) {
* only target.
*
* @param tex The color texture array to set.
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void setColorTexture(TextureArray tex, int layer) {
clearColorTargets();
addColorTexture(tex, layer);
@@ -364,7 +480,9 @@ public void setColorTexture(TextureArray tex, int layer) {
*
* @param tex The cube-map texture to set.
* @param face The face of the cube-map to render to.
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void setColorTexture(TextureCubeMap tex, TextureCubeMap.Face face) {
clearColorTargets();
addColorTexture(tex, face);
@@ -386,7 +504,9 @@ public void clearColorTargets() {
*
* @param format the format of the color buffer
* @see #addColorTexture(com.jme3.texture.Texture2D)
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void addColorBuffer(Image.Format format) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -412,7 +532,9 @@ public void addColorBuffer(Image.Format format) {
*
* @param tex The texture to add.
* @see #addColorBuffer(com.jme3.texture.Image.Format)
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void addColorTexture(Texture2D tex) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -437,7 +559,9 @@ public void addColorTexture(Texture2D tex) {
* is rendered to by the shader.
*
* @param tex The texture array to add.
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void addColorTexture(TextureArray tex, int layer) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -464,7 +588,9 @@ public void addColorTexture(TextureArray tex, int layer) {
*
* @param tex The cube-map texture to add.
* @param face The face of the cube-map to render to.
+ * @deprecated Use addColorTarget
*/
+ @Deprecated
public void addColorTexture(TextureCubeMap tex, TextureCubeMap.Face face) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -486,7 +612,9 @@ public void addColorTexture(TextureCubeMap tex, TextureCubeMap.Face face) {
* Set the depth texture to use for this framebuffer.
*
* @param tex The color texture to set.
+ * @deprecated Use setDepthTarget
*/
+ @Deprecated
public void setDepthTexture(Texture2D tex) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -501,6 +629,13 @@ public void setDepthTexture(Texture2D tex) {
depthBuf.format = img.getFormat();
}
+ /**
+ *
+ * @param tex
+ * @param layer
+ * @deprecated Use setDepthTarget
+ */
+ @Deprecated
public void setDepthTexture(TextureArray tex, int layer) {
if (id != -1) {
throw new UnsupportedOperationException("FrameBuffer already initialized.");
@@ -518,7 +653,9 @@ public void setDepthTexture(TextureArray tex, int layer) {
/**
* @return The number of color buffers attached to this texture.
+ * @deprecated Use getNumColorTargets
*/
+ @Deprecated
public int getNumColorBuffers() {
return colorBufs.size();
}
@@ -526,7 +663,9 @@ public int getNumColorBuffers() {
/**
* @param index
* @return The color buffer at the given index.
+ * @deprecated Use getColorTarget(int)
*/
+ @Deprecated
public RenderBuffer getColorBuffer(int index) {
return colorBufs.get(index);
}
@@ -535,7 +674,9 @@ public RenderBuffer getColorBuffer(int index) {
* @return The color buffer with the index set by {@link #setTargetIndex(int)}, or null
* if no color buffers are attached.
* If MRT is disabled, the first color buffer is returned.
+ * @deprecated Use getColorTarget()
*/
+ @Deprecated
public RenderBuffer getColorBuffer() {
if (colorBufs.isEmpty()) {
return null;
@@ -549,7 +690,9 @@ public RenderBuffer getColorBuffer() {
/**
* @return The depth buffer attached to this FrameBuffer, or null
* if no depth buffer is attached
+ * @deprecated Use getDepthTarget()
*/
+ @Deprecated
public RenderBuffer getDepthBuffer() {
return depthBuf;
}
diff --git a/jme3-examples/src/main/java/jme3test/post/TestMultiRenderTarget.java b/jme3-examples/src/main/java/jme3test/post/TestMultiRenderTarget.java
index 96b6fbefb8..94fcc370ff 100644
--- a/jme3-examples/src/main/java/jme3test/post/TestMultiRenderTarget.java
+++ b/jme3-examples/src/main/java/jme3test/post/TestMultiRenderTarget.java
@@ -49,6 +49,7 @@
import com.jme3.texture.FrameBuffer;
import com.jme3.texture.Image.Format;
import com.jme3.texture.Texture2D;
+import com.jme3.texture.FrameBuffer.FrameBufferTarget;
import com.jme3.ui.Picture;
public class TestMultiRenderTarget extends SimpleApplication implements SceneProcessor {
@@ -177,10 +178,10 @@ public void reshape(ViewPort vp, int w, int h) {
guiNode.updateGeometricState();
fb = new FrameBuffer(w, h, 1);
- fb.setDepthTexture(depthData);
- fb.addColorTexture(diffuseData);
- fb.addColorTexture(normalData);
- fb.addColorTexture(specularData);
+ fb.setDepthTarget(FrameBufferTarget.newTarget(depthData));
+ fb.addColorTarget(FrameBufferTarget.newTarget(diffuseData));
+ fb.addColorTarget(FrameBufferTarget.newTarget(normalData));
+ fb.addColorTarget(FrameBufferTarget.newTarget(specularData));
fb.setMultiTarget(true);
/*