miércoles, 25 de febrero de 2015

Unity 3D 2.x Shaders/Scripts

Unity 3d 2.6.1
http://wiki.unity3d.com/index.php?title=Shaders#Unity_2.x_Shaders

Modificar el terreno:



//by estantaya para barbalipsis marzo 2015

private var tD : TerrainData;
private var tDX : int;
private var tDY : int;
private var tOriginalAlturas;

var mA : modificarArray;

var terreno : Terrain;

var explosionPrefab : Transform;
var imgExplosion : Texture2D;
//private var imgExplo : Texture2D;
var tamanyoExplosion : Vector3;

function Start () {
tD = terreno.terrainData;
//eD = eT.GetPixels (0, 0, eT.width, eT.height, 0);
tDX = tD.heightmapWidth;
tDY = tD.heightmapHeight;

//floats de 0 a 1 entre la altura del terrain minima y maxima
tOriginalAlturas = tD.GetHeights (0,0,tDX,tDY);

//imgExplo=Instantiate(imgExplosion);
/*
var cols = imgExplosion.GetPixels( 0, 0 , imgExplosion.width, imgExplosion.height, 0 );
imgExplo = new Texture2D (imgExplosion.width, imgExplosion.height);
imgExplo.SetPixels( cols, 0 );
imgExplo.Apply( false );
imgExplo.Resize (tamanyoExplosion.x*(tDX/tD.size.x),tamanyoExplosion.z*(tDY/tD.size.z));
imgExplo.Apply( false );
*/
}

function OnGUI () {
    //GUI.DrawTexture(Rect(0, Screen.height/2, imgExplo.width, imgExplo.height), imgExplo );
}

function OnApplicationQuit () {
    tD.SetHeights (0,0,tOriginalAlturas);
}

function destruirSuelo (worldPosition:Vector3) {
  
    //unidades
    var localCenter = terreno.transform.InverseTransformPoint(worldPosition);
  
    //verificar que la explosion sea dentro del terreno
    if (localCenter.x<0||localCenter.z<0||
    localCenter.x>tD.size.x||localCenter.z>tD.size.z||
    localCenter.y<0||localCenter.y>tD.size.y) return;
  
    var localAreaMin=localCenter-(tamanyoExplosion/2);
    var localAreaMax=localCenter+(tamanyoExplosion/2);
  
    //unidades a muestras de terreno
    var proporcionX=tDX/tD.size.x;
    var proporcionY=1/tD.size.y;
    var proporcionZ=tDY/tD.size.z;
  
    var iXPos : int=localAreaMin.x*proporcionX;
    var iZPos : int=localAreaMin.z*proporcionZ;
    var iXMax : int=tamanyoExplosion.x*proporcionX;
    var iZMax : int=tamanyoExplosion.z*proporcionZ;
    var iXCtr : int=iXMax/2;
    var iZCtr : int=iZMax/2;
  
    //evitar modificar mas alla del terreno
  
    if (iXPos<0) iXPos=0;
    if (iZPos<0) iZPos=0;
  
    if (tDX<iXMax+iXPos) iXMax=(iXPos+iXMax)-tDX;
    if (tDY<iZMax+iZPos) iZMax=(iZPos+iZMax)-tDY;
  
    //pixeles a muestras de terreno
    /*
    imgExplo.Resize (iXMax,iZMax);
    imgExplo.Apply( false );
    if (imgExplo.Resize (iXMax,iZMax)==false) {
        Debug.Log("imagen no se puede modificar");
        imgExplo.Apply( false );
        return;
    }*/
  
  
    //floats 0,0 - 1.0
    var tBufferAlturas = tD.GetHeights (iXPos,iZPos,iXMax,iZMax);
  
    Debug.Log ("Modificando Buffer de terreno, Terrain tamaño de muestra: x"+iXMax+", z"+iZMax);
  
    for (x = 0; x < iXMax; x++) {
        for (z = 0; z < iZMax; z++) {
           
            //tex de x256 y256
           
            var relX = iXMax/(iXCtr*2);
            var relZ = iZMax/(iZCtr*2);
            var imgX : int = x*((imgExplosion.width*relX)/iXMax);
            var imgY : int = z*((imgExplosion.height*relZ)/iZMax);
            if (tDX<iXPos+iXCtr*2) imgX += imgExplosion.width-(imgExplosion.width*relX);
            if (tDY<iZPos+iZCtr*2) imgY += imgExplosion.height-(imgExplosion.height*relZ);
           
            var altura=imgExplosion.GetPixel(imgX,imgY).grayscale;
            if (altura>0.5) {
                altura-=0.5;
                //tBufferAlturas[x,z]+=altura*(tamanyoExplosion.y*proporcionY);
                tBufferAlturas = mA.array2sumar(tBufferAlturas,x,z,(altura*tamanyoExplosion.y)*proporcionY);
            } else {
                altura=0.5-altura;
                tBufferAlturas = mA.array2restar(tBufferAlturas,x,z,(altura*tamanyoExplosion.y)*proporcionY);
                //tBufferAlturas[x,z]-=altura*(tamanyoExplosion.y*proporcionY);
            }
            if (x==iXCtr&&z==iZCtr) Debug.Log("Centro de la muestra modificada, altura diferencia: "+(altura*tamanyoExplosion.y)*proporcionY);
        }
    }
  
    tD.SetHeights (iXPos,iZPos,tBufferAlturas);
  
  
    Instantiate (explosionPrefab, transform.position, Quaternion.identity);
  
}

No hay comentarios: