Пример #1
0
        unsafe private void NotifyMaterialSetup(uint pass_id, MaterialPtr mat)
        {
            // Prepare the fragment params offsets
            switch (pass_id)
            {
            //case 994: // rt_lum4
            case 993:     // rt_lum3
            case 992:     // rt_lum2
            case 991:     // rt_lum1
            case 990:     // rt_lum0
                break;

            case 800:     // rt_brightpass
                break;

            case 701:     // rt_bloom1
            {
                // horizontal bloom
                mat.Load();
                GpuProgramParametersSharedPtr fparams =
                    mat.GetBestTechnique().GetPass(0).GetFragmentProgramParameters();
                String progName = mat.GetBestTechnique().GetPass(0).FragmentProgramName;
                fixed(float *p_mBloomTexOffsetsHorz = &mBloomTexOffsetsHorz[0, 0])
                {
                    fparams.SetNamedConstant("sampleOffsets", p_mBloomTexOffsetsHorz, 15);
                }

                fixed(float *p_mBloomTexWeights = &mBloomTexWeights[0, 0])
                {
                    fparams.SetNamedConstant("sampleWeights", p_mBloomTexWeights, 15);
                }

                break;
            }

            case 700:     // rt_bloom0
            {
                // vertical bloom
                mat.Load();
                GpuProgramParametersSharedPtr fparams =
                    mat.GetTechnique(0).GetPass(0).GetFragmentProgramParameters();
                String progName = mat.GetBestTechnique().GetPass(0).FragmentProgramName;
                fixed(float *p_mBloomTexOffsetsVert = &mBloomTexOffsetsVert[0, 0])
                {
                    fparams.SetNamedConstant("sampleOffsets", p_mBloomTexOffsetsVert, 15);
                }

                fixed(float *p_mBloomTexWeights = &mBloomTexWeights[0, 0])
                {
                    fparams.SetNamedConstant("sampleWeights", p_mBloomTexWeights, 15);
                }

                break;
            }
            }
        }
Пример #2
0
        public static string[] GetTextureNames(Entity entity)
        {
            List <string> textures = new List <string>();
            //string[] textures = new string[];
            SubEntity e;

            for (uint i = 0; i < entity.NumSubEntities; i++)
            {
                e = entity.GetSubEntity(i);
                MaterialPtr ptr = MaterialManager.Singleton.GetByName(e.MaterialName);
                if (!ptr.IsLoaded)
                {
                    ptr.Load(false);
                }
                Technique t = ptr.GetBestTechnique();
                Technique.PassIterator iterator = t.GetPassIterator();
                foreach (Pass pass in iterator)
                {
                    Pass.TextureUnitStateIterator iterator2 = pass.GetTextureUnitStateIterator();
                    foreach (TextureUnitState unit in iterator2)
                    {
                        if (unit.GetContentType() == TextureUnitState.ContentType.CONTENT_NAMED)
                        {
                            if (unit.TextureName.Length > 0 && !textures.Contains(unit.TextureName))
                            {
                                textures.Add(unit.TextureName);
                            }
                        }
                    }
                }
            }

            return(textures.ToArray());
        }
Пример #3
0
        public OverlayContainer createStaticImage(Vector4 posAndSize, String imageName, bool topLevel)
        {
            mGUI.tc++;
            MaterialPtr ptr = Wof.Misc.ViewHelper.CloneMaterial("bgui.image", "bgui.image_" + imageName + mO.Name + StringConverter.ToString(mGUI.tc));

            ptr.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetTextureName(imageName);

            //  alpha_op_ex source1 src_manual src_texture 0.5
            // ptr.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetAlphaOperation(LayerBlendOperationEx.LBX_SOURCE1, LayerBlendSource.LBS_MANUAL, LayerBlendSource.LBS_TEXTURE, 0.5f);


            Overlay o;

            if (topLevel)
            {
                o = mGUI.mOTop;
            }
            else
            {
                o = mGUI.mO;
            }

            OverlayContainer x = mGUI.createOverlay(mO.Name + StringConverter.ToString(mGUI.tc) + imageName,
                                                    new Vector2(posAndSize.x, posAndSize.y), new Vector2(posAndSize.z, posAndSize.w), ptr.Name, "", false, o);

            ptr = null;

            mO.AddChild(x);
            x.Show();
            mI.Add(x);

            return(x);
        }
Пример #4
0
        protected override void CreateGUI()
        {
            MaterialPtr overlayMaterial = MaterialManager.Singleton.GetByName("SplashScreen");
            string      lang            = "_" + LanguageManager.ActualLanguageCode;

            overlayMaterial.Load();
            overlayMaterial.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetTextureName(C_SCREEN_NAME + screen +
                                                                                                lang + ".jpg");
            overlayMaterial = null;
            OverlayManager.Singleton.GetOverlayElement("Wof/LoadingScreenText").Caption = "";

            tutorialOverlay.Show();
        }
Пример #5
0
        public void DestroyMessageContainer()
        {
            try
            {
                MaterialPtr mat = MaterialManager.Singleton.GetByName("MessageBarIcon");
                mat.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetTextureName("radio.png");
            }
            catch (Exception)
            {
            }

            if (messageOverlay != null)
            {
                messageOverlay.Hide();
                messageOverlay.Dispose();
                messageOverlay = null;
            }

            if (backgroundElement != null)
            {
                backgroundElement.Hide();
                backgroundElement.Dispose();
                backgroundElement = null;
            }

            messageContainer.Hide();

            OverlayManager.Singleton.DestroyOverlayElement(messageElement);
            messageElement = null;
            messageContainer.Dispose();
            messageContainer = null;

            if (iconOverlay != null)
            {
                iconElement.Hide();
                iconElement.Dispose();
                iconElement = null;
                iconOverlay.Hide();
                iconOverlay.Dispose();
                iconOverlay = null;
            }
        }
Пример #6
0
        private void SetBgOpacity(float val)
        {
            if (backgroundElement == null)
            {
                return;
            }
            if (val > 1)
            {
                val = 1.0f;
            }
            if (val < 0)
            {
                val = 0;
            }


            MaterialPtr bgMaterial = backgroundElement.GetMaterial();

            bgMaterial.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetAlphaOperation(LayerBlendOperationEx.LBX_SOURCE1, LayerBlendSource.LBS_MANUAL, LayerBlendSource.LBS_CURRENT, val);
            //alpha_op_ex source1 src_manual src_current 0.3
            messageBgOverlay.Show();
        }
Пример #7
0
        private void NextScreen()
        {
            TimeSpan diff = DateTime.Now.Subtract(lastChange);
            string   lang = "_" + LanguageManager.ActualLanguageCode;

            if (diff.TotalMilliseconds < 200)
            {
                return;
            }
            lastChange = DateTime.Now;
            screen++;
            if (screen >= 1)
            {
                TextureManager.Singleton.Unload(C_SCREEN_NAME + (screen - 1) + lang + ".jpg");
            }


            if (screen > maxScreens)
            {
                GotoStartScreen();
                return;
            }

            tutorialOverlay.Hide();
            MaterialPtr overlayMaterial = MaterialManager.Singleton.GetByName("SplashScreen");

            overlayMaterial.Load();
            overlayMaterial.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetTextureName(C_SCREEN_NAME + screen +
                                                                                                lang + ".jpg");

            overlayMaterial = null;
            OverlayManager.Singleton.GetOverlayElement("Wof/LoadingScreenText").Caption = "";


            tutorialOverlay.Show();
        }
Пример #8
0
        /// <summary>
        /// Buduje quada o wymaganych parametrach. Quad bedzie mogl byc wyswietlony w przestrzeni 3D. Ma nakladn¹ teksture wg textureName
        /// </summary>
        /// <param name="quadrangle"></param>
        /// <param name="origin"></param>
        /// <param name="textureName"></param>
        public void SetCorners3D(Quadrangle quadrangle, Vector3 origin, String textureName)
        {
            this.quadrangle = quadrangle;
            Vector2 leftBottom  = quadrangle.Peaks[0].ToVector2();
            Vector2 leftTop     = quadrangle.Peaks[1].ToVector2();
            Vector2 rightTop    = quadrangle.Peaks[2].ToVector2();
            Vector2 rightBottom = quadrangle.Peaks[3].ToVector2();

            float extend = 1.25f;


            corners       = new float[4][];
            corners[0]    = new float[3];
            corners[0][0] = extend * rightBottom.x + origin.x;
            corners[0][1] = extend * rightBottom.y + origin.y;
            corners[0][2] = origin.z;


            corners[1]    = new float[3];
            corners[1][0] = extend * rightTop.x + origin.x;
            corners[1][1] = extend * rightTop.y + origin.y;
            corners[1][2] = origin.z;


            corners[2]    = new float[3];
            corners[2][0] = extend * leftTop.x + origin.x;
            corners[2][1] = extend * leftTop.y + origin.y;
            corners[2][2] = origin.z;


            corners[3]    = new float[3];
            corners[3][0] = extend * leftBottom.x + origin.x;
            corners[3][1] = extend * leftBottom.y + origin.y;
            corners[3][2] = origin.z;


            float textureTop    = 0;
            float textureLeft   = 0;
            float textureBottom = 1;
            float textureRight  = 1;

            //      manualObject.RenderQueueGroup = (byte)RenderQueueGroupID.RENDER_QUEUE_MAIN - 1;

            manualObject.Clear();
            manualObject.Begin("Misc/BoundingQuadrangle", RenderOperation.OperationTypes.OT_TRIANGLE_LIST);
            manualObject.Position(origin.x + leftBottom.x, origin.y + leftBottom.y, origin.z);
            manualObject.TextureCoord(textureLeft, textureBottom);
            manualObject.Position(origin.x + leftTop.x, origin.y + leftTop.y, origin.z);
            manualObject.TextureCoord(textureLeft, textureTop);
            manualObject.Position(origin.x + rightTop.x, origin.y + rightTop.y, origin.z);
            manualObject.TextureCoord(textureRight, textureTop);
            manualObject.Position(origin.x + rightBottom.x, origin.y + rightBottom.y, origin.z);
            manualObject.TextureCoord(textureRight, textureBottom);

            /*    manualObject.Position( origin.x + leftBottom.x, origin.y + leftBottom.y,  origin.z);
             *  manualObject.TextureCoord(0, 0);*/
            manualObject.Quad(3, 2, 1, 0);
            manualObject.End();


/*
 *          AxisAlignedBox box = new AxisAlignedBox();
 *          float hwidth = 1.4f * (quadrangle.RightMostX - quadrangle.LeftMostX) * 0.5f;
 *          float hheight = 1.4f * (quadrangle.HighestY - quadrangle.LowestY) * 0.5f;
 *          box.SetMinimum(origin.x - hwidth, origin.y - hheight, origin.z - 10);
 *          box.SetMaximum(origin.x + hwidth, origin.y + hheight, origin.z + 10);
 *
 *          manualObject.BoundingBox = box;
 */
            MaterialPtr mat  = ViewHelper.CloneMaterial("AdMaterial", manualObject.Name + "AdMaterial");
            Pass        pass = mat.GetBestTechnique().GetPass(0);

            pass.DepthWriteEnabled = true;
            pass.SetSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA);

            TextureUnitState state = pass.GetTextureUnitState(0);

            state.SetTextureName(textureName);

            manualObject.SetMaterialName(0, mat.Name);
            manualObject.CastShadows = false;
            OnSetCorners();
            //  manualObject.SetMaterialName(0, "Concrete");
        }
Пример #9
0
        private bool initScreen(int i)
        {
            MaterialPtr      overlayMaterial = null;
            TextureUnitState unit            = null;

            animation           = null;
            currentMaterialName = null;
            if (isScreenAnAd[i - 1]) // poczatkowo i = 1
            {
                // pobierz i ustaw na bie¿ac¹
                AdManager.AdStatus status = AdManager.Singleton.GetAd(C_AD_ZONE, 1.0f, out currentAd);

                if (status == AdManager.AdStatus.OK)
                {
                    // pobieranie OK.
                    currentMaterialName = C_AD_MATERIAL;
                    string path = AdManager.Singleton.LoadAdTexture(currentAd);
                    if (path == null)
                    {
                        return(false);
                    }
                    showAdText(viewport);


                    overlayMaterial = MaterialManager.Singleton.GetByName(currentMaterialName);
                    overlayMaterial.Load();
                    unit = overlayMaterial.GetBestTechnique().GetPass(0).GetTextureUnitState(0);

                    unit.SetTextureName(path);
                    AdManager.Singleton.RegisterImpression(currentAd);

                    //   int count;
                    //   count = adAction.Get_Ad_Impression_Counter(currentAd.id);
                    //    Console.WriteLine("Pobrañ: " + count);
                }
                else
                {
                    hideAdText();
                    return(false);
                }
            }
            else
            {
                currentMaterialName = C_TEXTURE_NAME + currentScreen;
                overlayMaterial     = MaterialManager.Singleton.GetByName(currentMaterialName);
                overlayMaterial.Load();
                unit = overlayMaterial.GetBestTechnique().GetPass(0).GetTextureUnitState(0);
                hideAdText();
            }



            textureDimensions = unit.GetTextureDimensions();
            PointD scale = new PointD(1, 1);
            // skaluj overlay tak aby tekstury nie zmienia³y swoich proporcji
            float prop = 1.0f;

            if (isScreenAnAd[currentScreen - 1])
            {
                // reklamy maja zachowac oryginalna rozdzielczosc
                scale = AdSizeUtils.ScaleAdToDisplay(textureDimensions, new PointD(Viewport.ActualWidth, Viewport.ActualHeight), true);
                scale = 0.65f * scale;
            }
            else
            {
                prop = 1.0f / ((1.0f * textureDimensions.first / textureDimensions.second) / (1.0f * Viewport.ActualWidth / Viewport.ActualHeight));
                // wychodzimy poza ekran
                if (scale.Y * prop > 1.0f)
                {
                    float scalingFactor = 1.0f / (scale.Y * prop);
                    scale.X *= scalingFactor; scale.Y *= scalingFactor;
                }

                if (scale.X * prop > 1.0f)
                {
                    float scalingFactor = 1.0f / (scale.X * prop);
                    scale.X *= scalingFactor; scale.Y *= scalingFactor;
                }
            }
            overlay.SetScale(scale.X, scale.Y * prop);



            animation =
                new EffectTextureAnimation(null, unit, screenTimes[i - 1], "QuitAnimation",
                                           VisibilityNodeAnimation.VisibilityType.VISIBLE,
                                           VisibilityNodeAnimation.VisibilityType.VISIBLE);

            animation.Enabled = true;
            animation.Looped  = true;
            OverlayContainer container = overlay.GetChild("Wof/QuitScreen");

            container.MaterialName = currentMaterialName;

            EffectsManager.Singleton.AddCustomEffect(animation);
            lastChange = DateTime.Now;
            return(true);
        }
Пример #10
0
        private bool initScreen(int i)
        {
            MaterialPtr      overlayMaterial = null;
            TextureUnitState unit;

            animation           = null;
            currentMaterialName = null;
            if (isScreenAnAd[i - 1]) // poczatkowo i = 1
            {
                if (Mogre.Math.RangeRandom(0, 1) < (1 - C_INTRO_AD_PROBABILITY))
                {
                    return(false);
                }


                //if(adIds.Count == 0) return false;
                AdManager.AdStatus status = AdManager.Singleton.GetAd(C_AD_ZONE, 1.0f, out currentAd);

                //AdManager.AdStatus status = AdManager.Singleton.GatherAsyncResult(adIds.Dequeue(), AdManager.C_AD_DOWNLOAD_TIMEOUT, out currentAd);
                if (status == AdManager.AdStatus.OK)
                {
                    // pobieranie OK.
                    currentMaterialName = C_AD_MATERIAL;
                    string path = AdManager.Singleton.LoadAdTexture(currentAd);
                    if (path == null)
                    {
                        return(false);
                    }
                    showAdText(viewport);



                    overlayMaterial = MaterialManager.Singleton.GetByName(currentMaterialName);
                    overlayMaterial.Load();
                    unit = overlayMaterial.GetBestTechnique().GetPass(0).GetTextureUnitState(0);

                    unit.SetTextureName(path);
                    AdManager.Singleton.RegisterImpression(currentAd);

                    //   int count;
                    //   count = adAction.Get_Ad_Impression_Counter(currentAd.id);
                    //    Console.WriteLine("Pobrañ: " + count);
                }
                else
                {
                    hideAdText();
                    return(false);
                }
            }
            else
            {
                string matName = EngineConfig.IsEnhancedVersion ? C_TEXTURE_NAME_ENHANCED : C_TEXTURE_NAME;

                currentMaterialName = matName + currentScreen;
                overlayMaterial     = MaterialManager.Singleton.GetByName(currentMaterialName);
                unit = overlayMaterial.GetBestTechnique().GetPass(0).GetTextureUnitState(0);


                hideAdText();
            }

            if (i == 1)
            {
                if (EngineConfig.SoundEnabled)
                {
                    if (ravenSound == null || !ravenSound.HasSound())
                    {
                        ravenSound = SoundManager3D.Instance.CreateAmbientSound(SoundManager3D.C_RAVEN, "ravenSound", false, false);                                               // destroyed together with SoundManager3D singleton
                    }
                    ravenSound.Play();
                }
            }

            textureDimensions = unit.GetTextureDimensions();
            //    Console.WriteLine(textureDimensions.first);

            PointD scale = new PointD(1, 1);
            // skaluj overlay tak aby tekstury nie zmienia³y swoich proporcji
            float prop = 1.0f;

            if (isScreenAnAd[currentScreen - 1])
            {
                // reklamy maja zachowac oryginalna rozdzielczosc
                scale = AdSizeUtils.ScaleAdToDisplay(textureDimensions, new PointD(Viewport.ActualWidth, Viewport.ActualHeight), true);
                scale = 0.65f * scale;
            }
            else
            {
                textureDimensions = new Pair <uint, uint>(1280, 1024);
                //	scale = AdSizeUtils.ScaleAdToDisplay(textureDimensions, new PointD(Viewport.ActualWidth, Viewport.ActualHeight), false);
                prop = 1.0f / ((1.0f * textureDimensions.first / textureDimensions.second) / (1.0f * Viewport.ActualWidth / Viewport.ActualHeight));

                // wychodzimy poza ekran
                if (scale.Y * prop > 1.0f)
                {
                    float scalingFactor = 1.0f / (scale.Y * prop);
                    scale.X *= scalingFactor; scale.Y *= scalingFactor;
                }

                if (scale.X * prop > 1.0f)
                {
                    float scalingFactor = 1.0f / (scale.X * prop);
                    scale.X *= scalingFactor; scale.Y *= scalingFactor;
                }

                //   scale.X *= 0.5f; scale.Y *= 0.5f;
            }
            overlay.SetScale(scale.X, scale.Y * prop);



            animation =
                new EffectTextureAnimation(null, unit, screenTimes[i - 1], "IntroAnimation",
                                           VisibilityNodeAnimation.VisibilityType.VISIBLE,
                                           VisibilityNodeAnimation.VisibilityType.VISIBLE);

            animation.Enabled = true;
            animation.Looped  = true;
            OverlayContainer container = overlay.GetChild("Wof/IntroScreen");

            container.MaterialName = currentMaterialName;

            EffectsManager.Singleton.AddCustomEffect(animation);
            lastChange = DateTime.Now;
            return(true);
        }
Пример #11
0
        private void PrepareMessage()
        {
            messageElement.Hide();

            // icon
            uint   iconFrames            = 1;
            float  iconAnimationDuration = 1.0f;
            string changedIcon           = null;

            if (currentMessage is IconedMessageEntry)
            {
                string  icon = (currentMessage as IconedMessageEntry).Icon;
                Vector2 dim  = (currentMessage as IconedMessageEntry).CustomIconDimensions;
                iconFrames            = (currentMessage as IconedMessageEntry).IconFrames;
                iconAnimationDuration = (currentMessage as IconedMessageEntry).IconAnimationDuration;
                if (lastIconTexture != icon)
                {
                    lastIconTexture = icon;
                    changedIcon     = icon;
                    if (!dim.IsZeroLength)
                    {
                        iconElement.Width  = dim.x;
                        iconElement.Height = dim.y;
                    }
                    else
                    {
                        iconElement.Width  = iconDefaultDimesions.x;
                        iconElement.Height = iconDefaultDimesions.y;
                    }
                }
            }
            else if (lastIconTexture != null)
            {
                changedIcon        = "radio.png";
                lastIconTexture    = null;
                iconElement.Width  = iconDefaultDimesions.x;
                iconElement.Height = iconDefaultDimesions.y;
            }

            if (changedIcon != null)
            {
                try
                {
                    MaterialPtr mat = MaterialManager.Singleton.GetByName("MessageBarIcon");
                    if (iconFrames > 1)
                    {
                        mat.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetAnimatedTextureName(changedIcon, iconFrames, iconAnimationDuration);
                        //   mat.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetTextureName(null);
                    }
                    else
                    {
                        //  mat.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetAnimatedTextureName(null, 1);
                        mat.GetBestTechnique().GetPass(0).GetTextureUnitState(0).SetTextureName(changedIcon);
                    }
                }
                catch (Exception)
                {
                }
            }



            currentMessage.IncreaseX(XMargin);
            currentMessage.IncreaseY(YMargin);

            iconOverlay.Hide();


            if (!iconOverlay.IsVisible)
            {
                float iconYPos = currentMessage.Y - iconElement.Height * 0.5f;                 // ikonka w jedym poziomie z tekstem

                if (iconYPos <= yMargin)
                {
                    iconYPos = currentMessage.Y + currentMessage.CharHeight * 0.25f;     // przyklej ikonke do rogu ekranu
                }
                iconElement.SetPosition((currentMessage.X), iconYPos);
            }

            messageContainer.SetPosition(iconElement.Width + currentMessage.X, currentMessage.Y);
            messageElement.SetParameter("char_height", currentMessage.getCharHeightString());
            messageElement.SetParameter("colour_top", currentMessage.ColourTopString);
            messageElement.SetParameter("colour_bottom", currentMessage.ColourBottomString);


            messageElement.Caption = currentMessage.GetMessageAdjustedByContainerWidth(mainViewport.ActualWidth * 0.8f, OverlayManager.Singleton.ViewportHeight);
            // messageElement.Caption = AbstractScreen.Wrap(currentMessage.Message, currentMessage.CharsPerLine); ;
        }
Пример #12
0
        private unsafe void NotifyMaterialSetup(uint pass_id, MaterialPtr mat)
        {
            // Prepare the fragment params offsets
            switch (pass_id)
            {
                //case 994: // rt_lum4
                case 993: // rt_lum3
                case 992: // rt_lum2
                case 991: // rt_lum1
                case 990: // rt_lum0
                    break;
                case 800: // rt_brightpass
                    break;
                case 701: // rt_bloom1
                    {
                        // horizontal bloom
                        mat.Load();
                        GpuProgramParametersSharedPtr fparams =
                            mat.GetBestTechnique().GetPass(0).GetFragmentProgramParameters();
                        String progName = mat.GetBestTechnique().GetPass(0).FragmentProgramName;
                        fixed (float* p_mBloomTexOffsetsHorz = &mBloomTexOffsetsHorz[0, 0])
                        {
                            fparams.SetNamedConstant("sampleOffsets", p_mBloomTexOffsetsHorz, 15);
                        }
                        fixed (float* p_mBloomTexWeights = &mBloomTexWeights[0, 0])
                        {
                            fparams.SetNamedConstant("sampleWeights", p_mBloomTexWeights, 15);
                        }

                        break;
                    }
                case 700: // rt_bloom0
                    {
                        // vertical bloom
                        mat.Load();
                        GpuProgramParametersSharedPtr fparams =
                            mat.GetTechnique(0).GetPass(0).GetFragmentProgramParameters();
                        String progName = mat.GetBestTechnique().GetPass(0).FragmentProgramName;
                        fixed (float* p_mBloomTexOffsetsVert = &mBloomTexOffsetsVert[0, 0])
                        {
                            fparams.SetNamedConstant("sampleOffsets", p_mBloomTexOffsetsVert, 15);
                        }
                        fixed (float* p_mBloomTexWeights = &mBloomTexWeights[0, 0])
                        {
                            fparams.SetNamedConstant("sampleWeights", p_mBloomTexWeights, 15);
                        }

                        break;
                    }
            }
        }