-+-+-+-+-+-+-+-+ START OF PART 273 -+-+-+-+-+-+-+-+ X combinelimits(&wclimits, &axeslimits); X ptk_boundingbox(vrcaxes, &axeslimits, TRUE); X combinelimits(&wclimits, &axeslimits); X `20 X/* wclimits.xmax = MAX(fabs(scenespace.xmin), fabs(scenespace.xmax)); X wclimits.ymax = MAX(fabs(scenespace.ymin), fabs(scenespace.ymax)); X wclimits.zmax = MAX(fabs(scenespace.zmin), fabs(scenespace.zmax)); X wclimits.xmin = -wclimits.xmax;`20 X wclimits.ymin = -wclimits.ymax;`20 X wclimits.zmin = -wclimits.zmax; */ X X ptk_setcameralimits(wcwindow, &wclimits, TRUE); X ptk_setcamerastate(dcwindow, PTKECAMERAOFF); X ptk_posttowindow(wcwindow, wcscene); `20 X ptk_posttowindow(vrcwindow, vrcscene); X ptk_posttowindow(npcwindow, npcscene); X ptk_posttowindow(dcwindow, dcscene); X`7D /* initialiseeditor */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic ptkboolean checkmapping(C(Pviewmapping3 *) map) XPreANSI(Pviewmapping3 *map) X`7B X Pint err; X Pmatrix3 mat; X X pevalviewmappingmatrix3(map, &err, mat); X if (err == 0) X return TRUE; X else X return FALSE; X`7D /* checkmapping */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatevrcwindow() X`7B X Plimit3 limits, templims; X X limits = scenespace; X ptk_boundingbox(viewvolume, &templims, TRUE); X combinelimits(&templims, &limits); X ptk_boundingbox(prpmarker, &templims, TRUE); X combinelimits(&templims, &limits); X ptk_transformlimits3(&limits, vommat); X ptk_setcameralimits(vrcwindow, &limits, TRUE); X`7D /* updatevrcwindow */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatenpcwindow() X`7B X Plimit3 limits, templims; X Pmatrix3 mat; X X limits = scenespace; X ptk_multiplymatrix3(vmmmat, vommat, mat); X ptk_transformlimits3(&limits, mat); X templims = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); X combinelimits(&templims, &limits); X ptk_setcameralimits(npcwindow, &limits, TRUE); X`7D /* updatenpcwindow */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatedcwindow() X`7B X Pint err; X Plimit window; X Ppoint3 prp, vrp; X Pfloat width, height, depth; X Ppoint3 vpn, vup; X X width = viewmap.viewport.xmax - viewmap.viewport.xmin; X height = viewmap.viewport.ymax - viewmap.viewport.ymin; X depth = viewmap.viewport.zmax - viewmap.viewport.zmin; X vpn = ptk_point3(0.0, 0.0, 1.0); X vup = ptk_point3(0.0, 1.0, 0.0); X vrp = ptk_point3(width / 2.0 + viewmap.viewport.xmin, X height / 2.0 + viewmap.viewport.ymin, X depth / 2.0 + viewmap.viewport.zmin); X ptk_setvieworientation3(dcwindow, &vrp, &vpn, &vup, &err); X window = ptk_limit(-width / 2.0, width / 2.0, -height / 2.0, height / 2.0) V; X prp = ptk_point3(0.0, 0.0, 2.0); X ptk_setviewmapping3(dcwindow, &window, &viewmap.viewport, PPARALLEL, X &prp, 0.0, -depth / 2.0, depth / 2.0, &err);`20 X ptk_setviewclipping3(dcwindow, &viewmap.viewport, clipxy, clipback,`20 X clipfront); X`7D /* updatedcwindow */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatewindows() X`7B X updatevrcwindow(); X updatenpcwindow(); X updatedcwindow(); X`7D /* updatewindows */`20 X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatemxvom() X`7B X Pint err; X X /* view orientation matrix */ X ptk_pevalvieworientationmatrix3(&vrp, &vpn, &vup, &err, vommat); X /* edit all structures using vom */ X ptk_seteditmode(PEDIT_REPLACE); X ptk_openstruct(vrcscene); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_vom")); X poffsetelemptr(1); X psetlocaltran3(vommat, PREPLACE); X ptk_closestruct(); X X ptk_openstruct(npcscene); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_vom")); X poffsetelemptr(1); X psetlocaltran3(vommat, PREPLACE); X ptk_closestruct(); X X ptk_openstruct(dcscene); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_vom")); X poffsetelemptr(1); X psetlocaltran3(vommat, PREPLACE); X ptk_closestruct(); X ptk_unseteditmode(); X`7D /* updatemxvom */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatemxinvvom() X`7B X Pmatrix3 invvommat; X Pint err; X `20 X ptk_invertmatrix3(vommat, invvommat, &err); X /* edit all structures using invvom */ X ptk_seteditmode(PEDIT_REPLACE); X ptk_openstruct(vrcaxes); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_inv_vom")); X poffsetelemptr(1); X psetlocaltran3(invvommat, PREPLACE); X ptk_closestruct(); X ptk_unseteditmode(); X`7D /* updatemxinvvom */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatemxvmm() X`7B X Pint err; X X /* view mapping matrix */ X pevalviewmappingmatrix3(&viewmap, &err, vmmmat); X X ptk_seteditmode(PEDIT_REPLACE); X ptk_openstruct(npcscene); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_vmm")); X poffsetelemptr(1); X psetlocaltran3(vmmmat, PPOSTCONCATENATE); X ptk_closestruct(); X X ptk_openstruct(dcscene); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_vmm")); X poffsetelemptr(1); X psetlocaltran3(vmmmat, PPOSTCONCATENATE); X ptk_closestruct(); X ptk_unseteditmode(); `20 X`7D /* updatemxvmm */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatemxviewvolume() X`7B X Plimit3 unitcube, viewvol; X Pmatrix3 viewvolmat; X Pint err; X X unitcube = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); X viewvol = ptk_limit3(viewmap.window.xmin, viewmap.window.xmax, X viewmap.window.ymin, viewmap.window.ymax,`20 X viewmap.back_plane, viewmap.front_plane); X viewvol.xmin += vrp.x; X viewvol.xmax += vrp.x; X viewvol.ymin += vrp.y; X viewvol.ymax += vrp.y; X viewvol.zmin += vrp.z; X viewvol.zmax += vrp.z; X ptk_box3tobox3(&unitcube, &viewvol, FALSE, PREPLACE, viewvolmat, &err); X ptk_seteditmode(PEDIT_REPLACE); X ptk_openstruct(viewvolume); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_view_volume")); X poffsetelemptr(1); X psetlocaltran3(viewvolmat, PREPLACE); X ptk_closestruct(); X ptk_unseteditmode(); X`7D /* updatemxviewvolume */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatemxprojviewport() X`7B X Plimit3 unitcube, viewvol; X Pmatrix3 projviewmat; X Pint err; X X unitcube = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); X ptk_box3tobox3(&unitcube, &viewmap.viewport, FALSE, PREPLACE, projviewmat, X &err); X ptk_seteditmode(PEDIT_REPLACE); X ptk_openstruct(projviewport); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_proj_viewport")); X poffsetelemptr(1); X psetlocaltran3(projviewmat, PREPLACE); X ptk_closestruct(); X ptk_unseteditmode(); X`7D /* updatemxprojviewport */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatemxprp() X`7B X Pmatrix3 prpmat; X Ppoint3 shiftprp; X Pint err; X X shiftprp = ptk_addv3(&viewmap.prp, &vrp); X ptk_shift3(&shiftprp, PREPLACE, prpmat); X ptk_seteditmode(PEDIT_REPLACE); X ptk_openstruct(prpmarker); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_prp")); X poffsetelemptr(1); X psetlocaltran3(prpmat, PREPLACE); X ptk_closestruct(); X ptk_unseteditmode(); X`7D /* updatemxprp */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void updatemxviewplane() X`7B X Pmatrix3 viewplanemat; X Plimit3 unitcube, viewvol; X Pint err; X X unitcube = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 0.0); X viewvol = ptk_limit3(viewmap.window.xmin, viewmap.window.xmax, X viewmap.window.ymin, viewmap.window.ymax,`20 X viewmap.view_plane, viewmap.view_plane); X viewvol.xmin += vrp.x; X viewvol.xmax += vrp.x; X viewvol.ymin += vrp.y; X viewvol.ymax += vrp.y; X viewvol.zmin += vrp.z; X viewvol.zmax += vrp.z; X ptk_box3tobox3(&unitcube, &viewvol, FALSE, PREPLACE, viewplanemat, &err); X ptk_seteditmode(PEDIT_REPLACE); X ptk_openstruct(viewplane); X psetelemptr(0); X psetelemptrlabel(ptk_stringtoint("label", "view$mx_view_plane")); X poffsetelemptr(1); X psetlocaltran3(viewplanemat, PREPLACE); X ptk_closestruct(); X ptk_unseteditmode(); X`7D /* updatemxviewplane */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_shiftpoint3(C(ptksmenuoutput *) menuout, C(Ppoint3 *) pt) XPreANSI(ptksmenuoutput *menuout) XPreANSI(Ppoint3 *pt) X`7B X Ppoint shift; X Pfloat shiftfactor; X X switch (menuout->itemnum) X `7B X case 1: /* increase y */ X shiftfactor = menuout->value.y * movefactor; X pt->y += shiftfactor; X break; X X case 2: /* decrease y */ X shiftfactor = (1.0 - menuout->value.y) * movefactor; X pt->y -= shiftfactor; X break; X X case 3: /* decrease x */ X shiftfactor = (1.0 - menuout->value.x) * movefactor; X pt->x -= shiftfactor; X break; X X case 4: /* increase x */ X shiftfactor = menuout->value.x * movefactor; X pt->x += shiftfactor; X break; X X case 5: /* decrease z */ X shiftfactor = menuout->value.y * movefactor; X pt->z -= shiftfactor; X break; X X case 6: /* increase z */ X shiftfactor = menuout->value.y * movefactor; X pt->z += shiftfactor; X break; X `7D X`7D /* do_shiftpoint3 */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_vrp() X`7B X Ppoint pos; X ptkboolean quit; X Pevent eventdata; X Ploc inputloc; X ptksgeneralinput geninput; X ptksmenuoutput menuoutput; X Plocrec locrec; X X if (!inputmode) X `7B X vrp.x = ptk_readfloat(viewwsid, 0.0, "Input vrp, x (0.0) >", &echoarea); X vrp.y = ptk_readfloat(viewwsid, 0.0, "Input vrp, y (0.0) >", &echoarea); X vrp.z = ptk_readfloat(viewwsid, 0.0, "Input vrp, z (0.0) >", &echoarea); X updatemxvom(); X updatemxinvvom(); X updatemxviewvolume(); X updatemxviewplane(); X updatemxprp(); X updatedcwindow(); X predrawallstruct(viewwsid, PALWAYS); X `7D X else X `7B X ptk_setrotatortitle(rot3d1, "shift vrp"); X pos = ptk_point(0.15, 0.88); X ptk_setmenuposition(rot3d1, &pos); X ptk_postmenu(viewwsid, rot3d1); X predrawallstruct(viewwsid, PALWAYS); X psetlocmode(viewwsid, 1, PEVENT, PES_ECHO); 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 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_shiftpoint3(&menuoutput, &vrp); X updatemxvom(); X updatemxinvvom(); X updatemxviewvolume(); X updatemxviewplane(); X updatemxprp(); X updatedcwindow(); X predrawallstruct(viewwsid, PALWAYS); 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, rot3d1); X`7D /* do_vrp */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_rotatevector(C(ptksmenuoutput *) menuout, C(Ppoint3 *) vec) XPreANSI(ptksmenuoutput *menuout) XPreANSI(Ppoint3 *vec) X`7B X Ppoint3 axis; X Pmatrix3 mat; X Pint err; X Pfloat angle; X X switch (menuout->itemnum) X `7B X case 1: X angle = menuout->value.y * 10.0; X axis = ptk_point3(1.0, 0.0, 0.0); X ptk_rotateline3(&origin, &axis, -angle, PREPLACE, mat, &err); X *vec = ptk_transform3(mat, vec); X break; X X case 2: X angle = (1.0 - menuout->value.y) * 10.0; X axis = ptk_point3(1.0, 0.0, 0.0); X ptk_rotateline3(&origin, &axis, angle, PREPLACE, mat, &err); X *vec = ptk_transform3(mat, vec); X break; X X case 3: X angle = (1.0 - menuout->value.y) * 10.0; X axis = ptk_point3(0.0, 1.0, 0.0); X ptk_rotateline3(&origin, &axis, -angle, PREPLACE, mat, &err); X *vec = ptk_transform3(mat, vec); X break; X X case 4: X angle = menuout->value.y * 10.0; X axis = ptk_point3(0.0, 1.0, 0.0); X ptk_rotateline3(&origin, &axis, angle, PREPLACE, mat, &err); X *vec = ptk_transform3(mat, vec); X break; X X case 5: X angle = menuout->value.y * 10.0; X axis = ptk_point3(0.0, 0.0, 1.0); X ptk_rotateline3(&origin, &axis, -angle, PREPLACE, mat, &err); X *vec = ptk_transform3(mat, vec); X break; X X case 6: X angle = menuout->value.y * 10.0; X axis = ptk_point3(0.0, 0.0, 1.0); X ptk_rotateline3(&origin, &axis, angle, PREPLACE, mat, &err); X *vec = ptk_transform3(mat, vec); X break; X `7D X`7D /* do_rotatevector */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_vpn() X`7B X Ppoint pos; X ptkboolean quit; X Pevent eventdata; X Ploc inputloc; X ptksgeneralinput geninput; X ptksmenuoutput menuoutput; X Plocrec locrec; X X if (!inputmode) X `7B X vpn.x = ptk_readfloat(viewwsid, 0.0, "Input vpn, x (0.0) >", &echoarea); X vpn.y = ptk_readfloat(viewwsid, 0.0, "Input vpn, y (0.0) >", &echoarea); X vpn.z = ptk_readfloat(viewwsid, 0.0, "Input vpn, z (0.0) >", &echoarea); V`20 X updatemxvom(); X updatemxinvvom(); X updatedcwindow(); X predrawallstruct(viewwsid, PALWAYS); X `7D X else X `7B X ptk_setrotatortitle(rot3d1, "rotate vpn"); X pos = ptk_point(0.15, 0.88); +-+-+-+-+-+-+-+- END OF PART 273 +-+-+-+-+-+-+-+-