Skip to content

Instantly share code, notes, and snippets.

@yas19sin
Forked from unity3dcollege/TerrainDetector.cs
Created June 24, 2019 00:02
Show Gist options
  • Select an option

  • Save yas19sin/5ba315736ba6f65d6a8b2b3db60127fc to your computer and use it in GitHub Desktop.

Select an option

Save yas19sin/5ba315736ba6f65d6a8b2b3db60127fc to your computer and use it in GitHub Desktop.

Revisions

  1. @unity3dcollege unity3dcollege created this gist Oct 18, 2017.
    49 changes: 49 additions & 0 deletions TerrainDetector.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    using UnityEngine;

    public class TerrainDetector
    {
    private TerrainData terrainData;
    private int alphamapWidth;
    private int alphamapHeight;
    private float[,,] splatmapData;
    private int numTextures;

    public TerrainDetector()
    {
    terrainData = Terrain.activeTerrain.terrainData;
    alphamapWidth = terrainData.alphamapWidth;
    alphamapHeight = terrainData.alphamapHeight;

    splatmapData = terrainData.GetAlphamaps(0, 0, alphamapWidth, alphamapHeight);
    numTextures = splatmapData.Length / (alphamapWidth * alphamapHeight);
    }

    private Vector3 ConvertToSplatMapCoordinate(Vector3 worldPosition)
    {
    Vector3 splatPosition = new Vector3();
    Terrain ter = Terrain.activeTerrain;
    Vector3 terPosition = ter.transform.position;
    splatPosition.x = ((worldPosition.x - terPosition.x) / ter.terrainData.size.x) * ter.terrainData.alphamapWidth;
    splatPosition.z = ((worldPosition.z - terPosition.z) / ter.terrainData.size.z) * ter.terrainData.alphamapHeight;
    return splatPosition;
    }

    public int GetActiveTerrainTextureIdx(Vector3 position)
    {
    Vector3 terrainCord = ConvertToSplatMapCoordinate(position);
    int activeTerrainIndex = 0;
    float largestOpacity = 0f;

    for (int i = 0; i < numTextures; i++)
    {
    if (largestOpacity < splatmapData[(int)terrainCord.z, (int)terrainCord.x, i])
    {
    activeTerrainIndex = i;
    largestOpacity = splatmapData[(int)terrainCord.z, (int)terrainCord.x, i];
    }
    }

    return activeTerrainIndex;
    }

    }