void model_calc_draw_bone_position(model_type *model,model_draw_setup *draw_setup,int pose_idx,int bone_idx,int *x,int *y,int *z) { draw_setup->poses[0].idx_1=pose_idx; draw_setup->poses[0].idx_2=-1; draw_setup->poses[0].factor=0.0f; draw_setup->poses[0].acceleration=0.0f; model_create_draw_bones(model,draw_setup); model_get_draw_bone_position(draw_setup,bone_idx,x,y,z); }
bool model_wind_hit_box_click(d3pnt *start_pnt) { int n,k,box_idx,pt_idx,xsz,zsz,ysz,offx,offz,offy, kx,ky,kz; bool model_hit_box_drag_on; d3rect mbox; d3pnt org_pnt,org_cnt,last_pnt,pnt,edge_pnt[8]; d3fpnt hand_pnt; model_box_type *box; model_play(model_play_mode_stop); // setup the draw pose model_draw_setup_pose(state.model.cur_pose_idx); model_create_draw_bones(&model,&draw_setup); // setup transforms model_draw_gl_setup(0); model_draw_setup_project_point(); // find a click box_idx=pt_idx=-1; for (n=0;n!=model.nhit_box;n++) { box=&model.hit_boxes[n].box; xsz=box->size.x/2; offx=box->offset.x; zsz=box->size.z/2; offz=box->offset.z; ysz=box->size.y; offy=box->offset.y; edge_pnt[0].x=edge_pnt[1].x=edge_pnt[4].x=edge_pnt[5].x=offx-xsz; edge_pnt[2].x=edge_pnt[3].x=edge_pnt[6].x=edge_pnt[7].x=offx+xsz; edge_pnt[0].y=edge_pnt[1].y=edge_pnt[2].y=edge_pnt[3].y=offy-ysz; edge_pnt[4].y=edge_pnt[5].y=edge_pnt[6].y=edge_pnt[7].y=offy; edge_pnt[0].z=edge_pnt[3].z=edge_pnt[4].z=edge_pnt[7].z=offz-zsz; edge_pnt[1].z=edge_pnt[2].z=edge_pnt[5].z=edge_pnt[6].z=offz+zsz; for (k=0;k!=8;k++) { model_get_point_position(&draw_setup,&edge_pnt[k]); hand_pnt.x=(float)edge_pnt[k].x; hand_pnt.y=(float)edge_pnt[k].y; hand_pnt.z=(float)edge_pnt[k].z; if (model_wind_draw_bone_click_box(start_pnt,&hand_pnt)) { box_idx=n; pt_idx=k; break; } } if (box_idx!=-1) break; } if (box_idx==-1) return(FALSE); // get original size box=&model.hit_boxes[box_idx].box; memmove(&org_pnt,&box->size,sizeof(d3pnt)); memmove(&org_cnt,&box->offset,sizeof(d3pnt)); // drag handle model_hit_box_drag_on=FALSE; last_pnt.x=last_pnt.y=-1; os_set_drag_cursor(); model_wind_get_box(&mbox); while (!os_track_mouse_location(&pnt,&mbox)) { if ((last_pnt.x==pnt.x) && (last_pnt.y==pnt.y)) continue; memmove(&last_pnt,&pnt,sizeof(d3pnt)); kx=(pnt.x-start_pnt->x)*5; ky=(pnt.y-start_pnt->y)*5; kz=0; rotate_point_center(&kx,&ky,&kz,state.model.ang.x,state.model.ang.y,0.0f); if ((pt_idx==0) || (pt_idx==1) || (pt_idx==4) || (pt_idx==5)) { box->size.x=org_pnt.x-kx; } else { box->size.x=org_pnt.x+kx; } if ((pt_idx==0) || (pt_idx==1) || (pt_idx==2) || (pt_idx==3)) { box->size.y=org_pnt.y-ky; } else { box->size.y=org_pnt.y+ky; box->offset.y=org_cnt.y+ky; } if ((pt_idx==0) || (pt_idx==3) || (pt_idx==4) || (pt_idx==7)) { box->size.z=org_pnt.z-kz; } else { box->size.z=org_pnt.z+kz; } // draw the model main_wind_draw(); model_hit_box_drag_on=TRUE; } os_set_arrow_cursor(); // redraw model main_wind_draw(); return(model_hit_box_drag_on); }
bool model_wind_bone_click(d3pnt *start_pnt,bool double_click) { int n,k,x,drag_handle; float org_ang,org_mov, bone_drag_handle_offset; float *ang,*mov; d3rect mbox; d3pnt pnt,last_pnt; d3fpnt bone_pnt,hand_pnt; d3vct vct; d3ang hang,rot; model_bone_type *bone; model_draw_bone_type *draw_bone; if (model.nbone==0) return(FALSE); model_play(model_play_mode_stop); // setup the draw pose model_draw_setup_pose(state.model.cur_pose_idx); model_create_draw_bones(&model,&draw_setup); // setup transforms model_draw_gl_setup(0); model_draw_setup_project_point(); // click on any drag handles? drag_handle=drag_handle_none; if ((state.model.cur_pose_idx!=-1) && (state.model.cur_bone_idx!=-1)) { bone=&model.bones[state.model.cur_bone_idx]; draw_bone=&draw_setup.bones[state.model.cur_bone_idx]; bone_pnt.x=draw_bone->fpnt.x+draw_setup.move.x; bone_pnt.y=draw_bone->fpnt.y+draw_setup.move.y; bone_pnt.z=draw_bone->fpnt.z+draw_setup.move.z; bone_drag_handle_offset=model_draw_bones_drag_handle_offset(); model_draw_bones_get_handle_rot(state.model.cur_bone_idx,&rot); // x drag bone vct.x=bone_drag_handle_offset; vct.y=0; vct.z=0; hang.x=bone->natural_rot.x; hang.y=rot.y+bone->natural_rot.y; hang.z=rot.z+bone->natural_rot.z; model_draw_bones_drag_handle_calc(&bone_pnt,&vct,&hang,&hand_pnt); if (model_wind_draw_bone_click_box(start_pnt,&hand_pnt)) drag_handle=drag_handle_x; // y drag bone vct.x=0; vct.y=bone_drag_handle_offset; vct.z=0; hang.x=rot.x+bone->natural_rot.x; hang.y=bone->natural_rot.y; hang.z=rot.z+bone->natural_rot.z; model_draw_bones_drag_handle_calc(&bone_pnt,&vct,&hang,&hand_pnt); if (model_wind_draw_bone_click_box(start_pnt,&hand_pnt)) drag_handle=drag_handle_y; // z drag bone vct.x=0; vct.y=0; vct.z=bone_drag_handle_offset; hang.x=rot.x+bone->natural_rot.x; hang.y=rot.y+bone->natural_rot.y; hang.z=+bone->natural_rot.z; model_draw_bones_drag_handle_calc(&bone_pnt,&vct,&hang,&hand_pnt); if (model_wind_draw_bone_click_box(start_pnt,&hand_pnt)) drag_handle=drag_handle_z; } // click on any bones? if (drag_handle==drag_handle_none) { k=-1; draw_bone=draw_setup.bones; for (n=0;n!=model.nbone;n++) { bone_pnt.x=draw_bone->fpnt.x+draw_setup.move.x; bone_pnt.y=draw_bone->fpnt.y+draw_setup.move.y; bone_pnt.z=draw_bone->fpnt.z+draw_setup.move.z; if (model_wind_draw_bone_click_box(start_pnt,&bone_pnt)) { k=n; break; } draw_bone++; } if (k==-1) return(FALSE); // select as current bone state.model.cur_item=item_model_bone; state.model.cur_bone_idx=k; model_palette_scroll_into_view(item_model_bone,state.model.cur_bone_idx); if ((state.model.sel_vertex_with_bone) || (double_click)) model_vertex_mask_set_sel_bone(state.model.cur_mesh_idx,state.model.cur_bone_idx); list_palette_set_level(&model_palette,1); main_wind_draw(); return(TRUE); } // no drag if no pose if (state.model.cur_pose_idx==-1) return(TRUE); // get drag angle switch (drag_handle) { case drag_handle_x: ang=&model.poses[state.model.cur_pose_idx].bone_moves[state.model.cur_bone_idx].rot.x; mov=&model.poses[state.model.cur_pose_idx].bone_moves[state.model.cur_bone_idx].mov.x; break; case drag_handle_y: ang=&model.poses[state.model.cur_pose_idx].bone_moves[state.model.cur_bone_idx].rot.y; mov=&model.poses[state.model.cur_pose_idx].bone_moves[state.model.cur_bone_idx].mov.y; break; case drag_handle_z: ang=&model.poses[state.model.cur_pose_idx].bone_moves[state.model.cur_bone_idx].rot.z; mov=&model.poses[state.model.cur_pose_idx].bone_moves[state.model.cur_bone_idx].mov.z; break; default: return(TRUE); } // drag bone org_ang=*ang; org_mov=*mov; last_pnt.x=last_pnt.y=-1; model_undo_set_bone_move(state.model.cur_pose_idx,state.model.cur_bone_idx); os_set_drag_cursor(); model_wind_get_box(&mbox); while (!os_track_mouse_location(&pnt,&mbox)) { if ((last_pnt.x==pnt.x) && (last_pnt.y==pnt.y)) continue; memmove(&last_pnt,&pnt,sizeof(d3pnt)); x=pnt.x-start_pnt->x; if (x<-180) x=-180; if (x>180) x=180; if (state.model.drag_bone_mode==handle_mode_rotate) { *ang=org_ang+(((float)x)/2.0f); } else { *mov=org_mov+(((float)x)/20.0f); } // draw the model main_wind_draw(); } os_set_arrow_cursor(); // redraw model main_wind_draw(); return(TRUE); }
void select_model_wind(d3pnt *start_pnt) { int sz; float *pv; // no playing while selecting model_play(model_play_mode_stop); // get the draw vertexes // need to save off array as drawing will reuse // array and free it model_draw_setup_initialize(&model,&draw_setup,TRUE); model_draw_setup_pose(state.model.cur_pose_idx); model_create_draw_bones(&model,&draw_setup); model_create_draw_vertexes(&model,state.model.cur_mesh_idx,&draw_setup); sz=(model.meshes[state.model.cur_mesh_idx].nvertex*3)*sizeof(float); pv=(float*)malloc(sz); if (pv==NULL) return; memmove(pv,draw_setup.mesh_arrays[state.model.cur_mesh_idx].gl_vertex_array,sz); model_draw_setup_shutdown(&model,&draw_setup); // setup transforms model_draw_gl_setup(0); model_draw_setup_project_point(); // run the correct click switch (state.model.select_mode) { case select_mode_mesh: select_model_wind_mesh(start_pnt); break; case select_mode_polygon: if (!select_model_wind_vertex_sel_poly(start_pnt,pv)) { if (!select_model_wind_polygon(start_pnt,FALSE)) { select_model_wind_vertex_drag_sel(start_pnt,pv); } } break; case select_mode_vertex: if (!select_model_wind_vertex(start_pnt,pv)) { select_model_wind_vertex_drag_sel(start_pnt,pv); } break; } // free the saved vertexes free(pv); // redraw the model main_wind_draw(); os_set_arrow_cursor(); }
bool drag_bone_model_wind(Point start_pt) { int n,k,drag_handle; float x,y,z,hx,hy,hz,org_ang,org_mov, bone_drag_handle_offset; float *ang,*mov; Point pt,last_pt; d3vct vct; d3ang hang,rot; model_draw_bone_type *draw_bone; MouseTrackingResult track; model_wind_play(FALSE,FALSE); // setup the draw pose draw_model_setup_pose(&model,&draw_setup,cur_pose); model_create_draw_bones(&model,&draw_setup); // setup transforms draw_model_gl_setup(&model); // click on any drag handles? drag_handle=drag_handle_none; if ((cur_pose==-1) || (cur_bone!=-1)) { draw_bone=&draw_setup.bones[cur_bone]; x=draw_bone->fpnt.x+draw_setup.move.x; y=draw_bone->fpnt.y+draw_setup.move.y; z=draw_bone->fpnt.z+draw_setup.move.z; bone_drag_handle_offset=draw_model_bones_drag_handle_offset(&model); draw_model_bones_get_handle_rot(&model,&draw_setup,cur_bone,&rot); // x drag bone vct.x=bone_drag_handle_offset; vct.y=0; vct.z=0; hang.x=0; hang.y=rot.y; hang.z=rot.z; draw_model_bones_drag_handle_calc(x,y,z,&vct,&hang,&hx,&hy,&hz); if (draw_bone_model_wind_click_box(start_pt,hx,hy,hz)) drag_handle=drag_handle_x; // y drag bone vct.x=0; vct.y=bone_drag_handle_offset; vct.z=0; hang.x=rot.x; hang.y=0; hang.z=rot.z; draw_model_bones_drag_handle_calc(x,y,z,&vct,&hang,&hx,&hy,&hz); if (draw_bone_model_wind_click_box(start_pt,hx,hy,hz)) drag_handle=drag_handle_y; // z drag bone vct.x=0; vct.y=0; vct.z=bone_drag_handle_offset; hang.x=rot.x; hang.y=rot.y; hang.z=0; draw_model_bones_drag_handle_calc(x,y,z,&vct,&hang,&hx,&hy,&hz); if (draw_bone_model_wind_click_box(start_pt,hx,hy,hz)) drag_handle=drag_handle_z; } // click on any bones? if (drag_handle==drag_handle_none) { k=-1; draw_bone=draw_setup.bones; for (n=0;n!=model.nbone;n++) { x=draw_bone->fpnt.x+draw_setup.move.x; y=draw_bone->fpnt.y+draw_setup.move.y; z=draw_bone->fpnt.z+draw_setup.move.z; if (draw_bone_model_wind_click_box(start_pt,x,y,z)) { k=n; break; } draw_bone++; } if (k==-1) return(FALSE); // select as current bone cur_bone=k; reset_bone_list(); draw_model_wind_pose(&model,cur_mesh,cur_pose); return(TRUE); } // get drag angle switch (drag_handle) { case drag_handle_x: ang=&model.poses[cur_pose].bone_moves[cur_bone].rot.x; mov=&model.poses[cur_pose].bone_moves[cur_bone].mov.x; break; case drag_handle_y: ang=&model.poses[cur_pose].bone_moves[cur_bone].rot.y; mov=&model.poses[cur_pose].bone_moves[cur_bone].mov.y; break; case drag_handle_z: ang=&model.poses[cur_pose].bone_moves[cur_bone].rot.z; mov=&model.poses[cur_pose].bone_moves[cur_bone].mov.z; break; default: return(TRUE); } reset_bone_list(); // drag bone org_ang=*ang; org_mov=*mov; last_pt.h=last_pt.v=-1; undo_set_bone_move(cur_pose,cur_bone); SetCCursor(bone_drag_cursor); do { TrackMouseLocation(NULL,&pt,&track); model_wind_offset_click(&pt); if (memcmp(&last_pt,&pt,sizeof(Point))==0) continue; memmove(&last_pt,&pt,sizeof(Point)); x=pt.h-start_pt.h; if (x<-180) x=-180; if (x>180) x=180; if (drag_bone_mode==drag_bone_mode_rotate) { *ang=org_ang+(((float)x)/2.0f); } else { *mov=org_mov+(((float)x)/20.0f); } // draw the model model_bone_drag_on=TRUE; draw_model_wind_pose(&model,cur_mesh,cur_pose); model_bone_drag_on=FALSE; reset_bone_list(); redraw_bone_list(); } while (track!=kMouseTrackingMouseReleased); InitCursor(); // redraw model draw_model_wind_pose(&model,cur_mesh,cur_pose); return(TRUE); }
void select_model_wind(Point start_pt,unsigned long modifiers) { int lx,rx,ty,by,sz; double mod_matrix[16],proj_matrix[16],vport[4]; char org_vertex_sel[max_model_vertex]; bool chg_sel; float *pv; Point pt,last_pt; MouseTrackingResult track; model_wind_play(FALSE,FALSE); // get the draw vertexes // need to save off array as drawing will reuse // array and free it model_draw_setup_initialize(&model,&draw_setup,TRUE); draw_model_setup_pose(&model,&draw_setup,cur_pose); model_create_draw_bones(&model,&draw_setup); model_create_draw_vertexes(&model,cur_mesh,&draw_setup); sz=(model.meshes[cur_mesh].nvertex*3)*sizeof(float); pv=(float*)malloc(sz); if (pv==NULL) return; memmove(pv,draw_setup.mesh_arrays[cur_mesh].gl_vertex_array,sz); model_draw_setup_shutdown(&model,&draw_setup); // setup transforms draw_model_gl_setup(&model); glGetDoublev(GL_MODELVIEW_MATRIX,mod_matrix); glGetDoublev(GL_PROJECTION_MATRIX,proj_matrix); glGetIntegerv(GL_VIEWPORT,(GLint*)vport); // turn on or off? if ((modifiers&shiftKey)!=0) { select_model_wind_save_sel_state(org_vertex_sel); SetCCursor(add_cursor); chg_sel=TRUE; } else { if ((modifiers&controlKey)!=0) { select_model_wind_save_sel_state(org_vertex_sel); SetCCursor(sub_cursor); chg_sel=FALSE; } else { memset(org_vertex_sel,0x0,max_model_vertex); InitCursor(); chg_sel=TRUE; } } // drag the selection last_pt.h=last_pt.v=-1; drag_sel_on=TRUE; do { TrackMouseLocation(NULL,&pt,&track); model_wind_offset_click(&pt); if (memcmp(&last_pt,&pt,sizeof(Point))==0) continue; memmove(&last_pt,&pt,sizeof(Point)); if (start_pt.h<last_pt.h) { lx=start_pt.h; rx=last_pt.h; } else { rx=start_pt.h; lx=last_pt.h; } if (start_pt.v<last_pt.v) { ty=start_pt.v; by=last_pt.v; } else { by=start_pt.v; ty=last_pt.v; } select_model_wind_restore_sel_state(org_vertex_sel); model_sel_vertex(pv,lx,ty,rx,by,chg_sel,mod_matrix,proj_matrix,vport); SetRect(&drag_sel_box,lx,ty,rx,by); draw_model_wind_pose(&model,cur_mesh,cur_pose); } while (track!=kMouseTrackingMouseReleased); drag_sel_on=FALSE; free(pv); // redraw the model draw_model_wind_pose(&model,cur_mesh,cur_pose); // reset the data browser hilite_vertex_rows(); InitCursor(); }