public void GenerateMesh() { CaveManager cmanager = GameObject.FindGameObjectWithTag("CaveManager").GetComponent <CaveManager> (); int m_lengthRes = cmanager.GetDivRes(); int m_ribRes = cmanager.GetRoundRes(); m_DivScales = new List <float> (); for (int i = 0; i < m_lengthRes; ++i) { m_DivScales.Add(3); } // Add the now set mesh to the game object as a meshfilter gameObject.AddComponent <MeshFilter> ().mesh = new Mesh(); // Add and set up the new mesh renderer gameObject.AddComponent <MeshRenderer>().material = cmanager.m_caveMaterial; // Add a mesh collider used for raycast testing gameObject.AddComponent <MeshCollider>(); UpdateMesh(m_lengthRes, m_ribRes); GenerateTriangles(m_lengthRes, m_ribRes); // Add a mesh collider used for raycast testing GetComponent <MeshCollider>().sharedMesh = GetComponent <MeshFilter> ().mesh; }
// Update is called once per frame void Update() { float dist = Vector3.Distance(transform.position, Camera.main.transform.position); float m_size = ((dist > 1) ? dist : 1) * m_gizmoScale; transform.localScale = new Vector3(m_size, m_size, m_size); // Hit out from raycast RaycastHit hit; // Cast the mouse position to world hit Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // Ray hit a collider if (Physics.Raycast(ray, out hit)) { if (!m_gizmoActive) { // Get the clicked gizmo handle if (hit.collider.tag == "GizmoHandle") { if (Input.GetMouseButton(0)) { // Disable sketch mode m_gizmoActive = true; m_toolManagerScript.SetAllowedToDraw(false); // Cache the object m_activeHandle = hit.collider.gameObject; // Process the axis from the clicked object's name if (!m_axisProcessed) { numberOfAxis = ProcessAxis(hit.collider.gameObject.name); if (hit.transform.childCount == 0) { m_colourView.GetComponent <Renderer> ().material = hit.collider.GetComponent <Renderer> ().material; } else { m_colourView.GetComponent <Renderer> ().material = hit.transform.GetChild(0).GetComponent <Renderer> ().material; } } } } else { if (hit.collider.tag == "GizmoRing") { m_ringActive = true; m_toolManagerScript.SetAllowedToDraw(false); // Cache the object m_activeHandle = hit.collider.gameObject; } } } } if (!Input.GetMouseButton(0)) { // Re-enable sketch mode m_gizmoActive = false; m_ringActive = false; m_toolManagerScript.SetAllowedToDraw(true); } if (m_ringActive) { float mouseMove = m_lastMousePosition.x - Input.mousePosition.x; if (mouseMove < 0) { if (m_activeHandle.transform.root.localScale.x > 2) { m_activeHandle.transform.root.localScale += new Vector3(mouseMove * .1f, mouseMove * .1f, mouseMove * .1f); } } else { m_activeHandle.transform.root.localScale += new Vector3(mouseMove * .1f, mouseMove * .1f, mouseMove * .1f); } CaveManager cmanager = GameObject.FindGameObjectWithTag("CaveManager").GetComponent <CaveManager> (); if (m_activeHandle.transform.root != null) { m_activeHandle.transform.root.GetComponent <GizmoRing> ().m_bezier.UpdateMesh(cmanager.GetDivRes(), cmanager.GetRoundRes()); } } // The gizmo is active, do logic if (m_gizmoActive && m_activeHandle.transform.root.gameObject == this.gameObject) { Vector2 mouseMove = m_lastMousePosition - Input.mousePosition; // Do the correct process in the retrieved axis switch (m_processType) { case ProcessType.Translate: { // SingleAxis if (numberOfAxis == 1) { // Up is along axis, convert to screen space Vector3 screenPos = Camera.main.WorldToScreenPoint(m_activeHandle.transform.position); Vector3 screenPosUp = Camera.main.WorldToScreenPoint(m_activeHandle.transform.position + m_activeHandle.transform.up); float colinearity = Vector2.Dot( Vector3.Normalize(new Vector2(screenPos.x - screenPosUp.x, screenPos.y - screenPosUp.y)), Vector3.Normalize(new Vector2(mouseMove.x, mouseMove.y)) ); Vector3 newPos = m_activeHandle.transform.up * colinearity * (mouseMove.magnitude * m_gizmoMovementPower) * (m_size * m_gizmoMovementPower); newPos = (newPos.magnitude > 10000) ? Vector3.zero : newPos; transform.Translate(newPos, Space.World); if (m_childGizmo != null) { m_childGizmo.Translate(newPos, Space.World); } } else { // Planar motion Plane plane = new Plane(m_activeHandle.transform.up, transform.position); //Vector2 mouseMove = m_lastMousePosition - Input.mousePosition; // Create a current and last ray Ray curRay = Camera.main.ScreenPointToRay(Input.mousePosition); Ray lastRay = Camera.main.ScreenPointToRay(m_lastMousePosition); //Distance along ray (on plane) float distance; Vector3 curpos = Vector3.zero; Vector3 lastpos = Vector3.zero;; // Do the raycasts if (plane.Raycast(lastRay, out distance)) { lastpos = lastRay.GetPoint(distance); } if (plane.Raycast(curRay, out distance)) { curpos = curRay.GetPoint(distance); } Vector3 newPos = (curpos - lastpos) * (mouseMove.magnitude * m_gizmoMovementPower) * (m_size * m_gizmoMovementPower); newPos = (newPos.magnitude > 10000) ? Vector3.zero : newPos; transform.Translate(newPos, Space.World); if (m_childGizmo != null) { m_childGizmo.Translate(newPos, Space.World); } } } break; case ProcessType.Rotate: { transform.Rotate(m_activeHandle.transform.up * mouseMove.x, Space.World); if (m_childGizmo != null) { m_childGizmo.RotateAround(transform.position, m_activeHandle.transform.up, mouseMove.x); } } break; } } else { // Reset the core material colour m_colourView.GetComponent <Renderer> ().material = m_resetMaterial; // Reset the currently active axis (because I check for them additively) m_activeAxis = Vector3.zero; // A bit of a messy way to store active axis but oh well numberOfAxis = 0; } // Cache mouse pos at end of update tick m_lastMousePosition = Input.mousePosition; }