List of usage examples for org.apache.commons.math3.geometry.euclidean.threed Vector3D Vector3D
public Vector3D(double x, double y, double z)
From source file:org.jtrfp.trcl.obj.DEFObject.java
public DEFObject(final TR tr, Model model, EnemyDefinition def, EnemyPlacement pl) { super(tr, model); this.def = def; boundingRadius = TR.legacy2Modern(def.getBoundingBoxRadius()) / 1.5; anchoring = Anchoring.floating;/* ww w .j av a2 s . c om*/ logic = def.getLogic(); mobile = true; canTurn = true; foliage = false; boss = def.isObjectIsBoss(); //Default Direction setDirection(new ObjectDirection(pl.getRoll(), pl.getPitch(), pl.getYaw() + 65536)); boolean customExplosion = false; this.setModelOffset(TR.legacy2Modern(def.getPivotX()), TR.legacy2Modern(def.getPivotY()), TR.legacy2Modern(def.getPivotZ())); switch (logic) { case groundDumb: mobile = false; canTurn = false; anchoring = Anchoring.terrain; break; case groundTargeting://Ground turrets { mobile = false; canTurn = true; addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); //TODO: def.getFiringVertices() needs actual vertex lookup. ProjectileFiringBehavior pfb; addBehavior(pfb = new ProjectileFiringBehavior() .setProjectileFactory( tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]) .setFiringPositions(new Vector3D[] { new Vector3D(0, 0, 0) })); try { pfb.addSupply(9999999); } catch (SupplyNotNeededException e) { } addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)).setMaxFiringDistance(TR.mapSquareSize * 3) .setSmartFiring(false).setMaxFireVectorDeviation(.5).setTimePerPatternEntry(500)); anchoring = Anchoring.terrain; break; } case flyingDumb: canTurn = false; break; case groundTargetingDumb: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); anchoring = Anchoring.terrain; break; case flyingSmart: smartPlaneBehavior(tr, def, false); break; case bankSpinDrill: unhandled(def); break; case sphereBoss: projectileFiringBehavior(); mobile = true; break; case flyingAttackRetreatSmart: smartPlaneBehavior(tr, def, false); //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); break; case splitShipSmart://TODO smartPlaneBehavior(tr, def, false); //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); break; case groundStaticRuin://Destroyed object is replaced with another using SimpleModel i.e. weapons bunker mobile = false; canTurn = false; anchoring = Anchoring.terrain; break; case targetHeadingSmart: mobile = false;//Belazure's crane bots addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; break; case targetPitchSmart: mobile = false; addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; break; case coreBossSmart: mobile = false; projectileFiringBehavior(); break; case cityBossSmart: mobile = false; projectileFiringBehavior(); break; case staticFiringSmart: { //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); final ProjectileFiringBehavior pfb = new ProjectileFiringBehavior(); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } pfb.setProjectileFactory(tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]); addBehavior(pfb); addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)).setMaxFiringDistance(TR.mapSquareSize * 8) .setSmartFiring(true)); mobile = false; canTurn = false; break; } case sittingDuck: canTurn = false; mobile = false; break; case tunnelAttack: { final ProjectileFiringBehavior pfb = new ProjectileFiringBehavior(); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } pfb.setProjectileFactory(tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]); addBehavior(pfb); //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)) .setMaxFiringDistance(TR.mapSquareSize * .2).setSmartFiring(false).setMaxFireVectorDeviation(.3) .setTimePerPatternEntry(2000)); /*addBehavior(new Bobbing(). setPhase(Math.random()). setBobPeriodMillis(10*1000+Math.random()*3000).setAmplitude(2000). setAdditionalHeight(0));*/ //Conflicts with TunnelRailed mobile = false; break; } case takeoffAndEscape: addBehavior(new MovesByVelocity()); addBehavior( (Behavior) (new HasPropulsion().setMinPropulsion(0).setPropulsion(def.getThrustSpeed() / 1.2))); addBehavior(new AccelleratedByPropulsion().setEnable(false)); addBehavior(new VelocityDragBehavior().setDragCoefficient(.86)); addBehavior(new CustomPlayerWithinRangeBehavior() { @Override public void withinRange() { DEFObject.this.getBehavior().probeForBehavior(AccelleratedByPropulsion.class) .setThrustVector(Vector3D.PLUS_J).setEnable(true); } }).setRange(TR.mapSquareSize * 10); addBehavior(new LoopingPositionBehavior()); addBehavior(new ExplodesOnDeath(ExplosionType.Blast, BIG_EXP_SOUNDS[(int) (Math.random() * 3)])); customExplosion = true; canTurn = false; mobile = false; break; case fallingAsteroid: anchoring = Anchoring.floating; fallingObjectBehavior(); customExplosion = true; addBehavior(new ExplodesOnDeath(ExplosionType.BigExplosion, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); //setVisible(false); //addBehavior(new FallingDebrisBehavior(tr,model)); break; case cNome://Walky bot? anchoring = Anchoring.terrain; break; case cNomeLegs://Walky bot? anchoring = Anchoring.terrain; break; case cNomeFactory: mobile = false; break; case geigerBoss: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; mobile = false; break; case volcanoBoss: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; mobile = false; break; case volcano://Wat. unhandled(def); canTurn = false; mobile = false; anchoring = Anchoring.terrain; break; case missile://Silo? mobile = false;//TODO anchoring = Anchoring.terrain; break; case bob: addBehavior(new Bobbing().setAdditionalHeight(TR.mapSquareSize * 1)); addBehavior(new SteadilyRotating()); addBehavior(new ExplodesOnDeath(ExplosionType.Blast, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); possibleBobbingSpinAndCrashOnDeath(.5, def); customExplosion = true; anchoring = Anchoring.floating; mobile = false; canTurn = false;//ironic? break; case alienBoss: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case canyonBoss1: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case canyonBoss2: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case lavaMan://Also terraform-o-bot addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case arcticBoss: //ARTIC / Ymir. Hangs from ceiling. addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; anchoring = Anchoring.ceiling; break; case helicopter://TODO break; case tree: canTurn = false; mobile = false; foliage = true; anchoring = Anchoring.terrain; break; case ceilingStatic: canTurn = false; mobile = false; setTop(Vector3D.MINUS_J); anchoring = Anchoring.ceiling; break; case bobAndAttack: { addBehavior(new SteadilyRotating().setRotationPhase(2 * Math.PI * Math.random())); final ProjectileFiringBehavior pfb = new ProjectileFiringBehavior(); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } pfb.setProjectileFactory(tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]); addBehavior(pfb);//Bob and attack don't have the advantage of movement, so give them the advantage of range. addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)) .setMaxFiringDistance(TR.mapSquareSize * 17).setSmartFiring(true)); addBehavior(new Bobbing().setPhase(Math.random()).setBobPeriodMillis(10 * 1000 + Math.random() * 3000)); addBehavior(new ExplodesOnDeath(ExplosionType.Blast, BIG_EXP_SOUNDS[(int) (Math.random() * 3)])); possibleBobbingSpinAndCrashOnDeath(.5, def); customExplosion = true; mobile = false; canTurn = false; anchoring = Anchoring.floating; break; } case forwardDrive: canTurn = false; anchoring = Anchoring.terrain; break; case fallingStalag: fallingObjectBehavior(); customExplosion = true; addBehavior(new ExplodesOnDeath(ExplosionType.BigExplosion, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); //canTurn=false; //mobile=false; anchoring = Anchoring.floating; break; case attackRetreatBelowSky: smartPlaneBehavior(tr, def, false); anchoring = Anchoring.floating; break; case attackRetreatAboveSky: smartPlaneBehavior(tr, def, true); anchoring = Anchoring.floating; break; case bobAboveSky: addBehavior(new Bobbing().setAdditionalHeight(TR.mapSquareSize * 5)); addBehavior(new SteadilyRotating()); possibleBobbingSpinAndCrashOnDeath(.5, def); mobile = false; canTurn = false; anchoring = Anchoring.floating; break; case factory: canTurn = false; mobile = false; anchoring = Anchoring.floating; break; }//end switch(logic) /////////////////////////////////////////////////////////// //Position Limit { final PositionLimit posLimit = new PositionLimit(); posLimit.getPositionMaxima()[1] = tr.getWorld().sizeY; posLimit.getPositionMinima()[1] = -tr.getWorld().sizeY; addBehavior(posLimit); } if (anchoring == Anchoring.terrain) { addBehavior(new CustomDeathBehavior(new Runnable() { @Override public void run() { tr.getGame().getCurrentMission().notifyGroundTargetDestroyed(); } })); addBehavior(new TerrainLocked()); } else if (anchoring == Anchoring.ceiling) { addBehavior(new TerrainLocked().setLockedToCeiling(true)); } else addBehavior(new CustomDeathBehavior(new Runnable() { @Override public void run() { tr.getGame().getCurrentMission().notifyAirTargetDestroyed(); }//end run() })); //Misc addBehavior(new TunnelRailed(tr));//Centers in tunnel when appropriate addBehavior(new DeathBehavior()); addBehavior(new DamageableBehavior().setHealth(pl.getStrength() + (spinCrash ? 16 : 0)) .setMaxHealth(pl.getStrength() + (spinCrash ? 16 : 0)).setEnable(!boss)); setActive(!boss); addBehavior(new DamagedByCollisionWithGameplayObject()); if (!foliage) addBehavior(new DebrisOnDeathBehavior()); else { addBehavior(new CustomDeathBehavior(new Runnable() { @Override public void run() { tr.getGame().getCurrentMission().notifyFoliageDestroyed(); } })); } if (canTurn || boss) { addBehavior(new RotationalMomentumBehavior()); addBehavior(new RotationalDragBehavior()).setDragCoefficient(.86); addBehavior(new AutoLeveling()); } if (foliage) { addBehavior(new ExplodesOnDeath(ExplosionType.Billow)); } else if ((!mobile || anchoring == Anchoring.terrain) && !customExplosion) { addBehavior(new ExplodesOnDeath(ExplosionType.BigExplosion, BIG_EXP_SOUNDS[(int) (Math.random() * 3)])); } else if (!customExplosion) { addBehavior(new ExplodesOnDeath(ExplosionType.Blast, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); } if (mobile) { addBehavior(new MovesByVelocity()); addBehavior(new HasPropulsion()); addBehavior(new AccelleratedByPropulsion()); addBehavior(new VelocityDragBehavior()); if (anchoring == Anchoring.terrain) { } else {//addBehavior(new BouncesOffSurfaces().setReflectHeading(false)); addBehavior(new CollidesWithTerrain().setAutoNudge(true).setNudgePadding(40000)); } getBehavior().probeForBehavior(VelocityDragBehavior.class).setDragCoefficient(.86); getBehavior().probeForBehavior(Propelled.class).setMinPropulsion(0); getBehavior().probeForBehavior(Propelled.class).setPropulsion(def.getThrustSpeed() / 1.2); addBehavior(new LoopingPositionBehavior()); } //end if(mobile) if (def.getPowerup() != null && Math.random() * 100. < def.getPowerupProbability()) { addBehavior(new LeavesPowerupOnDeathBehavior(def.getPowerup())); } }
From source file:org.jtrfp.trcl.obj.DEFObject.java
private void projectileFiringBehavior() { ProjectileFiringBehavior pfb;//w w w . j a v a 2 s . c om addBehavior(pfb = new ProjectileFiringBehavior() .setProjectileFactory( getTr().getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]) .setFiringPositions(new Vector3D[] { new Vector3D(0, 0, 0) })); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } final AutoFiring af; addBehavior(af = new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)).setMaxFiringDistance(TR.mapSquareSize * 5) .setSmartFiring(false).setMaxFireVectorDeviation(2.).setTimePerPatternEntry(!boss ? 2000 : 350)); if (boss) af.setFiringPattern(new boolean[] { true, true, true, true, false, false, true, false }) .setAimRandomness(.07); }
From source file:org.jtrfp.trcl.obj.DEFObject.java
private void fallingObjectBehavior() { canTurn = false;// w ww . j a v a2s . c o m mobile = false;//Technically wrong but propulsion is unneeded. //addBehavior(new PulledDownByGravityBehavior()); final MovesByVelocity mbv = new MovesByVelocity(); mbv.setVelocity(new Vector3D(3500, -100000, 5000)); addBehavior(mbv); //addBehavior(new VelocityDragBehavior().setDragCoefficient(.99)); // For some reason it falls like pine tar addBehavior(new DamageableBehavior().setMaxHealth(10).setHealth(10)); addBehavior(new DeathBehavior()); addBehavior(new CollidesWithTerrain().setIgnoreCeiling(true)); addBehavior(new DamagedByCollisionWithSurface()); addBehavior(new RotationalMomentumBehavior().setEquatorialMomentum(.01).setLateralMomentum(.02) .setPolarMomentum(.03)); { final DEFObject thisObject = this; final TR thisTr = getTr(); addBehavior(new ResetsRandomlyAfterDeath().setMinWaitMillis(1000).setMaxWaitMillis(5000) .setRunOnReset(new Runnable() { @Override public void run() { final Vector3D centerPos = thisObject.probeForBehavior(DeathBehavior.class) .getLocationOfLastDeath(); thisObject.probeForBehavior(MovesByVelocity.class) .setVelocity(new Vector3D(7000, -200000, 1000)); final double[] pos = thisObject.getPosition(); pos[0] = centerPos.getX() + Math.random() * TR.mapSquareSize * 3 - TR.mapSquareSize * 1.5; pos[1] = thisTr.getWorld().sizeY / 2 + thisTr.getWorld().sizeY * (Math.random()) * .3; pos[2] = centerPos.getZ() + Math.random() * TR.mapSquareSize * 3 - TR.mapSquareSize * 1.5; thisObject.notifyPositionChange(); }//end run() })); } }
From source file:org.jtrfp.trcl.obj.DEFObject.java
private void smartPlaneBehavior(TR tr, EnemyDefinition def, boolean retreatAboveSky) { final HorizAimAtPlayerBehavior haapb = new HorizAimAtPlayerBehavior(tr.getGame().getPlayer()) .setLeftHanded(Math.random() >= .5); addBehavior(haapb);/*from w w w.j a v a2 s.c om*/ final AdjustAltitudeToPlayerBehavior aatpb = new AdjustAltitudeToPlayerBehavior(tr.getGame().getPlayer()) .setAccelleration(1000); addBehavior(aatpb); final ProjectileFiringBehavior pfb = new ProjectileFiringBehavior() .setProjectileFactory(tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } addBehavior(pfb); possibleSpinAndCrashOnDeath(.4, def); if (spinCrash) { final DamageTrigger spinAndCrashAddendum = new DamageTrigger() { @Override public void healthBelowThreshold() { final WorldObject parent = getParent(); final Behavior beh = parent.getBehavior(); final HasPropulsion hp = beh.probeForBehavior(HasPropulsion.class); hp.setPropulsion(hp.getPropulsion() / 1); beh.probeForBehavior(AutoLeveling.class).setLevelingAxis(LevelingAxis.HEADING) .setLevelingVector(Vector3D.MINUS_J).setRetainmentCoeff(.985, .985, .985); } }; addBehavior(spinAndCrashAddendum); } //end if(spinCrash) AccelleratedByPropulsion escapeProp = null; if (retreatAboveSky) { escapeProp = new AccelleratedByPropulsion(); escapeProp.setThrustVector(new Vector3D(0, .1, 0)).setEnable(false); addBehavior(escapeProp); } final AutoFiring afb = new AutoFiring(); afb.setMaxFireVectorDeviation(.3); afb.setFiringPattern(new boolean[] { true, false, false, false, true, true, false }); afb.setTimePerPatternEntry((int) (400 + Math.random() * 300)); afb.setPatternOffsetMillis((int) (Math.random() * 1000)); afb.setProjectileFiringBehavior(pfb); addBehavior(afb); final SpinAccellerationBehavior sab = (SpinAccellerationBehavior) new SpinAccellerationBehavior() .setEnable(false); addBehavior(sab); addBehavior(new SmartPlaneBehavior(haapb, afb, sab, aatpb, escapeProp, retreatAboveSky)); }
From source file:org.jtrfp.trcl.obj.ExplosionSystem.java
public Explosion triggerExplosion(Vector3D loc, ExplosionType type) { if (!isNewExplosionFeasible(loc, type)) return null; indices[type.ordinal()]++;//from w w w. jav a2 s .co m indices[type.ordinal()] %= MAX_EXPLOSIONS_PER_POOL; Explosion result = allExplosions[type.ordinal()][indices[type.ordinal()]]; result.destroy(); result.reset(); result.setPosition(loc.getX(), loc.getY(), loc.getZ()); result.notifyPositionChange(); final SmokeSystem sf = tr.getResourceManager().getSmokeSystem(); final int NUM_PUFFS = 1; for (int i = 0; i < NUM_PUFFS; i++) { sf.triggerSmoke(loc.add(new Vector3D(Math.random() * 10000 - 5000, Math.random() * 10000 - 5000, Math.random() * 10000 - 5000)), SmokeType.Puff); } //end for(i) add(result); return result; }
From source file:org.jtrfp.trcl.obj.ObjectDirection.java
public ObjectDirection(int legacyRoll, int legacyPitch, int legacyYaw) { Vector3D headingAccumulator, topAccumulator; Rotation rot;/*from www. j ava 2s. c o m*/ yaw = ((double) legacyYaw / 65535.) * 2 * Math.PI; roll = ((double) legacyRoll / 65535.) * 2 * Math.PI; tilt = ((double) legacyPitch / 65535.) * 2 * Math.PI; /* * Rotation hRot = new Rotation(//yaw only. new Vector3D(0,1,0), new * Vector3D(0,0,1), new Vector3D(0,1,0), new * Vector3D(Math.cos(yaw),0.,Math.sin(yaw))); heading = * hRot.applyTo(heading); */ topAccumulator = new Vector3D(0, 1, 0); /* * Rotation tRot = new Rotation(//Pitch and roll new Vector3D(0,1,0), * new Vector3D(0,1,0), new Vector3D(Math.sin(roll),1,Math.cos(roll)), * new Vector3D(0.,Math.cos(tilt),Math.cos(tilt))); */ headingAccumulator = Vector3D.PLUS_K; rot = new Rotation(Vector3D.PLUS_I, tilt); headingAccumulator = rot.applyTo(headingAccumulator); topAccumulator = rot.applyTo(topAccumulator); rot = new Rotation(Vector3D.PLUS_J, yaw + 1.5 * Math.PI); headingAccumulator = rot.applyTo(headingAccumulator); topAccumulator = rot.applyTo(topAccumulator); // Commit the values heading = headingAccumulator; top = topAccumulator; }
From source file:org.jtrfp.trcl.obj.Player.java
public Player(final TR tr, final Model model) { super(tr, model); setVisible(false);//from ww w . j a va 2 s.co m DamageableBehavior db = new DamageableBehavior(); addBehavior(db); String godMode = System.getProperty("org.jtrfp.trcl.godMode"); if (godMode != null) { if (godMode.toUpperCase().contains("TRUE")) { db.setEnable(false); } } addBehavior(new AccelleratedByPropulsion()); addBehavior(new MovesByVelocity()); addBehavior(new HasPropulsion()); addBehavior(new CollidesWithTunnelWalls(true, true)); addBehavior(new UserInputThrottleControlBehavior()); addBehavior(new VelocityDragBehavior()); addBehavior(new RollLevelingBehavior()); addBehavior(new UserInputRudderElevatorControlBehavior()); addBehavior(new RotationalMomentumBehavior()); addBehavior(new RotationalDragBehavior()); addBehavior(new CollidesWithTerrain().setTunnelEntryCapable(true).setIgnoreHeadingForImpact(false)); addBehavior(new AfterburnerBehavior()); addBehavior(new LoopingPositionBehavior()); addBehavior(new HeadingXAlwaysPositiveBehavior().setEnable(false)); addBehavior( new UpdatesThrottleMeterBehavior().setController(tr.getGame().getHUDSystem().getThrottleMeter())); addBehavior(new UpdatesHealthMeterBehavior().setController(tr.getGame().getHUDSystem().getHealthMeter())); addBehavior(new DamagedByCollisionWithGameplayObject()); addBehavior(new DamagedByCollisionWithSurface()); addBehavior(new BouncesOffSurfaces()); addBehavior(new UpdatesNAVRadar()); addBehavior(new Cloakable()); addBehavior(new SurfaceImpactSFXBehavior(tr)); addBehavior(new RedFlashOnDamage()); final Weapon[] allWeapons = Weapon.values(); for (int i = 0; i < allWeapons.length; i++) { final Weapon w = allWeapons[i]; if (w.getButtonToSelect() != -1) { final ProjectileFiringBehavior pfb; if (w.isLaser()) {// LASER pfb = new UpgradeableProjectileFiringBehavior() .setProjectileFactory(tr.getResourceManager().getProjectileFactories()[w.ordinal()]); ((UpgradeableProjectileFiringBehavior) pfb).setMaxCapabilityLevel(2) .setFiringMultiplexMap(new Vector3D[][] { new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0) }, // Level 0, // single new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0) }, // Level 1, // double new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0), // Level 2 quad new Vector3D(5000, 3000, 0), new Vector3D(-5000, 3000, 0) } });// Level // 2 // cont'd } // end if(isLaser) else {// NOT LASER pfb = new ProjectileFiringBehavior() .setFiringPositions( new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0) }) .setProjectileFactory(tr.getResourceManager().getProjectileFactories()[w.ordinal()]); if (w == Weapon.DAM) pfb.setAmmoLimit(1); } addBehavior(pfb); weapons[w.getButtonToSelect() - 1] = pfb; if (System.getProperties().containsKey("org.jtrfp.trcl.allAmmo")) { if (System.getProperty("org.jtrfp.trcl.allAmmo").toUpperCase().contains("TRUE")) { System.out.println("allAmmo cheat active for weapon " + w.getButtonToSelect()); pfb.setAmmoLimit(Integer.MAX_VALUE); try { pfb.addSupply(Double.POSITIVE_INFINITY); } catch (SupplyNotNeededException e) { } } //end if(property=true) } //end if(allAmmo) } // end if(hasButton) } addBehavior(new WeaponSelectionBehavior().setBehaviors(weapons)); //camera = tr.renderer.get().getCamera(); getBehavior().probeForBehavior(VelocityDragBehavior.class).setDragCoefficient(.86); getBehavior().probeForBehavior(Propelled.class).setMinPropulsion(0); getBehavior().probeForBehavior(Propelled.class).setMaxPropulsion(900000); getBehavior().probeForBehavior(RotationalDragBehavior.class).setDragCoefficient(.86); setActive(false); }
From source file:org.jtrfp.trcl.obj.TunnelExitObject.java
public TunnelExitObject(TR tr, Tunnel tun) { super(tr);/*from w ww.ja v a 2 s .co m*/ addBehavior(new TunnelExitBehavior()); final DirectionVector v = tun.getSourceTunnel().getExit(); final double EXIT_Y_NUDGE = 0; final InterpolatingAltitudeMap map = tr.getGame().getCurrentMission().getOverworldSystem().getAltitudeMap(); final double exitY = map.heightAt(TR.legacy2Modern(v.getZ()), TR.legacy2Modern(v.getX())) + EXIT_Y_NUDGE; this.exitLocation = new Vector3D(TR.legacy2Modern(v.getZ()), exitY, TR.legacy2Modern(v.getX())); this.tun = tun; exitHeading = map.normalAt(exitLocation.getZ() / TR.mapSquareSize, exitLocation.getX() / TR.mapSquareSize); Vector3D horiz = exitHeading.crossProduct(Vector3D.MINUS_J); if (horiz.getNorm() == 0) { horiz = Vector3D.PLUS_I; } else horiz = horiz.normalize(); exitTop = exitHeading.crossProduct(horiz.negate()).normalize().negate(); exitLocation = exitLocation.add(exitHeading.scalarMultiply(10000)); this.tr = tr; setVisible(false); try { Model m = tr.getResourceManager().getBINModel("SHIP.BIN", tr.getGlobalPaletteVL(), null, tr.gpu.get().getGl()); setModel(m); } catch (Exception e) { e.printStackTrace(); } }
From source file:org.jtrfp.trcl.obj.TunnelSegment.java
private static Model createModel(Segment s, double segLen, TextureDescription[] tunnelTexturePalette, double endX, double endY, final TR tr) { Model mainModel = new Model(true, tr); mainModel.setDebugName("tunnelSegment main."); final int numPolys = s.getNumPolygons(); double startWidth = getStartWidth(s); double startHeight = getStartHeight(s); double endWidth = getEndWidth(s); double endHeight = getEndHeight(s); final FlickerLightType lightType = s.getFlickerLightType(); // TODO: Cleanup. final double startAngle1 = ((double) s.getStartAngle1() / 65535.) * 2. * Math.PI; final double startAngle2 = ((double) s.getStartAngle2() / 65535.) * 2. * Math.PI; final double startAngle = startAngle1; final double endAngle1 = ((double) s.getEndAngle1() / 65535.) * 2. * Math.PI; final double endAngle2 = ((double) s.getEndAngle2() / 65535.) * 2. * Math.PI; double endAngle = endAngle1; final double dAngleStart = (startAngle2 - startAngle1) / (double) numPolys; final double dAngleEnd = (endAngle2 - endAngle1) / (double) numPolys; final double startX = 0; final double startY = 0; final double zStart = 0; final double zEnd = segLen; final int numPolygonsMinusOne = s.getNumPolygons() - 1; final int lightPoly = s.getLightPolygon(); final boolean hasLight = lightPoly != -1; if (hasLight) { mainModel.setAnimateUV(true);//from w w w . ja v a 2 s . c o m mainModel.setSmoothAnimation(false); if (lightType == FlickerLightType.noLight) { //Do nothing. } else if (lightType == FlickerLightType.off1p5Sec) { mainModel.setController(new Controller() { private final int off = (int) (Math.random() * 2000); @Override public double getCurrentFrame() { return (off + System.currentTimeMillis() % 2000) > 1500 ? 1 : 0; } @Override public void setDebugMode(boolean b) { //Not implemented. } }); } else if (lightType == FlickerLightType.on1p5Sec) { mainModel.setController(new Controller() { private final int off = (int) (Math.random() * 2000); @Override public double getCurrentFrame() { return (off + System.currentTimeMillis() % 2000) < 1500 ? 1 : 0; } @Override public void setDebugMode(boolean b) { //Not implemented. } }); } else if (lightType == FlickerLightType.on1Sec) { mainModel.setController(new Controller() { private final int off = (int) (Math.random() * 2000); @Override public double getCurrentFrame() { return (off + System.currentTimeMillis() % 2000) > 1000 ? 1 : 0; } @Override public void setDebugMode(boolean b) { //Not implemented. } }); } } //end (has light) final double[] noLightU = new double[] { 1, 1, 0, 0 }; final double[] noLightV = new double[] { 0, 1, 1, 0 }; final double[] lightOffU = new double[] { 1, 1, .5, .5 }; final double[] lightOffV = new double[] { .5, 1, 1, .5 }; final double[] lightOnU = new double[] { .5, .5, 0, 0 }; final double[] lightOnV = new double[] { .5, 1, 1, .5 }; double rotPeriod = (1000. * 32768.) / (double) s.getRotationSpeed(); final boolean reverseDirection = rotPeriod < 0; if (reverseDirection) rotPeriod *= -1; final int numFramesIfRotating = 30; final int numFramesIfStatic = 2; final boolean isRotating = !Double.isInfinite(rotPeriod); int numAnimFrames = isRotating ? numFramesIfRotating : numFramesIfStatic; if (isRotating) mainModel.setFrameDelayInMillis((int) (rotPeriod / (numAnimFrames))); final double animationDeltaRadians = isRotating ? ((reverseDirection ? 1 : -1) * (2 * Math.PI) / (double) numAnimFrames) : 0; //FRAME LOOP for (int frameIndex = 0; frameIndex < numAnimFrames; frameIndex++) { final Model m = new Model(false, tr); m.setDebugName("TunnelSegment frame " + frameIndex + " of " + numAnimFrames); final double frameAngleDeltaRadians = animationDeltaRadians * (double) frameIndex; double frameStartAngle = startAngle + frameAngleDeltaRadians; double frameEndAngle = endAngle + frameAngleDeltaRadians; final double frameStartAngle1 = startAngle1 + frameAngleDeltaRadians; final double frameStartAngle2 = startAngle2 + frameAngleDeltaRadians; final double frameEndAngle1 = endAngle + frameAngleDeltaRadians; double[] thisU = noLightU, thisV = noLightV;//Changeable u/v references, default to noLight // Poly quads for (int pi = 0; pi < numPolygonsMinusOne; pi++) { Vector3D p0 = segPoint(frameStartAngle, zStart, startWidth, startHeight, startX, startY); Vector3D p1 = segPoint(frameEndAngle, zEnd, endWidth, endHeight, endX, endY); Vector3D p2 = segPoint(frameEndAngle + dAngleEnd, zEnd, endWidth, endHeight, endX, endY); Vector3D p3 = segPoint(frameStartAngle + dAngleStart, zStart, startWidth, startHeight, startX, startY); TextureDescription tex = tunnelTexturePalette[s.getPolyTextureIndices().get(pi)]; if (pi == lightPoly && lightType != FlickerLightType.noLight) { if (frameIndex == 0) { thisU = lightOnU; thisV = lightOnV; } else { thisU = lightOffU; thisV = lightOffV; } /*try { final int flickerThresh = flt == FlickerLightType.off1p5Sec ? (int) (-.3 * (double) Integer.MAX_VALUE) : flt == FlickerLightType.on1p5Sec ? (int) (.4 * (double) Integer.MAX_VALUE) : flt == FlickerLightType.on1Sec ? (int) (.25 * (double) Integer.MAX_VALUE) : Integer.MAX_VALUE; m.addTickableAnimator(new Tickable() { @Override public void tick() { if (flickerRandom.transfer(Math.abs((int) System .currentTimeMillis())) > flickerThresh) st.setFrame(1); else st.setFrame(0); } }); } catch (Exception e) { e.printStackTrace(); }*/ } else { thisU = noLightU; thisV = noLightV; } // No light m.addTriangles(Triangle.quad2Triangles(new double[] { p3.getX(), p2.getX(), p1.getX(), p0.getX() }, new double[] { p3.getY(), p2.getY(), p1.getY(), p0.getY() }, new double[] { p3.getZ(), p2.getZ(), p1.getZ(), p0.getZ() }, thisU, thisV, tex, RenderMode.DYNAMIC, new Vector3D[] { new Vector3D(Math.cos(frameStartAngle + dAngleStart), -Math.sin(frameStartAngle + dAngleStart), 0), new Vector3D(Math.cos(frameEndAngle + dAngleEnd), -Math.sin(frameEndAngle + dAngleEnd), 0), new Vector3D(Math.cos(frameEndAngle), -Math.sin(frameEndAngle), 0), new Vector3D(Math.cos(frameStartAngle), -Math.sin(frameStartAngle), 0) }, 0)); frameStartAngle += dAngleStart; frameEndAngle += dAngleEnd; } // for(polygons) if (s.isCutout()) { // The slice quad // INWARD Vector3D p0 = segPoint(frameStartAngle, zStart, startWidth, startHeight, startX, startY); Vector3D p1 = segPoint(frameEndAngle, zEnd, endWidth, endHeight, endX, endY); Vector3D p2 = segPoint(frameEndAngle1, zEnd, 0, 0, endX, endY); Vector3D p3 = segPoint(frameStartAngle1, zStart, 0, 0, startX, startY); m.addTriangles(Triangle.quad2Triangles(new double[] { p3.getX(), p2.getX(), p1.getX(), p0.getX() }, new double[] { p3.getY(), p2.getY(), p1.getY(), p0.getY() }, new double[] { p3.getZ(), p2.getZ(), p1.getZ(), p0.getZ() }, new double[] { 1, 1, 0, 0 }, new double[] { 0, 1, 1, 0 }, tunnelTexturePalette[s.getPolyTextureIndices().get(numPolygonsMinusOne)], RenderMode.DYNAMIC, new Vector3D[] { new Vector3D(Math.cos(frameStartAngle + dAngleStart), -Math.sin(frameStartAngle + dAngleStart), 0), new Vector3D(Math.cos(frameEndAngle + dAngleEnd), -Math.sin(frameEndAngle + dAngleEnd), 0), new Vector3D(Math.cos(frameEndAngle), -Math.sin(frameEndAngle), 0), new Vector3D(Math.cos(frameStartAngle), -Math.sin(frameStartAngle), 0) }, 0)); // OUTWARD p3 = segPoint(frameStartAngle1, zStart, startWidth, startHeight, startX, startY); p2 = segPoint(frameEndAngle1, zEnd, endWidth, endHeight, endX, endY); p1 = segPoint(frameEndAngle1, zEnd, 0, 0, endX, endY); p0 = segPoint(frameStartAngle1, zStart, 0, 0, startX, startY); m.addTriangles(Triangle.quad2Triangles(new double[] { p3.getX(), p2.getX(), p1.getX(), p0.getX() }, new double[] { p3.getY(), p2.getY(), p1.getY(), p0.getY() }, new double[] { p3.getZ(), p2.getZ(), p1.getZ(), p0.getZ() }, new double[] { 1, 1, 0, 0 }, new double[] { 0, 1, 1, 0 }, tunnelTexturePalette[s.getPolyTextureIndices().get(numPolygonsMinusOne)], RenderMode.DYNAMIC, new Vector3D[] { new Vector3D(Math.cos(frameStartAngle + dAngleStart), -Math.sin(frameStartAngle + dAngleStart), 0), new Vector3D(Math.cos(frameEndAngle + dAngleEnd), -Math.sin(frameEndAngle + dAngleEnd), 0), new Vector3D(Math.cos(frameEndAngle), -Math.sin(frameEndAngle), 0), new Vector3D(Math.cos(frameStartAngle), -Math.sin(frameStartAngle), 0) }, 0)); } else { // The slice quad Vector3D p0 = segPoint(frameStartAngle, zStart, startWidth, startHeight, startX, startY); Vector3D p1 = segPoint(frameEndAngle, zEnd, endWidth, endHeight, endX, endY); Vector3D p2 = segPoint(frameEndAngle1, zEnd, endWidth, endHeight, endX, endY); Vector3D p3 = segPoint(frameStartAngle1, zStart, startWidth, startHeight, startX, startY); m.addTriangles(Triangle.quad2Triangles(new double[] { p3.getX(), p2.getX(), p1.getX(), p0.getX() }, new double[] { p3.getY(), p2.getY(), p1.getY(), p0.getY() }, new double[] { p3.getZ(), p2.getZ(), p1.getZ(), p0.getZ() }, new double[] { 1, 1, 0, 0 }, new double[] { 0, 1, 1, 0 }, tunnelTexturePalette[s.getPolyTextureIndices().get(numPolygonsMinusOne)], RenderMode.DYNAMIC, new Vector3D[] { new Vector3D(Math.cos(frameStartAngle + dAngleStart), -Math.sin(frameStartAngle + dAngleStart), 0), new Vector3D(Math.cos(frameEndAngle + dAngleEnd), -Math.sin(frameEndAngle + dAngleEnd), 0), new Vector3D(Math.cos(frameEndAngle), -Math.sin(frameEndAngle), 0), new Vector3D(Math.cos(frameStartAngle), -Math.sin(frameStartAngle), 0) }, 0)); } //end !cutout //if(numAnimFrames!=1)//Push frame if animated. mainModel.addFrame(m); } //end for(frames) return mainModel; }
From source file:org.jtrfp.trcl.obj.TunnelSegment.java
private static Vector3D segPoint(double angle, double z, double w, double h, double x, double y) { return new Vector3D(-Math.cos(angle) * w + x, Math.sin(angle) * h + y, z); }