예제 #1
0
                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;
                }
예제 #2
0
        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);
                }
            }
        }
예제 #4
0
        public SProportionalNavigationPursuitDriver(SSpaceMissileData missile)
        {
            _missile = missile;

            _missile.visualSmokeSize = 1f;
            _missile.visualSmokeAmmount = 1f;
        }
예제 #5
0
        // 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
        }
예제 #6
0
            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);
            }
예제 #7
0
        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);
                }
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
 /// <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));
 }
예제 #11
0
        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;
        }
예제 #12
0
 public override ISSpaceMissileDriver createEjection(SSpaceMissileData missile)
 {
     return(new SMissileEjectionVisualDriver(missile as SSpaceMissileVisualData));
 }
예제 #13
0
 /// <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();
 }
예제 #15
0
 public SMissileEjectionDriver(SSpaceMissileData missile)
 {
     this.missile = missile;
 }
예제 #16
0
 /// <summary> delegate for creating pursuit phase missile drivers </summary>
 public virtual ISSpaceMissileDriver createPursuit(SSpaceMissileData missile)
 {
     return new SProportionalNavigationPursuitDriver (missile);
 }
예제 #17
0
 /// <summary> delegate for creating pursuit phase missile drivers </summary>
 public override ISSpaceMissileDriver createPursuit(SSpaceMissileData missile)
 {
     return new SProportionalNavigationPursuitVisualDriver (missile as SSpaceMissileVisualData);
 }
예제 #18
0
 /// <summary> delegate for creating pursuit phase missile drivers </summary>
 public override ISSpaceMissileDriver createPursuit(SSpaceMissileData missile)
 {
     return(new SProportionalNavigationPursuitVisualDriver(missile as SSpaceMissileVisualData));
 }
예제 #19
0
 public override ISSpaceMissileDriver createEjection(SSpaceMissileData missile)
 {
     return new SMissileEjectionVisualDriver (missile as SSpaceMissileVisualData);
 }
 public void removeMissile(SSpaceMissileData missile)
 {
     missile.terminate();
 }
예제 #21
0
 /// <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 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;
                }
예제 #25
0
 public SProportionalNavigationPursuitDriver(SSpaceMissileData missile)
 {
     this.missile = missile;
 }
예제 #26
0
        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;
        }