Files
sbox-public/game/addons/tools/Code/MeshEditor/Primitives/Cylinder.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

47 lines
1.2 KiB
C#

using System;
namespace Editor.MeshEditor;
[Title( "Cylinder" ), Icon( "circle" )]
internal class CylinderPrimitive : PrimitiveBuilder
{
[Title( "Number of sides" )]
public int NumberOfSides { get; set; } = 16;
[Hide] public Vector3 Center { get; set; }
[Hide] public Vector3 Size { get; set; }
public override void SetFromBox( BBox box )
{
Center = box.Center;
Size = box.Size;
}
public override void Build( PolygonMesh mesh )
{
var points = new Vector3[NumberOfSides];
var halfSize = Size / 2;
for ( int i = 0; i < NumberOfSides; i++ )
{
var angle = i * (MathF.PI * 2.0f / NumberOfSides);
points[i] = Center + new Vector3( MathF.Sin( angle ), MathF.Cos( angle ), -1.0f ) * halfSize;
}
mesh.AddFace( points.Select( x => x.WithZ( Center.z + halfSize.z ) ).Reverse().ToArray() ); // top face
mesh.AddFace( points.Select( x => x.WithZ( Center.z - halfSize.z ) ).ToArray() ); // bottom face
// sides
for ( int i = 0; i < NumberOfSides; i++ )
{
var nextIndex = (i + 1) % NumberOfSides;
mesh.AddFace(
points[i].WithZ( Center.z + halfSize.z ),
points[nextIndex].WithZ( Center.z + halfSize.z ),
points[nextIndex].WithZ( Center.z - halfSize.z ),
points[i].WithZ( Center.z - halfSize.z )
);
}
}
}