Exemplo n.º 1
0
    public override bool OnInteract()
    {
        Ring.Floor floor = Ring.GetFloor(Radius);
        if (floor == null)
        {
            return(false);
        }

        Ring.Floor.Wing wing = floor.GetWing(Radians);
        if (wing != null)
        {
            return(false);
        }

        float position =
            (floor.RadiansToMeters(Radians) / Ring.UnitWingWidth).RoundDown() *
            Ring.UnitWingWidth;
        float radian_position = floor.MetersToRadians(position);

        if (InputUtility.WasMouseLeftReleased)
        {
            floor.Wings.Add(new Ring.Floor.Wing(floor, position, 1));
        }
        else
        {
            Overlay.StartRadians = radian_position;
            Overlay.EndRadians   = radian_position +
                                   floor.MetersToRadians(Ring.UnitWingWidth);

            Overlay.StartRadius = floor.Radius -
                                  floor.CeilingHeight;
            Overlay.EndRadius = floor.Radius;
        }

        return(true);
    }
Exemplo n.º 2
0
    public override bool OnInteract()
    {
        Ring.Floor floor = Ring.GetFloor(Radius);

        if (floor == null)
        {
            return(false);
        }

        Ring.Floor.Wing wing = floor.GetWing(Radians);

        if (wing != null)
        {
            if (InputUtility.WasMouseLeftReleased)
            {
                floor.Wings.Remove(wing);
            }
            else
            {
                Overlay.StartRadians = wing.StartRadians;
                Overlay.EndRadians   = wing.EndRadians;
                Overlay.StartRadius  = floor.Radius - floor.CeilingHeight;
                Overlay.EndRadius    = floor.Radius;
            }
        }
        else
        {
            int  floor_index       = Ring.Floors.IndexOf(floor);
            bool is_in_bottom_half = floor_index < Ring.Floors.Count / 2;

            if (InputUtility.WasMouseLeftReleased)
            {
                if (is_in_bottom_half)
                {
                    Ring.Floors.RemoveRange(0, floor_index + 1);
                }
                else
                {
                    Ring.Floors.RemoveRange(floor_index, Ring.Floors.Count - floor_index);
                }
            }
            else
            {
                Overlay.StartRadians = 0;
                Overlay.EndRadians   = 2 * Mathf.PI;

                if (is_in_bottom_half)
                {
                    Overlay.StartRadius = floor.Radius - floor.CeilingHeight;
                    Overlay.EndRadius   = Ring.GroundFloorRadius;
                }
                else
                {
                    Overlay.StartRadius = Ring.RoofRadius;
                    Overlay.EndRadius   = floor.Radius;
                }
            }
        }

        return(true);
    }
Exemplo n.º 3
0
    void Update()
    {
        if (Ring.Floors.Count() == 0)
        {
            Ring.GenerateSampleStructure(223, 5);
        }


        //Animation

        if (Application.isPlaying)
        {
            //Spin

            if (Linearity == 0)
            {
                in_linear_transition = false;

                transform.rotation = Quaternion.Euler(0, 0,
                                                      transform.rotation.eulerAngles.z +
                                                      Ring.RPM * 360 / 60.0f * Time.deltaTime);
            }
            else
            {
                if (!in_linear_transition)
                {
                    start_degrees        = transform.rotation.eulerAngles.z;
                    in_linear_transition = true;
                }

                transform.rotation = Quaternion.Euler(0, 0,
                                                      Mathf.Lerp(start_degrees, 0, Linearity));
            }
        }


        //Input

        if (IsSelected)
        {
            Ray     ray = The.StationViewer.GetRayFromCursorPosition();
            Vector2 polar_coordinates = PolarCoordinatesFromRay(ray);

            Ring.Floor.Wing wing_pointed_at =
                Ring.GetWing(polar_coordinates.x, polar_coordinates.y);

            foreach (WingVisualization wing in WingVisualizations)
            {
                if (wing.Wing == wing_pointed_at)
                {
                    wing.Color = Color.yellow;
                }
                else
                {
                    wing.Color = Color.green;
                }
            }
        }


        //Shader

        if (material == null)
        {
            material = new MaterialPropertyBlock();
            MeshRenderer.GetPropertyBlock(material);
        }

        bool regenerate = false;

        if (outer_radius_displayed != Ring.GroundFloorRadius)
        {
            regenerate = true;
        }

        if (wings_displayed_per_floor.Count != Ring.Floors.Count)
        {
            regenerate = true;
        }
        else
        {
            for (int i = 0; i < Ring.Floors.Count; i++)
            {
                if (Ring.Floors[i].Wings.Count != wings_displayed_per_floor[i])
                {
                    regenerate = true;
                }
            }
        }

        if (regenerate && Application.isPlaying)
        {
            //Floor data buffers

            float[] floor_indices = new float[FloorResolution];

            float[] floor_radii = new float[MaxFloorCount];

            float[] ceiling_heights = new float[MaxFloorCount];



            //Wing data buffers

            int     max_wing_count = MaxWingCountPerFloor * MaxFloorCount;
            float[] wing_indices   = new float[max_wing_count];
            for (int i = 0; i < max_wing_count; i++)
            {
                wing_indices[i] = -1;
            }

            float[] wing_positions = new float[max_wing_count];

            float[] wing_widths = new float[max_wing_count];


            //Wing data textures

            Texture2D wing_indices_texture = new Texture2D(MaxWingCountPerFloor / 4,
                                                           MaxFloorCount,
                                                           TextureFormat.RGBAFloat, false);
            wing_indices_texture.filterMode = FilterMode.Point;
            wing_indices_texture.wrapMode   = TextureWrapMode.Clamp;

            Texture2D wing_positions_texture = GameObject.Instantiate(wing_indices_texture);

            Texture2D wing_widths_texture = GameObject.Instantiate(wing_indices_texture);


            //Clear WingVisualizations

            foreach (WingVisualization wing in WingVisualizations)
            {
                GameObject.DestroyImmediate(wing.gameObject);
            }


            //Generate data

            foreach (WingVisualization wing in WingVisualizations)
            {
                GameObject.DestroyImmediate(wing.gameObject);
            }

            int floor_slot_index = 0;
            int wing_index       = 0;
            foreach (Ring.Floor floor in Ring.Floors)
            {
                int   floor_index    = Ring.Floors.IndexOf(floor);
                float ceiling_height = floor.CeilingHeight;
                float floor_radius   = Ring.GroundFloorRadius - floor_slot_index * Ring.Floor.UnitCeilingHeight;

                int floor_slot_count = (ceiling_height / Ring.Floor.UnitCeilingHeight).Round();
                for (int i = 0; i < floor_slot_count; i++)
                {
                    floor_indices[floor_slot_index++] = floor_index;
                }
                ceiling_heights[floor_index] = ceiling_height;
                floor_radii[floor_index]     = floor_radius;


                foreach (Ring.Floor.Wing wing in floor.Wings)
                {
                    float wing_width = wing.Width;
                    Color wing_color = Color;

                    int wing_slot_count       = (wing_width / Ring.UnitWingWidth).Round();
                    int wing_slot_start_index = (wing.Position / Ring.UnitWingWidth).Round();
                    for (int i = 0; i < wing_slot_count; i++)
                    {
                        wing_indices[floor_index * MaxWingCountPerFloor +
                                     wing_slot_start_index + i] = wing_index;
                    }
                    wing_widths[wing_index]    = wing_width;
                    wing_positions[wing_index] = wing.Position;

                    wing_index++;


                    WingVisualization wing_visualization =
                        GameObject.Instantiate(WingVisualizationPrefab);
                    wing_visualization.Wing = wing;
                    wing_visualization.transform.SetParent(WingVisualizationsContainer);
                    wing_visualization.Color = Color;
                }
            }

            material.SetFloatArray("FloorIndices", floor_indices);
            material.SetFloatArray("FloorRadii", floor_radii);
            material.SetFloatArray("FloorHeights", ceiling_heights);

            wing_indices_texture.SetPixelData(wing_indices, 0);
            wing_indices_texture.Apply();
            material.SetTexture("WingIndices", wing_indices_texture);

            wing_positions_texture.SetPixelData(wing_positions, 0);
            wing_positions_texture.Apply();
            material.SetTexture("WingPositions", wing_positions_texture);

            wing_widths_texture.SetPixelData(wing_widths, 0);
            wing_widths_texture.Apply();
            material.SetTexture("WingWidths", wing_widths_texture);


            outer_radius_displayed = Ring.GroundFloorRadius;

            wings_displayed_per_floor.Clear();
            foreach (Ring.Floor floor in Ring.Floors)
            {
                wings_displayed_per_floor.Add(floor.Wings.Count());
            }
        }

        UpdateWingColors();

        material.SetFloat("FloorDivisor", Ring.Floor.UnitCeilingHeight);
        material.SetFloat("InterstitialSpaceThickness",
                          Ring.Floor.InterstitialSpaceThickness * Linearity * 2);

        material.SetFloat("OuterRadius", Ring.GroundFloorRadius);
        material.SetFloat("InnerRadius", Ring.RoofRadius);

        material.SetFloat("WingDivisor", Ring.UnitWingWidth);
        material.SetFloat("WingDepth", Ring.UnitWingDepth);
        material.SetFloat("RingDepth", Ring.Depth);

        material.SetFloat("Linearity", Linearity);
        material.SetFloat("ApplyWidthCorrection", 1);
        material.SetFloat("WingVisibility", WingVisibility);
        material.SetFloat("WireframeVisibility", WireframeVisibility);
        material.SetColor("WireFrameColor", Color);

        material.SetFloat("WallThickness",
                          Ring.Floor.Wing.WallThickness * Linearity * 2);

        MeshRenderer.SetPropertyBlock(material);
    }