-+-+-+-+-+-+-+-+ START OF PART 275 -+-+-+-+-+-+-+-+
X  Pevent eventdata;
X  Ploc inputloc;
X  ptksgeneralinput geninput;
X  ptksmenuoutput menuoutput;
X  Plocrec locrec;
X  Pviewmapping3 tempmap;
X
X  if (!inputmode)
X  `7B
X    tempmap = viewmap;
X    tempmap.window.xmin = ptk_readfloat(viewwsid, 0.0,`20
X                           "Input window, xmin (0.0) >", &echoarea);
X    tempmap.window.xmax = ptk_readfloat(viewwsid, 1.0,`20
X                           "Input window, xmax (1.0) >", &echoarea);
X    tempmap.window.ymin = ptk_readfloat(viewwsid, 0.0,`20
X                           "Input window, ymin (0.0) >", &echoarea);
X    tempmap.window.ymax = ptk_readfloat(viewwsid, 1.0,`20
X                           "Input window, ymax (1.0) >", &echoarea);
X    if (checkmapping(&tempmap))
X    `7B
X      viewmap.window = tempmap.window;
X      updatemxviewplane();
X      updatemxvmm();
X      updatemxviewvolume();
X      updatedcwindow();
X      predrawallstruct(viewwsid, PALWAYS);
X    `7D
X  `7D
X  else
X  `7B
X    ptk_setrotatortitle(rot2d1, "scale window");
X    ptk_setrotatortitle(rot2d2, "shift window");
X    pos = ptk_point(0.1, 0.88);
X    ptk_setmenuposition(rot2d1, &pos);
X    pos = ptk_point(0.1, 0.66);
X    ptk_setmenuposition(rot2d2, &pos);
X    ptk_postmenu(viewwsid, rot2d1);
X    ptk_postmenu(viewwsid, rot2d2);
X    predrawallstruct(viewwsid, PALWAYS);
X    psetlocmode(viewwsid, 1, PEVENT, PES_ECHO);
X    tempmap = viewmap;
X    quit = 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        tempmap.window = viewmap.window;
X        if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
X        `7B
X          psetlocmode(viewwsid, 1, PREQUEST, PES_ECHO);
X          if ((menuoutput.menuid == rot2d1) `7C`7C
X              (menuoutput.menuid == rot2d2))
X`09  `7B
X            if (menuoutput.menuid == rot2d1)
X              do_scalewindow(&menuoutput, &tempmap.window);
X            else
X              do_shiftwindow(&menuoutput, &tempmap.window);
X            if (checkmapping(&tempmap))
X  `09    `7B
X              viewmap.window = tempmap.window;
X              updatemxviewplane();
X              updatemxvmm();
X              updatemxviewvolume();
X              updatedcwindow();
X              predrawallstruct(viewwsid, PALWAYS);
X            `7D
X  `09  `7D
X          psetlocmode(viewwsid, 1, PEVENT, PES_ECHO);
X        `7D
X        else
X        `7B
X          quit = TRUE;
X        `7D
X      `7D
X    `7D while (!quit);
X  `7D
X  ptk_unpostmenu(viewwsid, rot2d1);
X  ptk_unpostmenu(viewwsid, rot2d2);
X`7D /* do_viewwindow */
X
X/*--------------------------------------------------------------------------
V*/
X
Xstatic void do_scaleviewport(C(ptksmenuoutput *) menuout, C(Plimit3 *) vwpt)
XPreANSI(ptksmenuoutput *menuout)
XPreANSI(Plimit3 *vwpt)
X`7B
X  Ppoint3 scale;
X
X  switch (menuout->itemnum)
X  `7B
X    case 1: /* increase y */
X      scale = ptk_point3(1.0, 1.0 + (0.1 * menuout->value.y), 1.0);
X      break;
X
X    case 2: /* decrease y */
X      scale = ptk_point3(1.0, 1.0 - (0.1 * (1.0 - menuout->value.y)), 1.0);
X      break;
X
X    case 3: /* decrease x */
X      scale = ptk_point3(1.0 - (0.1 * (1.0 - menuout->value.x)), 1.0, 1.0);
X      break;
X
X    case 4: /* increase x */
X      scale = ptk_point3(1.0 + (0.1 * menuout->value.x), 1.0, 1.0);
X      break;
X
X    case 5: /* increase z */
X      scale = ptk_point3(1.0, 1.0, 1.0 + (0.1 * menuout->value.y));
X      break;
X
X    case 6: /* decrease z */
X      scale = ptk_point3(1.0, 1.0, 1.0 - (0.1 * menuout->value.y));
X      break;
X  `7D
X  ptk_scalelimits3(&scale, vwpt);
X`7D  /* do_scaleviewport */
X
X/*--------------------------------------------------------------------------
V*/
X
Xstatic void do_shiftviewport(C(ptksmenuoutput *) menuout, C(Plimit3 *) vwpt)
XPreANSI(ptksmenuoutput *menuout)
XPreANSI(Plimit3 *vwpt)
X`7B
X  Ppoint3 shift;
X
X  switch (menuout->itemnum)
X  `7B
X    case 1: /* increase y */
X      shift = ptk_point3(0.0, (menuout->value.y * movefactor), 0.0);
X      break;
X
X    case 2: /* decrease y */
X      shift = ptk_point3(0.0, -((1.0 - menuout->value.y) * movefactor), 0.0)
V;
X      break;
X
X    case 3: /* decrease x */
X      shift = ptk_point3(-((1.0 - menuout->value.x) * movefactor), 0.0, 0.0)
V;
X      break;
X
X    case 4: /* increase x */
X      shift = ptk_point3((menuout->value.x * movefactor), 0.0, 0.0);
X      break;
X
X    case 5: /* increase z */
X      shift = ptk_point3(0.0, 0.0, (menuout->value.y * movefactor));
X      break;
X
X    case 6: /* decrease z */
X      shift = ptk_point3(0.0, 0.0, -(menuout->value.y * movefactor));
X      break;
X  `7D
X  ptk_shiftlimits3(&shift, vwpt);
X`7D  /* do_shiftviewport */
X
X/*--------------------------------------------------------------------------
V*/
X
Xstatic void do_projviewport()
X`7B
X  Ppoint pos;
X  ptkboolean projvwptquit;
X  Pevent eventdata;
X  Ploc inputloc;
X  ptksgeneralinput geninput;
X  ptksmenuoutput menuoutput;
X  Plocrec locrec;
X  Pviewmapping3 tempmap;
X
X  if (!inputmode)
X  `7B
X    tempmap = viewmap;
X    tempmap.viewport.xmin = ptk_readfloat(viewwsid, 0.0,`20
X                           "Input viewport, xmin (0.0) >", &echoarea);
X    tempmap.viewport.xmax = ptk_readfloat(viewwsid, 1.0,`20
X                           "Input viewport, xmax (1.0) >", &echoarea);
X    tempmap.viewport.ymin = ptk_readfloat(viewwsid, 0.0,`20
X                           "Input viewport, ymin (0.0) >", &echoarea);
X    tempmap.viewport.ymax = ptk_readfloat(viewwsid, 1.0,`20
X                           "Input viewport, ymax (1.0) >", &echoarea);
X    tempmap.viewport.zmin = ptk_readfloat(viewwsid, 0.0,`20
X                           "Input viewport, zmin (0.0) >", &echoarea);
X    tempmap.viewport.zmax = ptk_readfloat(viewwsid, 1.0,`20
X                           "Input viewport, zmax (1.0) >", &echoarea);
X    if (checkmapping(&tempmap))
X    `7B
X      viewmap.viewport = tempmap.viewport;
X      updatemxvmm();
X      updatemxprojviewport();
X      updatedcwindow();
X      predrawallstruct(viewwsid, PALWAYS);
X    `7D
X  `7D
X  else
X  `7B
X    ptk_setrotatortitle(rot3d1, "scale viewport");
X    ptk_setrotatortitle(rot3d2, "shift viewport");
X    pos = ptk_point(0.15, 0.88);
X    ptk_setmenuposition(rot3d1, &pos);
X    pos = ptk_point(0.15, 0.66);
X    ptk_setmenuposition(rot3d2, &pos);
X    ptk_postmenu(viewwsid, rot3d1);
X    ptk_postmenu(viewwsid, rot3d2);
X    predrawallstruct(viewwsid, PALWAYS);
X    psetlocmode(viewwsid, 1, PEVENT, PES_ECHO);
X    tempmap = viewmap;
X    projvwptquit = 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        tempmap.viewport = viewmap.viewport;
X        if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
X        `7B
X          psetlocmode(viewwsid, 1, PREQUEST, PES_ECHO);
X          if ((menuoutput.menuid == rot3d1) `7C`7C
X              (menuoutput.menuid == rot3d2))
X  `09  `7B
X            if (menuoutput.menuid == rot3d1)
X              do_scaleviewport(&menuoutput, &tempmap.viewport);
X            else
X              do_shiftviewport(&menuoutput, &tempmap.viewport);
X            if (checkmapping(&tempmap))
X  `09    `7B
X              viewmap.viewport = tempmap.viewport;
X              updatemxvmm();
X              updatemxprojviewport();
X              updatedcwindow();
X              predrawallstruct(viewwsid, PALWAYS);
X            `7D
X  `09  `7D
X          psetlocmode(viewwsid, 1, PEVENT, PES_ECHO);
X        `7D
X        else
X        `7B
X          projvwptquit = TRUE;
X        `7D
X      `7D
X    `7D while (!projvwptquit);
X  `7D
X  ptk_unpostmenu(viewwsid, rot3d1);
X  ptk_unpostmenu(viewwsid, rot3d2);
X`7D /* do_projviewport */
X
X/*--------------------------------------------------------------------------
V*/
X
Xstatic void do_projection()
X`7B
X  if (viewmap.proj == PPARALLEL)
X    viewmap.proj = PPERSPECTIVE;
X  else
X    viewmap.proj = PPARALLEL;
X  updatemxvmm();
X  updatedcwindow();
X`7D /* do_projection */
X
X/*--------------------------------------------------------------------------
V*/
X
Xstatic void do_inquire()
X`7B
X  ptk_printfterminal(terminalwindow, "vrp = %f, %f, %f\n", vrp.x, vrp.y,
X                     vrp.z);
X  ptk_printfterminal(terminalwindow, "vpn = %f, %f, %f\n", vpn.x, vpn.y,
X                     vpn.z);
X  ptk_printfterminal(terminalwindow, "vup = %f, %f, %f\n", vup.x, vup.y,
X                     vup.z);
X  ptk_printfterminal(terminalwindow, "prp = %f, %f, %f\n", viewmap.prp.x,`20
X                     viewmap.prp.y, viewmap.prp.z);
X  ptk_printfterminal(terminalwindow, "view plane = %f\n",`20
X                     viewmap.view_plane); `20
X  ptk_printfterminal(terminalwindow, "front plane = %f\n",`20
X                     viewmap.front_plane);
X  ptk_printfterminal(terminalwindow, "back plane = %f\n",`20
X                     viewmap.back_plane);
X  ptk_writelnterminal(terminalwindow, "view window:");
X  ptk_printfterminal(terminalwindow, "xmin = %f, xmax = %f\n",`20
X                     viewmap.window.xmin, viewmap.window.xmax);
X  ptk_printfterminal(terminalwindow, "ymin = %f, ymax = %f\n",`20
X                     viewmap.window.ymin, viewmap.window.ymax);
X  ptk_writelnterminal(terminalwindow, "projection viewport:");
X  ptk_printfterminal(terminalwindow, "xmin = %f, xmax = %f\n",`20
X                     viewmap.viewport.xmin, viewmap.viewport.xmax);
X  ptk_printfterminal(terminalwindow, "ymin = %f, ymax = %f\n",`20
X                     viewmap.viewport.ymin, viewmap.viewport.ymax);
X  ptk_printfterminal(terminalwindow, "zmin = %f, zmax = %f\n",`20
X                     viewmap.viewport.zmin, viewmap.viewport.zmax);
X  predrawallstruct(viewwsid, PALWAYS);
X`7D /* do_inquire */
X
X/*--------------------------------------------------------------------------
V*/
X
Xstatic void makemenus(C(void))
X`7B
X  Pint err;
X  Ppoint topleft;
X  Ppoint box, size, pos;
X
X  /* view menu */
X  viewmenuid = ptk_stringtoint("menuid", "viewmenu");`20
X  box = ptk_point(0.1, 0.05);
X  topleft = ptk_point(0.0, 1.0);
X  ptk_createboxmenu(viewmenuid, &topleft, &box);
X  ptk_setboxmenuattrs(viewwsid, viewmenuid, PTP_DOWN, menutextfont,`20
X                    menutextcolourind, menucolourind,
X                    menucolourind, tlcolourind, brcolourind);`20
X  ptk_createtextmenuitem(viewmenuid, "orient'n", 1, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(viewmenuid, "mapping", 2, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(viewmenuid, "clipping", 3, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(viewmenuid, "reset", 4, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(viewmenuid, "keyboard", 5, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(viewmenuid, "inquire", 6, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(viewmenuid, "exit", 7, PEDIT_INSERT, &err);
X
X  /* view orientation menu */
X  orimenuid = ptk_stringtoint("menuid", "orientationmenu");`20
X  box = ptk_point(0.1, 0.05);
X  topleft = ptk_point(0.0, 1.0);
X  ptk_createboxmenu(orimenuid, &topleft, &box);
X  ptk_setboxmenuattrs(viewwsid, orimenuid, PTP_DOWN, menutextfont,`20
X                    menutextcolourind, menucolourind,
X                    menucolourind, tlcolourind, brcolourind);`20
X  ptk_createtextmenuitem(orimenuid, "vrp", 1, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(orimenuid, "vpn", 2, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(orimenuid, "vup", 3, PEDIT_INSERT, &err);
X
X  /* view clipping menu */
X  clipmenuid = ptk_stringtoint("menuid", "clippingmenu");`20
X  box = ptk_point(0.1, 0.05);
X  topleft = ptk_point(0.0, 1.0);
X  ptk_createboxmenu(clipmenuid, &topleft, &box);`20
X  ptk_setboxmenuattrs(viewwsid, clipmenuid, PTP_DOWN, menutextfont,`20
X                    menutextcolourind, menucolourind,
X                    menucolourind, tlcolourind, brcolourind);`20
X  ptk_createtextmenuitem(clipmenuid, "x-y ON", 1, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(clipmenuid, "front ON", 2, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(clipmenuid, "back ON", 3, PEDIT_INSERT, &err);
X
X  /* view mapping menu */
X  mapmenuid = ptk_stringtoint("menuid", "mappingmenu");`20
X  box = ptk_point(0.1, 0.05);
X  topleft = ptk_point(0.0, 1.0);
X  ptk_createboxmenu(mapmenuid, &topleft, &box);
X  ptk_setboxmenuattrs(viewwsid, mapmenuid, PTP_DOWN, menutextfont,`20
X                    menutextcolourind, menucolourind,
X                    menucolourind, tlcolourind, brcolourind);`20
X  ptk_createtextmenuitem(mapmenuid, "prp", 1, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(mapmenuid, "front pl.", 2, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(mapmenuid, "back pl.", 3, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(mapmenuid, "view pl.", 4, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(mapmenuid, "window", 5, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(mapmenuid, "viewport", 6, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(mapmenuid, "perspective", 7, PEDIT_INSERT, &err);
X
X  /* window menu */
X  windowmenuid = ptk_stringtoint("menuid", "windowmenu");`20
X  box = ptk_point(0.1, 0.05);
X  topleft = ptk_point(0.0, 1.0);
X  ptk_createboxmenu(windowmenuid, &topleft, &box);
X  ptk_setboxmenuattrs(viewwsid, windowmenuid, PTP_DOWN, menutextfont,`20
X                    menutextcolourind, menucolourind,
X                    menucolourind, tlcolourind, brcolourind);`20
X  ptk_createtextmenuitem(windowmenuid, "close", 1, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(windowmenuid, "move", 2, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(windowmenuid, "resize", 3, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(windowmenuid, "front", 4, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(windowmenuid, "back", 5, PEDIT_INSERT, &err);
X  ptk_createtextmenuitem(windowmenuid, "camera", 6, PEDIT_INSERT, &err);
X
X /* camera interface */
X `20
X  /* rotators */
X  rot3d1 = ptk_stringtoint("menuid", "rotator3d1");`20
X  rot3d2 = ptk_stringtoint("menuid", "rotator3d2");`20
X  rot2d1 = ptk_stringtoint("menuid", "rotator2d1");`20
+-+-+-+-+-+-+-+-  END  OF PART 275 +-+-+-+-+-+-+-+-