private void CreateRcs(EntityController entityController, Resolver <IComponentFactory> factories, Entity partEntity, RCSBluePrint rcsBluePrint, Content content)
        {
            var count = 4;
            var step  = MathHelper.TwoPi / count;

            for (var r = 0; r < count; r++)
            {
                var rcsEntity = entityController.CreateEntity("RCS_Root");
                factories.Get <PoseFactory>().Construct(rcsEntity, Vector3.Zero);
                factories.Get <OffsetFactory>().Construct(rcsEntity, Vector3.Zero, 0, 0, step * r, partEntity);
                factories.Get <OpaqueModelFactory>().Construct(rcsEntity, rcsBluePrint.Model);

                var emitters = new Entity[rcsBluePrint.Exhausts.Length];
                for (var i = 0; i < rcsBluePrint.Exhausts.Length; i++)
                {
                    var exhaust       = rcsBluePrint.Exhausts[i];
                    var exhaustEntity = entityController.CreateEntity($"RCS_Exhaust_{i}");
                    factories.Get <PoseFactory>().Construct(exhaustEntity, Vector3.Zero, 0.1f);
                    factories.Get <OffsetFactory>().Construct(exhaustEntity, exhaust.Offset, exhaust.Yaw, exhaust.Pitch, exhaust.Roll, rcsEntity);

                    var emitter = factories.Get <AdditiveEmitterFactory>().ConstructAdditiveEmitter(exhaustEntity, content.Explosion2, 1, 1);
                    emitter.SpawnInterval = 0.0f;
                    emitter.Spread        = 0.1f;
                    emitter.Speed         = 6.0f;
                    emitter.TimeToLive    = 0.15f;

                    emitters[i] = exhaustEntity;
                }

                factories.Get <ReactionControlFactory>().Construct(rcsEntity, emitters);
            }
        }
        private void BuildParts(Content content, Resolver <IComponentFactory> factories, EntityController entityController, Entity root, Model connector, RCSBluePrint rcsBluePrint, int[] rcsPositions, params FuselageBluePrint[] bluePrints)
        {
            var totalHeight   = bluePrints.Sum(x => x.Height);
            var currentHeight = -(totalHeight / 2.0f);

            var children = new Entity[(bluePrints.Length * 2) - 1];
            var c        = 0;

            for (var i = 0; i < bluePrints.Length; i++)
            {
                var bluePrint = bluePrints[i];

                var toCenterOfMass = Vector3.Forward * bluePrint.Height * 0.5f;
                var offset         = (Vector3.Forward * currentHeight) + toCenterOfMass;

                currentHeight += bluePrint.Height;

                var entity = entityController.CreateEntity($"SpaceShip_Part_{i}");
                this.AddPart(factories, root, bluePrint.Model, offset, entity);
                children[c++] = entity;

                if (bluePrint.Exhausts.Length > 0)
                {
                    this.CreateExhausts(entityController, factories, root, entity, bluePrint, content);
                }

                if (rcsPositions.Contains(i))
                {
                    this.CreateRcs(entityController, factories, entity, rcsBluePrint, content);
                }

                if (i < bluePrints.Length - 1)
                {
                    offset += toCenterOfMass;
                    entity  = entityController.CreateEntity($"SpaceShip_Part_Cap_{i}");
                    this.AddPart(factories, root, connector, offset, entity);
                    children[c++] = entity;
                }
            }

            factories.Get <ParentFactory>().Construct(root, children);
        }