172 lines
4.3 KiB
Java
172 lines
4.3 KiB
Java
//**********************************************************************************************
|
|
// (C) Copyright 2002 by Dipl. Phys. Joerg Plewe, HARDCODE Development
|
|
// All rights reserved. Copying, modification,
|
|
// distribution or publication without the prior written
|
|
// consent of the author is prohibited.
|
|
//
|
|
// Created on 22. Februar 2002, 13:21
|
|
//**********************************************************************************************
|
|
package de.hardcode.jxinput.j3d;
|
|
|
|
import javax.media.j3d.InputDevice;
|
|
import javax.media.j3d.Sensor;
|
|
import javax.media.j3d.SensorRead;
|
|
import javax.vecmath.Vector3d;
|
|
import javax.media.j3d.Transform3D;
|
|
import de.hardcode.jxinput.JXInputManager;
|
|
|
|
|
|
/**
|
|
* Implementation of Java3D's InputDevice
|
|
*
|
|
* @author Herkules
|
|
*/
|
|
public class J3DInputDevice
|
|
implements InputDevice
|
|
{
|
|
private Vector3d mPosition = new Vector3d();
|
|
private Transform3D mNewTransform = new Transform3D();
|
|
|
|
private Transform3D mRotTransX = new Transform3D();
|
|
private Transform3D mRotTransY = new Transform3D();
|
|
private Transform3D mRotTransZ = new Transform3D();
|
|
|
|
private Vector3d mInitPos = new Vector3d( 0.0, 0.0, 0.0 );
|
|
|
|
private Sensor mSensor = new Sensor( this );
|
|
private SensorRead mSensorRead = new SensorRead();
|
|
|
|
private DeviceConfiguration mConfig;
|
|
|
|
/**
|
|
* Creates a new instance of J3DInputDevice.
|
|
*/
|
|
public J3DInputDevice( DeviceConfiguration config )
|
|
{
|
|
mConfig = config;
|
|
setNominalPositionAndOrientation();
|
|
}
|
|
|
|
|
|
public void close()
|
|
{
|
|
// Intentionally empty
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieve processing mode.
|
|
* For this device, it always is NON_BLOCKING.
|
|
*/
|
|
public int getProcessingMode()
|
|
{
|
|
return InputDevice.NON_BLOCKING;
|
|
}
|
|
|
|
|
|
/**
|
|
* Don't care for the index, I only support one sensor.
|
|
* And I deliver that.
|
|
*/
|
|
public Sensor getSensor( int param )
|
|
{
|
|
return mSensor;
|
|
}
|
|
|
|
|
|
/**
|
|
* Tell the world about the only one sensor I support.
|
|
*/
|
|
public int getSensorCount()
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
|
|
/**
|
|
* Well - initialize!
|
|
* Nothing to do here.
|
|
*/
|
|
public boolean initialize()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* The main update method.
|
|
*/
|
|
public void pollAndProcessInput()
|
|
{
|
|
JXInputManager.updateFeatures();
|
|
|
|
mSensorRead.setTime( JXInputManager.getLastUpdateTime() );
|
|
|
|
mRotTransX.rotX( mConfig.getRotational( DeviceConfiguration.AXIS_X ) );
|
|
mRotTransY.rotY( mConfig.getRotational( DeviceConfiguration.AXIS_Y ) );
|
|
mRotTransZ.rotZ( mConfig.getRotational( DeviceConfiguration.AXIS_Z ) );
|
|
|
|
mPosition.set(
|
|
mConfig.getTranslational( DeviceConfiguration.AXIS_X ),
|
|
mConfig.getTranslational( DeviceConfiguration.AXIS_Y ),
|
|
mConfig.getTranslational( DeviceConfiguration.AXIS_Z )
|
|
);
|
|
|
|
mNewTransform.set( mPosition );
|
|
|
|
mNewTransform.mul( mRotTransX );
|
|
mNewTransform.mul( mRotTransY );
|
|
mNewTransform.mul( mRotTransZ );
|
|
|
|
mSensorRead.set( mNewTransform );
|
|
mSensor.setNextSensorRead( mSensorRead );
|
|
}
|
|
|
|
|
|
/**
|
|
* Not called by current j3d implementation.
|
|
*/
|
|
public void processStreamInput()
|
|
{
|
|
// Intentionally empty
|
|
}
|
|
|
|
|
|
/**
|
|
* Reset state.
|
|
*/
|
|
public void setNominalPositionAndOrientation()
|
|
{
|
|
mSensorRead.setTime( JXInputManager.getLastUpdateTime() );
|
|
|
|
mRotTransX.rotX( 0.0 );
|
|
mRotTransY.rotY( 0.0 );
|
|
mRotTransZ.rotZ( 0.0 );
|
|
|
|
mPosition.set( mInitPos );
|
|
|
|
mNewTransform.set( mPosition );
|
|
|
|
mNewTransform.mul( mRotTransX );
|
|
mNewTransform.mul( mRotTransY );
|
|
mNewTransform.mul( mRotTransZ );
|
|
|
|
mSensorRead.set( mNewTransform );
|
|
mSensor.setNextSensorRead( mSensorRead );
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Set the processing mode.
|
|
* Only NON_BLOCKING is allowed!
|
|
*/
|
|
public void setProcessingMode(int param)
|
|
{
|
|
if ( param != InputDevice.NON_BLOCKING )
|
|
throw new IllegalArgumentException("Processing mode must be NON_BLOCKING");
|
|
|
|
}
|
|
|
|
}
|