public Matrix4 viewProjMat; // maintain this matrix to held 2d countdown renderer public MissileDebugRays(SSpaceMissileVisualData missile) { _missile = missile; renderState.castsShadow = false; renderState.receivesShadows = false; renderState.frustumCulling = false; }
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 SMissileEjectionVisualDriver(SSpaceMissileVisualData missile) : base(missile) { var mParams = missile.parameters as SSpaceMissileVisualParameters; var rand = SSpaceMissilesVisualSimulation.rand; _yawVelocity = (float)rand.NextDouble() * mParams.ejectionMaxRotationVel; _pitchVelocity = (float)rand.NextDouble() * mParams.ejectionMaxRotationVel; }
public SMissileEjectionVisualDriver(SSpaceMissileVisualData missile) : base(missile) { var mParams = missile.parameters as SSpaceMissileVisualParameters; var rand = SSpaceMissilesVisualSimulation.rand; yawVelocity = (2f * (float)rand.NextDouble() - 1f) * mParams.ejectionMaxRotationVel; pitchVelocity = (2f * (float)rand.NextDouble() - 1f) * mParams.ejectionMaxRotationVel; if (missile.velocity.Length > 0f) { missile.visualDirection = missile.velocity.Normalized(); } }
protected void _addMissileRender(SSpaceMissileVisualData 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(SSpaceMissileVisualData missile) { this.missile = missile; var mParams = missile.parameters as SSpaceMissileVisualParameters; 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 SProportionalNavigationPursuitVisualDriver(SSpaceMissileVisualData missile) : base(missile) { }
public void removeMissile(SSpaceMissileVisualData missile) { missile.terminate(); }
public SSpaceMissileRenderInfo addMissileRender(SSpaceMissileVisualData missile) { _initParamsSpecific(missile.parameters as SSpaceMissileVisualParameters); return(_addMissileRender(missile)); }