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 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 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); }
public SSpaceMissileClusterVisualData launchCluster( Matrix4 launcherWorldMat, Vector3 launchVel, int numMissiles, ISSpaceMissileTarget target, SSpaceMissileVisualParameters clusterParams, Vector3[] localPositioningOffsets = null, Vector3[] localDirections = null, BodiesFieldGenerator localPositioningGenerator = null, SSpaceMissileVisualData.AtTargetFunc missileAtTargetFunc = null, float timeToHit = float.NaN ) { _initParamsSpecific(clusterParams); var cluster = _simulation.launchCluster( launcherWorldMat, launchVel, numMissiles, target, timeToHit, clusterParams, localPositioningOffsets, localDirections, localPositioningGenerator, missileAtTargetFunc); foreach (var missile in cluster.missiles) { _addMissileRender(missile); } return(cluster); }
protected void _initParamsSpecific(SSpaceMissileVisualParameters mParams) { // smoke effectors if (_particleRenderer.textureMaterial == null) { _particleRenderer.textureMaterial = new SSTextureMaterial(mParams.smokeParticlesTexture()); } if (_flameSmokeColorEffector == null) { _flameSmokeColorEffector = new SSColorKeyframesEffector(); _flameSmokeColorEffector.maskMatchFunction = SSParticleEffector.MatchFunction.Equals; _flameSmokeColorEffector.effectorMask = (ushort)ParticleEffectorMasks.FlameToSmoke; _flameSmokeColorEffector.particleLifetime = mParams.flameSmokeDuration; //_smokeColorEffector.colorMask = ; _flameSmokeColorEffector.keyframes.Clear(); var flameColor = mParams.innerFlameColor; flameColor.A = 0.9f; _flameSmokeColorEffector.keyframes.Add(0f, flameColor); flameColor = mParams.outerFlameColor; flameColor.A = 0.7f; _flameSmokeColorEffector.keyframes.Add(0.1f, flameColor); var smokeColor = mParams.smokeColor; smokeColor.A = 0.2f; _flameSmokeColorEffector.keyframes.Add(0.2f, smokeColor); smokeColor.A = 0f; _flameSmokeColorEffector.keyframes.Add(1f, smokeColor); _particlesData.addEffector(_flameSmokeColorEffector); } if (_ejectionSmokeColorEffector == null) { _ejectionSmokeColorEffector = new SSColorKeyframesEffector(); _ejectionSmokeColorEffector.maskMatchFunction = SSParticleEffector.MatchFunction.Equals; _ejectionSmokeColorEffector.effectorMask = (ushort)ParticleEffectorMasks.EjectionSmoke; _ejectionSmokeColorEffector.particleLifetime = mParams.flameSmokeDuration; _ejectionSmokeColorEffector.keyframes.Clear(); var smokeColor = mParams.smokeColor; smokeColor.A = 0.3f; _ejectionSmokeColorEffector.keyframes.Add(0f, smokeColor); smokeColor.A = 0.14f; _ejectionSmokeColorEffector.keyframes.Add(0.2f, smokeColor); smokeColor.A = 0f; _ejectionSmokeColorEffector.keyframes.Add(1f, smokeColor); _particlesData.addEffector(_ejectionSmokeColorEffector); } if (_flameSmokeScaleEffector == null) { _flameSmokeScaleEffector = new SSMasterScaleKeyframesEffector(); _flameSmokeScaleEffector.maskMatchFunction = SSParticleEffector.MatchFunction.Equals; _flameSmokeScaleEffector.effectorMask = (ushort)ParticleEffectorMasks.FlameToSmoke; _flameSmokeScaleEffector.particleLifetime = mParams.flameSmokeDuration; _flameSmokeScaleEffector.keyframes.Clear(); _flameSmokeScaleEffector.keyframes.Add(0f, 0.3f); _flameSmokeScaleEffector.keyframes.Add(0.1f, 1f); _flameSmokeScaleEffector.keyframes.Add(1f, 2f); _particlesData.addEffector(_flameSmokeScaleEffector); } if (_ejectionSmokeScaleEffector == null) { _ejectionSmokeScaleEffector = new SSMasterScaleKeyframesEffector(); _ejectionSmokeScaleEffector.maskMatchFunction = SSParticleEffector.MatchFunction.Equals; _ejectionSmokeScaleEffector.effectorMask = (ushort)ParticleEffectorMasks.EjectionSmoke; _ejectionSmokeScaleEffector.particleLifetime = mParams.ejectionSmokeDuration; _ejectionSmokeScaleEffector.keyframes.Clear(); _ejectionSmokeScaleEffector.keyframes.Add(0f, 0.1f); _ejectionSmokeScaleEffector.keyframes.Add(0.35f, 0.8f); _ejectionSmokeScaleEffector.keyframes.Add(1f, 1.35f); _particlesData.addEffector(_ejectionSmokeScaleEffector); } }
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; }