private void GenerateHeightMarkerTrack(TrackSegment4 trackSegment) { Transform transform = this.transform.Find ("HeightMarkerPlane"); GameObject heightMarkerGo; MeshFilter meshFilter; if (transform == null) { heightMarkerGo = new GameObject ("HeightMarkerPlane"); meshFilter = heightMarkerGo.AddComponent<MeshFilter> (); MeshRenderer meshRenderer = heightMarkerGo.AddComponent<MeshRenderer> (); meshRenderer.sharedMaterial = Main.AssetBundleManager.MaterialPlane; heightMarkerGo.transform.SetParent (this.transform); } else { heightMarkerGo = transform.gameObject; meshFilter = transform.gameObject.GetComponent<MeshFilter> (); meshFilter.mesh.Clear (); } heightMarkerGo.transform.localPosition = Vector3.zero; heightMarkerGo.transform.localRotation = Quaternion.identity; List<Vector3> verticies = new List<Vector3> (); List<int> triangles = new List<int> (); List<Vector2> uvs = new List<Vector2> (); float sample = trackSegment.getLength(0) / (float)Mathf.RoundToInt(trackSegment.getLength(0)/ .2f); float pos = 0.0f; int index = 0; float tForDistance = trackSegment.getTForDistance (0,0); Vector3 position = trackSegment.getPoint (tForDistance,0); LandPatch terrain = GameController.Instance.park.getTerrain(base.transform.position); Vector3 vector = position; if (terrain != null) { vector = terrain.getPoint(base.transform.position); } float magnitude = (position - vector).magnitude; verticies.Add (this.transform.InverseTransformPoint(position)); verticies.Add (this.transform.InverseTransformPoint(position + Vector3.down*magnitude* Mathf.Sign(position.y - vector.y))); uvs.Add (new Vector2 (0, magnitude)); uvs.Add (new Vector2 (0, 0)); Vector3 previous = position; float xoffset = 0; while (pos < trackSegment.getLength (0)) { tForDistance = trackSegment.getTForDistance (pos,0); index++; pos += sample; position = trackSegment.getPoint (tForDistance,0); terrain = GameController.Instance.park.getTerrain(position); vector = position; if (terrain != null) { vector = terrain.getPoint(position); } magnitude = (position - vector).magnitude; verticies.Add (this.transform.InverseTransformPoint(position)); verticies.Add (this.transform.InverseTransformPoint(position + Vector3.down*magnitude * Mathf.Sign(position.y - vector.y))); xoffset+= Vector3.Distance (previous, position); uvs.Add (new Vector2 (xoffset,vector.y + magnitude )); uvs.Add (new Vector2 (xoffset,vector.y - 0)); int last = verticies.Count - 1; triangles.Add (last - 3); triangles.Add (last - 2); triangles.Add (last - 1); triangles.Add (last - 1); triangles.Add (last - 2); triangles.Add (last); previous = position; } meshFilter.mesh.vertices = verticies.ToArray (); meshFilter.mesh.triangles = triangles.ToArray ();; meshFilter.mesh.uv = uvs.ToArray (); }
private void recalculate(MeshGenerator meshGenerator, TrackSegment4 segment) { foreach(Transform child in segment.gameObject.transform) { if (child.name != "BetweenTracksMouseCollider" && !child.name.Contains("StationPlatformTrackTile") && child.name != "MouseSelectionCollider") { var mesh_filter = child.gameObject.GetComponent<MeshFilter> (); if (mesh_filter != null) { UnityEngine.Object.Destroy (mesh_filter.mesh); UnityEngine.Object.Destroy (mesh_filter.sharedMesh); } UnityEngine.Object.Destroy (child.gameObject); } } if (segment.getLength() <= 0f) { Debug.LogWarning("Can't extrude this segment! Has a length of 0."); } meshGenerator.prepare(segment, segment.gameObject); float num = 0f; float num2 = 0f; meshGenerator.sampleAt(segment, 0f); int num3 = 0; int num4 = 0; Vector3 b = segment.getStartpoint(); do { float num5 = 1f - num2; if (Vector3.Angle(segment.getDirection(), segment.getPoint(num2 + num5) - segment.getPoint(num2)) > 5f) { num5 /= 2f; } int num6 = 0; Vector3 point = segment.getPoint(num2 + num5); float num7 = Vector3.Angle(segment.getTangentPoint(num2), segment.getTangentPoint(num2 + num5)); num7 = Mathf.Max(num7, Vector3.Angle(segment.getNormal(num2), segment.getNormal(num2 + num5))); while (num5 > 0.01f && (num7 > 10f || (num7 > 2f && (point - b).magnitude > 0.225f))) { num4++; num5 /= 2f; point = segment.getPoint(num2 + num5); num7 = Vector3.Angle(segment.getTangentPoint(num2), segment.getTangentPoint(num2 + num5)); num7 = Mathf.Max(num7, Vector3.Angle(segment.getNormal(num2), segment.getNormal(num2 + num5))); num6++; if (num6 > 50) { break; } } num += (point - b).magnitude; num2 += num5; b = point; if (num2 > 1f) { break; } meshGenerator.sampleAt(segment, num2); num3++; } while (num2 < 1f && num3 < 300); if (!Mathf.Approximately(num2, 1f)) { meshGenerator.sampleAt(segment, 1f); } meshGenerator.afterExtrusion(segment, segment.gameObject); MeshFilter component = segment.gameObject.GetComponent<MeshFilter>(); Mesh mesh = meshGenerator.getMesh(segment.gameObject); UnityEngine.Object.Destroy (component.sharedMesh); UnityEngine.Object.Destroy (component.mesh); component.sharedMesh = mesh; meshGenerator.afterMeshGeneration(segment, segment.gameObject); Extruder buildVolumeMeshExtruder = meshGenerator.getBuildVolumeMeshExtruder(); buildVolumeMeshExtruder.transform(segment.gameObject.transform.worldToLocalMatrix); BoundingMesh boundingMesh = segment.gameObject.GetComponent<BoundingMesh>(); boundingMesh.layers = BoundingVolume.Layers.Buildvolume; boundingMesh.setMesh(buildVolumeMeshExtruder.vertices.ToArray(), buildVolumeMeshExtruder.indizes.ToArray()); GameObject track_mouse_collider = segment.transform.Find ("BetweenTracksMouseCollider").gameObject;// new GameObject("BetweenTracksMouseCollider"); track_mouse_collider.transform.parent = segment.gameObject.transform; track_mouse_collider.transform.localPosition = Vector3.zero; track_mouse_collider.transform.localRotation = Quaternion.identity; track_mouse_collider.layer = LayerMasks.ID_MOUSECOLLIDERS; MeshCollider meshCollider = track_mouse_collider.GetComponent<MeshCollider>(); Mesh collisionMesh = meshGenerator.getCollisionMesh(segment.gameObject); UnityEngine.Object.Destroy (meshCollider.sharedMesh); meshCollider.sharedMesh = collisionMesh; MouseCollider mouseCollider = segment.gameObject.GetComponent<MouseCollider>(); mouseCollider.colliderObject = track_mouse_collider; }