Beispiel #1
0
    override protected void SetStage(byte newStage)
    {
        if (destroyed || newStage == stage)
        {
            return;
        }
        if (transform.childCount != 0)
        {
            if (stage <= TRANSIT_STAGE)
            {
                if (newStage > TRANSIT_STAGE)
                {
                    Destroy(transform.GetChild(0).gameObject);
                    spriter     = null;
                    modelHolder = null;
                    stage       = newStage;
                    SetModel();
                }
                else
                {
                    stage          = newStage;
                    spriter.sprite = startStageSprites[stage];
                    drawmode       = OakDrawMode.DrawSaplingSprite;
                    RefreshVisibility();
                }
            }
            else
            {
                ReturnModelToPool();
                stage = newStage;
                SetModel();
            }
        }
        if (PoolMaster.qualityLevel > 0)
        {
            PoolMaster.current.LifepowerSplash(transform.position, stage);
        }
        RefreshVisibility();
        Grassland g = basement.GetGrassland();

        if (!GameMaster.loading && g != null)
        {
            g.needRecalculation = true;
        }
    }
Beispiel #2
0
 override protected void SetStage(byte newStage)
 {
     if (destroyed || newStage == stage)
     {
         return;
     }
     if (transform.childCount != 0)
     {
         if (stage <= TRANSIT_STAGE)
         {
             if (newStage > TRANSIT_STAGE)
             {
                 Destroy(transform.GetChild(0).gameObject);
                 spriter     = null;
                 modelHolder = null;
                 stage       = newStage;
                 SetModel();
             }
             else
             {
                 stage           = newStage;
                 spriter.sprite  = startStageSprites[stage];
                 spriter.enabled = ((transform.position - FollowingCamera.camPos).magnitude < TREE_SPRITE_MAX_VISIBILITY * stage);
                 drawmode        = OakDrawMode.DrawStartSprite;
             }
         }
         else
         {
             ReturnModelToPool();
             stage = newStage;
             SetModel();
         }
     }
     if (PoolMaster.qualityLevel > 0)
     {
         PoolMaster.current.LifepowerSplash(transform.position, stage);
     }
     SetVisibility(isVisible);
     if (!GameMaster.loading)
     {
         basement.GetGrassland().needRecalculation = true;
     }
 }
Beispiel #3
0
    private void ReturnModelToPool()
    {
        if (stage <= TRANSIT_STAGE | modelHolder == null)
        {
            return;
        }
        modelHolder.transform.parent = blankModelsContainer;
        modelHolder.gameObject.SetActive(false);
        switch (stage)
        {
        case 4: if (blankTrees_stage4.Count < CRITICAL_BUFFER_COUNT)
            {
                blankTrees_stage4.Add(modelHolder);
            }
            else
            {
                Destroy(modelHolder);
            } break;

        case 5: if (blankTrees_stage5.Count < CRITICAL_BUFFER_COUNT)
            {
                blankTrees_stage5.Add(modelHolder);
            }
            else
            {
                Destroy(modelHolder);
            } break;

        case 6: if (blankTrees_stage6.Count < CRITICAL_BUFFER_COUNT)
            {
                blankTrees_stage6.Add(modelHolder);
            }
            else
            {
                Destroy(modelHolder);
            } break;
        }
        modelHolder = null;
        spriter     = null;
        drawmode    = OakDrawMode.NoDraw;
    }
Beispiel #4
0
    override public void SetVisibility(bool x)
    {
        if (destroyed | x == isVisible)
        {
            return;
        }
        else
        {
            isVisible = x;
            if (isVisible)
            {
                if (modelHolder != null)
                {
                    // # change model draw mode (changed)
                    float dist = (transform.position - FollowingCamera.camPos).magnitude;
                    if (dist > LODController.lodCoefficient)
                    {
                        if (dist > TREE_SPRITE_MAX_VISIBILITY * stage)
                        {
                            drawmode        = OakDrawMode.NoDraw;
                            spriter.enabled = false;
                            modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                        }
                        else
                        {
                            drawmode        = OakDrawMode.DrawLOD;
                            spriter.enabled = true;
                            modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                            // # setting lod(changed)
                            byte  spriteNumber = 0;
                            float angle        = Vector3.Angle(Vector3.up, FollowingCamera.camPos - transform.position);
                            if (angle < 30)
                            {
                                if (angle < 10)
                                {
                                    spriteNumber = 3;
                                }
                                else
                                {
                                    spriteNumber = 2;
                                }
                            }
                            else
                            {
                                if (angle > 80)
                                {
                                    spriteNumber = 0;
                                }
                                else
                                {
                                    spriteNumber = 1;
                                }
                            }
                            switch (stage)
                            {
                            case 4: spriter.sprite = lodPack_stage4[spriteNumber]; break;

                            case 5: spriter.sprite = lodPack_stage5[spriteNumber]; break;

                            case 6: spriter.sprite = lodPack_stage6[spriteNumber]; break;
                            }
                            lodNumber = spriteNumber;
                            // eo setting lod
                        }
                        modelHolder.SetActive(true);
                    }
                    else
                    {
                        drawmode        = OakDrawMode.DrawModel;
                        spriter.enabled = false;
                        modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(true);
                    }
                }
                else
                {
                    spriter.enabled = isVisible;
                }
            }
            else
            {
                if (modelHolder != null)
                {
                    modelHolder.SetActive(false);
                }
                if (spriter != null)
                {
                    spriter.enabled = false;
                }
            }
        }
    }
Beispiel #5
0
    // тоже можно рассовать по методам
    override protected void SetModel()
    {
        // проверка на предыдущую модель не нужна  - устанавливается через SetStage
        if (!modelsContainerReady) // первая загрузка
        {
            startStageSprites    = Resources.LoadAll <Sprite>("Textures/Plants/oakTree");
            blankModelsContainer = new GameObject("oakTreesContainer").transform;

            blankTrees_stage4 = new List <GameObject>();
            blankTrees_stage5 = new List <GameObject>();
            blankTrees_stage6 = new List <GameObject>();

            //stage 4 model
            GameObject model3d = LoadModel(4);

            // хоть это и первая загрузка, лучше всё равно проверить
            LODController currentLC = LODController.GetCurrent();
            int           regIndex  = currentLC.LOD_existanceCheck(oak4_lod_regInfo);
            if (regIndex == -1)
            {
                RenderPoint[] rpoints = new RenderPoint[] {
                    new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                    new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                };
                regIndex = LODSpriteMaker.current.CreateLODPack(LODPackType.OneSide, model3d, rpoints, 32, 0.25f, Color.green, oak4_lod_regInfo);
            }
            LODRegistrationTicket rticket = currentLC.registeredLODs[regIndex];
            lodPack_stage4    = new Sprite[4];
            lodPack_stage4[0] = rticket.sprites[0];
            lodPack_stage4[1] = rticket.sprites[1];
            lodPack_stage4[2] = rticket.sprites[2];
            lodPack_stage4[3] = rticket.sprites[3];


            GameObject fullModel = new GameObject("oak4");
            fullModel.SetActive(false);

            GameObject     spriterCarrier = new GameObject("lodSpriter");
            SpriteRenderer sr             = spriterCarrier.AddComponent <SpriteRenderer>();
            //сначала добавляется спрайт
            sr.sprite         = lodPack_stage4[0];
            sr.sharedMaterial = PoolMaster.useAdvancedMaterials ? PoolMaster.billboardShadedMaterial: PoolMaster.billboardMaterial;
            if (PoolMaster.shadowCasting)
            {
                sr.receiveShadows = true;
            }
            spriterCarrier.transform.parent        = fullModel.transform;
            spriterCarrier.transform.localPosition = Vector3.up * 0.211f;
            // потом модель
            model3d.transform.parent        = fullModel.transform;
            model3d.transform.localPosition = Vector3.zero;
            model3d.transform.localRotation = Quaternion.identity;
            fullModel.transform.parent      = blankModelsContainer;
            blankTrees_stage4.Add(fullModel);

            // stage 5 model
            model3d  = LoadModel(5);
            regIndex = currentLC.LOD_existanceCheck(oak5_lod_regInfo);
            if (regIndex == -1)
            {
                RenderPoint[] rpoints = new RenderPoint[] {
                    new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                    new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                };
                regIndex = LODSpriteMaker.current.CreateLODPack(LODPackType.OneSide, model3d, rpoints, 32, 0.3f, Color.green, oak5_lod_regInfo);
            }
            rticket           = currentLC.registeredLODs[regIndex];
            lodPack_stage5    = new Sprite[4];
            lodPack_stage5[0] = rticket.sprites[0];
            lodPack_stage5[1] = rticket.sprites[1];
            lodPack_stage5[2] = rticket.sprites[2];
            lodPack_stage5[3] = rticket.sprites[3];
            fullModel         = new GameObject("oak5");
            fullModel.SetActive(false);
            spriterCarrier    = new GameObject("lodSpriter");
            sr                = spriterCarrier.AddComponent <SpriteRenderer>();
            sr.sharedMaterial = PoolMaster.useAdvancedMaterials ? PoolMaster.billboardShadedMaterial : PoolMaster.billboardMaterial;;
            if (PoolMaster.shadowCasting)
            {
                sr.receiveShadows = true;
            }
            sr.sprite = lodPack_stage5[0];
            spriterCarrier.transform.parent        = fullModel.transform;
            spriterCarrier.transform.localPosition = Vector3.up * 0.239f;
            model3d.transform.parent        = fullModel.transform;
            model3d.transform.localPosition = Vector3.zero;
            model3d.transform.localRotation = Quaternion.identity;
            fullModel.transform.parent      = blankModelsContainer;
            blankTrees_stage5.Add(fullModel);

            //stage 6 model
            model3d  = LoadModel(6);
            regIndex = currentLC.LOD_existanceCheck(oak6_lod_regInfo);
            if (regIndex == -1)
            {
                RenderPoint[] rpoints = new RenderPoint[] {
                    new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                    new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                };
                regIndex = LODSpriteMaker.current.CreateLODPack(LODPackType.OneSide, model3d, rpoints, 64, 0.45f, Color.green, oak6_lod_regInfo);
            }
            rticket           = currentLC.registeredLODs[regIndex];
            lodPack_stage6    = new Sprite[4];
            lodPack_stage6[0] = rticket.sprites[0];
            lodPack_stage6[1] = rticket.sprites[1];
            lodPack_stage6[2] = rticket.sprites[2];
            lodPack_stage6[3] = rticket.sprites[3];

            fullModel = new GameObject("oak6");
            fullModel.SetActive(false);
            spriterCarrier    = new GameObject("lodSpriter");
            sr                = spriterCarrier.AddComponent <SpriteRenderer>();
            sr.sharedMaterial = PoolMaster.useAdvancedMaterials ? PoolMaster.billboardShadedMaterial : PoolMaster.billboardMaterial;;
            if (PoolMaster.shadowCasting)
            {
                sr.receiveShadows = true;
            }
            sr.sprite = lodPack_stage6[0];
            spriterCarrier.transform.parent        = fullModel.transform;
            spriterCarrier.transform.localPosition = Vector3.up * 0.21f;
            model3d.transform.parent        = fullModel.transform;
            model3d.transform.localPosition = Vector3.zero;
            model3d.transform.localRotation = Quaternion.identity;
            fullModel.transform.parent      = blankModelsContainer;
            blankTrees_stage6.Add(fullModel);
            //
            modelsContainerReady = true;
            FollowingCamera.main.cameraChangedEvent += CameraUpdate;
        }
        if (stage > TRANSIT_STAGE)
        {
            switch (stage)
            {
            case 4:
                if (blankTrees_stage4.Count > 1)
                {
                    int lastIndex = blankTrees_stage4.Count - 1;
                    modelHolder = blankTrees_stage4[lastIndex];
                    blankTrees_stage4.RemoveAt(lastIndex);
                    if (lastIndex > MAX_INACTIVE_BUFFERED_STAGE4)
                    {
                        Destroy(blankTrees_stage4[lastIndex - 1]);
                        blankTrees_stage4.RemoveAt(lastIndex - 1);
                    }
                }
                else
                {
                    modelHolder = Instantiate(blankTrees_stage4[0], Vector3.zero, Quaternion.identity, transform);
                }
                break;

            case 5:
                if (blankTrees_stage5.Count > 1)
                {
                    int lastIndex = blankTrees_stage5.Count - 1;
                    modelHolder = blankTrees_stage5[lastIndex];
                    blankTrees_stage5.RemoveAt(lastIndex);
                    if (lastIndex > MAX_INACTIVE_BUFFERED_STAGE5)
                    {
                        Destroy(blankTrees_stage5[lastIndex - 1]);
                        blankTrees_stage5.RemoveAt(lastIndex - 1);
                    }
                }
                else
                {
                    modelHolder = Instantiate(blankTrees_stage5[0], Vector3.zero, Quaternion.identity, transform);
                }
                break;

            case 6:
                if (blankTrees_stage6.Count > 1)
                {
                    int lastIndex = blankTrees_stage6.Count - 1;
                    modelHolder = blankTrees_stage6[lastIndex];
                    blankTrees_stage6.RemoveAt(lastIndex);
                    if (lastIndex > MAX_INACTIVE_BUFFERED_STAGE6)
                    {
                        Destroy(blankTrees_stage6[lastIndex - 1]);
                        blankTrees_stage6.RemoveAt(lastIndex - 1);
                    }
                }
                else
                {
                    modelHolder = Instantiate(blankTrees_stage6[0], Vector3.zero, Quaternion.identity, transform);
                }
                break;
            }
            modelHolder.transform.parent        = transform;
            modelHolder.transform.localPosition = Vector3.zero;
            modelHolder.transform.rotation      = Quaternion.Euler(0, modelRotation * 90, 0);
            spriter = modelHolder.transform.GetChild(SPRITER_CHILDNUMBER).GetComponent <SpriteRenderer>();
            // # model draw mode check
            float dist = (transform.position - FollowingCamera.camPos).magnitude;
            if (dist < TREE_SPRITE_MAX_VISIBILITY * stage)
            {
                if (dist < LODController.lodCoefficient)
                {
                    modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(true); // model
                    spriter.enabled = false;                                                      // lod sprite
                    drawmode        = OakDrawMode.DrawModel;
                }
                else
                {
                    modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false); // model
                    // # setting lod (changed)
                    drawmode = OakDrawMode.DrawLOD;
                    byte  spriteNumber = 0;
                    float angle        = Vector3.Angle(Vector3.up, FollowingCamera.camPos - transform.position);
                    if (angle < 30)
                    {
                        if (angle < 10)
                        {
                            spriteNumber = 3;
                        }
                        else
                        {
                            spriteNumber = 2;
                        }
                    }
                    else
                    {
                        if (angle > 80)
                        {
                            spriteNumber = 0;
                        }
                        else
                        {
                            spriteNumber = 1;
                        }
                    }
                    switch (stage)
                    {
                    case 4: spriter.sprite = lodPack_stage4[spriteNumber]; break;

                    case 5: spriter.sprite = lodPack_stage5[spriteNumber]; break;

                    case 6: spriter.sprite = lodPack_stage6[spriteNumber]; break;
                    }
                    lodNumber = spriteNumber;
                    // eo setting lod
                    spriter.enabled = true; // lod sprite
                }
            }
            else
            {
                spriter.enabled = false;
                drawmode        = OakDrawMode.NoDraw;
            }
            modelHolder.SetActive(true);
        }
        else
        {
            GameObject model          = new GameObject("sprite");
            Transform  modelTransform = model.transform;
            modelTransform.parent        = transform;
            modelTransform.localPosition = Vector3.zero;
            //Vector3 cpos = modelTransform.InverseTransformPoint(FollowingCamera.camPos); cpos.y = 0;
            // modelTransform.LookAt(cpos);
            spriter                = modelTransform.gameObject.AddComponent <SpriteRenderer>();
            spriter.sprite         = startStageSprites[stage];
            spriter.sharedMaterial = PoolMaster.verticalWavingBillboardMaterial;
            spriter.enabled        = ((transform.position - FollowingCamera.camPos).magnitude < TREE_SPRITE_MAX_VISIBILITY * stage);
            drawmode               = OakDrawMode.DrawStartSprite;
        }
    }
Beispiel #6
0
    public static void CameraUpdate()
    {
        int count = oaks.Count;

        if (count > 0)
        {
            int         i      = 0;
            Vector3     camPos = FollowingCamera.camPos;
            Transform   t;
            Vector3     cpos;
            OakDrawMode newDrawMode = OakDrawMode.NoDraw;
            float       dist, lodDist = LODController.lodCoefficient;

            if (!PoolMaster.shadowCasting)
            {
                while (i < count)
                {
                    OakTree oak = oaks[i];
                    if (oak == null)
                    {
                        oaks.RemoveAt(i);
                        count--;
                        continue;
                    }
                    else
                    {
                        if (!oak.isVisible)
                        {
                            i++; continue;
                        }
                        dist = (oak.transform.position - camPos).magnitude;
                        if (oak.stage <= TRANSIT_STAGE)
                        {
                            if (dist > TREE_SPRITE_MAX_VISIBILITY * oak.stage)
                            {
                                if (oak.drawmode != OakDrawMode.NoDraw)
                                {
                                    oak.spriter.enabled = false;
                                    oak.drawmode        = OakDrawMode.NoDraw;
                                }
                            }
                            else
                            {
                                if (oak.drawmode != OakDrawMode.DrawStartSprite)
                                {
                                    oak.drawmode        = OakDrawMode.DrawStartSprite;
                                    oak.spriter.enabled = true;
                                }
                            }
                        }
                        else
                        {                        // # change model draw mode
                            float x = TREE_SPRITE_MAX_VISIBILITY + 3 * oak.stage;
                            x = dist / x;
                            if (x > lodDist)
                            {
                                if (x > 1)
                                {
                                    newDrawMode = OakDrawMode.NoDraw;
                                }
                                else
                                {
                                    newDrawMode = OakDrawMode.DrawLOD;
                                }
                            }
                            else
                            {
                                newDrawMode = OakDrawMode.DrawModel;
                            }
                            if (newDrawMode != oak.drawmode)
                            {
                                if (newDrawMode == OakDrawMode.NoDraw)
                                {
                                    oak.spriter.enabled = false;
                                    oak.modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                                }
                                else
                                {
                                    if (newDrawMode == OakDrawMode.DrawModel)
                                    {
                                        oak.spriter.enabled = false;
                                        oak.modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(true);
                                    }
                                    else
                                    {
                                        oak.spriter.enabled = true;
                                        oak.modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                                    }
                                }
                                oak.drawmode = newDrawMode;
                            }
                            // # setting lod
                            if (oak.drawmode == OakDrawMode.DrawLOD)
                            {
                                byte  spriteNumber = 0;
                                float angle        = Vector3.Angle(Vector3.up, camPos - oak.transform.position);
                                if (angle < 30)
                                {
                                    if (angle < 10)
                                    {
                                        spriteNumber = 3;
                                    }
                                    else
                                    {
                                        spriteNumber = 2;
                                    }
                                }
                                else
                                {
                                    if (angle > 85)
                                    {
                                        spriteNumber = 0;
                                    }
                                    else
                                    {
                                        spriteNumber = 1;
                                    }
                                }
                                if (spriteNumber != oak.lodNumber)
                                {
                                    switch (oak.stage)
                                    {
                                    case 4: oak.spriter.sprite = lodPack_stage4[spriteNumber]; break;

                                    case 5: oak.spriter.sprite = lodPack_stage5[spriteNumber]; break;

                                    case 6: oak.spriter.sprite = lodPack_stage6[spriteNumber]; break;
                                    }
                                    oak.lodNumber = spriteNumber;
                                }
                            }
                            // eo setting lod
                        }
                        i++;
                    }
                }
            }
            else
            { // то же самое, только с разворотом на камеру
                while (i < count)
                {
                    OakTree oak = oaks[i];
                    if (oak == null)
                    {
                        oaks.RemoveAt(i); continue;
                    }
                    else
                    {
                        if (!oak.isVisible)
                        {
                            i++; continue;
                        }
                        dist = (oak.transform.position - camPos).magnitude;
                        if (oak.stage <= TRANSIT_STAGE)
                        {
                            if (dist > TREE_SPRITE_MAX_VISIBILITY * oak.stage)
                            {
                                if (oak.drawmode != OakDrawMode.NoDraw)
                                {
                                    oak.spriter.enabled = false;
                                    oak.drawmode        = OakDrawMode.NoDraw;
                                }
                            }
                            else
                            {
                                if (oak.drawmode != OakDrawMode.DrawStartSprite)
                                {
                                    oak.drawmode        = OakDrawMode.DrawStartSprite;
                                    oak.spriter.enabled = true;
                                }
                                t         = oak.spriter.transform;
                                cpos      = Vector3.ProjectOnPlane(camPos - t.position, t.up);
                                t.forward = cpos.normalized;
                            }
                        }
                        else
                        {                        // # change model draw mode
                            float x = TREE_SPRITE_MAX_VISIBILITY + 3 * oak.stage;
                            x = dist / x;
                            if (x > lodDist)
                            {
                                if (x > 1)
                                {
                                    newDrawMode = OakDrawMode.NoDraw;
                                }
                                else
                                {
                                    newDrawMode = OakDrawMode.DrawLOD;
                                }
                            }
                            else
                            {
                                newDrawMode = OakDrawMode.DrawModel;
                            }
                            if (newDrawMode != oak.drawmode)
                            {
                                if (newDrawMode == OakDrawMode.NoDraw)
                                {
                                    oak.spriter.enabled = false;
                                    oak.modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                                }
                                else
                                {
                                    if (newDrawMode == OakDrawMode.DrawModel)
                                    {
                                        oak.spriter.enabled = false;
                                        oak.modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(true);
                                    }
                                    else
                                    {
                                        oak.spriter.enabled = true;
                                        oak.modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                                    }
                                }
                                oak.drawmode = newDrawMode;
                            }
                            // # setting lod
                            if (oak.drawmode == OakDrawMode.DrawLOD)
                            {
                                byte  spriteNumber = 0;
                                float angle        = Vector3.Angle(Vector3.up, camPos - oak.transform.position);
                                if (angle < 30)
                                {
                                    if (angle < 10)
                                    {
                                        spriteNumber = 3;
                                    }
                                    else
                                    {
                                        spriteNumber = 2;
                                    }
                                }
                                else
                                {
                                    if (angle > 85)
                                    {
                                        spriteNumber = 0;
                                    }
                                    else
                                    {
                                        spriteNumber = 1;
                                    }
                                }
                                if (spriteNumber != oak.lodNumber)
                                {
                                    switch (oak.stage)
                                    {
                                    case 4: oak.spriter.sprite = lodPack_stage4[spriteNumber]; break;

                                    case 5: oak.spriter.sprite = lodPack_stage5[spriteNumber]; break;

                                    case 6: oak.spriter.sprite = lodPack_stage6[spriteNumber]; break;
                                    }
                                    oak.lodNumber = spriteNumber;
                                }
                                oak.spriter.transform.forward = oak.transform.position - camPos;
                            }
                            // eo setting lod
                        }
                        i++;
                    }
                }
            }
        }
    }
Beispiel #7
0
    protected override void INLINE_SetVisibility(VisibilityMode vm)
    {
        byte vmode = (byte)vm;

        if (stage <= TRANSIT_STAGE) // Спрайт
        {
            if (vmode >= (byte)VisibilityMode.SmallObjectsLOD)
            {
                if (drawmode != OakDrawMode.NoDraw)
                {
                    spriter.enabled = false;
                    drawmode        = OakDrawMode.NoDraw;
                }
            }
            else
            {
                if (drawmode != OakDrawMode.DrawSaplingSprite)
                {
                    drawmode        = OakDrawMode.DrawSaplingSprite;
                    spriter.enabled = true;
                }
            }
        }
        else
        {
            OakDrawMode newDrawMode = OakDrawMode.NoDraw;
            //3d model
            if (vmode >= (byte)VisibilityMode.MediumObjectsLOD)
            {
                if (vmode >= (byte)VisibilityMode.HugeObjectsLOD)
                {
                    newDrawMode = OakDrawMode.NoDraw;
                }
                else
                {
                    newDrawMode = OakDrawMode.DrawLOD;
                }
            }
            else
            {
                newDrawMode = OakDrawMode.DrawModel;
            }
            if (newDrawMode != drawmode)
            {
                if (newDrawMode == OakDrawMode.NoDraw)
                {
                    spriter.enabled = false;
                    modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                }
                else
                {
                    if (newDrawMode == OakDrawMode.DrawModel)
                    {
                        spriter.enabled = false;
                        modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(true);
                    }
                    else
                    {
                        spriter.enabled = true;
                        modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false);
                    }
                }
                drawmode = newDrawMode;
            }
            // # setting lod
            if (drawmode == OakDrawMode.DrawLOD)
            {
                byte  spriteNumber = 0;
                float angle        = Vector3.Angle(Vector3.up, FollowingCamera.camPos - transform.position);
                if (angle < 30)
                {
                    if (angle < 10)
                    {
                        spriteNumber = 3;
                    }
                    else
                    {
                        spriteNumber = 2;
                    }
                }
                else
                {
                    if (angle > 85)
                    {
                        spriteNumber = 0;
                    }
                    else
                    {
                        spriteNumber = 1;
                    }
                }
                if (spriteNumber != lodNumber)
                {
                    switch (stage)
                    {
                    case 4: spriter.sprite = lodPack_stage4[spriteNumber]; break;

                    case 5: spriter.sprite = lodPack_stage5[spriteNumber]; break;

                    case 6: spriter.sprite = lodPack_stage6[spriteNumber]; break;
                    }
                    lodNumber = spriteNumber;
                }
            }
            // eo setting lod
        }
        visibilityMode = vm;
    }