/// <summary> /// Calculates the absolute polygon of a region given a new location, /// using the region's reference point and relative polygon /// </summary> /// <param name="location"></param> /// <param name="region"></param> /// <returns></returns> private Polygon3D GetAbsolutePolygon(Vec2D refPoint, Polygon2D relativePolygon) { //Vec2D difference = refPoint.VectorDistanceTo(location); Polygon3D absolute = new Polygon3D(0,0); foreach (Vec2D vertex in relativePolygon.getVertices()) { absolute.AddVertex(vertex.Add(refPoint)); } return absolute; }
Polygon3D createAbsoluteCollisionShape(Polygon3D relShape, LocationValue loc) { Polygon3D absShape = new Polygon3D(relShape.BottomZ + loc.Z, relShape.TopZ + loc.Z); foreach (Vec2D v in relShape.Footprint.getVertices()) { v.X += loc.X; v.Y += loc.Y; absShape.AddVertex(v); } return absShape; }
private void NewObject(SimulationEvent e) { //objectProxies = bbClient.GetObjectProxies(); string id = ((StringValue)e["ID"]).value; string type = ((StringValue)e["ObjectType"]).value; if (objectProxies == null) { objectProxies = new Dictionary<string, SimulationObjectProxy>(); } SimulationObjectProxy prox = bbClient.GetObjectProxy(id); if (prox != null) { if (!objectProxies.ContainsKey(id)) { objectProxies.Add(id, prox); } else { objectProxies[id] = prox; } } if (((StringValue)e["ObjectType"]).value == "LandRegion") { StateDB.LandRegion l = new StateDB.LandRegion(((StringValue)e["ID"]).value, null); Polygon2D poly = new Polygon2D(); foreach (PolygonValue.PolygonPoint pp in ((PolygonValue)((AttributeCollectionValue)e["Attributes"]).attributes["Polygon"]).points) { poly.AddVertex(new Vec2D(pp.X, pp.Y)); } l.poly = poly; StateDB.landRegions[l.id] = l; } else if (((StringValue)e["ObjectType"]).value == "ActiveRegion") { StateDB.ActiveRegion b = new StateDB.ActiveRegion(((StringValue)e["ID"]).value, null); double start = ((DoubleValue)((AttributeCollectionValue)e["Attributes"]).attributes["StartHeight"]).value; double end = ((DoubleValue)((AttributeCollectionValue)e["Attributes"]).attributes["EndHeight"]).value; Polygon3D poly2 = new Polygon3D(start, end); foreach (PolygonValue.PolygonPoint pp in ((PolygonValue)((AttributeCollectionValue)e["Attributes"]).attributes["Polygon"]).points) { poly2.AddVertex(new Vec2D(pp.X, pp.Y)); } b.poly = poly2; if (((BooleanValue)((AttributeCollectionValue)e["Attributes"]).attributes["BlocksMovement"]).value) { b.blockingRegion = true; } else { b.blockingRegion = false; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("SpeedMultiplier")) { b.speedMultiplier = ((DoubleValue)((AttributeCollectionValue)e["Attributes"]).attributes["SpeedMultiplier"]).value; } else { b.speedMultiplier = 1; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("IsVisible")) { b.isVisible = ((BooleanValue)((AttributeCollectionValue)e["Attributes"]).attributes["IsVisible"]).value; } else { b.isVisible = false; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("DisplayColor")) { b.displayColor = ((IntegerValue)((AttributeCollectionValue)e["Attributes"]).attributes["DisplayColor"]).value; } else { b.displayColor = -10185235; } //b.displayColor = -10185235; //b.isVisible = true; StateDB.activeRegions[b.id] = b; } }
Polygon3D createRelativeCollisionShape(Double size) { Polygon3D shape = new Polygon3D(-size, size); for (int i = 0; i < 8; i++) { Double theta = (2 * Math.PI / 8) * i; double x = size * Math.Cos(theta); double y = size * Math.Sin(theta); shape.AddVertex(new Vec2D(x, y)); } return shape; }
private void NewObject(SimulationEvent e) { //objectProxies = bbClient.GetObjectProxies(); string id = ((StringValue)e["ID"]).value; string type = ((StringValue)e["ObjectType"]).value; if (objectProxies == null) { objectProxies = new Dictionary<string, SimulationObjectProxy>(); } SimulationObjectProxy prox = bbClient.GetObjectProxy(id); if (prox != null) { if (!objectProxies.ContainsKey(id)) { objectProxies.Add(id, prox); } else { objectProxies[id] = prox; } } if (((StringValue)e["ObjectType"]).value == "LandRegion") { StateDB.LandRegion l = new StateDB.LandRegion(((StringValue)e["ID"]).value, null); Polygon2D poly = new Polygon2D(); foreach (PolygonValue.PolygonPoint pp in ((PolygonValue)((AttributeCollectionValue)e["Attributes"]).attributes["Polygon"]).points) { poly.AddVertex(new Vec2D(pp.X, pp.Y)); } l.poly = poly; StateDB.landRegions[l.id] = l; } else if (((StringValue)e["ObjectType"]).value == "ActiveRegion") { StateDB.ActiveRegion b = new StateDB.ActiveRegion(((StringValue)e["ID"]).value, null); double start = ((DoubleValue)((AttributeCollectionValue)e["Attributes"]).attributes["StartHeight"]).value; double end = ((DoubleValue)((AttributeCollectionValue)e["Attributes"]).attributes["EndHeight"]).value; Polygon3D poly2 = new Polygon3D(start, end); foreach (PolygonValue.PolygonPoint pp in ((PolygonValue)((AttributeCollectionValue)e["Attributes"]).attributes["Polygon"]).points) { poly2.AddVertex(new Vec2D(pp.X, pp.Y)); } b.poly = poly2; b.currentAbsolutePolygon = poly2; if (((BooleanValue)((AttributeCollectionValue)e["Attributes"]).attributes["BlocksMovement"]).value) { b.blockingRegion = true; } else { b.blockingRegion = false; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("SpeedMultiplier")) { b.speedMultiplier = ((DoubleValue)((AttributeCollectionValue)e["Attributes"]).attributes["SpeedMultiplier"]).value; } else { b.speedMultiplier = 1; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("IsVisible")) { b.isVisible = ((BooleanValue)((AttributeCollectionValue)e["Attributes"]).attributes["IsVisible"]).value; } else { b.isVisible = false; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("DisplayColor")) { b.displayColor = ((IntegerValue)((AttributeCollectionValue)e["Attributes"]).attributes["DisplayColor"]).value; } else { b.displayColor = -10185235; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("IsDynamicRegion")) { b.isDynamicRegion = ((BooleanValue)((AttributeCollectionValue)e["Attributes"]).attributes["IsDynamicRegion"]).value; } else { b.isDynamicRegion = false; } if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("ReferencePoint") && !b.isDynamicRegion) //if isDynamic, will use its LinkedObject as Ref. { b.referencePoint = new Vec2D(((LocationValue)((AttributeCollectionValue)e["Attributes"]).attributes["ReferencePoint"])); b.currentAbsolutePolygon = GetAbsolutePolygon(b.referencePoint, poly2.Footprint); } else { b.referencePoint = new Vec2D(0,0); } //Make separate lists for dynamic and active regions in StateDB if (b.isDynamicRegion) { StateDB.dynamicRegions[b.id] = b; } else { StateDB.activeRegions[b.id] = b; } } }