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(); }
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 (); }