Пример #1
0
 public LE_LogicTerrain(LE_ConfigTerrain p_confTerrain, LE_GUI3dTerrain p_GUI3dTerrain)
 {
     m_confT        = p_confTerrain;
     m_GUI3dTerrain = p_GUI3dTerrain;
     // init 3d UI
     m_GUI3dTerrain.TERRAIN_LAYER = p_confTerrain.TerrainLayer;
     if (p_confTerrain.BrushProjector != null)
     {
         m_GUI3dTerrain.BrushProjector = p_confTerrain.BrushProjector;
     }
     else
     {
         Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain.BrushProjector was not initialized! You need to set it in the inspector.");
     }
     if (p_confTerrain.Brushes.Length > 0)
     {
         m_GUI3dTerrain.BrushAlphaTexture = p_confTerrain.Brushes[0];
     }
     else
     {
         Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain.Brushes was not initialized! You need to set it in the inspector.");
     }
     // init further stuff
     CheckParameters();
     InitTerrainValues();
     // register to events
     LE_EventInterface.OnLoadedLevelInEditor += OnLoadedLevelInEditor;
     LE_GUIInterface.Instance.events.OnTerrainWidthChanged                += OnTerrainWidthChanged;
     LE_GUIInterface.Instance.events.OnTerrainLengthChanged               += OnTerrainLengthChanged;
     LE_GUIInterface.Instance.events.OnTerrainHeightChanged               += OnTerrainHeightChanged;
     LE_GUIInterface.Instance.events.OnTerrainBaseTextureChanged          += OnTerrainBaseTextureChanged;
     LE_GUIInterface.Instance.events.OnTerrainBrushChanged                += OnTerrainBrushChanged;
     LE_GUIInterface.Instance.events.OnTerrainPaintTextureChanged         += OnTerrainPaintTextureChanged;
     LE_GUIInterface.Instance.events.OnTerrainPaintTextureAdded           += OnTerrainPaintTextureAdded;
     LE_GUIInterface.Instance.events.OnTerrainEditBrushSizeChanged        += OnTerrainEditBrushSizeChanged;
     LE_GUIInterface.Instance.events.OnTerrainEditBrushAmountChanged      += OnTerrainEditBrushAmountChanged;
     LE_GUIInterface.Instance.events.OnTerrainEditBrushTargetValueChanged += OnTerrainEditBrushTargetValueChanged;
     LE_GUIInterface.Instance.events.OnTerrainEditDirectionChanged        += OnTerrainEditDirectionChanged;
     LE_GUIInterface.Instance.events.OnTerrainChangeHeightModeChanged     += OnTerrainChangeHeightModeChanged;
     LE_GUIInterface.Instance.events.OnTerrainIsDirectedSmoothChanged     += OnTerrainIsDirectedSmoothChanged;
     LE_GUIInterface.Instance.events.OnTerrainCreateBtn          += OnTerrainCreateBtn;
     LE_GUIInterface.Instance.events.OnTerrainEditModeBtn        += OnTerrainEditModeBtn;
     LE_GUIInterface.Instance.events.OnTerrainReadPaintHeightBtn += OnTerrainReadPaintHeightBtn;
 }
Пример #2
0
        /// <summary>
        /// Create a terrain from its terrain data. If the level has a terrain editor, then an existing terrain will be recycled.
        /// Apply defaults from terrain config and use a custom base texture.
        /// </summary>
        private static void CreateOrRecycleTerrain(TerrainData p_terrainData, int p_terrainLayer, LE_ConfigTerrain p_confT, int p_terrainBaseTextureIndex)
        {
            if (p_terrainData == null)
            {
                Debug.LogError("LE_LogicTerrain: CreateOrRecycleTerrain: passed terrain data was null!");
                return;
            }

            Vector3 size    = p_terrainData.size;
            float   maxSize = Mathf.Max(size.x, size.z);
            // set heightmap resolution depending on selected terrain size
            int heightmapResolution = p_confT.HeightmapResolutions[0];

            for (int i = 1; i < p_confT.HeightmapResolutionSizes.Length; i++)
            {
                if (maxSize >= p_confT.HeightmapResolutionSizes[i - 1])
                {
                    heightmapResolution = p_confT.HeightmapResolutions[i];
                }
                else
                {
                    break;
                }
            }
            p_terrainData.heightmapResolution = heightmapResolution;
            // set alphamap resolution depending on selected terrain size
            int alphamapResolution = p_confT.AlphamapResolutions[0];

            for (int i = 1; i < p_confT.AlphamapResolutionSizes.Length; i++)
            {
                if (maxSize >= p_confT.AlphamapResolutionSizes[i - 1])
                {
                    alphamapResolution = p_confT.AlphamapResolutions[i];
                }
                else
                {
                    break;
                }
            }
            p_terrainData.alphamapResolution = alphamapResolution;
            // restore size since it is changed when resolution is set
            p_terrainData.size = size;
            // set base texture in terrain data
            SplatPrototype[] baseTextureSet = new SplatPrototype[1];
            baseTextureSet[0]             = new SplatPrototype();
            baseTextureSet[0].texture     = p_confT.TerrainTextureConfig.TERRAIN_TEXTURES[p_terrainBaseTextureIndex];
            baseTextureSet[0].tileSize    = p_confT.TerrainTextureConfig.TERRAIN_TEXTURE_SIZES[p_terrainBaseTextureIndex];
            baseTextureSet[0].tileOffset  = p_confT.TerrainTextureConfig.TERRAIN_TEXTURE_OFFSETS[p_terrainBaseTextureIndex];
            p_terrainData.splatPrototypes = baseTextureSet;
            // create terrain GO
            GameObject terrainGO = CreateOrRecycleTerrain(p_terrainData, p_terrainLayer);

            // notify listeners that a terrain was created
            if (LE_EventInterface.OnTerrainCreated != null)
            {
                LE_EventInterface.OnTerrainCreated(terrainGO, new LE_TerrainCreatedEvent(terrainGO));
            }
        }