Mouse follow demo

From JPCT
Revision as of 07:41, 23 June 2014 by Corey (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Mouse follow demo


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.reproject2D3D(world.getCamera(), fb, x, y);
		if (ray!=null) {

			SimpleVector norm=ray.normalize();
			Matrix mat=world.getCamera().getBack();
			mat=mat.invert3x3();
			norm.matMul(mat);

			float f=world.calcMinDistance(world.getCamera().getPosition(), norm, 1000);
			if (f!=Object3D.COLLISION_NONE) {
				SimpleVector offset=new SimpleVector(norm);
				norm.scalarMul(f);
				norm=norm.calcSub(offset);
				cube.getTranslationMatrix().setIdentity();
				cube.translate(norm);
				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();
	}