* Render off screen surfaces even if main screen isn't visible

* AWTLoader now supports 16-bit grayscale PNG loading as Luminance16
 * AWTLoader uses try/finally on stream
 * Fix exception in MaterialLoader (was it really that hard to fix, normen?)

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8185 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..rd 13 years ago
parent 2f41dcfd48
commit 062507e23e
  1. 4
      engine/src/core/com/jme3/app/SimpleApplication.java
  2. 17
      engine/src/core/com/jme3/renderer/RenderManager.java
  3. 67
      engine/src/desktop/com/jme3/texture/plugins/AWTLoader.java
  4. 2
      engine/src/ogre/com/jme3/scene/plugins/ogre/MaterialLoader.java

@ -260,9 +260,7 @@ public abstract class SimpleApplication extends Application {
// render states
stateManager.render(renderManager);
if (context.isRenderable()){
renderManager.render(tpf);
}
renderManager.render(tpf, context.isRenderable());
simpleRender(renderManager);
stateManager.postRender();
}

@ -1148,7 +1148,7 @@ public class RenderManager {
*
* @param tpf Time per frame value
*/
public void render(float tpf) {
public void render(float tpf, boolean mainFrameBufferActive) {
if (renderer instanceof NullRenderer) {
return;
}
@ -1156,13 +1156,22 @@ public class RenderManager {
this.shader = renderer.getCaps().contains(Caps.GLSL100);
for (int i = 0; i < preViewPorts.size(); i++) {
renderViewPort(preViewPorts.get(i), tpf);
ViewPort vp = preViewPorts.get(i);
if (vp.getOutputFrameBuffer() != null || mainFrameBufferActive){
renderViewPort(vp, tpf);
}
}
for (int i = 0; i < viewPorts.size(); i++) {
renderViewPort(viewPorts.get(i), tpf);
ViewPort vp = viewPorts.get(i);
if (vp.getOutputFrameBuffer() != null || mainFrameBufferActive){
renderViewPort(vp, tpf);
}
}
for (int i = 0; i < postViewPorts.size(); i++) {
renderViewPort(postViewPorts.get(i), tpf);
ViewPort vp = postViewPorts.get(i);
if (vp.getOutputFrameBuffer() != null || mainFrameBufferActive){
renderViewPort(vp, tpf);
}
}
}
}

@ -43,6 +43,7 @@ import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferUShort;
import java.awt.image.DirectColorModel;
import java.io.IOException;
import java.io.InputStream;
@ -65,12 +66,15 @@ public class AWTLoader implements AssetLoader {
Transparency.BITMASK,
DataBuffer.TYPE_BYTE);
private byte[] extractImageData(BufferedImage img){
private Object extractImageData(BufferedImage img){
DataBuffer buf = img.getRaster().getDataBuffer();
switch (buf.getDataType()){
case DataBuffer.TYPE_BYTE:
DataBufferByte byteBuf = (DataBufferByte) buf;
return byteBuf.getData();
case DataBuffer.TYPE_USHORT:
DataBufferUShort shortBuf = (DataBufferUShort) buf;
return shortBuf.getData();
}
return null;
}
@ -87,25 +91,55 @@ public class AWTLoader implements AssetLoader {
}
}
private void flipImage(short[] img, int width, int height, int bpp){
int scSz = (width * bpp) / 8;
scSz /= 2; // Because shorts are 2 bytes
byte[] sln = new byte[scSz];
int y2 = 0;
for (int y1 = 0; y1 < height / 2; y1++){
y2 = height - y1 - 1;
System.arraycopy(img, y1 * scSz, sln, 0, scSz);
System.arraycopy(img, y2 * scSz, img, y1 * scSz, scSz);
System.arraycopy(sln, 0, img, y2 * scSz, scSz);
}
}
public Image load(BufferedImage img, boolean flipY){
int width = img.getWidth();
int height = img.getHeight();
switch (img.getType()){
case BufferedImage.TYPE_4BYTE_ABGR: // most common in PNG images w/ alpha
byte[] dataBuf1 = (byte[]) extractImageData(img);
if (flipY)
flipImage(dataBuf1, width, height, 32);
ByteBuffer data1 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*4);
data1.put(dataBuf1);
return new Image(Format.ABGR8, width, height, data1);
case BufferedImage.TYPE_3BYTE_BGR: // most common in JPEG images
byte[] dataBuf = extractImageData(img);
byte[] dataBuf2 = (byte[]) extractImageData(img);
if (flipY)
flipImage(dataBuf, width, height, 24);
ByteBuffer data = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*3);
data.put(dataBuf);
return new Image(Format.BGR8, width, height, data);
flipImage(dataBuf2, width, height, 24);
ByteBuffer data2 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*3);
data2.put(dataBuf2);
return new Image(Format.BGR8, width, height, data2);
case BufferedImage.TYPE_BYTE_GRAY: // grayscale fonts
byte[] dataBuf2 = extractImageData(img);
byte[] dataBuf3 = (byte[]) extractImageData(img);
if (flipY)
flipImage(dataBuf2, width, height, 8);
ByteBuffer data2 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight());
data2.put(dataBuf2);
return new Image(Format.Luminance8, width, height, data2);
flipImage(dataBuf3, width, height, 8);
ByteBuffer data3 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight());
data3.put(dataBuf3);
return new Image(Format.Luminance8, width, height, data3);
case BufferedImage.TYPE_USHORT_GRAY: // grayscale heightmap
short[] dataBuf4 = (short[]) extractImageData(img);
if (flipY)
flipImage(dataBuf4, width, height, 16);
ByteBuffer data4 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*2);
data4.asShortBuffer().put(dataBuf4);
return new Image(Format.Luminance16, width, height, data4);
default:
break;
}
@ -163,11 +197,18 @@ public class AWTLoader implements AssetLoader {
public Object load(AssetInfo info) throws IOException {
if (ImageIO.getImageWritersBySuffix(info.getKey().getExtension()) != null){
InputStream in = info.openStream();
boolean flip = ((TextureKey) info.getKey()).isFlipY();
InputStream in = null;
try {
in = info.openStream();
Image img = load(in, flip);
in.close();
return img;
} finally {
if (in != null){
in.close();
}
}
}
return null;
}

@ -458,6 +458,8 @@ public class MaterialLoader implements AssetLoader {
list.put(matName, mat);
}
}
return list;
}
public Object load(AssetInfo info) throws IOException {

Loading…
Cancel
Save