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

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

Introduction

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

Prototype

Vector3D PLUS_J

To view the source code for org.apache.commons.math3.geometry.euclidean.threed Vector3D PLUS_J.

Click Source Link

Document

Second canonical vector (coordinates: 0, 1, 0).

Usage

From source file:jtrace.Scene.java

/**
 * Add a set of axes to an image.  If the object parameter is not null,
 * the axes corresponding to the object's coordinate system are drawn.
 * //from  ww w  . j av a  2 s . co  m
 * @param image Image generated using scene's camera
 * @param object (Possibly null) object
 */
private void renderAxes(BufferedImage image, SceneObject object) {

    Graphics gr = image.getGraphics();
    int[] origin, xhat, yhat, zhat;

    if (object == null) {
        origin = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.ZERO);
        xhat = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.PLUS_I);
        yhat = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.PLUS_J);
        zhat = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.PLUS_K);
    } else {
        origin = camera.getPixel(image.getWidth(), image.getHeight(),
                object.objectToSceneVector(Vector3D.ZERO));
        xhat = camera.getPixel(image.getWidth(), image.getHeight(),
                object.objectToSceneVector(Vector3D.PLUS_I));
        yhat = camera.getPixel(image.getWidth(), image.getHeight(),
                object.objectToSceneVector(Vector3D.PLUS_J));
        zhat = camera.getPixel(image.getWidth(), image.getHeight(),
                object.objectToSceneVector(Vector3D.PLUS_K));
    }

    String objName;
    if (object == null)
        objName = "";
    else
        objName = "(" + object.getClass().getSimpleName() + ")";

    gr.setColor(Color.red);
    gr.drawLine(origin[0], origin[1], xhat[0], xhat[1]);
    gr.setColor(Color.white);
    gr.drawString("x " + objName, xhat[0], xhat[1]);

    gr.setColor(Color.green);
    gr.drawLine(origin[0], origin[1], yhat[0], yhat[1]);
    gr.setColor(Color.white);
    gr.drawString("y " + objName, yhat[0], yhat[1]);

    gr.setColor(Color.blue);
    gr.drawLine(origin[0], origin[1], zhat[0], zhat[1]);
    gr.setColor(Color.white);
    gr.drawString("z " + objName, zhat[0], zhat[1]);
}

From source file:nova.core.render.model.TechneModelProvider.java

@Override
public void load(InputStream stream) {
    try {/*from  w  w w  .  ja  v  a2 s.  c om*/
        Map<String, byte[]> zipContents = new HashMap<>();
        ZipInputStream zipInput = new ZipInputStream(stream);
        ZipEntry entry;
        while ((entry = zipInput.getNextEntry()) != null) {
            byte[] data = new byte[(int) entry.getSize()];
            // For some reason, using read(byte[]) makes reading stall upon reaching a 0x1E byte
            int i = 0;
            while (zipInput.available() > 0 && i < data.length) {
                data[i++] = (byte) zipInput.read();
            }
            zipContents.put(entry.getName(), data);
        }

        byte[] modelXml = zipContents.get("model.xml");
        if (modelXml == null) {
            throw new RenderException("Model " + name + " contains no model.xml file");
        }

        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document = documentBuilder.parse(new ByteArrayInputStream(modelXml));

        NodeList nodeListTechne = document.getElementsByTagName("Techne");
        if (nodeListTechne.getLength() < 1) {
            throw new RenderException("Model " + name + " contains no Techne tag");
        }

        NodeList nodeListModel = document.getElementsByTagName("Model");
        if (nodeListModel.getLength() < 1) {
            throw new RenderException("Model " + name + " contains no Model tag");
        }

        NamedNodeMap modelAttributes = nodeListModel.item(0).getAttributes();
        if (modelAttributes == null) {
            throw new RenderException("Model " + name + " contains a Model tag with no attributes");
        }

        NodeList textureSize = document.getElementsByTagName("TextureSize");
        if (textureSize.getLength() == 0)
            throw new RenderException("Model has no texture size");

        String[] textureDimensions = textureSize.item(0).getTextContent().split(",");
        double textureWidth = Integer.parseInt(textureDimensions[0]);
        double textureHeight = Integer.parseInt(textureDimensions[1]);

        NodeList shapes = document.getElementsByTagName("Shape");

        for (int i = 0; i < shapes.getLength(); i++) {
            Node shape = shapes.item(i);
            NamedNodeMap shapeAttributes = shape.getAttributes();
            if (shapeAttributes == null) {
                throw new RenderException("Shape #" + (i + 1) + " in " + name + " has no attributes");
            }

            Node name = shapeAttributes.getNamedItem("name");
            String shapeName = null;
            if (name != null) {
                shapeName = name.getNodeValue();
            }
            if (shapeName == null) {
                shapeName = "Shape #" + (i + 1);
            }

            String shapeType = null;
            Node type = shapeAttributes.getNamedItem("type");
            if (type != null) {
                shapeType = type.getNodeValue();
            }

            if (shapeType != null && !cubeIDs.contains(shapeType)) {
                System.out.println(
                        "Model shape [" + shapeName + "] in " + this.name + " is not a cube, ignoring");
                continue;
            }

            boolean mirrored = false;
            String[] offset = new String[3];
            String[] position = new String[3];
            String[] rotation = new String[3];
            String[] size = new String[3];
            String[] textureOffset = new String[2];

            NodeList shapeChildren = shape.getChildNodes();
            for (int j = 0; j < shapeChildren.getLength(); j++) {
                Node shapeChild = shapeChildren.item(j);

                String shapeChildName = shapeChild.getNodeName();
                String shapeChildValue = shapeChild.getTextContent();
                if (shapeChildValue != null) {
                    shapeChildValue = shapeChildValue.trim();

                    switch (shapeChildName) {
                    case "IsMirrored":
                        mirrored = !shapeChildValue.equals("False");
                        break;
                    case "Offset":
                        offset = shapeChildValue.split(",");
                        break;
                    case "Position":
                        position = shapeChildValue.split(",");
                        break;
                    case "Rotation":
                        rotation = shapeChildValue.split(",");
                        break;
                    case "Size":
                        size = shapeChildValue.split(",");
                        break;
                    case "TextureOffset":
                        textureOffset = shapeChildValue.split(",");
                        break;
                    }
                }
            }

            /*
                 Generate new models
                 Models in Techne are based on cubes.
                 Each cube is, by default, skewed to the side. They are not centered.
                    
                 Everything is scaled by a factor of 16.
                 The y coordinate is inversed, y = 24 is the surface
                 The z coordinate is inverted, too.
             */
            double positionX = Double.parseDouble(position[0]) / 16d;
            double positionY = (16 - Double.parseDouble(position[1])) / 16d;
            double positionZ = -Double.parseDouble(position[2]) / 16d;

            double sizeX = Double.parseDouble(size[0]) / 16d;
            double sizeY = Double.parseDouble(size[1]) / 16d;
            double sizeZ = Double.parseDouble(size[2]) / 16d;

            double offsetX = Double.parseDouble(offset[0]) / 16d;
            double offsetY = -Double.parseDouble(offset[1]) / 16d;
            double offsetZ = -Double.parseDouble(offset[2]) / 16d;

            double angleX = -Math.toRadians(Double.parseDouble(rotation[0]));
            double angleY = Math.toRadians(Double.parseDouble(rotation[1]));
            double angleZ = Math.toRadians(Double.parseDouble(rotation[2]));

            double textureOffsetU = Double.parseDouble(textureOffset[0]);
            double textureOffsetV = Double.parseDouble(textureOffset[1]);

            CubeTextureCoordinates textureCoordinates = new TechneCubeTextureCoordinates(textureWidth,
                    textureHeight, textureOffsetU, textureOffsetV, sizeX, sizeY, sizeZ);

            final String modelName = shapeName;
            MeshModel modelPart = new MeshModel(modelName);
            BlockRenderPipeline.drawCube(modelPart, offsetX, offsetY - sizeY, offsetZ - sizeZ, offsetX + sizeX,
                    offsetY, offsetZ, textureCoordinates);

            MatrixStack ms = new MatrixStack();
            ms.translate(positionX, positionY, positionZ);
            ms.rotate(Vector3D.PLUS_J, angleY);
            ms.rotate(Vector3D.PLUS_I, angleX);
            ms.rotate(Vector3D.PLUS_K, angleZ);
            modelPart.matrix = ms;
            modelPart.textureOffset = new Vector2D(Integer.parseInt(textureOffset[0]),
                    Integer.parseInt(textureOffset[1]));

            if (model.children.stream().anyMatch(m -> m.name.equals(modelName))) {
                throw new RenderException(
                        "Model contained duplicate part name: '" + shapeName + "' node #" + i);
            }

            model.children.add(modelPart);
        }
    } catch (ZipException e) {
        throw new RenderException("Model " + name + " is not a valid zip file");
    } catch (IOException e) {
        throw new RenderException("Model " + name + " could not be read", e);
    } catch (SAXException e) {
        throw new RenderException("Model " + name + " contains invalid XML", e);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

From source file:nova.core.wrapper.mc.forge.v17.wrapper.entity.backward.BWEntity.java

public BWEntity(net.minecraft.entity.Entity entity) {
    this.entity = entity;
    components.add(new MCEntityTransform(entity));

    components.add(new Damageable() {
        @Override//from  w  w w  .ja va 2s  . c o  m
        public void damage(double amount, DamageType type) {
            if (type == DamageType.generic) {
                entity.attackEntityFrom(DamageSource.generic, (float) amount);
            }
            // TODO: Apply other damage source wrappers?
        }
    });

    if (entity instanceof EntityLivingBase) {
        if (entity instanceof EntityPlayer) {
            MCPlayer player = components.add(new MCPlayer(this));
            player.faceDisplacement = () -> Vector3D.PLUS_J.scalarMultiply(entity.getEyeHeight());
        } else {
            Living living = components.add(new Living());
            living.faceDisplacement = () -> Vector3D.PLUS_J.scalarMultiply(entity.getEyeHeight());
        }
    }
}

From source file:org.jtrfp.trcl.beh.CollidesWithTerrain.java

@Override
public void _tick(long tickTimeMillis) {
    if (tickCounter++ % 2 == 0 && !recentlyCollided)
        return;/*from   w  w w  . j ava  2s .  c om*/
    recentlyCollided = false;
    final WorldObject p = getParent();
    final TR tr = p.getTr();
    final World world = tr.getWorld();
    final InterpolatingAltitudeMap aMap;
    final Mission mission = tr.getGame().getCurrentMission();
    try {
        aMap = mission.getOverworldSystem().getAltitudeMap();
    } catch (NullPointerException e) {
        return;
    }
    if (mission.getOverworldSystem().isTunnelMode())
        return;//No terrain to collide with while in tunnel mode.
    if (aMap == null)
        return;
    final double[] thisPos = p.getPosition();
    final double groundHeightNorm = aMap.heightAt((thisPos[0] / TR.mapSquareSize),
            (thisPos[2] / TR.mapSquareSize));
    final double groundHeight = groundHeightNorm * (world.sizeY / 2);
    final double ceilingHeight = (1.99
            - aMap.heightAt((thisPos[0] / TR.mapSquareSize), (thisPos[2] / TR.mapSquareSize)))
            * (world.sizeY / 2) + CEILING_Y_NUDGE;
    final Vector3D groundNormal = (aMap.normalAt((thisPos[0] / TR.mapSquareSize),
            (thisPos[2] / TR.mapSquareSize)));
    Vector3D downhillDirectionXZ = new Vector3D(groundNormal.getX(), 0, groundNormal.getZ());
    if (downhillDirectionXZ.getNorm() != 0)
        downhillDirectionXZ = downhillDirectionXZ.normalize();
    else
        downhillDirectionXZ = Vector3D.PLUS_J;
    final OverworldSystem overworldSystem = tr.getGame().getCurrentMission().getOverworldSystem();
    if (overworldSystem == null)
        return;
    final boolean terrainMirror = overworldSystem.isChamberMode();
    final double thisY = thisPos[1];
    boolean groundImpact = thisY < (groundHeight + (autoNudge ? nudgePadding : 0));
    final boolean ceilingImpact = (thisY > ceilingHeight && terrainMirror && !ignoreCeiling);
    final Vector3D ceilingNormal = new Vector3D(groundNormal.getX(), -groundNormal.getY(), groundNormal.getZ());
    Vector3D surfaceNormal = groundImpact ? groundNormal : ceilingNormal;
    final double dot = surfaceNormal.dotProduct(getParent().getHeading());
    if (terrainMirror && groundHeightNorm > .97) {
        groundImpact = true;
        surfaceNormal = downhillDirectionXZ;
    } //end if(smushed between floor and ceiling)

    if (groundLock) {
        recentlyCollided = true;
        thisPos[1] = groundHeight;
        p.notifyPositionChange();
        return;
    } //end if(groundLock)
    if (tunnelEntryCapable && groundImpact && dot < 0) {
        final OverworldSystem os = mission.getOverworldSystem();
        if (!os.isTunnelMode()) {
            TunnelEntranceObject teo = mission.getTunnelEntranceObject(
                    new Point((int) (thisPos[0] / TR.mapSquareSize), (int) (thisPos[2] / TR.mapSquareSize)));
            if (teo != null && !mission.isBossFight()) {
                mission.enterTunnel(teo.getSourceTunnel());
                return;
            }
        } //end if(above ground)
    } //end if(tunnelEntryCapable())

    if (groundImpact || ceilingImpact) {// detect collision
        recentlyCollided = true;
        double padding = autoNudge ? nudgePadding : 0;
        padding *= groundImpact ? 1 : -1;
        thisPos[1] = (groundImpact ? groundHeight : ceilingHeight) + padding;
        p.notifyPositionChange();
        if (dot < 0 || ignoreHeadingForImpact) {//If toward ground, call impact listeners.
            surfaceNormalVar = surfaceNormal;
            final Behavior behavior = p.getBehavior();
            behavior.probeForBehaviors(sub, SurfaceImpactListener.class);
        } //end if(pointedTowardGround)
    } // end if(collision)
}

From source file:org.jtrfp.trcl.beh.CubeCollisionBehavior.java

@Override
public void proposeCollision(WorldObject obj) {
    if (obj instanceof Player) {
        final WorldObject p = getParent();
        final double[] relPos = TR.twosComplimentSubtract(obj.getPosition(), p.getPosition(), new double[3]);
        final Rotation rot = new Rotation(Vector3D.PLUS_K, Vector3D.PLUS_J, p.getHeading(), p.getTop());
        final double[] rotPos = rot.applyInverseTo(new Vector3D(relPos)).toArray();
        final double[] rotTransPos = Vect3D.add(rotPos, origin, rotTransPosVar);
        if (TR.twosComplimentDistance(obj.getPosition(), p.getPosition()) < 80000)
            if (rotTransPos[0] > 0 && rotTransPos[0] < dims[0] && rotTransPos[1] > 0 && rotTransPos[1] < dims[1]
                    && rotTransPos[2] > 0 && rotTransPos[2] < dims[2]) {
                obj.probeForBehaviors(new AbstractSubmitter<DamageableBehavior>() {
                    @Override// w  w  w .j a  va  2 s  .  c  o  m
                    public void submit(DamageableBehavior item) {
                        item.proposeDamage(new GroundCollisionDamage(damageOnImpact));
                    }
                }, DamageableBehavior.class);
            } //end if(withinRange)
    } //end if(Player)
}

From source file:org.jtrfp.trcl.beh.FacingObject.java

@Override
public void _tick(long tickTimeMillis) {
    if (target != null) {
        final WorldObject parent = getParent();
        final double[] tPos = target.getPosition();
        final double[] pPos = parent.getPosition();
        Vect3D.subtract(tPos, pPos, work);
        parent.setHeading(new Vector3D(Vect3D.normalize(work, work)));
        Vect3D.cross(work, UP, perp);/*from w w  w  .  j av  a  2s . c o  m*/
        Vect3D.cross(perp, work, perp);
        parent.setTop(Vector3D.PLUS_J);
    } //end if(!null)
}

From source file:org.jtrfp.trcl.beh.ProjectileFiringBehavior.java

@Override
public void _tick(long tickTimeMillis) {
    if (tickTimeMillis > timeWhenNextFiringPermittedMillis && pendingFiring) {
        if (takeAmmo()) {
            final WorldObject p = getParent();
            Vector3D heading = this.firingHeading;
            if (this.firingHeading == null)
                heading = p.getHeading();
            for (int mi = 0; mi < multiplexLevel; mi++) {
                final Vector3D firingPosition = new Rotation(Vector3D.PLUS_K, Vector3D.PLUS_J, heading,
                        p.getTop()).applyTo(getNextFiringPosition());
                resetFiringTimer();//from w  ww  .jav  a  2  s  . co m
                projectileFactory.fire(
                        Vect3D.add(p.getPositionWithOffset(), firingPosition.toArray(), new double[3]), heading,
                        getParent());
            } //for(multiplex)
            heading = p.getHeading();
        } //end if(ammo)
        pendingFiring = false;
    } //end timeWhenNextfiringPermitted
}

From source file:org.jtrfp.trcl.flow.GameShell.java

public void applyGFXState() {
    final Renderer renderer = tr.mainRenderer.get();
    final Camera camera = renderer.getCamera();
    camera.probeForBehavior(SkyCubeCloudModeUpdateBehavior.class).setEnable(false);
    renderer.getSkyCube().setSkyCubeGen(DEFAULT_GRADIENT);
    camera.setHeading(Vector3D.PLUS_I);
    camera.setTop(Vector3D.PLUS_J);
}

From source file:org.jtrfp.trcl.flow.Mission.java

public Result go() {
    setMissionMode(new Mission.LoadingMode());
    synchronized (missionLock) {
        synchronized (missionEnd) {
            if (missionEnd[0] != null)
                return missionEnd[0];
        }/* ww w  .j  av a2s .  co  m*/
        tr.getThreadManager().setPaused(true);
        for (ProjectileFactory pf : tr.getResourceManager().getProjectileFactories())
            for (Projectile proj : pf.getProjectiles())
                proj.destroy();
        System.out.println("Starting GampeplayLevel loading sequence...");
        final LoadingProgressReporter rootProgress = LoadingProgressReporter.Impl
                .createRoot(new UpdateHandler() {
                    @Override
                    public void update(double unitProgress) {
                        game.getLevelLoadingScreen().setLoadingProgress(unitProgress);
                    }
                });
        final LoadingProgressReporter[] progressStages = rootProgress
                .generateSubReporters(LoadingStages.values().length);
        final Renderer renderer = tr.mainRenderer.get();
        renderer.getCamera().probeForBehavior(SkyCubeCloudModeUpdateBehavior.class).setEnable(false);
        renderer.getSkyCube().setSkyCubeGen(GameShell.DEFAULT_GRADIENT);
        final Camera camera = renderer.getCamera();
        camera.setHeading(Vector3D.PLUS_I);
        camera.setTop(Vector3D.PLUS_J);
        game.setDisplayMode(game.levelLoadingMode);
        game.getUpfrontDisplay().submitPersistentMessage(levelName);
        try {
            final ResourceManager rm = tr.getResourceManager();
            final Player player = tr.getGame().getPlayer();
            final World world = tr.getWorld();
            final TDFFile tdf = rm.getTDFData(lvl.getTunnelDefinitionFile());
            player.setActive(false);
            // Abort check
            synchronized (missionEnd) {
                if (missionEnd[0] != null)
                    return missionEnd[0];
            }

            overworldSystem = new OverworldSystem(tr, progressStages[LoadingStages.overworld.ordinal()]);
            getOverworldSystem().loadLevel(lvl, tdf);
            System.out.println("\t...Done.");
            // Install NAVs
            final NAVSystem navSystem = tr.getGame().getNavSystem();
            navSubObjects = rm.getNAVData(lvl.getNavigationFile()).getNavObjects();

            START s = (START) navSubObjects.get(0);
            Location3D l3d = s.getLocationOnMap();
            playerStartPosition[0] = TR.legacy2Modern(l3d.getZ());
            playerStartPosition[2] = TR.legacy2Modern(l3d.getX());
            final double HEIGHT_PADDING = 10000;
            playerStartPosition[1] = Math.max(
                    HEIGHT_PADDING + (world.sizeY / 2) * getOverworldSystem().getAltitudeMap()
                            .heightAt(TR.legacy2MapSquare(l3d.getZ()), TR.legacy2MapSquare(l3d.getX())),
                    TR.legacy2Modern(l3d.getY()));
            playerStartDirection = new ObjectDirection(s.getRoll(), s.getPitch(), s.getYaw());
            // ////// INITIAL HEADING
            player.setPosition(getPlayerStartPosition());
            player.setDirection(getPlayerStartDirection());
            player.setHeading(player.getHeading().negate());// Kludge to fix
            // incorrect heading
            ///////// STATE
            final Propelled propelled = player.probeForBehavior(Propelled.class);
            propelled.setPropulsion(propelled.getMinPropulsion());

            installTunnels(tdf, progressStages[LoadingStages.tunnels.ordinal()]);
            Factory f = new NAVObjective.Factory(tr);

            final LoadingProgressReporter[] navProgress = progressStages[LoadingStages.navs.ordinal()]
                    .generateSubReporters(navSubObjects.size());
            for (int i = 0; i < navSubObjects.size(); i++) {
                final NAVSubObject obj = navSubObjects.get(i);
                f.create(tr, obj, navs);
                navProgress[i].complete();
            } // end for(navSubObjects)
            navSystem.updateNAVState();
            player.resetVelocityRotMomentum();
            final String startX = System.getProperty("org.jtrfp.trcl.startX");
            final String startY = System.getProperty("org.jtrfp.trcl.startY");
            final String startZ = System.getProperty("org.jtrfp.trcl.startZ");
            final double[] playerPos = player.getPosition();
            if (startX != null && startY != null && startZ != null) {
                System.out.println("Using user-specified start point");
                final int sX = Integer.parseInt(startX);
                final int sY = Integer.parseInt(startY);
                final int sZ = Integer.parseInt(startZ);
                playerPos[0] = sX;
                playerPos[1] = sY;
                playerPos[2] = sZ;
                player.notifyPositionChange();
            } // end if(user start point)
            System.out.println("Start position set to " + player.getPosition()[0] + " "
                    + player.getPosition()[1] + " " + player.getPosition()[2]);
            System.out.println("Setting sun vector");
            final AbstractTriplet sunVector = lvl.getSunlightDirectionVector();
            tr.getThreadManager().submitToGL(new Callable<Void>() {
                @Override
                public Void call() throws Exception {
                    tr.mainRenderer.get().setSunVector(
                            new Vector3D(sunVector.getX(), sunVector.getY(), sunVector.getZ()).normalize());
                    return null;
                }
            }).get();
            System.out.println("\t...Done.");
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (System.getProperties().containsKey("org.jtrfp.trcl.flow.Mission.skipNavs")) {
            try {
                final int skips = Integer.parseInt(System.getProperty("org.jtrfp.trcl.flow.Mission.skipNavs"));
                System.out.println("Skipping " + skips + " navs.");
                for (int i = 0; i < skips; i++) {
                    removeNAVObjective(currentNAVObjective());
                } // end for(skips)
            } catch (NumberFormatException e) {
                System.err.println(
                        "Invalid format for property \"org.jtrfp.trcl.flow.Mission.skipNavs\". Must be integer.");
            }
        } // end if(containsKey)
          //System.out.println("Invoking JVM's garbage collector...");
          //TR.nuclearGC();
          //System.out.println("Mission.go() complete.");
          // Transition to gameplay mode.
          // Abort check
        synchronized (missionEnd) {
            if (missionEnd[0] != null)
                return missionEnd[0];
        } //end sync(missionEnd)
        tr.getThreadManager().submitToThreadPool(new Callable<Void>() {
            @Override
            public Void call() throws Exception {
                final SoundSystem ss = Mission.this.tr.soundSystem.get();
                MusicPlaybackEvent evt;
                Mission.this.tr.soundSystem.get().enqueuePlaybackEvent(evt = ss.getMusicFactory().create(
                        new GPUResidentMOD(tr, tr.getResourceManager().getMOD(lvl.getBackgroundMusicFile())),
                        true));
                synchronized (Mission.this) {
                    if (bgMusic != null)
                        return null;
                    bgMusic = evt;
                    bgMusic.play();
                } //end sync(Mission.this)
                return null;
            }// end call()
        });
        game.getUpfrontDisplay().removePersistentMessage();
        tr.getThreadManager().setPaused(false);
        if (showIntro) {
            setMissionMode(new Mission.IntroMode());
            game.getBriefingScreen().briefingSequence(lvl);
        }
        setMissionMode(new Mission.AboveGroundMode());
        getOverworldSystem().activate();
        final SkySystem skySystem = getOverworldSystem().getSkySystem();
        tr.mainRenderer.get().getCamera().probeForBehavior(SkyCubeCloudModeUpdateBehavior.class)
                .setEnable(true);
        renderer.getSkyCube().setSkyCubeGen(skySystem.getBelowCloudsSkyCubeGen());
        renderer.setAmbientLight(skySystem.getSuggestedAmbientLight());
        renderer.setSunColor(skySystem.getSuggestedSunColor());
        game.getNavSystem().activate();
        game.setDisplayMode(game.gameplayMode);

        game.getPlayer().setActive(true);
        tr.getGame().setPaused(false);
        //Wait for mission end
        synchronized (missionEnd) {
            while (missionEnd[0] == null) {
                try {
                    missionEnd.wait();
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
        //Completion summary
        if (missionEnd[0] != null)
            if (!missionEnd[0].isAbort()) {
                setMissionMode(new Mission.MissionSummaryMode());
                game.getBriefingScreen().missionCompleteSummary(lvl, missionEnd[0]);
            } //end if(proper ending)
        tr.getThreadManager().submitToThreadPool(new Callable<Void>() {
            @Override
            public Void call() throws Exception {
                bgMusic.stop();
                return null;
            }// end call()
        });
        cleanup();
        return missionEnd[0];
    } //end sync
}

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;//from  ww  w.j  a  va 2  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()));
    }
}