Ejemplo n.º 1
0
        public static void UnitTest()
        {
            xAABB2 aabb1 = new xAABB2();

            XUtils.Assert(aabb1.mIsValid == false);

            xAABB2 aabb2 = new xAABB2(Vector2.Zero);
            xAABB2 aabb3 = new xAABB2(Vector2.Zero, 1f);
            xAABB2 aabb4 = new xAABB2(Vector2.Zero, Vector2.Zero);

            XUtils.Assert(aabb2.IsValid() && aabb3.IsValid() && aabb4.IsValid());

            aabb2.Reset();
            XUtils.Assert(!aabb2.IsValid());

            Vector2     oneTwo     = new Vector2(1f, 2f);
            Vector2     negTwoFour = -2f * oneTwo;
            Vector2     TwentyTen  = new Vector2(20f, 10f);
            const float kTol       = 0.001f;

            aabb2.Set(oneTwo);
            XUtils.AssertVal(aabb2.mMin, oneTwo, kTol);
            XUtils.AssertVal(aabb2.mMax, oneTwo, kTol);
            XUtils.Assert(aabb2.IsValid());

            //aabb2.Set( oneTwo, negTwoFour ); inside out, asserts, good
            aabb2.Set(negTwoFour, oneTwo);
            XUtils.Assert(aabb2.Contains(Vector2.Zero));
            XUtils.Assert(!aabb2.Contains(TwentyTen));
            XUtils.Assert(aabb2.Contains(negTwoFour));
            XUtils.Assert(aabb2.Contains(oneTwo));
            XUtils.Assert(!aabb2.Contains(-TwentyTen));

            //aabb2.Set( oneTwo, -3f ); asserts on negative radius, good
            Vector2 fiveFive     = new Vector2(5f, 5f);
            Vector2 sixSeven     = oneTwo + fiveFive;
            Vector2 negFourThree = new Vector2(-4f, -3f);
            Vector2 epsilon      = new Vector2(kTol, kTol);

            aabb2.Set(oneTwo, 5f);
            XUtils.Assert(aabb2.Contains(oneTwo));
            XUtils.Assert(aabb2.Contains(fiveFive));
            XUtils.Assert(aabb2.Contains(negFourThree));
            XUtils.Assert(!aabb2.Contains(TwentyTen));
            XUtils.Assert(!aabb2.Contains(-TwentyTen));
            XUtils.Assert(aabb2.Contains(Vector2.Zero));
            XUtils.Assert(aabb2.Contains(negFourThree + epsilon));
            XUtils.Assert(!aabb2.Contains(negFourThree - epsilon));
            XUtils.Assert(aabb2.Contains(sixSeven - epsilon));
            XUtils.Assert(!aabb2.Contains(sixSeven + epsilon));

            aabb2.Set(Vector2.Zero);
            XUtils.Assert(!aabb2.IsNonDegenerate());

            aabb2.Add(Vector2.UnitX);
            XUtils.Assert(!aabb2.IsNonDegenerate());
            XUtils.Assert(aabb2.Contains(new Vector2(0.5f, 0f)));

            aabb2.Add(oneTwo);
            XUtils.Assert(aabb2.IsNonDegenerate());
            XUtils.Assert(aabb2.Contains(new Vector2(0.5f, 1f)));

            aabb2.Reset();
            aabb2.Add(Vector2.Zero);
            XUtils.Assert(aabb2.IsValid());

            aabb2.Reset();
            aabb2.Add(-fiveFive);
            aabb2.Add(TwentyTen);
            XUtils.AssertVal(aabb2.GetMin(), -fiveFive, kTol);
            XUtils.AssertVal(aabb2.GetMax(), TwentyTen, kTol);
            XUtils.AssertVal(aabb2.GetCenter(), new Vector2(7.5f, 2.5f), kTol);
            XUtils.AssertVal(aabb2.GetRadius(), new Vector2(12.5f, 7.5f), kTol);
            XUtils.AssertVal(aabb2.GetSize(), new Vector2(25f, 15f), kTol);
            XUtils.AssertVal(aabb2.GetArea(), 375f, kTol);

            aabb2.Reset();
            aabb2.Add(Vector2.Zero);
            aabb2.Add(oneTwo);
            aabb2.ScaleWorld(4f);
            XUtils.AssertVal(aabb2.GetArea(), 32f, kTol);

            aabb2.Translate(fiveFive);
            Vector2 center2 = new Vector2(7f, 9f);

            XUtils.AssertVal(aabb2.GetArea(), 32f, kTol);
            XUtils.AssertVal(aabb2.GetCenter(), center2, kTol);
            XUtils.Assert(!aabb2.Contains(oneTwo));
            XUtils.Assert(aabb2.Contains(new Vector2(6f, 8f)));

            //aabb2.ScaleWorld( -1f ); asserts negative scalar, good
            //aabb2.ScaleLocal( -50f ); asserts negative scalar, good
            aabb2.ScaleLocal(0.25f);
            XUtils.AssertVal(aabb2.GetCenter(), center2, kTol);
            XUtils.AssertVal(aabb2.GetArea(), 2f, kTol);
            XUtils.Assert(!aabb2.Contains(new Vector2(6f, 8f)));
            XUtils.Assert(aabb2.Contains(center2));

            aabb2.Reset();
            aabb2.Add(Vector2.Zero);
            aabb2.Add(oneTwo);
            aabb2.Resize(new Vector2(0.1f, -0.3f));
            XUtils.AssertVal(aabb2.GetArea(), 1.68f, kTol);
            XUtils.Assert(!aabb2.Contains(Vector2.Zero));
            XUtils.Assert(aabb2.Contains(new Vector2(-0.05f, 1.4f)));
        }
Ejemplo n.º 2
0
            public Selector(_Position pos, String title, eStyle style, eStyle button_style, eStyle title_style,
                            long id, String[] texts)
            {
                mRenderEnabled   = true;
                mID              = id;
                mPos             = pos.GetPosition();
                mPosition        = pos;
                mTitle           = title;
                mStyle           = style;
                mButtonStyle     = button_style;
                mTitleStyle      = title_style;
                this.mSelections = new _IButton[texts.Length];

                // create a default button to see how big it is vertically
                // size and position border accordingly, factoring in width of largest button including title
                // destroy that button
                // create all the proper buttons in the right spot
                // create title 'button' as disabled button
                XUI xui_inst = XUI.Instance();

                _IButton test          = xui_inst._CreateRectangularButton(Vector2.Zero, "Test", style);
                xAABB2   button_size   = test.GetAABB();
                float    button_size_y = button_size.GetSize().Y;

                xui_inst._DestroyButton(test);

                const float k_border_padding_scalar = 0.5f;
                float       border_padding          = k_border_padding_scalar * button_size_y;

                const float k_spacing_scalar = 0.2f;
                float       spacing          = k_spacing_scalar * button_size_y;

                // pad out the text strings so the buttons can be wide if the text is small
                int longest = GetLongestString(texts);

                PadButtonTexts(texts, longest);

                // create buttons
                PositionAndCreateButtons(texts, mSelections, border_padding, spacing, button_size_y, button_style, 0);

                // track largest
                float largest_x = GetWidest(mSelections);

                // create title button (non-functional) and see if it's the largest
                Vector2 title_pos = mPos + new Vector2(border_padding, border_padding);

                mTitleButton = xui_inst._CreateRectangularButton(title_pos, title, title_style);
                mTitleButton.SetActive(false);
                largest_x = Math.Max(largest_x, mTitleButton.GetAABB().GetSize().X);

                // calculate aabb
                const float title_padding_scalar = 4.0f;
                float       title_padding        = border_padding * title_padding_scalar;
                Vector2     title_padding_v      = new Vector2(0, title_padding);
                float       full_width           = largest_x + 2 * border_padding;

                float full_height = button_size_y * (mSelections.Length) +
                                    (mSelections.Length - 1) * spacing +
                                    2 * border_padding +
                                    title_padding;

                mAABB.Set(mPos, mPos + new Vector2(full_width, full_height));

                // translate each button to be centered, and account for title
                CenterButtons(mSelections, largest_x, title_padding);
                CenterButton(mTitleButton, largest_x, 0);

                // if the selector has a non-trivial Position, fix it
                if (mPosition.IsCentered())
                {
                    // see where it is now, figure out where it should be, translate.
                    // apply to aabb for selector plus translate all the buttons
                    xCoord  screen_dim     = XRenderManager.Instance().GetScreenDim();
                    Vector2 span           = mAABB.GetSize();
                    Vector2 screen_dim_vec = new Vector2(screen_dim.x, screen_dim.y);
                    Vector2 edge           = 0.5f * (screen_dim_vec - span);
                    Translate(edge);
                }
            }