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)); }
// тоже можно рассовать по методам 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; } }
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); } }
public int RegisterLOD(LODRegistrationTicket lticket) { registeredLODs.Add(lticket); return(registeredLODs.Count - 1); }