summaryrefslogtreecommitdiffstats
path: root/src/graphics/opengl
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/opengl')
-rw-r--r--src/graphics/opengl/gldevice.cpp558
-rw-r--r--src/graphics/opengl/gldevice.h57
-rw-r--r--src/graphics/opengl/test/CMakeLists.txt90
-rw-r--r--src/graphics/opengl/test/README.txt9
-rw-r--r--src/graphics/opengl/test/light_test.cpp437
-rw-r--r--src/graphics/opengl/test/model_test.cpp377
-rw-r--r--src/graphics/opengl/test/tex1.pngbin151263 -> 0 bytes
-rw-r--r--src/graphics/opengl/test/tex2.pngbin57503 -> 0 bytes
-rw-r--r--src/graphics/opengl/test/texture_test.cpp193
-rw-r--r--src/graphics/opengl/test/transform_test.cpp339
10 files changed, 508 insertions, 1552 deletions
diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp
index 94b0dbc..df64e34 100644
--- a/src/graphics/opengl/gldevice.cpp
+++ b/src/graphics/opengl/gldevice.cpp
@@ -24,23 +24,10 @@
#include "math/geometry.h"
-#if defined(USE_GLEW)
-
-// When using GLEW, only glew.h is needed
+// Using GLEW so only glew.h is needed
#include <GL/glew.h>
-#else
-
-// Should define prototypes of used extensions as OpenGL functions
-#define GL_GLEXT_PROTOTYPES
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glext.h>
-
-#endif // if defined(GLEW)
-
-#include <SDL/SDL.h>
+#include <SDL.h>
#include <cassert>
@@ -64,6 +51,8 @@ void GLDeviceConfig::LoadDefault()
greenSize = 8;
alphaSize = 8;
depthSize = 24;
+
+ vboMode = VBO_MODE_AUTO;
}
@@ -73,6 +62,9 @@ CGLDevice::CGLDevice(const GLDeviceConfig &config)
{
m_config = config;
m_lighting = false;
+ m_lastVboId = 0;
+ m_multitextureAvailable = false;
+ m_vboAvailable = false;
}
@@ -91,29 +83,45 @@ bool CGLDevice::Create()
{
GetLogger()->Info("Creating CDevice\n");
-#if defined(USE_GLEW)
static bool glewInited = false;
if (!glewInited)
{
glewInited = true;
+ glewExperimental = GL_TRUE;
+
if (glewInit() != GLEW_OK)
{
GetLogger()->Error("GLEW initialization failed\n");
return false;
}
- if ( (! GLEW_ARB_multitexture) || (! GLEW_EXT_texture_env_combine) )
+ m_multitextureAvailable = glewIsSupported("GL_ARB_multitexture GL_ARB_texture_env_combine");
+ if (!m_multitextureAvailable)
+ GetLogger()->Warn("GLEW reports multitexturing not supported - graphics quality will be degraded!\n");
+
+ if (m_config.vboMode == VBO_MODE_ENABLE)
{
- GetLogger()->Error("GLEW reports required extensions not supported\n");
- return false;
+ GetLogger()->Info("VBO enabled by override - using VBOs\n");
+ m_vboAvailable = true;
}
- }
-#endif
+ else if (m_config.vboMode == VBO_MODE_DISABLE)
+ {
+ GetLogger()->Info("VBO disabled by override - using display lists\n");
+ m_vboAvailable = false;
+ }
+ else
+ {
+ GetLogger()->Info("Auto-detecting VBO support\n");
+ m_vboAvailable = glewIsSupported("GL_ARB_vertex_buffer_object");
- /* NOTE: when not using GLEW, extension testing is not performed, as it is assumed that
- glext.h is up-to-date and the OpenGL shared library has the required functions present. */
+ if (m_vboAvailable)
+ GetLogger()->Info("Detected ARB_vertex_buffer_object extension - using VBOs\n");
+ else
+ GetLogger()->Info("No ARB_vertex_buffer_object extension present - using display lists\n");
+ }
+ }
// This is mostly done in all modern hardware by default
// DirectX doesn't even allow the option to turn off perspective correction anymore
@@ -123,6 +131,9 @@ bool CGLDevice::Create()
// To avoid problems with scaling & lighting
glEnable(GL_RESCALE_NORMAL);
+ // Minimal depth bias to avoid Z-fighting
+ SetDepthBias(0.001f);
+
// Set just to be sure
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
@@ -174,6 +185,16 @@ void CGLDevice::ConfigChanged(const GLDeviceConfig& newConfig)
Create();
}
+void CGLDevice::SetUseVbo(bool vboAvailable)
+{
+ m_vboAvailable = vboAvailable;
+}
+
+bool CGLDevice::GetUseVbo()
+{
+ return m_vboAvailable;
+}
+
void CGLDevice::BeginScene()
{
Clear();
@@ -413,7 +434,9 @@ Texture CGLDevice::CreateTexture(ImageData *data, const TextureCreateParams &par
result.size.y = data->surface->h;
// Use & enable 1st texture stage
- glActiveTexture(GL_TEXTURE0);
+ if (m_multitextureAvailable)
+ glActiveTexture(GL_TEXTURE0);
+
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &result.id);
@@ -588,7 +611,7 @@ void CGLDevice::DestroyAllTextures()
m_allTextures.clear();
}
-int CGLDevice::GetMaxTextureCount()
+int CGLDevice::GetMaxTextureStageCount()
{
return m_currentTextures.size();
}
@@ -599,17 +622,21 @@ int CGLDevice::GetMaxTextureCount()
The setting is remembered, even if texturing is disabled at the moment. */
void CGLDevice::SetTexture(int index, const Texture &texture)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
bool same = m_currentTextures[index].id == texture.id;
m_currentTextures[index] = texture; // remember the new value
+ if (!m_multitextureAvailable && index != 0)
+ return;
+
if (same)
return; // nothing to do
- glActiveTexture(GL_TEXTURE0 + index);
+ if (m_multitextureAvailable)
+ glActiveTexture(GL_TEXTURE0 + index);
+
glBindTexture(GL_TEXTURE_2D, texture.id);
// Params need to be updated for the new bound texture
@@ -618,15 +645,19 @@ void CGLDevice::SetTexture(int index, const Texture &texture)
void CGLDevice::SetTexture(int index, unsigned int textureId)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
if (m_currentTextures[index].id == textureId)
return; // nothing to do
m_currentTextures[index].id = textureId;
- glActiveTexture(GL_TEXTURE0 + index);
+ if (!m_multitextureAvailable && index != 0)
+ return;
+
+ if (m_multitextureAvailable)
+ glActiveTexture(GL_TEXTURE0 + index);
+
glBindTexture(GL_TEXTURE_2D, textureId);
// Params need to be updated for the new bound texture
@@ -637,16 +668,14 @@ void CGLDevice::SetTexture(int index, unsigned int textureId)
Returns the previously assigned texture or invalid texture if the given stage is not enabled. */
Texture CGLDevice::GetTexture(int index)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
return m_currentTextures[index];
}
void CGLDevice::SetTextureEnabled(int index, bool enabled)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
bool same = m_texturesEnabled[index] == enabled;
@@ -655,7 +684,12 @@ void CGLDevice::SetTextureEnabled(int index, bool enabled)
if (same)
return; // nothing to do
- glActiveTexture(GL_TEXTURE0 + index);
+ if (!m_multitextureAvailable && index != 0)
+ return;
+
+ if (m_multitextureAvailable)
+ glActiveTexture(GL_TEXTURE0 + index);
+
if (enabled)
glEnable(GL_TEXTURE_2D);
else
@@ -664,8 +698,7 @@ void CGLDevice::SetTextureEnabled(int index, bool enabled)
bool CGLDevice::GetTextureEnabled(int index)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
return m_texturesEnabled[index];
}
@@ -676,17 +709,36 @@ bool CGLDevice::GetTextureEnabled(int index)
The settings are remembered, even if texturing is disabled at the moment. */
void CGLDevice::SetTextureStageParams(int index, const TextureStageParams &params)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
// Remember the settings
m_textureStageParams[index] = params;
+ if (!m_multitextureAvailable && index != 0)
+ return;
+
// Don't actually do anything if texture not set
if (! m_currentTextures[index].Valid())
return;
- glActiveTexture(GL_TEXTURE0 + index);
+ if (m_multitextureAvailable)
+ glActiveTexture(GL_TEXTURE0 + index);
+
+ if (params.wrapS == TEX_WRAP_CLAMP)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ else if (params.wrapS == TEX_WRAP_REPEAT)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ else assert(false);
+
+ if (params.wrapT == TEX_WRAP_CLAMP)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ else if (params.wrapT == TEX_WRAP_REPEAT)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ else assert(false);
+
+ // Texture env setting is silly without multitexturing
+ if (!m_multitextureAvailable)
+ return;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, params.factor.Array());
@@ -790,26 +842,12 @@ after_tex_color:
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT);
else assert(false);
-
-after_tex_operations:
-
- if (params.wrapS == TEX_WRAP_CLAMP)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- else if (params.wrapS == TEX_WRAP_REPEAT)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- else assert(false);
-
- if (params.wrapT == TEX_WRAP_CLAMP)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- else if (params.wrapT == TEX_WRAP_REPEAT)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- else assert(false);
+after_tex_operations: ;
}
void CGLDevice::SetTextureStageWrap(int index, TexWrapMode wrapS, TexWrapMode wrapT)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
// Remember the settings
m_textureStageParams[index].wrapS = wrapS;
@@ -819,7 +857,11 @@ void CGLDevice::SetTextureStageWrap(int index, TexWrapMode wrapS, TexWrapMode wr
if (! m_currentTextures[index].Valid())
return;
- glActiveTexture(GL_TEXTURE0 + index);
+ if (!m_multitextureAvailable && index != 0)
+ return;
+
+ if (m_multitextureAvailable)
+ glActiveTexture(GL_TEXTURE0 + index);
if (wrapS == TEX_WRAP_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
@@ -836,8 +878,7 @@ void CGLDevice::SetTextureStageWrap(int index, TexWrapMode wrapS, TexWrapMode wr
TextureStageParams CGLDevice::GetTextureStageParams(int index)
{
- assert(index >= 0);
- assert(index < static_cast<int>( m_currentTextures.size() ));
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
return m_textureStageParams[index];
}
@@ -868,7 +909,9 @@ void CGLDevice::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int ve
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, sizeof(Vertex), reinterpret_cast<GLfloat*>(&vs[0].normal));
- glClientActiveTexture(GL_TEXTURE0);
+ if (m_multitextureAvailable)
+ glClientActiveTexture(GL_TEXTURE0);
+
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), reinterpret_cast<GLfloat*>(&vs[0].texCoord));
@@ -892,13 +935,18 @@ void CGLDevice::DrawPrimitive(PrimitiveType type, const VertexTex2 *vertices, in
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].normal));
- glClientActiveTexture(GL_TEXTURE0);
+ if (m_multitextureAvailable)
+ glClientActiveTexture(GL_TEXTURE0);
+
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].texCoord));
- glClientActiveTexture(GL_TEXTURE1);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].texCoord2));
+ if (m_multitextureAvailable)
+ {
+ glClientActiveTexture(GL_TEXTURE1);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].texCoord2));
+ }
glColor4fv(color.Array());
@@ -907,8 +955,11 @@ void CGLDevice::DrawPrimitive(PrimitiveType type, const VertexTex2 *vertices, in
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY); // GL_TEXTURE1
- glClientActiveTexture(GL_TEXTURE0);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ if (m_multitextureAvailable)
+ {
+ glClientActiveTexture(GL_TEXTURE0);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ }
}
void CGLDevice::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, int vertexCount)
@@ -927,29 +978,318 @@ void CGLDevice::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, int
glDisableClientState(GL_COLOR_ARRAY);
}
+unsigned int CGLDevice::CreateStaticBuffer(PrimitiveType primitiveType, const Vertex* vertices, int vertexCount)
+{
+ unsigned int id = 0;
+ if (m_vboAvailable)
+ {
+ id = ++m_lastVboId;
+
+ VboObjectInfo info;
+ info.primitiveType = primitiveType;
+ info.vertexType = VERTEX_TYPE_NORMAL;
+ info.vertexCount = vertexCount;
+ info.bufferId = 0;
+
+ glGenBuffers(1, &info.bufferId);
+ glBindBuffer(GL_ARRAY_BUFFER, info.bufferId);
+ glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(Vertex), vertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ m_vboObjects[id] = info;
+ }
+ else
+ {
+ id = glGenLists(1);
+
+ glNewList(id, GL_COMPILE);
+
+ DrawPrimitive(primitiveType, vertices, vertexCount);
+
+ glEndList();
+ }
+
+ return id;
+}
+
+unsigned int CGLDevice::CreateStaticBuffer(PrimitiveType primitiveType, const VertexTex2* vertices, int vertexCount)
+{
+ unsigned int id = 0;
+ if (m_vboAvailable)
+ {
+ id = ++m_lastVboId;
+
+ VboObjectInfo info;
+ info.primitiveType = primitiveType;
+ info.vertexType = VERTEX_TYPE_TEX2;
+ info.vertexCount = vertexCount;
+ info.bufferId = 0;
+
+ glGenBuffers(1, &info.bufferId);
+ glBindBuffer(GL_ARRAY_BUFFER, info.bufferId);
+ glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(VertexTex2), vertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ m_vboObjects[id] = info;
+ }
+ else
+ {
+ id = glGenLists(1);
+
+ glNewList(id, GL_COMPILE);
+
+ DrawPrimitive(primitiveType, vertices, vertexCount);
+
+ glEndList();
+ }
+
+ return id;
+}
+
+unsigned int CGLDevice::CreateStaticBuffer(PrimitiveType primitiveType, const VertexCol* vertices, int vertexCount)
+{
+ unsigned int id = 0;
+ if (m_vboAvailable)
+ {
+ id = ++m_lastVboId;
+
+ VboObjectInfo info;
+ info.primitiveType = primitiveType;
+ info.vertexType = VERTEX_TYPE_COL;
+ info.vertexCount = vertexCount;
+ info.bufferId = 0;
+
+ glGenBuffers(1, &info.bufferId);
+ glBindBuffer(GL_ARRAY_BUFFER, info.bufferId);
+ glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(VertexCol), vertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ m_vboObjects[id] = info;
+ }
+ else
+ {
+ id = glGenLists(1);
+
+ glNewList(id, GL_COMPILE);
+
+ DrawPrimitive(primitiveType, vertices, vertexCount);
+
+ glEndList();
+ }
+
+ return id;
+}
+
+void CGLDevice::UpdateStaticBuffer(unsigned int bufferId, PrimitiveType primitiveType, const Vertex* vertices, int vertexCount)
+{
+ if (m_vboAvailable)
+ {
+ auto it = m_vboObjects.find(bufferId);
+ if (it == m_vboObjects.end())
+ return;
+
+ VboObjectInfo& info = (*it).second;
+ info.primitiveType = primitiveType;
+ info.vertexType = VERTEX_TYPE_NORMAL;
+ info.vertexCount = vertexCount;
+
+ glBindBuffer(GL_ARRAY_BUFFER, info.bufferId);
+ glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(Vertex), vertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ }
+ else
+ {
+ glNewList(bufferId, GL_COMPILE);
+
+ DrawPrimitive(primitiveType, vertices, vertexCount);
+
+ glEndList();
+ }
+}
+
+void CGLDevice::UpdateStaticBuffer(unsigned int bufferId, PrimitiveType primitiveType, const VertexTex2* vertices, int vertexCount)
+{
+ if (m_vboAvailable)
+ {
+ auto it = m_vboObjects.find(bufferId);
+ if (it == m_vboObjects.end())
+ return;
+
+ VboObjectInfo& info = (*it).second;
+ info.primitiveType = primitiveType;
+ info.vertexType = VERTEX_TYPE_TEX2;
+ info.vertexCount = vertexCount;
+
+ glBindBuffer(GL_ARRAY_BUFFER, info.bufferId);
+ glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(VertexTex2), vertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ }
+ else
+ {
+ glNewList(bufferId, GL_COMPILE);
+
+ DrawPrimitive(primitiveType, vertices, vertexCount);
+
+ glEndList();
+ }
+}
+
+void CGLDevice::UpdateStaticBuffer(unsigned int bufferId, PrimitiveType primitiveType, const VertexCol* vertices, int vertexCount)
+{
+ if (m_vboAvailable)
+ {
+ auto it = m_vboObjects.find(bufferId);
+ if (it == m_vboObjects.end())
+ return;
+
+ VboObjectInfo& info = (*it).second;
+ info.primitiveType = primitiveType;
+ info.vertexType = VERTEX_TYPE_COL;
+ info.vertexCount = vertexCount;
+
+ glBindBuffer(GL_ARRAY_BUFFER, info.bufferId);
+ glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(VertexCol), vertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ }
+ else
+ {
+ glNewList(bufferId, GL_COMPILE);
+
+ DrawPrimitive(primitiveType, vertices, vertexCount);
+
+ glEndList();
+ }
+}
+
+void CGLDevice::DrawStaticBuffer(unsigned int bufferId)
+{
+ if (m_vboAvailable)
+ {
+ auto it = m_vboObjects.find(bufferId);
+ if (it == m_vboObjects.end())
+ return;
+
+ glEnable(GL_VERTEX_ARRAY);
+ glBindBuffer(GL_ARRAY_BUFFER, (*it).second.bufferId);
+
+ if ((*it).second.vertexType == VERTEX_TYPE_NORMAL)
+ {
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, sizeof(Vertex), static_cast<char*>(nullptr) + offsetof(Vertex, coord));
+
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glNormalPointer(GL_FLOAT, sizeof(Vertex), static_cast<char*>(nullptr) + offsetof(Vertex, normal));
+
+ if (m_multitextureAvailable)
+ glClientActiveTexture(GL_TEXTURE0);
+
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), static_cast<char*>(nullptr) + offsetof(Vertex, texCoord));
+ }
+ else if ((*it).second.vertexType == VERTEX_TYPE_TEX2)
+ {
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, sizeof(VertexTex2), static_cast<char*>(nullptr) + offsetof(VertexTex2, coord));
+
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glNormalPointer(GL_FLOAT, sizeof(VertexTex2), static_cast<char*>(nullptr) + offsetof(VertexTex2, normal));
+
+ if (m_multitextureAvailable)
+ glClientActiveTexture(GL_TEXTURE0);
+
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), static_cast<char*>(nullptr) + offsetof(VertexTex2, texCoord));
+
+ if (m_multitextureAvailable)
+ {
+ glClientActiveTexture(GL_TEXTURE1);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), static_cast<char*>(nullptr) + offsetof(VertexTex2, texCoord2));
+ }
+ }
+ else if ((*it).second.vertexType == VERTEX_TYPE_COL)
+ {
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, sizeof(VertexCol), static_cast<char*>(nullptr) + offsetof(VertexCol, coord));
+
+ glEnableClientState(GL_COLOR_ARRAY);
+ glColorPointer(4, GL_FLOAT, sizeof(VertexCol), static_cast<char*>(nullptr) + offsetof(VertexCol, color));
+ }
+
+ GLenum mode = TranslateGfxPrimitive((*it).second.primitiveType);
+ glDrawArrays(mode, 0, (*it).second.vertexCount);
+
+ if ((*it).second.vertexType == VERTEX_TYPE_NORMAL)
+ {
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY); // GL_TEXTURE0
+ }
+ else if ((*it).second.vertexType == VERTEX_TYPE_TEX2)
+ {
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY); // GL_TEXTURE1
+ if (m_multitextureAvailable)
+ {
+ glClientActiveTexture(GL_TEXTURE0);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ }
+ }
+ else if ((*it).second.vertexType == VERTEX_TYPE_COL)
+ {
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+ }
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glDisable(GL_VERTEX_ARRAY);
+ }
+ else
+ {
+ glCallList(bufferId);
+ }
+}
+
+void CGLDevice::DestroyStaticBuffer(unsigned int bufferId)
+{
+ if (m_vboAvailable)
+ {
+ auto it = m_vboObjects.find(bufferId);
+ if (it == m_vboObjects.end())
+ return;
+
+ glDeleteBuffers(1, &(*it).second.bufferId);
+
+ m_vboObjects.erase(it);
+ }
+ else
+ {
+ glDeleteLists(bufferId, 1);
+ }
+}
+
bool InPlane(Math::Vector normal, float originPlane, Math::Vector center, float radius)
{
- float distance = (originPlane + Math::DotProduct(normal, center)) / normal.Length();
+ float distance = originPlane + Math::DotProduct(normal, center);
if (distance < -radius)
- return true;
+ return false;
- return false;
+ return true;
}
-/*
- The implementation of ComputeSphereVisibility is taken from libwine's device.c
- Copyright of the WINE team, licensed under GNU LGPL v 2.1
- */
+/* Based on libwine's implementation */
-// TODO: testing
int CGLDevice::ComputeSphereVisibility(const Math::Vector &center, float radius)
{
Math::Matrix m;
- m.LoadIdentity();
- m = Math::MultiplyMatrices(m, m_worldMat);
- m = Math::MultiplyMatrices(m, m_viewMat);
- m = Math::MultiplyMatrices(m, m_projectionMat);
+ m = Math::MultiplyMatrices(m_worldMat, m);
+ m = Math::MultiplyMatrices(m_viewMat, m);
+ Math::Matrix sc;
+ Math::LoadScaleMatrix(sc, Math::Vector(1.0f, 1.0f, -1.0f));
+ m = Math::MultiplyMatrices(sc, m);
+ m = Math::MultiplyMatrices(m_projectionMat, m);
Math::Vector vec[6];
float originPlane[6];
@@ -958,52 +1298,64 @@ int CGLDevice::ComputeSphereVisibility(const Math::Vector &center, float radius)
vec[0].x = m.Get(4, 1) + m.Get(1, 1);
vec[0].y = m.Get(4, 2) + m.Get(1, 2);
vec[0].z = m.Get(4, 3) + m.Get(1, 3);
- originPlane[0] = m.Get(4, 4) + m.Get(1, 4);
+ float l1 = vec[0].Length();
+ vec[0].Normalize();
+ originPlane[0] = (m.Get(4, 4) + m.Get(1, 4)) / l1;
// Right plane
vec[1].x = m.Get(4, 1) - m.Get(1, 1);
vec[1].y = m.Get(4, 2) - m.Get(1, 2);
vec[1].z = m.Get(4, 3) - m.Get(1, 3);
- originPlane[1] = m.Get(4, 4) - m.Get(1, 4);
-
- // Top plane
- vec[2].x = m.Get(4, 1) - m.Get(2, 1);
- vec[2].y = m.Get(4, 2) - m.Get(2, 2);
- vec[2].z = m.Get(4, 3) - m.Get(2, 3);
- originPlane[2] = m.Get(4, 4) - m.Get(2, 4);
+ float l2 = vec[1].Length();
+ vec[1].Normalize();
+ originPlane[1] = (m.Get(4, 4) - m.Get(1, 4)) / l2;
// Bottom plane
- vec[3].x = m.Get(4, 1) + m.Get(2, 1);
- vec[3].y = m.Get(4, 2) + m.Get(2, 2);
- vec[3].z = m.Get(4, 3) + m.Get(2, 3);
- originPlane[3] = m.Get(4, 4) + m.Get(2, 4);
+ vec[2].x = m.Get(4, 1) + m.Get(2, 1);
+ vec[2].y = m.Get(4, 2) + m.Get(2, 2);
+ vec[2].z = m.Get(4, 3) + m.Get(2, 3);
+ float l3 = vec[2].Length();
+ vec[2].Normalize();
+ originPlane[2] = (m.Get(4, 4) + m.Get(2, 4)) / l3;
+
+ // Top plane
+ vec[3].x = m.Get(4, 1) - m.Get(2, 1);
+ vec[3].y = m.Get(4, 2) - m.Get(2, 2);
+ vec[3].z = m.Get(4, 3) - m.Get(2, 3);
+ float l4 = vec[3].Length();
+ vec[3].Normalize();
+ originPlane[3] = (m.Get(4, 4) - m.Get(2, 4)) / l4;
// Front plane
- vec[4].x = m.Get(3, 1);
- vec[4].y = m.Get(3, 2);
- vec[4].z = m.Get(3, 3);
- originPlane[4] = m.Get(3, 4);
+ vec[4].x = m.Get(4, 1) + m.Get(3, 1);
+ vec[4].y = m.Get(4, 2) + m.Get(3, 2);
+ vec[4].z = m.Get(4, 3) + m.Get(3, 3);
+ float l5 = vec[4].Length();
+ vec[4].Normalize();
+ originPlane[4] = (m.Get(4, 4) + m.Get(3, 4)) / l5;
// Back plane
vec[5].x = m.Get(4, 1) - m.Get(3, 1);
vec[5].y = m.Get(4, 2) - m.Get(3, 2);
vec[5].z = m.Get(4, 3) - m.Get(3, 3);
- originPlane[5] = m.Get(4, 4) - m.Get(3, 4);
+ float l6 = vec[5].Length();
+ vec[5].Normalize();
+ originPlane[5] = (m.Get(4, 4) - m.Get(3, 4)) / l6;
int result = 0;
if (InPlane(vec[0], originPlane[0], center, radius))
- result |= INTERSECT_PLANE_LEFT;
+ result |= FRUSTUM_PLANE_LEFT;
if (InPlane(vec[1], originPlane[1], center, radius))
- result |= INTERSECT_PLANE_RIGHT;
+ result |= FRUSTUM_PLANE_RIGHT;
if (InPlane(vec[2], originPlane[2], center, radius))
- result |= INTERSECT_PLANE_TOP;
+ result |= FRUSTUM_PLANE_BOTTOM;
if (InPlane(vec[3], originPlane[3], center, radius))
- result |= INTERSECT_PLANE_BOTTOM;
+ result |= FRUSTUM_PLANE_TOP;
if (InPlane(vec[4], originPlane[4], center, radius))
- result |= INTERSECT_PLANE_FRONT;
+ result |= FRUSTUM_PLANE_FRONT;
if (InPlane(vec[5], originPlane[5], center, radius))
- result |= INTERSECT_PLANE_BACK;
+ result |= FRUSTUM_PLANE_BACK;
return result;
}
@@ -1042,7 +1394,6 @@ void CGLDevice::SetRenderState(RenderState state, bool enabled)
case RENDER_STATE_DEPTH_TEST: flag = GL_DEPTH_TEST; break;
case RENDER_STATE_ALPHA_TEST: flag = GL_ALPHA_TEST; break;
case RENDER_STATE_CULLING: flag = GL_CULL_FACE; break;
- case RENDER_STATE_DITHERING: flag = GL_DITHER; break;
default: assert(false); break;
}
@@ -1067,7 +1418,6 @@ bool CGLDevice::GetRenderState(RenderState state)
case RENDER_STATE_DEPTH_TEST: flag = GL_DEPTH_TEST; break;
case RENDER_STATE_ALPHA_TEST: flag = GL_ALPHA_TEST; break;
case RENDER_STATE_CULLING: flag = GL_CULL_FACE; break;
- case RENDER_STATE_DITHERING: flag = GL_DITHER; break;
default: assert(false); break;
}
diff --git a/src/graphics/opengl/gldevice.h b/src/graphics/opengl/gldevice.h
index 87c1247..fe3f2a1 100644
--- a/src/graphics/opengl/gldevice.h
+++ b/src/graphics/opengl/gldevice.h
@@ -27,12 +27,24 @@
#include <string>
#include <vector>
#include <set>
+#include <map>
// Graphics module namespace
namespace Gfx {
/**
+ \enum VBOMode
+ \brief VBO autodetect/override
+ */
+enum VBOMode
+{
+ VBO_MODE_ENABLE, //! < override: enable
+ VBO_MODE_DISABLE, //! < override: disable
+ VBO_MODE_AUTO //! < autodetect
+};
+
+/**
\struct GLDeviceConfig
\brief Additional config with OpenGL-specific settings */
struct GLDeviceConfig : public DeviceConfig
@@ -51,6 +63,9 @@ struct GLDeviceConfig : public DeviceConfig
//! Force hardware acceleration (video mode set will fail on lack of hw accel)
bool hardwareAccel;
+ //! VBO override/autodetect
+ VBOMode vboMode;
+
//! Constructor calls LoadDefaults()
GLDeviceConfig();
@@ -84,6 +99,9 @@ public:
void ConfigChanged(const GLDeviceConfig &newConfig);
+ void SetUseVbo(bool useVbo);
+ bool GetUseVbo();
+
virtual void BeginScene();
virtual void EndScene();
@@ -107,7 +125,7 @@ public:
virtual void DestroyTexture(const Texture &texture);
virtual void DestroyAllTextures();
- virtual int GetMaxTextureCount();
+ virtual int GetMaxTextureStageCount();
virtual void SetTexture(int index, const Texture &texture);
virtual void SetTexture(int index, unsigned int textureId);
virtual Texture GetTexture(int index);
@@ -119,14 +137,21 @@ public:
virtual void SetTextureStageWrap(int index, Gfx::TexWrapMode wrapS, Gfx::TexWrapMode wrapT);
- //! Renders primitive composed of vertices with single texture
virtual void DrawPrimitive(PrimitiveType type, const Vertex *vertices , int vertexCount,
Color color = Color(1.0f, 1.0f, 1.0f, 1.0f));
- //! Renders primitive composed of vertices with multitexturing (2 textures)
virtual void DrawPrimitive(PrimitiveType type, const VertexTex2 *vertices, int vertexCount,
Color color = Color(1.0f, 1.0f, 1.0f, 1.0f));
virtual void DrawPrimitive(PrimitiveType type, const VertexCol *vertices , int vertexCount);
+ virtual unsigned int CreateStaticBuffer(PrimitiveType primitiveType, const Vertex* vertices, int vertexCount);
+ virtual unsigned int CreateStaticBuffer(PrimitiveType primitiveType, const VertexTex2* vertices, int vertexCount);
+ virtual unsigned int CreateStaticBuffer(PrimitiveType primitiveType, const VertexCol* vertices, int vertexCount);
+ virtual void UpdateStaticBuffer(unsigned int bufferId, PrimitiveType primitiveType, const Vertex* vertices, int vertexCount);
+ virtual void UpdateStaticBuffer(unsigned int bufferId, PrimitiveType primitiveType, const VertexTex2* vertices, int vertexCount);
+ virtual void UpdateStaticBuffer(unsigned int bufferId, PrimitiveType primitiveType, const VertexCol* vertices, int vertexCount);
+ virtual void DrawStaticBuffer(unsigned int bufferId);
+ virtual void DestroyStaticBuffer(unsigned int bufferId);
+
virtual int ComputeSphereVisibility(const Math::Vector &center, float radius);
virtual void SetRenderState(RenderState state, bool enabled);
@@ -200,6 +225,32 @@ private:
//! Set of all created textures
std::set<Texture> m_allTextures;
+
+ //! Type of vertex structure
+ enum VertexType
+ {
+ VERTEX_TYPE_NORMAL,
+ VERTEX_TYPE_TEX2,
+ VERTEX_TYPE_COL,
+ };
+
+ //! Info about static VBO buffers
+ struct VboObjectInfo
+ {
+ PrimitiveType primitiveType;
+ unsigned int bufferId;
+ VertexType vertexType;
+ int vertexCount;
+ };
+
+ //! Whether to use multitexturing
+ bool m_multitextureAvailable;
+ //! Whether to use VBOs or display lists
+ bool m_vboAvailable;
+ //! Map of saved VBO objects
+ std::map<unsigned int, VboObjectInfo> m_vboObjects;
+ //! Last ID of VBO object
+ unsigned int m_lastVboId;
};
diff --git a/src/graphics/opengl/test/CMakeLists.txt b/src/graphics/opengl/test/CMakeLists.txt
deleted file mode 100644
index 79e0ba5..0000000
--- a/src/graphics/opengl/test/CMakeLists.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-
-find_package(OpenGL REQUIRED)
-find_package(SDL REQUIRED)
-find_package(SDL_image REQUIRED)
-find_package(PNG REQUIRED)
-
-if(NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE debug)
-endif(NOT CMAKE_BUILD_TYPE)
-set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
-
-set(ADD_LIBS "")
-
-if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
- set(PLATFORM_WINDOWS 1)
- set(PLATFORM_LINUX 0)
- set(PLATFORM_OTHER 0)
-elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
- set(PLATFORM_WINDOWS 0)
- set(PLATFORM_LINUX 1)
- set(PLATFORM_OTHER 0)
- set(ADD_LIBS "-lrt")
-else()
- set(PLATFORM_WINDOWS 0)
- set(PLATFORM_LINUX 0)
- set(PLATFORM_OTHER 1)
-endif()
-
-configure_file(../../../common/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/common/config.h)
-
-
-set(TEXTURE_SOURCES
-../gldevice.cpp
-../../../common/logger.cpp
-../../../common/image.cpp
-texture_test.cpp
-)
-
-set(MODEL_SOURCES
-../gldevice.cpp
-../../engine/modelfile.cpp
-../../../common/logger.cpp
-../../../common/image.cpp
-../../../common/iman.cpp
-../../../common/stringutils.cpp
-../../../app/system.cpp
-model_test.cpp
-)
-
-set(TRANSFORM_SOURCES
-../gldevice.cpp
-../../../common/logger.cpp
-../../../common/image.cpp
-../../../common/iman.cpp
-../../../app/system.cpp
-transform_test.cpp
-)
-
-set(LIGHT_SOURCES
-../gldevice.cpp
-../../../common/logger.cpp
-../../../common/image.cpp
-../../../common/iman.cpp
-../../../app/system.cpp
-light_test.cpp
-)
-
-include_directories(../../../ ${CMAKE_CURRENT_BINARY_DIR})
-
-set(LIBS
-${SDL_LIBRARY}
-${SDLIMAGE_LIBRARY}
-${OPENGL_LIBRARY}
-${PNG_LIBRARIES}
-${ADD_LIBS}
-)
-
-add_executable(texture_test ${TEXTURE_SOURCES})
-target_link_libraries(texture_test ${LIBS})
-
-# Temporarily disabling because of dependencies on CEngine et al.
-#add_executable(model_test ${MODEL_SOURCES})
-#target_link_libraries(model_test ${LIBS})
-
-add_executable(transform_test ${TRANSFORM_SOURCES})
-target_link_libraries(transform_test ${LIBS})
-
-add_executable(light_test ${LIGHT_SOURCES})
-target_link_libraries(light_test ${LIBS})
diff --git a/src/graphics/opengl/test/README.txt b/src/graphics/opengl/test/README.txt
deleted file mode 100644
index c618415..0000000
--- a/src/graphics/opengl/test/README.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Test programs for OpenGL engine:
- - texture_test -> multitexturing test with 2 textures (included as files: ./tex1.png, ./tex2.png)
- - model_test -> simple model viewer to test model loading
- usage: ./model_test {dxf|mod} model_file
- second argument is the loaded format (DXF or Colobot .mod files)
- requires ./tex folder (or symlink) with Colobot textures
- viewer is controlled from keyboard - the bindings can be found in code
- - transform_test -> simple "walk around" test for world & view transformations
- - light test -> test for lighting
diff --git a/src/graphics/opengl/test/light_test.cpp b/src/graphics/opengl/test/light_test.cpp
deleted file mode 100644
index 6ff3b1c..0000000
--- a/src/graphics/opengl/test/light_test.cpp
+++ /dev/null
@@ -1,437 +0,0 @@
-#include "app/system.h"
-#include "common/logger.h"
-#include "common/image.h"
-#include "common/iman.h"
-#include "graphics/opengl/gldevice.h"
-#include "math/geometry.h"
-
-#include <SDL/SDL.h>
-#include <SDL/SDL_image.h>
-#include <unistd.h>
-
-#include <iostream>
-#include <map>
-
-enum KeySlots
-{
- K_Forward,
- K_Back,
- K_Left,
- K_Right,
- K_Up,
- K_Down,
- K_Count
-};
-bool KEYMAP[K_Count] = { false };
-
-Math::Point MOUSE_POS_BASE;
-
-Math::Vector TRANSLATION(0.0f, 2.0f, 0.0f);
-Math::Vector ROTATION, ROTATION_BASE;
-
-float CUBE_ORBIT = 0.0f;
-
-const int FRAME_DELAY = 5000;
-
-SystemTimeStamp *PREV_TIME = NULL, *CURR_TIME = NULL;
-
-void Init(Gfx::CGLDevice *device)
-{
- device->SetRenderState(Gfx::RENDER_STATE_DEPTH_TEST, true);
- device->SetShadeModel(Gfx::SHADE_SMOOTH);
-}
-
-void Render(Gfx::CGLDevice *device)
-{
- device->BeginScene();
-
- /* Unlit part of scene */
-
- device->SetRenderState(Gfx::RENDER_STATE_LIGHTING, false);
- device->SetRenderState(Gfx::RENDER_STATE_CULLING, false); // Double-sided drawing
-
- Math::Matrix persp;
- Math::LoadProjectionMatrix(persp, Math::PI / 4.0f, (800.0f) / (600.0f), 0.1f, 100.0f);
- device->SetTransform(Gfx::TRANSFORM_PROJECTION, persp);
-
-
- Math::Matrix viewMat;
- Math::Matrix mat;
-
- viewMat.LoadIdentity();
-
- Math::LoadRotationXMatrix(mat, -ROTATION.x);
- viewMat = Math::MultiplyMatrices(viewMat, mat);
-
- Math::LoadRotationYMatrix(mat, -ROTATION.y);
- viewMat = Math::MultiplyMatrices(viewMat, mat);
-
- Math::LoadTranslationMatrix(mat, -TRANSLATION);
- viewMat = Math::MultiplyMatrices(viewMat, mat);
-
- device->SetTransform(Gfx::TRANSFORM_VIEW, viewMat);
-
- Math::Matrix worldMat;
- worldMat.LoadIdentity();
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- Gfx::VertexCol line[2] = { Gfx::VertexCol() };
-
- for (int x = -40; x <= 40; ++x)
- {
- line[0].color = Gfx::Color(0.7f + x / 120.0f, 0.0f, 0.0f);
- line[0].coord.z = -40;
- line[0].coord.x = x;
- line[1].color = Gfx::Color(0.7f + x / 120.0f, 0.0f, 0.0f);
- line[1].coord.z = 40;
- line[1].coord.x = x;
- device->DrawPrimitive(Gfx::PRIMITIVE_LINES, line, 2);
- }
-
- for (int z = -40; z <= 40; ++z)
- {
- line[0].color = Gfx::Color(0.0f, 0.7f + z / 120.0f, 0.0f);
- line[0].coord.z = z;
- line[0].coord.x = -40;
- line[1].color = Gfx::Color(0.0f, 0.7f + z / 120.0f, 0.0f);
- line[1].coord.z = z;
- line[1].coord.x = 40;
- device->DrawPrimitive(Gfx::PRIMITIVE_LINES, line, 2);
- }
-
-
- Gfx::VertexCol quad[6] = { Gfx::VertexCol() };
-
- quad[0].coord = Math::Vector(-1.0f, -1.0f, 0.0f);
- quad[1].coord = Math::Vector( 1.0f, -1.0f, 0.0f);
- quad[2].coord = Math::Vector(-1.0f, 1.0f, 0.0f);
- quad[3].coord = Math::Vector( 1.0f, 1.0f, 0.0f);
-
- for (int i = 0; i < 6; ++i)
- quad[i].color = Gfx::Color(1.0f, 1.0f, 0.0f);
-
- Math::LoadTranslationMatrix(worldMat, Math::Vector(40.0f, 2.0f, 40.0f));
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLE_STRIP, quad, 4);
-
- for (int i = 0; i < 6; ++i)
- quad[i].color = Gfx::Color(0.0f, 1.0f, 1.0f);
-
- Math::LoadTranslationMatrix(worldMat, Math::Vector(-40.0f, 2.0f, -40.0f));
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLE_STRIP, quad, 4);
-
- for (int i = 0; i < 6; ++i)
- quad[i].color = Gfx::Color(1.0f, 0.0f, 1.0f);
-
- Math::LoadTranslationMatrix(worldMat, Math::Vector(10.0f, 4.5f, 5.0f));
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLE_STRIP, quad, 4);
-
- /* Moving lit cube */
- device->SetRenderState(Gfx::RENDER_STATE_LIGHTING, true);
- device->SetRenderState(Gfx::RENDER_STATE_CULLING, true); // Culling (CCW faces)
-
- device->SetGlobalAmbient(Gfx::Color(0.4f, 0.4f, 0.4f));
-
- Gfx::Light light1;
- light1.type = Gfx::LIGHT_POINT;
- light1.position = Math::Vector(10.0f, 4.5f, 5.0f);
- light1.ambient = Gfx::Color(0.2f, 0.2f, 0.2f);
- light1.diffuse = Gfx::Color(1.0f, 0.1f, 0.1f);
- light1.specular = Gfx::Color(0.0f, 0.0f, 0.0f);
- device->SetLight(0, light1);
- device->SetLightEnabled(0, true);
-
- /*Gfx::Light light2;
- device->SetLight(1, light2);
- device->SetLightEnabled(1, true);*/
-
- Gfx::Material material;
- material.ambient = Gfx::Color(0.3f, 0.3f, 0.3f);
- material.diffuse = Gfx::Color(0.8f, 0.7f, 0.6f);
- material.specular = Gfx::Color(0.0f, 0.0f, 0.0f);
- device->SetMaterial(material);
-
- const Gfx::Vertex cube[6][4] =
- {
- {
- // Front
- Gfx::Vertex(Math::Vector(-1.0f, -1.0f, -1.0f), Math::Vector( 0.0f, 0.0f, -1.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, -1.0f, -1.0f), Math::Vector( 0.0f, 0.0f, -1.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, 1.0f, -1.0f), Math::Vector( 0.0f, 0.0f, -1.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, 1.0f, -1.0f), Math::Vector( 0.0f, 0.0f, -1.0f))
- },
-
- {
- // Back
- Gfx::Vertex(Math::Vector( 1.0f, -1.0f, 1.0f), Math::Vector( 0.0f, 0.0f, 1.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, -1.0f, 1.0f), Math::Vector( 0.0f, 0.0f, 1.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, 1.0f, 1.0f), Math::Vector( 0.0f, 0.0f, 1.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, 1.0f, 1.0f), Math::Vector( 0.0f, 0.0f, 1.0f))
- },
-
- {
- // Top
- Gfx::Vertex(Math::Vector(-1.0f, 1.0f, -1.0f), Math::Vector( 0.0f, 1.0f, 0.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, 1.0f, -1.0f), Math::Vector( 0.0f, 1.0f, 0.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, 1.0f, 1.0f), Math::Vector( 0.0f, 1.0f, 0.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, 1.0f, 1.0f), Math::Vector( 0.0f, 1.0f, 0.0f))
- },
-
- {
- // Bottom
- Gfx::Vertex(Math::Vector(-1.0f, -1.0f, 1.0f), Math::Vector( 0.0f, -1.0f, 0.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, -1.0f, 1.0f), Math::Vector( 0.0f, -1.0f, 0.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, -1.0f, -1.0f), Math::Vector( 0.0f, -1.0f, 0.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, -1.0f, -1.0f), Math::Vector( 0.0f, -1.0f, 0.0f))
- },
-
- {
- // Left
- Gfx::Vertex(Math::Vector(-1.0f, -1.0f, 1.0f), Math::Vector(-1.0f, 0.0f, 0.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, -1.0f, -1.0f), Math::Vector(-1.0f, 0.0f, 0.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, 1.0f, 1.0f), Math::Vector(-1.0f, 0.0f, 0.0f)),
- Gfx::Vertex(Math::Vector(-1.0f, 1.0f, -1.0f), Math::Vector(-1.0f, 0.0f, 0.0f))
- },
-
- {
- // Right
- Gfx::Vertex(Math::Vector( 1.0f, -1.0f, -1.0f), Math::Vector( 1.0f, 0.0f, 0.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, -1.0f, 1.0f), Math::Vector( 1.0f, 0.0f, 0.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, 1.0f, -1.0f), Math::Vector( 1.0f, 0.0f, 0.0f)),
- Gfx::Vertex(Math::Vector( 1.0f, 1.0f, 1.0f), Math::Vector( 1.0f, 0.0f, 0.0f))
- }
- };
-
- Math::Matrix cubeTrans;
- Math::LoadTranslationMatrix(cubeTrans, Math::Vector(10.0f, 2.0f, 5.0f));
- Math::Matrix cubeRot;
- Math::LoadRotationMatrix(cubeRot, Math::Vector(0.0f, 1.0f, 0.0f), CUBE_ORBIT);
- Math::Matrix cubeRotInv;
- Math::LoadRotationMatrix(cubeRotInv, Math::Vector(0.0f, 1.0f, 0.0f), -CUBE_ORBIT);
- Math::Matrix cubeTransRad;
- Math::LoadTranslationMatrix(cubeTransRad, Math::Vector(0.0f, 0.0f, 6.0f));
- worldMat = Math::MultiplyMatrices(cubeTransRad, cubeRotInv);
- worldMat = Math::MultiplyMatrices(cubeRot, worldMat);
- worldMat = Math::MultiplyMatrices(cubeTrans, worldMat);
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- for (int i = 0; i < 6; ++i)
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLE_STRIP, cube[i], 4);
-
- device->EndScene();
-}
-
-void Update()
-{
- const float TRANS_SPEED = 6.0f; // units / sec
-
- GetCurrentTimeStamp(CURR_TIME);
- float timeDiff = TimeStampDiff(PREV_TIME, CURR_TIME, STU_SEC);
- CopyTimeStamp(PREV_TIME, CURR_TIME);
-
- CUBE_ORBIT += timeDiff * (Math::PI / 4.0f);
-
- Math::Vector incTrans;
-
- if (KEYMAP[K_Forward])
- incTrans.z = +TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Back])
- incTrans.z = -TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Right])
- incTrans.x = +TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Left])
- incTrans.x = -TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Up])
- incTrans.y = +TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Down])
- incTrans.y = -TRANS_SPEED * timeDiff;
-
- Math::Point rotTrans = Math::RotatePoint(-ROTATION.y, Math::Point(incTrans.x, incTrans.z));
- incTrans.x = rotTrans.x;
- incTrans.z = rotTrans.y;
- TRANSLATION += incTrans;
-}
-
-void KeyboardDown(SDLKey key)
-{
- switch (key)
- {
- case SDLK_w:
- KEYMAP[K_Forward] = true;
- break;
- case SDLK_s:
- KEYMAP[K_Back] = true;
- break;
- case SDLK_d:
- KEYMAP[K_Right] = true;
- break;
- case SDLK_a:
- KEYMAP[K_Left] = true;
- break;
- case SDLK_z:
- KEYMAP[K_Down] = true;
- break;
- case SDLK_x:
- KEYMAP[K_Up] = true;
- break;
- default:
- break;
- }
-}
-
-void KeyboardUp(SDLKey key)
-{
- switch (key)
- {
- case SDLK_w:
- KEYMAP[K_Forward] = false;
- break;
- case SDLK_s:
- KEYMAP[K_Back] = false;
- break;
- case SDLK_d:
- KEYMAP[K_Right] = false;
- break;
- case SDLK_a:
- KEYMAP[K_Left] = false;
- break;
- case SDLK_z:
- KEYMAP[K_Down] = false;
- break;
- case SDLK_x:
- KEYMAP[K_Up] = false;
- break;
- default:
- break;
- }
-}
-
-void MouseMove(int x, int y)
-{
- Math::Point currentPos(static_cast<float>(x), static_cast<float>(y));
-
- static bool first = true;
- if (first || (x < 10) || (y < 10) || (x > 790) || (y > 590))
- {
- SDL_WarpMouse(400, 300);
- MOUSE_POS_BASE.x = 400;
- MOUSE_POS_BASE.y = 300;
- ROTATION_BASE = ROTATION;
- first = false;
- return;
- }
-
- ROTATION.y = ROTATION_BASE.y + (static_cast<float> (x - MOUSE_POS_BASE.x) / 800.0f) * Math::PI;
- ROTATION.x = ROTATION_BASE.x + (static_cast<float> (y - MOUSE_POS_BASE.y) / 600.0f) * Math::PI;
-}
-
-int main(int argc, char *argv[])
-{
- CLogger logger;
-
- PREV_TIME = CreateTimeStamp();
- CURR_TIME = CreateTimeStamp();
-
- GetCurrentTimeStamp(PREV_TIME);
- GetCurrentTimeStamp(CURR_TIME);
-
- CInstanceManager iMan;
-
- // Without any error checking, for simplicity
-
- SDL_Init(SDL_INIT_VIDEO);
-
- IMG_Init(IMG_INIT_PNG);
-
- const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
-
- Uint32 videoFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE;
-
- if (videoInfo->hw_available)
- videoFlags |= SDL_HWSURFACE;
- else
- videoFlags |= SDL_SWSURFACE;
-
- if (videoInfo->blit_hw)
- videoFlags |= SDL_HWACCEL;
-
-
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-
- SDL_Surface *surface = SDL_SetVideoMode(800, 600, 32, videoFlags);
-
-
- SDL_WM_SetCaption("Light Test", "Light Test");
-
- //SDL_WM_GrabInput(SDL_GRAB_ON);
- SDL_ShowCursor(SDL_DISABLE);
-
- Gfx::CGLDevice *device = new Gfx::CGLDevice(Gfx::GLDeviceConfig());
- device->Create();
-
- Init(device);
-
- bool done = false;
- while (! done)
- {
- Render(device);
- Update();
-
- SDL_GL_SwapBuffers();
-
- SDL_Event event;
- while (SDL_PollEvent(&event))
- {
- if (event.type == SDL_QUIT)
- {
- break;
- done = true;
- }
- else if (event.type == SDL_KEYDOWN)
- {
- if (event.key.keysym.sym == SDLK_q)
- {
- done = true;
- break;
- }
- else
- KeyboardDown(event.key.keysym.sym);
- }
- else if (event.type == SDL_KEYUP)
- KeyboardUp(event.key.keysym.sym);
- else if (event.type == SDL_MOUSEMOTION)
- MouseMove(event.motion.x, event.motion.y);
- }
-
- usleep(FRAME_DELAY);
- }
-
- //SDL_WM_GrabInput(SDL_GRAB_OFF);
- SDL_ShowCursor(SDL_ENABLE);
-
- device->Destroy();
- delete device;
-
- SDL_FreeSurface(surface);
-
- IMG_Quit();
-
- SDL_Quit();
-
- DestroyTimeStamp(PREV_TIME);
- DestroyTimeStamp(CURR_TIME);
-
- return 0;
-}
diff --git a/src/graphics/opengl/test/model_test.cpp b/src/graphics/opengl/test/model_test.cpp
deleted file mode 100644
index e951e6e..0000000
--- a/src/graphics/opengl/test/model_test.cpp
+++ /dev/null
@@ -1,377 +0,0 @@
-#include "app/system.h"
-#include "common/logger.h"
-#include "common/image.h"
-#include "common/iman.h"
-#include "graphics/engine/modelfile.h"
-#include "graphics/opengl/gldevice.h"
-#include "math/geometry.h"
-
-#include <SDL/SDL.h>
-#include <SDL/SDL_image.h>
-#include <unistd.h>
-
-#include <iostream>
-#include <map>
-
-enum KeySlots
-{
- K_RotXUp,
- K_RotXDown,
- K_RotYLeft,
- K_RotYRight,
- K_Forward,
- K_Back,
- K_Left,
- K_Right,
- K_Up,
- K_Down,
- K_Count
-};
-bool KEYMAP[K_Count] = { false };
-
-Math::Vector TRANSLATION(0.0f, 0.0f, 30.0f);
-Math::Vector ROTATION;
-
-const int FRAME_DELAY = 5000;
-
-std::map<std::string, Gfx::Texture> TEXS;
-
-SystemTimeStamp *PREV_TIME = NULL, *CURR_TIME = NULL;
-
-Gfx::Texture GetTexture(const std::string &name)
-{
- std::map<std::string, Gfx::Texture>::iterator it = TEXS.find(name);
- if (it == TEXS.end())
- return Gfx::Texture();
-
- return (*it).second;
-}
-
-void LoadTexture(Gfx::CGLDevice *device, const std::string &name)
-{
- if (name.empty())
- return;
-
- Gfx::Texture tex = GetTexture(name);
-
- if (tex.Valid())
- return;
-
- CImage img;
- if (! img.Load(std::string("tex/") + name))
- {
- std::string err = img.GetError();
- GetLogger()->Error("Texture not loaded, error: %s!\n", err.c_str());
- }
- else
- {
- Gfx::TextureCreateParams texCreateParams;
- texCreateParams.mipmap = true;
- if (img.GetData()->surface->format->Amask == 0)
- texCreateParams.format = Gfx::TEX_IMG_BGR;
- else
- texCreateParams.format = Gfx::TEX_IMG_BGRA;
- texCreateParams.minFilter = Gfx::TEX_MIN_FILTER_LINEAR_MIPMAP_LINEAR;
- texCreateParams.magFilter = Gfx::TEX_MAG_FILTER_LINEAR;
-
- tex = device->CreateTexture(&img, texCreateParams);
- }
-
- TEXS[name] = tex;
-}
-
-void Init(Gfx::CGLDevice *device, Gfx::CModelFile *model)
-{
- std::vector<Gfx::ModelTriangle> &triangles = model->GetTriangles();
-
- for (int i = 0; i < static_cast<int>( triangles.size() ); ++i)
- {
- LoadTexture(device, triangles[i].tex1Name);
- LoadTexture(device, triangles[i].tex2Name);
- }
-
- device->SetRenderState(Gfx::RENDER_STATE_TEXTURING, true);
- device->SetRenderState(Gfx::RENDER_STATE_LIGHTING, true);
- device->SetRenderState(Gfx::RENDER_STATE_DEPTH_TEST, true);
- device->SetShadeModel(Gfx::SHADE_SMOOTH);
-
- Gfx::Light light;
- light.type = Gfx::LIGHT_DIRECTIONAL;
- light.ambient = Gfx::Color(0.4f, 0.4f, 0.4f, 0.0f);
- light.diffuse = Gfx::Color(0.8f, 0.8f, 0.8f, 0.0f);
- light.specular = Gfx::Color(0.2f, 0.2f, 0.2f, 0.0f);
- light.position = Math::Vector(0.0f, 0.0f, -1.0f);
- light.direction = Math::Vector(0.0f, 0.0f, 1.0f);
-
- device->SetGlobalAmbient(Gfx::Color(0.5f, 0.5f, 0.5f, 0.0f));
- device->SetLight(0, light);
- device->SetLightEnabled(0, true);
-}
-
-void Render(Gfx::CGLDevice *device, Gfx::CModelFile *modelFile)
-{
- device->BeginScene();
-
- Math::Matrix persp;
- Math::LoadProjectionMatrix(persp, Math::PI / 4.0f, (800.0f) / (600.0f), 0.1f, 100.0f);
- device->SetTransform(Gfx::TRANSFORM_PROJECTION, persp);
-
- Math::Matrix id;
- id.LoadIdentity();
- device->SetTransform(Gfx::TRANSFORM_WORLD, id);
-
- Math::Matrix viewMat;
- Math::LoadTranslationMatrix(viewMat, TRANSLATION);
- Math::Matrix rot;
- Math::LoadRotationXZYMatrix(rot, ROTATION);
- viewMat = Math::MultiplyMatrices(viewMat, rot);
- device->SetTransform(Gfx::TRANSFORM_VIEW, viewMat);
-
- std::vector<Gfx::ModelTriangle> &triangles = modelFile->GetTriangles();
-
- Gfx::VertexTex2 tri[3];
-
- for (int i = 0; i < static_cast<int>( triangles.size() ); ++i)
- {
- device->SetTexture(0, GetTexture(triangles[i].tex1Name));
- device->SetTexture(1, GetTexture(triangles[i].tex2Name));
- device->SetTextureEnabled(0, true);
- device->SetTextureEnabled(1, true);
-
- device->SetMaterial(triangles[i].material);
-
- tri[0] = triangles[i].p1;
- tri[1] = triangles[i].p2;
- tri[2] = triangles[i].p3;
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, tri, 3);
- }
-
- device->EndScene();
-}
-
-void Update()
-{
- const float ROT_SPEED = 80.0f * Math::DEG_TO_RAD; // rad / sec
- const float TRANS_SPEED = 3.0f; // units / sec
-
- GetCurrentTimeStamp(CURR_TIME);
- float timeDiff = TimeStampDiff(PREV_TIME, CURR_TIME, STU_SEC);
- CopyTimeStamp(PREV_TIME, CURR_TIME);
-
- if (KEYMAP[K_RotYLeft])
- ROTATION.y -= ROT_SPEED * timeDiff;
- if (KEYMAP[K_RotYRight])
- ROTATION.y += ROT_SPEED * timeDiff;
- if (KEYMAP[K_RotXDown])
- ROTATION.x -= ROT_SPEED * timeDiff;
- if (KEYMAP[K_RotXUp])
- ROTATION.x += ROT_SPEED * timeDiff;
-
- if (KEYMAP[K_Forward])
- TRANSLATION.z -= TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Back])
- TRANSLATION.z += TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Left])
- TRANSLATION.x += TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Right])
- TRANSLATION.x -= TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Up])
- TRANSLATION.y += TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Down])
- TRANSLATION.y -= TRANS_SPEED * timeDiff;
-}
-
-void KeyboardDown(SDLKey key)
-{
- switch (key)
- {
- case SDLK_LEFT:
- KEYMAP[K_RotYLeft] = true;
- break;
- case SDLK_RIGHT:
- KEYMAP[K_RotYRight] = true;
- break;
- case SDLK_UP:
- KEYMAP[K_RotXUp] = true;
- break;
- case SDLK_DOWN:
- KEYMAP[K_RotXDown] = true;
- break;
- case SDLK_w:
- KEYMAP[K_Forward] = true;
- break;
- case SDLK_s:
- KEYMAP[K_Back] = true;
- break;
- case SDLK_a:
- KEYMAP[K_Left] = true;
- break;
- case SDLK_d:
- KEYMAP[K_Right] = true;
- break;
- case SDLK_z:
- KEYMAP[K_Down] = true;
- break;
- case SDLK_x:
- KEYMAP[K_Up] = true;
- break;
- default:
- break;
- }
-}
-
-void KeyboardUp(SDLKey key)
-{
- switch (key)
- {
- case SDLK_LEFT:
- KEYMAP[K_RotYLeft] = false;
- break;
- case SDLK_RIGHT:
- KEYMAP[K_RotYRight] = false;
- break;
- case SDLK_UP:
- KEYMAP[K_RotXUp] = false;
- break;
- case SDLK_DOWN:
- KEYMAP[K_RotXDown] = false;
- break;
- case SDLK_w:
- KEYMAP[K_Forward] = false;
- break;
- case SDLK_s:
- KEYMAP[K_Back] = false;
- break;
- case SDLK_a:
- KEYMAP[K_Left] = false;
- break;
- case SDLK_d:
- KEYMAP[K_Right] = false;
- break;
- case SDLK_z:
- KEYMAP[K_Down] = false;
- break;
- case SDLK_x:
- KEYMAP[K_Up] = false;
- break;
- default:
- break;
- }
-}
-
-int main(int argc, char *argv[])
-{
- CLogger logger;
-
- PREV_TIME = CreateTimeStamp();
- CURR_TIME = CreateTimeStamp();
-
- GetCurrentTimeStamp(PREV_TIME);
- GetCurrentTimeStamp(CURR_TIME);
-
- if (argc != 3)
- {
- std::cerr << "Usage: " << argv[0] << "{mod|dxf} model_file" << std::endl;
- return 1;
- }
-
- CInstanceManager iMan;
-
- Gfx::CModelFile *modelFile = new Gfx::CModelFile(&iMan);
- if (std::string(argv[1]) == "mod")
- {
- if (! modelFile->ReadModel(argv[2], false, false))
- {
- std::cerr << "Error reading MOD: " << modelFile->GetError() << std::endl;
- return 1;
- }
- }
- else if (std::string(argv[1]) == "dxf")
- {
- if (! modelFile->ReadDXF(argv[2], 0.0f, 0.0f))
- {
- std::cerr << "Error reading DXF: " << modelFile->GetError() << std::endl;
- return 1;
- }
- }
- else
- {
- std::cerr << "Usage: " << argv[0] << "{mod|dxf} model_file" << std::endl;
- return 1;
- }
-
- // Without any error checking, for simplicity
-
- SDL_Init(SDL_INIT_VIDEO);
-
- IMG_Init(IMG_INIT_PNG);
-
- const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
-
- Uint32 videoFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE;
-
- if (videoInfo->hw_available)
- videoFlags |= SDL_HWSURFACE;
- else
- videoFlags |= SDL_SWSURFACE;
-
- if (videoInfo->blit_hw)
- videoFlags |= SDL_HWACCEL;
-
-
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-
- SDL_Surface *surface = SDL_SetVideoMode(800, 600, 32, videoFlags);
-
-
- SDL_WM_SetCaption("Model Test", "Model Test");
-
- Gfx::CGLDevice *device = new Gfx::CGLDevice(Gfx::GLDeviceConfig());
- device->Create();
-
- Init(device, modelFile);
-
- bool done = false;
- while (! done)
- {
- Render(device, modelFile);
- Update();
-
- SDL_GL_SwapBuffers();
-
- SDL_Event event;
- SDL_PollEvent(&event);
- if (event.type == SDL_QUIT)
- done = true;
- else if (event.type == SDL_KEYDOWN)
- KeyboardDown(event.key.keysym.sym);
- else if (event.type == SDL_KEYUP)
- KeyboardUp(event.key.keysym.sym);
-
- usleep(FRAME_DELAY);
- }
-
- delete modelFile;
-
- device->Destroy();
- delete device;
-
- SDL_FreeSurface(surface);
-
- IMG_Quit();
-
- SDL_Quit();
-
- DestroyTimeStamp(PREV_TIME);
- DestroyTimeStamp(CURR_TIME);
-
- return 0;
-}
diff --git a/src/graphics/opengl/test/tex1.png b/src/graphics/opengl/test/tex1.png
deleted file mode 100644
index 46c68a0..0000000
--- a/src/graphics/opengl/test/tex1.png
+++ /dev/null
Binary files differ
diff --git a/src/graphics/opengl/test/tex2.png b/src/graphics/opengl/test/tex2.png
deleted file mode 100644
index ebdae0d..0000000
--- a/src/graphics/opengl/test/tex2.png
+++ /dev/null
Binary files differ
diff --git a/src/graphics/opengl/test/texture_test.cpp b/src/graphics/opengl/test/texture_test.cpp
deleted file mode 100644
index 534a5c0..0000000
--- a/src/graphics/opengl/test/texture_test.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-#include "common/logger.h"
-#include "common/image.h"
-#include "graphics/opengl/gldevice.h"
-#include "math/geometry.h"
-
-#include <SDL/SDL.h>
-#include <SDL/SDL_image.h>
-#include <unistd.h>
-
-
-void Init(Gfx::CGLDevice *device)
-{
- device->SetShadeModel(Gfx::SHADE_SMOOTH);
-
- device->SetRenderState(Gfx::RENDER_STATE_DEPTH_TEST, false);
- device->SetRenderState(Gfx::RENDER_STATE_TEXTURING, true);
-
- device->SetTextureEnabled(0, true);
- device->SetTextureEnabled(1, true);
-
- CImage img1;
- if (! img1.Load("tex1.png"))
- {
- std::string err = img1.GetError();
- GetLogger()->Error("texture 1 not loaded, error: %d!\n", err.c_str());
- }
- CImage img2;
- if (! img2.Load("tex2.png"))
- {
- std::string err = img2.GetError();
- GetLogger()->Error("texture 2 not loaded, error: %d!\n", err.c_str());
- }
-
- Gfx::TextureCreateParams tex1CreateParams;
- tex1CreateParams.mipmap = true;
- tex1CreateParams.format = Gfx::TEX_IMG_RGBA;
- tex1CreateParams.minFilter = Gfx::TEX_MIN_FILTER_LINEAR_MIPMAP_LINEAR;
- tex1CreateParams.magFilter = Gfx::TEX_MAG_FILTER_LINEAR;
-
- Gfx::TextureCreateParams tex2CreateParams;
- tex2CreateParams.mipmap = true;
- tex2CreateParams.format = Gfx::TEX_IMG_RGBA;
- tex2CreateParams.minFilter = Gfx::TEX_MIN_FILTER_NEAREST_MIPMAP_NEAREST;
- tex2CreateParams.magFilter = Gfx::TEX_MAG_FILTER_NEAREST;
-
- Gfx::Texture tex1 = device->CreateTexture(&img1, tex1CreateParams);
- Gfx::Texture tex2 = device->CreateTexture(&img2, tex2CreateParams);
-
- device->SetTexture(0, tex1);
- device->SetTexture(1, tex2);
-}
-
-void Render(Gfx::CGLDevice *device)
-{
- device->BeginScene();
-
- Math::Matrix ortho;
- Math::LoadOrthoProjectionMatrix(ortho, -10, 10, -10, 10);
- device->SetTransform(Gfx::TRANSFORM_PROJECTION, ortho);
-
- Math::Matrix id;
- id.LoadIdentity();
-
- device->SetTransform(Gfx::TRANSFORM_WORLD, id);
- device->SetTransform(Gfx::TRANSFORM_VIEW, id);
-
- static Gfx::VertexTex2 quad[] =
- {
- Gfx::VertexTex2(Math::Vector(-2.0f, 2.0f, 0.0f), Math::Vector(), Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f)),
- Gfx::VertexTex2(Math::Vector( 2.0f, 2.0f, 0.0f), Math::Vector(), Math::Point(1.0f, 0.0f), Math::Point(1.0f, 0.0f)),
- Gfx::VertexTex2(Math::Vector( 2.0f, -2.0f, 0.0f), Math::Vector(), Math::Point(1.0f, 1.0f), Math::Point(1.0f, 1.0f)),
-
- Gfx::VertexTex2(Math::Vector( 2.0f, -2.0f, 0.0f), Math::Vector(), Math::Point(1.0f, 1.0f), Math::Point(1.0f, 1.0f)),
- Gfx::VertexTex2(Math::Vector(-2.0f, -2.0f, 0.0f), Math::Vector(), Math::Point(0.0f, 1.0f), Math::Point(0.0f, 1.0f)),
- Gfx::VertexTex2(Math::Vector(-2.0f, 2.0f, 0.0f), Math::Vector(), Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f)),
- };
-
- Gfx::TextureStageParams tex1StageParams;
- tex1StageParams.colorOperation = Gfx::TEX_MIX_OPER_DEFAULT;
- tex1StageParams.alphaOperation = Gfx::TEX_MIX_OPER_DEFAULT;
- device->SetTextureStageParams(0, tex1StageParams);
-
- Gfx::TextureStageParams tex2StageParams;
- tex2StageParams.colorOperation = Gfx::TEX_MIX_OPER_DEFAULT;
- tex2StageParams.alphaOperation = Gfx::TEX_MIX_OPER_DEFAULT;
- device->SetTextureStageParams(1, tex2StageParams);
-
- Math::Matrix t;
- Math::LoadTranslationMatrix(t, Math::Vector(-4.0f, 4.0f, 0.0f));
- device->SetTransform(Gfx::TRANSFORM_VIEW, t);
-
- device->SetTextureEnabled(0, true);
- device->SetTextureEnabled(1, false);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, quad, 6);
-
- Math::LoadTranslationMatrix(t, Math::Vector( 4.0f, 4.0f, 0.0f));
- device->SetTransform(Gfx::TRANSFORM_VIEW, t);
-
- device->SetTextureEnabled(0, false);
- device->SetTextureEnabled(1, true);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, quad, 6);
-
- Math::LoadTranslationMatrix(t, Math::Vector( 0.0f, -4.0f, 0.0f));
- device->SetTransform(Gfx::TRANSFORM_VIEW, t);
-
- device->SetTextureEnabled(0, true);
- device->SetTextureEnabled(1, true);
-
- tex1StageParams.colorOperation = Gfx::TEX_MIX_OPER_DEFAULT;
- tex1StageParams.alphaOperation = Gfx::TEX_MIX_OPER_DEFAULT;
- device->SetTextureStageParams(0, tex1StageParams);
-
- tex2StageParams.colorOperation = Gfx::TEX_MIX_OPER_ADD;
- tex2StageParams.colorArg1 = Gfx::TEX_MIX_ARG_COMPUTED_COLOR;
- tex2StageParams.colorArg2 = Gfx::TEX_MIX_ARG_TEXTURE;
- tex2StageParams.alphaOperation = Gfx::TEX_MIX_OPER_DEFAULT;
- device->SetTextureStageParams(1, tex2StageParams);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, quad, 6);
-
- device->EndScene();
-}
-
-int main()
-{
- CLogger();
-
- // Without any error checking, for simplicity
-
- SDL_Init(SDL_INIT_VIDEO);
-
- IMG_Init(IMG_INIT_PNG);
-
- const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
-
- Uint32 videoFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE;
-
- if (videoInfo->hw_available)
- videoFlags |= SDL_HWSURFACE;
- else
- videoFlags |= SDL_SWSURFACE;
-
- if (videoInfo->blit_hw)
- videoFlags |= SDL_HWACCEL;
-
-
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-
- SDL_Surface *surface = SDL_SetVideoMode(800, 600, 32, videoFlags);
-
-
- SDL_WM_SetCaption("Texture Test", "Texture Test");
-
- Gfx::CGLDevice *device = new Gfx::CGLDevice(Gfx::GLDeviceConfig());
- device->Create();
-
- Init(device);
-
- bool done = false;
- while (! done)
- {
- Render(device);
-
- SDL_GL_SwapBuffers();
-
- SDL_Event event;
- SDL_PollEvent(&event);
- if (event.type == SDL_QUIT)
- done = true;
-
- usleep(10000);
- }
-
- device->Destroy();
- delete device;
-
- SDL_FreeSurface(surface);
-
- IMG_Quit();
-
- SDL_Quit();
-
- return 0;
-}
diff --git a/src/graphics/opengl/test/transform_test.cpp b/src/graphics/opengl/test/transform_test.cpp
deleted file mode 100644
index cddd1b8..0000000
--- a/src/graphics/opengl/test/transform_test.cpp
+++ /dev/null
@@ -1,339 +0,0 @@
-#include "app/system.h"
-#include "common/logger.h"
-#include "common/image.h"
-#include "common/iman.h"
-#include "graphics/opengl/gldevice.h"
-#include "math/geometry.h"
-
-#include <SDL/SDL.h>
-#include <SDL/SDL_image.h>
-#include <unistd.h>
-
-#include <iostream>
-#include <map>
-
-enum KeySlots
-{
- K_Forward,
- K_Back,
- K_Left,
- K_Right,
- K_Up,
- K_Down,
- K_Count
-};
-bool KEYMAP[K_Count] = { false };
-
-Math::Point MOUSE_POS_BASE;
-
-Math::Vector TRANSLATION(0.0f, 2.0f, 0.0f);
-Math::Vector ROTATION, ROTATION_BASE;
-
-const int FRAME_DELAY = 5000;
-
-SystemTimeStamp *PREV_TIME = NULL, *CURR_TIME = NULL;
-
-void Init(Gfx::CGLDevice *device)
-{
- device->SetRenderState(Gfx::RENDER_STATE_DEPTH_TEST, true);
- device->SetShadeModel(Gfx::SHADE_SMOOTH);
-}
-
-void Render(Gfx::CGLDevice *device)
-{
- device->BeginScene();
-
- Math::Matrix persp;
- Math::LoadProjectionMatrix(persp, Math::PI / 4.0f, (800.0f) / (600.0f), 0.1f, 100.0f);
- device->SetTransform(Gfx::TRANSFORM_PROJECTION, persp);
-
-
- Math::Matrix viewMat;
- Math::Matrix mat;
-
- viewMat.LoadIdentity();
-
- Math::LoadRotationXMatrix(mat, -ROTATION.x);
- viewMat = Math::MultiplyMatrices(viewMat, mat);
-
- Math::LoadRotationYMatrix(mat, -ROTATION.y);
- viewMat = Math::MultiplyMatrices(viewMat, mat);
-
- Math::LoadTranslationMatrix(mat, -TRANSLATION);
- viewMat = Math::MultiplyMatrices(viewMat, mat);
-
- device->SetTransform(Gfx::TRANSFORM_VIEW, viewMat);
-
-
- Math::Matrix worldMat;
- worldMat.LoadIdentity();
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- Gfx::VertexCol line[2] = { Gfx::VertexCol() };
-
- for (int x = -40; x <= 40; ++x)
- {
- line[0].color = Gfx::Color(0.7f + x / 120.0f, 0.0f, 0.0f);
- line[0].coord.z = -40;
- line[0].coord.x = x;
- line[1].color = Gfx::Color(0.7f + x / 120.0f, 0.0f, 0.0f);
- line[1].coord.z = 40;
- line[1].coord.x = x;
- device->DrawPrimitive(Gfx::PRIMITIVE_LINES, line, 2);
- }
-
- for (int z = -40; z <= 40; ++z)
- {
- line[0].color = Gfx::Color(0.0f, 0.7f + z / 120.0f, 0.0f);
- line[0].coord.z = z;
- line[0].coord.x = -40;
- line[1].color = Gfx::Color(0.0f, 0.7f + z / 120.0f, 0.0f);
- line[1].coord.z = z;
- line[1].coord.x = 40;
- device->DrawPrimitive(Gfx::PRIMITIVE_LINES, line, 2);
- }
-
-
- Gfx::VertexCol quad[6] = { Gfx::VertexCol() };
-
- for (int i = 0; i < 6; ++i)
- quad[i].color = Gfx::Color(1.0f, 1.0f, 0.0f);
-
- quad[0].coord = Math::Vector(-1.0f, -1.0f, 0.0f);
- quad[1].coord = Math::Vector( 1.0f, -1.0f, 0.0f);
- quad[2].coord = Math::Vector( 1.0f, 1.0f, 0.0f);
- quad[3].coord = Math::Vector( 1.0f, 1.0f, 0.0f);
- quad[4].coord = Math::Vector(-1.0f, 1.0f, 0.0f);
- quad[5].coord = Math::Vector(-1.0f, -1.0f, 0.0f);
-
- Math::LoadTranslationMatrix(worldMat, Math::Vector(40.0f, 2.0f, 40.0f));
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, quad, 6);
-
- for (int i = 0; i < 6; ++i)
- quad[i].color = Gfx::Color(0.0f, 1.0f, 1.0f);
-
- Math::LoadTranslationMatrix(worldMat, Math::Vector(-40.0f, 2.0f, -40.0f));
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, quad, 6);
-
- for (int i = 0; i < 6; ++i)
- quad[i].color = Gfx::Color(1.0f, 0.0f, 1.0f);
-
- Math::LoadTranslationMatrix(worldMat, Math::Vector(0.0f, 10.0f, 0.0f));
- device->SetTransform(Gfx::TRANSFORM_WORLD, worldMat);
-
- device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, quad, 6);
-
- device->EndScene();
-}
-
-void Update()
-{
- const float TRANS_SPEED = 6.0f; // units / sec
-
- GetCurrentTimeStamp(CURR_TIME);
- float timeDiff = TimeStampDiff(PREV_TIME, CURR_TIME, STU_SEC);
- CopyTimeStamp(PREV_TIME, CURR_TIME);
-
- Math::Vector incTrans;
-
- if (KEYMAP[K_Forward])
- incTrans.z = +TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Back])
- incTrans.z = -TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Right])
- incTrans.x = +TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Left])
- incTrans.x = -TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Up])
- incTrans.y = +TRANS_SPEED * timeDiff;
- if (KEYMAP[K_Down])
- incTrans.y = -TRANS_SPEED * timeDiff;
-
- Math::Point rotTrans = Math::RotatePoint(-ROTATION.y, Math::Point(incTrans.x, incTrans.z));
- incTrans.x = rotTrans.x;
- incTrans.z = rotTrans.y;
- TRANSLATION += incTrans;
-}
-
-void KeyboardDown(SDLKey key)
-{
- switch (key)
- {
- case SDLK_w:
- KEYMAP[K_Forward] = true;
- break;
- case SDLK_s:
- KEYMAP[K_Back] = true;
- break;
- case SDLK_d:
- KEYMAP[K_Right] = true;
- break;
- case SDLK_a:
- KEYMAP[K_Left] = true;
- break;
- case SDLK_z:
- KEYMAP[K_Down] = true;
- break;
- case SDLK_x:
- KEYMAP[K_Up] = true;
- break;
- default:
- break;
- }
-}
-
-void KeyboardUp(SDLKey key)
-{
- switch (key)
- {
- case SDLK_w:
- KEYMAP[K_Forward] = false;
- break;
- case SDLK_s:
- KEYMAP[K_Back] = false;
- break;
- case SDLK_d:
- KEYMAP[K_Right] = false;
- break;
- case SDLK_a:
- KEYMAP[K_Left] = false;
- break;
- case SDLK_z:
- KEYMAP[K_Down] = false;
- break;
- case SDLK_x:
- KEYMAP[K_Up] = false;
- break;
- default:
- break;
- }
-}
-
-void MouseMove(int x, int y)
-{
- Math::Point currentPos(static_cast<float>(x), static_cast<float>(y));
-
- static bool first = true;
- if (first || (x < 10) || (y < 10) || (x > 790) || (y > 590))
- {
- SDL_WarpMouse(400, 300);
- MOUSE_POS_BASE.x = 400;
- MOUSE_POS_BASE.y = 300;
- ROTATION_BASE = ROTATION;
- first = false;
- return;
- }
-
- ROTATION.y = ROTATION_BASE.y + (static_cast<float> (x - MOUSE_POS_BASE.x) / 800.0f) * Math::PI;
- ROTATION.x = ROTATION_BASE.x + (static_cast<float> (y - MOUSE_POS_BASE.y) / 600.0f) * Math::PI;
-}
-
-int main(int argc, char *argv[])
-{
- CLogger logger;
-
- PREV_TIME = CreateTimeStamp();
- CURR_TIME = CreateTimeStamp();
-
- GetCurrentTimeStamp(PREV_TIME);
- GetCurrentTimeStamp(CURR_TIME);
-
- CInstanceManager iMan;
-
- // Without any error checking, for simplicity
-
- SDL_Init(SDL_INIT_VIDEO);
-
- IMG_Init(IMG_INIT_PNG);
-
- const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
-
- Uint32 videoFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE;
-
- if (videoInfo->hw_available)
- videoFlags |= SDL_HWSURFACE;
- else
- videoFlags |= SDL_SWSURFACE;
-
- if (videoInfo->blit_hw)
- videoFlags |= SDL_HWACCEL;
-
-
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
-
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-
- SDL_Surface *surface = SDL_SetVideoMode(800, 600, 32, videoFlags);
-
-
- SDL_WM_SetCaption("Transform Test", "Transform Test");
-
- //SDL_WM_GrabInput(SDL_GRAB_ON);
- SDL_ShowCursor(SDL_DISABLE);
-
- Gfx::CGLDevice *device = new Gfx::CGLDevice(Gfx::GLDeviceConfig());
- device->Create();
-
- Init(device);
-
- bool done = false;
- while (! done)
- {
- Render(device);
- Update();
-
- SDL_GL_SwapBuffers();
-
- SDL_Event event;
- while (SDL_PollEvent(&event))
- {
- if (event.type == SDL_QUIT)
- {
- break;
- done = true;
- }
- else if (event.type == SDL_KEYDOWN)
- {
- if (event.key.keysym.sym == SDLK_q)
- {
- done = true;
- break;
- }
- else
- KeyboardDown(event.key.keysym.sym);
- }
- else if (event.type == SDL_KEYUP)
- KeyboardUp(event.key.keysym.sym);
- else if (event.type == SDL_MOUSEMOTION)
- MouseMove(event.motion.x, event.motion.y);
- }
-
- usleep(FRAME_DELAY);
- }
-
- //SDL_WM_GrabInput(SDL_GRAB_OFF);
- SDL_ShowCursor(SDL_ENABLE);
-
- device->Destroy();
- delete device;
-
- SDL_FreeSurface(surface);
-
- IMG_Quit();
-
- SDL_Quit();
-
- DestroyTimeStamp(PREV_TIME);
- DestroyTimeStamp(CURR_TIME);
-
- return 0;
-}