mirror of
https://github.com/simtactics/niotso.git
synced 2025-03-22 10:52:20 +00:00
Proper scene logic, whoo!
This commit is contained in:
parent
2e7f3b24ca
commit
551f3c834f
9 changed files with 108 additions and 79 deletions
|
@ -18,6 +18,5 @@
|
||||||
#include "windows/xaudio2.hpp"
|
#include "windows/xaudio2.hpp"
|
||||||
|
|
||||||
namespace Audio {
|
namespace Audio {
|
||||||
DWORD WINAPI ThreadProc(LPVOID lpParameter);
|
int Initialize();
|
||||||
extern HANDLE Thread;
|
|
||||||
}
|
}
|
|
@ -26,8 +26,9 @@ IXAudio2MasteringVoice *MasterVoice = NULL;
|
||||||
|
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
DWORD WINAPI ThreadProc(LPVOID){
|
int Initialize(){
|
||||||
HRESULT result;
|
HRESULT result;
|
||||||
|
|
||||||
result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE | COINIT_SPEED_OVER_MEMORY);
|
result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE | COINIT_SPEED_OVER_MEMORY);
|
||||||
if(result != S_OK){
|
if(result != S_OK){
|
||||||
MessageBox(Window::hWnd, "Failed to initialize Microsoft COM.", NULL, MB_OK | MB_ICONERROR);
|
MessageBox(Window::hWnd, "Failed to initialize Microsoft COM.", NULL, MB_OK | MB_ICONERROR);
|
||||||
|
@ -49,12 +50,6 @@ DWORD WINAPI ThreadProc(LPVOID){
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return ERROR_AUDIO_CREATE_VOICE;
|
return ERROR_AUDIO_CREATE_VOICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetEvent(System::Terminated[HANDLE_AUDIO]);
|
|
||||||
SetEvent(System::Initialized[HANDLE_AUDIO]);
|
|
||||||
WaitForSingleObject(System::Shutdown, INFINITE);
|
|
||||||
|
|
||||||
Shutdown();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,8 +62,6 @@ void Shutdown(){
|
||||||
pXAudio2->Release();
|
pXAudio2->Release();
|
||||||
pXAudio2 = NULL;
|
pXAudio2 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEvent(System::Terminated[HANDLE_AUDIO]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -44,41 +44,68 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
|
||||||
return ERROR_INIT_ANOTHERINSTRUNNING;
|
return ERROR_INIT_ANOTHERINSTRUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
System::Shutdown = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
||||||
for(int i=0; i<2; i++){
|
|
||||||
System::Initialized[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
||||||
System::Terminated[i] = CreateEvent(NULL, TRUE, TRUE, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
result = CreateWindowInvisible(hInstance, 800, 600, false);
|
result = CreateWindowInvisible(hInstance, 800, 600, false);
|
||||||
if(result != 0){
|
if(result != 0){
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return ERROR_INIT | ERROR_INIT_WINDOW | result;
|
return ERROR_INIT | ERROR_INIT_WINDOW | result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Graphics::Thread = CreateThread(NULL, 0, Graphics::ThreadProc, NULL, 0, NULL);
|
result = System::Initialize();
|
||||||
if(Graphics::Thread == NULL){
|
if(result != 0){
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return ERROR_INIT | ERROR_INIT_GRAPHICS | ERROR_GRAPHICS_CREATE_THREAD;
|
return ERROR_INIT | ERROR_INIT_SYSTEM | result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Audio::Thread = CreateThread(NULL, 0, Audio::ThreadProc, NULL, 0, NULL);
|
result = Graphics::Initialize();
|
||||||
if(Audio::Thread == NULL){
|
if(result != 0){
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return ERROR_INIT | ERROR_INIT_GRAPHICS | ERROR_GRAPHICS_CREATE_THREAD;
|
return ERROR_INIT | ERROR_INIT_GRAPHICS | result;
|
||||||
}
|
}
|
||||||
|
|
||||||
WaitForMultipleObjects(2, System::Initialized, TRUE, INFINITE);
|
result = Audio::Initialize();
|
||||||
for(int i=0; i<2; i++){
|
if(result != 0){
|
||||||
if(WaitForSingleObject(System::Terminated[i], 0) != WAIT_TIMEOUT){
|
Shutdown();
|
||||||
/* If Terminated for this thread is signaled, an initialization error occurred */
|
return ERROR_INIT | ERROR_INIT_AUDIO | result;
|
||||||
Shutdown();
|
|
||||||
return ERROR_INIT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentScene = new LoginScreen();
|
CurrentScene = new LoginScreen();
|
||||||
CurrentScene->Render();
|
if(CurrentScene == NULL){
|
||||||
|
Shutdown();
|
||||||
|
return ERROR_INIT | ERROR_INIT_LOGIC | ERROR_LOGIC_CREATE_SCENE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LARGE_INTEGER PreviousTime;
|
||||||
|
QueryPerformanceCounter(&PreviousTime);
|
||||||
|
|
||||||
|
ShowWindow(Window::hWnd, SW_SHOW);
|
||||||
|
SetForegroundWindow(Window::hWnd);
|
||||||
|
SetFocus(Window::hWnd);
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
MSG msg;
|
||||||
|
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
LARGE_INTEGER CurrentTime;
|
||||||
|
QueryPerformanceCounter(&CurrentTime);
|
||||||
|
float TimeDelta = (float)(CurrentTime.QuadPart-PreviousTime.QuadPart)/System::ClockFreq.QuadPart;
|
||||||
|
|
||||||
|
int result = CurrentScene->RunFor(TimeDelta);
|
||||||
|
if(result == System::SHUTDOWN)
|
||||||
|
break;
|
||||||
|
if(result > 0){
|
||||||
|
CurrentScene->Render();
|
||||||
|
SwapBuffers(Graphics::hDC);
|
||||||
|
}
|
||||||
|
|
||||||
|
PreviousTime.QuadPart = CurrentTime.QuadPart;
|
||||||
|
QueryPerformanceCounter(&CurrentTime);
|
||||||
|
unsigned SleepDuration = (unsigned)
|
||||||
|
((System::FramePeriod - (float)(CurrentTime.QuadPart-PreviousTime.QuadPart)/System::ClockFreq.QuadPart) * 1000);
|
||||||
|
if(SleepDuration > 1) Sleep(SleepDuration);
|
||||||
|
}
|
||||||
|
|
||||||
MSG msg;
|
MSG msg;
|
||||||
while(GetMessage(&msg, NULL, 0, 0))
|
while(GetMessage(&msg, NULL, 0, 0))
|
||||||
|
@ -167,8 +194,6 @@ int CreateWindowInvisible(HINSTANCE hInst, unsigned Width, unsigned Height, bool
|
||||||
|
|
||||||
void Shutdown()
|
void Shutdown()
|
||||||
{
|
{
|
||||||
SetEvent(System::Shutdown);
|
|
||||||
WaitForMultipleObjects(2, System::Terminated, TRUE, INFINITE);
|
|
||||||
if(Window::hWnd){
|
if(Window::hWnd){
|
||||||
DestroyWindow(Window::hWnd);
|
DestroyWindow(Window::hWnd);
|
||||||
Window::hWnd = NULL;
|
Window::hWnd = NULL;
|
||||||
|
|
|
@ -20,8 +20,7 @@
|
||||||
|
|
||||||
//Graphics/Startup.cpp
|
//Graphics/Startup.cpp
|
||||||
namespace Graphics {
|
namespace Graphics {
|
||||||
DWORD WINAPI ThreadProc(LPVOID lpParameter);
|
int Initialize();
|
||||||
extern HANDLE Thread;
|
|
||||||
extern HDC hDC;
|
extern HDC hDC;
|
||||||
extern HGLRC hRC;
|
extern HGLRC hRC;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ HGLRC hRC;
|
||||||
|
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
DWORD WINAPI ThreadProc(LPVOID){
|
int Initialize(){
|
||||||
hDC = GetDC(Window::hWnd);
|
hDC = GetDC(Window::hWnd);
|
||||||
if(hDC == NULL){
|
if(hDC == NULL){
|
||||||
MessageBox(Window::hWnd, "Failed to obtain the device context.", NULL, MB_OK | MB_ICONERROR);
|
MessageBox(Window::hWnd, "Failed to obtain the device context.", NULL, MB_OK | MB_ICONERROR);
|
||||||
|
@ -39,7 +39,7 @@ DWORD WINAPI ThreadProc(LPVOID){
|
||||||
PFD_SUPPORT_OPENGL |
|
PFD_SUPPORT_OPENGL |
|
||||||
PFD_DOUBLEBUFFER,
|
PFD_DOUBLEBUFFER,
|
||||||
PFD_TYPE_RGBA, //iPixelType
|
PFD_TYPE_RGBA, //iPixelType
|
||||||
32, //cColorBits
|
24, //cColorBits
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, //R,G,B,A bits
|
0, 0, 0, 0, 0, 0, 0, 0, //R,G,B,A bits
|
||||||
0, 0, 0, 0, 0, //Accumulation buffer bits
|
0, 0, 0, 0, 0, //Accumulation buffer bits
|
||||||
16, //cDepthBits
|
16, //cDepthBits
|
||||||
|
@ -76,6 +76,11 @@ DWORD WINAPI ThreadProc(LPVOID){
|
||||||
return ERROR_GRAPHICS_ACTIVATE_GLRC;
|
return ERROR_GRAPHICS_ACTIVATE_GLRC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL (WINAPI *wglSwapIntervalEXT)(int) = (BOOL (WINAPI *)(int)) wglGetProcAddress("wglSwapIntervalEXT");
|
||||||
|
if(wglSwapIntervalEXT) wglSwapIntervalEXT(1);
|
||||||
|
int (WINAPI *wglGetSwapIntervalEXT)(void) = (int (WINAPI *)(void)) wglGetProcAddress("wglGetSwapIntervalEXT");
|
||||||
|
if(wglGetSwapIntervalEXT) wglGetSwapIntervalEXT(); //Seems necessary on some cards
|
||||||
|
|
||||||
int result = InitGL();
|
int result = InitGL();
|
||||||
if(result != 0){
|
if(result != 0){
|
||||||
Shutdown();
|
Shutdown();
|
||||||
|
@ -83,16 +88,6 @@ DWORD WINAPI ThreadProc(LPVOID){
|
||||||
}
|
}
|
||||||
|
|
||||||
ResizeViewport(Window::Width, Window::Height);
|
ResizeViewport(Window::Width, Window::Height);
|
||||||
|
|
||||||
ResetEvent(System::Terminated[HANDLE_GRAPHICS]);
|
|
||||||
SetEvent(System::Initialized[HANDLE_GRAPHICS]);
|
|
||||||
ShowWindow(Window::hWnd, SW_SHOW);
|
|
||||||
SetForegroundWindow(Window::hWnd);
|
|
||||||
SetFocus(Window::hWnd);
|
|
||||||
|
|
||||||
WaitForSingleObject(System::Shutdown, INFINITE);
|
|
||||||
|
|
||||||
Shutdown();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +105,6 @@ int InitGL(){
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown(){
|
void Shutdown(){
|
||||||
ShowWindowAsync(Window::hWnd, SW_HIDE);
|
|
||||||
if(Graphics::hRC){
|
if(Graphics::hRC){
|
||||||
wglMakeCurrent(NULL, NULL);
|
wglMakeCurrent(NULL, NULL);
|
||||||
wglDeleteContext(Graphics::hRC);
|
wglDeleteContext(Graphics::hRC);
|
||||||
|
@ -120,8 +114,6 @@ void Shutdown(){
|
||||||
ReleaseDC(Window::hWnd, Graphics::hDC);
|
ReleaseDC(Window::hWnd, Graphics::hDC);
|
||||||
Graphics::hDC = NULL;
|
Graphics::hDC = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEvent(System::Terminated[HANDLE_GRAPHICS]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -40,13 +40,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
System::Keys[wParam] = (uMsg == WM_KEYDOWN);
|
System::UserInput.Keys[wParam] = (uMsg == WM_KEYDOWN);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
|
case WM_DEVMODECHANGE: {
|
||||||
|
DEVMODE dm;
|
||||||
|
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);
|
||||||
|
System::FramePeriod = 1.0f/dm.dmDisplayFrequency;
|
||||||
|
} return 0;
|
||||||
|
|
||||||
|
}
|
||||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
|
@ -49,6 +49,9 @@ class LoginScreen : public Scene {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int Run(float){
|
int Run(float){
|
||||||
|
if(System::UserInput.CloseWindow){
|
||||||
|
System::Shutdown = true;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,14 +18,21 @@
|
||||||
#include "../EngineInterface.hpp"
|
#include "../EngineInterface.hpp"
|
||||||
|
|
||||||
namespace System {
|
namespace System {
|
||||||
|
bool Shutdown = false;
|
||||||
HINSTANCE hInst = NULL;
|
HINSTANCE hInst = NULL;
|
||||||
HANDLE Terminate;
|
|
||||||
HANDLE Process;
|
HANDLE Process;
|
||||||
HANDLE ProcessHeap;
|
HANDLE ProcessHeap;
|
||||||
LARGE_INTEGER ClockFrequency;
|
LARGE_INTEGER ClockFreq;
|
||||||
bool Keys[256];
|
float FramePeriod;
|
||||||
|
UserInput_t UserInput;
|
||||||
|
|
||||||
//Event objects
|
int Initialize(){
|
||||||
HANDLE Shutdown;
|
QueryPerformanceFrequency(&ClockFreq);
|
||||||
HANDLE Initialized[2], Terminated[2];
|
|
||||||
|
DEVMODE dm;
|
||||||
|
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);
|
||||||
|
System::FramePeriod = 1.0f/dm.dmDisplayFrequency;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -17,26 +17,28 @@
|
||||||
|
|
||||||
//System/System.cpp
|
//System/System.cpp
|
||||||
namespace System {
|
namespace System {
|
||||||
|
int Initialize();
|
||||||
|
extern bool Shutdown;
|
||||||
extern HINSTANCE hInst;
|
extern HINSTANCE hInst;
|
||||||
extern HANDLE Process;
|
extern HANDLE Process;
|
||||||
extern HANDLE ProcessHeap;
|
extern HANDLE ProcessHeap;
|
||||||
extern LARGE_INTEGER ClockFrequency;
|
extern LARGE_INTEGER ClockFreq;
|
||||||
|
extern float FramePeriod;
|
||||||
extern bool Keys[256];
|
extern bool Keys[256];
|
||||||
|
|
||||||
//Event objects
|
struct UserInput_t {
|
||||||
extern HANDLE Shutdown;
|
bool Keys[256];
|
||||||
extern HANDLE Initialized[2], Terminated[2];
|
bool MouseDown;
|
||||||
|
bool CloseWindow;
|
||||||
|
};
|
||||||
|
extern UserInput_t UserInput;
|
||||||
|
|
||||||
|
//Constants
|
||||||
enum {
|
enum {
|
||||||
SHUTDOWN
|
SHUTDOWN = 0
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
|
||||||
HANDLE_GRAPHICS,
|
|
||||||
HANDLE_AUDIO
|
|
||||||
};
|
|
||||||
|
|
||||||
/****
|
/****
|
||||||
** Program exit codes
|
** Program exit codes
|
||||||
** (Return 0 for success)
|
** (Return 0 for success)
|
||||||
|
@ -52,20 +54,23 @@ enum {
|
||||||
ERROR_REGISTER_CLASS = 1,
|
ERROR_REGISTER_CLASS = 1,
|
||||||
ERROR_CREATE_WINDOW
|
ERROR_CREATE_WINDOW
|
||||||
};
|
};
|
||||||
#define ERROR_INIT_GRAPHICS 0x0200
|
#define ERROR_INIT_SYSTEM 0x0200
|
||||||
|
#define ERROR_INIT_GRAPHICS 0x0300
|
||||||
enum {
|
enum {
|
||||||
ERROR_GRAPHICS_CREATE_THREAD = 1,
|
ERROR_GRAPHICS_OBTAIN_DC = 1,
|
||||||
ERROR_GRAPHICS_OBTAIN_DC,
|
|
||||||
ERROR_GRAPHICS_FIND_PIXELFORMAT,
|
ERROR_GRAPHICS_FIND_PIXELFORMAT,
|
||||||
ERROR_GRAPHICS_SET_PIXELFORMAT,
|
ERROR_GRAPHICS_SET_PIXELFORMAT,
|
||||||
ERROR_GRAPHICS_CREATE_GLRC,
|
ERROR_GRAPHICS_CREATE_GLRC,
|
||||||
ERROR_GRAPHICS_ACTIVATE_GLRC,
|
ERROR_GRAPHICS_ACTIVATE_GLRC,
|
||||||
ERROR_GRAPHICS_INIT_GLSCENE
|
ERROR_GRAPHICS_INIT_GLSCENE
|
||||||
};
|
};
|
||||||
#define ERROR_INIT_AUDIO 0x0300
|
#define ERROR_INIT_AUDIO 0x0400
|
||||||
enum {
|
enum {
|
||||||
ERROR_AUDIO_INIT_COM = 1,
|
ERROR_AUDIO_INIT_COM = 1,
|
||||||
ERROR_AUDIO_INIT_XAUDIO2,
|
ERROR_AUDIO_INIT_XAUDIO2,
|
||||||
ERROR_AUDIO_CREATE_VOICE
|
ERROR_AUDIO_CREATE_VOICE
|
||||||
};
|
};
|
||||||
#define ERROR_INIT_LOGIC 0x0400
|
#define ERROR_INIT_LOGIC 0x0500
|
||||||
|
enum {
|
||||||
|
ERROR_LOGIC_CREATE_SCENE = 1
|
||||||
|
};
|
Loading…
Add table
Reference in a new issue