protected override void Init(MyObjectBuilder_DefinitionBase def) { base.Init(def); var ob = (MyObjectBuilder_BendyShapeComponentDefinition)def; Width = ob.Width; if (Width <= 0) { MyDefinitionErrors.Add(def.Package, $"{GetType().Name} {def.GetId()} has {nameof(Width)}={Width} <= 0", LogSeverity.Warning); } Height = ob.Height; if (Height <= 0) { MyDefinitionErrors.Add(def.Package, $"{GetType().Name} {def.GetId()} has {nameof(Height)}={Height} <= 0", LogSeverity.Warning); } Segments = ob.Segments; if (Segments <= 0) { MyDefinitionErrors.Add(def.Package, $"{GetType().Name} {def.GetId()} has {nameof(Segments)}={Segments} <= 0", LogSeverity.Warning); } VolumeErrorTolerance = ob.VolumeErrorTolerance ?? 0.1f; }
protected override void Init(MyObjectBuilder_DefinitionBase builder) { base.Init(builder); var def = (MyObjectBuilder_BendyComponentDefinition)builder; #region Config Layer = def.Layer; if (string.IsNullOrWhiteSpace(Layer)) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} has {nameof(Layer)} that is null or whitespace", LogSeverity.Error); } var nodes = new ImmutableNode[def.Nodes?.Length ?? 0]; if (def.Nodes != null) { for (var i = 0; i < def.Nodes.Length; i++) { var n = def.Nodes[i]; var m = Matrix.CreateWorld(n.Position, n.Forward, n.Up); if (Vector3.IsZero(m.Forward)) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} node {i} has an invalid matrix forward", LogSeverity.Error); } if (Vector3.IsZero(m.Up)) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} node {i} has an invalid matrix up", LogSeverity.Error); } if (Math.Abs(m.Forward.Dot(m.Up)) > 1e-3f) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} node {i} has an invalid matrix", LogSeverity.Error); } nodes[i] = new ImmutableNode(m, n.Movable); } } var edges = new ImmutableEdge[def.Edges?.Length ?? 0]; if (edges.Length > 0 && nodes.Length == 0) { throw new Exception($"Component {builder.GetId()} has edges when it has no nodes. Unrecoverable."); } if (def.Edges != null) { for (var i = 0; i < def.Edges.Length; i++) { var e = def.Edges[i]; var n0 = MathHelper.Clamp((int)e.From, 0, nodes.Length - 1); var n1 = MathHelper.Clamp((int)e.To, 0, nodes.Length - 1); if (n0 != e.From) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} edge {i} refers to an invalid from", LogSeverity.Error); } if (n1 != e.To) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} edge {i} refers to an invalid to", LogSeverity.Error); } var bones = e.Bones?.Split(null).Where(x => !string.IsNullOrWhiteSpace(x)).ToArray(); edges[i] = new ImmutableEdge((uint)n0, (uint)n1, e.Mode, bones != null ? new ReadOnlyList <string>(bones) : null, e.Control1, e.Control2); } } Nodes = new ReadOnlyList <ImmutableNode>(nodes); Edges = new ReadOnlyList <ImmutableEdge>(edges); #endregion #region Bone Meta var tmp = new Dictionary <string, List <BoneEdgeMetadata> >(); for (var i = 0; i < Edges.Count; i++) { var e = Edges[i]; if (e.Bones == null || e.Bones.Count <= 0) { continue; } for (var index = 0; index < e.Bones.Count; index++) { var b = e.Bones[index]; List <BoneEdgeMetadata> src; if (!tmp.TryGetValue(b, out src)) { tmp.Add(b, src = new List <BoneEdgeMetadata>()); } src.Add(new BoneEdgeMetadata((uint)i, index / (float)(e.Bones.Count - 1), 1f)); } } BoneMetadata = tmp.ToDictionary(x => x.Key, x => { var totalBoneWeight = x.Value.Sum(y => y.EdgeWeight); var dest = new List <BoneEdgeMetadata>(x.Value.Count); foreach (var old in x.Value) { if (old.EdgeWeight < 0) { continue; } dest.Add(new BoneEdgeMetadata(old.Edge, old.EdgeFactor, old.EdgeWeight / totalBoneWeight)); } return((IReadOnlyList <BoneEdgeMetadata>) new ReadOnlyList <BoneEdgeMetadata>(dest)); }); #endregion #region Constraints Distance = def.Distance?.Immutable() ?? new ImmutableRange <float>(RailConstants.DefaultMinLength, RailConstants.DefaultMaxLength); if (Distance.Min > Distance.Max) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} distance has min > max", LogSeverity.Error); } PreferredDistance = def.PreferredDistance ?? ((Distance.Max + Distance.Min) / 2); MaxAngleDegrees = def.MaxAngleDegrees ?? RailConstants.DefaultMaxAngleDegrees; if (MaxAngleDegrees < 0) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} max angle is less than zero", LogSeverity.Error); } MaxGradeRatio = def.MaxGradeRatio ?? RailConstants.DefaultMaxGradeRatio; if (MaxGradeRatio < 0) { MyDefinitionErrors.Add(def.Package, $"{nameof(BendyComponentDefinition)} {builder.GetId()} max grade ratio is less than zero", LogSeverity.Error); } #endregion }
protected override void Init(MyObjectBuilder_DefinitionBase builder) { base.Init(builder); var ob = (MyObjectBuilder_EdgePlacerBehaviorDefinition)builder; Layer = ob.Layer; if (string.IsNullOrWhiteSpace(Layer)) { MyDefinitionErrors.Add(builder.Package, $"{nameof(EdgePlacerBehaviorDefinition)} {builder.GetId()} has {nameof(Layer)} that is null", LogSeverity.Error); } Placed = ob.Placed; if (Placed.TypeId.IsNull) { MyDefinitionErrors.Add(builder.Package, $"{nameof(EdgePlacerBehaviorDefinition)} {builder.GetId()} has {nameof(Placed)} that is null", LogSeverity.Error); } CrosshairPrefix = ob.CrosshairPrefix; CrosshairPlace = Create("Place", MyCrosshairIconInfo.IconPosition.TopLeftCorner); CrosshairPlaceNoPermission = Create("PlaceNoPerm", MyCrosshairIconInfo.IconPosition.TopLeftCorner); CrosshairQuestion = Create("Question", MyCrosshairIconInfo.IconPosition.Center); CrosshairRemove = Create("Remove", MyCrosshairIconInfo.IconPosition.TopRightCorner); CrosshairRemoveNoPermission = Create("RemoveNoPerm", MyCrosshairIconInfo.IconPosition.TopRightCorner); }