Core.Object | +--Engine.Actor | +--Engine.SMActorRotating
float
TimeStamp,TimeStart
bool
bOpen,bOpening,bClosing
vector
vSpeed
vLerp(float Alpha, vector vA, vector vB)
00001 //============================================================================= 00002 // SMActorRotating. 00003 //============================================================================= 00004 00005 class SMActorRotating extends Actor 00006 placeable; 00007 VAR(Rotating) bool bInitiallyOn; 00008 VAR(Rotating) StaticMesh smRotatingMesh; 00009 VAR(Rotating) StaticMesh smStaticMesh; 00010 00011 VAR(Scaling) bool bInitiallyOpen; 00012 VAR(Scaling) float OpeningDelay; 00013 VAR(Scaling) float ClosingDelay; 00014 VAR(Scaling) float OpeningTime; 00015 VAR(Scaling) vector OpenScale3D; 00016 VAR(Scaling) vector ClosedScale3D; 00017 VAR TRANSIENT float TimeStamp,TimeStart; 00018 VAR bool bOpen,bOpening,bClosing; 00019 VAR TRANSIENT vector vSpeed; 00020 00021 Function vector vLerp(float Alpha,vector vA, vector vB) 00022 { 00023 return Alpha*vA+(1-Alpha)*vB; 00024 } 00025 00026 State() ScalingTriggerToggle 00027 { 00028 EVENT BeginState() 00029 { 00030 bOpen=bInitiallyOpen; 00031 SetPhysics(PHYS_None); 00032 if (bOpen) 00033 GotoState('Open'); 00034 else 00035 GotoState('Closed'); 00036 00037 TimeStamp=0.0; 00038 } 00039 } 00040 00041 State Closed 00042 { 00043 EVENT BeginState() 00044 { 00045 SetDrawScale3D(ClosedScale3D); 00046 DebugLog(name@"enter Closed state"); 00047 } 00048 00049 EVENT Trigger(actor Other,pawn EventInstigator) 00050 { 00051 TimeStart=TimeStamp+OpeningDelay; 00052 GotoState('Opening'); 00053 } 00054 00055 } 00056 00057 State Open 00058 { 00059 EVENT BeginState() 00060 { 00061 SetDrawScale3D(OpenScale3D); 00062 DebugLog(name@"Open"); 00063 } 00064 00065 EVENT Trigger(actor Other,pawn EventInstigator) 00066 { 00067 TimeStart=TimeStamp+ClosingDelay; 00068 GotoState('Closing'); 00069 } 00070 } 00071 00072 State Opening 00073 { 00074 EVENT BeginState() 00075 { 00076 DebugLog(name@"Opening"); 00077 enable('Tick'); 00078 } 00079 00080 EVENT EndState() 00081 { 00082 disable('Tick'); 00083 } 00084 00085 EVENT Tick(float dt) 00086 { 00087 LOCAL float relativetime; 00088 TimeStamp+=dt; 00089 relativetime=(TimeStamp-TimeStart)/OpeningTime; 00090 if (relativetime<0) 00091 return; 00092 if (relativetime<1) 00093 { 00094 SetDrawScale3D(vLerp(relativetime,OpenScale3D,ClosedScale3D)); 00095 } 00096 else 00097 { 00098 SetDrawScale3D(OpenScale3D); 00099 bOpen=true; 00100 GotoState('Open'); 00101 } 00102 00103 } 00104 EVENT Trigger(actor Other,pawn EventInstigator) 00105 { 00106 // TimeStart=2*TimeStamp-OpeningTime+TimeStamp; 00107 // TimeStart=TimeStamp+ClosingDelay; 00108 TimeStart = 2 * TimeStamp - OpeningTime - TimeStart; 00109 00110 GotoState('Closing'); 00111 } 00112 00113 } 00114 00115 State Closing 00116 { 00117 EVENT BeginState() 00118 { 00119 DebugLog(name@"Closing"); 00120 enable('Tick'); 00121 } 00122 00123 EVENT EndState() 00124 { 00125 disable('Tick'); 00126 } 00127 00128 EVENT Tick(float dt) 00129 { 00130 LOCAL float relativetime; 00131 TimeStamp+=dt; 00132 relativetime=(TimeStamp-TimeStart)/OpeningTime; 00133 if (relativetime<0) 00134 return; 00135 if (relativetime<1) 00136 { 00137 SetDrawScale3D(vLerp(relativetime,ClosedScale3D,OpenScale3D)); 00138 } 00139 else 00140 { 00141 SetDrawScale3D(ClosedScale3D); 00142 bOpen=false; 00143 GotoState('Closed'); 00144 } 00145 } 00146 EVENT Trigger(actor Other,pawn EventInstigator) 00147 { 00148 TimeStart = 2 * TimeStamp - OpeningTime - TimeStart; 00149 00150 GotoState('Opening'); 00151 } 00152 } 00153 00154 State() TriggerToggle 00155 { 00156 EVENT BeginState() 00157 { 00158 00159 if (bInitiallyOn) 00160 { 00161 if (smRotatingMesh!=none) 00162 StaticMesh=smRotatingMesh; 00163 SetPhysics(PHYS_Rotating); 00164 } 00165 else 00166 { 00167 if (smStaticMesh!=none) 00168 StaticMesh=smStaticMesh; 00169 SetPhysics(PHYS_None); 00170 } 00171 } 00172 00173 EVENT Trigger(actor Other,pawn EventInstigator) 00174 { 00175 if (Physics==PHYS_None) 00176 { 00177 if (smRotatingMesh!=none) 00178 StaticMesh=smRotatingMesh; 00179 SetPhysics(PHYS_Rotating); 00180 } 00181 else 00182 { 00183 if (smStaticMesh!=none) 00184 StaticMesh=smStaticMesh; 00185 SetPhysics(PHYS_None); 00186 } 00187 } 00188 } 00189 00190 State() TriggerControl 00191 { 00192 EVENT BeginState() 00193 { 00194 if (bInitiallyOn) 00195 { 00196 if (smRotatingMesh!=none) 00197 StaticMesh=smRotatingMesh; 00198 SetPhysics(PHYS_Rotating); 00199 } 00200 else 00201 { 00202 if (smStaticMesh!=none) 00203 StaticMesh=smStaticMesh; 00204 SetPhysics(PHYS_None); 00205 } 00206 } 00207 00208 EVENT Trigger(actor Other,pawn EventInstigator) 00209 { 00210 if (smRotatingMesh!=none) 00211 StaticMesh=smRotatingMesh; 00212 SetPhysics(PHYS_Rotating); 00213 } 00214 00215 EVENT Untrigger(actor Other,pawn EventInstigator) 00216 { 00217 if (smStaticMesh!=none) 00218 StaticMesh=smStaticMesh; 00219 SetPhysics(PHYS_None); 00220 } 00221 } 00222 00223 defaultproperties 00224 { 00225 OpeningDelay=3.500000 00226 ClosingDelay=1.500000 00227 OpeningTime=16.000000 00228 OpenScale3D=(X=1.000000,Y=1.000000,Z=1.000000) 00229 ClosedScale3D=(Z=1.000000) 00230 bWorldGeometry=True 00231 bShadowCast=True 00232 bIgnoreDynLight=False 00233 bBlockActors=True 00234 bBlockPlayers=True 00235 bFixedRotationDir=True 00236 Physics=PHYS_Rotating 00237 DrawType=DT_StaticMesh 00238 CollisionRadius=1.000000 00239 CollisionHeight=1.000000 00240 RotationRate=(Pitch=5000) 00241 bEdShouldSnap=True 00242 }