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:
Publicar un comentario