diff options
author | Emre Ucan <eucan@de.adit-jv.com> | 2016-04-18 13:17:10 +0200 |
---|---|---|
committer | Eugen Friedrich <efriedrich@de.adit-jv.com> | 2016-04-19 16:09:58 +0200 |
commit | 46590fd88f1e419622b88ddf6a1f5bde80841f75 (patch) | |
tree | f6e80bf9a678809067386bf45976e9bf796de6a4 | |
parent | 44598504503eea5ac7f94c88477a5a78bda01f30 (diff) | |
download | wayland-ivi-extension-46590fd88f1e419622b88ddf6a1f5bde80841f75.tar.gz |
EGLWLMockNavigation: remove IlmMatrix dependency
IlmMatrix dependency is removed, because it has a different
license than the license of wayland-ivi-extension (i.e Apache 2.0).
This license problem is reported by Jeremiah C. Foster.
He also raised the ticket "BUG 432" in http://bugs.genivi.org/
I replaced the IlmMatrix implementation with my own implementation
to fix the issue.
Signed-off-by: Emre Ucan <eucan@de.adit-jv.com>
13 files changed, 134 insertions, 45 deletions
diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/CMakeLists.txt b/ivi-layermanagement-examples/EGLWLMockNavigation/CMakeLists.txt index d319ee9..cf61ef0 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/CMakeLists.txt +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/CMakeLists.txt @@ -72,7 +72,6 @@ set (SRC_FILES src/ShaderBase.cpp src/ShaderLighting.cpp src/main.cpp - src/IlmMatrix.cpp ) add_executable(${PROJECT_NAME} diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/include/Camera.h b/ivi-layermanagement-examples/EGLWLMockNavigation/include/Camera.h index c0e3cbd..f3ae70b 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/include/Camera.h +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/include/Camera.h @@ -20,7 +20,6 @@ #define _CAMERA_H #include "IUpdateable.h" -#include "IlmMatrix.h" #include "vec.h" class Camera : public IUpdateable @@ -29,17 +28,27 @@ public: Camera(vec3f position, vec3f target, float viewportWidth, float viewportHeight); virtual ~Camera(); - IlmMatrix* getViewProjectionMatrix(); + float* getViewProjectionMatrix(); void update(int currentTimeInMs, int lastFrameTime); private: vec3f m_position; vec3f m_target; - IlmMatrix m_viewProjectionMatrix; - IlmMatrix m_translationMatrix; - IlmMatrix m_rotationMatrix; - IlmMatrix m_projectionMatrix; - IlmMatrix m_identityMatrix; + float m_viewProjectionMatrix[16]; + float m_translationMatrix[16]; + float m_projectionMatrix[16]; + float m_identityMatrix[16]; + + //Parameters for projection matrix calculation + float m_fov; // field of view + float m_near; + float m_far; + float m_aspectRatio; + + void calculateTranslationMatrix(); + void calculateProjectionMatrix(); + void calculateViewProjectionMatrix(); + }; #endif /* _CAMERA_H */ diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/include/Ground.h b/ivi-layermanagement-examples/EGLWLMockNavigation/include/Ground.h index d366cd8..aa52b14 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/include/Ground.h +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/include/Ground.h @@ -22,7 +22,6 @@ #include "IRenderable.h" #include "vec.h" -class IlmMatrix; class ShaderBase; class Ground : public IRenderable diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/include/House.h b/ivi-layermanagement-examples/EGLWLMockNavigation/include/House.h index 3604022..fa46b7b 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/include/House.h +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/include/House.h @@ -21,7 +21,6 @@ #include "IRenderable.h" #include "IUpdateable.h" -#include "IlmMatrix.h" #include "vec.h" class ShaderBase; diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderBase.h b/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderBase.h index cc4878b..2115537 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderBase.h +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderBase.h @@ -24,12 +24,10 @@ #include <string> using std::string; -class IlmMatrix; - class ShaderBase { public: - ShaderBase(string vertexCode, string fragmentCode, IlmMatrix* projectionMatrix); + ShaderBase(string vertexCode, string fragmentCode, float* projectionMatrix); virtual ~ShaderBase(); virtual void use(vec3f* position, vec4f* color); @@ -48,7 +46,7 @@ private: private: string m_vertexCode; string m_fragmentCode; - IlmMatrix* m_projectionMatrix; + float* m_projectionMatrix; }; #endif // __SHADERBASE_H__ diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderLighting.h b/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderLighting.h index 1f74273..f47c36d 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderLighting.h +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/include/ShaderLighting.h @@ -23,7 +23,7 @@ class ShaderLighting: public ShaderBase { public: - ShaderLighting(IlmMatrix* projectionMatrix); + ShaderLighting(float* projectionMatrix); virtual ~ShaderLighting(); virtual void use(vec3f* position, vec4f* color); diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/Camera.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/Camera.cpp index b71cd87..72988fa 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/Camera.cpp +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/Camera.cpp @@ -28,35 +28,107 @@ Camera::Camera(vec3f position, vec3f target, float viewportWidth, float viewport : m_position(position) , m_target(target) { - IlmMatrixIdentity(m_identityMatrix); - IlmMatrixTranslation(m_translationMatrix, m_position.x, m_position.y, m_position.z); - IlmMatrixRotateX(m_rotationMatrix, 45.0); - IlmMatrixProjection(m_projectionMatrix, - 45.0, // field of view - 0.1f, // near - 1000.0f, // far - viewportWidth/viewportHeight); // aspect ratio - m_viewProjectionMatrix = m_identityMatrix; + calculateTranslationMatrix(); + + m_fov = M_PI / 4; // 45° + m_near = 0.1f; + m_far = 1000.0f; + m_aspectRatio = viewportWidth/viewportHeight; + calculateProjectionMatrix(); + calculateViewProjectionMatrix(); } Camera::~Camera() { } -IlmMatrix* Camera::getViewProjectionMatrix() +void Camera::calculateProjectionMatrix() +{ + // Precompute borders for projection + float range = m_near * tan(m_fov / 2.0); + float right = range * m_aspectRatio; + float top = range; + + // Column 1 + m_projectionMatrix[0] = m_near / right; + m_projectionMatrix[1] = 0.0; + m_projectionMatrix[2] = 0.0; + m_projectionMatrix[3] = 0.0; + + // Column 2 + m_projectionMatrix[4] = 0.0; + m_projectionMatrix[5] = m_near / top; + m_projectionMatrix[6] = 0.0; + m_projectionMatrix[7] = 0.0; + + // Column 3 + m_projectionMatrix[8] = 0.0; + m_projectionMatrix[9] = 0.0; + m_projectionMatrix[10] = -(m_far + m_near) / (m_far - m_near); + m_projectionMatrix[11] = -1; + + // Column 4 + m_projectionMatrix[12] = 0.0; + m_projectionMatrix[13] = 0.0; + m_projectionMatrix[14] = -(2 * m_far * m_near) / (m_far - m_near); + m_projectionMatrix[15] = 0.0; +} + +void Camera::calculateTranslationMatrix() { - return &m_viewProjectionMatrix; + m_translationMatrix[0] = 1.0f; + m_translationMatrix[1] = 0.0f; + m_translationMatrix[2] = 0.0f; + m_translationMatrix[3] = 0.0f; + + m_translationMatrix[4] = 0.0f; + m_translationMatrix[5] = 1.0f; + m_translationMatrix[6] = 0.0f; + m_translationMatrix[7] = 0.0f; + + m_translationMatrix[8] = 0.0f; + m_translationMatrix[9] = 0.0f; + m_translationMatrix[10] = 1.0f; + m_translationMatrix[11] = 0.0f; + + m_translationMatrix[12] = m_position.x; + m_translationMatrix[13] = m_position.y; + m_translationMatrix[14] = m_position.z; + m_translationMatrix[15] = 1.0f; +} + +void Camera::calculateViewProjectionMatrix() +{ + + m_viewProjectionMatrix[0] = m_translationMatrix[0] * m_projectionMatrix[0]; + m_viewProjectionMatrix[1] = 0.0f; + m_viewProjectionMatrix[2] = 0.0f; + m_viewProjectionMatrix[3] = 0.0f; + + m_viewProjectionMatrix[4] = 0.0f; + m_viewProjectionMatrix[5] = m_translationMatrix[5] * m_projectionMatrix[5]; + m_viewProjectionMatrix[6] = 0.0f; + m_viewProjectionMatrix[7] = 0.0f; + + m_viewProjectionMatrix[8] = 0.0f; + m_viewProjectionMatrix[9] = 0.0f; + m_viewProjectionMatrix[10] = m_translationMatrix[10] * m_projectionMatrix[10]; + m_viewProjectionMatrix[11] = m_translationMatrix[10] * m_projectionMatrix[11]; + + m_viewProjectionMatrix[12] = m_translationMatrix[12] * m_projectionMatrix[0]; + m_viewProjectionMatrix[13] = m_translationMatrix[13] * m_projectionMatrix[5]; + m_viewProjectionMatrix[14] = m_translationMatrix[14] * m_projectionMatrix[10] + + m_translationMatrix[15] * m_projectionMatrix[14]; + m_viewProjectionMatrix[15] = m_translationMatrix[14] * m_projectionMatrix[11]; +} + +float* Camera::getViewProjectionMatrix() +{ + return m_viewProjectionMatrix; } void Camera::update(int currentTimeInMs, int lastFrameTime) { (void)currentTimeInMs; // prevent warning (void)lastFrameTime; // prevent warning - - IlmMatrixTranslation(m_translationMatrix, m_position.x, m_position.y, m_position.z); - - m_viewProjectionMatrix = m_identityMatrix; - //IlmMatrixMultiply(m_viewProjectionMatrix, m_viewProjectionMatrix, m_rotationMatrix); - IlmMatrixMultiply(m_viewProjectionMatrix, m_viewProjectionMatrix, m_translationMatrix); - IlmMatrixMultiply(m_viewProjectionMatrix, m_viewProjectionMatrix, m_projectionMatrix); } diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/Ground.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/Ground.cpp index 5024d0d..77316dc 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/Ground.cpp +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/Ground.cpp @@ -18,7 +18,6 @@ * ****************************************************************************/ #include "Ground.h" -#include "IlmMatrix.h" #include "ShaderLighting.h" #include <string.h> diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/House.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/House.cpp index 91dbba2..fe11396 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/House.cpp +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/House.cpp @@ -18,7 +18,6 @@ * ****************************************************************************/ #include "House.h" -#include "IlmMatrix.h" #include "ShaderLighting.h" #include <string.h> diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/MockNavi.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/MockNavi.cpp index 8bdf937..a6338e6 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/MockNavi.cpp +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/MockNavi.cpp @@ -66,7 +66,7 @@ void MockNavi::render() void MockNavi::generateCity() { - IlmMatrix* projection = m_camera.getViewProjectionMatrix(); + float* projection = m_camera.getViewProjectionMatrix(); ShaderLighting* pShader = new ShaderLighting(projection); // generate base plate diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderBase.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderBase.cpp index 02f40fc..7bcfcbb 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderBase.cpp +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderBase.cpp @@ -17,14 +17,13 @@ * ****************************************************************************/ #include "ShaderBase.h" -#include "IlmMatrix.h" #include <ilm_client.h> #include <GLES2/gl2.h> #include <stdlib.h> #include <iostream> using std::cout; -ShaderBase::ShaderBase(string vertexCode, string fragmentCode, IlmMatrix* projectionMatrix) +ShaderBase::ShaderBase(string vertexCode, string fragmentCode, float* projectionMatrix) : m_vertexCode() , m_fragmentCode(fragmentCode) , m_projectionMatrix(projectionMatrix) @@ -171,5 +170,5 @@ void ShaderBase::use(vec3f* position, vec4f* color) (void)color; // prevent warning glUseProgram(shaderProgramId); - glUniformMatrix4fv(m_uniformProjectionMatrix, 1, GL_FALSE, m_projectionMatrix->f); + glUniformMatrix4fv(m_uniformProjectionMatrix, 1, GL_FALSE, m_projectionMatrix); } diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderLighting.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderLighting.cpp index 94e49a8..d87c0e7 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderLighting.cpp +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/ShaderLighting.cpp @@ -17,7 +17,6 @@ * ****************************************************************************/ #include "ShaderLighting.h" -#include "IlmMatrix.h" const char* vertexShaderCode = "attribute mediump vec4 a_vertex; \ @@ -40,7 +39,7 @@ const char* fragmentShaderCode = gl_FragColor.a = 1.0; \ }"; -ShaderLighting::ShaderLighting(IlmMatrix* projectionMatrix) +ShaderLighting::ShaderLighting(float* projectionMatrix) : ShaderBase(vertexShaderCode, fragmentShaderCode, projectionMatrix) { glUseProgram(shaderProgramId); @@ -56,11 +55,29 @@ void ShaderLighting::use(vec3f* position, vec4f* color) { ShaderBase::use(position, color); - IlmMatrix translation; - IlmMatrixTranslation(translation, position->x, position->y, position->z); + float translation[16]; + translation[0] = 1.0f; + translation[1] = 0.0f; + translation[2] = 0.0f; + translation[3] = 0.0f; + + translation[4] = 0.0f; + translation[5] = 1.0f; + translation[6] = 0.0f; + translation[7] = 0.0f; + + translation[8] = 0.0f; + translation[9] = 0.0f; + translation[10] = 1.0f; + translation[11] = 0.0f; + + translation[12] = position->x; + translation[13] = position->y; + translation[14] = position->z; + translation[15] = 1.0f; glUseProgram(shaderProgramId); - glUniformMatrix4fv(m_uniformModelMatrix, 1, GL_FALSE, translation.f); + glUniformMatrix4fv(m_uniformModelMatrix, 1, GL_FALSE, translation); glUniform4fv(m_uniformColor, 1, &color->r); } diff --git a/ivi-layermanagement-examples/EGLWLMockNavigation/src/Street.cpp b/ivi-layermanagement-examples/EGLWLMockNavigation/src/Street.cpp index 8373a93..6ee6e1d 100644 --- a/ivi-layermanagement-examples/EGLWLMockNavigation/src/Street.cpp +++ b/ivi-layermanagement-examples/EGLWLMockNavigation/src/Street.cpp @@ -18,7 +18,6 @@ * ****************************************************************************/ #include "Street.h" -#include "IlmMatrix.h" #include "ShaderBase.h" #include <string.h> |