void HandleInput(Event guiEvent) { WG_Painter wgPainter = (WG_Painter)target; Ray mouseRay = HandleUtility.GUIPointToWorldRay(guiEvent.mousePosition); float drawPlainHeight = 0; float dstToDrawPlane = (drawPlainHeight - mouseRay.origin.y) / mouseRay.direction.y; Vector3 mousePosition = mouseRay.origin + dstToDrawPlane * mouseRay.direction; Vector2 position = new Vector2(mousePosition.x, mousePosition.z); if (guiEvent.type == EventType.MouseDown && guiEvent.button == 0 && guiEvent.modifiers == EventModifiers.Shift) { HandleLeftClick(position, true); } if (guiEvent.type == EventType.MouseDown && guiEvent.button == 0 && guiEvent.modifiers == EventModifiers.Control) { HandleRemoveClick(position); } if (guiEvent.type == EventType.MouseDown && guiEvent.button == 0 && guiEvent.modifiers == EventModifiers.None) { HandleLeftClick(position, false); } if (guiEvent.type == EventType.MouseUp && guiEvent.button == 0) { HandleMouseUp(); } if (guiEvent.type == EventType.MouseDrag && guiEvent.button == 0 && guiEvent.modifiers == EventModifiers.None) { HandleLeftDrag(position, false); } if (guiEvent.type == EventType.MouseDrag && guiEvent.button == 0 && guiEvent.modifiers == EventModifiers.Shift) { HandleLeftDrag(position, true); } if (guiEvent.type == EventType.MouseDrag && guiEvent.button == 0 && guiEvent.modifiers == EventModifiers.Control) { HandleRemoveDrag(position); } if (Vector3.Distance(currentPoint, mousePosition) > 0.01f) { currentPoint = mousePosition; shouldRepaint = true; } }
void OnEnable() { wgPainter = (WG_Painter)target; shouldRepaint = true; Tools.hidden = true; }
public void BuildMesh() { #if UNITY_EDITOR //clear generated segments navmeshExist = false; //create helper object for all sub-generated objects GameObject store = new GameObject() { name = "Temp Store" }; Transform[] allTransforms = gameObject.GetComponentsInChildren <Transform>(); for (int trIndex = allTransforms.Length - 1; trIndex >= 0; trIndex--) { GameObject go = allTransforms[trIndex].gameObject; //try to get noise primitive component //if this component is null, then delete game object WG_Primitive_PerlinNoise noiseComponent = go.GetComponent <WG_Primitive_PerlinNoise>(); WG_Primitive_Paint paintComponent = go.GetComponent <WG_Primitive_Paint>(); WG_Painter painterComponent = go.GetComponent <WG_Painter>(); WG_VisualCenter visCenterComponent = go.GetComponent <WG_VisualCenter>(); if (go != gameObject && noiseComponent == null && paintComponent == null && painterComponent == null && visCenterComponent == null) { if (clearAll) { DestroyImmediate(go); } else { //check is this object contains location controller WG_LocationController locController = go.GetComponent <WG_LocationController>(); if (locController != null) {//this is location root object, destoy it DestroyImmediate(go); } else { //this is not location root, may be walls or ground object if (go.name == groundName || go.name == wallsName || go.name == meshRootName) { //this is generated ground or wall object, destoy it DestroyImmediate(go); } else {//this is sub-placed object, store it if (PrefabUtility.GetOutermostPrefabInstanceRoot(go) == null || PrefabUtility.GetOutermostPrefabInstanceRoot(go) == go) { go.transform.SetParent(store.transform, true); } } } } } } //fill map for all location segments bool[,] map = new bool[(segmenstMaxX - segmentsMinX + 1) * meshSquaresCount + 1, (segmenstMaxY - segmentsMinY + 1) * meshSquaresCount + 1]; WG_Primitive_BaseNoise[] noises = gameObject.GetComponentsInChildren <WG_Primitive_BaseNoise>(); float meshSquareSize = segmentSize / meshSquaresCount; Vector2 bottomLeftCorner = new Vector2((segmentsMinX - 0.5f) * segmentSize, (segmentsMinY - 0.5f) * segmentSize); for (int x = 0; x < map.GetLength(0); x++) { for (int y = 0; y < map.GetLength(1); y++) { Vector2 pos = new Vector2(x * meshSquareSize, y * meshSquareSize) + bottomLeftCorner; map[x, y] = IsPointMountains(pos, noises); } } //next create root for location segments GameObject locationsRoot = new GameObject { name = meshRootName }; locationsRoot.transform.SetParent(gameObject.transform); //create location generator WG_SegmentsGenerator generator = new WG_SegmentsGenerator(); List <WG_LocationController> locations = generator.GenerateLocationSegments(this, segmentSize, meshSquareSize, meshSquaresCount, segmentsMinX, segmenstMaxX, segmentsMinY, segmenstMaxY, locationsRoot, groundMaterial, mountainsMaterial, wallsMaterial, map, mountainsHeight, !(forceUpdate && buildMesh), navMeshCutVolume, uv2Padding); #endif #if UNITY_EDITOR //after generation we should place back all stored objects, we will place it inside location root object Transform[] storedObjects = store.GetComponentsInChildren <Transform>(); for (int tfmIndex = 0; tfmIndex < storedObjects.Length; tfmIndex++) { Transform tfm = storedObjects[tfmIndex]; if (tfm.gameObject != store) { Vector3 position = tfm.position; IntPair locCoords = WG_Helper.GetLocationCoordinates(position, segmentSize); WG_LocationController loc = GetLocationByCoordinates(locCoords, locations); if (loc != null) { //rever prefab properties (mesh and material) GameObject prefabMaster = PrefabUtility.GetOutermostPrefabInstanceRoot(tfm.gameObject); MeshFilter meshComponent = tfm.GetComponent <MeshFilter>(); if ((prefabMaster == null && meshComponent != null) || prefabMaster == tfm.gameObject) { Vector3 scale = tfm.localScale; GameObject source = PrefabUtility.GetCorrespondingObjectFromSource(tfm.gameObject); if (source != null) { PrefabUtility.RevertPrefabInstance(tfm.gameObject, InteractionMode.UserAction); } tfm.localScale = scale; //move object inside location tfm.SetParent(loc.gameObject.transform, true); tfm.position += loc.gameObject.transform.position; } } else { Debug.Log("There is no locations with coordinates " + locCoords.ToString() + ", so skip the object " + tfm.gameObject.name); } } } //delete temp store DestroyImmediate(store); #endif BuildNavmeshOnly(); }