134 lines
3.1 KiB
C
134 lines
3.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <gint/display.h>
|
|
#include <gint/hardware.h>
|
|
#include <gint/keyboard.h>
|
|
#include <gint/clock.h>
|
|
#include <fxlibc/printf.h>
|
|
#include <libprof.h>
|
|
|
|
#include "defines.h"
|
|
#include "menus.c"
|
|
#include "fluid64x64.c"
|
|
#include "fluid128x64.c"
|
|
|
|
int main(void) {
|
|
if(gint[HWCALC] == HWCALC_G35PE2) {
|
|
dtext_opt(64, 10, C_BLACK, C_WHITE, DTEXT_CENTER, DTEXT_TOP, "Cette calculatrice", -1);
|
|
dtext_opt(64, 25, C_BLACK, C_WHITE, DTEXT_CENTER, DTEXT_TOP, "est incompatible.", -1);
|
|
dtext_opt(64, 45, C_BLACK, C_WHITE, DTEXT_CENTER, DTEXT_TOP, "[EXE] Quitter", -1);
|
|
dupdate();
|
|
getkey();
|
|
return 1;
|
|
}
|
|
|
|
fix (*buffers)[W*H] = (void *)0x88040000; // magic pointer to extra memory
|
|
fix (*buffersFS)[W2*H] = (void *)0x88040000;
|
|
dye = buffers[0]; // dye concentration
|
|
vx = buffers[1]; // fluid x velocity
|
|
vy = buffers[2]; // fluid y velocity
|
|
tx = buffers[3]; // temp buffer (used to advect vx & to compute div)
|
|
ty = buffers[4]; // temp buffer (used to advect vy & to compute p)
|
|
tz = buffers[5]; // temp buffer (used to advect dye)
|
|
|
|
// Empty all buffers
|
|
memset(buffers, 0, W*H*sizeof(fix)*6);
|
|
|
|
// Init timer
|
|
prof_init();
|
|
prof_t prof = prof_make();
|
|
uint32_t lastTime = 0, time = 0;
|
|
|
|
// Init font
|
|
extern font_t myfont;
|
|
dfont(&myfont);
|
|
__printf_enable_fp();
|
|
|
|
main_menu();
|
|
// settings_menu(true);
|
|
|
|
/// Main Loop ///
|
|
bool fullscreen = false;
|
|
bool showFPS = true;
|
|
addX = W/2;
|
|
addY = H/2;
|
|
while (1) {
|
|
prof_enter(prof); // resume timer
|
|
|
|
clearevents(); // Read all events
|
|
|
|
if (fullscreen) { // fullscreen 128x64 simulation
|
|
fluid_step128x64();
|
|
drect_border(0, 0, 127, H-1, C_NONE, 1, C_BLACK);
|
|
|
|
// Handle fullscreen exit
|
|
if (keydown(KEY_MINUS) || keydown(K_PARAMS) || keydown(K_COLORS)) {
|
|
fullscreen = false;
|
|
memset(buffers, 0, W*H*sizeof(fix)*6);
|
|
|
|
dye = buffers[0];
|
|
vx = buffers[1];
|
|
vy = buffers[2];
|
|
tx = buffers[3];
|
|
ty = buffers[4];
|
|
tz = buffers[5];
|
|
|
|
dclear(C_WHITE);
|
|
if (keydown(K_PARAMS)) settings_menu(true);
|
|
}
|
|
} else { // halfscreen 64x64 simulation
|
|
fluid_step64x64();
|
|
settings_menu(false);
|
|
|
|
// Handle fullscreen enter
|
|
if (keydown(KEY_PLUS)) {
|
|
fullscreen = true;
|
|
currentView = 0;
|
|
memset(buffers, 0, W2*H*sizeof(fix)*6);
|
|
|
|
dye = buffersFS[0];
|
|
vx = buffersFS[1];
|
|
vy = buffersFS[2];
|
|
tx = buffersFS[3];
|
|
ty = buffersFS[4];
|
|
tz = buffersFS[5];
|
|
|
|
dclear(C_WHITE);
|
|
}
|
|
}
|
|
|
|
// Simulation reset
|
|
if (keydown(K_RESET)) {
|
|
memset(buffers, 0, (fullscreen ? W2 : W)*H*sizeof(fix)*6);
|
|
} // Toggle FPS
|
|
else if (keydown(K_FPS)) {
|
|
showFPS = !showFPS;
|
|
} // Toggle help screen
|
|
else if (keydown(K_HELP) || keydown(KEY_EXIT)) {
|
|
int res = help_menu();
|
|
currentView = 0;
|
|
if (res == -1) return 1;
|
|
}
|
|
|
|
color_menu();
|
|
|
|
// Show FPS
|
|
if (showFPS) {
|
|
int ms = (time - lastTime)/1000;
|
|
sprintf(strFPS, "%dms / %dfps", (time - lastTime)/100, 1000/ms);
|
|
dtext_opt(66, 1, C_BLACK, C_WHITE, DTEXT_LEFT, DTEXT_TOP, strFPS, -1);
|
|
dline(64, 8, 127, 8, C_BLACK);
|
|
}
|
|
|
|
// Update vram
|
|
dupdate();
|
|
|
|
// pause timer
|
|
prof_leave(prof);
|
|
lastTime = time;
|
|
time = prof_time(prof);
|
|
}
|
|
|
|
return 1;
|
|
} |