Advertisement
Guest User

CobblestoneFoundation.cs

a guest
Aug 1st, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.64 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5.  
  6. public class CobblestoneFoundation : MonoBehaviour {
  7.  
  8.     int x;
  9.     int y;
  10.     Ray ray;
  11.     RaycastHit hit;
  12.     Transform cam;
  13.     bool placed = false;
  14.     bool updated = true;
  15.     List<Vector3> vertices = new List<Vector3>();
  16.     List<Vector2> UV = new List<Vector2>();
  17.     List<int> triangles = new List<int>();
  18.     List<Vector3> normals = new List<Vector3>();
  19.     Mesh mesh;
  20.     List<SideFace> SideFaces = new List<SideFace>();
  21.     List<Vector3> side = new List<Vector3>();
  22.     List<Vector3> bottom = new List<Vector3>();
  23.     List<Vector3> top = new List<Vector3>();
  24.     Vector2 _00 = new Vector2( 0f, 0f );
  25.     Vector2 _10 = new Vector2( 1f, 0f );
  26.     Vector2 _01 = new Vector2( 0f, 1f );
  27.     Vector2 _11 = new Vector2( 1f, 1f );
  28.     Vector2[] sideUv = new Vector2[]{new Vector2( 0f, 0f ), new Vector2( 1f, 0f ), new Vector2( 0f, 1f ), new Vector2( 1f, 1f )};
  29.     List<Vector2> bottom2d = new List<Vector2>();
  30.     float lenght = 1;
  31.     GameObject design;
  32.  
  33.  
  34.     // Use this for initialization
  35.     void Start () {
  36.         bottom2d.Add (new Vector2(-1,-1));
  37.         bottom2d.Add (new Vector2(-1,1));
  38.         bottom2d.Add (new Vector2(1,1));
  39.         bottom2d.Add (new Vector2(1,-1));
  40.         design = GameObject.FindGameObjectWithTag("design");
  41.         cam = Camera.main.transform;
  42.         mesh = new Mesh();
  43.     }
  44.    
  45.     // Update is called once per frame
  46.     void Update () {
  47.         if (updated == true){
  48.             updated = false;
  49.             for (int i = 0; i <= bottom2d.Count - 1; i++){  // Generating faces
  50.                 Vector3[] sideVertices = new Vector3[]{ // Note: y axis in Vector2 will be z in Vector3 (3d extrusion)
  51.                     new Vector3(bottom2d[i].x, 0, bottom2d[i].y),   // Note about indexing: [0] bottom [1] top
  52.                     new Vector3(bottom2d[i].x, lenght, bottom2d[i].y)
  53.                 };
  54.                 bottom.Add(sideVertices[0]);
  55.                 top.Add(sideVertices[1]);
  56.                 side.AddRange(sideVertices);
  57.             }
  58.             for (int i = 0; i <= side.Count - 1; i=i+2){ // Get side faces
  59.                 int[] sideTriangles = new int[6];
  60.                 if(i <= side.Count - 1 - 2){
  61.                     sideTriangles = new int[]{ 
  62.                         i, i+1, i+3,
  63.                         i, i+2, i+3
  64.                     };
  65.                     Vector3[] face = new Vector3[]{
  66.                         side[i], side[i+1], side[i+3], side[i+2]
  67.                     };
  68.                     SideFaces.Add (new SideFace(face));
  69.                 }else{
  70.                     sideTriangles = new int[]{ 
  71.                         i, i+1, 1,
  72.                         i, 0, 1
  73.                     };
  74.                     Vector3[] face = new Vector3[]{
  75.                         side[i], side[i+1], side[1], side[0]
  76.                     };
  77.                     SideFaces.Add (new SideFace(face));
  78.                 }
  79.             }
  80.  
  81.             vertices = new List<Vector3>();
  82.             List<Vector2> tempbottom = new List<Vector2>(); // Generating bottom triangles
  83.             foreach (Vector3 bottomVertice in bottom) {
  84.                 vertices.Add(bottomVertice);
  85.                 normals.Add (Vector3.down);
  86.                 tempbottom.Add (new Vector2(bottomVertice.x, bottomVertice.z));
  87.                 UV.Add (_00);
  88.             }
  89.             Triangulator tr = new Triangulator(tempbottom.ToArray());
  90.             int[] bottomTris = tr.Triangulate();
  91.             bottomTris = bottomTris.Reverse().ToArray();
  92.             triangles.AddRange (bottomTris.ToList());
  93.  
  94.         /*  int topverticeCount = vertices.Count;
  95.             List<Vector2> temptop = new List<Vector2>(); // Generating top triangles
  96.             foreach (Vector3 topVertice in top) {
  97.                 vertices.Add(topVertice);
  98.                 temptop.Add (new Vector2(topVertice.x, topVertice.z));
  99.             }
  100.             tr = new Triangulator(temptop.ToArray());
  101.             int[] topTris = tr.Triangulate();
  102.             for (int i = 0; i <= topTris.Count() - 1; i++) {
  103.                 topTris[i] = topTris[i] + topverticeCount;
  104.             }
  105.             Vector3[] vertsArr = vertices.ToArray();
  106.             triangles.AddRange(topTris.ToList());*/
  107.  
  108.  
  109.             foreach (SideFace SideFace in SideFaces) {
  110.                 int sideverticeCount = vertices.Count;
  111.                 int[] faceTris = new int[]{ // SideFace = vertices[i], vertices[i+1], vertices[i+3], vertices[i+2]
  112.                     3, 1, 0,
  113.                     3, 2, 1
  114.                 };
  115.                 foreach (Vector3 current in SideFace.vertices) {
  116.                     vertices.Add(current);
  117.                 }
  118.                 UV.Add (new Vector2(0, 0));
  119.                 UV.Add (new Vector2(0, 1));
  120.                 UV.Add (new Vector2(1, 0));
  121.                 UV.Add (new Vector2(1, 1));
  122.                 foreach (int indice in faceTris){
  123.                     triangles.Add (indice + sideverticeCount); 
  124.                 }
  125.             }
  126.             mesh.vertices = vertices.ToArray();
  127.             mesh.triangles = triangles.ToArray();
  128.             mesh.uv = UV.ToArray();
  129.             mesh.RecalculateBounds();
  130.             mesh.Optimize();
  131.             mesh.RecalculateNormals();
  132.             GetComponent<MeshFilter>().mesh = mesh;
  133.             GetComponent<MeshCollider>().sharedMesh = mesh;
  134.         }
  135.         x = Screen.width / 2;
  136.         y = Screen.height / 2;
  137.         ray = Camera.main.ScreenPointToRay(new Vector3(x, y));
  138.         if (Physics.Raycast(ray, out hit) && placed == false) {
  139.         //  this.transform.position = hit.point;
  140.         }
  141.  
  142.     }
  143. }
  144. public class SideFace {
  145.     public Vector3[] vertices;
  146.     public SideFace (Vector3[] Vertices) {
  147.         vertices = Vertices;
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement