public void UpdateAllFrontTopVerticies() { if (AllFrontTopVerticies == null) { AllFrontTopVerticies = new List <Vector3>(); } else { AllFrontTopVerticies.Clear(); } List <TerrainPiece> pieces = Pool.TerrainPieces.OrderBy(terp => terp.FrontMesh.BottomLeftCorner.x).ToList(); for (int i = 0; i < pieces.Count(); i++) { TerrainPiece tp = pieces[i]; MeshPiece mp = tp.FrontMesh; for (int k = 0; k < mp.RotatedPlaneVerticies.Count(); k++) { //Evens are bottom verts, odds are top if (k % 2 != 0) { AllFrontTopVerticies.Add(mp.RotatedPlaneVerticies[k]); } } } }
public List <Vector3> GetCornerVerts(TerrainPiece previousTerrain, TerrainPiece currentTerrain, MeshPiece.Plane planeType, bool topVerts) { MeshPiece lastMesh = null; MeshPiece currentMesh = null; List <Vector3> verts = new List <Vector3>(); if (planeType == MeshPiece.Plane.Front) { lastMesh = previousTerrain.FrontMesh; currentMesh = currentTerrain.FrontMesh; } else if (planeType == MeshPiece.Plane.Detail) { lastMesh = previousTerrain.DetailMesh; currentMesh = currentTerrain.DetailMesh; } if (topVerts) { verts.Add(lastMesh.TopRightCorner); verts.Add(currentMesh.TopLeftCorner); } else { verts.Add(lastMesh.BottomRightCorner); verts.Add(currentMesh.BottomLeftCorner); } return(verts); }
private void MoveMeshesForCornerPiece(TerrainPiece currentTerrain, TerrainPiece nextTerrain, Vector3 origin) { //Because of the rotations these can overlap. So get the difference, then add our spacing for the corners //TODO: Revisit this, I don't think it is working quite right float maxXPrevious = currentTerrain.FrontMesh.RotatedPlaneVerticies.Select(p => p.x).Max(); float minXCurrent = nextTerrain.FrontMesh.RotatedPlaneVerticies.Select(p => p.x).Min(); float diff = Math.Abs(maxXPrevious - minXCurrent); float spacing = diff + settings.CornerMeshWidth; //Move every mesh piece in this terrain to give us space to have our corner mesh for (int j = 0; j < nextTerrain.MeshPieces.Count; j++) { MeshPiece mp = nextTerrain.MeshPieces[j]; Vector3 moveAmount = new Vector3(origin.x + spacing, origin.y, origin.z); if (mp.PlaneType == MeshPiece.Plane.Detail) { //Move the detail mesh slightly in front of the front plane mesh moveAmount = moveAmount + settings.DetailPlaneOffset; mp.MoveMesh(moveAmount, mp.PlaneType); } else { mp.MoveMesh(moveAmount, mp.PlaneType); } } }
public void CreateCorner(VertexGenerator vg, TerrainPiece previousTerrain, TerrainPiece currentTerrain, Transform newParent) { //Our plane is made up of the last top and bottom verts of the previous mesh, and the first top and bottom verts of the current mesh List <Vector3> topVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Front, true); List <Vector3> bottomVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Front, false); //Create our front mesh piece MeshPiece meshPiece = new MeshPiece(vg, MeshPiece.Plane.Front, settings); meshPiece.CreateCorner(topVerticies, bottomVerticies); //The first mesh could be null if we are below the minimum verticies we need to create a plane if (meshPiece.MeshObject != null) { TransformHelpers th = new TransformHelpers(); //Now we've created the front of our mesh InstantiateTerrainObject(0f, newParent); MeshPieces.Add(meshPiece); //Add detail mesh if (settings.DrawDetailMeshRenderer) { MeshPiece meshPieceDetail = new MeshPiece(vg, MeshPiece.Plane.Detail, settings); topVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Detail, true); bottomVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Detail, false); meshPieceDetail.CreateCorner(topVerticies, bottomVerticies); MeshPieces.Add(meshPieceDetail); } if (settings.DrawTopMeshCollider || settings.DrawTopMeshRenderer) { //Create the verticies for the top of our mesh, and add that too MeshPiece meshPieceTop = new MeshPiece(vg, MeshPiece.Plane.Top, settings); //Use the top verts as our bottom z row bottomVerticies = th.CopyList(topVerticies); Vector3 firstBottomVertex = topVerticies[0]; //Then shift the top verts into the z plane topVerticies = th.MoveStartVertex(topVerticies, firstBottomVertex, new Vector3(firstBottomVertex.x, firstBottomVertex.y, firstBottomVertex.z + settings.TopPlaneHeight), false); meshPieceTop.CreateCorner(topVerticies, bottomVerticies); if (settings.TopPhysicsMaterial2D != null) { meshPieceTop.edgeCollider.sharedMaterial = settings.TopPhysicsMaterial2D; // assign Physics Material if any } if (settings.TerrainLayer != 0) { meshPieceTop.MeshObject.layer = settings.TerrainLayer; // assign Layer if any } MeshPieces.Add(meshPieceTop); } //Just to tidy up the heirarchy ParentMeshesToTerrainObject(); } }
public void Create(VertexGenerator vg, Vector3 origin) { //Track the angle we are currenlty on TerrainAngle = vg.CurrentTerrainRule.Angle; //Create the front mesh and populate our key verts for the front plane MeshPiece mp = new MeshPiece(vg, MeshPiece.Plane.Front, settings); mp.PopulateKeyVerticies(MeshPiece.Plane.Front); //Now create the mesh mp.Create(origin, TerrainAngle); //The first mesh could be null if we are below the minimum verticies we need to create a plane if (mp.MeshObject != null) { //Create a placeholder object for our mesh pieces InstantiateTerrainObject(); //if (meshCollider == null) { // meshCollider = TerrainObject.AddComponent<MeshCollider>(); // meshCollider.convex = true; //} if (terrainCollider == null) { terrainCollider = TerrainObject.AddComponent <TerrainCollider>(); terrainCollider.material = new PhysicMaterial(); } //And add the front plane mesh piece to our list of meshes in the terrain piece MeshPieces.Add(mp); if (settings.DrawDetailMeshRenderer) { MeshPiece mpDetail = new MeshPiece(vg, MeshPiece.Plane.Detail, settings); mpDetail.Create(origin + settings.DetailPlaneOffset, TerrainAngle, mp.KeyTopVerticies); MeshPieces.Add(mpDetail); } if (settings.DrawTopMeshCollider || settings.DrawTopMeshRenderer) { MeshPiece mpTop = new MeshPiece(vg, MeshPiece.Plane.Top, settings); mpTop.Create(mp.StartTopMesh, TerrainAngle, mp.KeyTopVerticies); MeshPieces.Add(mpTop); } //Just to tidy up the heirarchy ParentMeshesToTerrainObject(); } }
public List<Vector3> MoveStartVertex(List<Vector3> verticies, Vector3 newStartVertex, bool copyVertices, MeshPiece.Plane planeType) { int startIndex = 0; if (planeType == MeshPiece.Plane.Front || planeType == MeshPiece.Plane.Detail) { startIndex = 1; } Vector3 originalStartVertex = verticies[startIndex]; return MoveStartVertex(verticies, originalStartVertex, newStartVertex, copyVertices); }
public void Create(VertexGenerator vg, Vector3 origin) { //Track the angle we are currenlty on TerrainAngle = vg.CurrentTerrainRule.Angle; //Create the front mesh and populate our key verts for the front plane MeshPiece mp = new MeshPiece(vg, MeshPiece.Plane.Front, settings); mp.PopulateKeyVerticies(MeshPiece.Plane.Front); //Now create the mesh mp.Create(origin, TerrainAngle); //The first mesh could be null if we are below the minimum verticies we need to create a plane if (mp.MeshObject != null){ //Create a placeholder object for our mesh pieces InstantiateTerrainObject(); //And add the front plane mesh piece to our list of meshes in the terrain piece MeshPieces.Add(mp); if (settings.DrawDetailMeshRenderer) { MeshPiece mpDetail = new MeshPiece(vg, MeshPiece.Plane.Detail, settings); mpDetail.Create(origin + settings.DetailPlaneOffset, TerrainAngle, mp.KeyTopVerticies); MeshPieces.Add(mpDetail); } if (settings.DrawTopMeshCollider || settings.DrawTopMeshRenderer) { MeshPiece mpTop = new MeshPiece(vg, MeshPiece.Plane.Top, settings); mpTop.Create(mp.StartTopMesh, TerrainAngle, mp.KeyTopVerticies); MeshPieces.Add(mpTop); } //Just to tidy up the heirarchy ParentMeshesToTerrainObject(); } }
public void Create(VertexGenerator vg, Vector3 origin, Transform newParent) { //Track the angle we are currenlty on TerrainAngle = vg.CurrentTerrainRule.Angle; //Create the front mesh and populate our key verts for the front plane MeshPiece mp = new MeshPiece(vg, MeshPiece.Plane.Front, settings); mp.PopulateKeyVerticies(MeshPiece.Plane.Front); //Now create the mesh mp.Create(origin, TerrainAngle); //The first mesh could be null if we are below the minimum verticies we need to create a plane if (mp.MeshObject != null) { //Create a placeholder object for our mesh pieces InstantiateTerrainObject(origin.x, newParent); //And add the front plane mesh piece to our list of meshes in the terrain piece MeshPieces.Add(mp); if (settings.DrawDetailMeshRenderer) { MeshPiece mpDetail = new MeshPiece(vg, MeshPiece.Plane.Detail, settings); mpDetail.Create(origin + settings.DetailPlaneOffset, TerrainAngle, mp.KeyTopVerticies); MeshPieces.Add(mpDetail); } if (settings.DrawTopMeshCollider || settings.DrawTopMeshRenderer) { MeshPiece mpTop = new MeshPiece(vg, MeshPiece.Plane.Top, settings); mpTop.Create(mp.StartTopMesh, TerrainAngle, mp.KeyTopVerticies); if (settings.TopPhysicsMaterial2D != null) { mpTop.edgeCollider.sharedMaterial = settings.TopPhysicsMaterial2D; // assign Physics Material if any } if (settings.TerrainLayer != 0) { mpTop.MeshObject.layer = settings.TerrainLayer; // assign Layer if any } MeshPieces.Add(mpTop); } //Just to tidy up the heirarchy ParentMeshesToTerrainObject(); } }
public List<Vector3> GetCornerVerts(TerrainPiece previousTerrain, TerrainPiece currentTerrain, MeshPiece.Plane planeType, bool topVerts) { MeshPiece lastMesh = null; MeshPiece currentMesh = null; List<Vector3> verts = new List<Vector3>(); if (planeType == MeshPiece.Plane.Front) { lastMesh = previousTerrain.FrontMesh; currentMesh = currentTerrain.FrontMesh; } else if (planeType == MeshPiece.Plane.Detail) { lastMesh = previousTerrain.DetailMesh; currentMesh = currentTerrain.DetailMesh; } if (topVerts) { verts.Add(lastMesh.TopRightCorner); verts.Add(currentMesh.TopLeftCorner); } else { verts.Add(lastMesh.BottomRightCorner); verts.Add(currentMesh.BottomLeftCorner); } return verts; }
public void CreateCorner(VertexGenerator vg, TerrainPiece previousTerrain, TerrainPiece currentTerrain) { //Our plane is made up of the last top and bottom verts of the previous mesh, and the first top and bottom verts of the current mesh List<Vector3> topVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Front, true); List<Vector3> bottomVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Front, false); //Create our front mesh piece MeshPiece meshPiece = new MeshPiece(vg, MeshPiece.Plane.Front, settings); meshPiece.CreateCorner(topVerticies, bottomVerticies); //The first mesh could be null if we are below the minimum verticies we need to create a plane if (meshPiece.MeshObject != null) { TransformHelpers th = new TransformHelpers(); //Now we've created the front of our mesh InstantiateTerrainObject(); MeshPieces.Add(meshPiece); //Add detail mesh if (settings.DrawDetailMeshRenderer) { MeshPiece meshPieceDetail = new MeshPiece(vg, MeshPiece.Plane.Detail, settings); topVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Detail, true); bottomVerticies = GetCornerVerts(previousTerrain, currentTerrain, MeshPiece.Plane.Detail, false); meshPieceDetail.CreateCorner(topVerticies, bottomVerticies); MeshPieces.Add(meshPieceDetail); } if (settings.DrawTopMeshCollider || settings.DrawTopMeshRenderer) { //Create the verticies for the top of our mesh, and add that too MeshPiece meshPieceTop = new MeshPiece(vg, MeshPiece.Plane.Top, settings); //Use the top verts as our bottom z row bottomVerticies = th.CopyList(topVerticies); Vector3 firstBottomVertex = topVerticies[0]; //Then shift the top verts into the z plane topVerticies = th.MoveStartVertex(topVerticies, firstBottomVertex, new Vector3(firstBottomVertex.x, firstBottomVertex.y, firstBottomVertex.z + settings.TopPlaneHeight), false); meshPieceTop.CreateCorner(topVerticies, bottomVerticies); MeshPieces.Add(meshPieceTop); } //Just to tidy up the heirarchy ParentMeshesToTerrainObject(); } }