示例#1
0
        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;
            }
        }
示例#2
0
        // 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;
                                }
                            }
                        }
                    }
                }
            }
        }