159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2011, Novyon Events 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * - Redistributions of source code must retain the above copyright notice, this 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * - Redistributions in binary form must reproduce the above copyright notice, 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * this list of conditions and the following disclaimer in the documentation 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Anthyon 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.terrain.noise; 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.Color; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.Graphics2D; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.image.BufferedImage; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.image.DataBuffer; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.image.DataBufferInt; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.image.WritableRaster; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteOrder; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Helper class containing useful functions explained in the book: 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Texturing & Modeling - A Procedural Approach 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Anthyon 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class ShaderUtils { 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float[] i2c(final int color) { 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return new float[] { (color & 0x00ff0000) / 256f, (color & 0x0000ff00) / 256f, (color & 0x000000ff) / 256f, 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta (color & 0xff000000) / 256f }; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final int c2i(final float[] color) { 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (color.length == 4 ? (int) (color[3] * 256) : 0xff000000) | ((int) (color[0] * 256) << 16) | ((int) (color[1] * 256) << 8) 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta | (int) (color[2] * 256); 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float mix(final float a, final float b, final float f) { 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (1 - f) * a + f * b; 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final Color mix(final Color a, final Color b, final float f) { 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return new Color((int) ShaderUtils.clamp(ShaderUtils.mix(a.getRed(), b.getRed(), f), 0, 255), (int) ShaderUtils.clamp( 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ShaderUtils.mix(a.getGreen(), b.getGreen(), f), 0, 255), (int) ShaderUtils.clamp( 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ShaderUtils.mix(a.getBlue(), b.getBlue(), f), 0, 255)); 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final int mix(final int a, final int b, final float f) { 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (int) ((1 - f) * a + f * b); 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float[] mix(final float[] c1, final float[] c2, final float f) { 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return new float[] { ShaderUtils.mix(c1[0], c2[0], f), ShaderUtils.mix(c1[1], c2[1], f), ShaderUtils.mix(c1[2], c2[2], f) }; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float step(final float a, final float x) { 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return x < a ? 0 : 1; 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float boxstep(final float a, final float b, final float x) { 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return ShaderUtils.clamp((x - a) / (b - a), 0, 1); 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float pulse(final float a, final float b, final float x) { 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return ShaderUtils.step(a, x) - ShaderUtils.step(b, x); 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float clamp(final float x, final float a, final float b) { 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return x < a ? a : x > b ? b : x; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float min(final float a, final float b) { 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return a < b ? a : b; 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float max(final float a, final float b) { 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return a > b ? a : b; 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float abs(final float x) { 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return x < 0 ? -x : x; 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float smoothstep(final float a, final float b, final float x) { 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (x < a) { 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return 0; 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (x > b) { 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return 1; 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float xx = (x - a) / (b - a); 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return xx * xx * (3 - 2 * xx); 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float mod(final float a, final float b) { 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int n = (int) (a / b); 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float aa = a - n * b; 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (aa < 0) { 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta aa += b; 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return aa; 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final int floor(final float x) { 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return x > 0 ? (int) x : (int) x - 1; 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float ceil(final float x) { 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (int) x + (x > 0 && x != (int) x ? 1 : 0); 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float spline(float x, final float[] knot) { 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR00 = -0.5f; 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR01 = 1.5f; 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR02 = -1.5f; 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR03 = 0.5f; 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR10 = 1.0f; 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR11 = -2.5f; 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR12 = 2.0f; 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR13 = -0.5f; 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR20 = -0.5f; 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR21 = 0.0f; 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR22 = 0.5f; 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR23 = 0.0f; 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR30 = 0.0f; 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR31 = 1.0f; 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR32 = 0.0f; 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float CR33 = 0.0f; 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int span; 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int nspans = knot.length - 3; 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float c0, c1, c2, c3; /* coefficients of the cubic. */ 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (nspans < 1) {/* illegal */ 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new RuntimeException("Spline has too few knots."); 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /* Find the appropriate 4-point span of the spline. */ 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = ShaderUtils.clamp(x, 0, 1) * nspans; 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta span = (int) x; 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (span >= knot.length - 3) { 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta span = knot.length - 3; 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x -= span; 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /* Evaluate the span cubic at x using Horner’s rule. */ 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta c3 = CR00 * knot[span + 0] + CR01 * knot[span + 1] + CR02 * knot[span + 2] + CR03 * knot[span + 3]; 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta c2 = CR10 * knot[span + 0] + CR11 * knot[span + 1] + CR12 * knot[span + 2] + CR13 * knot[span + 3]; 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta c1 = CR20 * knot[span + 0] + CR21 * knot[span + 1] + CR22 * knot[span + 2] + CR23 * knot[span + 3]; 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta c0 = CR30 * knot[span + 0] + CR31 * knot[span + 1] + CR32 * knot[span + 2] + CR33 * knot[span + 3]; 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return ((c3 * x + c2) * x + c1) * x + c0; 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float[] spline(final float x, final float[][] knots) { 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float[] retval = new float[knots.length]; 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < knots.length; i++) { 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[i] = ShaderUtils.spline(x, knots[i]); 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return retval; 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float gammaCorrection(final float gamma, final float x) { 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (float) Math.pow(x, 1 / gamma); 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float bias(final float b, final float x) { 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (float) Math.pow(x, Math.log(b) / Math.log(0.5)); 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float gain(final float g, final float x) { 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return x < 0.5 ? ShaderUtils.bias(1 - g, 2 * x) / 2 : 1 - ShaderUtils.bias(1 - g, 2 - 2 * x) / 2; 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float sinValue(final float s, final float minFreq, final float maxFreq, final float swidth) { 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float value = 0; 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float cutoff = ShaderUtils.clamp(0.5f / swidth, 0, maxFreq); 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float f; 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (f = minFreq; f < 0.5 * cutoff; f *= 2) { 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta value += Math.sin(2 * Math.PI * f * s) / f; 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float fade = ShaderUtils.clamp(2 * (cutoff - f) / cutoff, 0, 1); 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta value += fade * Math.sin(2 * Math.PI * f * s) / f; 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return value; 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float length(final float x, final float y, final float z) { 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (float) Math.sqrt(x * x + y * y + z * z); 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float[] rotate(final float[] v, final float[][] m) { 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float x = v[0] * m[0][0] + v[1] * m[0][1] + v[2] * m[0][2]; 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float y = v[0] * m[1][0] + v[1] * m[1][1] + v[2] * m[1][2]; 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float z = v[0] * m[2][0] + v[1] * m[2][1] + v[2] * m[2][2]; 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return new float[] { x, y, z }; 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float[][] calcRotationMatrix(final float ax, final float ay, final float az) { 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float[][] retval = new float[3][3]; 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float cax = (float) Math.cos(ax); 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float sax = (float) Math.sin(ax); 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float cay = (float) Math.cos(ay); 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float say = (float) Math.sin(ay); 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float caz = (float) Math.cos(az); 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float saz = (float) Math.sin(az); 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[0][0] = cay * caz; 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[0][1] = -cay * saz; 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[0][2] = say; 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[1][0] = sax * say * caz + cax * saz; 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[1][1] = -sax * say * saz + cax * caz; 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[1][2] = -sax * cay; 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[2][0] = -cax * say * caz + sax * saz; 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[2][1] = cax * say * saz + sax * caz; 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[2][2] = cax * cay; 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return retval; 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float[] normalize(final float[] v) { 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float l = ShaderUtils.length(v); 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float[] r = new float[v.length]; 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int i = 0; 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (float vv : v) { 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta r[i++] = vv / l; 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return r; 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final float length(final float[] v) { 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float s = 0; 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (float vv : v) { 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta s += vv * vv; 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (float) Math.sqrt(s); 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final ByteBuffer getImageDataFromImage(BufferedImage bufferedImage) { 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta WritableRaster wr; 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta DataBuffer db; 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta BufferedImage bi = new BufferedImage(128, 64, BufferedImage.TYPE_INT_ARGB); 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Graphics2D g = bi.createGraphics(); 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta g.drawImage(bufferedImage, null, null); 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bufferedImage = bi; 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta wr = bi.getRaster(); 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta db = wr.getDataBuffer(); 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta DataBufferInt dbi = (DataBufferInt) db; 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] data = dbi.getData(); 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ByteBuffer byteBuffer = ByteBuffer.allocateDirect(data.length * 4); 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta byteBuffer.order(ByteOrder.LITTLE_ENDIAN); 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta byteBuffer.asIntBuffer().put(data); 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta byteBuffer.flip(); 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return byteBuffer; 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static float frac(float f) { 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return f - ShaderUtils.floor(f); 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static float[] floor(float[] fs) { 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float[] retval = new float[fs.length]; 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < fs.length; i++) { 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta retval[i] = ShaderUtils.floor(fs[i]); 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return retval; 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 289