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; } }
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 } }
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(); }
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)); }
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)); }
public void MovePointer(AreaPointer pointer) { settings.areaPointer = pointer; EditorUtility.SetDirty(settings); }