void CreateNewSubMesh(LevelBase originalLevelBase, LevelCreatorUtils.WallsBounds roomWallbounds, Vector3 pDirection) { LevelBase subMesh = Instantiate(levelBasePrefab); AddNewObject(subMesh.gameObject); subMesh.transform.position = originalLevelBase.transform.position; float zOffset = 0; LevelCreatorUtils.WallsBounds originalBounds = LevelCreatorUtils.BoxColliderToWallbounds(originalLevelBase.transform.position, originalLevelBase.GetComponent <BoxCollider>()); float xScale = originalLevelBase.transform.localScale.x; float zScale = originalLevelBase.transform.localScale.z; if (pDirection.x != 0) { xScale = pDirection.x == 1 ? originalBounds.maxWallsX - roomWallbounds.maxWallsX : originalBounds.minWallsX - roomWallbounds.minWallsX; float topReduction = 0; float bottomReduction = 0; //Delete top scale if (roomWallbounds.maxWallsZ < originalBounds.maxWallsZ) { topReduction = originalBounds.maxWallsZ - roomWallbounds.maxWallsZ; } //Delete bottom if (roomWallbounds.minWallsZ > originalBounds.minWallsZ) { bottomReduction = roomWallbounds.minWallsZ - originalBounds.minWallsZ; } zScale -= (topReduction + bottomReduction); //set to correct z pos if (originalBounds.maxWallsZ > roomWallbounds.maxWallsZ) { zOffset -= (originalBounds.maxWallsZ - roomWallbounds.maxWallsZ) / 2; } if (roomWallbounds.minWallsZ > originalBounds.minWallsZ) { zOffset += (roomWallbounds.minWallsZ - originalBounds.minWallsZ) / 2; } //zOffset = (((originalBounds.maxWallsZ - pUpdatedRoom.wallBounds.maxWallsZ) / 2) - ((pUpdatedRoom.wallBounds.minWallsZ - originalBounds.minWallsZ) / 2)) * -1; subMesh.transform.position = new Vector3(roomWallbounds.center.x, 0, originalLevelBase.transform.position.z + zOffset); } else { zScale = pDirection.z == 1 ? originalBounds.maxWallsZ - roomWallbounds.maxWallsZ : originalBounds.minWallsZ - roomWallbounds.minWallsZ; subMesh.transform.position = new Vector3(originalLevelBase.transform.position.x, 0, roomWallbounds.center.z); } subMesh.transform.localScale = new Vector3(Mathf.Abs(xScale), levelCreatorInfo.wallHeight, Mathf.Abs(zScale)); subMesh.transform.position += new Vector3(((subMesh.transform.localScale.x / 2 + (roomWallbounds.maxWallsX - roomWallbounds.minWallsX) / 2) * pDirection.x), 0, ((subMesh.transform.localScale.z / 2 + (roomWallbounds.maxWallsZ - roomWallbounds.minWallsZ) / 2) * pDirection.z)); newLevelBases.Add(subMesh); subMesh.transform.parent = levelBaseMain.transform; }
public void ConfirmDoorPlacement() { tempUndoList = new Dictionary <GameObject, UndoRedoState>(); Vector3 leftWallPos = doorBeingMade.transform.Find("WallSideLeft").position; Vector3 rightWallPos = doorBeingMade.transform.Find("WallSideRight").position; doors.Add(doorBeingMade); AddNewObject(doorBeingMade.gameObject); if (doorDirection.x != 0) { LevelBase topWall = Instantiate(levelBasePrefab); LevelBase bottomWall = Instantiate(levelBasePrefab); AddNewObject(topWall.gameObject); AddNewObject(bottomWall.gameObject); //Create top mesh to max float topScale = Mathf.Abs(levelCreatorInfo.baseLenght / 2 - leftWallPos.z); float bottomScale = Mathf.Abs(rightWallPos.z - levelCreatorInfo.baseLenght / 2); topWall.transform.localScale = new Vector3(1, levelCreatorInfo.wallHeight, topScale); bottomWall.transform.localScale = new Vector3(1, levelCreatorInfo.wallHeight, bottomScale); topWall.transform.position = doorBeingMade.transform.position + new Vector3(0, 0, topWall.transform.localScale.z / 2) + new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2); bottomWall.transform.position = doorBeingMade.transform.position - new Vector3(0, 0, bottomWall.transform.localScale.z / 2) + new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2); BoxCollider firstBoxcollider = topWall.GetComponent <BoxCollider>(); BoxCollider secondBoxCollider = bottomWall.GetComponent <BoxCollider>(); float firstSmallestScale = topWall.transform.localScale.z; float secondSmallestScale = bottomWall.transform.localScale.z; for (int i = 0; i < levelBases.Count; i++) { BoxCollider levelBaseBoxCollider = levelBases[i].GetComponent <BoxCollider>(); LevelCreatorUtils.WallsBounds levelBaseBounds = LevelCreatorUtils.BoxColliderToWallbounds(levelBases[i].transform.position, levelBaseBoxCollider); if (firstBoxcollider.bounds.Intersects(levelBaseBoxCollider.bounds)) //Top box { if (levelBaseBounds.minWallsZ < leftWallPos.z) { continue; } float zDistanceToWall = levelBaseBounds.minWallsZ - leftWallPos.z; if (zDistanceToWall < firstSmallestScale) { firstSmallestScale = zDistanceToWall; } } if (secondBoxCollider.bounds.Intersects(levelBaseBoxCollider.bounds)) // Bottom box { if (levelBaseBounds.maxWallsZ > rightWallPos.z) { Debug.LogWarning("Corner of door is in a wall"); continue; } float zDistanceToWall = rightWallPos.z - levelBaseBounds.maxWallsZ; if (zDistanceToWall < secondSmallestScale) { secondSmallestScale = zDistanceToWall; } } } topWall.transform.localScale = new Vector3(1, levelCreatorInfo.wallHeight, firstSmallestScale); bottomWall.transform.localScale = new Vector3(1, levelCreatorInfo.wallHeight, -secondSmallestScale); topWall.transform.position = doorBeingMade.transform.position + new Vector3(0, 0, topWall.transform.localScale.z / 2) + new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2); bottomWall.transform.position = doorBeingMade.transform.position + new Vector3(0, 0, bottomWall.transform.localScale.z / 2) - new Vector3(0, 0, (leftWallPos.z - rightWallPos.z) / 2); topWall.transform.parent = levelBaseMain.transform; bottomWall.transform.parent = levelBaseMain.transform; levelBases.Add(topWall); levelBases.Add(bottomWall); } else { LevelBase leftWall = Instantiate(levelBasePrefab); LevelBase rightWall = Instantiate(levelBasePrefab); AddNewObject(leftWall.gameObject); AddNewObject(rightWall.gameObject); float leftScale = Mathf.Abs(levelCreatorInfo.baseWidth / 2 - leftWallPos.x); float rightScale = Mathf.Abs(leftWallPos.x - levelCreatorInfo.baseWidth / 2); leftWall.transform.localScale = new Vector3(leftScale, levelCreatorInfo.wallHeight, 1); rightWall.transform.localScale = new Vector3(rightScale, levelCreatorInfo.wallHeight, 1); leftWall.transform.position = doorBeingMade.transform.position - new Vector3(leftWall.transform.localScale.x / 2, 0, 0) - new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0); rightWall.transform.position = doorBeingMade.transform.position + new Vector3(rightWall.transform.localScale.x / 2, 0, 0) + new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0); BoxCollider leftBoxCollider = leftWall.GetComponent <BoxCollider>(); BoxCollider rightBoxCollider = rightWall.GetComponent <BoxCollider>(); float leftSmallestScale = leftWall.transform.localScale.x; float rightSmallestScale = rightWall.transform.localScale.x; for (int i = 0; i < levelBases.Count; i++) { if (levelBases[i] == null) { continue; } BoxCollider levelBaseBoxCollider = levelBases[i].GetComponent <BoxCollider>(); LevelCreatorUtils.WallsBounds levelBaseBounds = LevelCreatorUtils.BoxColliderToWallbounds(levelBases[i].transform.position, levelBaseBoxCollider); if (leftBoxCollider.bounds.Intersects(levelBaseBoxCollider.bounds)) //Top box { if (levelBaseBounds.maxWallsX > leftWallPos.x) { Debug.LogWarning("Corner of door is in a wall"); continue; } float xDistanceToWall = leftWallPos.x - levelBaseBounds.maxWallsX; if (xDistanceToWall < leftSmallestScale) { leftSmallestScale = xDistanceToWall; } } if (rightBoxCollider.bounds.Intersects(levelBaseBoxCollider.bounds)) // Bottom box { if (levelBaseBounds.minWallsX < rightWallPos.x) { Debug.LogWarning("Corner of door is in a wall"); continue; } float xDistanceToWall = levelBaseBounds.minWallsX - rightWallPos.x; if (xDistanceToWall < rightSmallestScale) { rightSmallestScale = xDistanceToWall; } } } leftWall.transform.localScale = new Vector3(leftSmallestScale, levelCreatorInfo.wallHeight, 1); rightWall.transform.localScale = new Vector3(rightSmallestScale, levelCreatorInfo.wallHeight, 1); leftWall.transform.position = doorBeingMade.transform.position - new Vector3(leftWall.transform.localScale.x / 2, 0, 0) - new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0); rightWall.transform.position = doorBeingMade.transform.position + new Vector3(rightWall.transform.localScale.x / 2, 0, 0) + new Vector3((rightWallPos.x - leftWallPos.x) / 2, 0, 0); leftWall.transform.parent = levelBaseMain.transform; rightWall.transform.parent = levelBaseMain.transform; leftWall.transform.name = "leftWall"; rightWall.transform.name = "rightWall"; levelBases.Add(leftWall); levelBases.Add(rightWall); } AddToUndo(tempUndoList); }
void SpliceUpMesh(Room pUpdatedRoom, LevelBase pSpliceMesh) { LevelCreatorUtils.WallsBounds levelBaseWallBounds = LevelCreatorUtils.BoxColliderToWallbounds(pSpliceMesh.transform.position, pSpliceMesh.GetComponent <BoxCollider>()); //Check if room corners are intersecting int cornersInLevelbase = (pUpdatedRoom.wallBounds.TotalCornersInBound(levelBaseWallBounds)); if (cornersInLevelbase > 0) { if (cornersInLevelbase > 3) // Splice in 4 { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1)); CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1)); CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0)); CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0)); } else { //Check wich corner is intersecting if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopLeft(), levelBaseWallBounds)) { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1)); CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0)); if (cornersInLevelbase == 2) { if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopRight(), levelBaseWallBounds)) { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0)); } else //Bottom left { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1)); } } } else if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerBottomRight(), levelBaseWallBounds)) { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0)); CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1)); if (cornersInLevelbase == 2) { if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopRight(), levelBaseWallBounds)) { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1)); } else //Bottom left { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0)); } } } else if (pUpdatedRoom.wallBounds.IsCornerInBound(LevelCreatorUtils.WallsBounds.CornerTopRight(), levelBaseWallBounds)) { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0)); CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1)); } else //Bottom left solo { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0)); CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1)); } } } else // Check wich { int cornersInRoom = levelBaseWallBounds.TotalCornersInBound(pUpdatedRoom.wallBounds); if (cornersInRoom > 3)// All corners are in room, delete mesh { Debug.Log("more than 3 corners in base. not making a new one"); return; } else // Move mesh to side { if (pUpdatedRoom.wallBounds.minWallsX > levelBaseWallBounds.minWallsX) //Left { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(-1, 0, 0)); if (pUpdatedRoom.wallBounds.maxWallsX < levelBaseWallBounds.maxWallsX) { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0)); } } else if (pUpdatedRoom.wallBounds.maxWallsZ < levelBaseWallBounds.maxWallsZ) //Top { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, 1)); if (pUpdatedRoom.wallBounds.minWallsZ > levelBaseWallBounds.minWallsZ) { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1)); } } else if (pUpdatedRoom.wallBounds.maxWallsX < levelBaseWallBounds.maxWallsX) //Right { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(1, 0, 0)); } else //Bottom { CreateNewSubMesh(pSpliceMesh, pUpdatedRoom.wallBounds, new Vector3(0, 0, -1)); } } } }