Browse Source

Added light & zone picking to editor.

Lasse Öörni 14 years ago
parent
commit
d9524b79ad

+ 2 - 2
Bin/Data/Scripts/Editor.as

@@ -89,7 +89,7 @@ void LoadConfig()
         scaleSnap = objectElem.GetBool("scalesnap");
         useLocalIDs = objectElem.GetBool("uselocalids");
         pickComponents = objectElem.GetBool("pickcomponents");
-        pickUsingPhysics = objectElem.GetBool("pickusingphysics");
+        pickMode = objectElem.GetInt("pickmode");
     }
 
     if (!renderingElem.isNull)
@@ -131,7 +131,7 @@ void SaveConfig()
     objectElem.SetBool("scalesnap", scaleSnap);
     objectElem.SetBool("uselocalids", useLocalIDs);
     objectElem.SetBool("pickcomponents", pickComponents);
-    objectElem.SetBool("pickusingphysics", pickUsingPhysics);
+    objectElem.SetInt("pickmode", pickMode);
 
     renderingElem.SetInt("texturequality", renderer.textureQuality);
     renderingElem.SetInt("materialquality", renderer.materialQuality);

+ 51 - 31
Bin/Data/Scripts/Editor/EditorCamera.as

@@ -17,6 +17,13 @@ enum AxisMode
     AXIS_LOCAL
 }
 
+Text@ editorModeText;
+Text@ renderStatsText;
+Text@ cameraPosText;
+
+ObjectMoveMode moveMode = OBJ_MOVE;
+AxisMode axisMode = AXIS_WORLD;
+
 float cameraBaseSpeed = 10;
 float cameraBaseRotationSpeed = 0.2;
 float cameraShiftSpeedMultiplier = 5;
@@ -29,22 +36,24 @@ float scaleStep = 0.1;
 bool moveSnap = false;
 bool rotateSnap = false;
 bool scaleSnap = false;
-ObjectMoveMode moveMode = OBJ_MOVE;
-AxisMode axisMode = AXIS_WORLD;
-
-Text@ renderStatsText;
-Text@ cameraPosText;
-bool subscribedToCameraEdits = false;
+bool subscribedToEditorSettings = false;
 
 Array<String> moveModeText = {
-    "Move    ",
-    "Rotate  ",
-    "Scale   "
+    "Move",
+    "Rotate",
+    "Scale"
 };
 
 Array<String> axisModeText = {
-    "World   ",
-    "Local   "
+    "World",
+    "Local"
+};
+
+Array<String> pickModeText = {
+    "Geometries",
+    "Lights",
+    "Zones",
+    "Col.shapes"
 };
 
 void CreateCamera()
@@ -118,8 +127,8 @@ void UpdateEditorSettingsDialog()
     CheckBox@ pickComponentsToggle = settingsDialog.GetChild("PickComponentsToggle", true);
     pickComponentsToggle.checked = pickComponents;
 
-    CheckBox@ pickUsingPhysicsToggle = settingsDialog.GetChild("PickUsingPhysicsToggle", true);
-    pickUsingPhysicsToggle.checked = pickUsingPhysics;
+    DropDownList@ pickModeEdit = settingsDialog.GetChild("PickModeEdit", true);
+    pickModeEdit.selection = pickMode;
 
     DropDownList@ textureQualityEdit = settingsDialog.GetChild("TextureQualityEdit", true);
     textureQualityEdit.selection = renderer.textureQuality;
@@ -148,7 +157,7 @@ void UpdateEditorSettingsDialog()
     CheckBox@ frameLimiterToggle = settingsDialog.GetChild("FrameLimiterToggle", true);
     frameLimiterToggle.checked = engine.maxFps > 0;
 
-    if (!subscribedToCameraEdits)
+    if (!subscribedToEditorSettings)
     {
         SubscribeToEvent(nearClipEdit, "TextChanged", "EditCameraNearClip");
         SubscribeToEvent(nearClipEdit, "TextFinished", "EditCameraNearClip");
@@ -171,7 +180,7 @@ void UpdateEditorSettingsDialog()
         SubscribeToEvent(scaleSnapToggle, "Toggled", "EditScaleSnap");
         SubscribeToEvent(localIDToggle, "Toggled", "EditUseLocalIDs");
         SubscribeToEvent(pickComponentsToggle, "Toggled", "EditPickComponents");
-        SubscribeToEvent(pickUsingPhysicsToggle, "Toggled", "EditPickUsingPhysics");
+        SubscribeToEvent(pickModeEdit, "ItemSelected", "EditPickMode");
         SubscribeToEvent(textureQualityEdit, "ItemSelected", "EditTextureQuality");
         SubscribeToEvent(materialQualityEdit, "ItemSelected", "EditMaterialQuality");
         SubscribeToEvent(shadowResolutionEdit, "ItemSelected", "EditShadowResolution");
@@ -183,7 +192,7 @@ void UpdateEditorSettingsDialog()
         SubscribeToEvent(lightStencilMaskingToggle, "Toggled", "EditLightStencilMasking");
         SubscribeToEvent(frameLimiterToggle, "Toggled", "EditFrameLimiter");
         SubscribeToEvent(settingsDialog.GetChild("CloseButton", true), "Released", "HideEditorSettingsDialog");
-        subscribedToCameraEdits = true;
+        subscribedToEditorSettings = true;
     }
 }
 
@@ -293,10 +302,10 @@ void EditPickComponents(StringHash eventType, VariantMap& eventData)
     pickComponents = edit.checked;
 }
 
-void EditPickUsingPhysics(StringHash eventType, VariantMap& eventData)
+void EditPickMode(StringHash eventType, VariantMap& eventData)
 {
-    CheckBox@ edit = eventData["Element"].GetUIElement();
-    pickUsingPhysics = edit.checked;
+    DropDownList@ edit = eventData["Element"].GetUIElement();
+    pickMode = edit.selection;
 }
 
 void EditTextureQuality(StringHash eventType, VariantMap& eventData)
@@ -359,25 +368,29 @@ void CreateStatsBar()
 {
     Font@ font = cache.GetResource("Font", "Fonts/Anonymous Pro.ttf");
 
+    editorModeText = Text();
     renderStatsText = Text();
     cameraPosText = Text();
 
     if (ui.root.width >= 1024)
     {
-        SetupStatsBarText(renderStatsText, font, 0, 20, HA_LEFT);
-        SetupStatsBarText(cameraPosText, font, 0, 20, HA_RIGHT);
+        SetupStatsBarText(editorModeText, font, 0, 20, HA_LEFT, VA_TOP);
+        SetupStatsBarText(renderStatsText, font, 0, 20, HA_RIGHT, VA_TOP);
     }
     else
     {
-        SetupStatsBarText(renderStatsText, font, 0, 20, HA_LEFT);
-        SetupStatsBarText(cameraPosText, font, 0, 32, HA_LEFT);
+        SetupStatsBarText(editorModeText, font, 0, 20, HA_LEFT, VA_TOP);
+        SetupStatsBarText(renderStatsText, font, 0, 32, HA_LEFT, VA_TOP);
     }
+
+    SetupStatsBarText(cameraPosText, font, 0, 0, HA_LEFT, VA_BOTTOM);
 }
 
-void SetupStatsBarText(Text@ text, Font@ font, int x, int y, HorizontalAlignment align)
+void SetupStatsBarText(Text@ text, Font@ font, int x, int y, HorizontalAlignment hAlign, VerticalAlignment vAlign)
 {
     text.position = IntVector2(x, y);
-    text.horizontalAlignment = align;
+    text.horizontalAlignment = hAlign;
+    text.verticalAlignment = vAlign;
     text.SetFont(font, 11);
     text.color = Color(1, 1, 0);
     text.priority = -100;
@@ -386,12 +399,18 @@ void SetupStatsBarText(Text@ text, Font@ font, int x, int y, HorizontalAlignment
 
 void UpdateStats(float timeStep)
 {
+    editorModeText.text = String(
+        "Mode: " + moveModeText[moveMode] +
+        "  Axis: " + axisModeText[axisMode] +
+        "  Pick: " + pickModeText[pickMode] +
+        "  Updates: " + (runUpdate ? "Running" : "Paused"));
+
     renderStatsText.text = String(
         "Tris: " + renderer.numPrimitives +
-        " Batches: " + renderer.numBatches +
-        " Lights: " + renderer.numLights[true] +
-        " Shadowmaps: " + renderer.numShadowMaps[true] +
-        " Occluders: " + renderer.numOccluders[true] + " / " + renderer.numShadowOccluders[true]);
+        "  Batches: " + renderer.numBatches +
+        "  Lights: " + renderer.numLights[true] +
+        "  Shadowmaps: " + renderer.numShadowMaps[true] +
+        "  Occluders: " + renderer.numOccluders[true] + " / " + renderer.numShadowOccluders[true]);
 
     Vector3 cameraPos = cameraNode.position;
     String xText(cameraPos.x);
@@ -401,9 +420,10 @@ void UpdateStats(float timeStep)
     yText.Resize(8);
     zText.Resize(8);
 
-    cameraPosText.text = moveModeText[moveMode] + axisModeText[axisMode] + "Updates: " + (runUpdate ? "Running " : "Paused  ") + " Camera pos: " + xText
-        + " " + yText + " " + zText + " ";
+    cameraPosText.text = String(
+        "Pos: " + xText + " " + yText + " " + zText);
 
+    editorModeText.size = editorModeText.minSize;
     renderStatsText.size = renderStatsText.minSize;
     cameraPosText.size = cameraPosText.minSize;
 }

+ 31 - 8
Bin/Data/Scripts/Editor/EditorScene.as

@@ -3,6 +3,12 @@
 #include "Scripts/Editor/EditorSceneWindow.as"
 #include "Scripts/Editor/EditorNodeWindow.as"
 
+const int PICK_GEOMETRIES = 0;
+const int PICK_LIGHTS = 1;
+const int PICK_ZONES = 2;
+const int PICK_COLLISIONSHAPES = 3;
+const int MAX_PICK_MODES = 4;
+
 Scene@ editorScene;
 
 String sceneFileName;
@@ -12,11 +18,17 @@ bool runUpdate = false;
 bool renderingDebug = false;
 bool physicsDebug = false;
 bool octreeDebug = false;
-bool subscribedToSceneSettingsEdits = false;
+int pickMode = PICK_GEOMETRIES;
 
 Component@ selectedComponent;
 Node@ selectedNode;
 
+Array<int> pickModeDrawableFlags = {
+    DRAWABLE_GEOMETRY,
+    DRAWABLE_LIGHT,
+    DRAWABLE_ZONE
+};
+
 void CreateScene()
 {
     selectedComponent = null;
@@ -298,26 +310,37 @@ void SceneRaycast(bool mouseClick)
     {
         Ray cameraRay = camera.GetScreenRay(float(pos.x) / graphics.width, float(pos.y) / graphics.height);
 
-        if (!pickUsingPhysics)
+        if (pickMode != PICK_COLLISIONSHAPES)
         {
             if (editorScene.octree is null)
                 return;
-            Array<RayQueryResult> result = editorScene.octree.Raycast(cameraRay, RAY_TRIANGLE, camera.farClip, DRAWABLE_GEOMETRY);
+
+            Array<RayQueryResult> result = editorScene.octree.Raycast(cameraRay, RAY_TRIANGLE, camera.farClip,
+                pickModeDrawableFlags[pickMode]);
             if (!result.empty)
             {
-                Drawable@ drawable = result[0].drawable;
-                if (debug !is null)
+                for (uint i = 0; i < result.length; ++i)
                 {
-                    debug.AddNode(drawable.node, false);
-                    drawable.DrawDebugGeometry(debug, false);
+                    Drawable@ drawable = result[i].drawable;
+                    // Skip directional lights, which always block other selections
+                    Light@ light = cast<Light>(drawable);
+                    if (light !is null && light.lightType == LIGHT_DIRECTIONAL)
+                        continue;
+                    if (debug !is null)
+                    {
+                        debug.AddNode(drawable.node, false);
+                        drawable.DrawDebugGeometry(debug, false);
+                    }
+                    selected = drawable;
+                    break;
                 }
-                selected = drawable;
             }
         }
         else
         {
             if (editorScene.physicsWorld is null)
                 return;
+
             Array<PhysicsRaycastResult> result = editorScene.physicsWorld.Raycast(cameraRay, camera.farClip);
             if (!result.empty)
             {

+ 0 - 1
Bin/Data/Scripts/Editor/EditorSceneWindow.as

@@ -10,7 +10,6 @@ XMLFile copyBuffer;
 bool copyBufferLocal = false;
 bool copyBufferExpanded = false;
 bool pickComponents = false;
-bool pickUsingPhysics = false;
 
 void CreateSceneWindow()
 {

+ 12 - 0
Bin/Data/Scripts/Editor/EditorUI.as

@@ -421,6 +421,18 @@ void HandleKeyDown(StringHash eventType, VariantMap& eventData)
             moveMode = OBJ_SCALE;
         else if (key == '4')
             axisMode = AxisMode(axisMode ^ AXIS_LOCAL);
+        else if (key == '5')
+        {
+            --pickMode;
+            if (pickMode < PICK_GEOMETRIES)
+                pickMode = MAX_PICK_MODES - 1;
+        }
+        else if (key == '6')
+        {
+            ++pickMode;
+            if (pickMode >= MAX_PICK_MODES)
+                pickMode = PICK_GEOMETRIES;
+        }
         else
             SteppedObjectManipulation(key);
     }

+ 23 - 7
Bin/Data/UI/EditorSettingsDialog.xml

@@ -120,11 +120,27 @@
     <element>
         <fixedheight value="17" />
         <layout mode="horizontal" spacing="8" />
-        <element type="CheckBox" name="LocalIDToggle">
-            <fixedsize value="16 16" />
-        </element>
         <element type="Text">
-            <text value="Use local entity IDs on import" />
+            <text value="Pick components of type" />
+        </element>
+        <element type="Text" style="FileSelectorFilterText" name="PickGeometries">
+            <text value="Geometries" />
+        </element>
+        <element type="Text" style="FileSelectorFilterText" name="PickLights">
+            <text value="Lights" />
+        </element>
+        <element type="Text" style="FileSelectorFilterText" name="PickZones">
+            <text value="Zones" />
+        </element>
+        <element type="Text" style="FileSelectorFilterText" name="PickCollisionShapes">
+            <text value="Col.shapes" />
+        </element>
+        <element type="DropDownList" name="PickModeEdit">
+            <fixedwidth value="100" />
+            <popupitem name="PickGeometries" />
+            <popupitem name="PickLights" />
+            <popupitem name="PickZones" />
+            <popupitem name="PickCollisionShapes" />
         </element>
     </element>
     <element>
@@ -134,17 +150,17 @@
             <fixedsize value="16 16" />
         </element>
         <element type="Text">
-            <text value="Pick components instead of nodes" />
+            <text value="Select components instead of nodes" />
         </element>
     </element>
     <element>
         <fixedheight value="17" />
         <layout mode="horizontal" spacing="8" />
-        <element type="CheckBox" name="PickUsingPhysicsToggle">
+        <element type="CheckBox" name="LocalIDToggle">
             <fixedsize value="16 16" />
         </element>
         <element type="Text">
-            <text value="Pick using physics raycast" />
+            <text value="Use local entity IDs on import" />
         </element>
     </element>
     <element type="BorderImage" style="EditorDivider">

+ 3 - 0
Docs/GettingStarted.dox

@@ -509,6 +509,9 @@ Right mouse     - Hold down and move mouse to rotate camera
 WSAD or arrows  - Move
 Shift+WSAD      - Move faster
 Ctrl+1,2,3      - Select manipulation mode: move/rotate/scale
+Ctrl+4          - Toggle between world and local axes manipulation
+Ctrl+5,6        - Cycle through components to pick: geometries, lights, zones,
+                  collision shapes
 Ctrl+arrows     - Manipulate node in X & Z directions
 Ctrl+pgup/pgdn  - Manipulate node in Y direction
 Ctrl+plus/minus - Scale node uniformly (scale mode only)