Example #1
0
Window::Window(Renderer * renderer, uint32_t size_x, uint32_t size_y, std::string name) {
	_renderer = renderer;
	_surface_size_x = size_x;
	_surface_size_y = size_y;
	_window_name = name;

	_InitOSWindow();
	_InitSurface();
	_InitSwapchain();
	_InitSwapchainImages();
}
Example #2
0
void CBuild::xrPhase_MergeLM()
{
	vecDefl			Layer;

	// **** Select all deflectors, which contain this light-layer
	Layer.clear	();
	for (u32 it=0; it<g_deflectors.size(); it++)
	{
		CDeflector*	D		= g_deflectors[it];
		if (D->bMerged)		continue;
		Layer.push_back		(D);
	}

	// Merge this layer (which left unmerged)
	while (Layer.size()) 
	{
		string512	phase_name;
		sprintf		(phase_name,"Building lightmap %d...",g_lightmaps.size());
		Phase		(phase_name);

		// Sort layer by similarity (state changes)
		// + calc material area
		Status		("Selection...");
		for (u32 it=0; it<materials.size(); it++) materials[it].internal_max_area	= 0;
		for (u32 it=0; it<Layer.size(); it++)	{
			CDeflector*	D		= Layer[it];
			materials[D->GetBaseMaterial()].internal_max_area	= _max(D->layer.Area(),materials[D->GetBaseMaterial()].internal_max_area);
		}
		std::stable_sort(Layer.begin(),Layer.end(),sort_defl_complex);

		// Select first deflectors which can fit
		Status		("Selection...");
		u32 maxarea		= c_LMAP_size*c_LMAP_size*8;	// Max up to 8 lm selected
		u32 curarea		= 0;
		u32 merge_count	= 0;
		for (u32 it=0; it<(int)Layer.size(); it++)	{
			int		defl_area	= Layer[it]->layer.Area();
			if (curarea + defl_area > maxarea) break;
			curarea		+=	defl_area;
			merge_count ++;
		}

		// Startup
		Status		("Processing...");
		_InitSurface			();
		CLightmap*	lmap		= xr_new<CLightmap> ();
		g_lightmaps.push_back	(lmap);

		// Process 
		for (u32 it=0; it<merge_count; it++) 
		{
			if (0==(it%1024))	Status	("Process [%d/%d]...",it,merge_count);
			lm_layer&	L		= Layer[it]->layer;
			L_rect		rT,rS; 
			rS.a.set	(0,0);
			rS.b.set	(L.width+2*BORDER-1, L.height+2*BORDER-1);
			rS.iArea	= L.Area();
			rT			= rS;
			if (_rect_place(rT,&L)) 
			{
				BOOL		bRotated;
				if (rT.SizeX() == rS.SizeX()) {
					R_ASSERT(rT.SizeY() == rS.SizeY());
					bRotated = FALSE;
				} else {
					R_ASSERT(rT.SizeX() == rS.SizeY());
					R_ASSERT(rT.SizeY() == rS.SizeX());
					bRotated = TRUE;
				}
				lmap->Capture		(Layer[it],rT.a.x,rT.a.y,rT.SizeX(),rT.SizeY(),bRotated);
				Layer[it]->bMerged	= TRUE;
			}
			Progress(_sqrt(float(it)/float(merge_count)));
		}
		Progress	(1.f);

		// Remove merged lightmaps
		Status			("Cleanup...");
		vecDeflIt last	= std::remove_if	(Layer.begin(),Layer.end(),pred_remove());
		Layer.erase		(last,Layer.end());

		// Save
		Status			("Saving...");
		lmap->Save		();
	}
	clMsg		("%d lightmaps builded",g_lightmaps.size());

	// Cleanup deflectors
	Progress	(1.f);
	Status		("Destroying deflectors...");
	for (u32 it=0; it<g_deflectors.size(); it++)
		xr_delete(g_deflectors[it]);
	g_deflectors.clear_and_free	();
}