From de4f66e0239a736bce24e09c9a0b49b5bb92d84b Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Tue, 23 Jul 2019 02:41:35 -0400 Subject: [PATCH] Min shader. --- CameraPane.java | 173 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 149 insertions(+), 24 deletions(-) diff --git a/CameraPane.java b/CameraPane.java index cef7cdb..be97bb1 100644 --- a/CameraPane.java +++ b/CameraPane.java @@ -18,7 +18,10 @@ import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; +import javax.imageio.ImageReadParam; +import javax.imageio.ImageReader; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; +import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageOutputStream; import javax.imageio.ImageWriteParam; @@ -30,6 +33,7 @@ import java.nio.*; import gleem.linalg.Mat4f; +import javax.imageio.ImageTypeSpecifier; class CameraPane extends GLCanvas implements iCameraPane, Runnable, GLEventListener, ActionListener, MouseWheelListener, MouseMotionListener, MouseListener, KeyListener { @@ -93,7 +97,7 @@ //boolean REDUCETEXTURE = true; boolean CACHETEXTURE = true; boolean CLEANCACHE = false; // true; - boolean MIPMAP = true; // false; // true; + boolean MIPMAP = false; // true; // never works... boolean COMPRESSTEXTURE = false; boolean KOMPACTTEXTURE = false; // true; boolean RESIZETEXTURE = false; @@ -8358,14 +8362,26 @@ { TextureData texturedata = null; - if (texdata != null) + if (texdata != null && textureon) { - BufferedImage bim = //new BufferedImage(bump?tex.bw:tex.pw, bump?tex.bh:tex.ph, BufferedImage.TYPE_INT_RGB); + BufferedImage bim; // = new BufferedImage(bump?tex.bw:tex.pw, bump?tex.bh:tex.ph, BufferedImage.TYPE_INT_RGB); - CreateBim(texdata, bump?tex.bw:tex.pw, bump?tex.bh:tex.ph); + try + { + bim = DecompressJPEG(texdata, bump?tex.bw:tex.pw, bump?tex.bh:tex.ph); + } + catch (Exception e) + { + bim = CreateBim(texdata, bump?tex.bw:tex.pw, bump?tex.bh:tex.ph); + } texturecache = new CacheTexture(GetBimTexture(bim, bump), -1); bimtextures.put(texdata, texturecache); + + //BufferedImage bim3 = new BufferedImage(bump?tex.bw:tex.pw, bump?tex.bh:tex.ph, BufferedImage.TYPE_INT_RGB); + + //Object bim2 = CreateBim(texturecache.texturedata); + //bim2 = bim; } else if (texname.endsWith("DEFAULT_TEXTURE")) // ||*/ tex.equals("")) @@ -8560,29 +8576,32 @@ { if (tex.pigmentdata == null) { - String texname = Object3D.GetPigment(tex); + //String texname = Object3D.GetPigment(tex); CacheTexture texturecache = texturepigment.get(tex); if (texturecache != null) { - tex.pigmentdata = ((ByteBuffer)texturecache.texturedata.getBuffer()).array(); tex.pw = texturecache.texturedata.getWidth(); tex.ph = texturecache.texturedata.getHeight(); + tex.pigmentdata = //CompressJPEG(CreateBim + ((ByteBuffer)texturecache.texturedata.getBuffer()).array() + ; + //, tex.pw, tex.ph), 0.5f); } } if (tex.bumpdata == null) { - String texname = Object3D.GetBump(tex); + //String texname = Object3D.GetBump(tex); CacheTexture texturecache = texturebump.get(tex); if (texturecache != null) { - tex.bumpdata = ((ByteBuffer)texturecache.texturedata.getBuffer()).array(); tex.bw = texturecache.texturedata.getWidth(); tex.bh = texturecache.texturedata.getHeight(); + tex.bumpdata = CompressJPEG(CreateBim(((ByteBuffer)texturecache.texturedata.getBuffer()).array(), tex.bw, tex.bh), 0.5f); } } } @@ -8654,6 +8673,72 @@ return true; // Warning: not used. } + public static byte[] CompressJPEG(BufferedImage image, float quality) + { + try + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); + ImageWriter writer = writers.next(); + + ImageWriteParam param = writer.getDefaultWriteParam(); + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + + ImageOutputStream ios = ImageIO.createImageOutputStream(baos); + writer.setOutput(ios); + writer.write(null, new IIOImage(image, null, null), param); + + byte[] data = baos.toByteArray(); + writer.dispose(); + return data; + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public static BufferedImage DecompressJPEG(byte[] image, int w, int h) throws IOException + { + ByteArrayInputStream baos = new ByteArrayInputStream(image); + Iterator<ImageReader> writers = ImageIO.getImageReadersByFormatName("jpg"); + ImageReader reader = writers.next(); + + BufferedImage bim = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + + ImageReadParam param = reader.getDefaultReadParam(); + param.setDestination(bim); + //param.setDestinationType(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB)); + + ImageInputStream ios = ImageIO.createImageInputStream(baos); + reader.setInput(ios); + BufferedImage bim2 = reader.read(0, param); + reader.dispose(); + +// WritableRaster raster = bim2.getRaster(); +// DataBufferByte data = (DataBufferByte) raster.getDataBuffer(); +// byte[] bytes = data.getData(); +// +// int[] pixels = new int[bytes.length/3]; +// for (int i=pixels.length; --i>=0;) +// { +// int i3 = i*3; +// pixels[i] = 0xFF; +// pixels[i] <<= 8; +// pixels[i] |= bytes[i3+2] & 0xFF; +// pixels[i] <<= 8; +// pixels[i] |= bytes[i3+1] & 0xFF; +// pixels[i] <<= 8; +// pixels[i] |= bytes[i3] & 0xFF; +// } +// +// bim.setRGB(0,0,w,h, pixels, w*(h-1),-w); + + return bim; + } + ShadowBuffer shadowPBuf; AntialiasBuffer antialiasPBuf; int MAXSTACK; @@ -11399,7 +11484,7 @@ } } - if (false) // fast && !IsFreezed() && DrawMode() != SELECTION && !ambientOcclusion) + if (false) //RENDERPROGRAM > 0 && DrawMode() == DEFAULT) // fast && !IsFreezed() && DrawMode() != SELECTION && !ambientOcclusion) { //gl.glDepthFunc(GL.GL_LEQUAL); //gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT); @@ -11407,24 +11492,21 @@ boolean texon = textureon; - if (RENDERPROGRAM > 0) - { - gl.glDisable(GL.GL_FRAGMENT_PROGRAM_ARB); - textureon = false; - } + gl.glDisable(GL.GL_FRAGMENT_PROGRAM_ARB); + textureon = false; + //gl.glDisable(GL.GL_VERTEX_PROGRAM_ARB); //System.out.println("ALLO"); gl.glColorMask(false, false, false, false); DrawObject(gl); - if (RENDERPROGRAM > 0) - { - gl.glEnable(GL.GL_FRAGMENT_PROGRAM_ARB); - textureon = texon; - } + + gl.glEnable(GL.GL_FRAGMENT_PROGRAM_ARB); + textureon = texon; + gl.glColorMask(true, true, true, true); gl.glDepthFunc(GL.GL_EQUAL); - //gl.glDepthMask(false); + gl.glDepthMask(false); } if (false) // DrawMode() == SHADOW) @@ -12318,7 +12400,51 @@ //gl.glProgramEnvParameter4fvARB(GL.GL_FRAGMENT_PROGRAM_ARB, 127, lightParams, 0); String program = + // Min shader "!!ARBfp1.0\n" + + "PARAM zero123 = { 0.0, 1.0, 2.0, 3.0 };" + + "PARAM pow2 = { 0.5, 0.25, 0.125, 0.0 };" + + "PARAM one = { 1.0, 1.0, 1.0, 1.0 };" + + "PARAM eps = { 0.001, 0.001, 0.001, 1.0 };" + + "PARAM infinity = { 100000000, 100000000, 100000000, 1.0 };" + + "TEMP temp;" + + "TEMP light;" + + "TEMP ndotl;" + + "TEMP normal;" + + "TEMP depth;" + + + "MAD normal, fragment.color, zero123.z, -zero123.y;" + + + "MOV light, state.light[0].position;" + + "DP3 ndotl.x, light, normal;" + + + // shadow + "MOV temp, fragment.texcoord[1];" + + TextureFetch("depth", "temp", "1") + + //"TEX depth, fragment.texcoord[1], texture[1], 2D;" + + "SLT temp.x, fragment.texcoord[1].z, depth.z;" + + + + // No shadow when out of frustum + //"SGE temp.y, depth.z, zero123.y;" + + //"LRP temp.x, temp.y, zero123.y, temp.x;" + + + "MUL ndotl.x, ndotl.x, temp.x;" + + "MAX ndotl.x, ndotl.x, pow2.y;" + + + "TEX temp, fragment.texcoord[0], texture[0], 2D;" + + "MUL temp, temp, ndotl.x;" + + + "MUL temp, temp, zero123.z;" + + + "MOV temp.w, zero123.y;" + // reset alpha + + "MOV result.color, temp;" + + "END"; + + String program2 = + "!!ARBfp1.0\n" + + //"OPTION ARB_fragment_program_shadow;" + "PARAM light2cam0 = program.env[10];" + "PARAM light2cam1 = program.env[11];" + @@ -12433,8 +12559,7 @@ "TEMP shininess;" + "\n" + "MOV texSamp, one;" + - //"TEX texSamp, fragment.texcoord[0], texture[0], 2D;" + - + "MOV mapgrid.x, one2048th.x;" + "MOV temp, fragment.texcoord[1];" + /* @@ -12839,7 +12964,7 @@ "MAD shadow.x, buffer.x, frac.y, shadow.x;" + "") + - // display shadow only (bump == 0) + // display shadow only (fakedepth == 0) "SUB temp.x, half.x, shadow.x;" + "MOV temp.y, -params5.z;" + // params6.x;" + "SLT temp.z, temp.y, -one2048th.x;" + @@ -13331,7 +13456,7 @@ "SLT temp.x, temp.x, zero.x;" + // shadoweps "LRP " + shadow + ", temp.x, one, " + shadow + ";" + - // No shadow when out of frustrum + // No shadow when out of frustum "SGE temp.x, " + depth + ".z, one.z;" + "LRP " + shadow + ", temp.x, one, " + shadow + ";" + ""; -- Gitblit v1.6.2