Ejemplo n.º 1
0
    public PlaneBoundLODModel SetInControl(Plane basement, GameObject model, SpriteRenderer sr, int indexInRegistered)
    {
        if (indexInRegistered == -1 || model == null || sr == null || basement == null)
        {
            return(null);
        }
        LODRegistrationTicket ticket = registeredLODs[indexInRegistered];

        ticket.activeUsers++;
        sr.sprite = ticket.sprites[0];
        return(new PlaneBoundLODModel(basement, model, sr));
    }
Ejemplo n.º 2
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;
        }
    }
Ejemplo n.º 3
0
    public void SetInControl(Transform modelHolder, int indexInRegistered, float i_lodSqrDist, float i_visibilitySqrDist)
    {
        if (indexInRegistered == -1 | modelHolder == null)
        {
            return;
        }
        LODRegistrationTicket ticket = registeredLODs[indexInRegistered];

        ticket.activeUsers++;
        PointLODModel mwl;

        if (ticket.lodPackType == LODPackType.Point)
        {
            mwl = new PointLODModel();
            pointLODmodels.Add(mwl);
        }
        else
        {
            AdvancedLODModel aml = new AdvancedLODModel();
            mwl             = aml;
            aml.ticketIndex = indexInRegistered;
            advancedLODmodels.Add(aml);
        }

        mwl.model3d               = modelHolder.GetChild(0).gameObject;
        mwl.spriteRenderer        = modelHolder.GetChild(1).GetComponent <SpriteRenderer>();
        mwl.spriteRenderer.sprite = ticket.sprites[0];
        if (mwl.spriteRenderer == null)
        {
            return;
        }
        mwl.lodSqrDistance        = i_lodSqrDist * i_lodSqrDist;
        mwl.visibilitySqrDistance = i_visibilitySqrDist * i_visibilitySqrDist;

        if (FollowingCamera.cam != null)
        {
            Vector3 pos    = modelHolder.position;
            float   sqdist = (pos - camPos).sqrMagnitude;
            if (sqdist > mwl.visibilitySqrDistance)
            {
                mwl.drawStatus = null;
                mwl.model3d.SetActive(false);
                mwl.spriteRenderer.enabled = false;
            }
            else
            {
                if (sqdist < mwl.lodSqrDistance)
                {
                    mwl.drawStatus = true;
                    mwl.model3d.SetActive(true);
                    mwl.spriteRenderer.enabled = false;
                }
                else
                {
                    mwl.drawStatus = false;
                    mwl.model3d.SetActive(false);
                    switch (ticket.lodPackType)
                    {
                    case LODPackType.Point:
                        mwl.spriteRenderer.sprite = ticket.sprites[0];
                        break;

                    case LODPackType.OneSide:
                    {
                        //#oneside sprite check
                        AdvancedLODModel alm = mwl as AdvancedLODModel;
                        alm.oneSide = ticket.lodPackType == LODPackType.OneSide;
                        float angle = Vector3.Angle(camPos - pos, Vector3.up);
                        if (angle > SECOND_LOD_THRESHOLD)
                        {
                            if (angle > THIRD_LOD_THRESHOLD)
                            {
                                alm.drawingSpriteIndex = 3;
                            }
                            else
                            {
                                alm.drawingSpriteIndex = 2;
                            }
                        }
                        else
                        {
                            if (angle < FIRST_LOD_THRESHOLD)
                            {
                                alm.drawingSpriteIndex = 0;
                            }
                            else
                            {
                                alm.drawingSpriteIndex = 1;
                            }
                        }
                        alm.spriteRenderer.sprite = ticket.sprites[alm.drawingSpriteIndex];
                        //eo oneside sprite check
                        break;
                    }
                    }
                    mwl.spriteRenderer.enabled = true;
                }
            }
        }
        else
        {
            mwl.spriteRenderer.enabled = false;
            mwl.drawStatus             = null;
            mwl.model3d.SetActive(false);
        }
    }
Ejemplo n.º 4
0
 public int RegisterLOD(LODRegistrationTicket lticket)
 {
     registeredLODs.Add(lticket);
     return(registeredLODs.Count - 1);
 }