void freeChunk(Chunk *chunk) { int x, y, z; for (x = 0; x < CHUNK_SIZE; x++) { for (y = 0; y < CHUNK_SIZE; y++) { for (z = 0; z < CHUNK_SIZE; z++) { if (getBlock(chunk, x, y, z)->logic) free(getBlock(chunk, x, y, z)->logic); } } } freeMesh(chunk->mesh); free(chunk->mesh); free(chunk); }
void MeshManager::deleteMeshWithTag( uint32_t tag ) { std::vector< Tag > positiveTags; for( auto & tagItem : Tags ) { if( tagItem.tag == tag ) { freeMesh( tagItem.handle ); } else { positiveTags.push_back( tagItem ); } } Tags = std::move(positiveTags); }
void renderChunk(Chunk *chunk) { // free the previously used buffers. Memory leaks are bad, mmkay. if (chunk->mesh) freeMesh(chunk->mesh); // 6 faces per cube * 2 triangles per face * 3 vertices per triangle * 3 coordinates per vertex unsigned int max_points = countChunkSize(chunk);//6 * 6 * 3 * CHUNK_SIZE * CHUNK_SIZE * CHUNK_SIZE; // don't render an empty chunk :p if (max_points == 0) { *chunk->mesh = EMPTY_MESH; return; } GLfloat *points = malloc(max_points * sizeof(GLfloat)); GLfloat *normals = malloc(max_points * sizeof(GLfloat)); GLfloat *colors = malloc(max_points * sizeof(GLfloat)); int size; if (useMeshing) size = renderChunkWithMeshing(chunk, points, normals, colors, (vec3){0, 0, 0}, 1.0); else size = renderChunkToArrays(chunk, points, normals, colors, (vec3){0, 0, 0}, 1.0); buildMesh(chunk->mesh, points, normals, colors, NULL, NULL, size * sizeof(GLfloat), size * sizeof(GLfloat), size * sizeof(GLfloat), 0, 0, size / 3); translate_m4(chunk->mesh->modelMatrix, chunk->x * CHUNK_WIDTH, chunk->y * CHUNK_WIDTH, chunk->z * CHUNK_WIDTH); free(points); free(normals); free(colors); }
int main(int argc, char **argv) { Mesh *mesh = NULL; double m, m1, m2; double s, s1, s2; double t1, t2; struct rusage r0, r1, r2; if (argc < 3) { fprintf(stderr, "Usage: %s <input_mesh> <output_mesh>\n", argv[0]); return -1; } getrusage(RUSAGE_SELF, &r0); if (readMesh(argv[1], &mesh)) { freeMesh(&mesh); return -1; } getrusage(RUSAGE_SELF, &r1); m1 = (double) r1.ru_utime.tv_usec; m2 = (double) r0.ru_utime.tv_usec; m = m1 - m2; s1 = (double) r1.ru_utime.tv_sec; s2 = (double) r0.ru_utime.tv_sec; s = s1 - s2; t1 = s + m / MICROSEC; m1 = (double) r1.ru_stime.tv_usec; m2 = (double) r0.ru_stime.tv_usec; m = m1 - m2; s1 = (double) r1.ru_stime.tv_sec; s2 = (double) r0.ru_stime.tv_sec; s = s1 - s2; t2 = s + m / MICROSEC; printf("Read: %5.4e System: %5.4e Total: %5.4e\n", t1, t2, t1+t2); getrusage(RUSAGE_SELF, &r1); optMesh(mesh, 1.0e-6, 2); getrusage(RUSAGE_SELF, &r2); m1 = (double) r2.ru_utime.tv_usec; m2 = (double) r1.ru_utime.tv_usec; m = m1 - m2; s1 = (double) r2.ru_utime.tv_sec; s2 = (double) r1.ru_utime.tv_sec; s = s1 - s2; t1 = s + m / MICROSEC; m1 = (double) r2.ru_stime.tv_usec; m2 = (double) r1.ru_stime.tv_usec; m = m1 - m2; s1 = (double) r2.ru_stime.tv_sec; s2 = (double) r1.ru_stime.tv_sec; s = s1 - s2; t2 = s + m / MICROSEC; printf("Optimize: User: %5.4e System: %5.4e Total: %5.4e\n", t1, t2, t1+t2); getrusage(RUSAGE_SELF, &r1); writeMesh(argv[2], mesh); getrusage(RUSAGE_SELF, &r2); m1 = (double) r2.ru_utime.tv_usec; m2 = (double) r1.ru_utime.tv_usec; m = m1 - m2; s1 = (double) r2.ru_utime.tv_sec; s2 = (double) r1.ru_utime.tv_sec; s = s1 - s2; t1 = s + m / MICROSEC; m1 = (double) r2.ru_stime.tv_usec; m2 = (double) r1.ru_stime.tv_usec; m = m1 - m2; s1 = (double) r2.ru_stime.tv_sec; s2 = (double) r1.ru_stime.tv_sec; s = s1 - s2; t2 = s + m / MICROSEC; printf("Write: User: %5.4e System: %5.4e Total: %5.4e\n", t1, t2, t1+t2); freeMesh(&mesh); getrusage(RUSAGE_SELF, &r2); m1 = (double) r2.ru_utime.tv_usec; m2 = (double) r0.ru_utime.tv_usec; m = m1 - m2; s1 = (double) r2.ru_utime.tv_sec; s2 = (double) r0.ru_utime.tv_sec; s = s1 - s2; t1 = s + m / MICROSEC; m1 = (double) r2.ru_stime.tv_usec; m2 = (double) r0.ru_stime.tv_usec; m = m1 - m2; s1 = (double) r2.ru_stime.tv_sec; s2 = (double) r0.ru_stime.tv_sec; s = s1 - s2; t2 = s + m / MICROSEC; printf("Total: User: %5.4e System: %5.4e Total: %5.4e\n", t1, t2, t1+t2); return 0; }
void drawText(const string* text, float x, float y, const string* font_name, int font_size) { text = (string*)wstrdup(text); HDC hdc = CreateCompatibleDC(0); string* font_face = wstrdup(font_name); int font_height = -MulDiv(font_size, GetDeviceCaps(hdc, LOGPIXELSY), 72); HFONT hfont = CreateFontW(font_height, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, font_face); free(font_face); SelectObject(hdc, hfont); SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(255, 0, 0)); RECT rect = { 0 }; DrawTextW(hdc, text, -1, &rect, DT_CALCRECT | DT_NOCLIP); int width = rect.right - rect.left + 2, height = rect.bottom - rect.top + 2; rect.left++; rect.top++; void* bitmap_data = calloc(width*height, sizeof(uint32_t)); for (int i = 3; i < width*height*4; i+= 4) *((uint8_t*)bitmap_data+i) = 0xff; HBITMAP hbitmap = CreateBitmap(width, height, 1, 32, bitmap_data); SelectObject(hdc, hbitmap); DrawTextW(hdc, text, -1, &rect, DT_TOP | DT_LEFT); DeleteObject(hfont); free(text); GetBitmapBits(hbitmap, width*height*4, bitmap_data); DeleteObject(hbitmap); DeleteDC(hdc); for (int i = 0; i < width*height*4; i += 4) { *((uint8_t*)bitmap_data+i+3) = *((uint8_t*)bitmap_data+i+2); *((uint8_t*)bitmap_data+i ) = 0x10; *((uint8_t*)bitmap_data+i+1) = 0x10; *((uint8_t*)bitmap_data+i+2) = 0x10; } textureT* tex = createTexture(); textureT* old_tex = useTexture(tex, 0); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, bitmap_data); free(bitmap_data); triMeshT* text_quad = createQuad(2.0f, 2.0f); if (!text_shader) initTextShader(); shaderT* old_shader = useShader(text_shader); setShaderParam("ScreenSize", &(vec2) { (float)screenWidth(), (float)screenHeight() }); setShaderParam("TextRect" , &(vec4) { (float)x, (float)y, (float)width, (float)height }); GLint depth_mask; glGetIntegerv(GL_DEPTH_WRITEMASK, &depth_mask); GLboolean cull_face, depth_test; glGetBooleanv(GL_CULL_FACE, &cull_face); glGetBooleanv(GL_DEPTH_TEST, &depth_test); glDepthMask(GL_FALSE); glDisable (GL_CULL_FACE); glDisable (GL_DEPTH_TEST); drawMesh(text_quad); glDepthMask(depth_mask); if (cull_face) glEnable(GL_CULL_FACE); if (depth_test) glEnable(GL_DEPTH_TEST); useTexture (old_tex, 0); useShader (old_shader); freeTexture(tex); freeMesh (text_quad); }
void MeshManager::deleteMesh( MeshHandle handle ) { // No other clean up needed freeMesh( handle ); }