/**********************************************************************
This file is part of Crack dot Com's free source code release of
Golgotha.
for
information about compiling & licensing issues visit this URL
If that doesn't help, contact Jonathan Clark at
golgotha_source@usa.net (Subject should have "GOLG" in it)
***********************************************************************/
#include "editor/dialogs/pick_win.hh"
#include "image/image.hh"
#include "math/pi.hh"
#include "math/transform.hh"
#include "draw_context.hh"
#include "image/image.hh"
#include "image/color.hh"
#include "window/win_evt.hh"
#include "r1_api.hh"
#include "tmanage.hh"
#include "g1_render.hh"
#include "r1_win.hh"
#include "r1_clip.hh"
#include "resources.hh"
void g1_3d_pick_window::parent_draw(i4_draw_context_class &context)
{
i4_transform_class tmp;
i4_transform_class transform;
transform.identity();
tmp.translate(0,0,camera.view_dist); transform.multiply(tmp);
tmp.rotate_y(camera.theta); transform.multiply(tmp);
tmp.rotate_x(i4_pi()-camera.phi); transform.multiply(tmp);
tmp.translate(-camera.center_x,
-camera.center_y,
-camera.center_z);
transform.multiply(tmp);
// context.add_both_dirty(0,0,local_image->width()-1,local_image->height()-1);
g1_draw_context_class gc;
gc.window_setup(0,0, width(), height(),
g1_render.center_x, g1_render.center_y,
g1_render.scale_x, g1_render.scale_y,
g1_render.ooscale_x, g1_render.ooscale_y);
r1_render_api_class *render_api=g1_render.r_api;
render_api->default_state();
render_api->set_shading_mode(R1_SHADE_DISABLED);
render_api->clear_area(0,0, width()-1, height()-1,
active ? 0xffffff : 0x9f9f9f, r1_far_clip_z);
gc.transform=&transform;
gc.screen=local_image;
gc.context=&context;
gc.draw_editor_stuff=i4_T;
g1_render.frame_ratio=1;
r1_far_clip_z=5000;
if (active && !camera.stopped)
{
i4_time_class now;
camera.zrot+=now.milli_diff(start)/2000.0;
start.get();
i4_float d=fabs(cos(camera.zrot)*4)-i4_pi();
camera.theta=d;
if (camera.theta>2*i4_pi())
camera.theta-=2*i4_pi();
if (camera.theta<0)
camera.theta+=2*i4_pi();
}
else
start.get();
r1_far_clip_z=5000;
render_api->disable_texture();
render_api->clear_area(0,0,width()-1,height()-1,0,r1_far_clip_z);
draw_object(&gc);
r1_texture_manager_class *tman=render_api->get_tmanager();
}
void g1_3d_pick_window::receive_event(i4_event *ev)
{
if (ev->type()==i4_event::MOUSE_BUTTON_DOWN)
{
request_redraw(i4_T);
do_press();
i4_kernel.send(reaction);
camera.stopped=i4_T;
CAST_PTR(mev, i4_mouse_button_down_event_class, ev);
if (!grabr && mev->but==i4_mouse_button_down_event_class::RIGHT)
{
grabr=i4_T;
if (!grabl)
{
i4_window_request_mouse_grab_class grab(this);
i4_kernel.send_event(parent, &grab);
}
}
else if (!grabl && mev->but==i4_mouse_button_down_event_class::LEFT)
{
grabl=i4_T;
if (!grabr)
{
i4_window_request_mouse_grab_class grab(this);
i4_kernel.send_event(parent, &grab);
}
do_press();
}
}
else if (ev->type()==i4_event::MOUSE_BUTTON_UP)
{
CAST_PTR(mev, i4_mouse_button_up_event_class, ev);
if (grabr && mev->but==i4_mouse_button_up_event_class::RIGHT)
{
grabr=i4_F;
if (!grabl)
{
i4_window_request_mouse_ungrab_class ungrab(this);
i4_kernel.send_event(parent, &ungrab);
}
}
else if (grabl && mev->but==i4_mouse_button_up_event_class::LEFT)
{
grabl=i4_F;
if (!grabr)
{
i4_window_request_mouse_ungrab_class ungrab(this);
i4_kernel.send_event(parent, &ungrab);
}
}
} else if (ev->type()==i4_event::MOUSE_MOVE)
{
CAST_PTR(mev, i4_mouse_move_event_class, ev);
if (grabl)
{
camera.theta -= 0.01*(mev->x - last_mx);
camera.phi -= 0.01*(mev->y - last_my);
if (camera.theta<0.0)
camera.theta += i4_pi()*2;
else if (camera.theta>i4_pi()*2)
camera.theta -= i4_pi()*2;
if (camera.phi<0.0)
camera.phi = 0.0;
else if (camera.phi>i4_pi())
camera.phi = i4_pi();
request_redraw(i4_F);
}
if (grabr)
{
camera.view_dist += (mev->y - last_my)*0.1;
request_redraw(i4_F);
}
last_mx=mev->x;
last_my=mev->y;
}
else if (ev->type()==i4_event::KEY_PRESS)
{
CAST_PTR(kev, i4_key_press_event_class, ev);
if (kev->key=='x')
camera.theta+=0.2;
else if (kev->key=='X')
camera.theta-=0.2;
if (kev->key=='y')
camera.phi+=0.2;
else if (kev->key=='Y')
camera.phi-=0.2;
}
i4_menu_item_class::receive_event(ev);
}