Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- public class CobblestoneFoundation : MonoBehaviour {
- int x;
- int y;
- Ray ray;
- RaycastHit hit;
- Transform cam;
- bool placed = false;
- bool updated = true;
- List<Vector3> vertices = new List<Vector3>();
- List<Vector2> UV = new List<Vector2>();
- List<int> triangles = new List<int>();
- List<Vector3> normals = new List<Vector3>();
- Mesh mesh;
- List<SideFace> SideFaces = new List<SideFace>();
- List<Vector3> side = new List<Vector3>();
- List<Vector3> bottom = new List<Vector3>();
- List<Vector3> top = new List<Vector3>();
- Vector2 _00 = new Vector2( 0f, 0f );
- Vector2 _10 = new Vector2( 1f, 0f );
- Vector2 _01 = new Vector2( 0f, 1f );
- Vector2 _11 = new Vector2( 1f, 1f );
- Vector2[] sideUv = new Vector2[]{new Vector2( 0f, 0f ), new Vector2( 1f, 0f ), new Vector2( 0f, 1f ), new Vector2( 1f, 1f )};
- List<Vector2> bottom2d = new List<Vector2>();
- float lenght = 1;
- GameObject design;
- // Use this for initialization
- void Start () {
- bottom2d.Add (new Vector2(-1,-1));
- bottom2d.Add (new Vector2(-1,1));
- bottom2d.Add (new Vector2(1,1));
- bottom2d.Add (new Vector2(1,-1));
- design = GameObject.FindGameObjectWithTag("design");
- cam = Camera.main.transform;
- mesh = new Mesh();
- }
- // Update is called once per frame
- void Update () {
- if (updated == true){
- updated = false;
- for (int i = 0; i <= bottom2d.Count - 1; i++){ // Generating faces
- Vector3[] sideVertices = new Vector3[]{ // Note: y axis in Vector2 will be z in Vector3 (3d extrusion)
- new Vector3(bottom2d[i].x, 0, bottom2d[i].y), // Note about indexing: [0] bottom [1] top
- new Vector3(bottom2d[i].x, lenght, bottom2d[i].y)
- };
- bottom.Add(sideVertices[0]);
- top.Add(sideVertices[1]);
- side.AddRange(sideVertices);
- }
- for (int i = 0; i <= side.Count - 1; i=i+2){ // Get side faces
- int[] sideTriangles = new int[6];
- if(i <= side.Count - 1 - 2){
- sideTriangles = new int[]{
- i, i+1, i+3,
- i, i+2, i+3
- };
- Vector3[] face = new Vector3[]{
- side[i], side[i+1], side[i+3], side[i+2]
- };
- SideFaces.Add (new SideFace(face));
- }else{
- sideTriangles = new int[]{
- i, i+1, 1,
- i, 0, 1
- };
- Vector3[] face = new Vector3[]{
- side[i], side[i+1], side[1], side[0]
- };
- SideFaces.Add (new SideFace(face));
- }
- }
- vertices = new List<Vector3>();
- List<Vector2> tempbottom = new List<Vector2>(); // Generating bottom triangles
- foreach (Vector3 bottomVertice in bottom) {
- vertices.Add(bottomVertice);
- normals.Add (Vector3.down);
- tempbottom.Add (new Vector2(bottomVertice.x, bottomVertice.z));
- UV.Add (_00);
- }
- Triangulator tr = new Triangulator(tempbottom.ToArray());
- int[] bottomTris = tr.Triangulate();
- bottomTris = bottomTris.Reverse().ToArray();
- triangles.AddRange (bottomTris.ToList());
- /* int topverticeCount = vertices.Count;
- List<Vector2> temptop = new List<Vector2>(); // Generating top triangles
- foreach (Vector3 topVertice in top) {
- vertices.Add(topVertice);
- temptop.Add (new Vector2(topVertice.x, topVertice.z));
- }
- tr = new Triangulator(temptop.ToArray());
- int[] topTris = tr.Triangulate();
- for (int i = 0; i <= topTris.Count() - 1; i++) {
- topTris[i] = topTris[i] + topverticeCount;
- }
- Vector3[] vertsArr = vertices.ToArray();
- triangles.AddRange(topTris.ToList());*/
- foreach (SideFace SideFace in SideFaces) {
- int sideverticeCount = vertices.Count;
- int[] faceTris = new int[]{ // SideFace = vertices[i], vertices[i+1], vertices[i+3], vertices[i+2]
- 3, 1, 0,
- 3, 2, 1
- };
- foreach (Vector3 current in SideFace.vertices) {
- vertices.Add(current);
- }
- UV.Add (new Vector2(0, 0));
- UV.Add (new Vector2(0, 1));
- UV.Add (new Vector2(1, 0));
- UV.Add (new Vector2(1, 1));
- foreach (int indice in faceTris){
- triangles.Add (indice + sideverticeCount);
- }
- }
- mesh.vertices = vertices.ToArray();
- mesh.triangles = triangles.ToArray();
- mesh.uv = UV.ToArray();
- mesh.RecalculateBounds();
- mesh.Optimize();
- mesh.RecalculateNormals();
- GetComponent<MeshFilter>().mesh = mesh;
- GetComponent<MeshCollider>().sharedMesh = mesh;
- }
- x = Screen.width / 2;
- y = Screen.height / 2;
- ray = Camera.main.ScreenPointToRay(new Vector3(x, y));
- if (Physics.Raycast(ray, out hit) && placed == false) {
- // this.transform.position = hit.point;
- }
- }
- }
- public class SideFace {
- public Vector3[] vertices;
- public SideFace (Vector3[] Vertices) {
- vertices = Vertices;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement