mirror of https://github.com/skeeto/pixelcity.git
Unified windows Procs to eliminate redundant code. New dev keyboard camera controls. Screensaver now timer-based instead of waiting for WM_PAINT.
This commit is contained in:
parent
0c5876b90d
commit
fd21a23081
34
Render.cpp
34
Render.cpp
|
@ -454,6 +454,20 @@ void static do_help (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void do_fps ()
|
||||||
|
{
|
||||||
|
|
||||||
|
LIMIT_INTERVAL (1000);
|
||||||
|
current_fps = frames;
|
||||||
|
frames = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
@ -708,12 +722,13 @@ void RenderUpdate (void)
|
||||||
GLvector angle;
|
GLvector angle;
|
||||||
GLrgba color;
|
GLrgba color;
|
||||||
|
|
||||||
|
frames++;
|
||||||
|
do_fps ();
|
||||||
glViewport (0, 0, WinWidth (), WinHeight ());
|
glViewport (0, 0, WinWidth (), WinHeight ());
|
||||||
glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
|
glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
if (letterbox)
|
if (letterbox)
|
||||||
glViewport (0, letterbox_offset, render_width, render_height);
|
glViewport (0, letterbox_offset, render_width, render_height);
|
||||||
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
if (TextureReady () && !EntityReady ()) {
|
if (TextureReady () && !EntityReady ()) {
|
||||||
do_effects (-1);
|
do_effects (-1);
|
||||||
SwapBuffers (hDC);
|
SwapBuffers (hDC);
|
||||||
|
@ -776,23 +791,18 @@ void RenderUpdate (void)
|
||||||
}
|
}
|
||||||
do_effects (effect);
|
do_effects (effect);
|
||||||
//Framerate tracker
|
//Framerate tracker
|
||||||
if (GetTickCount () > next_fps) {
|
|
||||||
current_fps = frames;
|
|
||||||
frames = 0;
|
|
||||||
next_fps = GetTickCount () + 1000;
|
|
||||||
}
|
|
||||||
if (show_fps && !show_help) {
|
if (show_fps && !show_help) {
|
||||||
RenderPrint (1, "FPS=%d", current_fps);
|
RenderPrint (2, "FPS=%d", current_fps);
|
||||||
RenderPrint (2, "Entities=%d", EntityCount () + LightCount () + CarCount ());
|
RenderPrint (3, "Entities=%d", EntityCount () + LightCount () + CarCount ());
|
||||||
RenderPrint (3, "Lights=%d", LightCount ());
|
RenderPrint (4, "Lights=%d", LightCount ());
|
||||||
RenderPrint (4, "Polys=%d", EntityPolyCount () + LightCount () + CarCount ());
|
RenderPrint (5, "Polys=%d", EntityPolyCount () + LightCount () + CarCount ());
|
||||||
RenderPrint (5, "Building=%1.2f", EntityProgress () * 100);
|
RenderPrint (6, "Building=%1.2f", EntityProgress () * 100);
|
||||||
|
RenderPrint (7, "%d", GetTickCount ());
|
||||||
}
|
}
|
||||||
//Show the help overlay
|
//Show the help overlay
|
||||||
if (show_help)
|
if (show_help)
|
||||||
do_help ();
|
do_help ();
|
||||||
glDepthMask (true);
|
glDepthMask (true);
|
||||||
frames++;
|
|
||||||
SwapBuffers (hDC);
|
SwapBuffers (hDC);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
674
Win.cpp
674
Win.cpp
|
@ -34,11 +34,14 @@
|
||||||
#include "visible.h"
|
#include "visible.h"
|
||||||
|
|
||||||
#pragma comment (lib, "opengl32.lib")
|
#pragma comment (lib, "opengl32.lib")
|
||||||
|
#pragma comment (lib, "winmm.lib")
|
||||||
#pragma comment (lib, "glu32.lib")
|
#pragma comment (lib, "glu32.lib")
|
||||||
#if SCREENSAVER
|
#if SCREENSAVER
|
||||||
#pragma comment (lib, "scrnsave.lib")
|
#pragma comment (lib, "scrnsave.lib")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static HWND hwnd;
|
static HWND hwnd;
|
||||||
static HINSTANCE module;
|
static HINSTANCE module;
|
||||||
static int width;
|
static int width;
|
||||||
|
@ -53,6 +56,8 @@ static POINT mouse_pos;
|
||||||
static bool quit;
|
static bool quit;
|
||||||
static HINSTANCE instance;
|
static HINSTANCE instance;
|
||||||
|
|
||||||
|
LONG WINAPI ScreenSaverProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
@ -93,141 +98,6 @@ static void MoveCursor (int x, int y)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
RECT r;
|
|
||||||
float delta_x, delta_y;
|
|
||||||
POINT p;
|
|
||||||
int param;
|
|
||||||
int key;
|
|
||||||
|
|
||||||
switch (message) {
|
|
||||||
case WM_SIZE:
|
|
||||||
param = wParam; // resizing flag
|
|
||||||
width = LOWORD(lParam); // width of client area
|
|
||||||
height = HIWORD(lParam); // height of client area
|
|
||||||
|
|
||||||
if (param == SIZE_RESTORED)
|
|
||||||
IniIntSet ("WindowMaximized", 0);
|
|
||||||
if (param == SIZE_MAXIMIZED) {
|
|
||||||
IniIntSet ("WindowMaximized", 1);
|
|
||||||
} else {
|
|
||||||
IniIntSet ("WindowWidth", width);
|
|
||||||
IniIntSet ("WindowHeight", height);
|
|
||||||
}
|
|
||||||
RenderResize ();
|
|
||||||
return 0;
|
|
||||||
case WM_MOVE:
|
|
||||||
GetClientRect (hwnd, &r);
|
|
||||||
height = r.bottom - r.top;
|
|
||||||
width = r.right - r.left;
|
|
||||||
IniIntSet ("WindowX", r.left);
|
|
||||||
IniIntSet ("WindowY", r.top);
|
|
||||||
IniIntSet ("WindowWidth", width);
|
|
||||||
IniIntSet ("WindowHeight", height);
|
|
||||||
half_width = width / 2;
|
|
||||||
half_height = height / 2;
|
|
||||||
break;
|
|
||||||
case WM_KEYDOWN:
|
|
||||||
key = (int) wParam;
|
|
||||||
|
|
||||||
if (key == 'R')
|
|
||||||
WorldReset ();
|
|
||||||
if (key == 'C')
|
|
||||||
CameraAutoToggle ();
|
|
||||||
if (key == 'W')
|
|
||||||
RenderWireframeToggle ();
|
|
||||||
if (key == 'E')
|
|
||||||
RenderEffectCycle ();
|
|
||||||
if (key == 'L')
|
|
||||||
RenderLetterboxToggle ();
|
|
||||||
if (key == 'F')
|
|
||||||
RenderFPSToggle ();
|
|
||||||
if (key == 'G')
|
|
||||||
RenderFogToggle ();
|
|
||||||
if (key == 'T')
|
|
||||||
RenderFlatToggle ();
|
|
||||||
if (key == VK_F1)
|
|
||||||
RenderHelpToggle ();
|
|
||||||
if (key == 'B')
|
|
||||||
CameraNextBehavior ();
|
|
||||||
if (key == VK_ESCAPE)
|
|
||||||
quit = true;
|
|
||||||
if (key == VK_F5)
|
|
||||||
CameraReset ();
|
|
||||||
return 0;
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
lmb = true;
|
|
||||||
SetCapture (hwnd);
|
|
||||||
break;
|
|
||||||
case WM_RBUTTONDOWN:
|
|
||||||
rmb = true;
|
|
||||||
SetCapture (hwnd);
|
|
||||||
break;
|
|
||||||
case WM_LBUTTONUP:
|
|
||||||
lmb = false;
|
|
||||||
if (!rmb) {
|
|
||||||
ReleaseCapture ();
|
|
||||||
MoveCursor (select_pos.x, select_pos.y);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_RBUTTONUP:
|
|
||||||
rmb = false;
|
|
||||||
if (!lmb) {
|
|
||||||
ReleaseCapture ();
|
|
||||||
MoveCursor (select_pos.x, select_pos.y);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
p.x = LOWORD(lParam); // horizontal position of cursor
|
|
||||||
p.y = HIWORD(lParam); // vertical position of cursor
|
|
||||||
if (p.x < 0 || p.x > width)
|
|
||||||
break;
|
|
||||||
if (p.y < 0 || p.y > height)
|
|
||||||
break;
|
|
||||||
if (!mouse_forced && !lmb && !rmb) {
|
|
||||||
select_pos = p;
|
|
||||||
}
|
|
||||||
if (mouse_forced) {
|
|
||||||
mouse_forced = false;
|
|
||||||
} else if (rmb || lmb) {
|
|
||||||
CenterCursor ();
|
|
||||||
delta_x = (float)(mouse_pos.x - p.x) * MOUSE_MOVEMENT;
|
|
||||||
delta_y = (float)(mouse_pos.y - p.y) * MOUSE_MOVEMENT;
|
|
||||||
if (rmb && lmb) {
|
|
||||||
GLvector pos;
|
|
||||||
CameraPan (delta_x);
|
|
||||||
pos = CameraPosition ();
|
|
||||||
pos.y += delta_y;
|
|
||||||
CameraPositionSet (pos);
|
|
||||||
} else if (rmb) {
|
|
||||||
CameraPan (delta_x);
|
|
||||||
CameraForward (delta_y);
|
|
||||||
} else if (lmb) {
|
|
||||||
GLvector angle;
|
|
||||||
angle = CameraAngle ();
|
|
||||||
angle.y -= delta_x;
|
|
||||||
angle.x += delta_y;
|
|
||||||
CameraAngleSet (angle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mouse_pos = p;
|
|
||||||
break;
|
|
||||||
case WM_CLOSE:
|
|
||||||
quit = true;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
/*-----------------------------------------------------------------------------
|
||||||
n o t e
|
n o t e
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
@ -303,6 +173,296 @@ HWND WinHwnd (void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void AppQuit ()
|
||||||
|
{
|
||||||
|
|
||||||
|
quit = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void AppUpdate ()
|
||||||
|
{
|
||||||
|
|
||||||
|
CameraUpdate ();
|
||||||
|
WorldUpdate ();
|
||||||
|
TextureUpdate ();
|
||||||
|
VisibleUpdate ();
|
||||||
|
CarUpdate ();
|
||||||
|
EntityUpdate ();
|
||||||
|
RenderUpdate ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void CALLBACK Appx (HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
|
||||||
|
{
|
||||||
|
|
||||||
|
static int ii;
|
||||||
|
//for (int i = 0; i < 1000;i++)
|
||||||
|
AppUpdate ();
|
||||||
|
ii++;
|
||||||
|
if (ii > 1)
|
||||||
|
ii++;
|
||||||
|
//PostQuitMessage (1);
|
||||||
|
//exit (1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_timer ()
|
||||||
|
{
|
||||||
|
|
||||||
|
TIMECAPS tc;
|
||||||
|
int resolution;
|
||||||
|
|
||||||
|
if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) {
|
||||||
|
resolution = 0;
|
||||||
|
}
|
||||||
|
resolution = min(max(tc.wPeriodMin, 1), tc.wPeriodMax);
|
||||||
|
if (!timeSetEvent (1, resolution,(LPTIMECALLBACK)Appx, 123, TIME_PERIODIC | TIME_CALLBACK_FUNCTION ))
|
||||||
|
resolution = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void AppInit (void)
|
||||||
|
{
|
||||||
|
|
||||||
|
RandomInit (time (NULL));
|
||||||
|
CameraInit ();
|
||||||
|
RenderInit ();
|
||||||
|
TextureInit ();
|
||||||
|
WorldInit ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
W i n M a i n
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void AppTerm (void)
|
||||||
|
{
|
||||||
|
|
||||||
|
TextureTerm ();
|
||||||
|
WorldTerm ();
|
||||||
|
RenderTerm ();
|
||||||
|
CameraTerm ();
|
||||||
|
WinTerm ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
W i n M a i n
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
#if !SCREENSAVER
|
||||||
|
|
||||||
|
int PASCAL WinMain (HINSTANCE instance_in, HINSTANCE previous_instance,
|
||||||
|
LPSTR command_line, int show_style)
|
||||||
|
{
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
|
||||||
|
instance = instance_in;
|
||||||
|
WinInit ();
|
||||||
|
AppInit ();
|
||||||
|
while (!quit) {
|
||||||
|
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||||
|
if (msg.message == WM_QUIT)
|
||||||
|
quit = true;
|
||||||
|
else {
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
AppUpdate ();
|
||||||
|
|
||||||
|
}
|
||||||
|
AppTerm ();
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { return FALSE; }
|
||||||
|
BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { return TRUE; }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LONG WINAPI ScreenSaverProc(HWND hwnd_in,UINT message,WPARAM wparam,LPARAM lparam)
|
||||||
|
{
|
||||||
|
|
||||||
|
RECT r;
|
||||||
|
int key;
|
||||||
|
float delta_x, delta_y;
|
||||||
|
POINT p;
|
||||||
|
|
||||||
|
// Handles screen saver messages
|
||||||
|
switch(message)
|
||||||
|
{
|
||||||
|
case WM_SIZE:
|
||||||
|
width = LOWORD(lparam); // width of client area
|
||||||
|
height = HIWORD(lparam); // height of client area
|
||||||
|
if (wparam == SIZE_MAXIMIZED) {
|
||||||
|
IniIntSet ("WindowMaximized", 1);
|
||||||
|
} else {
|
||||||
|
IniIntSet ("WindowWidth", width);
|
||||||
|
IniIntSet ("WindowHeight", height);
|
||||||
|
IniIntSet ("WindowMaximized", 0);
|
||||||
|
}
|
||||||
|
RenderResize ();
|
||||||
|
break;
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
key = (int) wparam;
|
||||||
|
if (key == 'R')
|
||||||
|
WorldReset ();
|
||||||
|
else if (key == 'W')
|
||||||
|
RenderWireframeToggle ();
|
||||||
|
else if (key == 'E')
|
||||||
|
RenderEffectCycle ();
|
||||||
|
else if (key == 'L')
|
||||||
|
RenderLetterboxToggle ();
|
||||||
|
else if (key == 'F')
|
||||||
|
RenderFPSToggle ();
|
||||||
|
else if (key == 'G')
|
||||||
|
RenderFogToggle ();
|
||||||
|
else if (key == 'T')
|
||||||
|
RenderFlatToggle ();
|
||||||
|
else if (key == VK_F1)
|
||||||
|
RenderHelpToggle ();
|
||||||
|
else if (key == VK_ESCAPE)
|
||||||
|
break;
|
||||||
|
else if (!SCREENSAVER) {
|
||||||
|
//Dev mode keys
|
||||||
|
if (key == 'C')
|
||||||
|
CameraAutoToggle ();
|
||||||
|
if (key == 'B')
|
||||||
|
CameraNextBehavior ();
|
||||||
|
if (key == VK_F5)
|
||||||
|
CameraReset ();
|
||||||
|
if (key == VK_UP)
|
||||||
|
CameraMedial (1.0f);
|
||||||
|
if (key == VK_DOWN)
|
||||||
|
CameraMedial (-1.0f);
|
||||||
|
if (key == VK_LEFT)
|
||||||
|
CameraLateral (1.0f);
|
||||||
|
if (key == VK_RIGHT)
|
||||||
|
CameraLateral (-1.0f);
|
||||||
|
if (key == VK_PRIOR)
|
||||||
|
CameraVertical (1.0f);
|
||||||
|
if (key == VK_NEXT)
|
||||||
|
CameraVertical (-1.0f);
|
||||||
|
if (key == VK_F5)
|
||||||
|
CameraReset ();
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
return 0;
|
||||||
|
case WM_MOVE:
|
||||||
|
GetClientRect (hwnd, &r);
|
||||||
|
height = r.bottom - r.top;
|
||||||
|
width = r.right - r.left;
|
||||||
|
IniIntSet ("WindowX", r.left);
|
||||||
|
IniIntSet ("WindowY", r.top);
|
||||||
|
IniIntSet ("WindowWidth", width);
|
||||||
|
IniIntSet ("WindowHeight", height);
|
||||||
|
half_width = width / 2;
|
||||||
|
half_height = height / 2;
|
||||||
|
return 0;
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
lmb = true;
|
||||||
|
SetCapture (hwnd);
|
||||||
|
break;
|
||||||
|
case WM_RBUTTONDOWN:
|
||||||
|
rmb = true;
|
||||||
|
SetCapture (hwnd);
|
||||||
|
break;
|
||||||
|
case WM_LBUTTONUP:
|
||||||
|
lmb = false;
|
||||||
|
if (!rmb) {
|
||||||
|
ReleaseCapture ();
|
||||||
|
MoveCursor (select_pos.x, select_pos.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_RBUTTONUP:
|
||||||
|
rmb = false;
|
||||||
|
if (!lmb) {
|
||||||
|
ReleaseCapture ();
|
||||||
|
MoveCursor (select_pos.x, select_pos.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
p.x = LOWORD(lparam); // horizontal position of cursor
|
||||||
|
p.y = HIWORD(lparam); // vertical position of cursor
|
||||||
|
if (p.x < 0 || p.x > width)
|
||||||
|
break;
|
||||||
|
if (p.y < 0 || p.y > height)
|
||||||
|
break;
|
||||||
|
if (!mouse_forced && !lmb && !rmb) {
|
||||||
|
select_pos = p;
|
||||||
|
}
|
||||||
|
if (mouse_forced) {
|
||||||
|
mouse_forced = false;
|
||||||
|
} else if (rmb || lmb) {
|
||||||
|
CenterCursor ();
|
||||||
|
delta_x = (float)(mouse_pos.x - p.x) * MOUSE_MOVEMENT;
|
||||||
|
delta_y = (float)(mouse_pos.y - p.y) * MOUSE_MOVEMENT;
|
||||||
|
if (rmb && lmb) {
|
||||||
|
GLvector pos;
|
||||||
|
CameraPan (delta_x);
|
||||||
|
pos = CameraPosition ();
|
||||||
|
pos.y += delta_y;
|
||||||
|
CameraPositionSet (pos);
|
||||||
|
} else if (rmb) {
|
||||||
|
CameraPan (delta_x);
|
||||||
|
CameraForward (delta_y);
|
||||||
|
} else if (lmb) {
|
||||||
|
GLvector angle;
|
||||||
|
angle = CameraAngle ();
|
||||||
|
angle.y -= delta_x;
|
||||||
|
angle.x += delta_y;
|
||||||
|
CameraAngleSet (angle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mouse_pos = p;
|
||||||
|
break;
|
||||||
|
case WM_CREATE:
|
||||||
|
hwnd = hwnd_in;
|
||||||
|
AppInit ();
|
||||||
|
SetTimer (hwnd, 1, 7, NULL);
|
||||||
|
return 0;
|
||||||
|
case WM_TIMER:
|
||||||
|
AppUpdate ();
|
||||||
|
return 0;
|
||||||
|
case WM_DESTROY:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#if SCREENSAVER
|
||||||
|
return DefScreenSaverProc(hwnd_in,message,wparam,lparam);
|
||||||
|
#else
|
||||||
|
return DefWindowProc (hwnd_in,message,wparam,lparam);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
@ -317,7 +477,7 @@ bool WinInit (void)
|
||||||
|
|
||||||
wcex.cbSize = sizeof(WNDCLASSEX);
|
wcex.cbSize = sizeof(WNDCLASSEX);
|
||||||
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
wcex.lpfnWndProc = (WNDPROC)WndProc;
|
wcex.lpfnWndProc = (WNDPROC)ScreenSaverProc;
|
||||||
wcex.cbClsExtra = 0;
|
wcex.cbClsExtra = 0;
|
||||||
wcex.cbWndExtra = 0;
|
wcex.cbWndExtra = 0;
|
||||||
wcex.hInstance = instance;
|
wcex.hInstance = instance;
|
||||||
|
@ -354,244 +514,4 @@ bool WinInit (void)
|
||||||
UpdateWindow (hwnd);
|
UpdateWindow (hwnd);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void AppQuit ()
|
|
||||||
{
|
|
||||||
|
|
||||||
quit = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void AppInit (void)
|
|
||||||
{
|
|
||||||
|
|
||||||
RandomInit (time (NULL));
|
|
||||||
CameraInit ();
|
|
||||||
RenderInit ();
|
|
||||||
TextureInit ();
|
|
||||||
WorldInit ();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void AppUpdate ()
|
|
||||||
{
|
|
||||||
|
|
||||||
CameraUpdate ();
|
|
||||||
WorldUpdate ();
|
|
||||||
TextureUpdate ();
|
|
||||||
WorldUpdate ();
|
|
||||||
VisibleUpdate ();
|
|
||||||
CarUpdate ();
|
|
||||||
EntityUpdate ();
|
|
||||||
WorldUpdate ();
|
|
||||||
RenderUpdate ();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
|
||||||
W i n M a i n
|
|
||||||
-----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void AppTerm (void)
|
|
||||||
{
|
|
||||||
|
|
||||||
TextureTerm ();
|
|
||||||
WorldTerm ();
|
|
||||||
RenderTerm ();
|
|
||||||
CameraTerm ();
|
|
||||||
WinTerm ();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
|
||||||
W i n M a i n
|
|
||||||
-----------------------------------------------------------------------------*/
|
|
||||||
#if !SCREENSAVER
|
|
||||||
|
|
||||||
int PASCAL WinMain (HINSTANCE instance_in, HINSTANCE previous_instance,
|
|
||||||
LPSTR command_line, int show_style)
|
|
||||||
{
|
|
||||||
|
|
||||||
MSG msg;
|
|
||||||
|
|
||||||
instance = instance_in;
|
|
||||||
WinInit ();
|
|
||||||
AppInit ();
|
|
||||||
while (!quit) {
|
|
||||||
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
|
|
||||||
if (msg.message == WM_QUIT)
|
|
||||||
quit = true;
|
|
||||||
else {
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessage(&msg);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
AppUpdate ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AppTerm ();
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static bool terminated;
|
|
||||||
|
|
||||||
LONG WINAPI ScreenSaverProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
|
|
||||||
RECT r;
|
|
||||||
float delta_x, delta_y;
|
|
||||||
POINT p;
|
|
||||||
int param;
|
|
||||||
int key;
|
|
||||||
|
|
||||||
if (terminated)
|
|
||||||
return DefScreenSaverProc (hWnd, msg, wParam, lParam);
|
|
||||||
switch (msg) {
|
|
||||||
case WM_CREATE:
|
|
||||||
hwnd = hWnd;
|
|
||||||
AppInit ();
|
|
||||||
return 0;
|
|
||||||
case WM_CLOSE:
|
|
||||||
case WM_DESTROY:
|
|
||||||
AppTerm ();
|
|
||||||
terminated = true;
|
|
||||||
return 0;
|
|
||||||
case WM_PAINT:
|
|
||||||
AppUpdate ();
|
|
||||||
return 0;
|
|
||||||
case WM_MOVE:
|
|
||||||
case WM_SIZE:
|
|
||||||
param = wParam; // resizing flag
|
|
||||||
width = LOWORD(lParam); // width of client area
|
|
||||||
height = HIWORD(lParam); // height of client area
|
|
||||||
|
|
||||||
if (param == SIZE_MAXIMIZED) {
|
|
||||||
IniIntSet ("WindowMaximized", 1);
|
|
||||||
} else {
|
|
||||||
IniIntSet ("WindowWidth", width);
|
|
||||||
IniIntSet ("WindowHeight", height);
|
|
||||||
}
|
|
||||||
RenderResize ();
|
|
||||||
return 0;
|
|
||||||
case WM_MOVE:
|
|
||||||
GetClientRect (hwnd, &r);
|
|
||||||
height = r.bottom - r.top;
|
|
||||||
width = r.right - r.left;
|
|
||||||
IniIntSet ("WindowX", r.left);
|
|
||||||
IniIntSet ("WindowY", r.top);
|
|
||||||
IniIntSet ("WindowWidth", width);
|
|
||||||
IniIntSet ("WindowHeight", height);
|
|
||||||
half_width = width / 2;
|
|
||||||
half_height = height / 2;
|
|
||||||
break;
|
|
||||||
case WM_KEYDOWN:
|
|
||||||
key = (int) wParam;
|
|
||||||
|
|
||||||
if (key == 'R')
|
|
||||||
WorldReset ();
|
|
||||||
else if (key == 'C')
|
|
||||||
CameraAutoToggle ();
|
|
||||||
else if (key == 'W')
|
|
||||||
RenderWireframeToggle ();
|
|
||||||
else if (key == 'E')
|
|
||||||
RenderEffectCycle ();
|
|
||||||
else if (key == 'L')
|
|
||||||
RenderLetterboxToggle ();
|
|
||||||
else if (key == 'F')
|
|
||||||
RenderFPSToggle ();
|
|
||||||
else if (key == 'G')
|
|
||||||
RenderFogToggle ();
|
|
||||||
else if (key == 'T')
|
|
||||||
RenderFlatToggle ();
|
|
||||||
else if (key == VK_F1)
|
|
||||||
RenderHelpToggle ();
|
|
||||||
else if (key == VK_ESCAPE)
|
|
||||||
break;
|
|
||||||
else if (key == VK_F5)
|
|
||||||
CameraReset ();
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
return 0;
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
lmb = true;
|
|
||||||
SetCapture (hwnd);
|
|
||||||
break;
|
|
||||||
case WM_RBUTTONDOWN:
|
|
||||||
rmb = true;
|
|
||||||
SetCapture (hwnd);
|
|
||||||
break;
|
|
||||||
case WM_LBUTTONUP:
|
|
||||||
lmb = false;
|
|
||||||
if (!rmb) {
|
|
||||||
ReleaseCapture ();
|
|
||||||
MoveCursor (select_pos.x, select_pos.y);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_RBUTTONUP:
|
|
||||||
rmb = false;
|
|
||||||
if (!lmb) {
|
|
||||||
ReleaseCapture ();
|
|
||||||
MoveCursor (select_pos.x, select_pos.y);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
p.x = LOWORD(lParam); // horizontal position of cursor
|
|
||||||
p.y = HIWORD(lParam); // vertical position of cursor
|
|
||||||
if (p.x < 0 || p.x > width)
|
|
||||||
break;
|
|
||||||
if (p.y < 0 || p.y > height)
|
|
||||||
break;
|
|
||||||
if (!mouse_forced && !lmb && !rmb) {
|
|
||||||
select_pos = p;
|
|
||||||
}
|
|
||||||
if (mouse_forced) {
|
|
||||||
mouse_forced = false;
|
|
||||||
} else if (rmb || lmb) {
|
|
||||||
CenterCursor ();
|
|
||||||
delta_x = (float)(mouse_pos.x - p.x) * MOUSE_MOVEMENT;
|
|
||||||
delta_y = (float)(mouse_pos.y - p.y) * MOUSE_MOVEMENT;
|
|
||||||
if (rmb && lmb) {
|
|
||||||
GLvector pos;
|
|
||||||
CameraPan (delta_x);
|
|
||||||
pos = CameraPosition ();
|
|
||||||
pos.y += delta_y;
|
|
||||||
CameraPositionSet (pos);
|
|
||||||
} else if (rmb) {
|
|
||||||
CameraPan (delta_x);
|
|
||||||
CameraForward (delta_y);
|
|
||||||
} else if (lmb) {
|
|
||||||
GLvector angle;
|
|
||||||
angle = CameraAngle ();
|
|
||||||
angle.y -= delta_x;
|
|
||||||
angle.x += delta_y;
|
|
||||||
CameraAngleSet (angle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mouse_pos = p;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return DefScreenSaverProc (hWnd, msg, wParam, lParam);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { return FALSE; }
|
|
||||||
BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { return TRUE; }
|
|
||||||
|
|
||||||
#endif
|
|
4
Win.h
4
Win.h
|
@ -5,9 +5,9 @@
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 5
|
#define VERSION_REVISION 5
|
||||||
//Best to disable screensaver mode when working on the program.
|
//Best to disable screensaver mode when working on the program.
|
||||||
#define SCREENSAVER 1
|
#define SCREENSAVER 0
|
||||||
//Controls the density of cars.
|
//Controls the density of cars.
|
||||||
#define CARS 500
|
#define CARS 0
|
||||||
//The "dead zone" along the edge of the world, with super-low detail.
|
//The "dead zone" along the edge of the world, with super-low detail.
|
||||||
#define WORLD_EDGE 200
|
#define WORLD_EDGE 200
|
||||||
//How often to rebuild the city
|
//How often to rebuild the city
|
||||||
|
|
24
World.cpp
24
World.cpp
|
@ -110,8 +110,8 @@ static int blocky_count;
|
||||||
static bool reset_needed;
|
static bool reset_needed;
|
||||||
static int skyscrapers;
|
static int skyscrapers;
|
||||||
static GLbbox hot_zone;
|
static GLbbox hot_zone;
|
||||||
static unsigned start_time;
|
|
||||||
static int logo_index;
|
static int logo_index;
|
||||||
|
static unsigned start_time;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -271,8 +271,9 @@ void do_building (plot p)
|
||||||
if (p.width < 10 || p.depth < 10)
|
if (p.width < 10 || p.depth < 10)
|
||||||
return;
|
return;
|
||||||
//If the area is too big for one building, sub-divide it.
|
//If the area is too big for one building, sub-divide it.
|
||||||
if (area > 600) {
|
|
||||||
if (p.width > p.depth) {
|
if (area > 1400) {
|
||||||
|
if (COIN_FLIP) {
|
||||||
p.width /= 2;
|
p.width /= 2;
|
||||||
if (COIN_FLIP)
|
if (COIN_FLIP)
|
||||||
do_building (make_plot (p.x, p.z, p.width, p.depth));
|
do_building (make_plot (p.x, p.z, p.width, p.depth));
|
||||||
|
@ -294,6 +295,7 @@ void do_building (plot p)
|
||||||
square = abs (p.width - p.depth) < 10;
|
square = abs (p.width - p.depth) < 10;
|
||||||
//mark the land as used so other buildings don't appear here, even if we don't use it all.
|
//mark the land as used so other buildings don't appear here, even if we don't use it all.
|
||||||
claim (p.x, p.z, p.width, p.depth, CLAIM_BUILDING);
|
claim (p.x, p.z, p.width, p.depth, CLAIM_BUILDING);
|
||||||
|
/*
|
||||||
//The roundy mod buildings look best on square plots.
|
//The roundy mod buildings look best on square plots.
|
||||||
if (square && p.width > 20) {
|
if (square && p.width > 20) {
|
||||||
height = 45 + RandomVal (10);
|
height = 45 + RandomVal (10);
|
||||||
|
@ -302,6 +304,16 @@ void do_building (plot p)
|
||||||
new CBuilding (BUILDING_MODERN, p.x, p.z, height, p.width, p.depth, seed, color);
|
new CBuilding (BUILDING_MODERN, p.x, p.z, height, p.width, p.depth, seed, color);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
//Rectangular plots are a good place for Blocky style buildsing to sprawl blockily.
|
||||||
|
if (p.width > p.depth * 2 || p.depth > p.width * 2 && area > 800) {
|
||||||
|
height = 20 + RandomVal (10);
|
||||||
|
blocky_count++;
|
||||||
|
skyscrapers++;
|
||||||
|
new CBuilding (BUILDING_BLOCKY, p.x, p.z, height, p.width, p.depth, seed, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
tower_count = -1;
|
||||||
//This spot isn't ideal for any particular building, but try to keep a good mix
|
//This spot isn't ideal for any particular building, but try to keep a good mix
|
||||||
if (tower_count < modern_count && tower_count < blocky_count) {
|
if (tower_count < modern_count && tower_count < blocky_count) {
|
||||||
type = BUILDING_TOWER;
|
type = BUILDING_TOWER;
|
||||||
|
@ -408,7 +420,7 @@ static void do_reset (void)
|
||||||
bloom_color = get_light_color(0.5f + (float)RandomVal (10) / 20.0f, 0.75f);
|
bloom_color = get_light_color(0.5f + (float)RandomVal (10) / 20.0f, 0.75f);
|
||||||
light_color = glRgbaFromHsl (0.11f, 1.0f, 0.65f);
|
light_color = glRgbaFromHsl (0.11f, 1.0f, 0.65f);
|
||||||
ZeroMemory (world, WORLD_SIZE * WORLD_SIZE);
|
ZeroMemory (world, WORLD_SIZE * WORLD_SIZE);
|
||||||
for (y = WORLD_EDGE; y < WORLD_SIZE - WORLD_EDGE; y += RandomVal (30) + 20) {
|
for (y = WORLD_EDGE; y < WORLD_SIZE - WORLD_EDGE; y += RandomVal (25) + 25) {
|
||||||
if (!broadway_done && y > WORLD_HALF - 20) {
|
if (!broadway_done && y > WORLD_HALF - 20) {
|
||||||
build_road (0, y, WORLD_SIZE, 19);
|
build_road (0, y, WORLD_SIZE, 19);
|
||||||
y += 20;
|
y += 20;
|
||||||
|
@ -424,7 +436,7 @@ static void do_reset (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
broadway_done = false;
|
broadway_done = false;
|
||||||
for (x = WORLD_EDGE; x < WORLD_SIZE - WORLD_EDGE; x += RandomVal (30) + 20) {
|
for (x = WORLD_EDGE; x < WORLD_SIZE - WORLD_EDGE; x += RandomVal (25) + 25) {
|
||||||
if (!broadway_done && x > WORLD_HALF - 20) {
|
if (!broadway_done && x > WORLD_HALF - 20) {
|
||||||
build_road (x, 0, 19, WORLD_SIZE);
|
build_road (x, 0, 19, WORLD_SIZE);
|
||||||
x += 20;
|
x += 20;
|
||||||
|
@ -485,6 +497,7 @@ static void do_reset (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Scan over the center area of the map and place the big buildings
|
//Scan over the center area of the map and place the big buildings
|
||||||
attempts = 0;
|
attempts = 0;
|
||||||
while (skyscrapers < 50 && attempts < 350) {
|
while (skyscrapers < 50 && attempts < 350) {
|
||||||
|
@ -496,6 +509,7 @@ static void do_reset (void)
|
||||||
}
|
}
|
||||||
attempts++;
|
attempts++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//now blanket the rest of the world with lesser buildings
|
//now blanket the rest of the world with lesser buildings
|
||||||
for (x = 0; x < WORLD_SIZE; x ++) {
|
for (x = 0; x < WORLD_SIZE; x ++) {
|
||||||
for (y = 0; y < WORLD_SIZE; y ++) {
|
for (y = 0; y < WORLD_SIZE; y ++) {
|
||||||
|
|
Loading…
Reference in New Issue