Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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();	
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
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();
}