/* # Copyright 1996 # Authors # Lakshmi Sastry # Computing and Information Systems Department # Rutherford Appleton Laboratory, Chilton, Didcot. OX11 0QX # lakshmi.sastry@rl.ac.uk # and # Venkat VSS Sastry # Department of Applied Mathematics and Operational Research # Cranfield University, RMCS Shrivenham, Swindon, SN6 8LA # sastry@rmcs.cran.ac.uk # Permission to use, copy, modify, and distribute this # software and its documentation for any purpose and without # fee is hereby granted, provided that this copyright # notice appears in all copies. # The authors, RAL, RMCS Shrivenham, Cranfield University and AGOCG # make no representations about the suitability of this # software for any purpose. It is provided "as is" without # express or implied warranty. Likewise they accept no responsibility # whatsoever for any public domain software modules used (which are # hereby acknowledged) in this software # The 3D box with the text "It's a square world" in the routine "MakeCube" is # adopted from A Practical Introduction to PHIGS and PHIGS Plus. */ #include #include #include #include #include "tcl.h" #include "tk.h" #define CUBE (Pint) 1 #define WS_ID (Pint) 1 #define PRIORITY (Pfloat) 1.0 #define PI (Pfloat) 3.141592654 #define CMAX (Pfloat)0.7 #define CMIN (Pfloat)0.3 static Ppoint3 ORIGIN ={0.5,0.5,0.5}; #define set_colour(colrv,typ,r,g,b) colrv.type=typ; \ colrv.val.general.x=r;colrv.val.general.y= g;colrv.val.general.z=b; #define fill_struc(A,B,C,D) A.x = B; A.y = C; A.z = D; extern Pconnid_x_drawable conn_id; static char text1[] = "It's a "; static char text2[] = "square world!"; int CleanupAndQuitProc (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]) { pclose_ws(WS_ID); pclose_phigs(); exit(0); } int redrawProc (ClientData clientdata, XEvent *evptr) { Pint error; Pupd_st upd_st; Plimit req_win,req_vp,cur_win,cur_vp,new_vp; if (evptr->type == Expose) { if(evptr->xexpose.count == 0) predraw_all_structs(WS_ID,PFLAG_ALWAYS); return 0; } else if (evptr->type == ConfigureNotify) { new_vp.x_min = 0; new_vp.y_min=0; new_vp.x_max=evptr->xconfigure.width; new_vp.y_max = evptr->xconfigure.height; pinq_ws_tran(WS_ID, &error,&upd_st,&req_win,&cur_win, &req_vp,&cur_vp); if (new_vp.x_max != cur_vp.x_max || new_vp.y_max != cur_vp.y_max) pset_ws_vp(WS_ID,&new_vp); return 0; } } int MakeCubeProc (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]) { Pfloat angle; Pint err; Pmatrix3 transform; Pfloat mid; Ppoint3 front_face[5], back_face[5],link1[2], link2[2], link3[2], link4[2]; Ppoint_list3 list1,list2,list3,list4,list5,list6; Pgcolr yellow,white; static Pvec3 shift = {0.0,0.0,0.0}; static Pvec3 scale = {1,1,1}; static Ppoint3 textloc1 = {0.5,0.6,0.7}; static Ppoint3 textloc2 = {0.5,0.5,0.7}; static Pvec textdir[] = {1.0,0.0,0.0,0.0,1.0,0.0}; static Ptext_align txalign = {PHOR_CTR, PVERT_HALF}; set_colour(yellow,PMODEL_RGB,1.0,1.0,0.0); set_colour(white,PMODEL_RGB,1.0,1.0,1.0); fill_struc(front_face[0], CMIN,CMIN,CMAX); fill_struc(front_face[1], CMIN,CMAX,CMAX); fill_struc(front_face[2], CMAX,CMAX,CMAX); fill_struc(front_face[3], CMAX,CMIN,CMAX); fill_struc(front_face[4], CMIN,CMIN,CMAX); fill_struc(back_face[0], CMIN,CMIN,CMIN); fill_struc(back_face[1], CMIN,CMAX,CMIN); fill_struc(back_face[2], CMAX,CMAX,CMIN); fill_struc(back_face[3], CMAX,CMIN,CMIN); fill_struc(back_face[4], CMIN,CMIN,CMIN); fill_struc(link1[0],CMIN,CMIN,CMIN); fill_struc(link1[1],CMIN,CMIN,CMAX); fill_struc(link2[0],CMIN,CMAX,CMIN); fill_struc(link2[1],CMIN,CMAX,CMAX); fill_struc(link3[0],CMAX,CMAX,CMIN); fill_struc(link3[1],CMAX,CMAX,CMAX); fill_struc(link4[0],CMAX,CMIN,CMIN); fill_struc(link4[1],CMAX,CMIN,CMAX); list1.num_points = list2.num_points= 5; list3.num_points = list4.num_points = list5.num_points = list6.num_points = 2; list1.points = front_face; list2.points = back_face; list3.points =link1; list4.points = link2; list5.points = link3; list6.points = link4; popen_ws (WS_ID, (void *)&conn_id,phigs_ws_type_x_drawable); pset_disp_upd_st(WS_ID, PDEFER_WAIT, PMODE_NIVE); popen_struct(CUBE); angle = 0; pset_line_colr(&white); pbuild_tran_matrix3 ( &ORIGIN, &shift, angle, angle, angle, &scale, &err, transform); pset_local_tran3(transform,PTYPE_REPLACE); ppolyline3(list1); ppolyline3(list2); ppolyline3(list3); ppolyline3(list4); ppolyline3(list5); ppolyline3(list6); pset_text_align(&txalign); pset_char_ht((Pfloat)0.015); pset_text_colr(&yellow); ptext3(&textloc1,textdir,text1); ptext3(&textloc2,textdir,text2); pclose_struct(); ppost_struct(WS_ID, CUBE, PRIORITY); return 0; } int rotate_boxProc ( ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]) { Pint val; Pfloat angle; Pint err, i; Pmatrix3 transform; Ppoint3 origin; Pint cube; static Pvec3 shift = {0.0,0.0,0.0}; static Pvec3 scale = {1,1,1}; val = (Pint ) argv[1]; val = (Pint ) atoi(argv[1]); angle =val*PI/180; popen_struct(CUBE); /* Open the structure. */ pset_edit_mode(PEDIT_REPLACE); /* Select REPLACE mode. */ pset_elem_ptr(2); pbuild_tran_matrix3(&ORIGIN, &shift, angle,angle,angle, &scale, &err, transform); pset_local_tran3(transform, PTYPE_REPLACE); pclose_struct(); pupd_ws(WS_ID, PFLAG_PERFORM); return 0; } int ChColProc(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]) { Pgcolr magenta,yellow,white,colr; set_colour(magenta,PMODEL_RGB,1.0,0.0,1.0); set_colour(yellow,PMODEL_RGB,1.0,1.0,0.0); set_colour(white,PMODEL_RGB,1.0,1.0,1.0); if ((int) strcmp(argv[1],"Magenta") == 0) colr = magenta; else if (strcmp(argv[1],"Yellow") == 0) colr = yellow; else colr = white; popen_struct(CUBE); /* Open the structure. */ pset_edit_mode(PEDIT_REPLACE); /* Select REPLACE mode. */ pset_elem_ptr(1); pset_line_colr(&colr); pclose_struct(); pupd_ws(WS_ID, PFLAG_PERFORM); return 0; }