void RoomContainer::_InitBlitMask() { std::cout << "Initializing blit mask..."; std::flush(std::cout); if (fBlitMask != NULL) { fBlitMask->Release(); fBlitMask = NULL; } fBlitMask = new Bitmap(AreaRect().w, AreaRect().h, 8); fBlitMask->Lock(); for (uint32 p = 0; p < fWed->CountPolygons(); p++) { const Polygon* poly = fWed->PolygonAt(p); uint32 mask = GraphicsEngine::MASK_COMPLETELY; if (poly->Flags() & IE::POLY_SHADE_WALL) mask = GraphicsEngine::MASK_SHADE; if (poly != NULL && poly->CountPoints() > 0) { fBlitMask->FillPolygon(*poly, mask); } } fBlitMask->Unlock(); fBlitMask->Update(); std::cout << "Done!" << std::endl; }
void RoomContainer::_DrawSearchMap(GFX::rect visibleArea) { if ((fSearchMap != NULL && fDrawSearchMap > 0)) { GFX::rect destRect(0, AreaRect().h - fSearchMap->Height(), AreaRect().w, AreaRect().h); GraphicsEngine::Get()->BlitToScreen(fSearchMap, NULL, &destRect); visibleArea.x /= fMapHorizontalRatio; visibleArea.y /= fMapVerticalRatio; visibleArea.w /= fMapHorizontalRatio; visibleArea.h /= fMapVerticalRatio; visibleArea = offset_rect(visibleArea, 0, AreaRect().h - fSearchMap->Height()); GraphicsEngine::Get()->ScreenBitmap()->StrokeRect(visibleArea, 500); } }
void RoomContainer::_InitSearchMap() { std::cout << "Initializing search map..."; std::flush(std::cout); std::string searchMapName = fArea->WedName().CString(); searchMapName += "SR"; BMPResource* resource = gResManager->GetBMP(searchMapName.c_str()); if (resource != NULL) { fSearchMap = resource->Image(); fMapHorizontalRatio = AreaRect().w / fSearchMap->Width(); fMapVerticalRatio = AreaRect().h / fSearchMap->Height(); gResManager->ReleaseResource(resource); } std::cout << "Done!" << std::endl; }
void RoomBase::SanitizeOffsetCenter(IE::point& point) const { const GFX::rect areaRect = AreaRect(); point.x = std::max(fViewPort.w / 2, (int)point.x); point.y = std::max(fViewPort.h / 2, (int)point.y); point.x = std::min(areaRect.w - fViewPort.w / 2, (int)point.x); point.y = std::min(areaRect.h - fViewPort.h / 2, (int)point.y); }
void RoomBase::SanitizeOffsetLeftTop(IE::point& point) const { const GFX::rect areaRect = AreaRect(); point.x = std::max(0, (int)point.x); point.y = std::max(0, (int)point.y); point.x = std::min((int)point.x, areaRect.w - fViewPort.w); point.y = std::min((int)point.y, areaRect.h - fViewPort.h); }
void RoomContainer::SetAreaOffset(IE::point point) { GFX::rect areaRect = AreaRect(); fAreaOffset = point; if (fAreaOffset.x < 0) fAreaOffset.x = 0; else if (fAreaOffset.x + fViewPort.w > areaRect.w) fAreaOffset.x = std::max(areaRect.w - fViewPort.w, 0); if (fAreaOffset.y < 0) fAreaOffset.y = 0; else if (fAreaOffset.y + fViewPort.h > areaRect.h) fAreaOffset.y = std::max(areaRect.h - fViewPort.h, 0); fMapArea = offset_rect_to(fViewPort, fAreaOffset.x, fAreaOffset.y); }
void RoomBase::SetAreaOffset(const IE::point& point) { GFX::rect areaRect = AreaRect(); fAreaOffset = point; if (fAreaOffset.x < 0) fAreaOffset.x = 0; else if (fAreaOffset.x + fViewPort.w > areaRect.w) fAreaOffset.x = std::max(areaRect.w - fViewPort.w, 0); if (fAreaOffset.y < 0) fAreaOffset.y = 0; else if (fAreaOffset.y + fViewPort.h > areaRect.h) fAreaOffset.y = std::max(areaRect.h - fViewPort.h, 0); fMapArea = gfx_rect_to_rect(offset_rect_to(fViewPort, fAreaOffset.x, fAreaOffset.y)); }
int test1() { //srand(1989); MyRectangle enclosingRect(40, 40); MyRectangle r1(15, 30); MyRectangle r2(20, 25); MyRectangle r3(9, 7); MyRectangle r4(20, 8); MyRectangle r5(10, 10); std::vector<MyRectangle> listRect; listRect.push_back(r1); listRect.push_back(r2); listRect.push_back(r3); listRect.push_back(r4); listRect.push_back(r5); std::vector<std::vector<AreaRect>> listArea; std::vector<AreaRect> row1; row1.emplace_back(15, 25, 0, 0, false); row1.emplace_back(20, 25, 15, 0, false); row1.emplace_back(5, 25, 35, 0, true); std::vector<AreaRect> row2; row2.emplace_back(15, 5, 0, 25, false); row2.emplace_back(20, 5, 15, 25, true); row2.emplace_back(5, 5, 35, 25, true); std::vector<AreaRect> row3; row3.emplace_back(15, 10, 0, 30, true); row3.emplace_back(20, 10, 15, 30, true); row3.emplace_back(5, 10, 35, 30, true); std::vector<AreaRect> row4; row4.emplace_back(15, 9, 0, 40, true); row4.emplace_back(20, 9, 15, 40, true); row4.emplace_back(5, 9, 35, 40, true); listArea.push_back(row1); listArea.push_back(row2); listArea.push_back(row3); listArea.push_back(row4); vector<vector<AreaRect>> listArea2; listArea2.reserve(100000); listArea2.emplace_back(1, AreaRect(enclosingRect.w, enclosingRect.h, 0, 0, true)); PackingAlogorithm pa; float places[6]; /*if (pa.findPlace(r1, enclosingRect, listArea2, places)) { r1.x = places[0]; r1.y = places[1]; r1.print(); pa.updateListArea(listArea2, r1, places[2], places[3], places[4], places[5]); pa.printListArea(listArea2); } cout << "--------------------------------" << endl; if (pa.findPlace(r2, enclosingRect, listArea2, places)) { r2.x = places[0]; r2.y = places[1]; r2.print(); pa.updateListArea(listArea2, r2, places[2], places[3], places[4], places[5]); pa.printListArea(listArea2); } cout << "--------------------------------" << endl; if (pa.findPlace(r5, enclosingRect, listArea2, places)) { r5.x = places[0]; r5.y = places[1]; r5.print(); pa.updateListArea(listArea2, r5, places[2], places[3], places[4], places[5]); pa.printListArea(listArea2); } cout << "--------------------------------" << endl; if (pa.findPlace(r4, enclosingRect, listArea2, places)) { r4.x = places[0]; r4.y = places[1]; r4.print(); pa.updateListArea(listArea2, r4, places[2], places[3], places[4], places[5],true); pa.printListArea(listArea2); } cout << "--------------------------------" << endl; if (pa.findPlace(r3, enclosingRect, listArea2, places)) { r3.x = places[0]; r3.y = places[1]; r3.print(); cout << "i: " << places[2] << "j: " << places[3] << "er: " << places[4] << "ec: " << places[5]; pa.updateListArea(listArea2, r3, places[2], places[3], places[4], places[5],true); pa.printListArea(listArea2); }*/ /*std::vector<MyRectangle> result = pa.pack(listRect, enclosingRect); for (auto& a : result) { a.print(); }*/ //std::vector<MyRectangle> listRect; Time tt; for (int i = 0; i < 20000; i++) { auto w = rand() % 30 + 1; auto h = rand() % 40 + 1; MyRectangle a(w,h); listRect.push_back(a); } std::cout << "Data creation time = " << tt.duration() << " ms" << std::endl; Time t; MyRectangle enclosingRect2(500,500); std::vector<MyRectangle> r = pa.pack(listRect, enclosingRect2); cout << r.size() << endl; std::cout << "Execution time = " << t.duration() << " ms" << std::endl; for (auto& a : r) { a.print(); } return 0; }
/* virtual */ IE::rect RoomContainer::Frame() const { return gfx_rect_to_rect(AreaRect()); }
/* virtual */ IE::rect RoomBase::Frame() const { return gfx_rect_to_rect(AreaRect()); }