private void CalculateWalkableTiles() { var player = PlayerActor.Instance; var distance = player.stats.currentStats.speed; // var pos = GridUtil.GridToWorld(player.GridPosition); // var VBuffer = new List<Vector3>(); var walkableTiles = Astar.Area(player.GridPosition, distance); var vol = GenerationLib.makeVolume( new float[3][] { new float[] { -distance - 1, distance + 1, 1f }, new float[] { 0, 1, 1f }, new float[] { -distance - 1, distance + 1, 1f } }, (x, y, z) => { if ((int)y < 0.5f) { return(0); } return(walkableTiles.Contains(new NVector2((int)x + player.GridPosition.x, (int)z + player.GridPosition.y)) ? 1 : 0); }); List <int> iBuffer; List <Vector2> uvs; List <Vector3> vBuffer; SurfaceNets.GenerateSurfaceMesh(vol, 0.5f, out vBuffer, out iBuffer, out uvs); var delta = ((distance + 1) - (-distance - 1)) / 2.0f + 0.5f; vBuffer = vBuffer.Select(v => new Vector3(v.x - delta, 0.0f, v.z - delta)).ToList(); this.walkableTiles = new HashSet <NVector2>(walkableTiles); mesh.Clear(); mesh.SetVertices(vBuffer); mesh.SetIndices(iBuffer.ToArray(), MeshTopology.Quads, 0); mesh.uv = uvs.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); }
void GenerateMesh() { // Add component if needed if (!transform.GetComponent <MeshFilter>() || !transform.GetComponent <MeshRenderer>() || !transform.GetComponent <MeshCollider>()) //If you will havent got any meshrenderer or filter { transform.gameObject.AddComponent <MeshFilter>(); transform.gameObject.AddComponent <MeshRenderer>(); transform.gameObject.AddComponent <MeshCollider>(); } // Get datas SurfaceNets.Mesh m = SurfaceNets.Run(datas, new int[] { w, h, p }); // Setup mesh Mesh mesh = new Mesh(); mesh.name = "Chunk " + "(" + pos.x + "," + pos.y + "," + pos.z + ")"; mesh.vertices = m.vertices; mesh.triangles = m.triangles; //mesh.uv = UV_MaterialDisplay; mesh.RecalculateNormals(); mesh.RecalculateBounds(); mesh.Optimize(); transform.GetComponent <MeshFilter>().mesh = mesh; MeshCollider col = transform.GetComponent <MeshCollider>(); //col.convex = true; col.sharedMesh = mesh; transform.GetComponent <Renderer>().material = terrainMaterial; time = Time.time - time; Debug.Log("Complete " + "(" + pos.x + "," + pos.y + "," + pos.z + ") in " + time + " frame " + (time / frame) + " nbr " + frame); spawned = true; }
/*void OnDrawGizmos() { * Gizmos.color = new Color(1, 0.45f, 0.25f, 0.5f); * * if(visibleArea == null) return; * * var awareness = enemyActor.stats.currentStats.awareness; * var pos = enemyActor.GridPosition; * var forward = new NVector2(this.transform.forward.To2DXZ()); * var right = new NVector2(forward.y, -forward.x); * * for (int x = 0; x < (awareness*2)+1; ++x) { * for (int y = 0; y < awareness+1; ++y) { * if(! visibleArea[x, y]) continue; * * var wpos = GridUtil.GridToWorld((pos + forward*y + right*(x-awareness-1))); * * Gizmos.DrawCube(wpos, Vector3.one * 0.25f); * } * } * /* * for (int x = -visibleArea.GetLength(0) / 2; x < visibleArea.GetLength(0) / 2; ++x) { * for (int y = -visibleArea.GetLength(1) / 2; y < visibleArea.GetLength(1) / 2; ++y) { * if(visibleArea[x + visibleArea.GetLength(0) / 2, y + visibleArea.GetLength(1) / 2]) * * * Gizmos.DrawCube(this.transform.position - new Vector3(x, 0, y), Vector3.one * 0.25f); * } * } #1# * }*/ public void RecalculateVisibleArea(bool step) { if (!step) { return; } var awareness = enemyActor.stats.currentStats.awareness; visibleArea = VisibleArea.CalculateVisibleArea( enemyActor.GridPosition, awareness, new NVector2(this.transform.forward.To2DXZ()), viewAngle: enemyActor.stats.viewAngle ); var vol = GenerationLib.makeVolume( new float[3][] { new float[] { -awareness, awareness + 1, 1f }, new float[] { 0, 1, 1f }, new float[] { 0, awareness + 1, 1f } }, (x, y, z) => { if ((int)y < 0.5f) { return(0); } if ((awareness + x) < 0 || (awareness + x) >= visibleArea.GetLength(0)) { return(0); } if ((z) < 0 || (z) >= visibleArea.GetLength(1)) { return(0); } return(visibleArea[awareness + (int)x, (int)z] ? 1 : 0); }); // copied from PlayerActionSelector: // potential refactor to an own method List <int> iBuffer; List <Vector2> uvs; List <Vector3> vBuffer; SurfaceNets.GenerateSurfaceMesh(vol, 0.5f, out vBuffer, out iBuffer, out uvs); // var delta = 0f;//(awareness - awareness)/2.0f +0.5f; // var gridpos = enemyActor.GridPosition; // var forward = new NVector2(this.transform.forward.To2DXZ()); // var right = new NVector2(forward.y, -forward.x); vBuffer = vBuffer.Select(v => this.transform.forward * (v.z - 0.5f) + this.transform.right * (v.x - awareness - 0.5f)).ToList(); // this.walkableTiles = new HashSet<NVector2>(walkableTiles); mesh.Clear(); mesh.SetVertices(vBuffer); mesh.SetIndices(iBuffer.ToArray(), MeshTopology.Quads, 0); mesh.uv = uvs.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); }