示例#1
0
        private void OnDrawGizmos()
        {
            if (PathFinderSettings.isAreaPointerMoving)
            {
                float       gs          = PathFinder.gridSize;
                AreaPointer areaPointer = PathFinder.settings.areaPointer;
                float       y           = areaPointer.y;

                Color gColor = Gizmos.color;
                Gizmos.color = SetAlpha(Color.yellow, 0.3f);

                int startX = areaPointer.roundStartX;
                int startZ = areaPointer.roundStartZ;
                int endX   = areaPointer.roundEndX;
                int endZ   = areaPointer.roundEndZ;
                int sizeX  = areaPointer.roundSizeX;
                int sizeZ  = areaPointer.roundSizeZ;

                if (sizeX < 100 && sizeZ > 1)
                {
                    for (int x = startX; x < endX; x++)
                    {
                        Gizmos.DrawLine(new Vector3(x * gs, y, startZ * gs), new Vector3(x * gs, y, endZ * gs));
                    }
                }

                if (sizeZ < 100 && sizeX > 1)
                {
                    for (int z = startZ; z < endZ; z++)
                    {
                        Gizmos.DrawLine(new Vector3(startX * gs, y, z * gs), new Vector3(endX * gs, y, z * gs));
                    }
                }

                Gizmos.color = SetAlpha(Color.red, 0.2f);

                gizmosVerts[0] = new Vector3(startX * gs, 0, startZ * gs);
                gizmosVerts[1] = new Vector3(startX * gs, 0, endZ * gs);
                gizmosVerts[2] = new Vector3(endX * gs, 0, startZ * gs);
                gizmosVerts[3] = new Vector3(endX * gs, 0, endZ * gs);

                float gY = y >= 0 ? y + 1 : y - 1;
                gizmosVerts[4] = new Vector3(startX * gs, gY, startZ * gs);
                gizmosVerts[5] = new Vector3(startX * gs, gY, endZ * gs);
                gizmosVerts[6] = new Vector3(endX * gs, gY, startZ * gs);
                gizmosVerts[7] = new Vector3(endX * gs, gY, endZ * gs);

                gizmosMesh.vertices = gizmosVerts;
                gizmosMesh.RecalculateBounds();

                Gizmos.DrawMesh(gizmosMesh);
                Gizmos.color = gColor;
            }
        }
示例#2
0
        private void ImportantButtons()
        {
            //properties

            EditorGUI.BeginChangeCheck();
            bool someBool = EditorGUILayout.Foldout(drawBuilder.boolValue, drawBuilderContent);

            if (EditorGUI.EndChangeCheck())
            {
                drawBuilder.boolValue = someBool;
            }



            if (drawBuilder.boolValue)
            {
                float rightOffset      = 30;
                float singleLineHeight = EditorGUIUtility.singleLineHeight;

                EditorGUILayout.PropertyField(targetProperties, targetPropertiesContent);

                //sellected chunks
                #region sellector
                Rect buildAreaRect = GUILayoutUtility.GetRect(Screen.width - rightOffset, singleLineHeight * 3);

                Rect baLeftRect  = new Rect(buildAreaRect.x, buildAreaRect.y + singleLineHeight, buildAreaRect.width * 0.5f, buildAreaRect.height - singleLineHeight);
                Rect baRightRect = new Rect(buildAreaRect.x + (buildAreaRect.width * 0.5f), buildAreaRect.y + singleLineHeight, buildAreaRect.width * 0.5f, buildAreaRect.height - singleLineHeight);

                GUI.Box(buildAreaRect, buildAreaString);
                //GUI.Box(baLeftRect, string.Empty);
                //GUI.Box(baRightRect, string.Empty);

                AreaPointer areaPointer = settings.areaPointer;

                float tLabelSize = 40;
                float tRemainSize = Mathf.Max(baRightRect.width - tLabelSize, 0);
                int   pStartX, pStartZ, pSizeX, pSizeZ;
                Rect  rectStartLablel = new Rect(baRightRect.x, baRightRect.y, tLabelSize, singleLineHeight);
                Rect  rectStartX      = new Rect(baRightRect.x + tLabelSize, baRightRect.y, tRemainSize * 0.5f, singleLineHeight);
                Rect  rectStartZ      = new Rect(baRightRect.x + tLabelSize + (tRemainSize * 0.5f), baRightRect.y, tRemainSize * 0.5f, singleLineHeight);

                Rect rectSizeLablel = new Rect(baRightRect.x, baRightRect.y + singleLineHeight, tLabelSize, singleLineHeight);
                Rect rectSizeX      = new Rect(baRightRect.x + tLabelSize, baRightRect.y + singleLineHeight, tRemainSize * 0.5f, singleLineHeight);
                Rect rectSizeZ      = new Rect(baRightRect.x + tLabelSize + (tRemainSize * 0.5f), baRightRect.y + singleLineHeight, tRemainSize * 0.5f, singleLineHeight);

                EditorGUIUtility.labelWidth = tLabelSize;
                EditorGUI.LabelField(rectStartLablel, "Start");
                EditorGUI.LabelField(rectSizeLablel, "Size");

                EditorGUIUtility.labelWidth = 15;
                EditorGUI.BeginChangeCheck();
                pStartX = EditorGUI.IntField(rectStartX, startXContent, areaPointer.roundStartX);
                pStartZ = EditorGUI.IntField(rectStartZ, startZContent, areaPointer.roundStartZ);
                pSizeX  = EditorGUI.IntField(rectSizeX, sizeXContent, areaPointer.roundSizeX);
                pSizeZ  = EditorGUI.IntField(rectSizeZ, sizeZContent, areaPointer.roundSizeZ);
                if (EditorGUI.EndChangeCheck())
                {
                    settings.areaPointer = new AreaPointer(pStartX, pStartZ, pStartX + pSizeX, pStartZ + pSizeZ, settings.areaPointer.y);
                }
                EditorGUIUtility.labelWidth = LABEL_WIDTH;

                if (sellectorMove)
                {
                    GUI.Box(new Rect(baLeftRect.x, baLeftRect.y, baLeftRect.width, singleLineHeight), "Move");
                }
                else
                {
                    if (GUI.Button(new Rect(baLeftRect.x, baLeftRect.y, baLeftRect.width, singleLineHeight), "Move"))
                    {
                        sellectorMove = true;
                    }
                }

                if (GUI.Button(new Rect(baLeftRect.x, baLeftRect.y + singleLineHeight, baLeftRect.width, singleLineHeight), "Reset"))
                {
                    settingsDrawer.ResetAreaPointer();
                }


                #endregion

                GUILayout.Space(5);

                //control buttons
                #region control buttons
                Rect things = GUILayoutUtility.GetRect(Screen.width - rightOffset, singleLineHeight * 4);

                Rect left  = new Rect(things.x, things.y, things.width * 0.5f, things.height);
                Rect right = new Rect(things.x + (things.width * 0.5f), things.y, things.width * 0.5f, things.height);

                GUI.Box(left, leftBoxContent);
                GUI.Box(right, rightBoxContent);

                #region navmesh building
                Rect rectBuild = new Rect(left.x, left.y + singleLineHeight, left.width, singleLineHeight);

                if (GUI.Button(rectBuild, buildContent))
                {
                    if (settings.targetProperties != null)
                    {
                        PathFinder.QueueGraph(
                            settings.areaPointer.roundStartX,
                            settings.areaPointer.roundStartZ,
                            settings.targetProperties,
                            settings.areaPointer.roundSizeX,
                            settings.areaPointer.roundSizeZ);
                    }
                    else
                    {
                        Debug.LogWarning(forgotToAddPropertiesWarning);
                    }
                }


                GUIContent targetRemoveContent = settings.removeAndRebuild ? removeAndRebuildContent : removeContent;

                Rect rectRemove       = new Rect(left.x, left.y + (singleLineHeight * 2), left.width - singleLineHeight, singleLineHeight);
                Rect rectRemoveToggle = new Rect(left.x + (left.width - singleLineHeight), left.y + (singleLineHeight * 2), singleLineHeight, singleLineHeight);

                if (GUI.Button(rectRemove, targetRemoveContent))
                {
                    if (settings.targetProperties != null)
                    {
                        PathFinder.RemoveGraph(
                            settings.areaPointer.roundStartX,
                            settings.areaPointer.roundStartZ,
                            settings.targetProperties,
                            settings.areaPointer.roundSizeX,
                            settings.areaPointer.roundSizeZ,
                            settings.removeAndRebuild);
                    }
                    else
                    {
                        Debug.LogWarning(forgotToAddPropertiesWarning);
                    }
                }

                EditorGUI.BeginChangeCheck();
                someBool = GUI.Toggle(rectRemoveToggle, settings.removeAndRebuild, rebuildToggleContent);
                if (EditorGUI.EndChangeCheck())
                {
                    settings.removeAndRebuild = someBool;
                }

                Rect rectClear = new Rect(left.x, left.y + (singleLineHeight * 3), left.width, singleLineHeight);

                if (GUI.Button(rectClear, clearContent))
                {
                    PathFinder.ClearAllWork();
                    Debuger_K.ClearChunksDebug();
                }
                #endregion

                if (GUI.Button(new Rect(right.x, right.y + singleLineHeight, right.width, singleLineHeight), saveContent))
                {
                    PathFinder.SaveCurrentSceneData();
                }
                if (GUI.Button(new Rect(right.x, right.y + (singleLineHeight * 2), right.width, singleLineHeight), loadContent))
                {
                    PathFinder.LoadCurrentSceneData();
                }
                if (GUI.Button(new Rect(right.x, right.y + (singleLineHeight * 3), right.width, singleLineHeight), deleteContent))
                {
                    PathFinder.ClearCurrenSceneData();
                }
                #endregion
            }
        }
示例#3
0
        void OnSceneGUI(SceneView sceneView)
        {
            Event curEvent = Event.current;
            Color col      = Handles.color;

            Handles.color = Color.red;
            //float gs = settings.gridSize;



            AreaPointer targetData = settings.areaPointer * settings.gridSize;
            bool        isMoved;

            targetData = MyHandles.DrawData(targetData, 2.5f, settings.gridSize, out isMoved);

            if (PathFinderSettings.isAreaPointerMoving)
            {
                settings.areaPointer = targetData / settings.gridSize;
                EditorUtility.SetDirty(settings);
                SceneView.RepaintAll();
            }

            if (curEvent.type == EventType.Used)
            {
                PathFinderSettings.isAreaPointerMoving = isMoved;
            }

            Handles.color = col;



            if (sellectorMove)
            {
                XZPosInt   pointerPos;
                RaycastHit hit;
                Ray        ray = HandleUtility.GUIPointToWorldRay(curEvent.mousePosition);
                if (Physics.Raycast(ray, out hit))
                {
                    pointerPos = PathFinder.ToChunkPosition(hit.point);
                }
                else
                {
                    Vector3 intersection;
                    if (Math3d.LinePlaneIntersection(out intersection, ray.origin, ray.direction, Vector3.up, new Vector3()))
                    {
                        pointerPos = PathFinder.ToChunkPosition(intersection);
                    }
                    else
                    {
                        pointerPos = new XZPosInt();
                    }
                }

                settingsDrawer.MovePointer(new AreaPointer(pointerPos.x, pointerPos.z, pointerPos.x + 1, pointerPos.z + 1, hit.point.y));

                if (curEvent.type == EventType.MouseDown && curEvent.button == 0)
                {
                    sellectorMove = false;
                }

                Repaint();
                SceneView.RepaintAll();
            }



            //if (RVOPF.RVOSimulator.instance.debug) {
            //    foreach (var cone in RVOPF.RVOSimulator.instance.collisionCones) {
            //        if (cone.agent == null | cone.other == null)
            //            continue;

            //        Vector3 offset = new Vector3(0, cone.heightOffset, 0);
            //        Vector3 agentPos = cone.agent.positionV3 + offset;
            //        float agentY = agentPos.y;
            //        Vector3 conePos = new Vector3(cone.position.x, agentY, cone.position.y);
            //        Vector3 coneDir = new Vector3(cone.direction.x, agentY, cone.direction.y);

            //        Handles.color = Color.green;
            //        Handles.DrawLine(agentPos, conePos);
            //        Handles.color = Color.red;
            //        Handles.DrawLine(cone.other.positionV3, conePos);

            //        Handles.color = new Color(cone.color.r, cone.color.g, cone.color.b, 0.1f);
            //        Handles.DrawLine(conePos, conePos + coneDir);

            //        float v = Vector2.SignedAngle(Vector2.up, cone.direction);

            //        Quaternion q1 = Quaternion.AngleAxis(v, new Vector3(0, 0, 1));
            //        Quaternion q2 = Quaternion.AngleAxis(v + cone.angle, new Vector3(0, 0, 1));
            //        Quaternion q3 = Quaternion.AngleAxis(v - cone.angle, new Vector3(0, 0, 1));

            //        float targetDistance = Vector2.Distance(cone.agent.positionV2, cone.other.positionV2) + cone.other.radius + cone.agent.radius;

            //        Vector2 P1 = q1 * Vector2.up * targetDistance;
            //        Vector2 P2 = q2 * Vector2.up * targetDistance;
            //        Vector2 P3 = q3 * Vector2.up * targetDistance;

            //        Handles.DrawSolidArc(conePos, Vector3.up, new Vector3(P2.x, 0, P2.y), cone.angle * 2, targetDistance);

            //        Handles.color = cone.color;
            //        Handles.DrawLine(conePos, conePos + new Vector3(P2.x, 0, P2.y));
            //        Handles.DrawLine(conePos, conePos + new Vector3(P3.x, 0, P3.y));

            //        Handles.color = Color.black;
            //        Handles.DrawWireDisc(cone.other.positionV3 + offset, Vector3.up, cone.other.radius);
            //        Handles.DrawWireDisc(cone.other.positionV3 + offset, Vector3.up, cone.other.radius + cone.agent.radius);
            //        Handles.DrawLine(cone.other.positionV3, cone.other.positionV3 + offset);

            //    }
            //}

            Debuger_K.DrawDebugLabels();

            Handles.BeginGUI();
            Debuger_K.DrawSceneGUI();
            Handles.EndGUI();
        }
示例#4
0
        public static AreaPointer DrawData(int id, AreaPointer input, float handleSizeFactor, float snap, out bool isDrag)
        {
            isDrag    = false;
            verts4[0] = new Vector3(input.startX, input.y, input.startZ);
            verts4[1] = new Vector3(input.startX, input.y, input.endZ);
            verts4[2] = new Vector3(input.endX, input.y, input.endZ);
            verts4[3] = new Vector3(input.endX, input.y, input.startZ);
            //SetAlpha(Handles.color, 0.1f)
            Handles.DrawSolidRectangleWithOutline(verts4, Color.clear, Handles.color);

            float y         = input.y;
            float sizeX     = input.endX - input.startX;
            float sizeZ     = input.endZ - input.startZ;
            float sizeHalfX = sizeX * 0.5f;
            float sizeHalfZ = sizeZ * 0.5f;

            float resultStartX = input.startX;
            float resultStartZ = input.startZ;
            float resultEndX   = input.endX;
            float resultEndZ   = input.endZ;
            float resultY      = input.y;

            float centerX = (resultStartX + resultEndX) * 0.5f;
            float centerZ = (resultStartZ + resultEndZ) * 0.5f;

            EventType handleEventType;
            float     value;

            value = SliderFloat(new Vector3(centerX, resultY, centerZ), new Vector3(0, 1, 0), resultY, GetHandleSize(new Vector3(centerX, resultY, centerZ), handleSizeFactor * 15), Handles.ArrowHandleCap, 0.05f, out handleEventType);
            if (handleEventType == EventType.MouseDrag)
            {
                isDrag  = true;
                resultY = value;
            }
            value = SliderFloat(new Vector3(centerX, resultY, centerZ), new Vector3(0, -1, 0), -resultY, GetHandleSize(new Vector3(centerX, resultY, centerZ), handleSizeFactor * 15), Handles.ArrowHandleCap, 0.05f, out handleEventType);
            if (handleEventType == EventType.MouseDrag)
            {
                isDrag  = true;
                resultY = -value;
            }

            resultStartX = SliderFloat(new Vector3(input.startX, y, input.startZ + sizeHalfZ), new Vector3(1, 0, 0), resultStartX, GetHandleSize(new Vector3(input.startX, y, input.startZ + sizeHalfZ), handleSizeFactor), Handles.DotHandleCap, snap, out handleEventType);
            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultStartX - resultEndX) / snap) > -1)
                {
                    resultStartX = resultEndX - snap;
                }
            }

            resultStartZ = SliderFloat(new Vector3(input.startX + sizeHalfX, y, input.startZ), new Vector3(0, 0, 1), resultStartZ, GetHandleSize(new Vector3(input.startX + sizeHalfX, y, input.startZ), handleSizeFactor), Handles.DotHandleCap, snap, out handleEventType);
            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultStartZ - resultEndZ) / snap) > -1)
                {
                    resultStartZ = resultEndZ - snap;
                }
            }

            resultEndX = SliderFloat(new Vector3(input.endX, y, input.startZ + sizeHalfZ), new Vector3(1, 0, 0), resultEndX, GetHandleSize(new Vector3(input.endX, y, input.startZ + sizeHalfZ), handleSizeFactor), Handles.DotHandleCap, snap, out handleEventType);
            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultEndX - resultStartX) / snap) < 1)
                {
                    resultEndX = resultStartX + snap;
                }
            }

            resultEndZ = SliderFloat(new Vector3(input.startX + sizeHalfX, y, input.endZ), new Vector3(0, 0, 1), resultEndZ, GetHandleSize(new Vector3(input.startX + sizeHalfX, y, input.endZ), handleSizeFactor), Handles.DotHandleCap, snap, out handleEventType);
            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultEndZ - resultStartZ) / snap) < 1)
                {
                    resultEndZ = resultStartZ + snap;
                }
            }

            Vector2 vector2, delta;
            Vector2 snap2d = new Vector2(snap, snap);

            vector2      = Slider2D(new Vector2(resultStartX, resultStartZ), new Vector3(resultStartX, y, resultStartZ), Vector3.up, Vector3.right, Vector3.forward, GetHandleSize(new Vector3(resultStartX, y, resultStartZ), handleSizeFactor), Handles.DotHandleCap, snap2d, out handleEventType);
            resultStartX = vector2.x;
            resultStartZ = vector2.y;

            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultStartX - resultEndX) / snap) > -1)
                {
                    resultStartX = resultEndX - snap;
                }
                if ((int)Mathf.Floor((resultStartZ - resultEndZ) / snap) > -1)
                {
                    resultStartZ = resultEndZ - snap;
                }
            }

            vector2    = Slider2D(new Vector2(resultEndX, resultEndZ), new Vector3(resultEndX, y, resultEndZ), Vector3.up, Vector3.right, Vector3.forward, GetHandleSize(new Vector3(resultEndX, y, resultEndZ), handleSizeFactor), Handles.DotHandleCap, snap2d, out handleEventType);
            resultEndX = vector2.x;
            resultEndZ = vector2.y;

            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultEndX - resultStartX) / snap) < 1)
                {
                    resultEndX = resultStartX + snap;
                }
                if ((int)Mathf.Floor((resultEndZ - resultStartZ) / snap) < 1)
                {
                    resultEndZ = resultStartZ + snap;
                }
            }

            vector2      = Slider2D(new Vector2(resultStartX, resultEndZ), new Vector3(resultStartX, y, resultEndZ), Vector3.up, Vector3.right, Vector3.forward, GetHandleSize(new Vector3(resultStartX, y, resultEndZ), handleSizeFactor), Handles.DotHandleCap, snap2d, out handleEventType);
            resultStartX = vector2.x;
            resultEndZ   = vector2.y;

            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultStartX - resultEndX) / snap) > -1)
                {
                    resultStartX = resultEndX - snap;
                }
                if ((int)Mathf.Floor((resultEndZ - resultStartZ) / snap) < 1)
                {
                    resultEndZ = resultStartZ + snap;
                }
            }

            vector2      = Slider2D(new Vector2(resultEndX, resultStartZ), new Vector3(resultEndX, y, resultStartZ), Vector3.up, Vector3.right, Vector3.forward, GetHandleSize(new Vector3(resultEndX, y, resultStartZ), handleSizeFactor), Handles.DotHandleCap, snap2d, out handleEventType);
            resultEndX   = vector2.x;
            resultStartZ = vector2.y;

            if (handleEventType == EventType.MouseDrag)
            {
                isDrag = true;
                if ((int)Mathf.Floor((resultEndX - resultStartX) / snap) < 1)
                {
                    resultEndX = resultStartX + snap;
                }
                if ((int)Mathf.Floor((resultStartZ - resultEndZ) / snap) > -1)
                {
                    resultStartZ = resultEndZ - snap;
                }
            }

            float quadSize = GetHandleSize(new Vector3(resultEndX, resultY, resultStartZ), handleSizeFactor * 7.5f);

            quadSize = Mathf.Min(sizeHalfX - 1f, quadSize);
            quadSize = Mathf.Min(sizeHalfZ - 1f, quadSize);

            vector2 = Slider2D(new Vector2(centerX, centerZ), new Vector3(centerX, y, centerZ), Vector3.up, Vector3.right, Vector3.forward, quadSize, Handles.RectangleHandleCap, snap2d);
            delta   = new Vector2(vector2.x - centerX, vector2.y - centerZ);

            resultStartX += delta.x;
            resultStartZ += delta.y;
            resultEndX   += delta.x;
            resultEndZ   += delta.y;

            resultStartX = SnapValue(resultStartX, snap);
            resultStartZ = SnapValue(resultStartZ, snap);
            resultEndX   = SnapValue(resultEndX, snap);
            resultEndZ   = SnapValue(resultEndZ, snap);

            return(new AreaPointer(resultStartX, resultStartZ, resultEndX, resultEndZ, resultY));
        }
示例#5
0
 public static AreaPointer DrawData(AreaPointer input, float size, float snap, out bool isDrag)
 {
     return(DrawData(GUIUtility.GetControlID(s_AreaControlDataHash, FocusType.Keyboard), input, size, snap, out isDrag));
 }
示例#6
0
 public void MovePointer(AreaPointer pointer)
 {
     settings.areaPointer = pointer;
     EditorUtility.SetDirty(settings);
 }