示例#1
0
文件: voxels.c 项目: kyle1320/voxels
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);
}
示例#2
0
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);
}
示例#3
0
文件: voxels.c 项目: kyle1320/voxels
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);
}
示例#4
0
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;
}
示例#5
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);
}
示例#6
0
void MeshManager::deleteMesh( MeshHandle handle )
{
	// No other clean up needed
	freeMesh( handle );
}