#include "asset.h" #include "config.h" #include "editor.h" #include "gui.h" #include "map.h" #include "maths.h" #include "memory.h" #include "plat.h" #include "player.h" #include "render.h" #include "services.h" #include "tile.h" static int map_data[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; #include void draw_spinny(Renderer* r, Colour c) { static int a = 0; int y; int x = y = 100 << fbits; x -= sin_table[a & sin_table_mask] * 10; y += cos_table[a & sin_table_mask] * 10; ren_point(r, c, x >> fbits, y >> fbits); a += 20; } void draw_gun(Renderer* r) { static int a = 0; const Mesh* m = get_mesh(asset_id_monkey); const Texture* tex = get_texture(asset_id_gun_texture); int p[] = { f1 * 7, 0, f1 * 5, f1 }; mtx_push_trans(p); mtx_push_scale(0xff); /*mtx_push_rot_x(a); mtx_push_rot_y(a); mtx_push_rot_z(a);*/ ren_mesh(r, m, tex); mtx_popn(2); a++; } void draw_tri(Renderer* r, int x, int y) { const Texture* tex = get_texture(asset_id_gun_texture); int v0[] = { 100, 100, 0, 0, 0, f1, f1, f1 }; int v1[] = { 200, 200, 0, f1, f1/2, f1, f1, f1 }; int v2[] = { 150, 300, 0, 0, f1, f1, f1, f1 }; v1[0] = x; v1[1] = y; ren_tri(r, v0, v1, v2, tex); } void draw_line(Renderer* r, int x, int y) { int s[] = { 100, 100 }, e[2]; e[0] = x; e[1] = y; ren_line(r, make_red(), s, e); } void init_map(Map* m) { int* t = (int*)&m[1], i; m->w = 16; m->h = 16; for (i = 0; i < 0x100; i++) { t[i] = map_data[i]; } bake_map(m); } void draw_map(Renderer* r, const Player* p, const Map* m) { int pos[2]; pos[0] = p->p[0]; pos[1] = p->p[2]; ren_map(r, m, pos, p->f, p->l); } int entrypoint(int argc, const char** argv, Arena* a) { App* app; Renderer r = { 0 }; GUI g; Editor e; Heap h; FPS f; char buf[32]; int* depth = 0; Arena preload, gui_arena, map_arena; Map* map; void* gui_mem; Colour blue = make_aliceblue(); Player p; Services s; int editing = 0; (void)argc; (void)argv; init_maths(); init_heap( &h, arena_alloc(a, app_memory_size), app_memory_size ); init_arena( &preload, arena_alloc(a, asset_preload_memory_size), asset_preload_memory_size ); init_arena( &map_arena, arena_alloc(a, map_memory_size), map_memory_size ); gui_mem = arena_alloc(a, gui_memory_size); app = new_app(&h, 640, 480, "3D Engine"); if (!app) return app->err; init_fps(&f, 20); depth = heap_alloc(&h, max_vp_w * max_vp_h * sizeof *depth); if (!depth) { print_err("Out of memory.\n"); return error_out_of_memory; } preload_assets(&preload); s.a = app; s.r = &r; cfg_mouse(app, 0); init_player(&p); map = arena_alloc(&map_arena, map_size(max_map_w, max_map_h)); init_map(map); while (app->o) { fps_begin(&f); while (f.now >= f.next) { app_begin(app); init_arena(&gui_arena, gui_mem, gui_memory_size); gui_begin(&g, app, &gui_arena); if (app->key_states[key_f12] & key_state_just_pressed) { editing = !editing; cfg_mouse(app, editing); } if (!editing) update_player(&p, &s); ren_begin(&r, app->fb, depth, app->w, app->h); ren_clearc(&r, make_colour(0xc3c3c3, 0xff)); ren_cleard(&r, f1 * 300); /* draw_line(&r, app->mx, app->my);*/ if (editing) { edit_map(&e, &g, map); } else { push_player_cam(&p); draw_map(&r, &p, map); draw_gun(&r); pop_player_cam(); } /*draw_tri(&r, app->mx, app->my);*/ gui_end(&g, &r); sprintf(buf, "FPS: %d", app->fps); ren_texts(&r, blue, 3, 3, buf); sprintf(buf, "CAP: %d", f.fps); ren_texts(&r, blue, 3, 8, buf); sprintf(buf, "MOUSE: %d, %d", app->mx, app->my); ren_texts(&r, blue, 3, 13, buf); ren_end(&r); app_end(app); fps_update(&f); } fps_end(&f); } deinit_app(app); return 0; }