Fluid-Simulation-Monochrome/src/main.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;
}