Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class SkidMarkRenderer : MonoBehaviour {
- public Color color = Color.white;
- public float line_width = 3.5f;
- private List<SkidMark> skidmarks = new List<SkidMark>();
- public MeshFilter meshfilter;
- //private Mesh mesh;
- private int id = -1;
- private bool redraw_mesh = false;
- public int maxSkids = 40;
- public class SkidMark {
- public List<Vector3> points = new List<Vector3>();
- public int id;
- public SkidMark (int id) {
- this.id = id;
- }
- }
- public void AddPoint(Vector3 p, int skid_id) {
- SkidMark s = skidmarks.Find(e => e.id == skid_id);
- s.points.Add(p);
- redraw_mesh = true;
- }
- public int AddSkidMark() {
- id++;
- skidmarks.Add(new SkidMark(id));
- //Debug.Log("ADD SKIDMARK!");
- if (skidmarks.Count > maxSkids) skidmarks.RemoveAt(0);
- return id;
- }
- void Update() {
- Gizmos.color = color;
- Vector3 lastpoint = Vector3.zero;
- bool first = true;
- /*foreach (SkidMark s in skidmarks) {
- first = true;
- foreach (Vector3 p in s.points) {
- if (!first) {
- Debug.DrawLine(lastpoint, p, color);
- Debug.Log("DRAWING!");
- }
- first = false;
- lastpoint = p;
- }
- }*/
- if (redraw_mesh) RedrawMesh();
- /*
- //DRAW MESH!
- MeshFilter mf = GetComponent<MeshFilter>();
- Mesh mesh = new Mesh();
- mf.sharedMesh = mesh;
- mesh.Clear();
- List<Vector3> vertices = new List<Vector3>();
- List<int> triangles = new List<int>();
- List<Vector2> uvs = new List<Vector2>();
- float uvx = 0;
- for (int c = 0; c < points.Count; c++) {
- Vector3 d;
- Vector3 normal;
- if (c > 0 && c < points.Count - 1) { d = points[c+1] - points[c-1]; }
- else if (c == 0) { d = points[c+1] - points[points.Count-1]; }
- else if (c == points.Count - 1) { d = points[0] - points[c-1]; }
- normal = Vector3.Cross(Vector3.up, d).normalized;
- float distance;
- if (c == points.Count-1) { distance = (points[0] - points[c]).magnitude; }
- else { distance = (points[c+1] - points[c]).magnitude; }
- //Gizmos.color = new Color(1, 1, 0, 0.8f);
- //Gizmos.DrawLine(points[c]-(normal*trackwidth), points[c]+(normal*trackwidth));
- Gizmos.DrawSphere(points[c], 0.2f);
- vertices.Add(points[c]-(normal*trackwidth));
- vertices.Add(points[c]+(normal*trackwidth));
- if (c < points.Count-1) {
- int[] t;
- t = new int[3] {0+c*2,2+c*2,1+c*2};
- triangles.AddRange(t);
- t = new int[3] {2+c*2,3+c*2,1+c*2};
- triangles.AddRange(t);
- }
- uvs.Add(new Vector2(0,uvx/points.Count));
- uvs.Add(new Vector3(1,uvx/points.Count));
- uvx += distance;
- //uvs.AddRange([new Vector2(0,0)])
- }
- int[] t_close;
- t_close = new int[3] {0+(points.Count-1)*2,0,1+(points.Count-1)*2};
- triangles.AddRange(t_close);
- t_close = new int[3] {0,1,1+(points.Count-1)*2};
- triangles.AddRange(t_close);
- //Debug.Log(triangles.ToArray()[1]);
- mesh.vertices = vertices.ToArray();
- mesh.triangles = triangles.ToArray();
- mesh.uv = uvs.ToArray();
- mesh.RecalculateNormals();
- mesh.RecalculateBounds();
- mesh.Optimize(); */
- }
- void RedrawMesh() {
- //DRAW MESH!
- redraw_mesh = false;
- MeshFilter mf = GetComponent<MeshFilter>();
- Mesh mesh = new Mesh();
- mf.sharedMesh = mesh;
- mesh.Clear();
- List<Vector3> vertices = new List<Vector3>();
- List<int> triangles = new List<int>();
- List<Vector2> uvs = new List<Vector2>();
- float uvx = 0;
- int pointcount = 0;
- foreach (SkidMark s in skidmarks) {
- List<Vector3> points = s.points;
- if (points.Count > 1) {
- Debug.Log("drawing skidmark nr: "+s.id);
- for (int c = 0; c < points.Count; c++) {
- Vector3 d;
- Vector3 normal;
- if (c > 0 && c < points.Count - 1) { d = points[c+1] - points[c-1]; }
- else if (c == 0) { d = points[c+1] - points[0]; }
- else if (c == points.Count - 1) { d = points[c] - points[c-1]; }
- normal = Vector3.Cross(Vector3.up, d).normalized;
- float distance;
- if (c == points.Count-1) { distance = (points[0] - points[c]).magnitude; }
- else { distance = (points[c+1] - points[c]).magnitude; }
- //Gizmos.color = new Color(1, 1, 0, 0.8f);
- //Gizmos.DrawLine(points[c]-(normal*trackwidth), points[c]+(normal*trackwidth));
- //Gizmos.DrawSphere(points[c], 0.2f);
- vertices.Add(points[c]-(normal*line_width));
- vertices.Add(points[c]+(normal*line_width));
- if (c < points.Count-1) {
- int[] t;
- t = new int[3] {pointcount+c*2,pointcount+2+c*2,pointcount+1+c*2};
- triangles.AddRange(t);
- t = new int[3] {pointcount+2+c*2,pointcount+3+c*2,pointcount+1+c*2};
- triangles.AddRange(t);
- }
- uvs.Add(new Vector2(0,uvx/points.Count));
- uvs.Add(new Vector3(1,uvx/points.Count));
- uvx += distance;
- //uvs.AddRange([new Vector2(0,0)])
- }
- pointcount += (points.Count-1) * 2 + 2;
- }
- }
- /*int[] t_close;
- t_close = new int[3] {0+(points.Count-1)*2,0,1+(points.Count-1)*2};
- triangles.AddRange(t_close);
- t_close = new int[3] {0,1,1+(points.Count-1)*2};
- triangles.AddRange(t_close);*/
- //Debug.Log(triangles.ToArray()[1]);
- mesh.vertices = vertices.ToArray();
- mesh.triangles = triangles.ToArray();
- mesh.uv = uvs.ToArray();
- mesh.RecalculateNormals();
- mesh.RecalculateBounds();
- mesh.Optimize();
- }
- Vector3 CalculateBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
- {
- float u = 1.0f - t;
- float tt = t * t;
- float uu = u * u;
- float uuu = uu * u;
- float ttt = tt * t;
- Vector3 p = uuu * p0; //first term
- p += 3 * uu * t * p1; //second term
- p += 3 * u * tt * p2; //third term
- p += ttt * p3; //fourth term
- return p;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement