rott/kf_sources/Editor/Classes/ConeBuilder.uc
2026-07-14 20:27:09 +07:00

79 lines
1.9 KiB
Ucode

//=============================================================================
// ConeBuilder: Builds a 3D cone brush, compatible with cylinder of same size.
//=============================================================================
class ConeBuilder
extends BrushBuilder;
var() float Height, CapHeight, OuterRadius, InnerRadius;
var() int Sides;
var() name GroupName;
var() bool AlignToSide, Hollow;
function BuildCone( int Direction, bool AlignToSide, int Sides, float Height, float Radius, name Item )
{
local int n,i,Ofs;
n = GetVertexCount();
if( AlignToSide )
{
Radius /= cos(pi/Sides);
Ofs = 1;
}
// Vertices.
for( i=0; i<Sides; i++ )
Vertex3f( Radius*sin((2*i+Ofs)*pi/Sides), Radius*cos((2*i+Ofs)*pi/Sides), 0 );
Vertex3f( 0, 0, Height );
// Polys.
for( i=0; i<Sides; i++ )
Poly3i( Direction, n+i, n+Sides, n+((i+1)%Sides), Item );
}
function bool Build()
{
local int i;
if( Sides<3 )
return BadParameters();
if( Height<=0 || OuterRadius<=0 )
return BadParameters();
if( Hollow && (InnerRadius<=0 || InnerRadius>=OuterRadius) )
return BadParameters();
if( Hollow && CapHeight>Height )
return BadParameters();
if( Hollow && (CapHeight==Height && InnerRadius==OuterRadius) )
return BadParameters();
BeginBrush( false, GroupName );
BuildCone( +1, AlignToSide, Sides, Height, OuterRadius, 'Top' );
if( Hollow )
{
BuildCone( -1, AlignToSide, Sides, CapHeight, InnerRadius, 'Cap' );
if( OuterRadius!=InnerRadius )
for( i=0; i<Sides; i++ )
Poly4i( 1, i, ((i+1)%Sides), Sides+1+((i+1)%Sides), Sides+1+i, 'Bottom' );
}
else
{
PolyBegin( 1, 'Bottom' );
for( i=0; i<Sides; i++ )
Polyi( i );
PolyEnd();
}
return EndBrush();
}
defaultproperties
{
Height=256
CapHeight=256
OuterRadius=512
InnerRadius=384
Sides=8
GroupName=Cone
AlignToSide=true
Hollow=false
BitmapFilename="BBCone"
ToolTip="Cone"
}