public class SpeedometerBase extends DecorativeBodyPart
{
// begin movable speedometer script
Ypr anim_ori; // rotation vector, dynamically assigned
int speedo_check_overflow = 0;
int speedo_check_underflow = 1;
int speedo_num_regions = 1; // will be equal to last array's index; number of speedometer "chunks"
float[] speedo_value = new float[5];
float[] speedo_pos = new float[5];
Thread AnimateThread;
int installed;
public SpeedometerBase( int id )
{
super( id );
speedo_num_regions = 3;
speedo_value[0] = 0.0;
speedo_pos[0] = 0;
speedo_value[1] = 80.0;
speedo_pos[1] = 120;
speedo_value[2] = 240.0;
speedo_pos[2] = 240;
speedo_value[3] = 300.0;
speedo_pos[3] = 270;
AnimateThread = new Thread( this, "Animate Thread" );
//animate_last_time = System.simTime();
AnimateThread.start();
}
public void resetAnim() // forces animation to reset
{
if( partOnSlot(991) )
partOnSlot(991).setSlotPos( 1, new Vector3(0,0,0), new Ypr(0,0,0) );
}
public void setGaugeNeedlePos( float deg )
{
if( partOnSlot(991) )
partOnSlot(991).setSlotPos( 1, new Vector3(0,0,0), new Ypr(0,0,deg2rad(deg)) );
}
public float rad2deg( float rad )
{
return(rad * 180 / 3.1415926);
}
public float deg2rad( float deg )
{
return(deg * 3.1415926 / 180);
}
public float calcPointSlope( float x, float x1, float y1, float x2, float y2 )
{
return (y1 + (x-x1)*((y2-y1)/(x2-x1)));
}
public float position_interp( float speed )
{
float deg;
if( speedo_pos.length != speedo_value.length )
return 0;
int max = speedo_num_regions;
// Anti-Overrun Checks
if( speedo_check_overflow && speed > speedo_value[max] )
speed = speedo_value[max];
else if ( speedo_check_underflow && speed < speedo_value[0] )
speed = speedo_value[0];
int region = -1;
int test_looper = 0;
if( speed < speedo_value[0] )
region = 0;
while( region == -1 )
{
if( speed >= speedo_value[test_looper] && speed <= speedo_value[test_looper+1] )
region = test_looper;
if( test_looper == max-1 )
region = max-1;
test_looper++;
}
deg = calcPointSlope( speed, speedo_value[region], speedo_pos[region], speedo_value[region+1], speedo_pos[region+1] );
return deg;
}
public void run()
{
while(1)
{
if(AnimateThread)
{
the_car = null;
getCar_LocalVersion();
if( the_car && GameLogic.player && GameLogic.player.car && the_car == GameLogic.player.car.chassis ) // player is using this car
{
installed = 1;
float speed = Math.sqrt(GameLogic.player.car.getSpeedSquare())*3.6;
setGaugeNeedlePos(position_interp(speed));
//setSlotPos( 991, new Vector3(0,0,0), new Ypr(0,0,-3.142) );
if(AnimateThread) AnimateThread.sleep(5); // Wait 0.005 sec (in theory, assuming 29 FPS)
}
else
{
if( installed )
{
setSlotPos( 991, new Vector3(0,0,0), new Ypr(0,0,0) );
installed = 0;
}
if(AnimateThread) AnimateThread.sleep( 2000 ); // Wait 2 sec
}
}
}
}
}