private void ProcessConnections(MapSiteInstance site, MapSiteInstance subSite, HierarchyTransform t) { if (Process()) { if (subSite.Def.Connections.Count != subSite.Connections.Count) { //has free connections for (int i = 0; i < subSite.Def.Connections.Count; i++) { if (subSite.Connections.ContainsKey(i)) { continue; } if (TryAttach()) { foreach (var siteDef in _def.Palette.Shuffle()) { if (subSite.Def.Connections[i].CanAttach(site.World, siteDef.Def, t)) { if (DoAttach()) { var con = subSite.Def.Connections[i]; //var vec = t.GetWorldPosInSpaceOf(con.Pos); var instance = subSite.Connections[i] = new MapSiteInstance(siteDef, con.Pos, con.Rot, true); Sites.Add(instance); var localT = new HierarchyTransform(instance.Pos, instance.Rot, t); var attachmentrT = new HierarchyTransform(default, instance.Def.AttachmentRotation, localT);
private void ProcessSite(MapSiteInstance site, HierarchyTransform t) { if (Process()) { if (site.Def.SubSites.Count != site.SubSites.Count) { for (int i = 0; i < site.Def.SubSites.Count; i++) { //has free subSites if (TryAttach()) { foreach (var siteDef in _def.Palette.Shuffle()) { if (site.Def.SubSites[i].CanPlace(site.World, siteDef.Def, t)) { if (DoAttach()) { var instance = site.SubSites[i] = new MapSiteInstance(siteDef, site.Def.SubSites[i].Pos, site.Def.SubSites[i].Rot, false); //var localT = new HierarchyTransform(site.Pos, site.Rot, t); var subT = new HierarchyTransform(instance.Pos, instance.Rot, t); instance.GlobalPos = subT.GlobalPos; instance.GlobalRot = subT.GlobalRot; Sites.Add(instance); var box = new OverlapBox(instance.GlobalPos, Vec2.New(instance.Def.SizeX, instance.Def.SizeY), instance.GlobalRot, instance.AttachedToBottom); site.World.Add(box); _sitesCount++; if (_sitesCount >= _def.SitesCount) { return; } break; } } } } } } } foreach (var subSite in site.SubSites) { var localT = new HierarchyTransform(subSite.Value.Pos, subSite.Value.Rot, t); if (Process()) { ProcessSite(subSite.Value, localT); } if (Process()) { ProcessConnections(site, subSite.Value, localT); } } }
private void DrawSite(MapSiteInstance site) { var ownTransform = new HierarchyTransform(site.GlobalPos, site.GlobalRot, null); ownTransform.DrawAsDir(0.3f); var _rectShape = new RectShapeHandle(); _rectShape.Size = new Vector2f(site.Def.SizeX, site.Def.SizeY); _rectShape.FillColor = Color.Transparent; _rectShape.OutlineThickness = 1; _rectShape.OutlineColor = Color.Red; ownTransform.DrawShapeAt(_rectShape, Vec2.New(0.5f, 0.5f)); foreach (var subSite in site.SubSites) { //siteT.Rotate(subSite.Value.Rot); DrawSite(subSite.Value); } foreach (var con in site.Connections) { //siteT.Rotate(con.Value.Rot); DrawSite(con.Value); } foreach (var shape in site.World._shapes) { if (shape is OverlapBox box) { _rectShape.OutlineColor = Color.Green; _rectShape.Size = new Vector2f(box.Size.X, box.Size.Y); var t = new HierarchyTransform(Vec2.New(box.Pos.X, box.Pos.Y), box.RotAngles, null); t.DrawShapeAt(_rectShape, Vec2.New(0.5f, 0.5f)); } } foreach (var shape in site.World._failedShapes) { if (shape is OverlapBox box) { _rectShape.OutlineColor = Color.Cyan; _rectShape.Size = new Vector2f(box.Size.X, box.Size.Y); var t = new HierarchyTransform(Vec2.New(box.Pos.X, box.Pos.Y), box.RotAngles, null); t.DrawShapeAt(_rectShape, Vec2.New(0.5f, 0.5f)); } } }
public void Setup(MapSiteDef rootSite, Vec2 pos, float rot) { _rootInstance = new MapSiteInstance(rootSite, pos, rot, false); }