Advertisement
Guest User

resize script

a guest
Sep 19th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 13.76 KB | None | 0 0
  1.  
  2. public class ResizeScript : MonoBehaviour
  3. {
  4.     private const int TOTAL_RAY_CAST_COUNT = 108;
  5.  
  6.     private const float ray_cast_offset = 0.01f;
  7.  
  8.     private const float ray_cast_min_diff_ratio = 0.1f;
  9.  
  10.     private const int MAX_VERTEX_COUNT = 30;
  11.  
  12.     private float grab_distance = 0.5f;
  13.  
  14.     public bool is_grabbing;
  15.  
  16.     private GameObject grabbed_object;
  17.  
  18.     private Vector3 grabbed_local_vector;
  19.  
  20.     public bool can_player_grab;
  21.  
  22.     public bool target_object_blocked;
  23.  
  24.     private static float mass_constant = 1f;
  25.  
  26.     private Vector3 largest_vec = new Vector3(3.40282347E+38f, 3.40282347E+38f, 3.40282347E+38f);
  27.  
  28.     public SoundEffectScript sound_effect_script;
  29.  
  30.     private float prevYRot;
  31.  
  32.     public Material DrawOutlineMat;
  33.  
  34.     private Color canSpinColor = new Color(0.3f, 0.3f, 1f, 1f);
  35.  
  36.     private Color canFollowColor = new Color(1f, 0.3f, 0.3f, 1f);
  37.  
  38.     private Color cannotDoAnythingColor = new Color(0f, 0f, 0f, 1f);
  39.  
  40.     private MouseLook mouseLook1;
  41.  
  42.     private MouseLook mouseLook2;
  43.  
  44.     private Vector3 grabbed_object_localPos;
  45.  
  46.     private Vector3 grabbed_local_forward_vec;
  47.  
  48.     private bool spunLastFrame;
  49.  
  50.     private float spinSpeed = 7f;
  51.  
  52.     private Vector3 prevGrabbedPosition;
  53.  
  54.     private float followVelocityRatio = 9f;
  55.  
  56.     private void Start()
  57.     {
  58.         Screen.showCursor = false;
  59.         Screen.showCursor = false;
  60.         Screen.lockCursor = true;
  61.         DrawOutlineMat = base.GetComponents<PostProcessCamera>()[1].mat;
  62.         MouseLook[] componentsInChildren = ((Component)base.transform.root).GetComponentsInChildren<MouseLook>();
  63.         mouseLook1 = componentsInChildren[0];
  64.         mouseLook2 = componentsInChildren[1];
  65.     }
  66.  
  67.     public void trigger_drop_object()
  68.     {
  69.         drop_object();
  70.     }
  71.  
  72.     private void Update()
  73.     {
  74.         can_player_grab = false;
  75.         target_object_blocked = false;
  76.         mouseLook1.skipUpdate = false;
  77.         mouseLook2.skipUpdate = false;
  78.         if (!is_grabbing)
  79.         {
  80.             grabbed_object = null;
  81.             GameObject x = check_for_grabbable_object();
  82.             if ((Object)x != (Object)null)
  83.             {
  84.                 grabbed_object = x;
  85.                 can_player_grab = true;
  86.             }
  87.         }
  88.         if (Input.GetButtonDown("Grab") && !is_grabbing)
  89.         {
  90.             spunLastFrame = false;
  91.             if (can_player_grab)
  92.             {
  93.                 grabbed_object.layer = LayerMask.NameToLayer("Grabbed");
  94.                 grabbed_object.GetComponent<DropTriggerScript>().setChildrenColliderLayers(LayerMask.NameToLayer("Grabbed"));
  95.                 Vector3 vector = grabbed_object.transform.position - base.transform.position;
  96.                 float num = grab_distance / vector.magnitude;
  97.                 Transform transform = grabbed_object.transform;
  98.                 transform.localScale *= num;
  99.                 grabbed_object.transform.position = base.transform.position + grab_distance * vector.normalized;
  100.                 is_grabbing = true;
  101.                 grabbed_local_vector = Quaternion.Inverse(base.transform.rotation) * (grab_distance * vector.normalized);
  102.                 grabbed_object.rigidbody.isKinematic = false;
  103.                 grabbed_object.rigidbody.velocity = Vector3.zero;
  104.                 grabbed_object.rigidbody.angularVelocity = Vector3.zero;
  105.                 grabbed_object.GetComponent<DropTriggerScript>().isGrabbed = true;
  106.                 grabbed_object.rigidbody.useGravity = false;
  107.                 grabbed_object.rigidbody.mass = newMass(grabbed_object.rigidbody.mass, num);
  108.                 sound_effect_script.play_pop_sound_grab();
  109.                 prevGrabbedPosition = grabbed_object.transform.position;
  110.                 if (grabbed_object.GetComponent<DropTriggerScript>().canSpin)
  111.                 {
  112.                     DrawOutlineMat.color = canSpinColor;
  113.                 }
  114.                 else if (grabbed_object.GetComponent<DropTriggerScript>().canFollow)
  115.                 {
  116.                     DrawOutlineMat.color = canFollowColor;
  117.                 }
  118.                 else
  119.                 {
  120.                     DrawOutlineMat.color = cannotDoAnythingColor;
  121.                 }
  122.                 return;
  123.             }
  124.             sound_effect_script.play_denied_sound();
  125.         }
  126.         else if (Input.GetButtonDown("Grab") && is_grabbing)
  127.         {
  128.             normal_recenter_object();
  129.             float num2 = get_resize_ratio(grabbed_object);
  130.             if (num2 == 3.40282347E+38f)
  131.             {
  132.                 sound_effect_script.play_denied_sound();
  133.             }
  134.             else
  135.             {
  136.                 Vector3 position = grabbed_object.transform.position;
  137.                 if ((Object)grabbed_object.transform.root != (Object)grabbed_object.transform)
  138.                 {
  139.                     grabbed_object.transform.parent = null;
  140.                 }
  141.                 num2 *= 0.99f;
  142.                 transform_object_by_ratio(grabbed_object, num2);
  143.                 grabbed_object.rigidbody.mass = newMass(grabbed_object.rigidbody.mass, num2);
  144.                 drop_object();
  145.                 setFollowVelocity(position, num2);
  146.                 sound_effect_script.play_pop_sound_put();
  147.             }
  148.             spunLastFrame = false;
  149.         }
  150.         else if (Input.GetButton("Release") && is_grabbing && grabbed_object.GetComponent<DropTriggerScript>().canSpin)
  151.         {
  152.             mouseLook1.skipUpdate = true;
  153.             mouseLook2.skipUpdate = true;
  154.             grabbed_object.transform.position = base.transform.position + base.transform.rotation * grabbed_local_vector;
  155.             grabbed_object.rigidbody.position = grabbed_object.transform.position;
  156.             grabbed_object.transform.RotateAroundLocal(base.transform.right, Input.GetAxis("Mouse Y") * Time.deltaTime * spinSpeed);
  157.             grabbed_object.transform.RotateAroundLocal(base.transform.up, (0f - Input.GetAxis("Mouse X")) * Time.deltaTime * spinSpeed);
  158.             Debug.Log("ASD");
  159.         }
  160.         else if (is_grabbing)
  161.         {
  162.             normal_recenter_object();
  163.         }
  164.         Vector3 eulerAngles = base.transform.rotation.eulerAngles;
  165.         prevYRot = eulerAngles.y;
  166.     }
  167.  
  168.     private void normal_recenter_object()
  169.     {
  170.         prevGrabbedPosition = grabbed_object.transform.position;
  171.         grabbed_object.transform.position = base.transform.position + base.transform.rotation * grabbed_local_vector;
  172.         grabbed_object.rigidbody.position = grabbed_object.transform.position;
  173.         Vector3 eulerAngles = base.transform.rotation.eulerAngles;
  174.         float y = eulerAngles.y;
  175.         grabbed_object.transform.RotateAround(Vector3.up, 0.0174532924f * (y - prevYRot));
  176.     }
  177.  
  178.     private void drop_object()
  179.     {
  180.         grabbed_object.layer = LayerMask.NameToLayer("CanGrab");
  181.         grabbed_object.GetComponent<DropTriggerScript>().returnChildrenColliderLayers();
  182.         is_grabbing = false;
  183.         grabbed_object.rigidbody.useGravity = true;
  184.         grabbed_object.rigidbody.isKinematic = false;
  185.         grabbed_object.rigidbody.velocity = Vector3.zero;
  186.         grabbed_object.rigidbody.angularVelocity = Vector3.zero;
  187.         if (grabbed_object.GetComponent<DropTriggerScript>().is_kinematic)
  188.         {
  189.             grabbed_object.rigidbody.isKinematic = true;
  190.         }
  191.         grabbed_object.rigidbody.WakeUp();
  192.         grabbed_object.GetComponent<DropTriggerScript>().isGrabbed = false;
  193.     }
  194.  
  195.     private GameObject check_for_grabbable_object()
  196.     {
  197.         RaycastHit raycastHit = default(RaycastHit);
  198.         int layerMask = 512;
  199.         if (Physics.Raycast(base.transform.position, base.transform.forward, out raycastHit, float.PositiveInfinity, layerMask))
  200.         {
  201.             GameObject gameObject = raycastHit.collider.gameObject;
  202.             if (!get_is_object_blocked(gameObject))
  203.             {
  204.                 return gameObject;
  205.             }
  206.             target_object_blocked = true;
  207.             return null;
  208.         }
  209.         return null;
  210.     }
  211.  
  212.     private bool get_is_object_blocked(GameObject obj)
  213.     {
  214.         Mesh sharedMesh = obj.GetComponent<MeshFilter>().sharedMesh;
  215.         int layer = obj.layer;
  216.         obj.layer = LayerMask.NameToLayer("tempTarget");
  217.         RaycastHit raycastHit = default(RaycastHit);
  218.         int num = 108 / (sharedMesh.triangles.Length / 3 + sharedMesh.vertexCount / 3 - 2);
  219.         Debug.Log("triangleCount:" + sharedMesh.triangles.GetLength(0) + "Verts:" + sharedMesh.vertexCount + "  Rays: " + num);
  220.         int layerMask = -1029;
  221.         int layerMask2 = 1 << obj.layer;
  222.         obj.GetComponent<DropTriggerScript>().setChildrenColliderLayers(LayerMask.NameToLayer("Ignore Raycast"));
  223.         if (num == 0)
  224.         {
  225.             Vector3[] vertices = sharedMesh.vertices;
  226.             foreach (Vector3 position in vertices)
  227.             {
  228.                 Vector3 dest = obj.transform.TransformPoint(position);
  229.                 dest = get_ray_cast_offset(dest, obj.transform.position);
  230.                 Vector3 direction = dest - base.transform.position;
  231.                 if (Physics.Raycast(base.transform.position, direction, out raycastHit, float.PositiveInfinity, layerMask) && raycastHit.collider.gameObject.GetInstanceID() != obj.GetInstanceID() && Physics.Raycast(base.transform.position, direction, out raycastHit, float.PositiveInfinity, layerMask2))
  232.                 {
  233.                     obj.layer = layer;
  234.                     obj.GetComponent<DropTriggerScript>().returnChildrenColliderLayers();
  235.                     return true;
  236.                 }
  237.             }
  238.             obj.layer = layer;
  239.             obj.GetComponent<DropTriggerScript>().returnChildrenColliderLayers();
  240.             return false;
  241.         }
  242.         for (int j = 0; j < sharedMesh.triangles.Length; j += 3)
  243.         {
  244.             for (int k = 0; k < 3; k++)
  245.             {
  246.                 Vector3 dest2 = obj.transform.TransformPoint(sharedMesh.vertices[sharedMesh.triangles[k + j]]);
  247.                 Vector3 dest3 = obj.transform.TransformPoint(sharedMesh.vertices[sharedMesh.triangles[(k + 1) % 3 + j]]);
  248.                 dest2 = get_ray_cast_offset(dest2, obj.transform.position);
  249.                 dest3 = get_ray_cast_offset(dest3, obj.transform.position);
  250.                 Vector3 a = (dest3 - dest2) / (float)(num + 1);
  251.                 for (int l = 0; l <= num + 1; l++)
  252.                 {
  253.                     Vector3 a2 = dest2 + (float)l * a;
  254.                     Vector3 vector = a2 - base.transform.position;
  255.                     Debug.DrawRay(base.transform.position, vector);
  256.                     if (Physics.Raycast(base.transform.position, vector, out raycastHit, float.PositiveInfinity, layerMask) && raycastHit.collider.gameObject.GetInstanceID() != obj.GetInstanceID() && Physics.Raycast(base.transform.position, vector, float.PositiveInfinity, layerMask2))
  257.                     {
  258.                         Debug.DrawRay(base.transform.position, vector * 3f, Color.red);
  259.                         Debug.Log("Target ID: " + obj.ToString() + "  Blocked by: " + raycastHit.collider.gameObject.ToString());
  260.                         Debug.Log("Target ID: " + raycastHit.collider.gameObject.GetInstanceID() + "  Blocked by: " + obj.GetInstanceID());
  261.                         obj.layer = layer;
  262.                         obj.GetComponent<DropTriggerScript>().returnChildrenColliderLayers();
  263.                         return true;
  264.                     }
  265.                 }
  266.             }
  267.         }
  268.         obj.layer = layer;
  269.         obj.GetComponent<DropTriggerScript>().returnChildrenColliderLayers();
  270.         return false;
  271.     }
  272.  
  273.     private bool does_ray_gets_blocked(GameObject obj, Vector3 dir, int layerMask_without_player, int layerMask_target_only)
  274.     {
  275.         RaycastHit raycastHit = default(RaycastHit);
  276.         if (Physics.Raycast(base.transform.position, dir, out raycastHit, float.PositiveInfinity, layerMask_without_player) && raycastHit.collider.gameObject.GetInstanceID() != obj.GetInstanceID() && Physics.Raycast(base.transform.position, dir, float.PositiveInfinity, layerMask_target_only))
  277.         {
  278.             return true;
  279.         }
  280.         return false;
  281.     }
  282.  
  283.     private float get_resize_ratio(GameObject obj)
  284.     {
  285.         Mesh sharedMesh = obj.GetComponent<MeshFilter>().sharedMesh;
  286.         int layerMask = ~(1 << LayerMask.NameToLayer("Ignore Raycast") | 1 << LayerMask.NameToLayer("Grabbed"));
  287.         RaycastHit raycastHit = default(RaycastHit);
  288.         float num = 3.40282347E+38f;
  289.         int num2 = 108 / (sharedMesh.triangles.Length / 3 + sharedMesh.vertexCount / 3 - 2);
  290.         if (num2 == 0)
  291.         {
  292.             Vector3[] vertices = sharedMesh.vertices;
  293.             foreach (Vector3 position in vertices)
  294.             {
  295.                 Vector3 dest = obj.transform.TransformPoint(position);
  296.                 dest = get_ray_cast_offset(dest, obj.transform.position);
  297.                 Vector3 direction = dest - base.transform.position;
  298.                 if (Physics.Raycast(base.transform.position, direction, out raycastHit, float.PositiveInfinity, layerMask))
  299.                 {
  300.                     float distance = raycastHit.distance;
  301.                     Vector3 point = raycastHit.point;
  302.                     Ray ray = new Ray(point, base.transform.position - point);
  303.                     obj.collider.Raycast(ray, out raycastHit, 3.40282347E+38f);
  304.                     float distance2 = raycastHit.distance;
  305.                     float num3 = distance / (distance - distance2);
  306.                     if (num3 < num)
  307.                     {
  308.                         num = num3;
  309.                     }
  310.                 }
  311.             }
  312.             return num;
  313.         }
  314.         int num4 = 0;
  315.         int num5 = 0;
  316.         for (int j = 0; j < sharedMesh.triangles.Length; j += 3)
  317.         {
  318.             for (int k = 0; k < 3; k++)
  319.             {
  320.                 Vector3 dest2 = obj.transform.TransformPoint(sharedMesh.vertices[sharedMesh.triangles[k + j]]);
  321.                 Vector3 dest3 = obj.transform.TransformPoint(sharedMesh.vertices[sharedMesh.triangles[(k + 1) % 3 + j]]);
  322.                 dest2 = get_ray_cast_offset(dest2, obj.transform.position);
  323.                 dest3 = get_ray_cast_offset(dest3, obj.transform.position);
  324.                 Vector3 a = (dest3 - dest2) / (float)(num2 + 1);
  325.                 for (int l = 1; l <= num2 + 1; l++)
  326.                 {
  327.                     Vector3 a2 = dest2 + (float)l * a;
  328.                     Vector3 direction2 = a2 - base.transform.position;
  329.                     if (Physics.Raycast(base.transform.position, direction2, out raycastHit, float.PositiveInfinity, layerMask))
  330.                     {
  331.                         float distance3 = raycastHit.distance;
  332.                         Vector3 point2 = raycastHit.point;
  333.                         Ray ray2 = new Ray(point2, base.transform.position - point2);
  334.                         obj.collider.Raycast(ray2, out raycastHit, 3.40282347E+38f);
  335.                         float distance4 = raycastHit.distance;
  336.                         float num6 = distance3 / (distance3 - distance4);
  337.                         if (num6 < num)
  338.                         {
  339.                             num = num6;
  340.                         }
  341.                     }
  342.                 }
  343.             }
  344.         }
  345.         return num;
  346.     }
  347.  
  348.     private void setFollowVelocity(Vector3 grabbed_Pos, float resize_ratio)
  349.     {
  350.         if (grabbed_object.GetComponent<DropTriggerScript>().canFollow)
  351.         {
  352.             Vector3 a = grabbed_Pos - prevGrabbedPosition;
  353.             grabbed_object.rigidbody.velocity = a * resize_ratio * followVelocityRatio;
  354.         }
  355.     }
  356.  
  357.     private void transform_object_by_ratio(GameObject obj, float ratio)
  358.     {
  359.         Vector3 a = obj.transform.position - base.transform.position;
  360.         float magnitude = a.magnitude;
  361.         Vector3 localScale = obj.transform.localScale;
  362.         obj.transform.position = base.transform.position + ratio * a;
  363.         obj.transform.localScale = ratio * localScale;
  364.     }
  365.  
  366.     private Vector3 get_ray_cast_offset(Vector3 dest, Vector3 center)
  367.     {
  368.         Vector3 direction = center - dest;
  369.         Vector3 vector = base.camera.transform.InverseTransformDirection(direction);
  370.         Vector3 direction2 = new Vector3(vector.x, vector.y, 0f);
  371.         return dest + 0.01f * base.camera.transform.TransformDirection(direction2).normalized;
  372.     }
  373.  
  374.     private float newMass(float oldMass, float ratio)
  375.     {
  376.         return Mathf.Pow(ratio, 3f) * oldMass * mass_constant;
  377.     }
  378.  
  379.     public float getGrabDistance()
  380.     {
  381.         return grab_distance;
  382.     }
  383.  
  384.     public void setGrabDistance(float f)
  385.     {
  386.         grab_distance = f;
  387.     }
  388. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement