-+-+-+-+-+-+-+-+ START OF PART 272 -+-+-+-+-+-+-+-+ X X Module name: PHIGS View Utility. X X Author: Gareth Williams. X X Function: This module contains the PHIGS viewing utility. X X Dependencies: X X Internal function list:`20 X X External function list:`20 X X Modification history: (Version), (Date), (name), (Description). X X 1.0, 26th November 1991, G. Williams, First version, based on notes by X Karen Wyrwas. X X---------------------------------------------------------------------------- V*/ X X#include X#include X#include X#include "ptk.h" X X/*-------------------------------------------------------------------------- V*/ X Xstatic Pint wcwindow, vrcwindow, npcwindow, dcwindow, terminalwindow; Xstatic Pint viewwsid; Xstatic Pint viewmenuid, orimenuid, mapmenuid, windowmenuid, clipmenuid; Xstatic Pint rot3d1, rot3d2, rot2d1, rot2d2, rot1d; Xstatic Pfloat maxdevx, maxdevy; Xstatic Pint viewscene, wcscene, vrcscene, npcscene, dcscene; Xstatic Pint wcaxes, vrcaxes, npccube, projviewport, viewvolume, prpmarker; Xstatic Pint viewplane; Xstatic Ppoint3 vrp; Xstatic Ppoint3 vpn, vup; Xstatic Pviewmapping3 viewmap; Xstatic Pclip clipxy = PNOCLIP; Xstatic Pclip clipfront = PNOCLIP; Xstatic Pclip clipback = PNOCLIP; Xstatic Plimit3 scenespace; Xstatic Ppoint3 initvrp, minscene, maxscene, scenevol; Xstatic Plimit echoarea; Xstatic Pmatrix3 vommat, vmmmat; Xstatic Ppoint3 origin = `7B0.0, 0.0, 0.0`7D; Xstatic Pfloat axeslength; Xstatic Pfloat movefactor; Xstatic Pint curmenu = 0; Xstatic Pint curwindow = 0; Xstatic ptkboolean inputmode = TRUE; X X/* view editor attributes */ Xstatic Pint menucolourind = 0; Xstatic Pint windowcolourind = 0; Xstatic Pint menutextcolourind = 1; Xstatic Pint bannercolourind = 1; Xstatic Pint bannertextcolourind = 0; Xstatic Pint menutextfont = 1; Xstatic Pint windowtextfont = 1; Xstatic Pint backgroundcolourind = 0; Xstatic Pint tlcolourind = 1; Xstatic Pint brcolourind = 1; Xstatic Pint arrowcolourind = 0; Xstatic Pint arrowedgecolourind = 1; X X/*-------------------------------------------------------------------------- V*/ X Xstatic void ptk_transformlimits3(C(Plimit3 *) lims, C(Pmatrix3) mat) XPreANSI(Plimit3 *lims) XPreANSI(Pmatrix3 mat) X`7B X Ppoint3 minbox, maxbox; X X minbox = ptk_point3(lims->xmin, lims->ymin, lims->zmin); X maxbox = ptk_point3(lims->xmax, lims->ymax, lims->zmax); X minbox = ptk_transform3(mat, &minbox); X maxbox = ptk_transform3(mat, &maxbox); X *lims = ptk_limit3(minbox.x, maxbox.x, minbox.y, maxbox.y, minbox.z,`20 X maxbox.z); X`7D /* ptk_transformlimits3 */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void ptk_transformlimits(C(Plimit *) lims, C(Pmatrix) mat) XPreANSI(Plimit *lims) XPreANSI(Pmatrix mat) X`7B X Ppoint minbox, maxbox; X X minbox = ptk_point(lims->xmin, lims->ymin); X maxbox = ptk_point(lims->xmax, lims->ymax); X minbox = ptk_transform(mat, &minbox); X maxbox = ptk_transform(mat, &maxbox); X *lims = ptk_limit(minbox.x, maxbox.x, minbox.y, maxbox.y); X`7D /* ptk_transformlimits */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void ptk_shiftlimits3(C(Ppoint3 *) shift, C(Plimit3 *) lims) XPreANSI(Ppoint3 *shift) XPreANSI(Plimit3 *lims) X`7B X Ppoint3 minbox, maxbox; X Pmatrix3 mat; X X minbox = ptk_point3(lims->xmin, lims->ymin, lims->zmin); X maxbox = ptk_point3(lims->xmax, lims->ymax, lims->zmax); X ptk_shift3(shift, PREPLACE, mat); X minbox = ptk_transform3(mat, &minbox); X maxbox = ptk_transform3(mat, &maxbox); X *lims = ptk_limit3(minbox.x, maxbox.x, minbox.y, maxbox.y, minbox.z,`20 X maxbox.z); X`7D /* ptk_shiftlimits3 */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void ptk_scalelimits3(C(Ppoint3 *) scale, C(Plimit3 *) lims) XPreANSI(Ppoint3 *scale) XPreANSI(Plimit3 *lims) X`7B X Ppoint3 minbox, maxbox; X Ppoint3 shift, size; X Pmatrix3 mat; X X minbox = ptk_point3(lims->xmin, lims->ymin, lims->zmin); X maxbox = ptk_point3(lims->xmax, lims->ymax, lims->zmax); X size = ptk_subv3(&maxbox, &minbox); X shift = ptk_point3(minbox.x + (size.x / 2.0), minbox.y + (size.y / 2.0), X minbox.z + (size.z / 2.0)); X shift = ptk_scalev3(&shift, -1.0); X ptk_shift3(&shift, PREPLACE, mat); X ptk_scale3(scale, PPOSTCONCATENATE, mat); X shift = ptk_scalev3(&shift, -1.0); X ptk_shift3(&shift, PPOSTCONCATENATE, mat); X ptk_transformlimits3(lims, mat); X`7D /* ptk_scalelimits3 */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void ptk_scalelimits(C(Ppoint *) scale, C(Plimit *) lims) XPreANSI(Ppoint *scale) XPreANSI(Plimit *lims) X`7B X Ppoint minbox, maxbox; X Ppoint shift, size; X Pmatrix mat; X X minbox = ptk_point(lims->xmin, lims->ymin); X maxbox = ptk_point(lims->xmax, lims->ymax); X size = ptk_subv(&maxbox, &minbox); X shift = ptk_point(minbox.x + (size.x / 2.0), minbox.y + (size.y / 2.0)); X shift = ptk_scalev(&shift, -1.0); X ptk_shift(&shift, PREPLACE, mat); X ptk_scale(scale, PPOSTCONCATENATE, mat); X shift = ptk_scalev(&shift, -1.0); X ptk_shift(&shift, PPOSTCONCATENATE, mat); X ptk_transformlimits(lims, mat); X`7D /* ptk_scalelimits */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void ptk_shiftlimits(C(Ppoint *) shift, C(Plimit *) lims) XPreANSI(Ppoint *shift) XPreANSI(Plimit *lims) X`7B X Ppoint minbox, maxbox; X Pmatrix mat; X X minbox = ptk_point(lims->xmin, lims->ymin); X maxbox = ptk_point(lims->xmax, lims->ymax); X ptk_shift(shift, PREPLACE, mat); X minbox = ptk_transform(mat, &minbox); X maxbox = ptk_transform(mat, &maxbox); X *lims = ptk_limit(minbox.x, maxbox.x, minbox.y, maxbox.y); X`7D /* ptk_shiftlimits */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void drawaxes() X`7B X Ppoint3 pts`5B2`5D; X X pts`5B0`5D = ptk_point3(0.0, 0.0, 0.0); X pts`5B1`5D = ptk_point3(axeslength, 0.0, 0.0); X ppolyline3(2, pts); X pts`5B1`5D = ptk_point3(0.0, axeslength, 0.0); X ppolyline3(2, pts); X pts`5B1`5D = ptk_point3(0.0, 0.0, axeslength); X ppolyline3(2, pts); X`7D /* drawaxes */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void drawcube() X`7B X Pint i; X Ppoint3 pts`5B5`5D, lpts`5B2`5D; X `20 X pts`5B0`5D = pts`5B4`5D = ptk_point3(0.0, 0.0, 0.0); X pts`5B1`5D = ptk_point3(0.0, 1.0, 0.0); X pts`5B2`5D = ptk_point3(1.0, 1.0, 0.0); X pts`5B3`5D = ptk_point3(1.0, 0.0, 0.0); X ppolyline3(5, pts); X for (i = 0; i < 5; i++) X pts`5Bi`5D.z += 1.0; X ppolyline3(5, pts); X for (i = 0; i < 5; i++) X `7B X lpts`5B0`5D = lpts`5B1`5D = pts`5Bi`5D; X lpts`5B1`5D.z -= 1.0; X ppolyline3(2, lpts); X `7D X`7D /* drawcube */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void makeviewstructs() X`7B X Pmatrix3 unitmat; X Ppoint3 refpt, offset, markerpt, pts`5B5`5D; X X ptk_unitmatrix3(unitmat); X wcaxes = ptk_stringtoint("structureid", "view$wcaxes"); X vrcaxes = ptk_stringtoint("structureid", "view$vrcaxes"); X npccube = ptk_stringtoint("structureid", "view$npccube"); X projviewport = ptk_stringtoint("structureid", "view$projviewport"); X viewvolume = ptk_stringtoint("structureid", "view$viewvolume"); X prpmarker = ptk_stringtoint("structureid", "view$prpmarker"); X viewplane = ptk_stringtoint("structureid", "view$viewplane"); X `20 X ptk_openstruct(wcaxes); X drawaxes(); X refpt = ptk_point3(axeslength, 0.0, 0.0); X offset = ptk_point3(0.0, 0.0, 0.0); X pannotationtextrelative3(&refpt, &offset, "X"); X refpt = ptk_point3(0.0, axeslength, 0.0); X pannotationtextrelative3(&refpt, &offset, "Y"); X refpt = ptk_point3(0.0, 0.0, axeslength); X pannotationtextrelative3(&refpt, &offset, "Z"); X ptk_closestruct(); X X ptk_openstruct(vrcaxes); X plabel(ptk_stringtoint("label", "view$mx_inv_vom")); X psetlocaltran3(unitmat, PREPLACE); X drawaxes(); X refpt = ptk_point3(axeslength, 0.0, 0.0); X offset = ptk_point3(0.0, 0.0, 0.0); X pannotationtextrelative3(&refpt, &offset, "U"); X refpt = ptk_point3(0.0, axeslength, 0.0); X pannotationtextrelative3(&refpt, &offset, "V"); X refpt = ptk_point3(0.0, 0.0, axeslength); X pannotationtextrelative3(&refpt, &offset, "N"); X ptk_closestruct(); X X ptk_openstruct(npccube); X drawcube(); X ptk_closestruct(); X X ptk_openstruct(projviewport); X plabel(ptk_stringtoint("label", "view$mx_proj_viewport")); X psetlocaltran3(unitmat, PREPLACE); X psetlinetype(PLN_DASH); X drawcube(); X ptk_closestruct(); X X ptk_openstruct(viewvolume); X plabel(ptk_stringtoint("label", "view$mx_view_volume")); X psetlocaltran3(unitmat, PREPLACE); X drawcube(); X ptk_closestruct(); X X ptk_openstruct(prpmarker); X plabel(ptk_stringtoint("label", "view$mx_prp")); X psetlocaltran3(unitmat, PREPLACE); X markerpt = ptk_point3(0.0, 0.0, 0.0); X ppolymarker3(1, &markerpt); X ptk_closestruct(); X X ptk_openstruct(viewplane); X plabel(ptk_stringtoint("label", "view$mx_view_plane")); X psetlocaltran3(unitmat, PREPLACE); X pts`5B0`5D = pts`5B4`5D = ptk_point3(0.0, 0.0, 0.0); X pts`5B1`5D = ptk_point3(0.0, 1.0, 0.0); X pts`5B2`5D = ptk_point3(1.0, 1.0, 0.0); X pts`5B3`5D = ptk_point3(1.0, 0.0, 0.0); X ppolyline3(5, pts); X ptk_closestruct(); `20 X`7D /* makeviewstructs */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void combinelimits(C(Plimit3 *) lim1, C(Plimit3 *) lim2) XPreANSI(Plimit3 *lim1) XPreANSI(Plimit3 *lim2) X`7B X if (lim1->xmin < lim2->xmin) X lim2->xmin = lim1->xmin; X if (lim1->xmax > lim2->xmax) X lim2->xmax = lim1->xmax; X if (lim1->ymin < lim2->ymin) X lim2->ymin = lim1->ymin; X if (lim1->ymax > lim2->ymax) X lim2->ymax = lim1->ymax; X if (lim1->zmin < lim2->zmin) X lim2->zmin = lim1->zmin; X if (lim1->zmax > lim2->zmax) X lim2->zmax = lim1->zmax; X`7D /* combinelimits */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void do_scene(C(Pintlst *) stids) XPreANSI(Pintlst *stids) X`7B X Plimit3 stlimits; X Ppoint3 minbox, maxbox, dimen; X Pint i; X X scenespace = ptk_limit3(100.0, -100.0, 100.0, -100.0, 100.0, -100.0); X for (i = 0; i < stids->number; i++) X `7B X if (ptk_boundingbox(stids->integers`5Bi`5D, &stlimits, TRUE)) X `7B X if (stlimits.xmin < scenespace.xmin) X scenespace.xmin = stlimits.xmin; X if (stlimits.ymin < scenespace.ymin) X scenespace.ymin = stlimits.ymin; X if (stlimits.zmin < scenespace.zmin) X scenespace.zmin = stlimits.zmin; X if (stlimits.xmax > scenespace.xmax) X scenespace.xmax = stlimits.xmax; X if (stlimits.ymax > scenespace.ymax) X scenespace.ymax = stlimits.ymax; X if (stlimits.zmax > scenespace.zmax) X scenespace.zmax = stlimits.zmax; X `7D X `7D X minbox = ptk_point3(scenespace.xmin, scenespace.ymin, scenespace.zmin); X maxbox = ptk_point3(scenespace.xmax, scenespace.ymax, scenespace.zmax); X dimen = ptk_subv3(&maxbox, &minbox); X axeslength = MAX(dimen.x, dimen.y); X axeslength = MAX(axeslength, dimen.z); X movefactor = axeslength / 10.0; X axeslength /= 2.0; X pemptystruct(viewscene); X ptk_openstruct(viewscene); X for (i = 0; i < stids->number; i++) X pexecutestruct(stids->integers`5Bi`5D); X ptk_closestruct(); X`7D /* do_scene */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void initialiseeditor() X`7B X Pint i, err; X Pmatrix3 unitmat; X Plimit3 stlimits, wclimits, axeslimits; X Pintlst windworld; X Pfloat maxscenevol; X X /* view settings */ 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 X X /* find centre of scene */ X minscene = ptk_point3(scenespace.xmin, scenespace.ymin, scenespace.zmin); X maxscene = ptk_point3(scenespace.xmax, scenespace.ymax, scenespace.zmax); X initvrp = ptk_subv3(&maxscene, &minscene); X initvrp = ptk_scalev3(&initvrp, 0.5); X initvrp = ptk_addv3(&initvrp, &minscene); X vrp = initvrp; X scenevol = ptk_subv3(&maxscene, &minscene); 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 maxscenevol = MAX(scenevol.x, scenevol.y); X maxscenevol = MAX(maxscenevol, scenevol.z); X maxscenevol *= 2.0; X viewmap.viewport = ptk_limit3(0.5 - scenevol.x / maxscenevol,`20 X 0.5 + scenevol.x / maxscenevol, X 0.5 - scenevol.y / maxscenevol,`20 X 0.5 + scenevol.y / maxscenevol, X 0.5 - scenevol.z / maxscenevol,`20 X 0.5 + scenevol.z / maxscenevol); X ptk_unitmatrix3(unitmat); X ptk_unitmatrix3(vommat); X ptk_unitmatrix3(vmmmat); X X ptk_openstruct(wcscene); X pexecutestruct(viewscene); X pexecutestruct(wcaxes); X pexecutestruct(vrcaxes); X ptk_closestruct(); X X ptk_openstruct(vrcscene); X plabel(ptk_stringtoint("label", "view$mx_vom")); X psetlocaltran3(unitmat, PREPLACE); X pexecutestruct(viewscene); X pexecutestruct(viewvolume); X pexecutestruct(viewplane); X pexecutestruct(prpmarker); X ptk_closestruct(); X X ptk_openstruct(npcscene); X plabel(ptk_stringtoint("label", "view$mx_vom")); X psetlocaltran3(unitmat, PREPLACE); X plabel(ptk_stringtoint("label", "view$mx_vmm")); X psetlocaltran3(unitmat, PPOSTCONCATENATE); X pexecutestruct(viewscene); X psetlocaltran3(unitmat, PREPLACE); X pexecutestruct(npccube); X pexecutestruct(projviewport); X ptk_closestruct(); X X ptk_openstruct(dcscene); X plabel(ptk_stringtoint("label", "view$mx_vom")); X psetlocaltran3(unitmat, PREPLACE); X plabel(ptk_stringtoint("label", "view$mx_vmm")); X psetlocaltran3(unitmat, PPOSTCONCATENATE); X pexecutestruct(viewscene); X ptk_closestruct(); X X wclimits = scenespace; X ptk_boundingbox(wcaxes, &axeslimits, TRUE); +-+-+-+-+-+-+-+- END OF PART 272 +-+-+-+-+-+-+-+-