private SplatmapUserData GetTerrainLayerUserData(ITerrainInfo context, TerrainLayer terrainLayer = null, bool addLayerIfDoesntExist = false) { // look up existing user data, if any SplatmapUserData userData = (context.userData as SplatmapUserData); if (userData != null) { // check if it is appropriate, return if so if ((terrainLayer == null) || (terrainLayer == userData.terrainLayer)) { return(userData); } else { userData = null; } } // otherwise let's build it if (userData == null) { int tileLayerIndex = -1; if (terrainLayer != null) { // look for the layer on the terrain tileLayerIndex = TerrainPaintUtility.FindTerrainLayerIndex(context.terrain, terrainLayer); if ((tileLayerIndex == -1) && (addLayerIfDoesntExist)) { onTerrainTileBeforePaint?.Invoke(context, ToolAction.AddTerrainLayer, "Adding Terrain Layer"); tileLayerIndex = TerrainPaintUtility.AddTerrainLayer(context.terrain, terrainLayer); } } // if we found the layer, build user data if (tileLayerIndex != -1) { userData = new SplatmapUserData(); userData.terrainLayer = terrainLayer; userData.terrainLayerIndex = tileLayerIndex; userData.mapIndex = tileLayerIndex >> 2; userData.channelIndex = tileLayerIndex & 0x3; } context.userData = userData; } return(userData); }
public void GatherAlphamap(TerrainLayer inputLayer, bool addLayerIfDoesntExist = true) { if (inputLayer == null) { return; } int terrainLayerIndex = TerrainPaintUtility.FindTerrainLayerIndex(originTerrain, inputLayer); if (terrainLayerIndex == -1 && addLayerIfDoesntExist) { terrainLayerIndex = TerrainPaintUtility.AddTerrainLayer(originTerrain, inputLayer); } RenderTexture.active = sourceRenderTexture; GL.Clear(false, true, new Color(0.0f, 0.0f, 0.0f, 0.0f)); GL.PushMatrix(); GL.LoadPixelMatrix(0, pixelRect.width, 0, pixelRect.height); Vector4[] layerMasks = { new Vector4(1, 0, 0, 0), new Vector4(0, 1, 0, 0), new Vector4(0, 0, 1, 0), new Vector4(0, 0, 0, 1) }; Material copyTerrainLayerMaterial = TerrainPaintUtility.GetCopyTerrainLayerMaterial(); for (int i = 0; i < m_TerrainTiles.Count; i++) { TerrainTile terrainTile = m_TerrainTiles[i]; if (terrainTile.clippedLocalPixels.width == 0 || terrainTile.clippedLocalPixels.height == 0) { continue; } int tileLayerIndex = TerrainPaintUtility.FindTerrainLayerIndex(terrainTile.terrain, inputLayer); if (tileLayerIndex == -1) { if (!addLayerIfDoesntExist) { // setting these to zero will prevent them from being used later terrainTile.clippedLocalPixels.width = 0; terrainTile.clippedLocalPixels.height = 0; terrainTile.clippedPCPixels.width = 0; terrainTile.clippedPCPixels.height = 0; continue; } tileLayerIndex = TerrainPaintUtility.AddTerrainLayer(terrainTile.terrain, inputLayer); } terrainTile.mapIndex = tileLayerIndex >> 2; terrainTile.channelIndex = tileLayerIndex & 0x3; Texture sourceTexture = TerrainPaintUtility.GetTerrainAlphaMapChecked(terrainTile.terrain, terrainTile.mapIndex); if ((sourceTexture.width != targetTextureWidth) || (sourceTexture.height != targetTextureHeight)) { Debug.LogWarning("PaintContext alphamap operations must use the same resolution for all Terrains - mismatched Terrains are ignored. (" + sourceTexture.width + " x " + sourceTexture.height + ") != (" + targetTextureWidth + " x " + targetTextureHeight + ")", terrainTile.terrain); continue; } FilterMode oldFilterMode = sourceTexture.filterMode; sourceTexture.filterMode = FilterMode.Point; copyTerrainLayerMaterial.SetVector("_LayerMask", layerMasks[terrainTile.channelIndex]); copyTerrainLayerMaterial.SetTexture("_MainTex", sourceTexture); copyTerrainLayerMaterial.SetPass(0); TerrainPaintUtility.DrawQuad(terrainTile.clippedPCPixels, terrainTile.clippedLocalPixels, sourceTexture); sourceTexture.filterMode = oldFilterMode; } GL.PopMatrix(); RenderTexture.active = oldRenderTexture; }