public static FloorplanClick OnFloorplanSelectionClick(Building building, Ray mouseRay, bool includeInterior = false) { FloorplanClick output = new FloorplanClick(); float nearestPointDistance = Mathf.Infinity; Vector3 basePosition = building.transform.position; Quaternion baseRotation = Quaternion.Inverse(building.transform.rotation); int floorplanCount = building.numberOfPlans; for (int f = 0; f < floorplanCount; f++) { Volume volume = building[f] as Volume; float baseHeight = volume.baseHeight; Vector3 testPoint = basePosition + Vector3.up * baseHeight; if (Vector3.Dot(mouseRay.direction, testPoint - mouseRay.origin) < 0)//building { continue; } Plane planPlane = new Plane(Vector3.up, testPoint); float rayDistance = 0; if (planPlane.Raycast(mouseRay, out rayDistance)) { if (rayDistance < nearestPointDistance) { Vector3 clickPos = baseRotation * (mouseRay.GetPoint(rayDistance) - basePosition); Vector2Int planPos = new Vector2Int(clickPos, true); Vector2Int[] planPoints = volume.AllPoints(); if (PointInsidePoly(planPos, planPoints)) { nearestPointDistance = rayDistance; output.volume = volume; } if (includeInterior) { IFloorplan[] intFloorplans = volume.InteriorFloorplans(); int floors = intFloorplans.Length; for (int fl = 0; fl < floors; fl++) { Floorplan intFl = intFloorplans[fl] as Floorplan; Room[] rooms = intFl.AllRooms(); int roomCount = rooms.Length; for (int rm = 0; rm < roomCount; rm++) { Vector2Int[] roomPoints = rooms[rm].AllPoints(); if (PointInsidePoly(planPos, roomPoints)) { nearestPointDistance = rayDistance; output.volume = volume; output.floorplan = intFl; output.room = rooms[rm]; } } } } } } } return(output); }
private void Cleanup() { BUILDING = null; VOLUME = null; FLOORPLAN = null; ROOM = null; ROOM_PORTAL = null; BuildingVolumeEditor.Cleanup(); SceneMeshHandler.Clear(); }
public void OnSceneGUI() { if (!_firstFrame) { return; } _firstFrame = false; Event evt = Event.current; if (evt != null && evt.alt)//do not modify selection { return; } if (target != null) { PART = (BuildRPart)target; } if (PART != null) { if (PART.parent != null) { Selection.activeGameObject = PART.parent.gameObject; return; } BUILDING = PART.transform.GetComponentInParent <Building>(); if (BUILDING != null) { Selection.activeGameObject = BUILDING.gameObject; Volume volume = PART.GetComponent <Volume>(); if (volume != null && BuildingEditor.volume == null) { // BuildingEditor.MODE = BuildingEditor.EditModes.Volume; BuildingEditor.volume = volume; return; } Floorplan floorplan = PART.GetComponent <Floorplan>(); if (floorplan != null && BuildingEditor.floorplan == null) { BUILDING.settings.editMode = BuildREditmodes.Values.Floorplan; volume = PART.transform.parent.GetComponent <Volume>(); BuildingEditor.volume = volume; BuildingEditor.floorplan = floorplan; return; } } } }
public void Initialise(List <VolumePoint> points, int newFloorCount = 1, float newFloorHeight = 3.0f) { _points.Clear(); _points.AddRange(points); _floors = newFloorCount; _floorHeight = newFloorHeight; _interiorFloorplans.Clear(); for (int f = 0; f < newFloorCount; f++) { Floorplan floorplan = Floorplan.Create(transform); floorplan.SetDefaultName(f); _interiorFloorplans.Add(floorplan); } }
private void CheckInternalFloorplans() { if (!building.generateInteriors) { return; } int currentPlanCount = _interiorFloorplans.Count; if (currentPlanCount != _floors) { while (currentPlanCount < _floors) { _interiorFloorplans.Add(null); currentPlanCount++; } while (currentPlanCount > _floors) { Floorplan floorplan = _interiorFloorplans[currentPlanCount - 1]; _interiorFloorplans.Remove(floorplan); #if UNITY_EDITOR if (floorplan != null) { UnityEditor.Undo.DestroyObjectImmediate(floorplan.gameObject); } #else if (floorplan != null) { Destroy(floorplan.gameObject); } #endif currentPlanCount--; } } for (int i = 0; i < currentPlanCount; i++) { if (_interiorFloorplans[i] == null) { Floorplan floorplan = Floorplan.Create(transform); floorplan.SetDefaultName(i + 1); _interiorFloorplans[i] = floorplan; } } }
public static Floorplan Create(Transform transform) { #if UNITY_EDITOR GameObject newFloorplanGo = new GameObject("Floorplan"); UnityEditor.Undo.RegisterCreatedObjectUndo(newFloorplanGo, "Created Floorplan GameObject"); UnityEditor.Undo.SetTransformParent(newFloorplanGo.transform, transform, "Parent New Floorplan GameObject"); newFloorplanGo.transform.localPosition = Vector3.zero; newFloorplanGo.transform.localRotation = Quaternion.identity; Floorplan output = UnityEditor.Undo.AddComponent <Floorplan>(newFloorplanGo); output._visualPart = VisualPart.Create(newFloorplanGo.transform, "Floorplan Visual"); return(output); #else GameObject newFloorplanGo = new GameObject("Interior Floorplan"); newFloorplanGo.transform.parent = transform; Floorplan output = newFloorplanGo.AddComponent <Floorplan>(); output._visualPart = VisualPart.Create(newFloorplanGo.transform, "Interior Floorplan Visual"); return(output); #endif }
// _drag = Drag2D(_drag, r); // // if (_mPrevRender == null) // _mPrevRender = new PreviewRenderUtility(); // // // Vector3 max = _wallSection.previewMesh.bounds.size; // // float radius = Mathf.Max(max.x, Mathf.Max(max.y, max.z)) * 1.333f; // float dist = radius / (Mathf.Sin(_mPrevRender.camera.fieldOfView * Mathf.Deg2Rad)); // _mPrevRender.camera.transform.position = Vector2.zero; // _mPrevRender.camera.transform.rotation = Quaternion.Euler(new Vector3(-_drag.y, -_drag.x, 0)); // _mPrevRender.camera.transform.position = _mPrevRender.camera.transform.forward * -dist; // _mPrevRender.camera.nearClipPlane = 0.1f; // _mPrevRender.camera.farClipPlane = 500; // // _mPrevRender.lights[0].intensity = 0.5f; // _mPrevRender.lights[0].transform.rotation = Quaternion.Euler(30f, 30f, 0f); // _mPrevRender.lights[1].intensity = 0.5f; // // _mPrevRender.BeginPreview(r, background); // // if (_plane != null && _blueprintMaterial != null) // { // Matrix4x4 matrix = Matrix4x4.TRS(new Vector3(-25, -25, 1), Quaternion.identity, new Vector3(10, 10, 1)); // _mPrevRender.DrawMesh(_plane, matrix, _blueprintMaterial, 0); // _mPrevRender.camera.Render(); // } // // // int materialCount = mats.Length; // int submeshCount = mesh.subMeshCount; // int count = Mathf.Min(materialCount, submeshCount); // for (int c = 0; c < count; c++) // { // Material mat = c < materialCount ? mats[c] : AssetDatabase.GetBuiltinExtraResource<Material>("Default-Material.mat"); // if (mat == null) mat = AssetDatabase.GetBuiltinExtraResource<Material>("Default-Material.mat"); // _mPrevRender.DrawMesh(mesh, Matrix4x4.identity, mat, c); // } // // _mPrevRender.camera.Render(); // Texture texture = _mPrevRender.EndPreview(); // // GUI.DrawTexture(r, texture); // } // // public static Vector2 Drag2D(Vector2 scrollPosition, Rect position) // { // int controlID = GUIUtility.GetControlID("Slider".GetHashCode(), FocusType.Passive); // Event current = Event.current; // switch (current.GetTypeForControl(controlID)) // { // case EventType.MouseDown: // if (position.Contains(current.mousePosition) && position.width > 50f) // { // GUIUtility.hotControl = controlID; // current.Use(); // EditorGUIUtility.SetWantsMouseJumping(1); // } // break; // case EventType.MouseUp: // if (GUIUtility.hotControl == controlID) // { // GUIUtility.hotControl = 0; // } // EditorGUIUtility.SetWantsMouseJumping(0); // break; // case EventType.MouseDrag: // if (GUIUtility.hotControl == controlID) // { // scrollPosition -= current.delta * (float)((!current.shift) ? 1 : 3) / Mathf.Min(position.width, position.height) * 140f; // scrollPosition.y = Mathf.Clamp(scrollPosition.y, -90f, 90f); // current.Use(); // GUI.changed = true; // } // break; // } // return scrollPosition; // } public static FloorplanClick OnInteriorSelectionClick(Ray mouseRay) { FloorplanClick output = new FloorplanClick(); Building building = BuildingEditor.building; Volume volume = BuildingEditor.volume; Floorplan floorplan = BuildingEditor.floorplan; output.volume = volume; output.floorplan = floorplan; if (floorplan != null) { Vector3 basePosition = building.transform.position; float baseHeight = volume.baseHeight; Vector3 testPoint = basePosition + Vector3.up * baseHeight; if (Vector3.Dot(mouseRay.direction, testPoint - mouseRay.origin) < 0)//volume behind camera { return(output); } float floorHeight = volume.floorHeight; List <Room> rooms = floorplan.rooms; int roomCount = rooms.Count; float minDistance = Mathf.Infinity; for (int rm = 0; rm < roomCount; rm++) { Room room = rooms[rm]; RoomPortal[] portals = room.GetAllPortals(); int portalCount = portals.Length; for (int p = 0; p < portalCount; p++) { RoomPortal portal = portals[p]; int wallIndex = portal.wallIndex; Vector3 p0 = room[wallIndex].position.vector3XZ; Vector3 p1 = room[(wallIndex + 1) % room.numberOfPoints].position.vector3XZ; Vector3 baseUp = Vector3.up * (floorHeight - portal.height) * portal.verticalPosition; Vector3 portalUp = baseUp + Vector3.up * portal.height; Vector3 pointPos = SceneMeshHandler.PortalPosition(Quaternion.identity, room, portal); pointPos.y = baseHeight; Vector3 wallDirection = (p1 - p0).normalized; float defaultWidth = portal.width * 0.5f; // float defaultDepth = 0.1f; Vector3 v0 = pointPos - wallDirection * defaultWidth; Vector3 v1 = pointPos + wallDirection * defaultWidth; Vector3 v2 = v0 + portalUp; Vector3 v3 = v1 + portalUp; // Debug.DrawLine(v0,v1,Color.red,20); // Debug.DrawLine(v1,v3,Color.red,20); // Debug.DrawLine(v3,v2,Color.red,20); // Debug.DrawLine(v2,v0,Color.red,20); float distance = 0; if (RayTriangle.QuadIntersection(v0, v1, v2, v3, mouseRay, out distance, false)) { if (minDistance > distance) { minDistance = distance; output.room = room; output.portal = portal; output.opening = null; } } } } VerticalOpening[] openings = building.GetAllOpenings(); int openingCount = openings.Length; for (int o = 0; o < openingCount; o++) { VerticalOpening opening = openings[o]; Vector3 openingPosition = opening.position.vector3XZ; openingPosition.y = volume.floorHeight * opening.baseFloor; Vector3 openingSize = opening.size.vector3XZ; float openingWidth = openingSize.x; float openingHeight = openingSize.z; Quaternion openingRotation = Quaternion.Euler(0, opening.rotation, 0); Vector3 p0 = openingPosition + openingRotation * new Vector3(-openingWidth, 0, -openingHeight) * 0.5f; Vector3 p1 = openingPosition + openingRotation * new Vector3(openingWidth, 0, -openingHeight) * 0.5f; Vector3 p2 = openingPosition + openingRotation * new Vector3(openingWidth, 0, openingHeight) * 0.5f; Vector3 p3 = openingPosition + openingRotation * new Vector3(-openingWidth, 0, openingHeight) * 0.5f; // Vector3 openingUp = Vector3.up * volume.floorHeight * (opening.floors + 1); Vector3 floorUpA = Vector3.up * volume.CalculateFloorHeight(volume.Floor(BuildingEditor.floorplan)); // Vector3 floorUpB = floorUpA + Vector3.up * volume.floorHeight; float distance = 0; if (RayTriangle.QuadIntersection(p0 + floorUpA, p1 + floorUpA, p2 + floorUpA, p3 + floorUpA, mouseRay, out distance, false)) { if (minDistance > distance) { minDistance = distance; output.room = null; output.portal = null; output.opening = opening; } } } if (output.opening != null) { return(output); } if (output.portal != null) { return(output); } float intPlanBaseHeight = volume.CalculateFloorHeight(volume.Floor(floorplan)); Vector3 baseUpV = Vector3.up * intPlanBaseHeight; Plane planPlane = new Plane(Vector3.up, baseUpV); float rayDistance = 0; if (planPlane.Raycast(mouseRay, out rayDistance)) { Vector3 clickPos = mouseRay.GetPoint(rayDistance) - basePosition; Vector2Int floorClickPosition = new Vector2Int(clickPos, true); for (int rm = 0; rm < roomCount; rm++) { Vector2Int[] roomPoints = rooms[rm].AllPoints(); if (BuildrUtils.PointInsidePoly(floorClickPosition, roomPoints)) { output.room = rooms[rm]; } } } } return(output); }
public float CalculateHeight(IFloorplan floorplan) { Floorplan fPlan = floorplan as Floorplan; return(CalculateHeight(_interiorFloorplans.IndexOf(fPlan))); }
public int Floor(IFloorplan interior) { Floorplan fInterior = interior as Floorplan; return(_interiorFloorplans.IndexOf(fInterior)); }
private void OnEnable() { BuildRSettings.AUTO_UPDATE = true; EditorUtility.ClearProgressBar(); EDITOR = this; if (target != null) { if (BUILDING != (Building)target) { Cleanup(); BUILDING = (Building)target;//directly set to avoid gui calls } if (building.settings == null) { building.settings = GetSettings(); } if (building.numberOfVolumes > 0) { if (volume == null) { VOLUME = (Volume)BUILDING[0];//directly set to avoid gui calls } if (volume != null) { if (floorplan == null && volume.floors > 0 && building.settings.editMode == BuildREditmodes.Values.Floorplan && volume.InteriorFloorplans().Length > 0) { FLOORPLAN = (Floorplan)volume.InteriorFloorplans()[0];//directly set to avoid gui calls } } } } STAGE_TOOLBAR_TEXTURES = new Texture2D[toolbarOptionCount]; STAGE_TOOLBAR_TEXTURES[0] = volumeIcon; STAGE_TOOLBAR_TEXTURES[1] = floorplanIcon; STAGE_TOOLBAR_TEXTURES[2] = surfacesIcon; STAGE_TOOLBAR_TEXTURES[3] = facadesIcon; STAGE_TOOLBAR_TEXTURES[4] = roofsIcon; STAGE_TOOLBAR_TEXTURES[5] = exportIcon; STAGE_TOOLBAR_TEXTURES[6] = optionsIcon; HEADER_TEXTURE = new Texture2D(1, 1); HEADER_TEXTURE.SetPixel(0, 0, RED); HEADER_TEXTURE.Apply(); LOGO = logo;//(Texture2D)AssetDatabase.LoadAssetAtPath("Assets/BuildR2/Internal/EditorImages/buildrLogo.png", typeof(Texture2D)); BuildingVolumeEditor.OnEnable(); IVolume[] volumes = BUILDING.AllPlans(); foreach (Volume volume1 in volumes) { if (volume1 == null) { continue; } volume1.hideFlags = building.settings.debug ? HideFlags.None : HideFlags.HideInInspector; } directionalLightIssueDetected = false; Light[] lights = FindObjectsOfType <Light>(); int lightCount = lights.Length; for (int l = 0; l < lightCount; l++) { Light light = lights[l]; if (light.type != LightType.Directional) { continue; } if (light.shadowBias > building.settings.recommendedBias || light.shadowNormalBias > building.settings.recommendedNormalBias) { directionalLightIssueDetected = true; } } }