コード例 #1
0
        /// <summary>
        /// Creates view as voxeled circle.
        /// </summary>
        /// <param name="atlas"></param>
        private void CreateCircle(Texture2D atlas, int spriteOffset)
        {
            var atlasWidth  = pixelsPerUnit * (int)((radius + 0.5) * 2);
            var atlasHeight = pixelsPerUnit * (int)((radius + 0.5) * 2);
            //every sprite is divided by specific 2D voxels(pixelsPerUnit, pixelsPerUnit)
            //       __ __ __
            //      |__|__|__|
            //      |__|__|__|
            //      |__|__|__|
            var segmentsInRange = new bool[atlasHeight / pixelsPerUnit * atlasWidth / pixelsPerUnit];

            var segmentXIndex  = 0;
            var segmentYIndex  = 0;
            var segment1DIndex = 0;

            for (var i = 0; i < atlasWidth; i++)
            {
                for (var j = 0; j < atlasHeight; j++)
                {
                    segmentXIndex  = i / pixelsPerUnit;
                    segmentYIndex  = j / pixelsPerUnit;
                    segment1DIndex = segmentXIndex * atlasHeight / pixelsPerUnit + segmentYIndex;
                    //skip previously visited segment
                    if (segmentsInRange[segment1DIndex])
                    {
                        continue;
                    }

                    //checking if current pixel coordinates are in raw range
                    if (PixelCoor.Distance(new PixelCoor(i, j), new PixelCoor(atlasWidth / 2, atlasHeight / 2)) / pixelsPerUnit <= radius)
                    {
                        //marking segment as "visited"
                        segmentsInRange[segment1DIndex] = true;
                        //painting all pixels in visited segment
                        //       __ __ __
                        //      |__|__|__|
                        //      ||||__|__|
                        //      ||||__|__|
                        for (var x = segmentXIndex * pixelsPerUnit; x < segmentXIndex * pixelsPerUnit + pixelsPerUnit; x++)
                        {
                            for (var y = segmentYIndex * pixelsPerUnit; y < segmentYIndex * pixelsPerUnit + pixelsPerUnit; y++)
                            {
                                atlas.SetPixel(x + spriteOffset / 2, y + spriteOffset / 2, viewColor);
                            }
                        }
                    }
                    //set clear pixel if coordinates are out of range
                    else
                    {
                        atlas.SetPixel(i + spriteOffset / 2, j + spriteOffset / 2, Color.clear);
                    }
                }
            }

            atlas.Apply();
        }
コード例 #2
0
ファイル: MathExt.cs プロジェクト: sjschaff/rimlite
        public static Vec2I ClosestPt(this RectInt rect, Vec2I pt)
        {
            Vec2I minPt   = pt;
            float minDist = float.MaxValue;

            foreach (var tile in rect.allPositionsWithin)
            {
                float dist = Vec2I.Distance(pt, tile);
                if (dist < minDist)
                {
                    minDist = dist;
                    minPt   = tile;
                }
            }

            return(minPt);
        }
コード例 #3
0
        private void ComputeInterPaths(int x, int y)
        {
            ATile tile = atiles[x, y];

            for (int ea = 0; ea < 3; ++ea)
            {
                Edge edgeA = tile.edges[ea];
                if (edgeA == null)
                {
                    continue;
                }

                for (int eb = ea + 1; eb < 4; ++eb)
                {
                    Edge edgeB = tile.edges[eb];
                    if (edgeB == null)
                    {
                        continue;
                    }

                    AStar.Path shortestPath = null;
                    for (int a = 0; a < edgeA.pts.Length; ++a)
                    {
                        Vec2I ptA = edgeA.pts[a];
                        for (int b = 0; b < edgeB.pts.Length; ++b)
                        {
                            Vec2I ptB  = edgeB.pts[b];
                            var   path = AStar.FindPath(
                                cacheInternal, ptA, tile.passFn, pt => pt == ptB, pt => Vec2I.Distance(ptB, pt));
                            if (shortestPath == null || path.g < shortestPath.g)
                            {
                                shortestPath = path;
                            }
                        }
                    }

                    tile.edges[ea].pathsToEdge[eb] = shortestPath;
                    tile.edges[eb].pathsToEdge[ea] = shortestPath.Reversed();
                }
            }
        }