Ok, I got it!

The only difference with my previous example is that you need to convert the bounds vector to that pseudo view space before computing the symmetric point of the rectangle.

Here you go:
Code:
#include <acknex.h>

void vec2d_rotate ( VECTOR *_v, var angle )
{
	var x = fcos(angle,_v->x) - fsin(angle,_v->y);
	_v->y = fsin(angle,_v->x) + fcos(angle,_v->y);
	_v->x = x;
}

void mouseOnZ0 ( VECTOR *_v )
{
	vec_set ( _v, &mouse_dir3d );
	vec_scale ( _v, -camera->z/_v->z );
	vec_add ( _v, &camera->x );
}

void onMouseLeft ()
{
	VECTOR vStart, vEnd;
	mouseOnZ0 ( &vStart );
	
	while ( mouse_left )
	{
		mouseOnZ0 ( &vEnd );
		
		VECTOR vCenter, vBounds;
		vec_lerp ( &vCenter, &vStart, &vEnd, 0.5 );
		vec_diff ( &vBounds, &vStart, &vCenter );
		vec2d_rotate ( &vBounds, -camera->pan );
		
		VECTOR vP1, vP2;
		vec_set ( &vP1, &vBounds );
		vec_set ( &vP2, vector(vBounds.x,-vBounds.y,-vBounds.z) );
		vec2d_rotate ( &vP1, camera->pan );
		vec2d_rotate ( &vP2, camera->pan );
		
		draw_line3d ( vector ( vCenter.x+vP1.x, vCenter.y+vP1.y, 0), COLOR_RED, 0 );  
		draw_line3d ( vector ( vCenter.x+vP1.x, vCenter.y+vP1.y, 0), COLOR_RED, 100 );  
		draw_line3d ( vector ( vCenter.x+vP2.x, vCenter.y+vP2.y, 0), COLOR_RED, 100 );
		draw_line3d ( vector ( vCenter.x-vP1.x, vCenter.y-vP1.y, 0), COLOR_RED, 100 ); 
		draw_line3d ( vector ( vCenter.x-vP2.x, vCenter.y-vP2.y, 0), COLOR_RED, 100 ); 
		draw_line3d ( vector ( vCenter.x+vP1.x, vCenter.y+vP1.y, 0), COLOR_RED, 100 );
		draw_line3d ( vector ( vCenter.x+vP1.x, vCenter.y+vP1.y, 0), COLOR_RED, 0 );
		
		wait(1);
	}
}

void main ()
{
	video_mode = 10;
	mouse_mode = 4;
	wait(1);
	level_load ( "" );
	camera->tilt = -30;
	camera->pan = 30;
	
	on_mouse_left = onMouseLeft;
	
	while ( !key_esc )
	{
		camera->pan += key_force.x * 10 * time_step;
		vec_for_angle ( &camera->x, &camera->pan );
		vec_scale ( &camera->x, -1000 );
		
		// World space axis
		draw_line3d ( vector(1000,0,0), COLOR_WHITE, 0 );
		draw_line3d ( vector(1000,0,0), COLOR_WHITE, 100 );
		draw_line3d ( vector(-1000,0,0), COLOR_WHITE, 100 );
		draw_line3d ( vector(-1000,0,0), COLOR_WHITE, 0 );
		draw_line3d ( vector(0,1000,0), COLOR_WHITE, 0 );
		draw_line3d ( vector(0,1000,0), COLOR_WHITE, 100 );
		draw_line3d ( vector(0,-1000,0), COLOR_WHITE, 100 );
		draw_line3d ( vector(0,-1000,0), COLOR_WHITE, 0 );
		
		wait(1);
	}
	
	sys_exit ( NULL );
}



Salud!


edited______________

a bit faster version
Code:
VECTOR vCenter, vBounds;
vec_lerp ( &vCenter, &vStart, &vEnd, 0.5 );
vec_diff ( &vBounds, &vStart, &vCenter );

VECTOR vP1, vP2;
vec_set ( &vP1, &vBounds );
vec_set ( &vP2, &vBounds );
vec2d_rotate ( &vP2, -camera->pan );
vP2.y *= -1;
vP2.z *= -1;
vec2d_rotate ( &vP2, camera->pan );



Last edited by txesmi; 10/08/16 07:21.