/** * Copyright (c) 2012, Matt DesLauriers All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * * Redistributions in binary * form must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials provided * with the distribution. * * * Neither the name of the Matt DesLauriers nor the names * of his contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package mdesl.util; import org.lwjgl.util.vector.Matrix4f; /** * Math utilities; adapted from LibGDX's vector classes for use with LWJGL Vector utilities */ public class MathUtil { /** * Sets the given matrix to an orthographic 2D projection matrix, and returns it. If the given matrix * is null, a new one will be created and returned. * * @param m the matrix to re-use, or null to create a new matrix * @param x * @param y * @param width * @param height * @return the given matrix, or a newly created matrix if none was specified */ public static Matrix4f toOrtho2D(Matrix4f m, float x, float y, float width, float height) { return toOrtho(m, x, x + width, y + height, y, 1, -1); } /** * Sets the given matrix to an orthographic 2D projection matrix, and returns it. If the given matrix * is null, a new one will be created and returned. * * @param m the matrix to re-use, or null to create a new matrix * @param x * @param y * @param width * @param height * @param near near clipping plane * @param far far clipping plane * @return the given matrix, or a newly created matrix if none was specified */ public static Matrix4f toOrtho2D(Matrix4f m, float x, float y, float width, float height, float near, float far) { return toOrtho(m, x, x + width, y, y + height, near, far); } /** * Sets the given matrix to an orthographic projection matrix, and returns it. If the given matrix * is null, a new one will be created and returned. * * @param m the matrix to re-use, or null to create a new matrix * @param left * @param right * @param bottom * @param top * @param near near clipping plane * @param far far clipping plane * @return the given matrix, or a newly created matrix if none was specified */ public static Matrix4f toOrtho(Matrix4f m, float left, float right, float bottom, float top, float near, float far) { if (m==null) m = new Matrix4f(); float x_orth = 2 / (right - left); float y_orth = 2 / (top - bottom); float z_orth = -2 / (far - near); float tx = -(right + left) / (right - left); float ty = -(top + bottom) / (top - bottom); float tz = -(far + near) / (far - near); m.m00 = x_orth; m.m10 = 0; m.m20 = 0; m.m30 = 0; m.m01 = 0; m.m11 = y_orth; m.m21 = 0; m.m31 = 0; m.m02 = 0; m.m12 = 0; m.m22 = z_orth; m.m32 = 0; m.m03 = tx; m.m13 = ty; m.m23 = tz; m.m33 = 1; return m; } /** Sets the matrix to a projection matrix with a near- and far plane, a field of view in degrees and an aspect ratio. * * @param near The near plane * @param far The far plane * @param fov The field of view in degrees * @param aspectRatio The aspect ratio * @return This matrix for the purpose of chaining methods together. */ public static Matrix4f setToProjection (Matrix4f m, float near, float far, float fov, float aspectRatio) { if (m==null) m = new Matrix4f(); m.setIdentity(); float l_fd = (float)(1.0 / Math.tan((fov * (Math.PI / 180)) / 2.0)); float l_a1 = (far + near) / (near - far); float l_a2 = (2 * far * near) / (near - far); m.m00 = l_fd / aspectRatio; m.m10 = 0; m.m20 = 0; m.m30 = 0; m.m01 = 0; m.m11 = l_fd; m.m21 = 0; m.m31 = 0; m.m02 = 0; m.m12 = 0; m.m22 = l_a1; m.m32 = -1; m.m03 = 0; m.m13 = 0; m.m23 = l_a2; m.m33 = 0; return m; } }