private void DrawPipeCube(float x, float y, PipeLayer layer, float value, OffsetPipesAdjacencyConnector.PipeOrientation orientation, float drawSize, float rotation) { float offsetX = 0f; float offsetY = 0f; switch (layer) { case PipeLayer.L1: offsetX = -0.25f; offsetY = 0.25f; break; case PipeLayer.L3: offsetX = 0.25f; offsetY = -0.25f; break; } switch (orientation) { case OffsetPipesAdjacencyConnector.PipeOrientation.o: if (layer == PipeLayer.L2 || layer == PipeLayer.Upper) { Gizmos.DrawCube(new Vector3(x, value / 2f, y), new Vector3(0.2f * drawSize, value, 0.2f * drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.i: if (rotation > 0) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); } else { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.cNorth: if (rotation > 0) { Gizmos.DrawCube(new Vector3(x + 0.25f, value / 2f, y + offsetY), new Vector3(0.5f * drawSize, value, 0.2f * drawSize)); } else { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y + 0.25f), new Vector3(0.2f * drawSize, value, 0.5f * drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.cSouth: if (rotation > 0) { Gizmos.DrawCube(new Vector3(x - 0.25f, value / 2f, y + offsetY), new Vector3(0.5f * drawSize, value, 0.2f * drawSize)); } else { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y - 0.25f), new Vector3(0.2f * drawSize, value, 0.5f * drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.tNEW: if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } else if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y + 0.33f), new Vector3(0.2f * drawSize, value, 0.35f * drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.tNSE: if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x + 0.33f, value / 2f, y + offsetY), new Vector3(0.35f * drawSize, value, 0.2f * drawSize)); Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } else if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.tNSW: if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } else if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x - 0.33f, value / 2f, y + offsetY), new Vector3(0.35f * drawSize, value, 0.2f * drawSize)); Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.tSWE: if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); } else if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.lNE: if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); } else if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.lNW: if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y + offsetY), new Vector3(0.35f * drawSize, value, 0.2f * drawSize)); } else if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.lSE: if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y + offsetY), new Vector3(0.35f * drawSize, value, 0.2f * drawSize)); } else if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.lSW: if (layer == PipeLayer.L3) { Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); } else if (layer == PipeLayer.L1) { Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); } break; case OffsetPipesAdjacencyConnector.PipeOrientation.x: Gizmos.DrawCube(new Vector3(x + offsetX, value / 2f, y), new Vector3(0.2f * drawSize, value, drawSize)); Gizmos.DrawCube(new Vector3(x, value / 2f, y + offsetY), new Vector3(drawSize, value, 0.2f * drawSize)); break; } }
// Should be moved to the Atmos editor in the future private void OnDrawGizmos() { float drawSize = 0.8f; #if UNITY_EDITOR if (!EditorApplication.isPlaying) { return; } #endif if (drawDebug) { // For each tile in the tilemap foreach (TileObject tile in tileManager.GetAllTiles()) { // ugly hack to get coordinates string[] coords = tile.name.Split(','); int xTemp = Int32.Parse(coords[0].Replace("[", "")); int yTemp = Int32.Parse(coords[1].Replace("]", "")); var realcoords = tileManager.GetPosition(xTemp, yTemp); float x = realcoords.x; float y = realcoords.z; Vector3 draw = new Vector3(x, 0, y) / 1f; Color state; switch (tile.atmos.GetState()) { case AtmosStates.Active: state = new Color(0, 0, 0, 0); break; case AtmosStates.Semiactive: state = new Color(0, 0, 0, 0.8f); break; case AtmosStates.Inactive: state = new Color(0, 0, 0, 0.8f); break; default: state = new Color(0, 0, 0, 1); break; } float pressure; if (drawTiles) { if (tile.atmos.GetState() == AtmosStates.Blocked) { Gizmos.color = new Color(0.2f, 0.2f, 0.2f, 1f); // Draw black cube where atmos flow is blocked if (drawWall) { Gizmos.DrawCube(new Vector3(x, 0.5f, y), new Vector3(1, 2, 1)); } } else { switch (drawView) { case ViewType.Content: float[] gases = new float[5]; Color[] colors = new Color[] { Color.yellow, Color.white, Color.gray, Color.magenta }; float offset = 0f; for (int k = 0; k < 4; ++k) { float moles = tile.atmos.GetAtmosContainer().GetGasses()[k] / 30f; if (moles != 0f) { Gizmos.color = colors[k] - state; if (drawAll || k == 3) // Only draw plasma { Gizmos.DrawCube(new Vector3(x, moles / 2f + offset, y), new Vector3(1 * drawSize, moles, 1 * drawSize)); offset += moles; } } } break; case ViewType.Pressure: pressure = tile.atmos.GetPressure() / 160f; if (drawAll || tile.atmos.GetState() == AtmosStates.Active) { Gizmos.color = Color.white - state; Gizmos.DrawCube(new Vector3(x, pressure / 2f, y), new Vector3(1 * drawSize, pressure, 1 * drawSize)); } break; case ViewType.Temperature: float temperatue = tile.atmos.GetAtmosContainer().GetTemperature() / 100f; Gizmos.color = Color.red - state; Gizmos.DrawCube(new Vector3(x, temperatue / 2f, y), new Vector3(1 * drawSize, temperatue, 1 * drawSize)); break; case ViewType.Combined: pressure = tile.atmos.GetPressure() / 30f; Gizmos.color = new Color(tile.atmos.GetAtmosContainer().GetTemperature() / 500f, 0, 0, 1) - state; Gizmos.DrawCube(new Vector3(x, pressure / 2f, y), new Vector3(1 * drawSize, pressure, 1 * drawSize)); break; case ViewType.Wind: Gizmos.color = Color.white; Gizmos.DrawLine(new Vector3(x, 0, y), new Vector3(x + Mathf.Clamp(tile.atmos.GetVelocity().x, -1, 1), 0, y + Mathf.Clamp(tile.atmos.GetVelocity().y, -1, 1))); break; } } } drawSize = 1f; // Draw pipe contents if (showPipes) { PipeObject[] pipes = tile.GetComponentsInChildren <PipeObject>(); foreach (PipeObject pipe in pipes) { if (!showOnlySelectedPipes || (showOnlySelectedPipes && pipe.layer == selectedPipeLayer)) { float rotation = 0f; OffsetPipesAdjacencyConnector offsetConnector = pipe.GetComponent <OffsetPipesAdjacencyConnector>(); OffsetPipesAdjacencyConnector.PipeOrientation pipeOrientation = OffsetPipesAdjacencyConnector.PipeOrientation.o; if (offsetConnector) { pipeOrientation = offsetConnector.GetPipeOrientation(); rotation = offsetConnector.GetRotation(); } switch (pipe.GetState()) { case AtmosStates.Active: state = new Color(0, 0, 0, 0); break; case AtmosStates.Semiactive: state = new Color(0, 0, 0, 0.8f); break; case AtmosStates.Inactive: state = new Color(0, 0, 0, 0.8f); break; default: state = new Color(0, 0, 0, 1); break; } switch (drawView) { case ViewType.Content: float[] gases = new float[5]; Color[] colors = new Color[] { Color.yellow, Color.white, Color.gray, Color.magenta }; float offset = 0f; for (int k = 0; k < 4; ++k) { float moles = pipe.GetAtmosContainer().GetGasses()[k] / 30f; if (moles != 0f) { Gizmos.color = colors[k] - state; if (drawAll || k == 3) // Only draw plasma { DrawPipeCube(x, y, pipe.layer, moles / 2f + offset, pipeOrientation, drawSize, rotation); offset += moles; } } } break; case ViewType.Pressure: pressure = pipe.GetPressure() / 160f; if (drawAll || pipe.GetState() == AtmosStates.Active) { Gizmos.color = Color.white - state; DrawPipeCube(x, y, pipe.layer, pressure, pipeOrientation, drawSize, rotation); } break; case ViewType.Temperature: float temperatue = pipe.GetAtmosContainer().GetTemperature() / 100f; Gizmos.color = Color.red - state; DrawPipeCube(x, y, pipe.layer, temperatue / 2f, pipeOrientation, drawSize, rotation); break; case ViewType.Combined: pressure = pipe.GetPressure() / 30f; Gizmos.color = new Color(pipe.GetAtmosContainer().GetTemperature() / 500f, 0, 0, 1) - state; DrawPipeCube(x, y, pipe.layer, pressure, pipeOrientation, drawSize, rotation); break; } } } } } } }