ZxAnPhOrIaN Brushbuilders
Cone Builder
00001 //============================================================================= 00002 // ZxAnPhOrIaNConeBuilder. 00003 // This is my FIRST brush builder for UnrealEd! 00004 // What it does is build a better cone than the one that Epic made. 00005 // 00006 //_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_-_=_- 00007 // 00008 // version 1.0 00009 // tornado.f5@worldnet.att.net 00010 // (c) 2002 Nick "ZxAnPhOrIaN" Parker 00011 // 00012 //============================================================================= 00013 class ZxAnPhOrIaNConeBuilder expands ZxAnPhOrIaNBuilders config(ZxAnPhOrIaNbrushBuilders); 00014 00015 00016 // S__________________T___________________R__________________U____________C______T_______S 00017 00018 struct TopTipLocationStruct 00019 { 00020 00021 var() config float Height, CapLocationX, CapLocationY; 00022 00023 }; 00024 var() config TopTipLocationStruct TopTipLocation; 00025 var() config TopTipLocationStruct BottomTipLocation; 00026 00027 struct DimensionsStruct 00028 { 00029 var() config bool UseRadius; 00030 var() config float Radius, Length, Width, OffsetX, OffsetY, OffsetZ; 00031 }; 00032 var() config DimensionsStruct OuterDimensions; 00033 var() config DimensionsStruct InnerDimensions; 00034 00035 struct RotationStruct 00036 { 00037 var() config float RotationX, RotationY; 00038 }; 00039 var() config RotationStruct TopRotation; 00040 var() config RotationStruct BottomRotation; 00041 00042 struct RandomiserTBStruct 00043 { 00044 var() float Height[2], Radius[2], CapLocationX[2], CapLocationY[2]; 00045 }; 00046 var() RandomiserTBStruct RandomiserTop; 00047 var() RandomiserTBStruct RandomiserBottom; 00048 00049 struct RandomiserMStruct 00050 { 00051 var() int Sides[2]; 00052 }; 00053 var() RandomiserMStruct RandomiserMisc; 00054 00055 00056 00057 // O______T_____H_____E_________R____V_____A_____R___I______A_B______L________E________S 00058 var() config int Sides; 00059 var() config name GroupName; 00060 var() config bool HasBottom, MergeCoplanars ; 00061 var() export bool SaveConfiguration; 00062 00063 00064 enum PresetsEnum 00065 { 00066 No_Preset, 00067 Randomiser, 00068 DefaultBBProperties 00069 }; 00070 var() config PresetsEnum Presets; 00071 00072 var int HB; 00073 00074 00075 function DoPresets() 00076 { 00077 // P_____________R___________E______________S____________E________T_______S_____ 00078 00079 if( Presets == DefaultBBProperties) 00080 { 00081 TopRotation.RotationX = 1; 00082 TopRotation.RotationY = 1; 00083 BottomRotation.RotationX = 1; 00084 BottomRotation.RotationY = 1; 00085 HasBottom = False; 00086 MergeCoplanars = True; 00087 Presets = No_Preset; 00088 InnerDimensions.OffsetZ = 0; 00089 OuterDimensions.OffsetZ = 0; 00090 GroupName = 'ZxanCone'; 00091 Sides = 8; 00092 TopTipLocation.Height = 512; 00093 BottomTipLocation.Height = -512; 00094 OuterDimensions.Radius = 512; 00095 InnerDimensions.Radius = 256; 00096 OuterDimensions.Length = 512; 00097 OuterDimensions.Width = 512; 00098 InnerDimensions.Width = 256; 00099 InnerDimensions.Length = 256; 00100 OuterDimensions.UseRadius = True; 00101 InnerDimensions.UseRadius = True; 00102 TopTipLocation.CapLocationX = 0; 00103 TopTipLocation.CapLocationY = 0; 00104 BottomTipLocation.CapLocationX = 0; 00105 BottomTipLocation.CapLocationY = 0; 00106 OuterDimensions.OffsetX = 0; 00107 OuterDimensions.OffsetY = 0; 00108 InnerDimensions.OffsetX = 0; 00109 InnerDimensions.OffsetY = 0; 00110 } 00111 00112 00113 if( Presets == Randomiser) 00114 { 00115 TopTipLocation.Height = RandRange( RandomiserTop.Height[0], RandomiserTop.Height[1]); 00116 BottomTipLocation.Height = RandRange(RandomiserBottom.Height[0], RandomiserBottom.Height[1]); 00117 OuterDimensions.Radius = RandRange(RandomiserTop.Radius[0], RandomiserTop.Radius[1] ) ; 00118 InnerDimensions.Radius = RandRange(RandomiserBottom.Radius[0], RandomiserBottom.Radius[1]); 00119 TopTipLocation.CapLocationX = RandRange(RandomiserTop.CapLocationX[0], RandomiserTop.CapLocationX[1]); 00120 TopTipLocation.CapLocationY = RandRange(RandomiserTop.CapLocationY[0], RandomiserTop.CapLocationY[1]); 00121 BottomTipLocation.CapLocationX =RandRange(RandomiserBottom.CapLocationX[0], RandomiserBottom.CapLocationX[1]); 00122 BottomTipLocation.CapLocationY =RandRange(RandomiserBottom.CapLocationY[0], RandomiserBottom.CapLocationY[1]); 00123 Sides = RandRange(RandomiserMisc.Sides[0], RandomiserMisc.Sides[1]); 00124 HasBottom = False; 00125 00126 // How to Choose between the different options 00127 HB = RandRange(0, 5000); 00128 if( HB >= 2500) 00129 HasBottom = True; 00130 00131 } 00132 00133 } 00134 00135 00136 00137 function BuildCone( int Direction, int Sides, name Item, TopTipLocationStruct TopTipLocation, DimensionsStruct OuterDimensions, RotationStruct TopRotation) 00138 { 00139 00140 local int n,i,j,q; 00141 n = GetVertexCount(); 00142 00143 00144 // Vertices. 00145 if(OuterDimensions.UseRadius == True) 00146 { for( i=0; i<Sides; i++ ) 00147 { Vertex3f( OuterDimensions.OffsetX+OuterDimensions.Radius*sin((2*i+TopRotation.RotationX)*pi/Sides), OuterDimensions.OffsetY+OuterDimensions.Radius*cos((2*i+TopRotation.RotationY)*pi/Sides), OuterDimensions.OffsetZ ); } 00148 } 00149 else 00150 { 00151 for( i=0; i<Sides; i++ ) 00152 { Vertex3f( OuterDimensions.OffsetX+ OuterDimensions.Width*sin((2*i+TopRotation.RotationX)*pi/Sides), OuterDimensions.OffsetY+OuterDimensions.Length*cos((2*i+TopRotation.RotationY)*pi/Sides), OuterDimensions.OffsetZ ); 00153 } 00154 } 00155 Vertex3f( TopTipLocation.CapLocationX, TopTipLocation.CapLocationY, TopTipLocation.Height ); 00156 00157 00158 // Polys. 00159 for( i=0; i<Sides; i++ ) 00160 { Poly3i( Direction, n+i, n+Sides, n+((i+1)%Sides),Item ); } 00161 } 00162 00163 function bool Build() 00164 { 00165 local int i; 00166 00167 DoPresets(); 00168 00169 if( Sides<3 ) 00170 return BadParameters(); 00171 if( TopTipLocation.Height<=0 || OuterDimensions.Radius<=0 ) 00172 return BadParameters(); 00173 if( HasBottom && InnerDimensions.Radius<=0 ) 00174 return BadParameters(); 00175 if( HasBottom && BottomTipLocation.Height>TopTipLocation.Height ) 00176 return BadParameters(); 00177 if( SaveConfiguration == True) 00178 SaveConfiguration = False; 00179 SaveConfig(); 00180 00181 00182 00183 00184 00185 00186 00187 // S+_____________T+_________________A+______________R+___________________T+__________ 00188 BeginBrush( MergeCoplanars, GroupName ); 00189 BuildCone( +1, Sides, 'Top', TopTipLocation, OuterDimensions, TopRotation); 00190 if( HasBottom ) 00191 { 00192 BuildCone( -1, Sides, 'Cap',BottomTipLocation, InnerDimensions, BottomRotation ); 00193 if( OuterDimensions.Radius==InnerDimensions.Radius ^^ OuterDimensions.Radius!=InnerDimensions.Radius) 00194 for( i=0; i<Sides; i++ ) 00195 Poly4i( 1, i, ((i+1)%Sides), Sides+1+((i+1)%Sides), Sides+1+i, 'Bottom' ); 00196 } 00197 else 00198 { 00199 PolyBegin( 1, 'Bottom' ); 00200 for( i=0; i<Sides; i++ ) 00201 Polyi( i ); 00202 PolyEnd(); 00203 } 00204 return EndBrush(); 00205 }
Options that I want to implement but don't know how
Dropped Options
Problems
function bool SafePoly4i( int Direction , int p0 , int p1 , int p2 , int p3 , optional name ItemName, optional int PolyFlags ) { if( isCoplanar4v(getVertex(p0),getVertex(p1),getVertex(p2),getVertex(p3)) ) LogPoly4i( Direction , p0 , p1 , p2 , p3 , ItemName, PolyFlags ); else { LogPoly3i( Direction , p0 , p1 , p2 , ItemName, PolyFlags ); LogPoly3i( Direction , p2 , p3 , p0 , ItemName, PolyFlags ); } }
Tarquin: the above function has the right order for 4 vertices whether in one square or two triangles. The safety-checking isn't quite up to scratch, so you can try it as is, but it will probably end up making triangles in cases when it shouldn't. BTW, I've put a link to this page on [User Projects]? instead of RC. I don't think there's that many people who are making brushbuilders, so it's not really top news.