Example usage for org.apache.commons.math3.geometry.euclidean.threed Vector3D Vector3D

List of usage examples for org.apache.commons.math3.geometry.euclidean.threed Vector3D Vector3D

Introduction

In this page you can find the example usage for org.apache.commons.math3.geometry.euclidean.threed Vector3D Vector3D.

Prototype

public Vector3D(double x, double y, double z) 

Source Link

Document

Simple constructor.

Usage

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);
}