csharp_pain/Solar system/sss3d-source/sss3d/utils/joystick/JoystickInputDevice.java

302 lines
8.2 KiB
Java
Raw Normal View History

2014-06-26 15:13:46 +00:00
/*
File: JoystickInputDevice.java
University of Applied Science Berne,HTA-Biel/Bienne,
Computer Science Department.
Diploma thesis J3D Solar System Simulator
Originally written by Marcel Portner & Bernhard Hari (c) 2000
CVS - Information :
$Header: /var/cvsreps/projects/c450/2000/sss3d/source_diploma/sss3d/utils/joystick/JoystickInputDevice.java,v 1.2 2000/12/12 13:03:29 harib Exp $
$Author: harib $
$Date: 2000/12/12 13:03:29 $
$State: Exp $
*/
package sss3d.utils.joystick;
import Joystick;
import javax.media.j3d.*;
import javax.vecmath.*;
/**
* JoystickInputDevice is the class through which Java 3D and Java 3D application programs communicate
* with a joystick device driver. The joystick driver must be registered
* with Java 3D via a call toPhysicalEnvironment.addInputDevice(InputDevice).
* An joystick input device transfers information to the Java 3D implementation and
* Java 3D applications by writing transform information to sensors that the joystick device
* driver has created and manages.The joystick driver can update its sensor information each
* time the pollAndProcessInput method is called.
*
* @author Marcel Portner & Bernhard Hari
* @version $Revision: 1.2 $
*/
public class JoystickInputDevice implements InputDevice {
/**
* If a Joystick is available and running, this Flag will be true.
*/
public static boolean jStickAvailable=true;
private Joystick joy ;
private Sensor joySensor ;
private SensorRead joySensorRead = new SensorRead(4);//4 Buttons
private Transform3D joyTransform = new Transform3D();
private Transform3D rotTransform = new Transform3D();
private Transform3D rotTransformX = new Transform3D();
private float joyPos[] = new float[3];
private float joyRot[] = new float[3];
private Vector3f joyTransVec = new Vector3f();
private float sensitivity = 1.0f;
private float angularRate = 1.0f;
private float minValue = 0.1f;
private float x, y, z, firstX, firstY;
private int buttons[] = new int[4];
private int button = 0;
private boolean startup = true;
/**
* Creates an JoystickInputDevice given by its id.
*
* @param device the device id
*/
public JoystickInputDevice(int device) {
try {
if (jStickAvailable)
joy = new Joystick(device);
else System.out.println("No Joystick!!");
}
catch (SecurityException se) {
System.out.println("No Joystick!!");
jStickAvailable=false;
}
catch (UnsatisfiedLinkError ule) {
System.out.println("No Joystick!!");
jStickAvailable=false;
}
joySensor = new Sensor(this, 1, 4);
}
/**
* Sets the Joystick Id.
*
* @param device the id of the device
*/
public void setJoyDeviceId(int device){
try {
if (jStickAvailable)
joy = new Joystick(device);
else System.out.println("No Joystick!!");
}
catch (SecurityException se) {System.out.println("No Joystick!!");}
catch (UnsatisfiedLinkError ule) {System.out.println("No Joystick!!");}
}
/**
* Initialize the joystick position and rotation.
*
* @returns true if an instance of a joystick exists
*/
public boolean initialize() {
for (int j=0; j<3; j++) {
joyPos[j] = 0.0f;
joyRot[j] = 0.0f;
}
return (joy!=null);
}
/**
* Not used.
*/
public void close() {
}
/**
* Returns always DEMAND_DRIVEN;
*/
public int getProcessingMode() {
return DEMAND_DRIVEN;
}
/**
* Returns always 1;
*/
public int getSensorCount() {
return 1;
}
/**
* Returns the Sensor object given by the id
*
* @returns Sensor the sensor object
*/
public Sensor getSensor(int id) {
return joySensor;
}
/**
* Not used. Mode constantly set to DEMAND_DRIVEN
*/
public void setProcessingMode(int mode) {
}
/**
* Processes the input of the joystick
*
* @param joy a reference to the joystick object
* @param joySensor a reference to the sensor object
* @param joyPos[] a three-dimensional position array
* @param joyRot[] a three-dimensional rotation array
*/
public final void pollAndProcessInput(Joystick joy, Sensor joySensor, float joyPos[], float joyRot[]) {
if ( startup ) {
firstX = joy.getXPos();
firstY = joy.getYPos();
joySensorRead.setTime(System.currentTimeMillis());
joyTransform.setIdentity();
joySensorRead.set( joyTransform );
joySensorRead.setButtons( buttons );
joySensor.setNextSensorRead( joySensorRead );
startup = false;
} else {
button = joy.getButtons();
buttons[0]=(button & Joystick.BUTTON1);
buttons[1]=(button & Joystick.BUTTON2);
buttons[2]=(button & Joystick.BUTTON3);
buttons[3]=(button & Joystick.BUTTON4);
if ( (buttons[0] != 0) && (buttons[1] != 0)) {
setNominalPositionAndOrientation(); //reset view...
//System.out.println("Button 1 & 2 pressed");
return;
}
if ( buttons[2] != 0 ) {
// increase speed
// TODO
//System.out.println("Button 3 pressed");
}
if ( buttons[3] != 0 ) {
// reduce speed
// TODO
//System.out.println("Button 4 pressed");
}
x = joy.getXPos();
y = joy.getYPos();
//System.out.println("X Pos : "+x+" Y Pos"+y+" first time x"+firstX+" first time y"+firstY);
if (Math.abs(x) < minValue)
x = 0.0f;
if (Math.abs(y) < minValue)
y = 0.0f;
if (x>0.0f) {
joyRot[1] -= (x-minValue) * angularRate;
System.out.println("x > 0");
}
else if (x<0.0f) {
joyRot[1] -= (x+minValue) * angularRate;
System.out.println("x < 0");
}
if (y>0.0f) {
joyRot[0] += (y-minValue) * angularRate;
System.out.println("y > 0");
}
else if (y<0.0f) {
joyRot[0] += (y+minValue) * angularRate;
System.out.println("y < 0");
}
//joyPos[2] += y * sensitivity;
//joyTransVec.x = joyPos[0];
//joyTransVec.y = joyPos[1];
//joyTransVec.z = joyPos[2];
rotTransform.setIdentity();
rotTransform.rotZ(joyRot[1]);
rotTransformX.setIdentity();
rotTransformX.rotX(joyRot[0]);
joyTransform.setIdentity();
//joyTransform.set(joyTransVec);
joyTransform.mul(rotTransformX);
joyTransform.mul(rotTransform);
joySensorRead.setTime(System.currentTimeMillis());
joySensorRead.set( joyTransform );
joySensorRead.setButtons( buttons );
joySensor.setNextSensorRead( joySensorRead );
}
}
/**
* Calls method pollAndProcessInput(joy, joySensor, joyPos, joyRot).
*/
public final void pollAndProcessInput() {
pollAndProcessInput(joy, joySensor, joyPos, joyRot);
}
/**
* Not used.
*/
public void processStreamInput() {
}
/**
* Sets the object to the initial position.
*/
public final void setNominalPositionAndOrientation() {
initialize();
joySensorRead.setTime(System.currentTimeMillis());
joyTransform.setIdentity();
joySensorRead.set(joyTransform);
joySensor.setNextSensorRead(joySensorRead);
}
/**
* Sets the sensitivity of the joystick device.
*
* @param value the sensitivity
*/
public void setSensitivity(float value) {
sensitivity = value;
//System.out.println("Sensitivity="+value);
}
/**
* Returns the sensitivity of the joystick device.
*
* @returns float the sensitivity
*/
public float getSensitivity() {
return sensitivity;
}
/**
* Sets the angular rate of the joystick device.
*
* @param value the angular rate
*/
public void setAngularRate(float value) {
angularRate = value;
//System.out.println("AngularRate="+value);
}
/**
* Returns the angular rate of the joystick device.
*
* @returns float the angular rate
*/
public float getAngularRate() {
return angularRate;
}
}