Пример #1
0
        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();
        }
Пример #2
0
    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;
    }
Пример #3
0
        /*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();
        }