private void AddDiscToFace(GenMesh genmesh, GenMeshFace fac)
        {
            var faceWidth  = fac.Width;
            var faceHeight = fac.Height;
            var depth      = 0.125f * Mathf.Min(faceWidth, faceHeight);

            genmesh.CreateCylinder(
                32,
                depth * 3,
                depth * 4,
                depth,
                GetFaceMatrix(fac, fac.CalculateCenterBounds() + fac.Normal * depth * 0.5f));

            genmesh.CreateCylinder(
                32,
                depth * 1.25f,
                depth * 2.25f,
                0.0f,
                GetFaceMatrix(fac, fac.CalculateCenterBounds() + fac.Normal * depth * 1.05f));

            /*
             * for vert in result['verts']:
             * for face in vert.link_faces:
             * face.material_index = Material.glow_disc
             *
             */
        }
        private void AddSurfaceAntennaToFace(GenMesh genmesh, GenMeshFace fac)
        {
            var horizontalStep = Random.Range(4, 10);
            var verticalStep   = Random.Range(4, 10);

            for (var h = 0; h < horizontalStep; h++)
            {
                var top    = Vector3.Lerp(fac.LeftTop.Coordinates, fac.RightTop.Coordinates, ((float)h + 1) / (horizontalStep + 1));
                var bottom = Vector3.Lerp(fac.LeftBottom.Coordinates, fac.RightBottom.Coordinates, ((float)h + 1) / (horizontalStep + 1));

                for (var v = 0; v < verticalStep; v++)
                {
                    if (Random.value > 0.9f)
                    {
                        var pos           = Vector3.Lerp(top, bottom, ((float)v + 1) / (verticalStep + 1));
                        var faceSize      = Mathf.Sqrt(fac.Area());
                        var depth         = Random.Range(0.1f, 1.5f) * faceSize;
                        var depthShort    = depth * Random.Range(0.02f, 0.15f);
                        var baseDiameter  = Random.Range(0.005f, 0.05f);
                        var materialIndex = Random.value > 0.5f ? 0 /*Material.hull*/ : 1;/*Material.hull_dark*/

                        // Spire
                        var numSegments = Random.Range(3, 6);
                        genmesh.CreateCylinder(numSegments, 0, baseDiameter, depth, GetFaceMatrix(fac, pos + fac.Normal * depth * 0.5f));

                        //for vert in result['verts']:
                        //    for vert_face in vert.link_faces:
                        //        vert_face.material_index = material_index
                        //    }

                        // Base
                        genmesh.CreateCylinder(
                            numSegments,
                            baseDiameter * Random.Range(1f, 1.5f),
                            baseDiameter * Random.Range(1.5f, 2f),
                            depthShort,
                            GetFaceMatrix(fac, pos + fac.Normal * depthShort * 0.45f));

                        //    for vert in result['verts']:
                        //for vert_face in vert.link_faces:
                        //    vert_face.material_index = material_index
                    }
                }
            }
        }
        private void AddWeaponsToFace(GenMesh genmesh, GenMeshFace fac)
        {
            var horizontalStep = Random.Range(1, 3);
            var verticalStep   = Random.Range(1, 3);
            var numSegments    = 16;

            var weaponSize  = 0.5f * Mathf.Min(fac.Width / (horizontalStep + 2), fac.Height / (verticalStep + 2));
            var weaponDepth = weaponSize * 0.2f;

            for (var h = 0; h < horizontalStep; h++)
            {
                var top    = Vector3.Lerp(fac.LeftTop.Coordinates, fac.RightTop.Coordinates, (float)(h + 1) / (horizontalStep + 1));
                var bottom = Vector3.Lerp(fac.LeftBottom.Coordinates, fac.RightBottom.Coordinates, (float)(h + 1) / (horizontalStep + 1));

                for (var v = 0; v < verticalStep; v++)
                {
                    var pos        = Vector3.Lerp(top, bottom, (float)(v + 1) / (verticalStep + 1));
                    var faceMatrix = GetFaceMatrix(fac, pos + fac.Normal * weaponDepth * 0.5f) *
                                     Matrix4x4.Rotate(Quaternion.AngleAxis(Random.Range(0, 90), new Vector3(0, 0, 1)));


                    // Turret foundation
                    genmesh.CreateCylinder(numSegments, weaponSize * 0.9f, weaponSize, weaponDepth, faceMatrix);

                    // Turret left guard
                    var leftGuardMat = faceMatrix *
                                       Matrix4x4.Rotate(Quaternion.AngleAxis(90, new Vector3(0, 1, 0))) *
                                       Matrix4x4.Translate(new Vector3(0, 0, weaponSize * 0.6f));
                    genmesh.CreateCylinder(numSegments, weaponSize * 0.6f, weaponSize * 0.5f, weaponDepth * 2, leftGuardMat);

                    // Turret right guard
                    var rightGuardMat = faceMatrix *
                                        Matrix4x4.Rotate(Quaternion.AngleAxis(90, new Vector3(0, 1, 0))) *
                                        Matrix4x4.Translate(new Vector3(0, 0, weaponSize * -0.6f));
                    genmesh.CreateCylinder(numSegments, weaponSize * 0.5f, weaponSize * 0.6f, weaponDepth * 2, rightGuardMat);

                    // Turret housing
                    var upwardAngle    = Random.Range(0, 45);
                    var turretHouseMat = faceMatrix *
                                         Matrix4x4.Rotate(Quaternion.AngleAxis(upwardAngle, new Vector3(1, 0, 0))) *
                                         Matrix4x4.Translate(new Vector3(0, weaponSize * -0.4f, 0));
                    genmesh.CreateCylinder(8, weaponSize * 0.4f, weaponSize * 0.4f, weaponDepth * 5, turretHouseMat);

                    // Turret barrels L + R
                    genmesh.CreateCylinder(8, weaponSize * 0.1f, weaponSize * 0.1f, weaponDepth * 6, turretHouseMat *
                                           Matrix4x4.Translate(new Vector3(weaponSize * 0.2f, 0, -weaponSize)));
                    genmesh.CreateCylinder(8, weaponSize * 0.1f, weaponSize * 0.1f, weaponDepth * 6, turretHouseMat *
                                           Matrix4x4.Translate(new Vector3(weaponSize * -0.2f, 0, -weaponSize)));
                }
            }
        }
        private void AddCylindersToFace(GenMesh genmesh, GenMeshFace fac)
        {
            var horizontalStep   = Random.Range(1, 3);
            var verticalStep     = Random.Range(1, 3);
            var numberOfSegments = Random.Range(6, 12);
            var faceWidth        = fac.Width;
            var faceHeight       = fac.Height;
            var cylinderDepth    = 1.3f * Mathf.Min(faceWidth / (horizontalStep + 2), faceHeight / (verticalStep + 2));
            var cylinderSize     = cylinderDepth * 0.5f;

            for (var h = 0; h < horizontalStep; h++)
            {
                var top    = Vector3.Lerp(fac.LeftTop.Coordinates, fac.RightTop.Coordinates, ((float)h + 1) / (horizontalStep + 1));
                var bottom = Vector3.Lerp(fac.LeftBottom.Coordinates, fac.RightBottom.Coordinates, ((float)h + 1) / (horizontalStep + 1));

                for (var v = 0; v < verticalStep; v++)
                {
                    var pos            = Vector3.Lerp(top, bottom, ((float)v + 1) / (verticalStep + 1));
                    var cylinderMatrix = GetFaceMatrix(fac, pos) * Matrix4x4.Rotate(Quaternion.AngleAxis(90, new Vector3(0, 1, 0)));

                    genmesh.CreateCylinder(numberOfSegments, cylinderSize, cylinderSize, cylinderDepth, cylinderMatrix);
                }
            }
        }