/// <summary>
        /// Constructs a dictionary that maps a TileMap to a Physics2DServer-created StaticBody2D (RID).
        /// Is used for both the walls and ledges dictionaries.
        /// </summary>
        /// <param name="tileMaps">List of TileMaps.</param>
        /// <param name="worldSpace">RID of the World Space.</param>
        /// <returns>A Dictionary that maps TileMaps to an RID of a StaticBody2D.</returns>
        public static Dictionary<TileMap, RID> ConstructTileMapCollisionMap(this TileMapList tileMaps, RID worldSpace)
        {
            if (tileMaps is null) throw new ArgumentNullException(nameof(tileMaps));

            var tileMapToSB2Ds = new Dictionary<TileMap, RID>();
            foreach (TileMap tileMap in tileMaps.Values)
            {
                RID edgeSB2D = Physics2DServer.BodyCreate();
                Physics2DServer.BodySetMode(edgeSB2D, Physics2DServer.BodyMode.Static);
                Physics2DServer.BodySetSpace(edgeSB2D, worldSpace);
                Physics2DServer.BodySetState(edgeSB2D, Physics2DServer.BodyState.Transform, Transform2D.Identity);
                Physics2DServer.BodySetCollisionLayer(edgeSB2D, LayersFuncs.GetLayersValue(Terrain));
                Physics2DServer.BodySetCollisionMask(edgeSB2D, LayersFuncs.GetLayersValue(PlayerEntity, NpcEntity));
                tileMapToSB2Ds.Add(tileMap, edgeSB2D);
            }
            return tileMapToSB2Ds;
        }
Example #2
0
        ConstructFloorPartitions(this TileMapList tileMaps, Dictionary <TileMap, RID> tileMapToFloorArea2Ds,
                                 PerimeterData perimData)
        {
            if (tileMaps is null)
            {
                throw new ArgumentNullException(nameof(tileMaps));
            }
            if (tileMapToFloorArea2Ds is null)
            {
                throw new ArgumentNullException(nameof(tileMapToFloorArea2Ds));
            }
            if (perimData is null)
            {
                throw new ArgumentNullException(nameof(perimData));
            }

            var floorArea2DToPolygons = new Dictionary <RID, List <ConvexPolygonShape2D> >();

            foreach (TileMap tileMap in tileMaps.Values)
            {
                RID area2dRID = tileMapToFloorArea2Ds[tileMap];
                floorArea2DToPolygons[area2dRID] = new List <ConvexPolygonShape2D>();
                Physics2DServer.AreaSetCollisionLayer(area2dRID, LayersFuncs.GetLayersValue(Terrain));
                Physics2DServer.AreaSetCollisionMask(area2dRID, LayersFuncs.GetLayersValue(PlayerEntity, NpcEntity));

                int maxTileGroups = perimData.GetMaxTileGroup(tileMap);
                for (int tileGroup = 0; tileGroup < maxTileGroups; tileGroup++)
                {
                    int maxHoleGroups = perimData.GetMaxHoleGroup(tileMap, tileGroup);
                    var allPerims     = new List <Vector2> [maxHoleGroups];
                    for (int holeGroup = 0; holeGroup < maxHoleGroups; holeGroup++)
                    { //put all perims (outer and hole) from one tile group into a single array of lists (gods help me) for partitioning
                        EdgeCollection <TileEdge> edgeColl = perimData.GetEdgeCollection(tileMap, tileGroup, holeGroup);
                        allPerims[holeGroup] = new List <Vector2>(edgeColl.GetSimplifiedPerim());
                    }
                    List <ConvexPolygonShape2D> partitionedRectangles = _PartitionPolygonToRectangles(allPerims);
                    foreach (ConvexPolygonShape2D shape in partitionedRectangles)
                    {
                        Physics2DServer.AreaAddShape(area2dRID, shape.GetRid());
                        GD.PrintS("added shape " + shape.GetRid().GetId() + " to area: " + area2dRID.GetId());
                    }
                    floorArea2DToPolygons[area2dRID].AddRange(partitionedRectangles);
                }
            }
            return(floorArea2DToPolygons);
        }