At last I did it and the solution was really the vec_for_screen command, for the benefit of other people here is the code:


function p_alphafade(PARTICLE *p)
{
p.alpha -= p.skill_a*time_step;
if (p.alpha <= 0) p.lifespan = 0;
}

function p_trace(PARTICLE *p)
{
VECTOR vTemp;
set(p, BRIGHT|TRANSLUCENT|BEAM);
p.size = 1;
p.skill_a = 10; // fade factor
p.event = p_alphafade;
p.red =255;
p.blue=20;
p.green=128;
}

action tracer_right()
{
VECTOR v1;
v1.x = mouse_pos.x;
v1.y = mouse_pos.y;
v1.z = 15;
vec_for_screen(v1,camera);
VECTOR v2;
vec_set(v2, vector(0, 50, -30));
vec_rotate(v2, camera.pan);
effect(p_trace,1,v1,v2);
ent_remove(me);
}

action tracer_left()
{
VECTOR v1;
v1.x = mouse_pos.x;
v1.y = mouse_pos.y;
v1.z = 15;
vec_for_screen(v1,camera);
VECTOR v2;
vec_set(v2, vector(0, -50, -30));
vec_rotate(v2, camera.pan);
effect(p_trace,1,v1,v2);
ent_remove(me);
}

function main()
{
video_screen = 1;
video_mode = 12;
mouse_mode = 4;
vec_set(sky_color,vector(0,0,0));
level_load(NULL);
video_window(NULL,NULL,0,"Laser demo");
camera.x=0;
camera.y=0;
camera.z=0;
camera.pan=0;
camera.tilt=0;
while (1){
//camera.pan -= mouse_force.x*2;
//camera.tilt += mouse_force.y*2;
if (mouse_left == 1){
if(proc_status(tracer_right) < 1)
{
ent_create(NULL,NULL,tracer_right);
}
if(proc_status(tracer_left) < 1)
{
ent_create(NULL,NULL,tracer_left);
}
}
wait(1);
}
}