-+-+-+-+-+-+-+-+ START OF PART 276 -+-+-+-+-+-+-+-+ X rot2d2 = ptk_stringtoint("menuid", "rotator2d2");`20 X rot1d = ptk_stringtoint("menuid", "rotator1d");`20 X size = ptk_point(0.3, 0.2); X ptk_createrotator(viewwsid, rot3d1, PTKETHREED, &size, "rotator", X 0.02); X ptk_setrotatorattrs(viewwsid, rot3d1, windowtextfont, bannertextcolourind, V`20 X arrowcolourind, arrowedgecolourind,`20 X windowcolourind, bannercolourind, X bannercolourind, tlcolourind, brcolourind); X ptk_createrotator(viewwsid, rot3d2, PTKETHREED, &size, "rotator", X 0.02); X ptk_setrotatorattrs(viewwsid, rot3d2, windowtextfont, bannertextcolourind, V`20 X arrowcolourind, arrowedgecolourind,`20 X windowcolourind, bannercolourind, X bannercolourind, tlcolourind, brcolourind); X size = ptk_point(0.2, 0.2); X ptk_createrotator(viewwsid, rot2d1, PTKETWOD, &size, "rotator", X 0.02); X ptk_setrotatorattrs(viewwsid, rot2d1, windowtextfont, bannertextcolourind, V`20 X arrowcolourind, arrowedgecolourind,`20 X windowcolourind, bannercolourind, X bannercolourind, tlcolourind, brcolourind); X ptk_createrotator(viewwsid, rot2d2, PTKETWOD, &size, "rotator", X 0.02); X ptk_setrotatorattrs(viewwsid, rot2d2, windowtextfont, bannertextcolourind, V`20 X arrowcolourind, arrowedgecolourind,`20 X windowcolourind, bannercolourind, X bannercolourind, tlcolourind, brcolourind); X ptk_createrotator(viewwsid, rot1d, PTKEONED, &size, "rotator", X 0.02); X ptk_setrotatorattrs(viewwsid, rot1d, windowtextfont, bannertextcolourind,` V20 X arrowcolourind, arrowedgecolourind,`20 X windowcolourind, bannercolourind, X bannercolourind, tlcolourind, brcolourind); X`7D /* makemenus */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_spincamera(C(Pint) windid, C(ptksmenuoutput *) menuout) XPreANSI(Pint windid) XPreANSI(ptksmenuoutput *menuout) X`7B X Pfloat angle; X X switch (menuout->itemnum) X `7B X case 1: X angle = menuout->value.y * 10.0; X ptk_rotatepositionxaxis(windid, -angle); X break; X X case 2: X angle = (1.0 - menuout->value.y) * 10.0; X ptk_rotatepositionxaxis(windid, angle); X break; X X case 3: X angle = (1.0 - menuout->value.x) * 10.0; X ptk_rotatepositionyaxis(windid, -angle); X break; X X case 4: X angle = menuout->value.x * 10.0; X ptk_rotatepositionyaxis(windid, angle); X break; X X case 5: X angle = menuout->value.y * 10.0; X ptk_rotatecameraupvector(windid, -angle); X break; X X case 6: X angle = menuout->value.y * 10.0; X ptk_rotatecameraupvector(windid, angle); X break; X `7D X`7D /* do_spincamera */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_zoomcamera(C(Pint) windid, C(ptksmenuoutput *) menuout) XPreANSI(Pint windid) XPreANSI(ptksmenuoutput *menuout) X`7B X Pfloat zoomfactor; X X switch (menuout->itemnum) X `7B X case 1:`20 X zoomfactor = menuout->value.y * 0.1; X ptk_scaleviewwindow(windid, 1.0 - zoomfactor); X break; X X case 2:`20 X zoomfactor = (1.0 - menuout->value.y) * 0.1; X ptk_scaleviewwindow(windid, 1.0 + zoomfactor); X break; X `7D X`7D /* do_zoomcamera */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void camerainterface(C(Pint) windid) XPreANSI(Pint windid) X`7B X Ppoint pos; X ptkboolean cameraquit; X Pevent eventdata; X Ploc initloc, inputloc; X ptksgeneralinput geninput; X ptksmenuoutput menuoutput; X Plocrec locrec; X X ptk_setrotatortitle(rot3d1, "rotate"); X ptk_setrotatortitle(rot1d, "zoom"); X pos = ptk_point(0.15, 0.88); X ptk_setmenuposition(rot3d1, &pos); X pos = ptk_point(0.1, 0.66); X ptk_setmenuposition(rot1d, &pos); X ptk_postmenu(viewwsid, rot3d1); X ptk_postmenu(viewwsid, rot1d); X predrawallstruct(viewwsid, PALWAYS); X psetlocmode(viewwsid, 1, PEVENT, PES_ECHO); X cameraquit = FALSE; X do X `7B X pawaitevent(0.0, &eventdata); X if ((eventdata.class == PI_LOCATOR) && (eventdata.ws == viewwsid)) X `7B X pgetloc(&inputloc); X geninput.inputclass = PI_LOCATOR; X geninput.ptkugeninput.locpoint = inputloc.position; X if (ptk_scanmenus(viewwsid, &geninput, &menuoutput)) X `7B X psetlocmode(viewwsid, 1, PREQUEST, PES_ECHO); X if (menuoutput.menuid == rot3d1) X`09`7B X do_spincamera(windid, &menuoutput); X predrawallstruct(viewwsid, PALWAYS); X`09`7D X else X if (menuoutput.menuid == rot1d) X`09`7B X do_zoomcamera(windid, &menuoutput); X predrawallstruct(viewwsid, PALWAYS); X`09`7D X psetlocmode(viewwsid, 1, PEVENT, PES_ECHO); X `7D X else X `7B X cameraquit = TRUE; X `7D X `7D X `7D while (!cameraquit); X ptk_unpostmenu(viewwsid, rot3d1); X ptk_unpostmenu(viewwsid, rot1d); X`7D /* camerainterface */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_orimenu(C(Pint) menuitem) XPreANSI(Pint menuitem) X`7B X ptk_unpostallmenu(viewwsid); `20 X switch (menuitem) X `7B X case 1: /* view reference point */`20 X do_vrp();`20 X break; X X case 2: /* view plane normal */`20 X do_vpn(); X break; X X case 3: /* view up vector */ X do_vup(); X break; X `7D `20 X curmenu = 0; X`7D /* do_orimenu */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_clipmenu(C(Pint) menuitem) XPreANSI(Pint menuitem) X`7B X Pint err; X X switch (menuitem) X `7B X case 1: `20 X if (clipxy == PNOCLIP) X `7B X ptk_createtextmenuitem(clipmenuid, "x-y OFF", 1, PEDIT_REPLACE, &err V); X clipxy = PCLIP; X `7D X else X `7B X ptk_createtextmenuitem(clipmenuid, "x-y ON", 1, PEDIT_REPLACE, &err) V; X clipxy = PNOCLIP; X `7D X break; X X case 2:`20 X if (clipfront == PNOCLIP) X `7B X ptk_createtextmenuitem(clipmenuid, "front OFF", 2, PEDIT_REPLACE, &e Vrr); X clipfront = PCLIP; X `7D X else X `7B X ptk_createtextmenuitem(clipmenuid, "front ON", 2, PEDIT_REPLACE, &er Vr); X clipfront = PNOCLIP; X `7D X break; X X case 3:`20 X if (clipback == PNOCLIP) X `7B X ptk_createtextmenuitem(clipmenuid, "back OFF", 3, PEDIT_REPLACE, &er Vr); X clipback = PCLIP; X `7D X else X `7B X ptk_createtextmenuitem(clipmenuid, "back ON", 3, PEDIT_REPLACE, &err V); X clipback = PNOCLIP; X `7D X X break; X `7D `20 X ptk_setviewclipping3(dcwindow, &viewmap.viewport, clipxy, clipfront,`20 X clipback); X`7D /* do_clipmenu */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_mapmenu(C(Pint) menuitem) XPreANSI(Pint menuitem) X`7B X Pint err; X X if (menuitem != 7) X `7B X ptk_unpostallmenu(viewwsid); X curmenu = 0; X `7D X switch (menuitem) X `7B X case 1: /* prp */`20 X do_prp(); X break; X X case 2: /* front plane distance */ X do_frontplane();`20 X break; X X case 3: /* back plane distance */ X do_backplane(); X break; X X case 4: /* view plane distance */ X do_viewplane(); X break; X X case 5: /* view window limits */ X do_viewwindow(); X break; X X case 6: /* projection viewport limits */ X do_projviewport(); X break; X X case 7: /* projection type */ X do_projection(); X if (viewmap.proj == PPARALLEL) X ptk_createtextmenuitem(mapmenuid, "perspective", 7, PEDIT_REPLACE,`2 V0 X &err); X else X ptk_createtextmenuitem(mapmenuid, "parallel", 7, PEDIT_REPLACE, &err V); X break; X `7D `20 X`7D /* do_mapmenu */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_viewmenu(C(Pint) menuitem, C(Ppoint *) pos) XPreANSI(Pint menuitem) XPreANSI(Ppoint *pos) X`7B X Pint err; X X switch (menuitem) X `7B X case 1: /* orientation */ X ptk_setmenuposition(orimenuid, pos); X ptk_postmenu(viewwsid, orimenuid); X ptk_unpostmenu(viewwsid, mapmenuid); X ptk_unpostmenu(viewwsid, clipmenuid); X predrawallstruct(viewwsid, PALWAYS); X break; X X case 2: /* mapping */ X ptk_setmenuposition(mapmenuid, pos); X ptk_postmenu(viewwsid, mapmenuid); X ptk_unpostmenu(viewwsid, orimenuid); X ptk_unpostmenu(viewwsid, clipmenuid); X predrawallstruct(viewwsid, PALWAYS); X break; X X case 3: /* clipping */ X ptk_setmenuposition(clipmenuid, pos); X ptk_postmenu(viewwsid, clipmenuid); X ptk_unpostmenu(viewwsid, mapmenuid); X ptk_unpostmenu(viewwsid, orimenuid); X predrawallstruct(viewwsid, PALWAYS); X break; X`20 X case 4: /* reset */ X vpn = ptk_point3(0.0, 0.0, 1.0); X vup = ptk_point3(0.0, 1.0, 0.0); X viewmap.view_plane = 0.0; X viewmap.proj = PPARALLEL; X viewmap.viewport = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); X vrp = initvrp; X viewmap.window = ptk_limit(-scenevol.x / 2.0, scenevol.x / 2.0,`20 X -scenevol.y / 2.0, scenevol.y / 2.0); X viewmap.prp = ptk_point3(0.0, 0.0, scenevol.z); X viewmap.front_plane = scenevol.z / 2.0; X viewmap.back_plane = -scenevol.z / 2.0; X clipxy = PNOCLIP; X clipfront = PNOCLIP; X clipback = PNOCLIP; X updatemxvom(); X updatemxinvvom(); X updatemxvmm(); X updatemxviewvolume(); X updatemxprojviewport(); X updatemxviewplane(); X updatemxprp(); X updatedcwindow(); X predrawallstruct(viewwsid, PALWAYS); X break; X X case 5: /* keyboard or rotator input */ X if (inputmode) X `7B X /* change to keyboard mode */ X ptk_createtextmenuitem(viewmenuid, "rotator", 5, PEDIT_REPLACE, &err V); X inputmode = FALSE; X `7D X else X `7B X /* change to rotator input */ X ptk_createtextmenuitem(viewmenuid, "keyboard", 5, PEDIT_REPLACE,`20 X &err); X inputmode = TRUE; X `7D X predrawallstruct(viewwsid, PALWAYS); X break; X X case 6: /* inquire viewing values */ X do_inquire(); X break; X `7D `20 X`7D /* do_viewmenu */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_windowmenu(C(Pint) menuitem, C(ptkswindowoutput *) windoutput V) XPreANSI(Pint menuitem) XPreANSI(ptkswindowoutput *windoutput) X`7B X ptkboolean closed; X Ploc initloc; X Plimit echo; X Plocrec locrec; X Pqloc inputloc; X Pint err; X X if (windoutput->windowarea == PTKEWINDOWICON) X closed = TRUE; X else X closed = FALSE; X echo = ptk_limit(0.0, maxdevx, 0.0, maxdevy); X switch (menuitem) X `7B X case 1: /* open/close */ X ptk_unpostmenu(viewwsid, windowmenuid); X if (closed) X ptk_openwindow(windoutput->windowid); X else X ptk_closewindow(windoutput->windowid); X break; X X case 2: /* move */ X `7B X initloc.view_index = 0; X if (closed) X ptk_inqiconposition(windoutput->windowid, &initloc.position, &err) V; X else X ptk_inqwindowposition(windoutput->windowid, &initloc.position,`20 X &err); X pinitloc(viewwsid, 1, &initloc, 1, &echo, &locrec); X psetlocmode(viewwsid, 1, PREQUEST, PES_ECHO); X preqloc(viewwsid, 1, &inputloc); X if (inputloc.status == PSTAT_OK) X if (closed) X ptk_seticonposition(windoutput->windowid,`20 X &inputloc.loc.position); X else X ptk_setwindowposition(windoutput->windowid,`20 X &inputloc.loc.position); X `7D X ptk_unpostmenu(viewwsid, windowmenuid); X break; X X case 3: /* resize */ X `7B X Pfloat width, height; X Ppoint size; X X initloc.view_index = 0; X if (closed) X ptk_inqiconposition(windoutput->windowid, &initloc.position, &err) V; X else X ptk_inqwindowposition(windoutput->windowid, &initloc.position,`20 X &err); X#ifdef SUN X locrec.ulocpet5_datarec.ln_bundl.type = PLN_SOLID; X locrec.ulocpet5_datarec.ln_bundl.width = 1.0; X locrec.ulocpet5_datarec.ln_bundl.colour = 1; X pinitloc(viewwsid, 1, &initloc, -5, &echo, &locrec); X#endif X#ifdef VMS X locrec.locpet5_datarec.pfcf = PPF_POLYLINE; X locrec.locpet5_datarec.attr.ln.type = PINDIVIDUAL; X locrec.locpet5_datarec.attr.ln.width = PINDIVIDUAL; X locrec.locpet5_datarec.attr.ln.colour = PINDIVIDUAL; X locrec.locpet5_datarec.attr.ln.bundl.type = PLN_SOLID; X locrec.locpet5_datarec.attr.ln.bundl.width = 1.0; X locrec.locpet5_datarec.attr.ln.bundl.colour = 1; X pinitloc(viewwsid, 1, &initloc, 5, &echo, &locrec); X#endif X psetlocmode(viewwsid, 1, PREQUEST, PES_ECHO); X preqloc(viewwsid, 1, &inputloc); X if (inputloc.status == PSTAT_OK) X`09`7B X width = MAX(initloc.position.x, inputloc.loc.position.x) - X MIN(initloc.position.x, inputloc.loc.position.x); X height = MAX(initloc.position.y, inputloc.loc.position.y) - X MIN(initloc.position.y, inputloc.loc.position.y); X width *= 2.0; X height *= 2.0; X size = ptk_point(width, height); X if (closed) X ptk_seticonsize(windoutput->windowid, &size); X else X ptk_setwindowsize(windoutput->windowid, &size); X `7D +-+-+-+-+-+-+-+- END OF PART 276 +-+-+-+-+-+-+-+-