aboutsummaryrefslogtreecommitdiff
path: root/08-august/src/util/util.c
blob: ad0f1ce30d5a3210cf5809bc72a9ad0bfda84df3 (plain)
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;
}