1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
#include "util.h"
#include <SDL2/SDL.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
void Util_FatalError( const char *error, ... )
{
fprintf(stderr, "Fatal Error:\n");
va_list args;
va_start(args, error);
vfprintf(stderr, error, args);
va_end(args);
SDL_Quit();
exit(1);
}
char *Util_LoadFile( const char *path )
{
FILE* file = fopen( path, "r" );
if(file == NULL)
{
Util_FatalError("File %s could not be found!\n", path);
}
fseek( file, 0, SEEK_END );
size_t sizeOfFile = ftell( file );
fseek( file, 0, SEEK_SET );
char* file_data = (char *) malloc( sizeof(char) * sizeOfFile + 1 );
fread( file_data, sizeof(char), sizeOfFile, file );
file_data[sizeOfFile] = '\0';
fclose(file);
return file_data;
}
float Util_RandomF(float min, float max)
{
return ( min + (float)rand() ) / ( (float)RAND_MAX / (max-min) );
}
int Util_RandomI(int min, int max)
{
return ( rand() % (max-min) ) + min;
}
vec3_t
Util_GetMouseRay(int screenWidth, int screenHeigth, mat4_t *viewMatrix, mat4_t *projectionMatrix,
int mouseX, int mouseY)
{
vec4_t eyeCoords;
vec3_t mouseRay;
/* Normalized device coords NOTE: -y becouse for SDL y = 0 is the top of the screen */
GLfloat normalX = ( 2.0f * (GLfloat)mouseX ) / (GLfloat) screenWidth - 1.0f;
GLfloat normalY = 1.0f - (2.0f * (GLfloat)mouseY) / (GLfloat) screenHeigth;
/* clipCoords include 4th component */
vec4_t clipCoords = { normalX, normalY, -1.0f, 1.0f };
/* Remove perpective */
{
mat4_t invertedProjection = mat4_inverse(projectionMatrix);
eyeCoords = mat4_mul_vec4(&invertedProjection, &clipCoords);
eyeCoords.z = -1.0f;
eyeCoords.w = 0.0f;
}
/* Remove view matrix*/
{
mat4_t invertedViewMatrix = mat4_inverse(viewMatrix);
vec4_t temp = mat4_mul_vec4(&invertedViewMatrix, &eyeCoords);
mouseRay.x = temp.x;
mouseRay.y = temp.y;
mouseRay.z = temp.z;
mouseRay = vec3_normalize(&mouseRay);
}
/* Return the ray in world coordinates */
return mouseRay;
}
|