コード例 #1
0
        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;
        }
コード例 #2
0
        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
        }
コード例 #3
0
        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);
        }