Newer
Older
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Nicolas Casalini "DarkGod"
darkgod@te4.org
*/
#include "display.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <sys/time.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include "luasocket.h"
#include "luasocket/mime.h"
neil
committed
#include "lua_externs.h"
#include "physfsrwops.h"
dg
committed
SDL_Window *window = NULL;
SDL_GLContext maincontext; /* Our opengl context handle */
int nb_cpus;
bool tickPaused = FALSE;
int mouse_cursor_tex = 0, mouse_cursor_tex_ref = LUA_NOREF;
int mouse_cursor_down_tex = 0, mouse_cursor_down_tex_ref = LUA_NOREF;
int mouse_cursor_ox = 0, mouse_cursor_oy = 0;
int mousex = 0, mousey = 0;
SDL_TimerID display_timer_id = NULL;
SDL_TimerID realtime_timer_id = NULL;
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* Error handling */
lua_err_type *last_lua_error_head = NULL, *last_lua_error_tail = NULL;
void del_lua_error()
{
lua_err_type *cur = last_lua_error_head;
while (cur)
{
if (cur->err_msg) free(cur->err_msg);
if (cur->file) free(cur->file);
if (cur->func) free(cur->func);
lua_err_type *ocur = cur;
cur = cur->next;
free(ocur);
}
last_lua_error_head = NULL;
last_lua_error_tail = NULL;
}
static void new_lua_error(const char *err)
{
del_lua_error();
lua_err_type *cur = calloc(1, sizeof(lua_err_type));
cur->err_msg = strdup(err);
cur->next = NULL;
last_lua_error_head = cur;
last_lua_error_tail = cur;
}
static void add_lua_error(const char *file, int line, const char *func)
{
lua_err_type *cur = calloc(1, sizeof(lua_err_type));
cur->err_msg = NULL;
cur->file = strdup(file);
cur->line = line;
cur->func = strdup(func);
cur->next = NULL;
last_lua_error_tail->next = cur;
last_lua_error_tail = cur;
}
printf("Lua Error: %s\n", lua_tostring(L, 1));
while(lua_getstack(L, n++, &ar)) {
lua_getinfo(L, "nSl", &ar);
printf("\tAt %s:%d %s\n", ar.short_src, ar.currentline, ar.name?ar.name:"");
}
// Do it again for the lua error popup, if needed
if (1)
{
n = 0;
new_lua_error(lua_tostring(L, 1));
while(lua_getstack(L, n++, &ar)) {
lua_getinfo(L, "nSl", &ar);
add_lua_error(ar.short_src, ar.currentline, ar.name?ar.name:"");
}
}
void stackDump (lua_State *L) {
int i=lua_gettop(L);
printf(" ---------------- Stack Dump ----------------\n" );
while( i ) {
int t = lua_type(L, i);
switch (t) {
case LUA_TSTRING:
printf("%d:`%s'\n", i, lua_tostring(L, i));
break;
case LUA_TBOOLEAN:
printf("%d: %s\n",i,lua_toboolean(L, i) ? "true" : "false");
break;
case LUA_TNUMBER:
printf("%d: %g\n", i, lua_tonumber(L, i));
break;
default:
#if defined(__PTRDIFF_TYPE__)
if((sizeof(__PTRDIFF_TYPE__) == sizeof(long int)))
{ printf("%d: %s // %lx\n", i, lua_typename(L, t), (unsigned long int)lua_topointer(L, i)); }
{ printf("%d: %s // %x\n", i, lua_typename(L, t), (unsigned int)lua_topointer(L, i)); }
#else
printf("%d: %s // %x\n", i, lua_typename(L, t), lua_topointer(L, i));
#endif
break;
}
i--;
}
printf("--------------- Stack Dump Finished ---------------\n" );
}
int status;
int base = lua_gettop(L) - narg; /* function index */
lua_pushcfunction(L, traceback); /* push traceback function */
lua_insert(L, base); /* put it under chunk and args */
status = lua_pcall(L, narg, nret, base);
lua_remove(L, base); /* remove traceback function */
/* force a complete garbage collection in case of errors */
if (status != 0) { lua_pop(L, 1); lua_gc(L, LUA_GCCOLLECT, 0); }
// printf(">===%d (%d) [%d]\n", lua_gettop(L), nret, status);
if (lua_gettop(L) != nret + (base - 1))
{
stackDump(L);
// assert(0);
#else
int status=0;
int base = lua_gettop(L) - narg; /* function index */
lua_call(L, narg, nret);
return status;
#endif
/* No print function, does .. nothing */
int noprint(lua_State *L)
{
return 0;
}
// define our data that is passed to our redraw function
typedef struct {
Uint32 color;
} MainStateData;
dg
committed
int event_filter(void *userdata, SDL_Event* event)
{
// Do not allow the user to close without asking the game to know about it
if (event->type == SDL_QUIT && (current_game != LUA_NOREF))
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
lua_pushstring(L, "onQuit");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
docall(L, 1, 0);
return 0;
}
return 1;
}
dg
committed
extern SDL_Cursor *mouse_cursor;
extern SDL_Cursor *mouse_cursor_down;
dg
committed
case SDL_TEXTINPUT:
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_keyhandler);
lua_pushstring(L, "receiveKey");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_keyhandler);
dg
committed
if (event->type != SDL_TEXTINPUT) lua_pushnumber(L, event->key.keysym.scancode);
else lua_pushnumber(L, 0);
dg
committed
SDL_Keymod _pKeyState = SDL_GetModState();
lua_pushboolean(L, (_pKeyState & KMOD_CTRL) ? TRUE : FALSE);
lua_pushboolean(L, (_pKeyState & KMOD_SHIFT) ? TRUE : FALSE);
lua_pushboolean(L, (_pKeyState & KMOD_ALT) ? TRUE : FALSE);
lua_pushboolean(L, (_pKeyState & KMOD_GUI) ? TRUE : FALSE);
dg
committed
if (event->type == SDL_TEXTINPUT)
{
lua_pushstring(L, event->text.text);
lua_pushboolean(L, (event->type == SDL_KEYUP) ? TRUE : FALSE);
docall(L, 8, 0);
dg
committed
if (event->type == SDL_MOUSEBUTTONDOWN) SDL_SetCursor(mouse_cursor_down);
else SDL_SetCursor(mouse_cursor);
if (current_mousehandler != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
lua_pushstring(L, "receiveMouse");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
switch (event->button.button)
{
case SDL_BUTTON_LEFT:
lua_pushstring(L, "left");
break;
case SDL_BUTTON_MIDDLE:
lua_pushstring(L, "middle");
break;
case SDL_BUTTON_RIGHT:
lua_pushstring(L, "right");
break;
case SDL_BUTTON_WHEELUP:
lua_pushstring(L, "wheelup");
break;
case SDL_BUTTON_WHEELDOWN:
lua_pushstring(L, "wheeldown");
break;
default:
lua_pushstring(L, "button");
lua_pushnumber(L, event->button.button);
lua_concat(L, 2);
break;
}
lua_pushnumber(L, event->button.x);
lua_pushnumber(L, event->button.y);
lua_pushboolean(L, (event->type == SDL_MOUSEBUTTONUP) ? TRUE : FALSE);
docall(L, 5, 0);
dg
committed
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
case SDL_MOUSEWHEEL:
if (current_mousehandler != LUA_NOREF)
{
int x = 0, y = 0;
SDL_GetMouseState(&x, &y);
int i;
for (i = 0; i <= 1; i++)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
lua_pushstring(L, "receiveMouse");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
if (event->wheel.y > 0) lua_pushstring(L, "wheelup");
else if (event->wheel.y < 0) lua_pushstring(L, "wheeldown");
else if (event->wheel.x > 0) lua_pushstring(L, "wheelleft");
else if (event->wheel.x < 0) lua_pushstring(L, "wheelright");
else lua_pushstring(L, "wheelnone");
lua_pushnumber(L, x);
lua_pushnumber(L, y);
lua_pushboolean(L, i);
docall(L, 5, 0);
}
}
break;
mousex = event->motion.x;
mousey = event->motion.y;
if (current_mousehandler != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
lua_pushstring(L, "receiveMouseMotion");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
if (event->motion.state & SDL_BUTTON(1)) lua_pushstring(L, "left");
else if (event->motion.state & SDL_BUTTON(2)) lua_pushstring(L, "middle");
else if (event->motion.state & SDL_BUTTON(3)) lua_pushstring(L, "right");
else if (event->motion.state & SDL_BUTTON(4)) lua_pushstring(L, "wheelup");
else if (event->motion.state & SDL_BUTTON(5)) lua_pushstring(L, "wheeldown");
else lua_pushstring(L, "none");
lua_pushnumber(L, event->motion.x);
lua_pushnumber(L, event->motion.y);
lua_pushnumber(L, event->motion.xrel);
lua_pushnumber(L, event->motion.yrel);
docall(L, 6, 0);
}
break;
static int Frames = 0;
static int T0 = 0;
lua_pushstring(L, "tick");
lua_gettable(L, -2);
lua_remove(L, -2);
docall(L, 1, 1);
tickPaused = lua_toboolean(L, -1);
/* Gather our frames per second */
Frames++;
{
int t = SDL_GetTicks();
float seconds = (t - T0) / 1000.0;
float fps = Frames / seconds;
// printf("%d ticks in %g seconds = %g TPS\n", Frames, seconds, fps);
void call_draw(int nb_keyframes)
// Notify the particles threads that there are new keyframes
thread_particle_new_keyframes(nb_keyframes);
lua_pushstring(L, "display");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_pushnumber(L, (nb_keyframes < 0) ? 0 : nb_keyframes);
docall(L, 2, 0);
/* Mouse pointer */
if (mouse_cursor_tex && mouse_cursor_down_tex)
{
GLfloat texcoords[2*4] = {
0, 0,
1, 0,
1, 1,
0, 1,
};
GLfloat colors[4*4] = {
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1,
};
glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
glColorPointer(4, GL_FLOAT, 0, colors);
int x = mousex + mouse_cursor_ox;
int y = mousey + mouse_cursor_oy;
int down = SDL_GetMouseState(NULL, NULL);
tglBindTexture(GL_TEXTURE_2D, down ? mouse_cursor_down_tex : mouse_cursor_tex);
GLfloat vertices[2*4] = {
x, y,
x, y + 32,
x + 32, y + 32,
x + 32, y,
};
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawArrays(GL_QUADS, 0, 4);
long total_keyframes = 0;
void on_redraw()
{
static int Frames = 0;
static int T0 = 0;
static float nb_keyframes = 0;
static int last_keyframe = 0;
static float reference_fps = 30;
static int count_keyframes = 0;
/* Gather our frames per second */
Frames++;
{
int t = SDL_GetTicks();
if (t - T0 >= 1000) {
reference_fps = fps;
// printf("%d frames in %g seconds = %g FPS (%d keyframes)\n", Frames, seconds, fps, count_keyframes);
last_keyframe = 0;
nb_keyframes = 0;
count_keyframes = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
float step = 30 / reference_fps;
nb_keyframes += step;
int nb = ceilf(nb_keyframes);
count_keyframes += nb - last_keyframe;
total_keyframes += nb - last_keyframe;
// printf("keyframes: %f / %f by %f => %d\n", nb_keyframes, reference_fps, step, nb - (last_keyframe));
call_draw(nb - last_keyframe);
dg
committed
//SDL_GL_SwapBuffers();
SDL_GL_SwapWindow(window);
last_keyframe = nb;
void pass_command_args(int argc, char *argv[])
{
int i;
if (current_game != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
lua_pushstring(L, "commandLineArgs");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
lua_newtable(L);
for (i = 1; i <= argc; i++)
{
lua_pushnumber(L, i);
lua_pushstring(L, argv[i]);
lua_settable(L, -3);
}
docall(L, 2, 0);
}
}
quicksilver
committed
int redraw_pending = 0;
Uint32 redraw_timer(Uint32 interval, void *param)
{
SDL_Event event;
SDL_UserEvent userevent;
/* In this example, our callback pushes an SDL_USEREVENT event
into the queue, and causes ourself to be called again at the
same interval: */
userevent.type = SDL_USEREVENT;
userevent.code = 0;
userevent.data1 = NULL;
userevent.data2 = NULL;
event.type = SDL_USEREVENT;
event.user = userevent;
if (!redraw_pending && isActive) {
quicksilver
committed
SDL_PushEvent(&event);
redraw_pending = 1;
}
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
int realtime_pending = 0;
Uint32 realtime_timer(Uint32 interval, void *param)
{
SDL_Event event;
SDL_UserEvent userevent;
/* In this example, our callback pushes an SDL_USEREVENT event
into the queue, and causes ourself to be called again at the
same interval: */
userevent.type = SDL_USEREVENT;
userevent.code = 2;
userevent.data1 = NULL;
userevent.data2 = NULL;
event.type = SDL_USEREVENT;
event.user = userevent;
if (!realtime_pending && isActive) {
SDL_PushEvent(&event);
// realtime_pending = 1;
}
return(interval);
}
// Calls the lua music callback
void on_music_stop()
{
if (current_game != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
lua_pushstring(L, "onMusicStop");
lua_gettable(L, -2);
lua_remove(L, -2);
if (lua_isfunction(L, -1))
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
docall(L, 1, 0);
}
else
lua_pop(L, 1);
}
}
// Setup realtime
void setupRealtime(float freq)
{
if (!freq)
{
if (realtime_timer_id) SDL_RemoveTimer(realtime_timer_id);
realtime_timer_id = NULL;
printf("[ENGINE] Switching to turn based\n");
}
else
{
float interval = 1000 / freq;
realtime_timer_id = SDL_AddTimer((int)interval, realtime_timer, NULL);
printf("[ENGINE] Switching to realtime, interval %d ms\n", (int)interval);
}
}
void setupDisplayTimer(int fps)
{
if (display_timer_id) SDL_RemoveTimer(display_timer_id);
display_timer_id = SDL_AddTimer(1000 / fps, redraw_timer, NULL);
printf("[ENGINE] Setting requested FPS to %d (%d ms)\n", fps, 1000 / fps);
}
/* general OpenGL initialization function */
int initGL()
{
/* Set the background black */
glClearDepth( 1.0f );
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
return( TRUE );
}
int resizeWindow(int width, int height)
{
/* Height / width ration */
GLfloat ratio;
/* Protect against a divide by zero */
if ( height == 0 )
height = 1;
ratio = ( GLfloat )width / ( GLfloat )height;
/* Setup our viewport. */
glViewport( 0, 0, ( GLsizei )width, ( GLsizei )height );
/* change to the projection matrix and set our viewing volume. */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* Set our perspective */
//gluPerspective( 45.0f, ratio, 0.1f, 100.0f );
/* Make sure we're chaning the model view and not the projection */
glMatrixMode( GL_MODELVIEW );
/* Reset The View */
glLoadIdentity( );
SDL_SetGamma(gamma_correction, gamma_correction, gamma_correction);
GLint texSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);
printf("OpenGL max texture size: %d\n", texSize);
dg
committed
if (!window)
{
window = SDL_CreateWindow("TE4", 0, 0, w, h, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | (fullscreen ? SDL_WINDOW_FULLSCREEN : 0));
if (window==NULL) {
printf("error opening screen: %s\n", SDL_GetError());
exit(1);
}
screen = SDL_GetWindowSurface(window);
maincontext = SDL_GL_CreateContext(window);
dg
committed
}
else
{
SDL_SetWindowSize(window, w, h);
screen = SDL_GetWindowSurface(window);
dg
committed
SDL_SetWindowFullscreen(window, fullscreen);
SDL_GetWindowSize(window, &w, &h);
resizeWindow(w, h);
void boot_lua(int state, bool rebooting, int argc, char *argv[])
{
if (state == 1)
{
const char *selfexe;
/* When rebooting we destroy the lua state to free memory and we reset physfs */
if (rebooting)
{
current_mousehandler = LUA_NOREF;
current_keyhandler = LUA_NOREF;
current_game = LUA_NOREF;
lua_close(L);
PHYSFS_deinit();
}
/***************** Physfs Init *****************/
PHYSFS_init(argv[0]);
selfexe = get_self_executable(argc, argv);
{
}
else
{
printf("NO SELFEXE: bootstrapping from CWD\n");
PHYSFS_mount("bootstrap", "/bootstrap", 1);
}
/***************** Lua Init *****************/
L = lua_open(); /* create state */
luaL_openlibs(L); /* open libraries */
luaopen_fov(L);
luaopen_socket_core(L);
luaopen_mime_core(L);
luaopen_struct(L);
luaopen_profiler(L);
luaopen_md5_core(L);
luaopen_map(L);
luaopen_particles(L);
luaopen_profile(L);
dg
committed
luaopen_wait(L);
// Override "print" if requested
if (no_debug)
{
lua_pushcfunction(L, noprint);
lua_setglobal(L, "print");
}
// Make the uids repository
lua_newtable(L);
lua_setglobal(L, "__uids");
// Tell the boostrapping code the selfexe path
if (selfexe)
lua_pushstring(L, selfexe);
else
lua_pushnil(L);
lua_setglobal(L, "__SELFEXE");
// Will be useful
#ifdef __APPLE__
lua_pushboolean(L, TRUE);
lua_setglobal(L, "__APPLE__");
#endif
// Run bootstrapping
if (!luaL_loadfile(L, "/bootstrap/boot.lua"))
{
docall(L, 0, 0);
}
// Could not load bootstrap! Try to mount the engine from working directory as last resort
else
{
lua_pop(L, 1);
printf("WARNING: No bootstrap code found, defaulting to working directory for engine code!\n");
PHYSFS_mount("game/thirdparty", "/", 1);
PHYSFS_mount("game/", "/", 1);
}
// And run the lua engine pre init scripts
if (!luaL_loadfile(L, "/loader/pre-init.lua"))
docall(L, 0, 0);
else
lua_pop(L, 1);
create_particles_thread();
}
else if (state == 2)
{
SDL_WM_SetCaption("T-Engine4", NULL);
// Now we can open lua lanes, the physfs paths are set and it can load it's lanes-keeper.lua file
// luaopen_lanes(L);
printf("Running lua loader code...\n");
// And run the lua engine scripts
if (!luaL_loadfile(L, "/loader/init.lua"))
{
if (core_def->reboot_engine) lua_pushstring(L, core_def->reboot_engine); else lua_pushnil(L);
if (core_def->reboot_engine_version) lua_pushstring(L, core_def->reboot_engine_version); else lua_pushnil(L);
if (core_def->reboot_module) lua_pushstring(L, core_def->reboot_module); else lua_pushnil(L);
if (core_def->reboot_name) lua_pushstring(L, core_def->reboot_name); else lua_pushnil(L);
lua_pushboolean(L, core_def->reboot_new);
if (core_def->reboot_einfo) lua_pushstring(L, core_def->reboot_einfo); else lua_pushnil(L);
docall(L, 6, 0);
}
else
{
lua_pop(L, 1);
}
// Update core to run
static void define_core(core_boot_type *core_def, const char *coretype, int id, const char *reboot_engine, const char *reboot_engine_version, const char *reboot_module, const char *reboot_name, int reboot_new, const char *reboot_einfo)
{
if (core_def->coretype) free(core_def->coretype);
if (core_def->reboot_engine) free(core_def->reboot_engine);
if (core_def->reboot_engine_version) free(core_def->reboot_engine_version);
if (core_def->reboot_module) free(core_def->reboot_module);
if (core_def->reboot_name) free(core_def->reboot_name);
if (core_def->reboot_einfo) free(core_def->reboot_einfo);
core_def->corenum = id;
core_def->coretype = coretype ? strdup(coretype) : NULL;
core_def->reboot_engine = reboot_engine ? strdup(reboot_engine) : NULL;
core_def->reboot_engine_version = reboot_engine_version ? strdup(reboot_engine_version) : NULL;
core_def->reboot_module = reboot_module ? strdup(reboot_module) : NULL;
core_def->reboot_name = reboot_name ? strdup(reboot_name) : NULL;
core_def->reboot_einfo = reboot_einfo ? strdup(reboot_einfo) : NULL;
core_def->reboot_new = reboot_new;
}
// Let some platforms use a different entry point
#ifdef USE_TENGINE_MAIN
#ifdef main
#undef main
#endif
#define main tengine_main
#endif
* Core entry point.
core_def->define = &define_core;
core_def->define(core_def, "te4core", -1, NULL, NULL, NULL, NULL, 0, NULL);
// Parse arguments
int i;
for (i = 1; i < argc; i++)
{
char *arg = argv[i];
if (!strncmp(arg, "-M", 2)) core_def->reboot_module = strdup(arg+2);
if (!strncmp(arg, "-u", 2)) core_def->reboot_name = strdup(arg+2);
if (!strncmp(arg, "-E", 2)) core_def->reboot_einfo = strdup(arg+2);
if (!strncmp(arg, "-n", 2)) core_def->reboot_new = 1;
if (!strncmp(arg, "--flush-stdout", 14)) setvbuf(stdout, (char *) NULL, _IOLBF, 0);;
if (!strncmp(arg, "--no-debug", 10)) no_debug = TRUE;
#ifdef SELFEXE_WINDOWS
freopen ("te4_log.txt", "w", stdout);
#endif
// Get cpu cores
nb_cpus = get_number_cpus();
printf("[CPU] Detected %d CPUs\n", nb_cpus);
// RNG init
init_gen_rand(time(NULL));
int vid_drv;
for (vid_drv = 0; vid_drv < SDL_GetNumVideoDrivers(); vid_drv++)
{
printf("Available video driver: %s\n", SDL_GetVideoDriver(vid_drv));
}
if (SDL_Init (flags) < 0) {
printf("cannot initialize SDL: %s\n", SDL_GetError ());
if (SDL_VideoInit(NULL) != 0) {
printf("Error initializing SDL video: %s\n", SDL_GetError());
return 2;
}
dg
committed
SDL_SetEventFilter(event_filter, NULL);
if (screen==NULL) {
printf("error opening screen: %s\n", SDL_GetError());
dg
committed
SDL_SetWindowIcon(window, IMG_Load_RW(PHYSFSRWOPS_openRead("/engines/default/data/gfx/te4-icon.png"), TRUE));
SDL_SetWindowTitle(window, "T4Engine");
/* Sets up OpenGL double buffering */
resizeWindow(WIDTH, HEIGHT);
dg
committed
// Allow getting unicode events
SDL_StartTextInput();
// Allow screensaver to work
SDL_EnableScreenSaver();
// Get OpenGL capabilities
multitexture_active = GLEW_ARB_multitexture;
shaders_active = GLEW_ARB_shader_objects;
fbo_active = GLEW_EXT_framebuffer_object || GLEW_ARB_framebuffer_object;
if (!multitexture_active) shaders_active = FALSE;
if (!GLEW_VERSION_2_1)
{
multitexture_active = FALSE;
shaders_active = FALSE;
fbo_active = FALSE;
}
// setupDisplayTimer(30);
init_blank_surface();
boot_lua(2, FALSE, argc, argv);
if (!isActive || tickPaused) SDL_WaitEvent(NULL);
/* handle the events in the queue */
while (SDL_PollEvent(&event))
{
switch(event.type)
{
dg
committed
case SDL_WINDOWEVENT:
switch (event.window.event)
dg
committed
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
case SDL_WINDOWEVENT_RESIZED:
printf("resize %d x %d\n", event.window.data1, event.window.data2);
do_resize(event.window.data1, event.window.data2, FALSE);
if (current_game != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
lua_pushstring(L, "onResolutionChange");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
docall(L, 1, 0);
}
break;
case SDL_WINDOWEVENT_MOVED: {
int x, y;
SDL_GetWindowPosition(window, &x, &y);
printf("move %d x %d\n", x, y);
if (current_game != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
lua_pushstring(L, "onWindowMoved");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_game);
lua_pushnumber(L, x);
lua_pushnumber(L, y);