* 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
This commit is contained in:
parent
2f41dcfd48
commit
062507e23e
@ -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;
|
||||
}
|
||||
@ -86,26 +90,56 @@ public class AWTLoader implements AssetLoader {
|
||||
System.arraycopy(sln, 0, img, y2 * scSz, scSz);
|
||||
}
|
||||
}
|
||||
|
||||
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_3BYTE_BGR: // most common in JPEG images
|
||||
byte[] dataBuf = extractImageData(img);
|
||||
case BufferedImage.TYPE_4BYTE_ABGR: // most common in PNG images w/ alpha
|
||||
byte[] dataBuf1 = (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(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[] dataBuf2 = (byte[]) extractImageData(img);
|
||||
if (flipY)
|
||||
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();
|
||||
Image img = load(in, flip);
|
||||
in.close();
|
||||
return img;
|
||||
InputStream in = null;
|
||||
try {
|
||||
in = info.openStream();
|
||||
Image img = load(in, flip);
|
||||
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…
x
Reference in New Issue
Block a user