Advertisement
Guest User

SkidmarkRenderer

a guest
Aug 11th, 2014
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.77 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. public class SkidMarkRenderer : MonoBehaviour {
  6.  
  7.     public Color color = Color.white;
  8.     public float line_width = 3.5f;
  9.     private List<SkidMark> skidmarks = new List<SkidMark>();
  10.     public MeshFilter meshfilter;
  11.     //private Mesh mesh;
  12.     private int id = -1;
  13.     private bool redraw_mesh = false;
  14.     public int maxSkids = 40;
  15.  
  16.     public class SkidMark {
  17.  
  18.         public List<Vector3> points = new List<Vector3>();
  19.         public int id;
  20.  
  21.         public SkidMark (int id) {
  22.             this.id = id;
  23.         }
  24.     }
  25.  
  26.     public void AddPoint(Vector3 p, int skid_id) {
  27.         SkidMark s = skidmarks.Find(e => e.id == skid_id);
  28.         s.points.Add(p);
  29.         redraw_mesh = true;
  30.     }
  31.  
  32.     public int AddSkidMark() {
  33.         id++;
  34.         skidmarks.Add(new SkidMark(id));
  35.         //Debug.Log("ADD SKIDMARK!");
  36.         if (skidmarks.Count > maxSkids) skidmarks.RemoveAt(0);
  37.         return id;
  38.     }  
  39.  
  40.     void Update() {
  41.  
  42.         Gizmos.color = color;
  43.         Vector3 lastpoint = Vector3.zero;
  44.         bool first = true;
  45.  
  46.         /*foreach (SkidMark s in skidmarks) {
  47.             first = true;
  48.             foreach (Vector3 p in s.points) {
  49.                 if (!first) {
  50.                     Debug.DrawLine(lastpoint, p, color);
  51.                     Debug.Log("DRAWING!");
  52.                 }
  53.                 first = false;
  54.                 lastpoint = p;
  55.             }
  56.         }*/
  57.  
  58.         if (redraw_mesh) RedrawMesh();
  59.  
  60.         /*
  61.         //DRAW MESH!
  62.  
  63.         MeshFilter mf = GetComponent<MeshFilter>();
  64.         Mesh mesh = new Mesh();
  65.         mf.sharedMesh = mesh;
  66.  
  67.         mesh.Clear();
  68.  
  69.         List<Vector3> vertices = new List<Vector3>();
  70.         List<int> triangles = new List<int>();
  71.         List<Vector2> uvs = new List<Vector2>();
  72.        
  73.         float uvx = 0;
  74.  
  75.         for (int c = 0; c < points.Count; c++) {
  76.             Vector3 d;
  77.             Vector3 normal;
  78.             if (c > 0 && c < points.Count - 1) { d = points[c+1] - points[c-1]; }
  79.             else if (c == 0) { d = points[c+1] - points[points.Count-1]; }
  80.             else if (c == points.Count - 1) { d = points[0] - points[c-1]; }
  81.             normal = Vector3.Cross(Vector3.up, d).normalized;
  82.            
  83.             float distance;
  84.             if (c == points.Count-1) { distance = (points[0] - points[c]).magnitude; }
  85.             else { distance = (points[c+1] - points[c]).magnitude; }
  86.  
  87.             //Gizmos.color = new Color(1, 1, 0, 0.8f);
  88.             //Gizmos.DrawLine(points[c]-(normal*trackwidth), points[c]+(normal*trackwidth));
  89.             Gizmos.DrawSphere(points[c], 0.2f);
  90.  
  91.             vertices.Add(points[c]-(normal*trackwidth));
  92.             vertices.Add(points[c]+(normal*trackwidth));
  93.  
  94.             if (c < points.Count-1) {
  95.                 int[] t;
  96.                 t = new int[3] {0+c*2,2+c*2,1+c*2};
  97.                 triangles.AddRange(t);
  98.                 t = new int[3] {2+c*2,3+c*2,1+c*2};
  99.                 triangles.AddRange(t);
  100.             }
  101.  
  102.             uvs.Add(new Vector2(0,uvx/points.Count));
  103.             uvs.Add(new Vector3(1,uvx/points.Count));
  104.             uvx += distance;
  105.             //uvs.AddRange([new Vector2(0,0)])
  106.         }
  107.  
  108.         int[] t_close;
  109.         t_close = new int[3] {0+(points.Count-1)*2,0,1+(points.Count-1)*2};
  110.         triangles.AddRange(t_close);
  111.         t_close = new int[3] {0,1,1+(points.Count-1)*2};
  112.         triangles.AddRange(t_close);
  113.  
  114.         //Debug.Log(triangles.ToArray()[1]);
  115.  
  116.         mesh.vertices = vertices.ToArray();
  117.         mesh.triangles = triangles.ToArray();
  118.         mesh.uv = uvs.ToArray();
  119.  
  120.         mesh.RecalculateNormals();
  121.         mesh.RecalculateBounds();
  122.         mesh.Optimize(); */
  123.     }
  124.  
  125.     void RedrawMesh() {
  126.  
  127.         //DRAW MESH!
  128.         redraw_mesh = false;
  129.  
  130.         MeshFilter mf = GetComponent<MeshFilter>();
  131.         Mesh mesh = new Mesh();
  132.         mf.sharedMesh = mesh;
  133.  
  134.         mesh.Clear();
  135.  
  136.         List<Vector3> vertices = new List<Vector3>();
  137.         List<int> triangles = new List<int>();
  138.         List<Vector2> uvs = new List<Vector2>();
  139.        
  140.         float uvx = 0;
  141.         int pointcount = 0;
  142.  
  143.         foreach (SkidMark s in skidmarks) {
  144.             List<Vector3> points = s.points;
  145.  
  146.             if (points.Count > 1) {
  147.                 Debug.Log("drawing skidmark nr: "+s.id);
  148.                 for (int c = 0; c < points.Count; c++) {
  149.                     Vector3 d;
  150.                     Vector3 normal;
  151.                     if (c > 0 && c < points.Count - 1) { d = points[c+1] - points[c-1]; }
  152.                     else if (c == 0) { d = points[c+1] - points[0]; }
  153.                     else if (c == points.Count - 1) { d = points[c] - points[c-1]; }
  154.                     normal = Vector3.Cross(Vector3.up, d).normalized;
  155.                    
  156.                     float distance;
  157.                     if (c == points.Count-1) { distance = (points[0] - points[c]).magnitude; }
  158.                     else { distance = (points[c+1] - points[c]).magnitude; }
  159.  
  160.                     //Gizmos.color = new Color(1, 1, 0, 0.8f);
  161.                     //Gizmos.DrawLine(points[c]-(normal*trackwidth), points[c]+(normal*trackwidth));
  162.                     //Gizmos.DrawSphere(points[c], 0.2f);
  163.  
  164.                     vertices.Add(points[c]-(normal*line_width));
  165.                     vertices.Add(points[c]+(normal*line_width));
  166.  
  167.                     if (c < points.Count-1) {
  168.                         int[] t;
  169.                         t = new int[3] {pointcount+c*2,pointcount+2+c*2,pointcount+1+c*2};
  170.                         triangles.AddRange(t);
  171.                         t = new int[3] {pointcount+2+c*2,pointcount+3+c*2,pointcount+1+c*2};
  172.                         triangles.AddRange(t);
  173.                     }
  174.  
  175.                     uvs.Add(new Vector2(0,uvx/points.Count));
  176.                     uvs.Add(new Vector3(1,uvx/points.Count));
  177.                     uvx += distance;
  178.  
  179.                     //uvs.AddRange([new Vector2(0,0)])
  180.                 }
  181.                 pointcount += (points.Count-1) * 2 + 2;
  182.             }
  183.         }
  184.         /*int[] t_close;
  185.         t_close = new int[3] {0+(points.Count-1)*2,0,1+(points.Count-1)*2};
  186.         triangles.AddRange(t_close);
  187.         t_close = new int[3] {0,1,1+(points.Count-1)*2};
  188.         triangles.AddRange(t_close);*/
  189.  
  190.         //Debug.Log(triangles.ToArray()[1]);
  191.  
  192.         mesh.vertices = vertices.ToArray();
  193.         mesh.triangles = triangles.ToArray();
  194.         mesh.uv = uvs.ToArray();
  195.  
  196.         mesh.RecalculateNormals();
  197.         mesh.RecalculateBounds();
  198.         mesh.Optimize();
  199.     }
  200.  
  201.     Vector3 CalculateBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
  202.  
  203.         {
  204.  
  205.             float u = 1.0f - t;
  206.  
  207.             float tt = t * t;
  208.  
  209.             float uu = u * u;
  210.  
  211.             float uuu = uu * u;
  212.  
  213.             float ttt = tt * t;
  214.  
  215.          
  216.  
  217.             Vector3 p = uuu * p0; //first term
  218.  
  219.             p += 3 * uu * t * p1; //second term
  220.  
  221.             p += 3 * u * tt * p2; //third term
  222.  
  223.             p += ttt * p3; //fourth term
  224.  
  225.          
  226.  
  227.     return p;
  228.  
  229. }
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement