Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}