Mouse follow demo

From JPCT
Jump to: navigation, search

Mouse follow demo

A simle mouse follow demo that uses the software renderer. The same principle applies to hardware renderer or jPCT-AE though.


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

import com.threed.jpct.Camera;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.IRenderer;
import com.threed.jpct.Interact2D;
import com.threed.jpct.Lights;
import com.threed.jpct.Matrix;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.World;
import com.threed.jpct.util.Light;

public class MouseFollowDemo extends JFrame implements MouseMotionListener {

	private static final long serialVersionUID = 1L;

	private Graphics g = null;
	private FrameBuffer fb = null;
	private World world = null;
	private Object3D plane = null;
	private Object3D ramp = null;
	private Object3D cube = null;
	private Object3D cube2 = null;
	private Object3D sphere = null;

	private boolean doloop = true;

	private int x = 320;
	private int y = 240;

	public MouseFollowDemo() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setSize(640, 480);
		setResizable(false);
		setLocationRelativeTo(null);
		setVisible(true);
		this.addMouseMotionListener(this);
		g = getGraphics();
	}

	public void mouseMoved(MouseEvent m) {
		x = m.getX();
		y = m.getY();
	}

	public void mouseDragged(MouseEvent m) {
	}

	private void initStuff() {
		fb = new FrameBuffer(640, 480, FrameBuffer.SAMPLINGMODE_NORMAL);
		world = new World();
		fb.enableRenderer(IRenderer.RENDERER_SOFTWARE);

		ramp = Primitives.getCube(20);
		ramp.setAdditionalColor(Color.red);
		plane = Primitives.getPlane(20, 10);
		plane.setAdditionalColor(Color.GREEN);
		sphere = Primitives.getSphere(30);
		sphere.setAdditionalColor(Color.CYAN);
		sphere.translate(-50, 10, 50);
		cube2 = Primitives.getCube(20);
		cube2.setAdditionalColor(Color.ORANGE);
		cube2.translate(60, -20, 60);

		plane.rotateX((float) Math.PI / 2f);
		ramp.rotateX((float) Math.PI / 2f);

		cube = Primitives.getCube(2);

		plane.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
		ramp.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
		sphere.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
		cube2.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);

		world.addObject(plane);
		world.addObject(ramp);
		world.addObject(cube);
		world.addObject(sphere);
		world.addObject(cube2);

		cube.translate(-50, -10, -50);

		Light light = new Light(world);
		light.setPosition(new SimpleVector(0, -80, 0));
		light.setIntensity(40, 25, 22);

		world.buildAllObjects();
	}

	private void follow() {
		SimpleVector ray = Interact2D.reproject2D3DWS(world.getCamera(), fb, x, y);
		if (ray != null) {
			ray = ray.normalize();

			float f = world.calcMinDistance(world.getCamera().getPosition(), ray, 1000);
			if (f != Object3D.COLLISION_NONE) {
				SimpleVector offset = new SimpleVector(ray);
				ray.scalarMul(f);
				ray = ray.calcSub(offset);
				cube.getTranslationMatrix().setIdentity();
				cube.translate(ray);
				cube.translate(world.getCamera().getPosition());
			}
		}
	}

	private void doIt() throws Exception {
		Camera cam = world.getCamera();
		cam.moveCamera(Camera.CAMERA_MOVEOUT, 100);
		cam.moveCamera(Camera.CAMERA_MOVEUP, 160);
		cam.lookAt(plane.getTransformedCenter());

		world.getLights().setOverbrightLighting(Lights.OVERBRIGHT_LIGHTING_DISABLED);

		while (doloop) {
			follow();
			fb.clear();
			world.renderScene(fb);
			world.draw(fb);
			fb.update();
			fb.display(g);
			Thread.sleep(10);
		}
		fb.disableRenderer(IRenderer.RENDERER_OPENGL);
		System.exit(0);
	}

	public static void main(String[] args) throws Exception {
		MouseFollowDemo cd = new MouseFollowDemo();
		cd.initStuff();
		cd.doIt();
	}
}