chore: main cleanup in new files
This commit is contained in:
176
Render.cpp
Normal file
176
Render.cpp
Normal file
@@ -0,0 +1,176 @@
|
||||
#include "Render.h"
|
||||
#include "Global.h"
|
||||
#include "Utils.h"
|
||||
#include "Physics.h"
|
||||
#include "teksturowane.hpp"
|
||||
#include "fabula.hpp"
|
||||
#include "GL/wglew.h"
|
||||
#include "Logger.hpp"
|
||||
|
||||
// Zmienne do monitorowania rozmiaru
|
||||
static GLsizei lastHeight;
|
||||
static GLsizei lastWidth;
|
||||
|
||||
void ChangeSize(GLsizei w, GLsizei h) {
|
||||
if (h == 0) h = 1;
|
||||
lastWidth = w;
|
||||
lastHeight = h;
|
||||
GLfloat fAspect = (GLfloat)w / (GLfloat)h;
|
||||
glViewport(0, 0, w, h);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(45.0f, fAspect, 1.0f, 2000.0f);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
void SetupRC() {
|
||||
// Podstawowa konfiguracja OpenGL
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glFrontFace(GL_CCW);
|
||||
glDepthFunc(GL_LESS);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
glEnable(GL_LINE_SMOOTH);
|
||||
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
|
||||
glEnable(GL_NORMALIZE);
|
||||
|
||||
// Oświetlenie
|
||||
GLfloat ambientLight[] = { 0.4f, 0.4f, 0.4f, 1.0f };
|
||||
GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.8f, 1.0f };
|
||||
GLfloat specular[] = { 0.5f, 0.5f, 0.5f, 1.0f };
|
||||
GLfloat sunPos[] = { 100.0f, 150.0f, 100.0f, 0.0f };
|
||||
GLfloat fillPos[] = { -100.0f, 50.0f, -100.0f, 0.0f };
|
||||
GLfloat fillDiffuse[] = { 0.3f, 0.3f, 0.4f, 1.0f };
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, sunPos);
|
||||
glEnable(GL_LIGHT0);
|
||||
|
||||
glLightfv(GL_LIGHT1, GL_AMBIENT, ambientLight);
|
||||
glLightfv(GL_LIGHT1, GL_DIFFUSE, fillDiffuse);
|
||||
glLightfv(GL_LIGHT1, GL_POSITION, fillPos);
|
||||
glEnable(GL_LIGHT1);
|
||||
|
||||
glEnable(GL_COLOR_MATERIAL);
|
||||
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
|
||||
|
||||
GLfloat specref2[] = { 0.1f, 0.1f, 0.1f, 1.0f };
|
||||
glMaterialfv(GL_FRONT, GL_SPECULAR, specref2);
|
||||
glMateriali(GL_FRONT, GL_SHININESS, 10);
|
||||
glClearColor(0.53f, 0.81f, 0.92f, 1.0f);
|
||||
|
||||
// Inicjalizacja GLEW
|
||||
glewExperimental = true;
|
||||
if (glewInit() != GLEW_OK) {
|
||||
GAME_LOG("Failed to initialize GLEW");
|
||||
return;
|
||||
}
|
||||
|
||||
if (wglewIsSupported("WGL_EXT_swap_control")) wglSwapIntervalEXT(0);
|
||||
if (!glfwInit()) GAME_LOG("Failed to initialize GLFW");
|
||||
|
||||
user.loadModel();
|
||||
mapa.loadModel();
|
||||
glfwSwapInterval(0);
|
||||
}
|
||||
|
||||
void RenderScene() {
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
glEnable(GL_NORMALIZE);
|
||||
glLoadIdentity();
|
||||
|
||||
switch (polygonmode) {
|
||||
case 1: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); break;
|
||||
default: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
}
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
dayNight.apply();
|
||||
|
||||
// Kamera
|
||||
float rad = Rotation * GL_PI / 180.0f;
|
||||
if (panoramic_view) {
|
||||
gluLookAt(Foward, 400.0f, Sides, Foward, 0.0f, Sides, 1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
else if (fpv_view) {
|
||||
float lookAtX = Foward - 10.0f * sin(rad);
|
||||
float lookAtZ = Sides - 10.0f * cos(rad);
|
||||
gluLookAt(Foward, 15.0f, Sides, lookAtX, 15.0f, lookAtZ, 0.0f, 1.0f, 0.0f);
|
||||
}
|
||||
else {
|
||||
float camX = Foward + CameraHeight * sin(rad);
|
||||
float camZ = Sides + CameraHeight * cos(rad);
|
||||
gluLookAt(camX, CameraHeight * 0.4f, camZ, Foward, 10.0f, Sides, 0.0f, 1.0f, 0.0f);
|
||||
}
|
||||
|
||||
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
|
||||
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
|
||||
glRotatef(zRot, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
// Rysowanie podstawy
|
||||
glPushMatrix();
|
||||
glColor3d(0.031, 0.51, 0.094);
|
||||
platforma(450.0f, 0.0f, -45.0f, 450.0f, 45.0f);
|
||||
glPopMatrix();
|
||||
|
||||
short grid_x, grid_z;
|
||||
ustalPozycjeGracza(Foward, Sides, grid_x, grid_z);
|
||||
ustawSiatkeNaWzorNieNadpisujacPostepu();
|
||||
aktualizujBiezacaKratke(grid_x, grid_z);
|
||||
tworzKratkiZSiatki();
|
||||
|
||||
// Rysowanie Cieni
|
||||
{
|
||||
GLfloat lightPos[] = { 100.0f, 150.0f, 100.0f, 0.0f };
|
||||
GLfloat groundPlane[] = { 0.0f, 1.0f, 0.0f, 0.15f }; // Lekko podniesiony
|
||||
GLfloat shadowMatrix[16];
|
||||
MakeShadowMatrix(shadowMatrix, groundPlane, lightPos);
|
||||
|
||||
glPushMatrix();
|
||||
glMultMatrixf(shadowMatrix);
|
||||
glDisable(GL_LIGHTING);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glColor4f(0.0f, 0.0f, 0.0f, 0.5f); // Półprzezroczysty
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(Foward, 0.0f, Sides);
|
||||
glRotatef(Rotation, 0.0f, 1.0f, 0.0f);
|
||||
user.draw();
|
||||
glPopMatrix();
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glEnable(GL_LIGHTING);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
// Rysowanie Łazika
|
||||
glPushMatrix();
|
||||
glTranslatef(Foward, 0.0f, Sides);
|
||||
glRotatef(Rotation, 0.0f, 1.0f, 0.0f);
|
||||
glColor3f(1.0f, 1.0f, 1.0f);
|
||||
user.draw();
|
||||
UpdateRover(fences);
|
||||
fpsCounter.update();
|
||||
glPopMatrix();
|
||||
|
||||
// Inne obiekty
|
||||
stodola(45.0f, 0.0f, -45.0f, 70.0f);
|
||||
plot(450.0f, 3.0f, -90.0f, 900.0f, 4.0f, 1);
|
||||
plot(0.0f, 3.0f, 405.0f, 990.0f, 4.0f, 0);
|
||||
plot(450.0f, 3.0f, 10 * 90.0f, 900.0f, 4.0f, 1);
|
||||
plot(10 * 90.0f, 3.0f, 405.0f, 990.0f, 4.0f, 0);
|
||||
|
||||
// Deszcz
|
||||
rainSystem.update(deltaTime, Foward, Sides);
|
||||
rainSystem.draw();
|
||||
|
||||
glFlush();
|
||||
}
|
||||
Reference in New Issue
Block a user