示例#1
0
    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;
 }
示例#3
0
    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);
    }
示例#4
0
    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;
 }