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; }
/// <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)); } }