Originally posted by Spoof
View Post
Code:
SMC = new(self) class'SplineLoftActor_SMC'; SMC.SetTranslation(argLocation + vect(0,0,40)); SMC.SetRotation(Rotator(argRotation)); SMC.SetScale3D(tVect); //Needs to match a pre-cached physics scale to work properly AttachComponent(SMC); SMC.InitRBPhys();
Here's my full Collidable actor, which auto adjusts the collision mesh (with pre-cached physics scales) to reduce the # of components. Still need to implement handling for curves and implement collision meshes that can go across multiple straight splines:
Code:
class SplineLoftActor_Collidable extends SplineLoftActor; var vector loc,rot; var int collisionSpacing; var int collisionRemaining; var int collisionTaken,j; var int MaxSpace; var SplineLoftActor_SMC SMC_Init; enum WCollisionSizeEnum { e25, e50, e100, e200, e300, e400, e600, e800, }; var WCollisionSizeEnum tSize; event PostBeginPlay(){ super.PostBeginPlay(); CreateCollision(); } function CreateCollision(){ local float splineLength; local int i; if(Connections.Length > 0){ splineLength = Connections[0].SplineComponent.GetSplineLength(); collisionRemaining=splineLength; if(Connections[0].SplineComponent.SplineCurviness > 0.99){ i=0; while(collisionRemaining > MaxSpace){ if(collisionRemaining > 800){ tSize = e800; collisionTaken = 800; }else if(collisionRemaining > 600){ tSize = e600; collisionTaken = 600; }else if(collisionRemaining > 400){ tSize = e400; collisionTaken = 400; }else if(collisionRemaining > 300){ tSize = e300; collisionTaken = 300; }else if(collisionRemaining > 200){ tSize = e200; collisionTaken = 200; }else if(collisionRemaining > 100){ tSize = e100; collisionTaken = 100; }else if(collisionRemaining > 50){ tSize = e50; collisionTaken = 50; }else if(collisionRemaining > 25){ tSize = e25; collisionTaken = 25; } i+=collisionTaken*0.5f; loc = Connections[0].SplineComponent.GetLocationAtDistanceAlongSpline(i); rot = Connections[0].SplineComponent.GetTangentAtDistanceAlongSpline(i); spawnColliderInstance(loc,rot); j+=1; //`log(loc); //`log("Created "$j$": "$collisionTaken$" at "$i); collisionRemaining-=collisionTaken; i+=collisionTaken*0.5f; if(collisionRemaining <= MaxSpace){ //`log("Finished with collisionRemaining: "$collisionRemaining$" and "$i$"/"$splineLength); } } //`log("collisionRemaining: "$collisionRemaining); } } for(i=0;i<SplineMeshComps.Length;i++){ SplineMeshComps[i].SetBlockRigidBody(false); } } function spawnColliderInstance(Vector argLocation, Vector argRotation){ local SplineLoftActor_SMC SMC; local Vector tVect; tVect.X = 0.25f; tVect.Y = 2.5f; tVect.Z = 1.f; switch(tSize){ case e25: tVect.X = 0.25f; break; case e50: tVect.X = 0.5f; break; case e100: tVect.X = 1.0f; break; case e200: tVect.X = 2.0f; break; case e300: tVect.X = 3.0f; break; case e400: tVect.X = 4.0f; break; case e600: tVect.X = 6.0f; break; case e800: tVect.X = 8.0f; break; default: tVect.X = 1.0f; break; } SMC = new(self) class'SplineLoftActor_SMC'; SMC.SetTranslation(argLocation + vect(0,0,40)); SMC.SetRotation(Rotator(argRotation)); SMC.SetScale3D(tVect); AttachComponent(SMC); SMC.InitRBPhys(); } defaultproperties { bEdShouldSnap=true bStatic=true bMovable=false bCollideActors=false bBlockActors=false bWorldGeometry=false bGameRelevant=true bCollideWhenPlacing=false CollisionType=COLLIDE_BlockAll BlockRigidBody=false bCollideAsEncroacher = true tSize = e200 j=0 MaxSpace=50 bAlwaysEncroachCheck=true }
Code:
class SplineLoftActor_SMC extends StaticMeshComponent; DefaultProperties { // Various physics related items need to be ticked pre physics update TickGroup=TG_PreAsyncWork WireframeColor=(R=0,G=255,B=255,A=255) bAcceptsStaticDecals=TRUE bAcceptsDecals=TRUE bOverrideLightMapResolution=TRUE OverriddenLightMapResolution=0 bOverrideLightMapRes=FALSE OverriddenLightMapRes=64 bUsePrecomputedShadows=FALSE SubDivisionStepSize=32 bUseSubDivisions=TRUE bForceStaticDecals=FALSE bCanHighlightSelectedSections=false StreamingDistanceMultiplier=1.0 RBCollideWithChannels=(Default=TRUE,BlockingVolume=TRUE,GameplayPhysics=TRUE,EffectPhysics=TRUE,Vehicle=TRUE,Untitled4=TRUE,Untitled3=true,Pawn=TRUE) RBChannel=RBCC_GameplayPhysics StaticMesh=StaticMesh'WarsawTest.roads.RoadCollision' HiddenGame=false Translation=(X=0.0,Y=0.0,Z=0.0) Scale3D=(X=1.0,Y=2.5,Z=1.0) AbsoluteRotation=true AbsoluteScale=true AbsoluteTranslation=true BlockRigidBody=true BlockNonZeroExtent=True BlockZeroExtent=true BlockActors=true CollideActors=true bDisableAllRigidBody=false AlwaysCheckCollision=false bBlockFootPlacement=false }
Comment