forked from townforge/townforge
add edge selection
This commit is contained in:
parent
408fb7b456
commit
efdeddfaaa
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user