bool terrain_deinit () { terrain_t *t; for (t = terrain_list.next; t != &terrain_list; t = t->next) terrain_del (t); return true; }
void map_gen (void) { int i, j, k, l; terrain_init (); for (l = 0; l < arrlen (chunks); ++l) for (i = 0; i < CHUNK_DX; ++i) for (j = 0; j < CHUNK_DY; ++j) for (k = 0; k < CHUNK_DZ; ++k) chunks[l][i][j][k] = rng_f () < 0.05; terrain_del (); }
terrain_t *terrain_add (int x, int y, int z) { terrain_t *t; /* kontrola, zda neexistuje teren na stejne pozici */ for (t = terrain_list.next; t != &terrain_list; t = t->next) { if (t->origin_x == x && t->origin_y == y && t->origin_z == z) { //printf ("teren: %d %d %d existuje!\n", x, y, z); return 0; } } t = (terrain_t *) calloc (sizeof (terrain_t), 1); if (!t) return NULL; t->state = TERRAIN_STATE_ACTIVE; t->vbo_id = 0; t->origin_x = x; t->origin_y = y; t->origin_z = z; t->dim_x = t->dim_y = t->dim_z = TERRAIN_DIM; t->data = (voxel_t *) malloc (sizeof (voxel_t) * (t->dim_x+2) * (t->dim_y+2) * (t->dim_z+2)); if (!t->data) { free (t); return NULL; } /* pridame teren do seznamu jeste pred generovanim, abychom mohli generovat za behu */ t->next = &terrain_list; t->prev = terrain_list.prev; t->prev->next = t; t->next->prev = t; if (!terrain_gen (t)) { terrain_del (t); return NULL; } /* pripravime teren k vykresleni - polygonizujeme voxely */ gl_prepare_terrain (t); //free (t->data); //t->data = NULL; return t; }
void gl_render () { fps_stick = SDL_GetTicks (); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity (); camera_update (); /* Ziskame nasi kameru */ camera_t *c = camera_get (); /* Vykreslovani SkyBoxu */ gl_render_skybox (c); terrain_t *t; for (t = terrain_list.next; t != &terrain_list; t = t->next) { if (!t->gl_buf_len) { /* mazani kontextu terenu z pameti */ terrain_t *tmp = t->prev; if (terrain_del (t)) t = tmp; continue; } gl_render_terrain (t, c); } /* Vykreslovani vody */ gl_water_render (); /* Vykreslovani HUD/textu */ char sfps[32]; sprintf (sfps, "FPS: %.0f", 1.0f/(fps_dtick/1000.0f)); font_render (0.500, -0.400, sfps); glFlush (); /* Prohodi predni a zadni buffer */ SDL_GL_SwapWindow (g_window); /* vypocitame hodnotu FPS na zaklade soucasneho casu a casu z predchoziho cyklu */ fps_dtick = SDL_GetTicks () - fps_stick; /* Omezime shora FPS, protoze nam vyssi uz nic neprinese */ if (1000/FPS_MAX > fps_dtick) SDL_Delay (1000.0f/FPS_MAX - fps_dtick); }
/* Deinitialize World */ void world_del(struct World * self){ terrain_del(self->altitude); climate_del(self->climate); climate_del(self->evil); mm_free(self); }