using UnityEngine;
using System.Collections;
public class CreateMesh : MonoBehaviour {
public Color lineColor ;
private Vector3[] linesArray ;
private Material lineMaterial ;
private MeshRenderer meshRenderer;
private bool flag=false;
public int vctW=2;
public int vctH=2;
public bool XZorXY=false;
public Color SurfaceColor=Color.red;
public Texture tex;
private Vector3[] vert;
private int[] tri;
private Mesh mesh;
void Awake()
{
gameObject.AddComponent("MeshFilter");
mesh = GetComponent<MeshFilter>().mesh;
meshRenderer = gameObject.GetComponent<MeshRenderer>();
if(meshRenderer==false)
{
gameObject.AddComponent("MeshRenderer");
meshRenderer = gameObject.GetComponent<MeshRenderer>();
}
mesh.Clear();
//meshRenderer.material = new Material("Shader \"Lines/Background\" { Properties { _Color (\"Main Color\", Color) = (1,1,1,1) } SubShader { Pass {" + (ZWrite ? " ZWrite on " : " ZWrite off ") + (blend ? " Blend SrcAlpha OneMinusSrcAlpha" : " ") + (AWrite ? " Colormask RGBA " : " ") + "Lighting Off Offset 1, 1 Color[_Color] }}}");
lineMaterial = new Material("Shader \"Lines/Colored Blended\" { SubShader { Pass { Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Cull Front Fog { Mode Off } } } }");
lineMaterial.hideFlags = HideFlags.HideAndDontSave;
lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
int i=0;
int j=0;
//ОБЯЗАТЕЛЬНО создавать массивы а потом их присваивать ссылкам в объекте mesh, не создавать ссылку сразу на этот член
vert=new Vector3[this.vctW*this.vctH];
if(this.XZorXY==false)//В плоскости XY, Z - это высоты
{
for( i=0;i<this.vctH;i++)
{
for( j=0;j<this.vctW;j++)
{
this.vert[i*this.vctW+j].x=j;//print("x="+vert[i*this.vctX+j].x);
this.vert[i*this.vctW+j].y=i; //print("y="+vert[i*this.vctX+j].y);
this.vert[i*this.vctW+j].z=0;// print("z=0");
}
}
}else
{
//В плоскости XZ, Y высоты
for( i=0;i<this.vctH;i++)
{
for( j=0;j<this.vctW;j++)
{
this.vert[i*this.vctW+j].x=j;//print("x="+vert[i*this.vctX+j].x);
this.vert[i*this.vctW+j].y=0; //print("y="+vert[i*this.vctX+j].y);
this.vert[i*this.vctW+j].z=i;// print("z=0");
}
}
}
this.mesh.vertices=this.vert;
Vector2[] uvs = new Vector2[this.mesh.vertices.Length];
i = 0;
while (i < uvs.Length) {
if(this.XZorXY==false) uvs[i] = new Vector2 (this.mesh.vertices[i].x, this.mesh.vertices[i].y);
else uvs[i] =new Vector2 (this.mesh.vertices[i].x, this.mesh.vertices[i].z);
i++;
}
this.mesh.uv = uvs;
this.tri = new int[((this.vctH-1)*(this.vctW-1))*6];
j=0;
int k=0;
for( i=0;i<this.mesh.vertices.Length; i++)
{
if(i>=(this.mesh.vertices.Length-this.vctW-1)) break;//исключим верхние вертиксы крайние, что не образуют верхних треуг
if(k==(this.vctW-1)){ k=0; continue;}//исключим правые вертиксы
//обход треугольника по часовой - иначе нормали будут в др сторону, если конечно это не обратная сторона
this.tri [j++]=i; //print( i);
this. tri [j++]=(i+1)+this.vctW; //print( (i+1)+this.vctX);
this.tri [j++]=i+1; //print( i+1);
this.tri [j++]=i; //print( i);
this.tri [j++]=i+this.vctW; //print( i+this.vctX);
this.tri [j++]=(i+1)+this.vctW; //print((i+1)+this.vctX);
k++;
}
//составим последовательность обрабатываемых вершин, для рисования линий сетки
this.linesArray=new Vector3[this.tri.Length];
int kk=0;
for (i = 0; i < this.tri.Length / 3; i++)
{
this.linesArray[kk++] =this.vert[this.tri[i * 3]];
this.linesArray[kk++ ]=this.vert[this.tri[i * 3 + 1]];
this.linesArray[kk++]=this.vert[this.tri[i * 3 + 2]] ;
}
////////////////
this.mesh.triangles = this.tri;
this.mesh.RecalculateBounds();
this.mesh.RecalculateNormals();
renderer.material.color = this.SurfaceColor;
if( this.tex!=null) renderer.material.mainTexture = this.tex;
Shader shad=Shader.Find( "Diffuse" );
if(shad!=null) renderer.material.shader = shad;
//renderer.enabled = false;
}
public void UpdateData(float[,] mdata)
{
this.vert = this.mesh.vertices;
//Vector3[] normals = this.mesh.normals;
if(this.XZorXY==false)//В плоскости XY, Z - это высоты
{
for(int i=0;i<this.vctH;i++)
{
for(int j=0;j<this.vctW;j++)
{
this.vert[i*this.vctW+j].z= mdata[i,j];//0.01F*Mathf.Sin((i+j)*Time.time);
}
}
}else
{
//В плоскости XZ, Y высоты
for(int i=0;i<this.vctH;i++)
{
for(int j=0;j<this.vctW;j++)
{
this.vert[i*this.vctW+j].y=mdata[i,j];//0.01F*Mathf.Sin((i+j)*Time.time);
}
}
}
this.mesh.vertices=this.vert;
this.flag=true;
//составим последовательность обрабатываемых вершин, для рисования линий сетки
//this.linesArray=new Vector3[tri.Length];
int kk=0;
for (int i = 0; i < this.tri.Length / 3; i++)
{
this.linesArray[kk++] =this.vert[this.tri[i * 3]];
this.linesArray[kk++ ]=this.vert[this.tri[i * 3 + 1]];
this.linesArray[kk++]=this.vert[this.tri[i * 3 + 2]] ;
}
this.flag=false;
}
public void UpdateDataTest()
{
this.vert = this.mesh.vertices;
//Vector3[] normals = this.mesh.normals;
if(this.XZorXY==false)//В плоскости XY, Z - это высоты
{
for(int i=0;i<this.vctH;i++)
{
for(int j=0;j<this.vctW;j++)
{
this.vert[i*this.vctW+j].z+= 0.01F*Mathf.Sin((i+j)*Time.time);
}
}
}else
{
//В плоскости XZ, Y высоты
for(int i=0;i<this.vctH;i++)
{
for(int j=0;j<this.vctW;j++)
{
this.vert[i*this.vctW+j].y+=0.01F*Mathf.Sin((i+j)*Time.time);
}
}
}
this.mesh.vertices=this.vert;
this.flag=true;
//составим последовательность обрабатываемых вершин, для рисования линий сетки
//this.linesArray=new Vector3[tri.Length];
int kk=0;
for (int i = 0; i < this.tri.Length / 3; i++)
{
this.linesArray[kk++] =this.vert[this.tri[i * 3]];
this.linesArray[kk++ ]=this.vert[this.tri[i * 3 + 1]];
this.linesArray[kk++]=this.vert[this.tri[i * 3 + 2]] ;
}
this.flag=false;
}
void Start()
{
//renderer.enabled = false;
}
void Update()
{
this.UpdateDataTest();
}
void OnRenderObject()
{
if(this.flag==true) return;
this.meshRenderer.material.color = this.SurfaceColor;
this.lineMaterial.SetPass(0);
GL.PushMatrix();
GL.MultMatrix(transform.localToWorldMatrix);
GL.Begin(GL.LINES);
GL.Color(this.lineColor);
for (int i = 0; i < this.linesArray.Length / 3; i++)
{
GL.Vertex(this.linesArray[i * 3]);
GL.Vertex(this.linesArray[i * 3 + 1]);
GL.Vertex(this.linesArray[i * 3 + 1]);
GL.Vertex(this.linesArray[i * 3 + 2]);
GL.Vertex(this.linesArray[i * 3 + 2]);
GL.Vertex(this.linesArray[i * 3]);
}
GL.End();
GL.PopMatrix();
}
}