| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- // Urho3D editor layer window
- enum EditMaskType
- {
- EDIT_VIEW_MASK = 0,
- EDIT_LIGHT_MASK,
- EDIT_SHADOW_MASK,
- EDIT_ZONE_MASK
- }
- StringHash lineEditType = StringHash("LineEdit");
- StringHash eventTypeMouseButtonDown = StringHash("MouseButtonDown");
- StringHash eventTypeMouseMove = StringHash("MouseMove");
- Array<CheckBox@> bits;
- Window@ layerWindow;
- IntVector2 layerWindowPosition;
- Node@ patternMaskNode;
- EditMode previousEdit ;
- bool toggleBusy = false;
- int editMaskType = 0;
- void CreateLayerEditor()
- {
- if (layerWindow !is null)
- return;
- layerWindow = LoadEditorUI("UI/EditorLayersWindow.xml");
- ui.root.AddChild(layerWindow);
- layerWindow.opacity = uiMaxOpacity;
-
- HideLayerEditor();
-
- bits.Resize(MAX_BITMASK_BITS);
-
- DropDownList@ EditMaskModeList = layerWindow.GetChild("LayerModeEdit", true);
- SubscribeToEvent(EditMaskModeList, "ItemSelected", "HandleLayerModeEdit");
-
- for (int i=0; i < MAX_BITMASK_BITS; i++)
- {
- bits[i] = layerWindow.GetChild("Bit" + String(i), true);
- bits[i].vars["index"] = i;
- SubscribeToEvent(bits[i], "Toggled", "ToggleBits");
- }
- }
- bool ShowLayerEditor()
- {
- // avoid to show layer window when we type text in LineEdit
- if (ui.focusElement !is null && ui.focusElement.type == lineEditType && lastSelectedNode.Get() is null)
- return false;
-
- // to avoid when we close dialog with selected other node
- Node@ node = lastSelectedNode.Get();
- patternMaskNode = node;
-
- // just change position if already opened
- if (layerWindow.visible == true)
- {
- HideLayerEditor();
- /*
- layerWindowPosition = ui.cursorPosition;
- layerWindow.position = layerWindowPosition;
- layerWindowPosition.x += layerWindow.width / 2;
- layerWindow.BringToFront();
- */
- return true;
- }
-
- // to prevent manipulation until we change mask for one or group nodes
- previousEdit = editMode;
- editMode = EDIT_SELECT;
-
- // get mask type from pattern node
- EstablishSelectedNodeBitMaskToPanel();
-
- layerWindowPosition = ui.cursorPosition;
- layerWindow.position = layerWindowPosition;
- layerWindowPosition.x += layerWindow.width / 2;
- layerWindow.visible = true;
- layerWindow.BringToFront();
- return true;
- }
- void HideLayerEditor()
- {
- layerWindow.visible = false;
- editMode = previousEdit;
- }
- void EstablishSelectedNodeBitMaskToPanel()
- {
- if (selectedNodes.length < 1) return;
- Node@ node;
- node = patternMaskNode;
-
- if (node !is null)
- {
- // find first drawable to get mask
- Array<Component@> components = node.GetComponents();
- Drawable@ firstDrawableInNode;
- if (components.length > 0 )
- {
- firstDrawableInNode = cast<Drawable>(components[0]);
- }
-
- if (firstDrawableInNode !is null)
- {
- int showMask = 0;
-
- switch (editMaskType)
- {
- case EDIT_VIEW_MASK:
- showMask = firstDrawableInNode.viewMask;
- break;
- case EDIT_LIGHT_MASK:
- showMask = firstDrawableInNode.lightMask;
- break;
- case EDIT_SHADOW_MASK:
- showMask = firstDrawableInNode.shadowMask;
- break;
- case EDIT_ZONE_MASK:
- showMask = firstDrawableInNode.zoneMask;
- break;
- }
-
- SetupBitsPanel(showMask);
- }
- }
- }
- void SetupBitsPanel(int mask)
- {
- for (int i = 0; i < 8; i++)
- {
- if ((1 << i) & mask != 0)
- {
- bits[i].checked = true;
- }
- else
- {
- bits[i].checked = false;
- }
- }
- }
- void ChangeNodeViewMask(Node@ node, EditActionGroup@ group, int mask)
- {
- Array<Component@> components = node.GetComponents();
- if (components.length > 0)
- {
- for (uint componentIndex = 0; componentIndex < components.length; componentIndex++)
- {
- Component@ component = components[componentIndex];
- Drawable@ drawable = cast<Drawable>(component);
- if (drawable !is null)
- {
- // Save before modification
- CreateDrawableMaskAction action;
- action.Define(drawable, editMaskType);
- group.actions.Push(action);
-
- switch (editMaskType)
- {
- case EDIT_VIEW_MASK:
- drawable.viewMask = mask;
- break;
- case EDIT_LIGHT_MASK:
- drawable.lightMask = mask;
- break;
- case EDIT_SHADOW_MASK:
- drawable.shadowMask = mask;
- break;
- case EDIT_ZONE_MASK:
- drawable.zoneMask = mask;
- break;
- }
- }
- }
- }
- }
- void EstablishBitMaskToSelectedNodes()
- {
- if (selectedNodes.length < 1) return;
-
- int maskTypeSelected = 0;
-
- // Group for storing undo actions
- EditActionGroup group;
-
- for (uint indexNode = 0; indexNode < selectedNodes.length; indexNode++)
- {
- Node@ node = selectedNodes[indexNode];
- if (node !is null)
- {
- int mask = 0;
- for (int i = 0; i < MAX_BITMASK_BITS; i++)
- {
- mask = mask | (bits[i].checked ? 1 << i : 0);
- }
-
- if (mask == MAX_BITMASK_VALUE)
- mask = -1;
-
- ChangeNodeViewMask(node, group, mask);
- Array<Node@> children = node.GetChildren(true);
- if (children.length > 0)
- {
- for (uint i = 0; i < children.length; i++)
- {
- ChangeNodeViewMask(children[i], group, mask);
- }
- }
- }
- }
-
- SaveEditActionGroup(group);
- SetSceneModified();
- }
- void HandleLayerModeEdit(StringHash eventType, VariantMap& eventData)
- {
- DropDownList@ edit = eventData["Element"].GetPtr();
- editMaskType = edit.selection;
- EstablishSelectedNodeBitMaskToPanel();
- }
- void HandleMaskTypeScroll(StringHash eventType, VariantMap& eventData)
- {
- if (!layerWindow.IsInside(ui.cursorPosition, true)) return;
-
- DropDownList@ listView = layerWindow.GetChild("LayerModeEdit", true);
- editMaskType = listView.selection;
-
- int wheel = eventData["Wheel"].GetInt();
-
- if (wheel > 0)
- {
- if (editMaskType > 0) editMaskType--;
- }
- else if (wheel < 0)
- {
- if (editMaskType < 3) editMaskType++;
- }
-
- listView.selection = editMaskType;
- EstablishSelectedNodeBitMaskToPanel();
- }
- void HandleHideLayerEditor(StringHash eventType, VariantMap& eventData)
- {
- if (layerWindow.visible == false) return;
-
- // if layer window not in focus and mouse folow away - close layer window
- if ( eventType == eventTypeMouseMove)
- {
- IntVector2 mousePos;
- mousePos.x = eventData["X"].GetInt();
- mousePos.y = eventData["Y"].GetInt();
-
- Vector2 a = Vector2(layerWindowPosition.x, layerWindowPosition.y);
- Vector2 b = Vector2(mousePos.x, mousePos.y);
- Vector2 dir = a - b;
- float distance = dir.length;
-
- if (distance > layerWindow.width)
- HideLayerEditor();
- }
- // if user click on scene - close layser window
- else if (eventType == eventTypeMouseButtonDown)
- {
- if (ui.focusElement is null)
- {
- HideLayerEditor();
- }
- }
- }
- // Every time then we click on bits they are immediately established for all selected nodes for masks
- void ToggleBits(StringHash eventType, VariantMap& eventData)
- {
- if (toggleBusy) return;
- toggleBusy = true;
-
- CheckBox@ cb = cast<CheckBox>(eventData["Element"].GetPtr());
- int bitIndex = cb.vars["index"].GetInt();
-
-
- if (bitIndex < MAX_BITMASK_BITS)
- {
- // batch bits invert if pressed ctrl or alt
- if (input.keyDown[KEY_CTRL])
- {
- bool bit = true;
- bits[bitIndex].checked = bit;
-
- for (int i = 0; i < MAX_BITMASK_BITS; i++)
- {
- if (i != bitIndex)
- {
- bits[i].checked = !bit;
- };
- }
- }
- else if (input.keyDown[KEY_ALT])
- {
- bool bit = false;
- bits[bitIndex].checked = bit;
-
- for (int i = 0; i < MAX_BITMASK_BITS; i++)
- {
- if (i != bitIndex)
- {
- bits[i].checked = !bit;
- };
- }
- }
-
- EstablishBitMaskToSelectedNodes();
- }
-
- toggleBusy = false;
- }
|