removed IlmMatrix duplication in EGLX11MockNavigation;
authorTimo Lotterbach <timo.lotterbach@bmw-carit.de>
Wed, 28 Sep 2011 07:46:18 +0000 (09:46 +0200)
committerMichael Schuldt <michael.schuldt@bmw-carit.de>
Tue, 4 Oct 2011 07:22:38 +0000 (09:22 +0200)
added IlmMatrixProjection to IlmMatrix;
refactored IlmMatrix: angle conversion now macros (evaluated at compile time), removed unused global var m_IdentityMatrix, minor code style fixes;
removed LayerScene.h duplication in EGLX11MockNavigation;
refactored CMakeLists for EGLX11MockNavigation

LayerManagerExamples/EGLX11MockNavigation/CMakeLists.txt
LayerManagerExamples/EGLX11MockNavigation/include/IlmMatrix.h [deleted file]
LayerManagerExamples/EGLX11MockNavigation/include/LayerScene.h [deleted file]
LayerManagerExamples/EGLX11MockNavigation/src/IlmMatrix.cpp [deleted file]
LayerManagerUtils/include/IlmMatrix.h
LayerManagerUtils/src/IlmMatrix.cpp

index de76a9a..90ed708 100644 (file)
 
 cmake_minimum_required (VERSION 2.6)
 
-include_directories ("include")
-include_directories ("../../LayerManagerClient/ilmClient/include")
-include_directories ("../LayerSceneDescriptionExample/include")
-include_directories ("../../LayerManagerUtils/include")
+find_package(GLESv2 REQUIRED)
+find_package(EGL REQUIRED)
+find_package(X11 REQUIRED)
 
-link_directories ("${PROJECT_SOURCE_DIR}/LayerManagerUtils/bin")
+include_directories(
+    ${GLESv2_INCLUDE_DIR}
+    ${EGL_INCLUDE_DIR}
+    ${X11_INCLUDE_DIR}
+    "include"
+    "../../LayerManagerClient/ilmClient/include"
+    "../LayerSceneDescriptionExample/include"
+    "../../LayerManagerUtils/include"
+)
+
+link_directories(
+    "${PROJECT_SOURCE_DIR}/LayerManagerUtils/bin"
+)
 
 set (HEADER_FILES
 
@@ -40,7 +51,6 @@ set (HEADER_FILES
        include/Street.h
        include/ShaderBase.h
        include/ShaderLighting.h
-       include/IlmMatrix.h
 )
 
 set (SRC_FILES
@@ -55,26 +65,28 @@ set (SRC_FILES
        src/Street.cpp
        src/ShaderBase.cpp
        src/ShaderLighting.cpp
-       src/IlmMatrix.cpp
        src/main.cpp
 )
 
-add_executable(EGLX11MockNavigation ${SRC_FILES} ${HEADER_FILES})
-
-add_dependencies(EGLX11MockNavigation ilmClient)
-#add_dependencies(EGLX11MockNavigation LayerManagerUtils)
-
-find_package (GLESv2 REQUIRED)
-include_directories(${GLESv2_INCLUDE_DIR})
+add_executable(EGLX11MockNavigation
+    ${SRC_FILES}
+    ${HEADER_FILES}
+)
 
-find_package (EGL REQUIRED)
-include_directories(${EGL_INCLUDE_DIR})
+add_dependencies(EGLX11MockNavigation
+    ilmClient
+    EGLX11MockNavigation LayerManagerUtils
+)
 
-find_package (X11 REQUIRED)
-include_directories(${X11_INCLUDE_DIR})
+set(LIBS
+       ${LIBS}
+       ${GLESv2_LIBRARIES}
+       ${X11_LIBRARIES}
+       ${EGL_LIBRARY}
+       LayerManagerUtils
+       ilmClient
+)
 
-set(LIBS ${LIBS} ${GLESv2_LIBRARIES} ${X11_LIBRARIES} ${EGL_LIBRARY})
-# LayerManagerUtils) 
-target_link_libraries(EGLX11MockNavigation ${LIBS} ilmClient)
+target_link_libraries(EGLX11MockNavigation ${LIBS})
 
 install (TARGETS EGLX11MockNavigation DESTINATION bin)
\ No newline at end of file
diff --git a/LayerManagerExamples/EGLX11MockNavigation/include/IlmMatrix.h b/LayerManagerExamples/EGLX11MockNavigation/include/IlmMatrix.h
deleted file mode 100644 (file)
index bfa560e..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/***************************************************************************
-*
-* Copyright 2010,2011 BMW Car IT GmbH
-*
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*               http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* This file incorporates work covered by the following copyright and
-* permission notice:
-*
-* Oolong Engine for the iPhone / iPod touch
-* Copyright (c) 2007-2008 Wolfgang Engel  http://code.google.com/p/oolongengine/
-*
-* This software is provided 'as-is', without any express or implied warranty.
-* In no event will the authors be held liable for any damages arising from the use of this software.
-* Permission is granted to anyone to use this software for any purpose,
-* including commercial applications, and to alter it and redistribute it freely,
-* subject to the following restrictions:
-*
-* 1. The origin of this software must not be misrepresented; you must not claim that
-*    you wrote the original software. If you use this software in a product, an
-*    acknowledgment in the product documentation would be appreciated but is not required.
-* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
-*    as being the original software.
-* 3. This notice may not be removed or altered from any source distribution.
-****************************************************************************/
-
-#ifndef _ILM_MATRIX_H_
-#define _ILM_MATRIX_H_
-
-#define MAT00     0
-#define MAT01     1
-#define MAT02     2
-#define MAT03     3
-#define MAT10     4
-#define MAT11     5
-#define MAT12     6
-#define MAT13     7
-#define MAT20     8
-#define MAT21     9
-#define MAT22     10
-#define MAT23     11
-#define MAT30     12
-#define MAT31     13
-#define MAT32     14
-#define MAT33     15
-
-typedef struct
-{
-    float x;
-    float y;
-} IlmVector2f;
-
-typedef struct
-{
-    float x;
-    float y;
-    float z;
-} IlmVector3f;
-
-typedef struct
-{
-    float x;
-    float y;
-    float z;
-    float w;
-} IlmVector4f;
-
-class IlmMatrix;
-
-void IlmMatrixIdentity(IlmMatrix &mOut);
-
-void IlmMatrixMultiply(IlmMatrix &mOut, const IlmMatrix &mA, const IlmMatrix &mB);
-
-void IlmMatrixTranslation(IlmMatrix &mOut, const float X, const float Y, const float Z);
-
-void IlmMatrixScaling(IlmMatrix &mOut, const float X, const float Y, const float Z);
-
-void IlmMatrixRotateX(IlmMatrix &mOut, const float angle);
-
-void IlmMatrixRotateY(IlmMatrix &mOut, const float angle);
-
-void IlmMatrixRotateZ(IlmMatrix &mOut, const float angle);
-
-void IlmMatrixProjection(IlmMatrix &mOut, const float fov, const float near, const float far, const float aspectRatio);
-
-class IlmMatrix
-{
-public:
-    float* operator [] (const int row)
-    {
-        return &f[row<<2];
-    }
-
-    float f[16];
-};
-
-#endif /* _ILMMATRIX_H*/
diff --git a/LayerManagerExamples/EGLX11MockNavigation/include/LayerScene.h b/LayerManagerExamples/EGLX11MockNavigation/include/LayerScene.h
deleted file mode 100644 (file)
index 749ab2b..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/***************************************************************************
- *
- * Copyright 2010,2011 BMW Car IT GmbH
- *
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ****************************************************************************/
-#ifndef _LAYERSCENE_H_
-#define _LAYERSCENE_H_
-
-typedef enum e_layers
-{
-    LAYER_NEW = 0,
-    LAYER_EXAMPLE_GLES_APPLICATIONS = 1000,
-    LAYER_EXAMPLE_X_APPLICATIONS = 2000,
-    LAYER_EXAMPLE_VIDEO_APPLICATIONS = 3000
-} scenelayers;
-
-typedef enum e_surfaces
-{
-    SURFACE_NEW = 0,
-    SURFACE_EXAMPLE_EGLX11_APPLICATION = 10,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_1 = 11,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_2 = 12,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_3 = 13,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_4 = 14,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_5 = 15,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_6 = 16,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_7 = 17,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_8 = 18,
-    SURFACE_EXAMPLE_GDTESTENV_APPLICATION_9 = 19,
-    SURFACE_EXAMPLE_GLXX11_APPLICATION = 20,
-    SURFACE_EXAMPLE_EGLRAW_APPLICATION = 30,
-    SURFACE_EXAMPLE_VIDEO_APPLICATION = 40
-} sceneSurfaces;
-
-typedef enum e_surfaceGroups
-{
-    SURFACEGROUP_NEW = 0
-} sceneSurfaceGroups;
-
-typedef enum e_layerGroups
-{
-    LAYERGROUP_NEW = 0
-} sceneLayerGroups;
-
-#endif /* _LAYERSCENE_H_ */
diff --git a/LayerManagerExamples/EGLX11MockNavigation/src/IlmMatrix.cpp b/LayerManagerExamples/EGLX11MockNavigation/src/IlmMatrix.cpp
deleted file mode 100644 (file)
index 5e9b20e..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-/***************************************************************************
-*
-* Copyright 2010,2011 BMW Car IT GmbH
-*
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*               http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* This file incorporates work covered by the following copyright and
-* permission notice:
-*
-* Oolong Engine for the iPhone / iPod touch
-* Copyright (c) 2007-2008 Wolfgang Engel  http://code.google.com/p/oolongengine/
-*
-* This software is provided 'as-is', without any express or implied warranty.
-* In no event will the authors be held liable for any damages arising from the use of this software.
-* Permission is granted to anyone to use this software for any purpose,
-* including commercial applications, and to alter it and redistribute it freely,
-* subject to the following restrictions:
-*
-* 1. The origin of this software must not be misrepresented; you must not claim that
-*    you wrote the original software. If you use this software in a product, an
-*    acknowledgment in the product documentation would be appreciated but is not required.
-* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
-*    as being the original software.
-* 3. This notice may not be removed or altered from any source distribution.
-****************************************************************************/
-#include "IlmMatrix.h"
-#include <math.h>
-
-#define ILM_PI 3.14159265
-
-float degToRad(float deg)
-{
-    return deg * ILM_PI / 180.0f;
-}
-
-float radToDeg(float rad)
-{
-    return rad * 180.0f / ILM_PI;
-}
-
-void IlmMatrixIdentity(IlmMatrix &mOut)
-{
-    mOut.f[0] = 1.0f;    mOut.f[4] = 0.0f;    mOut.f[8] = 0.0f;    mOut.f[12] = 0.0f;
-    mOut.f[1] = 0.0f;    mOut.f[5] = 1.0f;    mOut.f[9] = 0.0f;    mOut.f[13] = 0.0f;
-    mOut.f[2] = 0.0f;    mOut.f[6] = 0.0f;    mOut.f[10] = 1.0f;    mOut.f[14] = 0.0f;
-    mOut.f[3] = 0.0f;    mOut.f[7] = 0.0f;    mOut.f[11] = 0.0f;    mOut.f[15] = 1.0f;
-}
-
-void IlmMatrixMultiply(IlmMatrix &mOut, const IlmMatrix &mA, const IlmMatrix &mB)
-{
-    IlmMatrix mRet;
-
-    mRet.f[0] = mA.f[0] * mB.f[0] + mA.f[1]*mB.f[4] + mA.f[2]*mB.f[8]+mA.f[3]*mB.f[12];
-    mRet.f[1] = mA.f[0] * mB.f[1] + mA.f[1]*mB.f[5] + mA.f[2]*mB.f[9]+mA.f[3]*mB.f[13];
-    mRet.f[2] = mA.f[0] * mB.f[2] + mA.f[1]*mB.f[6] + mA.f[2]*mB.f[10]+mA.f[3]*mB.f[14];
-    mRet.f[3] = mA.f[0] * mB.f[3] + mA.f[1]*mB.f[7] + mA.f[2]*mB.f[11]+mA.f[3]*mB.f[15];
-
-    mRet.f[4] = mA.f[4] * mB.f[0] + mA.f[5]*mB.f[4] + mA.f[6]*mB.f[8]+mA.f[7]*mB.f[12];
-    mRet.f[5] = mA.f[4] * mB.f[1] + mA.f[5]*mB.f[5] + mA.f[6]*mB.f[9]+mA.f[7]*mB.f[13];
-    mRet.f[6] = mA.f[4] * mB.f[2] + mA.f[5]*mB.f[6] + mA.f[6]*mB.f[10]+mA.f[7]*mB.f[14];
-    mRet.f[7] = mA.f[4] * mB.f[3] + mA.f[5]*mB.f[7] + mA.f[6]*mB.f[11]+mA.f[7]*mB.f[15];
-
-    mRet.f[8] = mA.f[8] * mB.f[0] + mA.f[9]*mB.f[4] + mA.f[10]*mB.f[8]+mA.f[11]*mB.f[12];
-    mRet.f[9] = mA.f[8] * mB.f[1] + mA.f[9]*mB.f[5] + mA.f[10]*mB.f[9]+mA.f[11]*mB.f[13];
-    mRet.f[10] = mA.f[8] * mB.f[2] + mA.f[9]*mB.f[6] + mA.f[10]*mB.f[10]+mA.f[11]*mB.f[14];
-    mRet.f[11] = mA.f[8] * mB.f[3] + mA.f[9]*mB.f[7] + mA.f[10]*mB.f[11]+mA.f[11]*mB.f[15];
-
-    mRet.f[12] = mA.f[12] * mB.f[0] + mA.f[13]*mB.f[4] + mA.f[14]*mB.f[8]+mA.f[15]*mB.f[12];
-    mRet.f[13] = mA.f[12] * mB.f[1] + mA.f[13]*mB.f[5] + mA.f[14]*mB.f[9]+mA.f[15]*mB.f[13];
-    mRet.f[14] = mA.f[12] * mB.f[2] + mA.f[13]*mB.f[6] + mA.f[14]*mB.f[10]+mA.f[15]*mB.f[14];
-    mRet.f[15] = mA.f[12] * mB.f[3] + mA.f[13]*mB.f[7] + mA.f[14]*mB.f[11]+mA.f[15]*mB.f[15];
-
-    mOut = mRet;
-}
-
-void IlmMatrixTranslation(IlmMatrix &mOut, const float X, const float Y, const float Z)
-{
-    mOut.f[ 0]=1.0f;    mOut.f[ 4]=0.0f;    mOut.f[ 8]=0.0f;    mOut.f[12]=X;
-    mOut.f[ 1]=0.0f;    mOut.f[ 5]=1.0f;    mOut.f[ 9]=0.0f;    mOut.f[13]=Y;
-    mOut.f[ 2]=0.0f;    mOut.f[ 6]=0.0f;    mOut.f[10]=1.0f;    mOut.f[14]=Z;
-    mOut.f[ 3]=0.0f;    mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
-}
-
-void IlmMatrixScaling(IlmMatrix &mOut, const float X, const float Y, const float Z)
-{
-    mOut.f[ 0]=X;        mOut.f[ 4]=0.0f;    mOut.f[ 8]=0.0f;    mOut.f[12]=0.0f;
-    mOut.f[ 1]=0.0f;    mOut.f[ 5]=Y;        mOut.f[ 9]=0.0f;    mOut.f[13]=0.0f;
-    mOut.f[ 2]=0.0f;    mOut.f[ 6]=0.0f;    mOut.f[10]=Z;        mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;    mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
-}
-
-void IlmMatrixRotateX(IlmMatrix &mOut, const float angle)
-{
-    // Precompute cos and sin
-    float fCosine = (float)cos(degToRad(angle));
-    float fSine = (float)sin(degToRad(angle));
-
-    // Create the trigonometric matrix corresponding to X Rotation
-    mOut.f[ 0]=1.0f;    mOut.f[ 4]=0.0f;    mOut.f[ 8]=0.0f;    mOut.f[12]=0.0f;
-    mOut.f[ 1]=0.0f;    mOut.f[ 5]=fCosine;    mOut.f[ 9]=fSine;    mOut.f[13]=0.0f;
-    mOut.f[ 2]=0.0f;    mOut.f[ 6]=-fSine;    mOut.f[10]=fCosine;    mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;    mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
-
-}
-
-void IlmMatrixRotateY(IlmMatrix &mOut, const float angle)
-{
-    // Precompute cos and sin
-    float fCosine = (float)cos(degToRad(angle));
-    float fSine = (float)sin(degToRad(angle));
-
-    // Create the trigonometric matrix corresponding to Y Rotation
-    mOut.f[ 0]=fCosine;        mOut.f[ 4]=0.0f;    mOut.f[ 8]=-fSine;        mOut.f[12]=0.0f;
-    mOut.f[ 1]=0.0f;        mOut.f[ 5]=1.0f;    mOut.f[ 9]=0.0f;        mOut.f[13]=0.0f;
-    mOut.f[ 2]=fSine;        mOut.f[ 6]=0.0f;    mOut.f[10]=fCosine;        mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;        mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;        mOut.f[15]=1.0f;
-
-}
-void IlmMatrixRotateZ(IlmMatrix &mOut, const float angle)
-{
-    // Precompute cos and sin
-    float fCosine = (float)cos(degToRad(angle));
-    float fSine = (float)sin(degToRad(angle));
-
-    // Create the trigonometric matrix corresponding to Z Rotation
-    mOut.f[ 0]=fCosine;        mOut.f[ 4]=fSine;    mOut.f[ 8]=0.0f;    mOut.f[12]=0.0f;
-    mOut.f[ 1]=-fSine;        mOut.f[ 5]=fCosine;    mOut.f[ 9]=0.0f;    mOut.f[13]=0.0f;
-    mOut.f[ 2]=0.0f;        mOut.f[ 6]=0.0f;    mOut.f[10]=1.0f;    mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;        mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
-
-}
-
-void IlmMatrixProjection(IlmMatrix &mOut, const float fov, const float near, const float far, const float aspect)
-{
-       float range = near * tan(degToRad(fov) / 2.0);
-       float left = -range * aspect;
-       float right = range * aspect;
-       float bottom = -range;
-       float top = range;
-
-       // First Column
-       mOut.f[0] = 2 * near / (right - left);
-       mOut.f[1] = 0.0;
-       mOut.f[2] = 0.0;
-       mOut.f[3] = 0.0;
-
-       // Second Column
-       mOut.f[4] = 0.0;
-       mOut.f[5] = 2 * near / (top - bottom);
-       mOut.f[6] = 0.0;
-       mOut.f[7] = 0.0;
-
-       // Third Column
-       mOut.f[8] = 0.0;
-       mOut.f[9] = 0.0;
-       mOut.f[10] = -(far + near) / (far - near);
-       mOut.f[11] = -1;
-
-       // Fourth Column
-       mOut.f[12] = 0.0;
-       mOut.f[13] = 0.0;
-       mOut.f[14] = -(2 * far * near) / (far - near);
-       mOut.f[15] = 0.0;
-}
index ebf535d..11f93a1 100644 (file)
@@ -101,4 +101,7 @@ void IlmMatrixRotateY(IlmMatrix &mOut, const float angle);
 
 void IlmMatrixRotateZ(IlmMatrix &mOut, const float angle);
 
+void IlmMatrixProjection(IlmMatrix &mOut, const float fov, const float near, const float far, const float aspectRatio);
+
+
 #endif /* _ILMMATRIX_H*/
index 4ef935c..ad01d62 100644 (file)
 
 #define ILM_PI 3.14159265
 
-float degToRad(float deg)
-{
-    return deg * ILM_PI / 180.0f;
-}
-
-float radToDeg(float rad)
-{
-    return rad * 180.0f / ILM_PI;
-}
-
-static const IlmMatrix m_Identity =
-{
-    {
-        1.0f,0.0f,0.0f,0.0f,
-        0.0f,1.0f,0.0f,0.0f,
-        0.0f,0.0f,1.0f,0.0f,
-        0.0f,0.0f,0.0f,1.0f
-    }
-};
+#define degToRad(deg) ((deg) * ILM_PI / 180.0f)
+#define radToDeg(rad) ((rad) * 180.0f / ILM_PI)
 
 void IlmMatrixIdentity(IlmMatrix &mOut)
 {
-    mOut.f[0] = 1.0f;    mOut.f[4] = 0.0f;    mOut.f[8] = 0.0f;    mOut.f[12] = 0.0f;
-    mOut.f[1] = 0.0f;    mOut.f[5] = 1.0f;    mOut.f[9] = 0.0f;    mOut.f[13] = 0.0f;
+    mOut.f[0] = 1.0f;    mOut.f[4] = 0.0f;    mOut.f[8]  = 0.0f;    mOut.f[12] = 0.0f;
+    mOut.f[1] = 0.0f;    mOut.f[5] = 1.0f;    mOut.f[9]  = 0.0f;    mOut.f[13] = 0.0f;
     mOut.f[2] = 0.0f;    mOut.f[6] = 0.0f;    mOut.f[10] = 1.0f;    mOut.f[14] = 0.0f;
     mOut.f[3] = 0.0f;    mOut.f[7] = 0.0f;    mOut.f[11] = 0.0f;    mOut.f[15] = 1.0f;
 }
@@ -71,43 +54,43 @@ void IlmMatrixMultiply(IlmMatrix &mOut, const IlmMatrix &mA, const IlmMatrix &mB
 {
     IlmMatrix mRet;
 
-    mRet.f[0] = mA.f[0] * mB.f[0] + mA.f[1]*mB.f[4] + mA.f[2]*mB.f[8]+mA.f[3]*mB.f[12];
-    mRet.f[1] = mA.f[0] * mB.f[1] + mA.f[1]*mB.f[5] + mA.f[2]*mB.f[9]+mA.f[3]*mB.f[13];
-    mRet.f[2] = mA.f[0] * mB.f[2] + mA.f[1]*mB.f[6] + mA.f[2]*mB.f[10]+mA.f[3]*mB.f[14];
-    mRet.f[3] = mA.f[0] * mB.f[3] + mA.f[1]*mB.f[7] + mA.f[2]*mB.f[11]+mA.f[3]*mB.f[15];
+    mRet.f[0]  = mA.f[0] * mB.f[0] + mA.f[1] * mB.f[4] + mA.f[2] * mB.f[8] + mA.f[3] * mB.f[12];
+    mRet.f[1]  = mA.f[0] * mB.f[1] + mA.f[1] * mB.f[5] + mA.f[2] * mB.f[9] + mA.f[3] * mB.f[13];
+    mRet.f[2]  = mA.f[0] * mB.f[2] + mA.f[1] * mB.f[6] + mA.f[2] * mB.f[10] + mA.f[3] * mB.f[14];
+    mRet.f[3]  = mA.f[0] * mB.f[3] + mA.f[1] * mB.f[7] + mA.f[2] * mB.f[11] + mA.f[3] * mB.f[15];
 
-    mRet.f[4] = mA.f[4] * mB.f[0] + mA.f[5]*mB.f[4] + mA.f[6]*mB.f[8]+mA.f[7]*mB.f[12];
-    mRet.f[5] = mA.f[4] * mB.f[1] + mA.f[5]*mB.f[5] + mA.f[6]*mB.f[9]+mA.f[7]*mB.f[13];
-    mRet.f[6] = mA.f[4] * mB.f[2] + mA.f[5]*mB.f[6] + mA.f[6]*mB.f[10]+mA.f[7]*mB.f[14];
-    mRet.f[7] = mA.f[4] * mB.f[3] + mA.f[5]*mB.f[7] + mA.f[6]*mB.f[11]+mA.f[7]*mB.f[15];
+    mRet.f[4]  = mA.f[4] * mB.f[0] + mA.f[5] * mB.f[4] + mA.f[6] * mB.f[8] + mA.f[7] * mB.f[12];
+    mRet.f[5]  = mA.f[4] * mB.f[1] + mA.f[5] * mB.f[5] + mA.f[6] * mB.f[9] + mA.f[7] * mB.f[13];
+    mRet.f[6]  = mA.f[4] * mB.f[2] + mA.f[5] * mB.f[6] + mA.f[6] * mB.f[10] + mA.f[7] * mB.f[14];
+    mRet.f[7]  = mA.f[4] * mB.f[3] + mA.f[5] * mB.f[7] + mA.f[6] * mB.f[11] + mA.f[7] * mB.f[15];
 
-    mRet.f[8] = mA.f[8] * mB.f[0] + mA.f[9]*mB.f[4] + mA.f[10]*mB.f[8]+mA.f[11]*mB.f[12];
-    mRet.f[9] = mA.f[8] * mB.f[1] + mA.f[9]*mB.f[5] + mA.f[10]*mB.f[9]+mA.f[11]*mB.f[13];
-    mRet.f[10] = mA.f[8] * mB.f[2] + mA.f[9]*mB.f[6] + mA.f[10]*mB.f[10]+mA.f[11]*mB.f[14];
-    mRet.f[11] = mA.f[8] * mB.f[3] + mA.f[9]*mB.f[7] + mA.f[10]*mB.f[11]+mA.f[11]*mB.f[15];
+    mRet.f[8]  = mA.f[8] * mB.f[0] + mA.f[9] * mB.f[4] + mA.f[10] * mB.f[8] + mA.f[11] * mB.f[12];
+    mRet.f[9]  = mA.f[8] * mB.f[1] + mA.f[9] * mB.f[5] + mA.f[10] * mB.f[9] + mA.f[11] * mB.f[13];
+    mRet.f[10] = mA.f[8] * mB.f[2] + mA.f[9] * mB.f[6] + mA.f[10] * mB.f[10] + mA.f[11] * mB.f[14];
+    mRet.f[11] = mA.f[8] * mB.f[3] + mA.f[9] * mB.f[7] + mA.f[10] * mB.f[11] + mA.f[11] * mB.f[15];
 
-    mRet.f[12] = mA.f[12] * mB.f[0] + mA.f[13]*mB.f[4] + mA.f[14]*mB.f[8]+mA.f[15]*mB.f[12];
-    mRet.f[13] = mA.f[12] * mB.f[1] + mA.f[13]*mB.f[5] + mA.f[14]*mB.f[9]+mA.f[15]*mB.f[13];
-    mRet.f[14] = mA.f[12] * mB.f[2] + mA.f[13]*mB.f[6] + mA.f[14]*mB.f[10]+mA.f[15]*mB.f[14];
-    mRet.f[15] = mA.f[12] * mB.f[3] + mA.f[13]*mB.f[7] + mA.f[14]*mB.f[11]+mA.f[15]*mB.f[15];
+    mRet.f[12] = mA.f[12] * mB.f[0] + mA.f[13] * mB.f[4] + mA.f[14] * mB.f[8] + mA.f[15] * mB.f[12];
+    mRet.f[13] = mA.f[12] * mB.f[1] + mA.f[13] * mB.f[5] + mA.f[14] * mB.f[9] + mA.f[15] * mB.f[13];
+    mRet.f[14] = mA.f[12] * mB.f[2] + mA.f[13] * mB.f[6] + mA.f[14] * mB.f[10] + mA.f[15] * mB.f[14];
+    mRet.f[15] = mA.f[12] * mB.f[3] + mA.f[13] * mB.f[7] + mA.f[14] * mB.f[11] + mA.f[15] * mB.f[15];
 
     mOut = mRet;
 }
 
 void IlmMatrixTranslation(IlmMatrix &mOut, const float X, const float Y, const float Z)
 {
-    mOut.f[ 0]=1.0f;    mOut.f[ 4]=0.0f;    mOut.f[ 8]=0.0f;    mOut.f[12]=X;
-    mOut.f[ 1]=0.0f;    mOut.f[ 5]=1.0f;    mOut.f[ 9]=0.0f;    mOut.f[13]=Y;
-    mOut.f[ 2]=0.0f;    mOut.f[ 6]=0.0f;    mOut.f[10]=1.0f;    mOut.f[14]=Z;
-    mOut.f[ 3]=0.0f;    mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
+    mOut.f[0] = 1.0f;    mOut.f[4] = 0.0f;    mOut.f[8]  = 0.0f;    mOut.f[12] = X;
+    mOut.f[1] = 0.0f;    mOut.f[5] = 1.0f;    mOut.f[9]  = 0.0f;    mOut.f[13] = Y;
+    mOut.f[2] = 0.0f;    mOut.f[6] = 0.0f;    mOut.f[10] = 1.0f;    mOut.f[14] = Z;
+    mOut.f[3] = 0.0f;    mOut.f[7] = 0.0f;    mOut.f[11] = 0.0f;    mOut.f[15] = 1.0f;
 }
 
 void IlmMatrixScaling(IlmMatrix &mOut, const float X, const float Y, const float Z)
 {
-    mOut.f[ 0]=X;        mOut.f[ 4]=0.0f;    mOut.f[ 8]=0.0f;    mOut.f[12]=0.0f;
-    mOut.f[ 1]=0.0f;    mOut.f[ 5]=Y;        mOut.f[ 9]=0.0f;    mOut.f[13]=0.0f;
-    mOut.f[ 2]=0.0f;    mOut.f[ 6]=0.0f;    mOut.f[10]=Z;        mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;    mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
+    mOut.f[0] = X;       mOut.f[4] = 0.0f;    mOut.f[8]  = 0.0f;    mOut.f[12] = 0.0f;
+    mOut.f[1] = 0.0f;    mOut.f[5] = Y;       mOut.f[9]  = 0.0f;    mOut.f[13] = 0.0f;
+    mOut.f[2] = 0.0f;    mOut.f[6] = 0.0f;    mOut.f[10] = Z;       mOut.f[14] = 0.0f;
+    mOut.f[3] = 0.0f;    mOut.f[7] = 0.0f;    mOut.f[11] = 0.0f;    mOut.f[15] = 1.0f;
 }
 
 void IlmMatrixRotateX(IlmMatrix &mOut, const float angle)
@@ -117,11 +100,10 @@ void IlmMatrixRotateX(IlmMatrix &mOut, const float angle)
     float fSine = (float)sin(degToRad(angle));
 
     // Create the trigonometric matrix corresponding to X Rotation
-    mOut.f[ 0]=1.0f;    mOut.f[ 4]=0.0f;    mOut.f[ 8]=0.0f;    mOut.f[12]=0.0f;
-    mOut.f[ 1]=0.0f;    mOut.f[ 5]=fCosine;    mOut.f[ 9]=fSine;    mOut.f[13]=0.0f;
-    mOut.f[ 2]=0.0f;    mOut.f[ 6]=-fSine;    mOut.f[10]=fCosine;    mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;    mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
-
+    mOut.f[0] = 1.0f;    mOut.f[4] = 0.0f;      mOut.f[8]  = 0.0f;      mOut.f[12] = 0.0f;
+    mOut.f[1] = 0.0f;    mOut.f[5] = fCosine;   mOut.f[9]  = fSine;     mOut.f[13] = 0.0f;
+    mOut.f[2] = 0.0f;    mOut.f[6] = -fSine;    mOut.f[10] = fCosine;   mOut.f[14] = 0.0f;
+    mOut.f[3] = 0.0f;    mOut.f[7] = 0.0f;      mOut.f[11] = 0.0f;      mOut.f[15] = 1.0f;
 }
 
 void IlmMatrixRotateY(IlmMatrix &mOut, const float angle)
@@ -131,12 +113,12 @@ void IlmMatrixRotateY(IlmMatrix &mOut, const float angle)
     float fSine = (float)sin(degToRad(angle));
 
     // Create the trigonometric matrix corresponding to Y Rotation
-    mOut.f[ 0]=fCosine;        mOut.f[ 4]=0.0f;    mOut.f[ 8]=-fSine;        mOut.f[12]=0.0f;
-    mOut.f[ 1]=0.0f;        mOut.f[ 5]=1.0f;    mOut.f[ 9]=0.0f;        mOut.f[13]=0.0f;
-    mOut.f[ 2]=fSine;        mOut.f[ 6]=0.0f;    mOut.f[10]=fCosine;        mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;        mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;        mOut.f[15]=1.0f;
-
+    mOut.f[0] = fCosine;   mOut.f[4] = 0.0f;    mOut.f[8]  = -fSine;    mOut.f[12] = 0.0f;
+    mOut.f[1] = 0.0f;      mOut.f[5] = 1.0f;    mOut.f[9]  = 0.0f;      mOut.f[13] = 0.0f;
+    mOut.f[2] = fSine;     mOut.f[6] = 0.0f;    mOut.f[10] = fCosine;   mOut.f[14] = 0.0f;
+    mOut.f[3] = 0.0f;      mOut.f[7] = 0.0f;    mOut.f[11] = 0.0f;      mOut.f[15] = 1.0f;
 }
+
 void IlmMatrixRotateZ(IlmMatrix &mOut, const float angle)
 {
     // Precompute cos and sin
@@ -144,9 +126,42 @@ void IlmMatrixRotateZ(IlmMatrix &mOut, const float angle)
     float fSine = (float)sin(degToRad(angle));
 
     // Create the trigonometric matrix corresponding to Z Rotation
-    mOut.f[ 0]=fCosine;        mOut.f[ 4]=fSine;    mOut.f[ 8]=0.0f;    mOut.f[12]=0.0f;
-    mOut.f[ 1]=-fSine;        mOut.f[ 5]=fCosine;    mOut.f[ 9]=0.0f;    mOut.f[13]=0.0f;
-    mOut.f[ 2]=0.0f;        mOut.f[ 6]=0.0f;    mOut.f[10]=1.0f;    mOut.f[14]=0.0f;
-    mOut.f[ 3]=0.0f;        mOut.f[ 7]=0.0f;    mOut.f[11]=0.0f;    mOut.f[15]=1.0f;
+    mOut.f[0] = fCosine;   mOut.f[4] = fSine;    mOut.f[8]  = 0.0f;    mOut.f[12] = 0.0f;
+    mOut.f[1] = -fSine;    mOut.f[5] = fCosine;  mOut.f[9]  = 0.0f;    mOut.f[13] = 0.0f;
+    mOut.f[2] = 0.0f;      mOut.f[6] = 0.0f;     mOut.f[10] = 1.0f;    mOut.f[14] = 0.0f;
+    mOut.f[3] = 0.0f;      mOut.f[7] = 0.0f;     mOut.f[11] = 0.0f;    mOut.f[15] = 1.0f;
+}
 
+void IlmMatrixProjection(IlmMatrix &mOut, const float fov, const float near, const float far, const float aspect)
+{
+       // Precompute borders for projection
+       float range = near * tan(degToRad(fov) / 2.0);
+       float left = -range * aspect;
+       float right = range * aspect;
+       float bottom = -range;
+       float top = range;
+
+       // Column 1
+       mOut.f[0] = 2 * near / (right - left);
+       mOut.f[1] = 0.0;
+       mOut.f[2] = 0.0;
+       mOut.f[3] = 0.0;
+
+       // Column 2
+       mOut.f[4] = 0.0;
+       mOut.f[5] = 2 * near / (top - bottom);
+       mOut.f[6] = 0.0;
+       mOut.f[7] = 0.0;
+
+       // Column 3
+       mOut.f[8] = 0.0;
+       mOut.f[9] = 0.0;
+       mOut.f[10] = -(far + near) / (far - near);
+       mOut.f[11] = -1;
+
+       // Column 4
+       mOut.f[12] = 0.0;
+       mOut.f[13] = 0.0;
+       mOut.f[14] = -(2 * far * near) / (far - near);
+       mOut.f[15] = 0.0;
 }