GFXMeshBuffer gfx_mesh_add_buffer( GFXMesh* mesh, size_t size, const void* data) { GFX_Mesh* internal = (GFX_Mesh*)mesh; /* Insert new vector element */ GFXSharedBuffer* it = gfx_vector_insert( &internal->buffers, NULL, internal->buffers.end ); if(it == internal->buffers.end) return 0; /* Create new shared buffer */ /* Align with largest integer so index offset can be aligned */ GFXDataType type; type.unpacked = GFX_LARGE_INTEGER; if(!gfx_shared_buffer_init_align(it, size, data, type)) { gfx_vector_erase(&internal->buffers, it); return 0; } /* Return ID */ return gfx_vector_get_size(&internal->buffers); }
void _gfx_platform_window_free( GFX_PlatformWindow handle) { /* Make sure to undo fullscreen */ GFX_Win32_Window* it = _gfx_win32_get_window_from_handle(handle); if(it->flags & GFX_WIN32_FULLSCREEN) _gfx_win32_leave_fullscreen(it->monitor); /* Destroy the context and window */ _gfx_platform_context_clear(handle); DestroyWindow(handle); /* Remove from vector */ gfx_vector_erase(&_gfx_win32.windows, it); }
void _gfx_platform_window_free( GFX_PlatformWindow handle) { GFX_X11_Window* it = _gfx_x11_get_window_from_handle(GFX_VOID_TO_UINT(handle)); /* Get attributes */ XWindowAttributes attr; XGetWindowAttributes(_gfx_x11.display, GFX_VOID_TO_UINT(handle), &attr); /* Make sure to undo fullscreen */ if(it->flags & GFX_X11_FULLSCREEN) _gfx_x11_leave_fullscreen(it->monitor); /* Destroy context, the window and its colormap */ _gfx_platform_context_clear(handle); XDestroyWindow(_gfx_x11.display, GFX_VOID_TO_UINT(handle)); XFreeColormap(_gfx_x11.display, attr.colormap); /* Remove from vector */ gfx_vector_erase(&_gfx_x11.windows, it); }
static int _gfx_lod_map_remove_at( GFX_LodMap* map, GFXVectorIterator level, unsigned int index) { /* Get boundaries */ unsigned int begin; unsigned int end; _gfx_lod_map_get_boundaries( map, level, &begin, &end ); unsigned int size = end - begin; if(index >= size) return 0; /* Erase the data */ gfx_vector_erase_at(&map->data, begin + index); if(size == 1) { level = gfx_vector_erase(&map->levels, level); --map->map.levels; } /* Decrease upper bounds */ while(level != map->levels.end) { --(*(unsigned int*)level); level = gfx_vector_next(&map->levels, level); } return 1; }
int gfx_lod_map_add( GFXLodMap* map, unsigned int level, void* data) { GFX_LodMap* internal = (GFX_LodMap*)map; /* Overflow */ size_t size = gfx_vector_get_size(&internal->data); if(level > map->levels || size == UINT_MAX) return 0; /* Get level iterator */ GFXVectorIterator levIt; if(level == map->levels) { /* Insert the level if it doesn't exist yet */ unsigned int upper = size; levIt = gfx_vector_insert( &internal->levels, &upper, internal->levels.end ); if(levIt == internal->levels.end) return 0; ++map->levels; } else { /* Check single data flag */ if(map->flags & GFX_LOD_SINGLE_DATA) return 0; levIt = gfx_vector_at(&internal->levels, level); } /* Get boundaries */ unsigned int begin; unsigned int end; _gfx_lod_map_get_boundaries( internal, levIt, &begin, &end ); /* Insert the data */ GFXVectorIterator it = gfx_vector_insert_at( &internal->data, data, end ); if(it == internal->data.end) { if(begin == end) { gfx_vector_erase(&internal->levels, levIt); --map->levels; } return 0; } /* Increase upper bounds */ while(levIt != internal->levels.end) { ++(*(unsigned int*)levIt); levIt = gfx_vector_next(&internal->levels, levIt); } return 1; }