00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "P_TugTool.h"
00024 #include "utilities.h"
00025 #include "Displayable.h"
00026
00027 TugTool::TugTool(int id, VMDApp *vmdapp, Displayable *disp)
00028 : Tool(id, vmdapp, disp) {
00029 int i;
00030 for(i=0;i<3;i++) offset[i]=0;
00031 tugging=0;
00032 springscale = 1.0;
00033 }
00034
00035 void TugTool::do_event() {
00036
00037 if(!tugging) {
00038 tool_location_update();
00039 }
00040
00041 if (istugging()) {
00042 if (!tugging || !is_targeted()) {
00043 if(!target(TARGET_TUG, tugged_pos, 0)) {
00044
00045 tugging = 0;
00046 return;
00047 }
00048 tugging = 1;
00049
00050 vec_sub(offset, Tool::position(), tugged_pos);
00051 start_tug();
00052 }
00053 target(TARGET_TUG, tugged_pos, 1);
00054
00055 float offset_tugged_pos[3];
00056 vec_add(offset_tugged_pos,offset,tugged_pos);
00057 set_tug_constraint(offset_tugged_pos);
00058
00059
00060
00061 float diff[3];
00062 vec_sub(diff, Tool::position(), offset_tugged_pos);
00063
00064 vec_scale(diff,dtool->scale/getTargetScale(),diff);
00065
00066 vec_scale(diff,forcescale,diff);
00067 do_tug(diff);
00068 }
00069 else if (tugging) {
00070 let_go();
00071 tugging = 0;
00072 forceoff();
00073 offset[0]=offset[1]=offset[2]=0;
00074 }
00075 }
00076
00077 void TugTool::set_tug_constraint(float *cpos) {
00078 setconstraint(50, cpos);
00079 sendforce();
00080 }
00081
00082 void TugTool::do_tug(float *force) {
00083 tug(force);
00084 }
00085