Browse Source

View description:

- Trying to implement rlglUnproject() - NOT WORKING
- Tested GLEW alternatives: glad and glLoadGen - NOT WORKING
pull/25/head
raysan5 9 years ago
parent
commit
86f683dcbb
1 changed files with 82 additions and 154 deletions
  1. +82
    -154
      src/rlgl.c

+ 82
- 154
src/rlgl.c View File

@ -45,9 +45,9 @@
#ifdef __APPLE__ // OpenGL include for OSX
#include <OpenGL/gl3.h>
#else
#include <GL/glew.h> // Extensions loading lib
//#include "glad.h" // l">TODO: Test glad extensions loading lib
//#include "gl_core_3_3.h" // l">TODO: Test glLoadGen extension loading lib: ERRORS
#include <GL/glew.h> // GLEW extensions loading lib
//#include "glad.h" // ">glad extensions loading lib: ERRORS: windows.h
//#include "gl_core_3_3.h" // glLoadGen extension loading lib: l">ERRORS: windows.h
#endif
#endif
@ -856,12 +856,19 @@ void rlglInit(void)
//for (int i = 0; i < numComp; i++) TraceLog(INFO, "Supported compressed format: 0x%x", format[i]);
// NOTE: We don't need that much data on screen... right now...
#if defined(GRAPHICS_API_OPENGL_11)
TraceLog(INFO, "OpenGL 1.1 profile initialized");
#endif
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
// Get supported extensions list
GLint numExt;
#if defined(GRAPHICS_API_OPENGL_33)
#define GLEW_EXTENSIONS_LOADER
#if defined(GLEW_EXTENSIONS_LOADER)
// Initialize extensions using GLEW
glewExperimental = 1; // Needed for core profile
GLenum error = glewInit();
@ -869,22 +876,49 @@ void rlglInit(void)
if (error != GLEW_OK) TraceLog(ERROR, "Failed to initialize GLEW - Error Code: %s\n", glewGetErrorString(error));
if (glewIsSupported("GL_VERSION_3_3"))
//if (ogl_LoadFunctions() != ogl_LOAD_FAILED)
{
TraceLog(INFO, "OpenGL 3.3 Core profile");
TraceLog(INFO, "OpenGL 3.3 Core profile supported");
vaoSupported = true;
npotSupported = true;
}
else TraceLog(ERROR, "OpenGL 3.3 Core profile not supported");
// With GLEW, we can check if an extension has been loaded in two ways:
//if (GLEW_ARB_vertex_array_object) { }
//if (glewIsSupported("GL_ARB_vertex_array_object")) { }
// NOTE: GLEW is a big library that loads ALL extensions, we can use some alternative to load only required ones
// Alternatives: glLoadGen, glad, libepoxy
//if (!gladLoadGL()) TraceLog("ERROR: Failed to initialize glad\n");
#elif defined(GLAD_EXTENSIONS_LOADER)
// NOTE: glad is generated and contains only required OpenGL version and core extensions
if (!gladLoadGL()) TraceLog(ERROR, "Failed to initialize glad\n");
//if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) TraceLog(ERROR, "Failed to initialize glad\n");
// With GLEW we can check if an extension has been loaded in two ways:
//if (GLEW_ARB_vertex_array_object) { }
//if (glewIsSupported("GL_ARB_vertex_array_object")) { }
if (GLAD_GL_VERSION_3_3)
{
TraceLog(INFO, "OpenGL 3.3 Core profile supported");
vaoSupported = true;
npotSupported = true;
}
else TraceLog(ERROR, "OpenGL 3.3 Core profile not supported");
// With GLAD, we can check if an extension is supported using the GLAD_GL_xxx booleans
//if (GLAD_GL_ARB_vertex_array_object) // Use GL_ARB_vertex_array_object
#elif defined(GLLOADGEN_EXTENSIONS_LOADER)
// NOTE: glLoadGen already generates a header with required OpenGL version and core extensions
if (ogl_LoadFunctions() != ogl_LOAD_FAILED)
{
TraceLog(INFO, "OpenGL 3.3 Core profile supported");
vaoSupported = true;
npotSupported = true;
}
else TraceLog(ERROR, "OpenGL 3.3 Core profile not supported");
#endif
// NOTE: We don't need to check again supported extensions but we do (in case GLEW is replaced sometime)
// We get a list of available extensions and we check for some of them (compressed textures)
@ -1418,7 +1452,7 @@ void rlglDrawModel(Model model, Vector3 position, float rotationAngle, Vector3 r
// Set shader textures (diffuse, normal, specular)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, model.shader.texDiffuseId);
o">//glUniform1i(model.shader.mapDiffuseLoc, 0);
glUniform1i(model.shader.mapDiffuseLoc, 0);
if (model.shader.texNormalId != 0)
{
@ -1544,165 +1578,56 @@ void rlglInitGraphics(int offsetX, int offsetY, int width, int height)
// Get world coordinates from screen coordinates
// TODO: It doesn't work! It drives me crazy!
// NOTE: Using global variables: screenWidth, screenHeight
Vector3 rlglUnproject(Vector3 source, Matrix proj, Matrix view)
{
Vector3 result = { 0, 0, 0 }; // Object coordinates
//GLint viewport[4];
//glGetIntegerv(GL_VIEWPORT, viewport);
//glGetIntegerv(GL_VIEWPORT, viewport); // Not available on OpenGL ES 2.0
// Viewport data
/*
int x = 0;
int y = 0;
int width = GetScreenWidth();
int height = GetScreenHeight();
float minDepth = 0.0f;
float maxDepth = 1.0f;
*/
/*
Matrix modelviewprojection = MatrixMultiply(modelview, projection);
int x = 0; // viewport[0]
int y = 0; // viewport[1]
int width = screenWidth; // viewport[2]
int height = screenHeight; // viewport[3]
Matrix modelviewprojection = MatrixMultiply(view, proj);
MatrixInvert(&modelviewprojection);
Vector3 vector;
vector.x = (((source.x - x) / ((float)width)) * 2.0f) - 1.0f;
vector.y = -((((source.y - y) / ((float)height)) * 2.0f) - 1.0f);
vector.z = (source.z - minDepth) / (maxDepth - minDepth);
//float a = (((vector.x * matrix.M14) + (vector.y * matrix.M24)) + (vector.z * matrix.M34)) + matrix.M44;
//float a = (((vector.x * modelviewprojection.m3) + (vector.y * modelviewprojection.m7)) + (vector.z * modelviewprojection.m11)) + modelviewprojection.m15;
VectorTransform(&vector, modelviewprojection);
//if (!MathUtil.IsOne(a)) vector = (vector / a);
//VectorScale(&vector, 1/a);
return vector;
*/
/*
Vector3 worldPoint;
// Transformation matrices
Matrix modelviewprojection = MatrixIdentity();
Quaternion quat;
// Calculation for inverting a matrix, compute projection x modelview
modelviewprojection = MatrixMultiply(proj, view);
MatrixInvert(&modelviewprojection);
// NOTE: Compute unproject using Vector3
// Transformation of normalized coordinates between -1 and 1
quat.x = ((source.x - (float)x)/(float)width*2.0) - 1.0f;
quat.y = ((source.y - (float)y)/(float)height*2.0) - 1.0f;
quat.z = 2.0*source.z - 1.0;
quat.w = 1.0;
// Objects coordinates
QuaternionTransform(&quat, modelviewprojection);
//if (quat.w == 0.0) return 0;
worldPoint.x = quat.x/quat.w;
worldPoint.y = quat.y/quat.w;
worldPoint.z = quat.z/quat.w;
return worldPoint;
*/
/*
Quaternion quat;
Vector3 vec;
quat.x = 2.0f * GetMousePosition().x / (float)width - 1;
quat.y = -(2.0f * GetMousePosition().y / (float)height - 1);
quat.z = 0;
quat.w = 1;
Matrix invView;
MatrixInvert(&view);
Matrix invProj;
MatrixInvert(&proj);
quat.x = invProj.m0 * quat.x + invProj.m4 * quat.y + invProj.m8 * quat.z + invProj.m12 * quat.w;
quat.y = invProj.m1 * quat.x + invProj.m5 * quat.y + invProj.m9 * quat.z + invProj.m13 * quat.w;
quat.z = invProj.m2 * quat.x + invProj.m6 * quat.y + invProj.m10 * quat.z + invProj.m14 * quat.w;
quat.w = invProj.m3 * quat.x + invProj.m7 * quat.y + invProj.m11 * quat.z + invProj.m15 * quat.w;
quat.x = invView.m0 * quat.x + invView.m4 * quat.y + invView.m8 * quat.z + invView.m12 * quat.w;
quat.y = invView.m1 * quat.x + invView.m5 * quat.y + invView.m9 * quat.z + invView.m13 * quat.w;
quat.z = invView.m2 * quat.x + invView.m6 * quat.y + invView.m10 * quat.z + invView.m14 * quat.w;
quat.w = invView.m3 * quat.x + invView.m7 * quat.y + invView.m11 * quat.z + invView.m15 * quat.w;
vec.x /= quat.w;
vec.y /= quat.w;
vec.z /= quat.w;
return vec;
*/
/*
Vector3 worldPoint;
result.x = ((source.x - (float)x)/(float)width)*2.0f - 1.0f;
result.y = ((source.y - (float)y)/(float)height)*2.0f - 1.0f;
result.z = source.z*2.0f - 1.0f;
// Transformation matrices
Matrix modelviewprojection;
// Object coordinates (multiply vector by matrix)
VectorTransform(&result, modelviewprojection);
*/
// NOTE: Compute unproject using Quaternion (Vector4)
Quaternion quat;
// Calculation for inverting a matrix, compute projection x modelview
modelviewprojection = MatrixMultiply(view, proj);
// Now compute the inverse of matrix A
MatrixInvert(&modelviewprojection);
// Transformation of normalized coordinates between -1 and 1
quat.x = ((source.x - (float)x)/(float)width*2.0) - 1.0f;
quat.y = ((source.y - (float)y)/(float)height*2.0) - 1.0f;
quat.z = 2.0*source.z - 1.0;
quat.x = ((source.x - (float)x)/(float)width)*2.0f - 1.0f;
quat.y = ((source.y - (float)y)/(float)height)*2.0f - 1.0f;
quat.z = source.z*2.0f - 1.0f;
quat.w = 1.0;
QuaternionTransform(&quat, modelviewprojection);
// Traspose quaternion and multiply
Quaternion result;
result.x = modelviewprojection.m0 * quad.x + modelviewprojection.m4 * quad.y + modelviewprojection.m8 * quad.z + modelviewprojection.m12 * quad.w;
result.y = modelviewprojection.m1 * quad.x + modelviewprojection.m5 * quad.y + modelviewprojection.m9 * quad.z + modelviewprojection.m13 * quad.w;
result.z = modelviewprojection.m2 * quad.x + modelviewprojection.m6 * quad.y + modelviewprojection.m10 * quad.z + modelviewprojection.m14 * quad.w;
result.w = modelviewprojection.m3 * quad.x + modelviewprojection.m7 * quad.y + modelviewprojection.m11 * quad.z + modelviewprojection.m15 * quad.w;
// Invert
result.w = 1.0f / result.w;
//if (quat.w == 0.0) return 0;
worldPoint.x = quat.x * quat.w;
worldPoint.y = quat.y * quat.w;
worldPoint.z = quat.z * quat.w;
return worldPoint;
*/
/*
// Needed Vectors
Vector3 normalDeviceCoordinates;
Quaternion rayClip;
Quaternion rayEye;
Vector3 rayWorld;
// Getting normal device coordinates
float x = (2.0 * mousePosition.x) / GetScreenWidth() - 1.0;
float y = 1.0 - (2.0 * mousePosition.y) / GetScreenHeight();
float z = 1.0;
normalDeviceCoordinates = (Vector3){ x, y, z };
// Getting clip vector
rayClip = (Quaternion){ normalDeviceCoordinates.x, normalDeviceCoordinates.y, -1, 1 };
Matrix invProjection = projection;
MatrixInvert(&invProjection);
rayEye = MatrixQuaternionMultiply(invProjection, rayClip);
rayEye = (Quaternion){ rayEye.x, rayEye.y, -1, 0 };
Matrix invModelview = modelview;
MatrixInvert(&invModelview);
if (quat.w != 0.0)
{
quat.x /= quat.w;
quat.y /= quat.w;
quat.z /= quat.w;
}
rayWorld = MatrixVector3Multiply(invModelview, (Vector3){rayEye.x, rayEye.y, rayEye.z} );
VectorNormalize(&rayWorld);
result.x = quat.x;
result.y = quat.y;
result.z = quat.z;
return rayWorld;
*/
return (Vector3){ 0, 0, 0 };
return result;
}
// Convert image data to OpenGL texture (returns OpenGL valid Id)
@ -3133,6 +3058,9 @@ static pixel *GenNextMipmap(pixel *srcData, int srcWidth, int srcHeight)
#endif
#if defined(RLGL_STANDALONE)
typedef enum { INFO = 0, ERROR, WARNING, DEBUG, OTHER } TraceLogType;
// Output a trace log message
// NOTE: Expected msgType: (0)Info, (1)Error, (2)Warning
static void TraceLog(int msgType, const char *text, ...)

Loading…
Cancel
Save