#include <acknex.h>
void fncRotate ()
{
VECTOR vPos, vTarget;
vec_set ( &vPos, &camera->x );
vec_set ( &vTarget, &mouse_dir3d );
vec_scale ( &vTarget, 1000 );
vec_add ( &vTarget, &vPos );
c_trace ( &vPos, &vTarget, NULL );
if ( HIT_TARGET )
{
ENTITY *ent = you;
VECTOR vDir1;
vec_diff ( &vDir1, &hit->x, &you->x );
vec_normalize ( &vDir1, 1 );
ANGLE angOld;
vec_set ( &angOld, &you->pan );
while ( mouse_left )
{
vec_set ( &vPos, &camera->x );
vec_set ( &vTarget, &mouse_dir3d );
vec_scale ( &vTarget, 1000 );
vec_add ( &vTarget, &vPos );
c_trace ( &vPos, &vTarget, NULL );
if ( HIT_TARGET )
{
if ( you == ent )
{
draw_point3d ( &hit->x, COLOR_WHITE, 100, 2 );
VECTOR vDir2, vAxis;
vec_diff ( &vDir2, &hit->x, &you->x );
vec_normalize ( &vDir2, 1 );
vec_cross ( &vAxis , &vDir1 , &vDir2 );
ANGLE angRot;
ang_for_axis( &angRot, &vAxis, acosv ( vec_dot ( &vDir1 , &vDir2 ) ) );
vec_set ( &you->pan, &angOld );
ang_add( &you->pan, &angRot );
}
}
DEBUG_VAR ( ent->pan, 10 );
DEBUG_VAR ( ent->tilt, 40 );
DEBUG_VAR ( ent->roll, 70 );
wait(1);
}
}
}
void main ()
{
mouse_mode = 4;
wait(1);
level_load ( "" );
camera->x -= 100;
ENTITY *ent = ent_create ( "sphere.mdl", nullvector, NULL );
ent->flags |= POLYGON;
on_mouse_left = fncRotate;
while ( !key_esc )
wait(1);
ent_remove ( ent );
sys_exit ( NULL );
}