mirror of
https://github.com/Facepunch/sbox-public.git
synced 2026-04-19 05:48:07 -04:00
This commit imports the C# engine code and game files, excluding C++ source code. [Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
95 lines
2.3 KiB
C#
95 lines
2.3 KiB
C#
using System;
|
|
|
|
namespace Editor.MeshEditor;
|
|
|
|
[Title( "Stairs" ), Icon( "stairs" )]
|
|
public class StairsPrimitive : PrimitiveBuilder
|
|
{
|
|
[Title( "Number of steps" ), Range( 2, 64 )]
|
|
public int NumberOfSteps { get; set; } = 16;
|
|
|
|
[Hide] private Vector3 Center;
|
|
[Hide] private Vector3 Size;
|
|
[Hide] private float StepWidth;
|
|
[Hide] private float StepDepth;
|
|
[Hide] private float StepHeight;
|
|
|
|
public override void SetFromBox( BBox box )
|
|
{
|
|
NumberOfSteps = Math.Max( NumberOfSteps, 2 );
|
|
Size = box.Size;
|
|
Center = box.Mins;
|
|
StepHeight = Size.z / NumberOfSteps;
|
|
StepDepth = Size.x / NumberOfSteps;
|
|
StepWidth = Size.y;
|
|
}
|
|
|
|
public override void Build( PolygonMesh mesh )
|
|
{
|
|
var vertices = new Vector3[(NumberOfSteps + 1) * 2];
|
|
|
|
for ( var stepIndex = 0; stepIndex <= NumberOfSteps; stepIndex++ )
|
|
{
|
|
float depth = StepDepth * stepIndex;
|
|
var innerPoint = Vector3.Forward * depth;
|
|
var outerPoint = Vector3.Left * StepWidth + Vector3.Forward * depth;
|
|
|
|
vertices[stepIndex * 2] = Center + innerPoint;
|
|
vertices[stepIndex * 2 + 1] = Center + outerPoint;
|
|
}
|
|
|
|
for ( var stepIndex = 0; stepIndex < NumberOfSteps; stepIndex++ )
|
|
{
|
|
var lastHeightOffset = Center.z + StepHeight * stepIndex;
|
|
var stepHeightOffset = Center.z + StepHeight * (stepIndex + 1);
|
|
|
|
var innerPoint = vertices[stepIndex * 2].WithZ( stepHeightOffset );
|
|
var outerPoint = vertices[stepIndex * 2 + 1].WithZ( stepHeightOffset );
|
|
|
|
var innerPoint2 = vertices[(stepIndex + 1) * 2].WithZ( stepHeightOffset );
|
|
var outerPoint2 = vertices[(stepIndex + 1) * 2 + 1].WithZ( stepHeightOffset );
|
|
|
|
var lastInnerPoint = vertices[(stepIndex) * 2].WithZ( lastHeightOffset );
|
|
var lastOuterPoint = vertices[(stepIndex) * 2 + 1].WithZ( lastHeightOffset );
|
|
|
|
mesh.AddFace(
|
|
innerPoint2,
|
|
outerPoint2,
|
|
outerPoint,
|
|
innerPoint
|
|
);
|
|
|
|
mesh.AddFace(
|
|
innerPoint,
|
|
outerPoint,
|
|
lastOuterPoint,
|
|
lastInnerPoint
|
|
);
|
|
|
|
mesh.AddFace(
|
|
vertices[(stepIndex + 1) * 2],
|
|
innerPoint2,
|
|
innerPoint,
|
|
vertices[stepIndex * 2]
|
|
);
|
|
|
|
mesh.AddFace(
|
|
outerPoint,
|
|
outerPoint2,
|
|
vertices[(stepIndex + 1) * 2 + 1],
|
|
vertices[stepIndex * 2 + 1]
|
|
);
|
|
}
|
|
|
|
var backInnerPoint = vertices[^2].WithZ( Center.z + Size.z );
|
|
var backOuterPoint = vertices[^1].WithZ( Center.z + Size.z );
|
|
|
|
mesh.AddFace(
|
|
vertices[^2],
|
|
vertices[^1],
|
|
backOuterPoint,
|
|
backInnerPoint
|
|
);
|
|
}
|
|
}
|