Advertisement
01010001x0120

Untitled

Jan 24th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.21 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Security.Permissions;
  5. using src.lib;
  6. using UnityEngine;
  7. using Random = UnityEngine.Random;
  8.  
  9. public class TestPlush : MonoBehaviour
  10. {
  11.     private Mesh mesh;
  12.     private List<Vector2> _uvs;
  13.     private List<Vector3> _vertices;
  14.     private List<Vector3> _normals;
  15.     private List<int> _triangles;
  16.  
  17.  
  18.     private Transform _wayTrans;
  19.     private Transform _castTrans;
  20.  
  21.     [SerializeField] private bool debugDraw;
  22.  
  23.     [Space(10)] public float step;
  24.     public int steps;
  25.     public float slip;
  26.     public float width;
  27.     public float padding;
  28.     public int res;
  29.  
  30.  
  31.     private float[] _cachedRandom = new float[1000];
  32.  
  33.     private int currentRandomIndex = 0;
  34.     [Space(20)] [SerializeField] private int stepsPerAngle;
  35.     [SerializeField] private float maxCastAngle = 60f;
  36.     [SerializeField] private float castAngleStep = 10f;
  37.  
  38.  
  39.     // Use this for initialization
  40.     void Start()
  41.     {
  42.         mesh = new Mesh();
  43.         GetComponent<MeshFilter>().mesh = mesh;
  44.         _uvs = new List<Vector2>();
  45.         _vertices = new List<Vector3>();
  46.         _normals = new List<Vector3>();
  47.         _triangles = new List<int>();
  48.  
  49.         _wayTrans = new GameObject().transform;
  50.         _castTrans = new GameObject().transform;
  51.  
  52.         for (int i = 0; i < _cachedRandom.Length; i++)
  53.         {
  54.             _cachedRandom[i] = Random.value;
  55.         }
  56.     }
  57.  
  58.     // Update is called once per frame
  59.     public void ReCalculate()
  60.     {
  61.         _wayTrans.position = transform.position;
  62.         _wayTrans.rotation = Quaternion.LookRotation(transform.up, transform.forward);
  63.  
  64.         Ray ray = new Ray(transform.position, transform.forward);
  65.         RaycastHit hit = new RaycastHit();
  66.         Physics.Raycast(ray, out hit);
  67.  
  68.         if (hit.collider != null)
  69.         {
  70.             LineDrawer.DrawLine(transform.position, hit.point, Color.green, false);
  71.         }
  72.  
  73.         Color color = Color.green;
  74.  
  75.         Vector3 prevSegmentEnd = transform.position;
  76.  
  77.  
  78.         _vertices.Clear();
  79.         _triangles.Clear();
  80.         mesh.SetTriangles(_triangles, 0);
  81.  
  82.  
  83.         float grav = 2f;
  84.  
  85.         _oldPoints.Clear();
  86.         _newPoints.Clear();
  87.  
  88.         for (int i = 0; i < res; i++)
  89.         {
  90.             float angle = (float) i / res * 6.28f;
  91.  
  92.             Vector3 pos = new Vector3(Mathf.Cos(angle) * width, Mathf.Sin(angle) * width, 0);
  93.             pos = transform.TransformPoint(pos);
  94.             _oldPoints.Add(pos);
  95.         }
  96.  
  97.         RefreshRandom();
  98.  
  99.         for (int i = 0; i < steps; i++)
  100.         {
  101.             Vector3 prevHitPoint = hit.point;
  102.             Vector3 prevNormal = hit.normal;
  103.  
  104.             int rayNum = 0;
  105.  
  106.  
  107.             float currentAngleD = 0f;
  108.  
  109.             _castTrans.position = _wayTrans.position;
  110.  
  111.             color = Color.white;
  112.  
  113.             Quaternion startRotation = Quaternion.LookRotation((_wayTrans.up + _wayTrans.forward) / 2, (_wayTrans.up - _wayTrans.forward) / 2);
  114.  
  115.             while (true)
  116.             {
  117.                 _castTrans.rotation = startRotation;
  118.  
  119.  
  120.                 if (rayNum > 0)
  121.                 {
  122.                     if ((rayNum - 1) % stepsPerAngle == 0)
  123.                     {
  124.                         color.r *= 0.8f;
  125.                         color.g *= 0.8f;
  126.                         color.b *= 0.8f;
  127.                         currentAngleD += castAngleStep;
  128.                         if (currentAngleD > maxCastAngle)
  129.                             break;
  130.                     }
  131.  
  132.                     float angle = (rayNum % (float) stepsPerAngle) / (float) stepsPerAngle * 6.28f;
  133.                     float sin = Mathf.Sin(angle);
  134.                     float cos = Mathf.Cos(angle);
  135.  
  136.  
  137.                     _castTrans.Rotate(new Vector3(sin * currentAngleD, cos * currentAngleD, 0), Space.Self);
  138.                 }
  139.  
  140.  
  141.                 float rayMaxLenght = 0.15f;
  142.  
  143.                 if (debugDraw)
  144.                     LineDrawer.DrawLine(_castTrans.position, _castTrans.position + _castTrans.forward * rayMaxLenght, rayNum == 0 ? Color.yellow : color);
  145.  
  146.                 Vector3 rayDirection = _castTrans.forward;
  147.  
  148.                 ray = new Ray(_wayTrans.position, rayDirection);
  149.  
  150.  
  151.                 Physics.Raycast(ray, out hit, 0.1f);
  152.  
  153.                 if (hit.collider != null)
  154.                 {
  155.                     if (debugDraw)
  156.                         LineDrawer.DrawLine(ray.origin, hit.point, Color.green);
  157.  
  158.                     Vector3 target = hit.point + hit.normal * slip;
  159.                     _wayTrans.rotation = Quaternion.LookRotation(target - _wayTrans.position, -hit.normal);
  160.                     _wayTrans.position = (target - _wayTrans.position) * step + target;
  161.  
  162.                     if (!debugDraw)
  163.                     {
  164.                         CreateTubeSegment(_wayTrans.position);
  165.                     }
  166.  
  167.                     break;
  168.                 }
  169.  
  170.                 rayNum++;
  171.             }
  172.         }
  173.  
  174.  
  175.         mesh.SetVertices(_vertices);
  176.         mesh.SetTriangles(_triangles, 0);
  177.         mesh.RecalculateNormals(60);
  178.         mesh.RecalculateTangents();
  179.     }
  180.  
  181.  
  182.     private List<Vector3> _oldPoints = new List<Vector3>();
  183.     private List<Vector3> _newPoints = new List<Vector3>();
  184.  
  185.     private void CreateTubeSegment(Vector3 segmentEnd)
  186.     {
  187.         Vector3 p1;
  188.         Vector3 p2;
  189.         Vector3 p3;
  190.         Vector3 p4;
  191.  
  192.  
  193.         for (int j = 0; j < res; j++)
  194.         {
  195.             float angle = (float) j / res * 6.28f;
  196.  
  197.             Vector3 pos = new Vector3(Mathf.Cos(angle) * width, Mathf.Sin(angle) * width, 0);
  198.             pos = _wayTrans.TransformPoint(pos) - _wayTrans.position + segmentEnd;
  199.             _newPoints.Add(pos);
  200.         }
  201.  
  202.         for (int j = 0; j < res; j++)
  203.         {
  204.             p1 = _oldPoints[j];
  205.             p2 = _newPoints[j];
  206.             if (j < res - 1)
  207.             {
  208.                 p3 = _oldPoints[j + 1];
  209.                 p4 = _newPoints[j + 1];
  210.             }
  211.             else
  212.             {
  213.                 p3 = _oldPoints[0];
  214.                 p4 = _newPoints[0];
  215.             }
  216.  
  217.             CreateQuad(p1, p2, p3, p4);
  218.         }
  219.  
  220.         List<Vector3> temp = _oldPoints;
  221.         _oldPoints = _newPoints;
  222.         _newPoints = temp;
  223.         _newPoints.Clear();
  224.     }
  225.  
  226.     private void CreateQuad(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4)
  227.     {
  228.         int start = _vertices.Count;
  229.  
  230.         _vertices.Add(transform.InverseTransformPoint(p1));
  231.         _vertices.Add(transform.InverseTransformPoint(p2));
  232.         _vertices.Add(transform.InverseTransformPoint(p3));
  233.         _vertices.Add(transform.InverseTransformPoint(p4));
  234.  
  235.         _triangles.Add(start);
  236.         _triangles.Add(start + 2);
  237.         _triangles.Add(start + 1);
  238.         _triangles.Add(start + 2);
  239.         _triangles.Add(start + 3);
  240.         _triangles.Add(start + 1);
  241.     }
  242.  
  243.     public Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
  244.     {
  245.         return Quaternion.Euler(angles) * (point - pivot) + pivot;
  246.     }
  247.  
  248.     private float GetNextRandom()
  249.     {
  250.         return _cachedRandom[currentRandomIndex++];
  251.     }
  252.  
  253.     private void RefreshRandom()
  254.     {
  255.         currentRandomIndex = 0;
  256.     }
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement