void GenerateEditorFragment(TerrainFragment fragment, LodInfos lodInfo) { //in editor stuff GameObject fragmentObj = new GameObject(); fragment.gameObject = fragmentObj; fragment.BuildMesh(); fragmentObj.name = "Fragment lod " + lodInfo.lodLevel + " center " + lodInfo.center; MeshRenderer meshRenderer = fragmentObj.AddComponent <MeshRenderer>(); if (material == null) { meshRenderer.sharedMaterial = new Material(Shader.Find("Standard")); } else { meshRenderer.sharedMaterial = material; } fragmentObj.transform.parent = transform; MeshFilter meshFilter = fragmentObj.AddComponent <MeshFilter>(); meshFilter.sharedMesh = fragment.mesh; }
public FragmentMeshData(Vector3[] vertices, int[] triangles, Vector3[] normals, LodInfos lodInfos) { this.vertices = vertices; this.triangles = triangles; this.lodInfos = lodInfos; this.normals = normals; }
TerrainFragment CreateNewFragment(LodInfos lodInfo, Vector3 localUp) { TerrainFragment fragment = new TerrainFragment(lodInfo, Vector3.up, this); if (EditorApplication.isPlaying) { ThreadPool.QueueUserWorkItem(a => FragmentDataThread(fragment, OnFragmentDataRecived)); } else { GenerateEditorFragment(fragment, lodInfo); } return(fragment); }
void GenerateFragements() { visibleLastframeFragments = visibleFragments; visibleFragments = new Dictionary <Vector2, TerrainFragment>(); int currentFragmentCoordX = Mathf.RoundToInt(viewerPosition.x / terrainSettings.fragmentSize); int currentFragmentCoordY = Mathf.RoundToInt(viewerPosition.z / terrainSettings.fragmentSize); // to get the right player plane for (int yOffset = -fragmentVisibleInViewDistance; yOffset <= fragmentVisibleInViewDistance; yOffset++) { for (int xOffset = -fragmentVisibleInViewDistance; xOffset <= fragmentVisibleInViewDistance; xOffset++) { Vector2 viewedFragmentCoord = new Vector2(currentFragmentCoordX + xOffset, currentFragmentCoordY + yOffset); TerrainFragment existingFragment; //need to check for lod level //AnimationCurve lodCurveInfo = new AnimationCurve(lodCurve.keys); LodInfos lodInfo = new LodInfos(viewedFragmentCoord, terrainSettings, lodThresholdsLevels, viewerPosition); if (visibleLastframeFragments.TryGetValue(viewedFragmentCoord, out existingFragment)) { if (existingFragment.lodInfos == lodInfo) { visibleFragments.Add(viewedFragmentCoord, existingFragment); visibleLastframeFragments.Remove(viewedFragmentCoord); } else { TerrainFragment fragment = CreateNewFragment(lodInfo, Vector3.up); visibleFragments.Add(viewedFragmentCoord, fragment); } } else { TerrainFragment fragment = CreateNewFragment(lodInfo, Vector3.up); visibleFragments.Add(viewedFragmentCoord, fragment); } } } }
public TerrainFragment(LodInfos lodInfos, Vector3 localUp, TerrainGenerator terrain) { this.lodInfos = lodInfos; this.localUp = localUp; this.terrain = terrain; }