public Matrix4 viewProjMat; // maintain this matrix to held 2d countdown renderer public MissileDebugRays(SSpaceMissileData missile) { _missile = missile; renderState.castsShadow = false; renderState.receivesShadows = false; renderState.frustumCulling = false; }
public SProportionalNavigationPursuitDriver(SSpaceMissileData missile) { _missile = missile; _missile.visualSmokeSize = 1f; _missile.visualSmokeAmmount = 1f; }
public SSpaceMissileClusterData( Vector3 launcherPos, Vector3 launcherVel, int numMissiles, ISSpaceMissileTarget target, float timeToHit, SSpaceMissileParameters mParams) { _target = target; _timeToHit = timeToHit; _parameters = mParams; _missiles = new SSpaceMissileData[numMissiles]; if (_parameters.spawnGenerator != null) { _parameters.spawnGenerator.Generate(numMissiles, (i, scale, pos, orient) => { Matrix4 spawnTxfm = _parameters.spawnTxfm(_target, launcherPos, launcherVel, i, numMissiles); Vector3 missilePos = pos * _parameters.spawnGeneratorScale; missilePos = Vector3.Transform(missilePos, spawnTxfm); _missiles [i] = new SSpaceMissileData ( this, i, launcherPos, launcherVel, missilePos, timeToHit); return true; // accept new missile from the generator } ); } else { for (int i = 0; i < numMissiles; ++i) { Matrix4 spawnTxfm = _parameters.spawnTxfm(_target, launcherPos, launcherVel, i, numMissiles); var missilePos = Vector3.Transform(Vector3.Zero, spawnTxfm); _missiles [i] = new SSpaceMissileData ( this, i, launcherPos, launcherVel, missilePos, timeToHit); } } }
// TODO: remove cluster??? or missile? protected void _addMissileRender(SSpaceMissileData missile) { var missileRuntime = new SSpaceMissileRenderInfo(missile); #if MISSILE_SHOW _objScene.AddObject(missileRuntime.bodyObj); _particlesData.addEmitter(missileRuntime.flameSmokeEmitter); #endif _missileRuntimes.Add(missileRuntime); #if MISSILE_DEBUG _objScene.AddObject(missileRuntime.debugRays); _screenScene.AddObject(missileRuntime.debugCountdown); #endif }
public SSpaceMissileRenderInfo(SSpaceMissileData missile) { this.missile = missile; var mParams = missile.cluster.parameters; bodyObj = new SSObjectMesh(mParams.missileBodyMesh); bodyObj.Scale = new Vector3(mParams.missileBodyScale); bodyObj.renderState.castsShadow = false; bodyObj.renderState.receivesShadows = false; //bodyObj.renderState.visible = false; bodyObj.Name = "a missile body"; #if MISSILE_DEBUG debugRays = new MissileDebugRays(missile); debugCountdown = new SSObject2DSurface_AGGText(); debugCountdown.Size = 2f; debugCountdown.MainColor = Color4Helper.RandomDebugColor(); #endif flameSmokeEmitter = new SSRadialEmitter(); flameSmokeEmitter.effectorMask = (ushort)ParticleEffectorMasks.EjectionSmoke; flameSmokeEmitter.life = mParams.flameSmokeDuration; flameSmokeEmitter.color = new Color4(1f, 1f, 1f, 1f); flameSmokeEmitter.billboardXY = true; flameSmokeEmitter.particlesPerEmissionMin = mParams.smokePerEmissionMin; flameSmokeEmitter.particlesPerEmissionMax = mParams.smokePerEmissionMax; flameSmokeEmitter.spriteRectangles = mParams.smokeSpriteRects; //smokeEmitter.phiMin = 0f; //smokeEmitter.phiMax = (float)Math.PI/6f; flameSmokeEmitter.phiMin = (float)Math.PI / 3f; flameSmokeEmitter.phiMax = (float)Math.PI / 2f; flameSmokeEmitter.orientationMin = new Vector3(0f, 0f, 0f); flameSmokeEmitter.orientationMax = new Vector3(0f, 0f, 2f * (float)Math.PI); flameSmokeEmitter.angularVelocityMin = new Vector3(0f, 0f, -1f); flameSmokeEmitter.angularVelocityMax = new Vector3(0f, 0f, +1f); flameSmokeEmitter.radiusOffsetMin = 0f; flameSmokeEmitter.radiusOffsetMax = 0.1f; // positions emitters and mesh preRenderUpdate(0f); }
public SSimpleMissileEjectionDriver(SSpaceMissileData missile, Vector3 clusterInitPos, Vector3 clusterInitVel) { _missile = missile; var mParams = _missile.cluster.parameters; _missile.visualDirection = (_missile.position - clusterInitPos); if (_missile.visualDirection.LengthSquared > 0.0001f) { _missile.visualDirection.Normalize(); } else { // means missile was spawned right at the launcher. pick a direction towards target Vector3 toTarget = _missile.cluster.target.position - _missile.position; float length = toTarget.Length; if (length >= 0.0001f) { // normalize _missile.visualDirection = toTarget / length; } else { // target is also on top of missile. just pick a direction and keep everything NaN free _missile.visualDirection = Vector3.UnitZ; } } _missile.velocity = clusterInitVel + _missile.visualDirection * mParams.ejectionVelocity; var rand = SSpaceMissilesSimulation.rand; _yawVelocity = (float)rand.NextDouble() * mParams.ejectionMaxRotationVel; _pitchVelocity = (float)rand.NextDouble() * mParams.ejectionMaxRotationVel; _missile.visualSmokeSize = 1f; _missile.visualSmokeAmmount = 1f; }
public SSpaceMissileClusterData( Vector3 launcherPos, Vector3 launcherVel, int numMissiles, ISSpaceMissileTarget target, float timeToHit, SSpaceMissileParameters mParams) { _target = target; _timeToHit = timeToHit; _parameters = mParams; _missiles = new SSpaceMissileData[numMissiles]; if (_parameters.spawnGenerator != null) { _parameters.spawnGenerator.Generate(numMissiles, (i, scale, pos, orient) => { Matrix4 spawnTxfm = _parameters.spawnTxfm(_target, launcherPos, launcherVel, i, numMissiles); Vector3 missilePos = pos * _parameters.spawnGeneratorScale; missilePos = Vector3.Transform(missilePos, spawnTxfm); _missiles [i] = new SSpaceMissileData( this, i, launcherPos, launcherVel, missilePos, timeToHit); return(true); // accept new missile from the generator } ); } else { for (int i = 0; i < numMissiles; ++i) { Matrix4 spawnTxfm = _parameters.spawnTxfm(_target, launcherPos, launcherVel, i, numMissiles); var missilePos = Vector3.Transform(Vector3.Zero, spawnTxfm); _missiles [i] = new SSpaceMissileData( this, i, launcherPos, launcherVel, missilePos, timeToHit); } } }
public virtual bool hitTest(SSpaceMissileData missile, out Vector3 hitLocation) { var mParams = missile.parameters; float simStep = missile.parameters.simulationStep; float nextTickDist = missile.velocity.LengthFast * simStep; float testDistSq = (nextTickDist + targetObj.worldBoundingSphereRadius); testDistSq *= testDistSq; float toTargetDistSq = (targetObj.Pos - missile.position).LengthSquared; if (toTargetDistSq <= mParams.atTargetDistance * mParams.atTargetDistance) { hitLocation = missile.position; return(true); } else if (testDistSq > toTargetDistSq) { Vector3 velNorm = (missile.velocity - this.velocity); velNorm.NormalizeFast(); SSRay ray = new SSRay(missile.position, velNorm); float rayDistance = 0f; if (targetObj.PreciseIntersect(ref ray, ref rayDistance)) { if (rayDistance - nextTickDist < mParams.atTargetDistance) { hitLocation = missile.position + this.velocity * simStep + velNorm * rayDistance; return(true); } } } hitLocation = new Vector3(float.PositiveInfinity); return(false); }
/// <summary> used to plugin field generators. Can be set to null, in which case only spawn transform delegates are used </summary> public virtual ISSpaceMissileDriver createEjection(SSpaceMissileData missile) { return(new SMissileEjectionDriver(missile)); }
protected readonly float _yawVelocity; // purely visual #endregion Fields #region Constructors public SSimpleMissileEjectionDriver(SSpaceMissileData missile, Vector3 clusterInitPos, Vector3 clusterInitVel) { _missile = missile; var mParams = _missile.cluster.parameters; _missile.visualDirection = (_missile.position - clusterInitPos); if (_missile.visualDirection.LengthSquared > 0.0001f) { _missile.visualDirection.Normalize(); } else { // means missile was spawned right at the launcher. pick a direction towards target Vector3 toTarget = _missile.cluster.target.position - _missile.position; float length = toTarget.Length; if (length >= 0.0001f) { // normalize _missile.visualDirection = toTarget / length; } else { // target is also on top of missile. just pick a direction and keep everything NaN free _missile.visualDirection = Vector3.UnitZ; } } _missile.velocity = clusterInitVel + _missile.visualDirection * mParams.ejectionVelocity; var rand = SSpaceMissilesSimulation.rand; _yawVelocity = (float)rand.NextDouble() * mParams.ejectionMaxRotationVel; _pitchVelocity = (float)rand.NextDouble() * mParams.ejectionMaxRotationVel; _missile.visualSmokeSize = 1f; _missile.visualSmokeAmmount = 1f; }
public override ISSpaceMissileDriver createEjection(SSpaceMissileData missile) { return(new SMissileEjectionVisualDriver(missile as SSpaceMissileVisualData)); }
/// <summary> delegate for creating pursuit phase missile drivers </summary> public virtual ISSpaceMissileDriver createPursuit(SSpaceMissileData missile) { return(new SProportionalNavigationPursuitDriver(missile)); }
public void removeMissile(SSpaceMissileData missile) { missile.terminate(); }
public SMissileEjectionDriver(SSpaceMissileData missile) { this.missile = missile; }
/// <summary> delegate for creating pursuit phase missile drivers </summary> public virtual ISSpaceMissileDriver createPursuit(SSpaceMissileData missile) { return new SProportionalNavigationPursuitDriver (missile); }
/// <summary> delegate for creating pursuit phase missile drivers </summary> public override ISSpaceMissileDriver createPursuit(SSpaceMissileData missile) { return new SProportionalNavigationPursuitVisualDriver (missile as SSpaceMissileVisualData); }
/// <summary> delegate for creating pursuit phase missile drivers </summary> public override ISSpaceMissileDriver createPursuit(SSpaceMissileData missile) { return(new SProportionalNavigationPursuitVisualDriver(missile as SSpaceMissileVisualData)); }
public override ISSpaceMissileDriver createEjection(SSpaceMissileData missile) { return new SMissileEjectionVisualDriver (missile as SSpaceMissileVisualData); }
/// <summary> used to plugin field generators. Can be set to null, in which case only spawn transform delegates are used </summary> public virtual ISSpaceMissileDriver createEjection(SSpaceMissileData missile) { return new SMissileEjectionDriver (missile); }
// TODO: remove cluster??? or missile? protected void _addMissileRender(SSpaceMissileData missile) { var missileRuntime = new SSpaceMissileRenderInfo (missile); #if MISSILE_SHOW _objScene.AddObject(missileRuntime.bodyObj); _particlesData.addEmitter(missileRuntime.flameSmokeEmitter); #endif _missileRuntimes.Add(missileRuntime); #if MISSILE_DEBUG _objScene.AddObject(missileRuntime.debugRays); _screenScene.AddObject(missileRuntime.debugCountdown); #endif }
public SSpaceMissileRenderInfo(SSpaceMissileData missile) { this.missile = missile; var mParams = missile.cluster.parameters; bodyObj = new SSObjectMesh(mParams.missileBodyMesh); bodyObj.Scale = new Vector3(mParams.missileBodyScale); bodyObj.renderState.castsShadow = false; bodyObj.renderState.receivesShadows = false; //bodyObj.renderState.visible = false; bodyObj.Name = "a missile body"; #if MISSILE_DEBUG debugRays = new MissileDebugRays(missile); debugCountdown = new SSObject2DSurface_AGGText(); debugCountdown.Size = 2f; debugCountdown.MainColor = Color4Helper.RandomDebugColor(); #endif flameSmokeEmitter = new SSRadialEmitter(); flameSmokeEmitter.effectorMask = (ushort)ParticleEffectorMasks.EjectionSmoke; flameSmokeEmitter.life = mParams.flameSmokeDuration; flameSmokeEmitter.color = new Color4(1f, 1f, 1f, 1f); flameSmokeEmitter.billboardXY = true; flameSmokeEmitter.particlesPerEmissionMin = mParams.smokePerEmissionMin; flameSmokeEmitter.particlesPerEmissionMax = mParams.smokePerEmissionMax; flameSmokeEmitter.spriteRectangles = mParams.smokeSpriteRects; //smokeEmitter.phiMin = 0f; //smokeEmitter.phiMax = (float)Math.PI/6f; flameSmokeEmitter.phiMin = (float)Math.PI/3f; flameSmokeEmitter.phiMax = (float)Math.PI/2f; flameSmokeEmitter.orientationMin = new Vector3 (0f, 0f, 0f); flameSmokeEmitter.orientationMax = new Vector3 (0f, 0f, 2f * (float)Math.PI); flameSmokeEmitter.angularVelocityMin = new Vector3 (0f, 0f, -1f); flameSmokeEmitter.angularVelocityMax = new Vector3 (0f, 0f, +1f); flameSmokeEmitter.radiusOffsetMin = 0f; flameSmokeEmitter.radiusOffsetMax = 0.1f; // positions emitters and mesh preRenderUpdate(0f); }
public SProportionalNavigationPursuitDriver(SSpaceMissileData missile) { this.missile = missile; }
public virtual bool hitTest(SSpaceMissileData missile, out Vector3 hitLocation) { var mParams = missile.cluster.parameters; float simStep = missile.cluster.parameters.simulationStep; float nextTickDist = missile.velocity.LengthFast * simStep; float testDistSq = (nextTickDist + targetObj.worldBoundingSphereRadius); testDistSq *= testDistSq; float toTargetDistSq = (targetObj.Pos - missile.position).LengthSquared; if (toTargetDistSq <= mParams.atTargetDistance * mParams.atTargetDistance) { hitLocation = missile.position; return true; } else if (testDistSq > toTargetDistSq) { Vector3 velNorm = (missile.velocity - this.velocity); velNorm.NormalizeFast(); SSRay ray = new SSRay (missile.position, velNorm); float rayDistance = 0f; if (targetObj.PreciseIntersect(ref ray, ref rayDistance)) { if (rayDistance - nextTickDist < mParams.atTargetDistance) { hitLocation = missile.position + this.velocity * simStep + velNorm * rayDistance; return true; } } } hitLocation = new Vector3(float.PositiveInfinity); return false; }