public SSpaceMissileClusterVisualData( Matrix4 launcherWorldMat, Vector3 launcherVel, int numMissiles, ISSpaceMissileTarget target, float timeToHit, SSpaceMissileVisualParameters mParams, Vector3[] meshPositioningOffsets = null, Vector3[] meshPositioningDirections = null, BodiesFieldGenerator meshPositioningGenerator = null, SSpaceMissileVisualData.AtTargetFunc atTargetFunc = null) { _target = target; _timeToHit = timeToHit; _parameters = mParams; _missiles = new SSpaceMissileVisualData[numMissiles]; this.atTargetFunc = atTargetFunc; Vector3[] localSpawnPts = new Vector3[numMissiles]; Quaternion[] localSpawnOrients = new Quaternion[numMissiles]; if (meshPositioningGenerator != null) { meshPositioningGenerator.Generate(numMissiles, (id, scale, pos, orient) => { localSpawnPts [id] = pos; localSpawnOrients [id] = orient; return true; } ); } Quaternion launcherOrientation = launcherWorldMat.ExtractRotation(); for (int i = 0; i < numMissiles; ++i) { if (meshPositioningOffsets != null && meshPositioningOffsets.Length > 0) { localSpawnPts [i] += meshPositioningOffsets [i % meshPositioningOffsets.Length]; } if (meshPositioningDirections != null && meshPositioningDirections.Length > 0) { int idx = i % meshPositioningDirections.Length; localSpawnOrients [i] *= OpenTKHelper.getRotationTo( Vector3.UnitZ, meshPositioningDirections [idx], Vector3.UnitZ); } Vector3 missileWorldPos = Vector3.Transform(localSpawnPts [i], launcherWorldMat); Vector3 missileLocalDir = Vector3.Transform(Vector3.UnitZ, localSpawnOrients [i]); Vector3 missileWorldDir = Vector3.Transform(missileLocalDir, launcherOrientation); Vector3 missileWorldVel = launcherVel + missileWorldDir * mParams.ejectionVelocity; _missiles [i] = mParams.createMissile( missileWorldPos, missileWorldDir, missileWorldVel, this, i); #if false _missiles [i] = new SSpaceMissileVisualData ( missileWorldPos, missileWorldDir, missileWorldVel, this, clusterId: i); #endif } }
public void removeMissile(SSpaceMissileVisualData missile) { missile.terminate(); }
public SSpaceMissileClusterVisualData launchCluster( Matrix4 launcherWorldMat, Vector3 launchVel, int numMissiles, ISSpaceMissileTarget target, float timeToHit, SSpaceMissileVisualParameters clusterParams, Vector3[] localPositioningOffsets = null, Vector3[] localDirectionPresets = null, BodiesFieldGenerator meshPositioningGenerator = null, SSpaceMissileVisualData.AtTargetFunc atTargetFunc = null ) { var cluster = new SSpaceMissileClusterVisualData ( launcherWorldMat, launchVel, numMissiles, target, timeToHit, clusterParams, localPositioningOffsets, localDirectionPresets, meshPositioningGenerator, atTargetFunc ); _clusters.Add(cluster); _targets.Add(target); return cluster; }