add edge selection

This commit is contained in:
Crypto City 2019-08-15 00:51:25 +00:00
parent 408fb7b456
commit efdeddfaaa
5 changed files with 38 additions and 0 deletions

View File

@ -118,6 +118,7 @@ public:
void HandleEditModeChanged(StringHash eventType, VariantMap& eventData);
void HandleGrowSelection(StringHash eventType, VariantMap& eventData);
void HandleShrinkSelection(StringHash eventType, VariantMap& eventData);
void HandleSelectEdge(StringHash eventType, VariantMap& eventData);
void HandleNewWallet(StringHash eventType, VariantMap& eventData);
void HandleNewSnapshot(StringHash eventType, VariantMap& eventData);
@ -411,6 +412,7 @@ void CryptoCityUrho3D::SetupUI()
SubscribeToEvent(ui, E_CRYPTOCITY_EDIT_MODE_CHANGED, URHO3D_HANDLER(CryptoCityUrho3D, HandleEditModeChanged));
SubscribeToEvent(ui, E_CRYPTOCITY_GROW_SELECTION, URHO3D_HANDLER(CryptoCityUrho3D, HandleGrowSelection));
SubscribeToEvent(ui, E_CRYPTOCITY_SHRINK_SELECTION, URHO3D_HANDLER(CryptoCityUrho3D, HandleShrinkSelection));
SubscribeToEvent(ui, E_CRYPTOCITY_SELECT_EDGE, URHO3D_HANDLER(CryptoCityUrho3D, HandleSelectEdge));
}
void CryptoCityUrho3D::LoadEffects()
@ -1632,4 +1634,10 @@ void CryptoCityUrho3D::HandleShrinkSelection(StringHash eventType, VariantMap& e
cityMesh->setHighlight(GetEffectiveSelection(), flagUnderConstruction);
}
void CryptoCityUrho3D::HandleSelectEdge(StringHash eventType, VariantMap& eventData)
{
selection.make_edge();
cityMesh->setHighlight(GetEffectiveSelection(), flagUnderConstruction);
}
URHO3D_DEFINE_APPLICATION_MAIN(CryptoCityUrho3D)

View File

@ -136,6 +136,32 @@ void Selection::shrink()
fit();
}
void Selection::make_edge()
{
Selection org = *this;
for (uint32_t y = y0; y <= y1; ++y)
{
for (uint32_t x = x0; x <= x1; ++x)
{
if (org.is_selected(x, y))
{
int edge = 0;
edge += x == x0 || !org.is_selected(x-1, y);
edge += x == x1 || !org.is_selected(x+1, y);
edge += y == y0 || !org.is_selected(x, y-1);
edge += y == y1 || !org.is_selected(x, y+1);
edge += x == x0 || y == y0 || !org.is_selected(x-1, y-1);
edge += x == x1 || y == y0 || !org.is_selected(x+1, y-1);
edge += x == x0 || y == y1 || !org.is_selected(x-1, y+1);
edge += x == x1 || y == y1 || !org.is_selected(x+1, y+1);
if (edge == 0)
clear(x, y);
}
}
}
}
void Selection::fit()
{
uint32_t newx0 = x1, newy0 = y1, newx1 = x0, newy1 = y0;

View File

@ -29,6 +29,7 @@ public:
void clear(uint32_t x, uint32_t y);
void grow();
void shrink();
void make_edge();
void fit();
void set_rectangle(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1);
void set_intersection(const Selection &s);

View File

@ -285,11 +285,13 @@ void UIUrho3D::CreateEditModeWindow()
Button *selectEllipseButton = AddButton(w, "Select ellipse");
Button *growSelectionButton = AddButton(w, "Grow selection");
Button *shrinkSelectionButton = AddButton(w, "Shrink selection");
Button *selectEdgeButton = AddButton(w, "Select edge");
SubscribeToEvent(selectRectangleButton, E_RELEASED, [this](StringHash eventType, VariantMap& eventData) { NotifyEditMode(EM_SELECT_RECTANGLE); });
SubscribeToEvent(selectEllipseButton, E_RELEASED, [this](StringHash eventType, VariantMap& eventData) { NotifyEditMode(EM_SELECT_ELLIPSE); });
SubscribeToEvent(growSelectionButton, E_RELEASED, [this](StringHash eventType, VariantMap& eventData) { SendEvent(E_CRYPTOCITY_GROW_SELECTION); });
SubscribeToEvent(shrinkSelectionButton, E_RELEASED, [this](StringHash eventType, VariantMap& eventData) { SendEvent(E_CRYPTOCITY_SHRINK_SELECTION); });
SubscribeToEvent(selectEdgeButton, E_RELEASED, [this](StringHash eventType, VariantMap& eventData) { SendEvent(E_CRYPTOCITY_SELECT_EDGE); });
editModeWindow->SetPosition(graphics->GetWidth() - editModeWindow->GetWidth(), 0);
}

View File

@ -38,6 +38,7 @@ URHO3D_EVENT(E_CRYPTOCITY_LOAD_MODEL, LoadModel) { URHO3D_PARAM(P_FILENAME, File
URHO3D_EVENT(E_CRYPTOCITY_EDIT_MODE_CHANGED, EditModeChanged) { URHO3D_PARAM(P_EDIT_MODE, Mode); }
URHO3D_EVENT(E_CRYPTOCITY_GROW_SELECTION, GrowSelection) { }
URHO3D_EVENT(E_CRYPTOCITY_SHRINK_SELECTION, ShrinkSelection) { }
URHO3D_EVENT(E_CRYPTOCITY_SELECT_EDGE, SelectEdge) { }
class UIUrho3D: public Urho3D::UIElement
{