Compare commits
7 Commits
495ec2e6ab
...
Sterowanie
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa824192b7 | ||
|
|
79c6a1e144 | ||
|
|
01d7766b6a | ||
|
|
3171ebe504 | ||
|
|
039435ed73 | ||
|
|
2afc119bb9 | ||
|
|
4956d74c1a |
24
FPSCounter.cpp
Normal file
24
FPSCounter.cpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
class FPSCounter {
|
||||||
|
public:
|
||||||
|
FPSCounter() : frameCount(0), lastTime(std::chrono::high_resolution_clock::now()) {}
|
||||||
|
|
||||||
|
void update() {
|
||||||
|
frameCount++;
|
||||||
|
auto currentTime = std::chrono::high_resolution_clock::now();
|
||||||
|
std::chrono::duration<double> elapsed = currentTime - lastTime;
|
||||||
|
|
||||||
|
if (elapsed.count() >= 1.0) {
|
||||||
|
double fps = frameCount / elapsed.count();
|
||||||
|
std::cout << "FPS: " << fps << std::endl;
|
||||||
|
frameCount = 0;
|
||||||
|
lastTime = currentTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int frameCount;
|
||||||
|
std::chrono::time_point<std::chrono::high_resolution_clock> lastTime;
|
||||||
|
};
|
||||||
@@ -92,6 +92,7 @@
|
|||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<AdditionalDependencies>glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@@ -120,6 +121,7 @@
|
|||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="FPSCounter.cpp" />
|
||||||
<ClCompile Include="glew.c" />
|
<ClCompile Include="glew.c" />
|
||||||
<ClCompile Include="lazik.cpp" />
|
<ClCompile Include="lazik.cpp" />
|
||||||
<ClCompile Include="loadOBJ.cpp" />
|
<ClCompile Include="loadOBJ.cpp" />
|
||||||
|
|||||||
@@ -33,6 +33,9 @@
|
|||||||
<ClCompile Include="plane.cpp">
|
<ClCompile Include="plane.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="FPSCounter.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="loadOBJ.h">
|
<ClInclude Include="loadOBJ.h">
|
||||||
|
|||||||
765
main.cpp
765
main.cpp
@@ -31,6 +31,8 @@
|
|||||||
#include "GL/glfw3.h"
|
#include "GL/glfw3.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include "timeh.hpp"
|
#include "timeh.hpp"
|
||||||
|
#include "FPSCounter.cpp"
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
using namespace glm;
|
using namespace glm;
|
||||||
|
|
||||||
@@ -60,7 +62,7 @@ static GLsizei lastWidth;
|
|||||||
|
|
||||||
// Opis tekstury
|
// Opis tekstury
|
||||||
BITMAPINFOHEADER bitmapInfoHeader; // nagłówek obrazu
|
BITMAPINFOHEADER bitmapInfoHeader; // nagłówek obrazu
|
||||||
unsigned char* bitmapData; // dane tekstury
|
unsigned char* bitmapData; // dane tekstury
|
||||||
unsigned int texture[2]; // obiekt tekstury
|
unsigned int texture[2]; // obiekt tekstury
|
||||||
|
|
||||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
@@ -71,10 +73,137 @@ void SetDCPixelFormat(HDC hDC);
|
|||||||
|
|
||||||
int polygonmode = 0;
|
int polygonmode = 0;
|
||||||
std::time_t lastTime = std::time(nullptr);
|
std::time_t lastTime = std::time(nullptr);
|
||||||
int monitormode = 0;
|
int monitormode = 1;
|
||||||
int monitormodecounter = 0;
|
int monitormodecounter = 0;
|
||||||
std::time_t monitormodehelper;
|
std::time_t monitormodehelper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Zmienne do ruchu ##############################################^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
FPSCounter fpsCounter;
|
||||||
|
static const int targetFPS = 144; // Celowany FPS
|
||||||
|
//Fps counter
|
||||||
|
void LimitFPS(int targetFPS) {
|
||||||
|
static auto lastTime = std::chrono::high_resolution_clock::now();
|
||||||
|
auto currentTime = std::chrono::high_resolution_clock::now();
|
||||||
|
std::chrono::duration<double> elapsed = currentTime - lastTime;
|
||||||
|
|
||||||
|
// Jeśli upłynęło za mało czasu, aby osiągnąć target FPS, czekamy
|
||||||
|
double frameTime = 1.0 / targetFPS; // Czas na jedną klatkę w sekundach
|
||||||
|
if (elapsed.count() < frameTime) {
|
||||||
|
std::this_thread::sleep_for(std::chrono::duration<double>(frameTime - elapsed.count()));
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTime = std::chrono::high_resolution_clock::now();
|
||||||
|
}
|
||||||
|
bool keyWPressed = false;
|
||||||
|
bool keySPressed = false;
|
||||||
|
bool keyAPressed = false;
|
||||||
|
bool keyDPressed = false;
|
||||||
|
|
||||||
|
float Foward = 0.0f; // Pozycja łazika w przód/tył
|
||||||
|
float Sides = 0.0f; // Pozycja łazika w lewo/prawo
|
||||||
|
float Rotation = 0.0f; // Rotacja łazika (w stopniach)
|
||||||
|
|
||||||
|
float CameraHeight = 50.0f; // Wysokość kamery
|
||||||
|
float MoveSpeed = 1.0f; // Prędkość poruszania się
|
||||||
|
|
||||||
|
|
||||||
|
float velocity = 0.0f; // Aktualna prędkość łazika
|
||||||
|
const float friction = 0.05f; // Współczynnik tarcia (μ)
|
||||||
|
const float maxSpeed = 3.0f; // Maksymalna prędkość łazika
|
||||||
|
const float acceleration = 0.2f;
|
||||||
|
float rotationVelocity = 0.0f; // Prędkość obrotu łazika
|
||||||
|
const float rotationAcceleration = 0.1f; // Przyspieszenie obrotu
|
||||||
|
const float rotationFriction = 0.05f; // Współczynnik tarcia obrotu
|
||||||
|
const float maxRotationSpeed = 3.0f; // Maksymalna prędkość obrotu
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Funkcja do poruszania łazikiem
|
||||||
|
void MoveRover(bool forward) {
|
||||||
|
// Zamieniamy kąt na radiany
|
||||||
|
float radRotation = Rotation * GL_PI / 180.0f;
|
||||||
|
|
||||||
|
// Wektor ruchu w kierunku przód/tył (kierunek łazika)
|
||||||
|
float moveX = cos(radRotation);
|
||||||
|
float moveZ = sin(radRotation);
|
||||||
|
|
||||||
|
// Ruch w przód
|
||||||
|
if (forward) {
|
||||||
|
Sides -= MoveSpeed * moveX;
|
||||||
|
Foward -= MoveSpeed * moveZ;
|
||||||
|
}
|
||||||
|
// Ruch w tył
|
||||||
|
else {
|
||||||
|
Sides += MoveSpeed * moveX;
|
||||||
|
Foward += MoveSpeed * moveZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Funkcja do obracania łazika wokół osi Y
|
||||||
|
void RotateRoverAndCamera(float angle) {
|
||||||
|
Rotation += angle;
|
||||||
|
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
||||||
|
if (Rotation < 0.0f) Rotation += 360.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateRover() {
|
||||||
|
// Przyspieszanie w przód
|
||||||
|
if (keyWPressed) {
|
||||||
|
velocity += acceleration;
|
||||||
|
if (velocity > maxSpeed) velocity = maxSpeed;
|
||||||
|
}
|
||||||
|
// Przyspieszanie w tył
|
||||||
|
else if (keySPressed) {
|
||||||
|
velocity -= acceleration;
|
||||||
|
if (velocity < -maxSpeed) velocity = -maxSpeed;
|
||||||
|
}
|
||||||
|
// Hamowanie (wytracanie prędkości z powodu tarcia)
|
||||||
|
else {
|
||||||
|
if (velocity > 0) {
|
||||||
|
velocity -= friction;
|
||||||
|
if (velocity < 0) velocity = 0;
|
||||||
|
}
|
||||||
|
else if (velocity < 0) {
|
||||||
|
velocity += friction;
|
||||||
|
if (velocity > 0) velocity = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Obracanie
|
||||||
|
if (keyAPressed) {
|
||||||
|
rotationVelocity += rotationAcceleration;
|
||||||
|
if (rotationVelocity > maxRotationSpeed) rotationVelocity = maxRotationSpeed;
|
||||||
|
}
|
||||||
|
else if (keyDPressed) {
|
||||||
|
rotationVelocity -= rotationAcceleration;
|
||||||
|
if (rotationVelocity < -maxRotationSpeed) rotationVelocity = -maxRotationSpeed;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Hamowanie obrotu (wytracanie prędkości z powodu tarcia)
|
||||||
|
if (rotationVelocity > 0) {
|
||||||
|
rotationVelocity -= rotationFriction;
|
||||||
|
if (rotationVelocity < 0) rotationVelocity = 0;
|
||||||
|
}
|
||||||
|
else if (rotationVelocity < 0) {
|
||||||
|
rotationVelocity += rotationFriction;
|
||||||
|
if (rotationVelocity > 0) rotationVelocity = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aktualizacja pozycji na podstawie prędkości
|
||||||
|
float radRotation = Rotation * GL_PI / 180.0f;
|
||||||
|
Sides -= velocity * cos(radRotation);
|
||||||
|
Foward -= velocity * sin(radRotation);
|
||||||
|
|
||||||
|
// Aktualizacja kąta obrotu
|
||||||
|
Rotation += rotationVelocity;
|
||||||
|
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
||||||
|
if (Rotation < 0.0f) Rotation += 360.0f;
|
||||||
|
}
|
||||||
|
|
||||||
// Change viewing volume and viewport. Called when window is resized
|
// Change viewing volume and viewport. Called when window is resized
|
||||||
void ChangeSize(GLsizei w, GLsizei h) {
|
void ChangeSize(GLsizei w, GLsizei h) {
|
||||||
GLfloat nRange = 100.0f;
|
GLfloat nRange = 100.0f;
|
||||||
@@ -117,7 +246,7 @@ void ChangeSize(GLsizei w, GLsizei h) {
|
|||||||
unsigned char* LoadBitmapFile(char* filename, BITMAPINFOHEADER* bitmapInfoHeader) {
|
unsigned char* LoadBitmapFile(char* filename, BITMAPINFOHEADER* bitmapInfoHeader) {
|
||||||
FILE* filePtr; // wskaźnik pozycji pliku
|
FILE* filePtr; // wskaźnik pozycji pliku
|
||||||
BITMAPFILEHEADER bitmapFileHeader; // nagłówek pliku
|
BITMAPFILEHEADER bitmapFileHeader; // nagłówek pliku
|
||||||
unsigned char* bitmapImage; // dane obrazu
|
unsigned char* bitmapImage; // dane obrazu
|
||||||
int imageIdx = 0; // licznik pikseli
|
int imageIdx = 0; // licznik pikseli
|
||||||
unsigned char tempRGB; // zmienna zamiany składowych
|
unsigned char tempRGB; // zmienna zamiany składowych
|
||||||
|
|
||||||
@@ -202,7 +331,7 @@ void SetDCPixelFormat(HDC hDC) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lazik user(10.0f, 0.0f, 0.0f, "res/models/lazik4.obj");
|
lazik user(10.0f, 0.0f, 0.0f, "res/models/lazik4.obj");
|
||||||
plane mapa(0.0f, 0.0f, 0.0f, "res/models/mapka2.obj");
|
plane mapa(0.0f, 0.0f, 0.0f, "res/models/mapka2.obj");
|
||||||
|
|
||||||
void SetupRC() {
|
void SetupRC() {
|
||||||
// Light values and coordinates
|
// Light values and coordinates
|
||||||
@@ -242,6 +371,7 @@ void SetupRC() {
|
|||||||
// White background
|
// White background
|
||||||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
// Black brush
|
// Black brush
|
||||||
|
|
||||||
glColor3f(0.0, 0.0, 0.0);
|
glColor3f(0.0, 0.0, 0.0);
|
||||||
|
|
||||||
// Initialize GLEW
|
// Initialize GLEW
|
||||||
@@ -258,7 +388,7 @@ void SetupRC() {
|
|||||||
// do przepisania kodu na podobny do tego stąd:
|
// do przepisania kodu na podobny do tego stąd:
|
||||||
// https://github.com/opengl-tutorials/ogl/blob/master/tutorial07_model_loading/tutorial07.cpp
|
// https://github.com/opengl-tutorials/ogl/blob/master/tutorial07_model_loading/tutorial07.cpp
|
||||||
timestampedCout("Inicjalizowanie GLFW3...");
|
timestampedCout("Inicjalizowanie GLFW3...");
|
||||||
if(!glfwInit()) {
|
if (!glfwInit()) {
|
||||||
timestampedCout("Failed to initialize GLFW");
|
timestampedCout("Failed to initialize GLFW");
|
||||||
}
|
}
|
||||||
timestampedCout("Zainicjalizowano GLFW3.");
|
timestampedCout("Zainicjalizowano GLFW3.");
|
||||||
@@ -277,7 +407,7 @@ void SetupRC() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RenderScene(void) {
|
void RenderScene(void) {
|
||||||
|
|
||||||
//float normal[3]; // Storage for calculated surface normal
|
//float normal[3]; // Storage for calculated surface normal
|
||||||
|
|
||||||
// Save the matrix state and do the rotations
|
// Save the matrix state and do the rotations
|
||||||
@@ -286,6 +416,8 @@ void RenderScene(void) {
|
|||||||
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
|
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
|
||||||
glRotatef(zRot, 0.0f, 0.0f, 1.0f);
|
glRotatef(zRot, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// gluLookAt(
|
// gluLookAt(
|
||||||
// 0, 0, 0, // the position of your camera, in world space
|
// 0, 0, 0, // the position of your camera, in world space
|
||||||
// 0, 0, 0, // where you want to look at, in world space
|
// 0, 0, 0, // where you want to look at, in world space
|
||||||
@@ -293,26 +425,14 @@ void RenderScene(void) {
|
|||||||
// );
|
// );
|
||||||
|
|
||||||
switch (polygonmode) {
|
switch (polygonmode) {
|
||||||
case 1:
|
case 1:
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// prymitywny licznik FPS
|
|
||||||
if (monitormode) {
|
|
||||||
std::time_t now_t = std::time(nullptr);
|
|
||||||
yRot -= 1; // showcase demo
|
|
||||||
if (now_t > monitormodehelper) {
|
|
||||||
std::cout << (int)(monitormodecounter / (now_t - monitormodehelper)) << " fps\n";
|
|
||||||
monitormodehelper = now_t;
|
|
||||||
monitormodecounter = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
monitormodecounter++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear the screen
|
// Clear the screen
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
@@ -325,12 +445,38 @@ void RenderScene(void) {
|
|||||||
// glBindTexture(GL_TEXTURE_2D, Texture);
|
// glBindTexture(GL_TEXTURE_2D, Texture);
|
||||||
// // Set our "myTextureSampler" sampler to use Texture Unit 0
|
// // Set our "myTextureSampler" sampler to use Texture Unit 0
|
||||||
// glUniform1i(TextureID, 0);
|
// glUniform1i(TextureID, 0);
|
||||||
|
//glLoadIdentity(); // Zresetowanie macierzy widoku
|
||||||
|
//
|
||||||
|
//############################################################################################
|
||||||
|
//Sterowanie
|
||||||
|
//############################################################################################
|
||||||
|
gluLookAt(
|
||||||
|
Foward - 100.0f * sin((Rotation + 180.0f) * GL_PI / 180.0f), // Pozycja kamery wokół łazika (w poziomie)
|
||||||
|
CameraHeight, // Wysokość kamery
|
||||||
|
Sides - 100.0f * cos((Rotation + 180.0f) * GL_PI / 180.0f), // Kamera wzdłuż osi X i Z
|
||||||
|
Foward, 0.0f, Sides, // Punkt, na który patrzy kamera (łazik)
|
||||||
|
0.0f, 1.0f, 0.0f // Wektor "góry"
|
||||||
|
);
|
||||||
|
|
||||||
glColor3f(1.0, 0.0, 0.0);
|
// Rysowanie mapy (nie porusza się)
|
||||||
user.draw();
|
glPushMatrix();
|
||||||
glColor3f(0.0, 1.0, 0.0);
|
glColor3f(0.0, 1.0, 0.0); // Zielony kolor dla mapy
|
||||||
mapa.draw();
|
mapa.draw();
|
||||||
glColor3f(0.0, 0.0, 0.0);
|
glPopMatrix();
|
||||||
|
|
||||||
|
// Rysowanie łazika (porusza się i obraca)
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
glTranslatef(Foward, 0.0f, Sides); // Translacja łazika na jego pozycję
|
||||||
|
glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika wokół własnej osi
|
||||||
|
glColor3f(1.0, 0.0, 0.0); // Czerwony kolor dla łazika
|
||||||
|
user.draw();
|
||||||
|
UpdateRover();
|
||||||
|
glPopMatrix();
|
||||||
|
fpsCounter.update();
|
||||||
|
|
||||||
|
// Zamiana buforów (double buffering)
|
||||||
|
|
||||||
|
|
||||||
// Swap buffers
|
// Swap buffers
|
||||||
//glfwSwapBuffers(window);
|
//glfwSwapBuffers(window);
|
||||||
@@ -417,66 +563,88 @@ HPALETTE GetOpenGLPalette(HDC hDC) {
|
|||||||
// Return the handle to the new palette
|
// Return the handle to the new palette
|
||||||
return hRetPal;
|
return hRetPal;
|
||||||
}
|
}
|
||||||
|
void CreateConsole()
|
||||||
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
{
|
||||||
|
// Tworzenie nowej konsoli
|
||||||
MSG msg; // Windows message structure
|
if (AllocConsole())
|
||||||
WNDCLASS wc; // Windows class structure
|
{
|
||||||
HWND hWnd; // Storeage for window handle
|
// Przekierowanie standardowych strumieni do konsoli
|
||||||
|
FILE* conin;
|
||||||
hInstance = hInst;
|
FILE* conout;
|
||||||
|
FILE* conerr;
|
||||||
// Register Window style
|
freopen_s(&conin, "conin$", "r", stdin);
|
||||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
freopen_s(&conout, "conout$", "w", stdout);
|
||||||
wc.lpfnWndProc = (WNDPROC)WndProc;
|
freopen_s(&conerr, "conout$", "w", stderr);
|
||||||
wc.cbClsExtra = 0;
|
}
|
||||||
wc.cbWndExtra = 0;
|
else
|
||||||
wc.hInstance = hInstance;
|
{
|
||||||
wc.hIcon = NULL;
|
MessageBox(NULL, "Nie udało się utworzyć konsoli.", "Błąd", MB_OK | MB_ICONERROR);
|
||||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
||||||
|
|
||||||
// No need for background brush for OpenGL window
|
|
||||||
wc.hbrBackground = NULL;
|
|
||||||
|
|
||||||
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
|
|
||||||
wc.lpszClassName = lpszAppName;
|
|
||||||
|
|
||||||
// Register the window class
|
|
||||||
if (RegisterClass(&wc) == 0) return FALSE;
|
|
||||||
|
|
||||||
|
|
||||||
// Create the main application window
|
|
||||||
hWnd = CreateWindow(
|
|
||||||
lpszAppName,
|
|
||||||
lpszAppName,
|
|
||||||
|
|
||||||
// OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS
|
|
||||||
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
|
||||||
|
|
||||||
// Window position and size
|
|
||||||
50, 50,
|
|
||||||
400, 400,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
hInstance,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
// If window was not created, quit
|
|
||||||
if (hWnd == NULL) return FALSE;
|
|
||||||
|
|
||||||
|
|
||||||
// Display the window
|
|
||||||
ShowWindow(hWnd, SW_SHOW);
|
|
||||||
UpdateWindow(hWnd);
|
|
||||||
|
|
||||||
// Process application messages until the application closes
|
|
||||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessage(&msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return msg.wParam;
|
|
||||||
}
|
}
|
||||||
|
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
||||||
|
CreateConsole();
|
||||||
|
MSG msg; // Windows message structure
|
||||||
|
WNDCLASS wc; // Windows class structure
|
||||||
|
HWND hWnd; // Storeage for window handle
|
||||||
|
|
||||||
|
|
||||||
|
hInstance = hInst;
|
||||||
|
|
||||||
|
// Register Window style
|
||||||
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
|
wc.lpfnWndProc = (WNDPROC)WndProc;
|
||||||
|
wc.cbClsExtra = 0;
|
||||||
|
wc.cbWndExtra = 0;
|
||||||
|
wc.hInstance = hInstance;
|
||||||
|
wc.hIcon = NULL;
|
||||||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
|
||||||
|
// No need for background brush for OpenGL window
|
||||||
|
wc.hbrBackground = NULL;
|
||||||
|
|
||||||
|
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
|
||||||
|
wc.lpszClassName = lpszAppName;
|
||||||
|
|
||||||
|
// Register the window class
|
||||||
|
if (RegisterClass(&wc) == 0) return FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
// Create the main application window
|
||||||
|
hWnd = CreateWindow(
|
||||||
|
lpszAppName,
|
||||||
|
lpszAppName,
|
||||||
|
|
||||||
|
// OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS
|
||||||
|
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
||||||
|
|
||||||
|
// Window position and size
|
||||||
|
50, 50,
|
||||||
|
800, 800,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
hInstance,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
// If window was not created, quit
|
||||||
|
if (hWnd == NULL) return FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
const WORD ID_TIMER = 1;
|
||||||
|
SetTimer(hWnd, ID_TIMER, 100, NULL);
|
||||||
|
// Display the window
|
||||||
|
|
||||||
|
|
||||||
|
ShowWindow(hWnd, SW_SHOW);
|
||||||
|
UpdateWindow(hWnd);
|
||||||
|
|
||||||
|
// Process application messages until the application closes
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return msg.wParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Window procedure, handles all messages for this program
|
// Window procedure, handles all messages for this program
|
||||||
@@ -484,219 +652,258 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
static HGLRC hRC; // Permenant Rendering context
|
static HGLRC hRC; // Permenant Rendering context
|
||||||
static HDC hDC; // Private GDI Device context
|
static HDC hDC; // Private GDI Device context
|
||||||
|
|
||||||
|
float radRotation = Rotation * GL_PI / 180.0f;
|
||||||
switch (message) {
|
switch (message) {
|
||||||
// Window creation, setup for OpenGL
|
// Window creation, setup for OpenGL
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
// Store the device context
|
// Store the device context
|
||||||
hDC = GetDC(hWnd);
|
hDC = GetDC(hWnd);
|
||||||
|
|
||||||
// Select the pixel format
|
// Select the pixel format
|
||||||
SetDCPixelFormat(hDC);
|
SetDCPixelFormat(hDC);
|
||||||
|
|
||||||
// Create palette if needed
|
// Create palette if needed
|
||||||
hPalette = GetOpenGLPalette(hDC);
|
hPalette = GetOpenGLPalette(hDC);
|
||||||
|
|
||||||
// Create the rendering context and make it current
|
// Create the rendering context and make it current
|
||||||
hRC = wglCreateContext(hDC);
|
hRC = wglCreateContext(hDC);
|
||||||
wglMakeCurrent(hDC, hRC);
|
wglMakeCurrent(hDC, hRC);
|
||||||
SetupRC();
|
SetupRC();
|
||||||
|
|
||||||
/*
|
|
||||||
glGenTextures(2, &texture[0]); // tworzy obiekt tekstury
|
|
||||||
|
|
||||||
// ładuje pierwszy obraz tekstury:
|
/*
|
||||||
bitmapData = LoadBitmapFile((char*)"Bitmapy\\checker.bmp", &bitmapInfoHeader);
|
glGenTextures(2, &texture[0]); // tworzy obiekt tekstury
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture[0]); // aktywuje obiekt tekstury
|
// ładuje pierwszy obraz tekstury:
|
||||||
|
bitmapData = LoadBitmapFile((char*)"Bitmapy\\checker.bmp", &bitmapInfoHeader);
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glBindTexture(GL_TEXTURE_2D, texture[0]); // aktywuje obiekt tekstury
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
// tworzy obraz tekstury
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
|
||||||
|
|
||||||
if (bitmapData) free(bitmapData);
|
// tworzy obraz tekstury
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
||||||
|
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
||||||
|
|
||||||
// ładuje drugi obraz tekstury:
|
if (bitmapData) free(bitmapData);
|
||||||
bitmapData = LoadBitmapFile((char*)"Bitmapy\\crate.bmp", &bitmapInfoHeader);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture[1]); // aktywuje obiekt tekstury
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
// ładuje drugi obraz tekstury:
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
bitmapData = LoadBitmapFile((char*)"Bitmapy\\crate.bmp", &bitmapInfoHeader);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture[1]); // aktywuje obiekt tekstury
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
// tworzy obraz tekstury
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
|
||||||
|
|
||||||
if (bitmapData) free(bitmapData);
|
// tworzy obraz tekstury
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
|
||||||
|
bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
|
||||||
|
|
||||||
// ustalenie sposobu mieszania tekstury z tłem
|
if (bitmapData) free(bitmapData);
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
|
|
||||||
*/
|
// ustalenie sposobu mieszania tekstury z tłem
|
||||||
break;
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
|
||||||
// Window is being destroyed, cleanup
|
// Window is being destroyed, cleanup
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
// Deselect the current rendering context and delete it
|
// Deselect the current rendering context and delete it
|
||||||
wglMakeCurrent(hDC, NULL);
|
wglMakeCurrent(hDC, NULL);
|
||||||
wglDeleteContext(hRC);
|
wglDeleteContext(hRC);
|
||||||
|
|
||||||
// Delete the palette if it was created
|
// Delete the palette if it was created
|
||||||
if (hPalette != NULL) DeleteObject(hPalette);
|
if (hPalette != NULL) DeleteObject(hPalette);
|
||||||
|
|
||||||
// Tell the application to terminate after the window
|
// Tell the application to terminate after the window
|
||||||
// is gone.
|
// is gone.
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Window is resized.
|
// Window is resized.
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
// Call our function which modifies the clipping
|
// Call our function which modifies the clipping
|
||||||
// volume and viewport
|
// volume and viewport
|
||||||
ChangeSize(LOWORD(lParam), HIWORD(lParam));
|
ChangeSize(LOWORD(lParam), HIWORD(lParam));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// The painting function. This message sent by Windows
|
// The painting function. This message sent by Windows
|
||||||
// whenever the screen needs updating.
|
// whenever the screen needs updating.
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
// Call OpenGL drawing code
|
// Call OpenGL drawing code
|
||||||
RenderScene();
|
RenderScene();
|
||||||
|
|
||||||
SwapBuffers(hDC);
|
SwapBuffers(hDC);
|
||||||
|
|
||||||
// Validate the newly painted client area
|
// Validate the newly painted client area
|
||||||
if (!monitormode) ValidateRect(hWnd, NULL);
|
if (!monitormode) {
|
||||||
else InvalidateRect(hWnd, NULL, FALSE);
|
ValidateRect(hWnd, NULL);
|
||||||
break;
|
}
|
||||||
|
else {
|
||||||
|
InvalidateRect(hWnd, NULL, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
// Windows is telling the application that it may modify
|
// Limit FPS
|
||||||
// the system palette. This message in essance asks the
|
LimitFPS(targetFPS);
|
||||||
// application for a new palette.
|
|
||||||
case WM_QUERYNEWPALETTE:
|
|
||||||
// If the palette was created.
|
|
||||||
if (hPalette) {
|
|
||||||
int nRet;
|
|
||||||
|
|
||||||
// Selects the palette into the current device context
|
// Update FPS counter
|
||||||
SelectPalette(hDC, hPalette, FALSE);
|
fpsCounter.update();
|
||||||
|
break;
|
||||||
|
case WM_QUERYNEWPALETTE:
|
||||||
|
// If the palette was created.
|
||||||
|
if (hPalette) {
|
||||||
|
int nRet;
|
||||||
|
|
||||||
// Map entries from the currently selected palette to
|
// Selects the palette into the current device context
|
||||||
// the system palette. The return value is the number
|
SelectPalette(hDC, hPalette, FALSE);
|
||||||
// of palette entries modified.
|
|
||||||
nRet = RealizePalette(hDC);
|
|
||||||
|
|
||||||
// Repaint, forces remap of palette in current window
|
// Map entries from the currently selected palette to
|
||||||
InvalidateRect(hWnd, NULL, FALSE);
|
// the system palette. The return value is the number
|
||||||
|
// of palette entries modified.
|
||||||
|
nRet = RealizePalette(hDC);
|
||||||
|
|
||||||
return nRet;
|
// Repaint, forces remap of palette in current window
|
||||||
}
|
InvalidateRect(hWnd, NULL, FALSE);
|
||||||
break;
|
|
||||||
|
return nRet;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
// This window may set the palette, even though it is not the
|
// This window may set the palette, even though it is not the
|
||||||
// currently active window.
|
// currently active window.
|
||||||
case WM_PALETTECHANGED:
|
case WM_PALETTECHANGED:
|
||||||
// Don't do anything if the palette does not exist, or if
|
// Don't do anything if the palette does not exist, or if
|
||||||
// this is the window that changed the palette.
|
// this is the window that changed the palette.
|
||||||
if ((hPalette != NULL) && ((HWND)wParam != hWnd)) {
|
if ((hPalette != NULL) && ((HWND)wParam != hWnd)) {
|
||||||
// Select the palette into the device context
|
// Select the palette into the device context
|
||||||
SelectPalette(hDC, hPalette, FALSE);
|
SelectPalette(hDC, hPalette, FALSE);
|
||||||
|
|
||||||
// Map entries to system palette
|
// Map entries to system palette
|
||||||
RealizePalette(hDC);
|
RealizePalette(hDC);
|
||||||
|
|
||||||
// Remap the current colors to the newly realized palette
|
// Remap the current colors to the newly realized palette
|
||||||
UpdateColors(hDC);
|
UpdateColors(hDC);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case WM_KEYUP:
|
||||||
|
switch (wParam) {
|
||||||
|
case 'W':
|
||||||
|
keyWPressed = false;
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
keySPressed = false;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
keyAPressed = false;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
keyDPressed = false;
|
||||||
|
break;
|
||||||
|
// Obsługa innych klawiszy
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
switch (wParam) {
|
||||||
|
|
||||||
|
case VK_UP:
|
||||||
|
xRot -= 5.0f;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Key press, check for arrow keys to do cube rotation.
|
case VK_DOWN:
|
||||||
case WM_KEYDOWN:
|
xRot += 5.0f;
|
||||||
|
|
||||||
switch (wParam) {
|
|
||||||
case VK_UP:
|
|
||||||
xRot -= 5.0f;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_DOWN:
|
|
||||||
xRot += 5.0f;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_LEFT:
|
|
||||||
yRot -= 5.0f;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_RIGHT:
|
|
||||||
yRot += 5.0f;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'Q':
|
|
||||||
zRot += 5.0f;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'E':
|
|
||||||
zRot -= 5.0f;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'R':
|
|
||||||
xRot = 0;
|
|
||||||
yRot = 0;
|
|
||||||
zRot = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ' ': // 32
|
|
||||||
polygonmode = !polygonmode;
|
|
||||||
if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 114: // F3
|
|
||||||
monitormode = !monitormode;
|
|
||||||
if (monitormode) {
|
|
||||||
monitormodehelper = std::time(nullptr) - 1;
|
|
||||||
timestampedCout("Wlaczono tryb monitorowania wydajnosci.");
|
|
||||||
}
|
|
||||||
if (!monitormode) timestampedCout("Wylaczono tryb monitorowania wydajnosci.");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
timestampedCout("Nacisnieto nierozpoznany klawisz: " << (int)wParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
xRot = (const int)xRot % 360;
|
|
||||||
yRot = (const int)yRot % 360;
|
|
||||||
zRot = (const int)zRot % 360;
|
|
||||||
|
|
||||||
InvalidateRect(hWnd, NULL, FALSE);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VK_LEFT:
|
||||||
|
yRot -= 5.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VK_RIGHT:
|
||||||
|
yRot += 5.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Q':
|
||||||
|
zRot += 5.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'E':
|
||||||
|
zRot -= 5.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
xRot = 0;
|
||||||
|
yRot = 0;
|
||||||
|
zRot = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ' ': // 32
|
||||||
|
polygonmode = !polygonmode;
|
||||||
|
if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'W':
|
||||||
|
keyWPressed = true;
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
keySPressed = true;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
keyAPressed = true;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
keyDPressed = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
timestampedCout("Nacisnieto nierozpoznany klawisz: " << (int)wParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
xRot = (const int)xRot % 360;
|
||||||
|
yRot = (const int)yRot % 360;
|
||||||
|
zRot = (const int)zRot % 360;
|
||||||
|
|
||||||
|
InvalidateRect(hWnd, NULL, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
// A menu command
|
// A menu command
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
|
|
||||||
switch (LOWORD(wParam)) {
|
switch (LOWORD(wParam)) {
|
||||||
|
|
||||||
// Exit the program
|
// Exit the program
|
||||||
case ID_FILE_EXIT:
|
case ID_FILE_EXIT:
|
||||||
DestroyWindow(hWnd);
|
DestroyWindow(hWnd);
|
||||||
break;
|
|
||||||
|
|
||||||
// Display the about box
|
|
||||||
case ID_HELP_ABOUT:
|
|
||||||
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutDlgProc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: // Passes it on if unproccessed
|
// Display the about box
|
||||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
case ID_HELP_ABOUT:
|
||||||
|
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutDlgProc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_TIMER:
|
||||||
|
{
|
||||||
|
RenderScene();
|
||||||
|
SwapBuffers(hDC);
|
||||||
|
ValidateRect(hWnd, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: // Passes it on if unproccessed
|
||||||
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (0L);
|
return (0L);
|
||||||
@@ -707,48 +914,48 @@ BOOL APIENTRY AboutDlgProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) {
|
|||||||
|
|
||||||
switch (message) {
|
switch (message) {
|
||||||
// Initialize the dialog box
|
// Initialize the dialog box
|
||||||
case WM_INITDIALOG:
|
case WM_INITDIALOG:
|
||||||
int i;
|
int i;
|
||||||
GLenum glError;
|
GLenum glError;
|
||||||
|
|
||||||
// glGetString demo
|
// glGetString demo
|
||||||
SetDlgItemText(hDlg, IDC_OPENGL_VENDOR, reinterpret_cast<LPCSTR>(glGetString(GL_VENDOR)));
|
SetDlgItemText(hDlg, IDC_OPENGL_VENDOR, reinterpret_cast<LPCSTR>(glGetString(GL_VENDOR)));
|
||||||
SetDlgItemText(hDlg, IDC_OPENGL_RENDERER, (LPCSTR)glGetString(GL_RENDERER));
|
SetDlgItemText(hDlg, IDC_OPENGL_RENDERER, (LPCSTR)glGetString(GL_RENDERER));
|
||||||
SetDlgItemText(hDlg, IDC_OPENGL_VERSION, (LPCSTR)glGetString(GL_VERSION));
|
SetDlgItemText(hDlg, IDC_OPENGL_VERSION, (LPCSTR)glGetString(GL_VERSION));
|
||||||
SetDlgItemText(hDlg, IDC_OPENGL_EXTENSIONS, (LPCSTR)glGetString(GL_EXTENSIONS));
|
SetDlgItemText(hDlg, IDC_OPENGL_EXTENSIONS, (LPCSTR)glGetString(GL_EXTENSIONS));
|
||||||
|
|
||||||
// gluGetString demo
|
// gluGetString demo
|
||||||
SetDlgItemText(hDlg, IDC_GLU_VERSION, (LPCSTR)gluGetString(GLU_VERSION));
|
SetDlgItemText(hDlg, IDC_GLU_VERSION, (LPCSTR)gluGetString(GLU_VERSION));
|
||||||
SetDlgItemText(hDlg, IDC_GLU_EXTENSIONS, (LPCSTR)gluGetString(GLU_EXTENSIONS));
|
SetDlgItemText(hDlg, IDC_GLU_EXTENSIONS, (LPCSTR)gluGetString(GLU_EXTENSIONS));
|
||||||
|
|
||||||
|
|
||||||
// Display any recent error messages
|
// Display any recent error messages
|
||||||
i = 0;
|
i = 0;
|
||||||
do {
|
do {
|
||||||
glError = glGetError();
|
glError = glGetError();
|
||||||
SetDlgItemText(hDlg, IDC_ERROR1 + i, (LPCSTR)gluErrorString(glError));
|
SetDlgItemText(hDlg, IDC_ERROR1 + i, (LPCSTR)gluErrorString(glError));
|
||||||
i++;
|
i++;
|
||||||
} while (i < 6 && glError != GL_NO_ERROR);
|
} while (i < 6 && glError != GL_NO_ERROR);
|
||||||
|
|
||||||
|
|
||||||
return (TRUE);
|
return (TRUE);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Process command messages
|
// Process command messages
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
|
|
||||||
// Validate and Make the changes
|
// Validate and Make the changes
|
||||||
if (LOWORD(wParam) == IDOK) EndDialog(hDlg, TRUE);
|
if (LOWORD(wParam) == IDOK) EndDialog(hDlg, TRUE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Closed from sysbox
|
// Closed from sysbox
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
|
|
||||||
EndDialog(hDlg, TRUE);
|
EndDialog(hDlg, TRUE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|||||||
2274083
res/models/mapka3.obj
Normal file
2274083
res/models/mapka3.obj
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user