125 lines
2.4 KiB
C
125 lines
2.4 KiB
C
/**
|
|
* Copyright (c) 2025 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "camera.h"
|
|
#include "display/render.h"
|
|
|
|
#include "world/overworld.h"
|
|
|
|
void cameraUIPush(void) {
|
|
glPushMatrix();
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
glLoadIdentity();
|
|
|
|
glViewport(0, 0, RENDER_WIDTH, RENDER_HEIGHT);
|
|
|
|
mat4 ortho;
|
|
glm_ortho(
|
|
0.0f, (float_t)RENDER_WIDTH,
|
|
(float_t)RENDER_HEIGHT, 0.0f,
|
|
-1.0f, 1.0f,
|
|
ortho
|
|
);
|
|
glLoadMatrixf((const GLfloat*)ortho);
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glLoadIdentity();
|
|
}
|
|
|
|
void cameraUIPop(void) {
|
|
glPopMatrix();
|
|
}
|
|
|
|
void cameraScreenPush(void) {
|
|
glPushMatrix();
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
glLoadIdentity();
|
|
|
|
mat4 ortho;
|
|
#if RENDER_USE_FRAMEBUFFER
|
|
int32_t windowWidth, windowHeight;
|
|
SDL_GetWindowSize(RENDER_WINDOW, &windowWidth, &windowHeight);
|
|
|
|
glViewport(0, 0, windowWidth, windowHeight);
|
|
glm_ortho(
|
|
0.0f, (float_t) windowWidth,
|
|
(float_t)windowHeight, 0.0f,
|
|
-1.0f, 1.0f,
|
|
ortho
|
|
);
|
|
#else
|
|
glm_ortho(
|
|
0.0f, (float_t)RENDER_WIDTH,
|
|
(float_t)RENDER_HEIGHT, 0.0f,
|
|
-1.0f, 1.0f,
|
|
ortho
|
|
);
|
|
#endif
|
|
glLoadMatrixf((const GLfloat*)ortho);
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glLoadIdentity();
|
|
}
|
|
|
|
void cameraScreenPop(void) {
|
|
glPopMatrix();
|
|
}
|
|
|
|
void cameraOverworldPush(void) {
|
|
glPushMatrix();
|
|
glLoadIdentity();
|
|
|
|
#if RENDER_USE_FRAMEBUFFER
|
|
glViewport(0, 0, RENDER_WIDTH, RENDER_HEIGHT);
|
|
#endif
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
glLoadIdentity();
|
|
|
|
const float_t fov = glm_rad(75.0f);
|
|
const float_t camOffset = 12.0f;
|
|
const float_t aspect = (float_t)RENDER_WIDTH / (float_t)RENDER_HEIGHT;
|
|
const float_t pixelPerfectOffset = (
|
|
tanf((glm_rad(180) - fov) / 2.0f) *
|
|
((float_t)RENDER_HEIGHT/ 2.0f)
|
|
);
|
|
|
|
vec3 look = {
|
|
OVERWORLD_CAMERA_X,
|
|
OVERWORLD_CAMERA_Y,
|
|
0.0f
|
|
};
|
|
vec3 eye = {
|
|
look[0],
|
|
look[1] + camOffset,
|
|
look[2] + pixelPerfectOffset
|
|
};
|
|
vec3 up = { 0.0f, 1.0f, 0.0f };
|
|
|
|
mat4 proj;
|
|
glm_perspective(fov, aspect, 0.1f, 1000.0f, proj);
|
|
|
|
// Flips rendering on the Y axis, so that it is still right-down even in 3D;
|
|
proj[1][1] = -proj[1][1];
|
|
|
|
mat4 view;
|
|
glm_lookat(eye, look, up, view);
|
|
|
|
mat4 pv;
|
|
glm_mat4_mul(proj, view, pv);
|
|
|
|
glLoadMatrixf((const GLfloat*)pv);
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glLoadIdentity();
|
|
}
|
|
|
|
void cameraOverworldPop(void) {
|
|
glPopMatrix();
|
|
} |