diff --git a/changelog b/changelog index a5715bf..8f98c06 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,43 @@ +20080604 tpd src/graph/Makefile remove fileformats +20080604 tpd src/graph/fileformats removed, replace by bookvol8 +20080604 tpd src/graph/view3d/Makefile removed, replace by bookvol8 +20080604 tpd src/graph/view3d/buttons3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/closeview3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/component3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/contour.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/contour3d.c.out removed, replace by bookvol8 +20080604 tpd src/graph/view3d/contour_panel3d.c.out replace by bookvol8 +20080604 tpd src/graph/view3d/control3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/cpanel.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/draw.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/eventnames.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/globals.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/header.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/illuminate3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/lightbut3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/lighting3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/main3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/mesh3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/msort3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/pot3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/process.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/process3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/project3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/quit3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/quitbut3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/save3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/savebut3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/smoothshade3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/spadaction3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/static.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/stuff3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/surface3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/testcol.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/transform3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/viewport3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/volume.h removed, replace by bookvol8 +20080604 tpd src/graph/view3d/volume3d.c removed, replace by bookvol8 +20080604 tpd src/graph/view3d/write3d.c removed, replace by bookvol8 20080604 tpd src/graph/Makefile make view3d from bookvol8 20080604 tpd books/bookvol8 make view3d 20080602 tpd src/graph/view2d removed. diff --git a/src/graph/Makefile.pamphlet b/src/graph/Makefile.pamphlet index 1daad5b..5fc687f 100644 --- a/src/graph/Makefile.pamphlet +++ b/src/graph/Makefile.pamphlet @@ -383,36 +383,14 @@ DOC is the directory where we store final documentation. DOCFILES is the list of documents to create. <>= IN=${SRC}/graph -MID=${INT}/graph/parabola DOC=${MNT}/${SYS}/doc/src/graph -DOCFILES=${DOC}/fileformats.dvi - -@ -\subsection{file formats} -<>= -${DOC}/fileformats.dvi: ${IN}/fileformats.pamphlet - @echo 21 making ${DOC}/fileformats.dvi from ${IN}/fileformats.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/fileformats.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} fileformats ; \ - rm -f ${DOC}/fileformats.pamphlet ; \ - rm -f ${DOC}/fileformats.tex ; \ - rm -f ${DOC}/fileformats ) - -@ -<>= -${MID}/data: ${IN}/fileformats.pamphlet - @echo 22 making ${MID}/data from ${IN}/fileformats.pamphlet - @(cd ${MID} ; \ - ${TANGLE} -R"data" ${IN}/fileformats.pamphlet >data ; \ - ${TANGLE} -R"graph0" ${IN}/fileformats.pamphlet >graph0 ) @ <<*>>= <> <> -all: ${DIRS} ${DOCFILES} ${MID}/data +all: ${DIRS} ${DOCFILES} @ echo 24 finished ${IN} <> @@ -421,9 +399,6 @@ all: ${DIRS} ${DOCFILES} ${MID}/data <> <> -<> -<> - clean: ${CLNS} @ echo 25 cleaning ${SRC}/graph diff --git a/src/graph/fileformats.pamphlet b/src/graph/fileformats.pamphlet deleted file mode 100644 index 0206e4e..0000000 --- a/src/graph/fileformats.pamphlet +++ /dev/null @@ -1,371 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph fileformats } -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{The viewFile data file format} -The viewFile is a control file for graph information. It contains -settings for particular graphs. There are some general window -settings that apply to the whole graph window followed by 9 -graph settings, one for each possible graph shown. -\subsection{The viewType} -The viewType (A) is a switch used to decide what tool will be used to -display the graph. At present there are 4 values defined (in the -file [[src/graph/include/action.h]]) which are: -\begin{verbatim} -/* Viewport Types */ -#define view3DType 1 -#define viewGraphType 2 -#define view2DType 3 -#define viewTubeType 4 -\end{verbatim} -In the example below the integer value is '3', at (A), -therefore it is of 'view2DType' meaning a 2D graph. - -This value is read in [[src/graph/viewalone/viewalone.c]] -\subsection{The title} -The title, at (B), is read in [[src/graph/viewalone/spoon2d.c]]. -It can be a maximum of 256 characters. -\subsection{The window boundaries} -There are 4 integers, at (C), the X, Y, Width, and Height -which represent the window size in pixels. -\subsection{The graph specifications} -There are, at (D), a series of specifications for the 9 -possible graphs. They are all in groups of 6 lines, one -per graph. These lines are stored in a data structure called -the [[graphArray]] or the [[graphStateArray]]. The lines are: -\begin{list}{} -\item D1 is either an integer value 0 or 1 (\%d format). -If the value is zero the rest of the information is ignored and -the graph is not displayed. If the value is 1 then the graph is -displayed. This information is stored in [[graphArray[i].key]]. -\item D2 are 2 C general numbers (\%g format). They represent -the scale factors in X and Y. This information is stored in -[[graphStateArray[i].scaleX]] and [[graphStateArray[i].scaleY]]. -\item D3 are 2 C general numbers (\%g format). They represent -the change in X and Y increments. This information is stored in -[[graphStateArray[i].deltaX]] and [[graphStateArray[i].deltaY]]. -\item D4 are 2 C general numbers (\%g format). They represent the -center for the X and Y axes. This information is stored in -[[graphStateArray[i].centerX]] and [[graphStateArray[i].centerY]]. -\item D5 are 7 integers (\%d format). They represent: -\begin{list}{} -\item pointsOn - 0 means no points, 1 means plot points. -Stored in [[graphStateArray[i].pointsOn]]. -\item connectOn - 0 means isolated points, 1 means connected points. -Stored in [[graphStateArray[i].connectOn]]. -\item splineOn - 0 means no spline, 1 means spline. -Stored in [[graphStateArray[i].splineOn]]. -\item axesOn - 0 means no axes, 1 means draw axes. -Stored in [[graphStateArray[i].axesOn]]. -\item axesColor - 0 means black and white, 1 means color. -Stored in [[graphStateArray[i].axesColor]]. -\item unitsOn - 0 means no tick marks (units), 1 means units. -Stored in [[graphStateArray[i].unitsOn]]. -\item unitsColor - 0 means black and white, 1 means color. -Stored in [[graphStateArray[i].unitsColor]]. -\end{list} -\item D6 are 2 C integers (\%d format). -\begin{list}{} -\item showing - 0 means the graph is hidden, 1 means showing. -Stored in [[graphStateArray[i].showing]]. -\item selected - 0 means not selected, 1 means selected. -Stored in [[graphStateArray[i].selected]]. -\end{list} -\end{list} -\begin{verbatim} -3 (A) -x*x (B) -0 0 400 400 (C) -1 (D1) (graph0) -0.867014 0.575432 (D2) -0 0 (D3) -0 0 (D4) -1 1 1 1 61 1 68 (D5) -1 1 (D6) -0 (graph1) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 (graph2) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 (graph3) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 (graph4) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 (graph5) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 (graph6) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 (graph7) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 (graph8) -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -\end{verbatim} -\section{The graph file format} -There are up to 9 files, named [ [[graph0]] .. [[graph8]] ]. -There is one file per graph as indicated by the [[data]] file above. -\subsection{The bounding values} -There are 4 integers (\%d format) at (A) giving the xmin, ymin, xmax, and -ymax values for the graph. These are stored in -[[graphArray[i].xmin]], [[graphArray[i].ymin]], [[graphArray[i].xmax]], -and [[graphArray[i].ymax]]. - -There are 2 general numbers (\%g format) at (B) -giving the xNorm and yNorm values. These are stored in -[[graphArray[i].xNorm]] and [[graphArray[i].yNorm]]. - -There are 2 general numbers (\%g format) at (C) -giving the X origin and Y origin values. These are stored in -[[graphArray[i].originX]] and [[graphArray[i].originY]]. - -There are 2 general numbers (\%g format) at (D) -giving the X units and Y units from Axiom. These are stored in -[[graphArray[i].spadUnitX]] and [[graphArray[i].spadUnitY]]. - -There are 2 general numbers (\%g format) at (E) -giving the X units and Y units in graph coordinates. These are stored in -[[graphArray[i].unitX]] and [[graphArray[i].unitY]]. - -There is 1 integer (\%d format) at (F) -giving the number of lists that make up the graph. This is stored in -[[graphArray[i].numberOfLists]]. - -For each list, and in this case there is only 1 list. Each list -is stored in a [[pointListStruct]] pointed to by [[aList]]. -In this case we have: -\begin{list}{} -\item (G) is the number of points in the list. This is 1 integer -(\%d format). It is stored in [[aList->numberOfPoints]]. -\item (H) is 3 integers (\%d format) which represent the point color, -the line color, and the point size. These are stored in -[[aList->pointColor]], [[aList->lineColor]], and [[aList->pointSize]]. -\item (I) is 4 general numbers (\%g format) which represent the -x, y, hue, and shade of a point. These are stored in a structure -called [[aPoint]] which consists of -[[aPoint->x]],[[aPoint->y]],[[aPoint->hue]], and [[aPoint->shade]]. -These are pointed to by the [[aList]] structure. There are as many -copies of this data as there are points in the graph (G) -\end{list} - -\begin{verbatim} --3 0 3 9 (A) -0.166667 0.111111 (B) -1.49012e-08 -0.5 (C) -1.2 1.8 (D) -0.2 0.2 (E) -1 (F) -49 (G) -91 135 3 (H) --0.5 0.5 0 2 (I) repeated (G) times --0.479167 0.418403 0 2 --0.458333 0.340278 0 2 --0.4375 0.265625 0 2 --0.416667 0.194444 0 2 --0.395833 0.126736 0 2 --0.375 0.0625 0 2 --0.354167 0.00173611 0 2 --0.333333 -0.0555556 0 2 --0.3125 -0.109375 0 2 --0.291667 -0.159722 0 2 --0.270833 -0.206597 0 2 --0.25 -0.25 0 2 --0.229167 -0.289931 0 2 --0.208333 -0.326389 0 2 --0.1875 -0.359375 0 2 --0.166667 -0.388889 0 2 --0.145833 -0.414931 0 2 --0.125 -0.4375 0 2 --0.104167 -0.456597 0 2 --0.0833333 -0.472222 0 2 --0.0625 -0.484375 0 2 --0.0416667 -0.493056 0 2 --0.0208333 -0.498264 0 2 -1.49012e-08 -0.5 0 2 -0.0208333 -0.498264 0 2 -0.0416667 -0.493056 0 2 -0.0625 -0.484375 0 2 -0.0833334 -0.472222 0 2 -0.104167 -0.456597 0 2 -0.125 -0.4375 0 2 -0.145833 -0.414931 0 2 -0.166667 -0.388889 0 2 -0.1875 -0.359375 0 2 -0.208333 -0.326389 0 2 -0.229167 -0.289931 0 2 -0.25 -0.25 0 2 -0.270833 -0.206597 0 2 -0.291667 -0.159722 0 2 -0.3125 -0.109375 0 2 -0.333333 -0.0555556 0 2 -0.354167 0.00173611 0 2 -0.375 0.0625 0 2 -0.395833 0.126736 0 2 -0.416667 0.194444 0 2 -0.4375 0.265625 0 2 -0.458333 0.340278 0 2 -0.479167 0.418403 0 2 -0.5 0.5 0 2 -\end{verbatim} -\section{The parabola} -<>= -3 -x*x -0 0 400 400 -1 -0.867014 0.575432 -0 0 -0 0 -1 1 1 1 61 1 68 -1 1 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -0 -0.9 0.9 -0 0 -0 0 -1 1 0 1 0 0 0 -0 0 -@ -<>= --3 0 3 9 -0.166667 0.111111 -1.49012e-08 -0.5 -1.2 1.8 -0.2 0.2 -1 -49 -91 135 3 --0.5 0.5 0 2 --0.479167 0.418403 0 2 --0.458333 0.340278 0 2 --0.4375 0.265625 0 2 --0.416667 0.194444 0 2 --0.395833 0.126736 0 2 --0.375 0.0625 0 2 --0.354167 0.00173611 0 2 --0.333333 -0.0555556 0 2 --0.3125 -0.109375 0 2 --0.291667 -0.159722 0 2 --0.270833 -0.206597 0 2 --0.25 -0.25 0 2 --0.229167 -0.289931 0 2 --0.208333 -0.326389 0 2 --0.1875 -0.359375 0 2 --0.166667 -0.388889 0 2 --0.145833 -0.414931 0 2 --0.125 -0.4375 0 2 --0.104167 -0.456597 0 2 --0.0833333 -0.472222 0 2 --0.0625 -0.484375 0 2 --0.0416667 -0.493056 0 2 --0.0208333 -0.498264 0 2 -1.49012e-08 -0.5 0 2 -0.0208333 -0.498264 0 2 -0.0416667 -0.493056 0 2 -0.0625 -0.484375 0 2 -0.0833334 -0.472222 0 2 -0.104167 -0.456597 0 2 -0.125 -0.4375 0 2 -0.145833 -0.414931 0 2 -0.166667 -0.388889 0 2 -0.1875 -0.359375 0 2 -0.208333 -0.326389 0 2 -0.229167 -0.289931 0 2 -0.25 -0.25 0 2 -0.270833 -0.206597 0 2 -0.291667 -0.159722 0 2 -0.3125 -0.109375 0 2 -0.333333 -0.0555556 0 2 -0.354167 0.00173611 0 2 -0.375 0.0625 0 2 -0.395833 0.126736 0 2 -0.416667 0.194444 0 2 -0.4375 0.265625 0 2 -0.458333 0.340278 0 2 -0.479167 0.418403 0 2 -0.5 0.5 0 2 -@ -<<*>>= -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/Makefile.pamphlet b/src/graph/view3d/Makefile.pamphlet deleted file mode 100644 index 0874949..0000000 --- a/src/graph/view3d/Makefile.pamphlet +++ /dev/null @@ -1,832 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{no title} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{environment} -<>= - -IN= ${SRC}/graph/view3d -MIDINT= ${INT}/graph/view3d -MIDOBJ= ${OBJ}/${SYS}/graph/view3d -OUT= ${MNT}/${SYS}/lib -DOC= ${MNT}/${SYS}/doc/src/graph - -LIB= ${OBJ}/${SYS}/lib -GDRAW= ${OBJ}/${SYS}/graph/gdraws - -# local include files shared by graphics -LINC= ${SRC}/graph/include - -# global include files shared by everyone -GINC= ${SRC}/include - -# bitmaps for cursors -BIT= ${SRC}/graph/include/purty - -@ -\section{buttons3d} -<>= -${MIDINT}/buttons3d.c: ${IN}/buttons3d.c.pamphlet - @ echo 1 ${MIDINT}/buttons3d.c from ${IN}/buttons3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/buttons3d.c.pamphlet >buttons3d.c ) - -<>= -${MIDOBJ}/buttons3d.o: ${HEADERS} ${IN}/cpanel.h ${MIDINT}/buttons3d.c - @ echo 2 making ${MIDOBJ}/buttons3d.o from ${MIDINT}/buttons3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/buttons3d.c ) - -@ -<>= -${DOC}/buttons3d.c.dvi: ${IN}/buttons3d.c.pamphlet - @echo 3 making ${DOC}/buttons3d.c.dvi from ${IN}/buttons3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/buttons3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} buttons3d.c ; \ - rm -f ${DOC}/buttons3d.c.pamphlet ; \ - rm -f ${DOC}/buttons3d.c.tex ; \ - rm -f ${DOC}/buttons3d.c ) - -@ -\section{closeview3d} -<>= -${MIDINT}/closeview3d.c: ${IN}/closeview3d.c.pamphlet - @ echo 4 ${MIDINT}/closeview3d.c from ${IN}/closeview3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/closeview3d.c.pamphlet >closeview3d.c ) - -@ -<>= -${MIDOBJ}/closeview3d.o: ${HEADERS} ${MIDINT}/closeview3d.c - @ echo 5 making ${MIDOBJ}/closeview3d.o from ${MIDINT}/closeview3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/closeview3d.c ) - -@ -<>= -${DOC}/closeview3d.c.dvi: ${IN}/closeview3d.c.pamphlet - @echo 6 making ${DOC}/closeview3d.c.dvi from ${IN}/closeview3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/closeview3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} closeview3d.c ; \ - rm -f ${DOC}/closeview3d.c.pamphlet ; \ - rm -f ${DOC}/closeview3d.c.tex ; \ - rm -f ${DOC}/closeview3d.c ) - -@ -\section{component3d} -<>= -${MIDINT}/component3d.c: ${IN}/component3d.c.pamphlet - @ echo 7 ${MIDINT}/component3d.c from ${IN}/component3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/component3d.c.pamphlet >component3d.c ) - -@ -<>= -${MIDOBJ}/component3d.o: ${HEADERS} ${MIDINT}/component3d.c - @ echo 8 making ${MIDOBJ}/component3d.o from ${MIDINT}/component3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/component3d.c ) - -@ -<>= -${DOC}/component3d.c.dvi: ${IN}/component3d.c.pamphlet - @echo 9 making ${DOC}/component3d.c.dvi from ${IN}/component3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/component3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} component3d.c ; \ - rm -f ${DOC}/component3d.c.pamphlet ; \ - rm -f ${DOC}/component3d.c.tex ; \ - rm -f ${DOC}/component3d.c ) - -@ -\section{control3d} -<>= -${MIDINT}/control3d.c: ${IN}/control3d.c.pamphlet - @ echo 10 ${MIDINT}/control3d.c from ${IN}/control3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/control3d.c.pamphlet >control3d.c ) - -@ -<>= -${MIDOBJ}/control3d.o: ${HEADERS} ${IN}/cpanel.h ${BIT}/mouse11.bitmap \ - ${BIT}/mouse11.mask ${MIDINT}/control3d.c - @ echo 11 making ${MIDOBJ}/control3d.o from ${MIDINT}/control3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/control3d.c ) - -@ -<>= -${DOC}/control3d.c.dvi: ${IN}/control3d.c.pamphlet - @echo 12 making ${DOC}/control3d.c.dvi from ${IN}/control3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/control3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} control3d.c ; \ - rm -f ${DOC}/control3d.c.pamphlet ; \ - rm -f ${DOC}/control3d.c.tex ; \ - rm -f ${DOC}/control3d.c ) - -@ -\section{illuminate3d} -<>= -${MIDINT}/illuminate3d.c: ${IN}/illuminate3d.c.pamphlet - @ echo 13 ${MIDINT}/illuminate3d.c from ${IN}/illuminate3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/illuminate3d.c.pamphlet >illuminate3d.c ) - -@ -<>= -${MIDOBJ}/illuminate3d.o: ${HEADERS} ${IN}/cpanel.h ${MIDINT}/illuminate3d.c - @ echo 14 making ${MIDOBJ}/illuminate3d.o from ${MIDINT}/illuminate3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/illuminate3d.c ) - -@ -<>= -${DOC}/illuminate3d.c.dvi: ${IN}/illuminate3d.c.pamphlet - @echo 15 making ${DOC}/illuminate3d.c.dvi from ${IN}/illuminate3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/illuminate3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} illuminate3d.c ; \ - rm -f ${DOC}/illuminate3d.c.pamphlet ; \ - rm -f ${DOC}/illuminate3d.c.tex ; \ - rm -f ${DOC}/illuminate3d.c ) - -@ -\section{lightbut3d} -<>= -${MIDINT}/lightbut3d.c: ${IN}/lightbut3d.c.pamphlet - @ echo 16 ${MIDINT}/lightbut3d.c from ${IN}/lightbut3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/lightbut3d.c.pamphlet >lightbut3d.c ) - -@ -<>= -${MIDOBJ}/lightbut3d.o: ${HEADERS} ${IN}/cpanel.h ${MIDINT}/lightbut3d.c - @ echo 17 making ${MIDOBJ}/lightbut3d.o from ${MIDINT}/lightbut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/lightbut3d.c ) - -@ -<>= -${DOC}/lightbut3d.c.dvi: ${IN}/lightbut3d.c.pamphlet - @echo 18 making ${DOC}/lightbut3d.c.dvi from ${IN}/lightbut3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/lightbut3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} lightbut3d.c ; \ - rm -f ${DOC}/lightbut3d.c.pamphlet ; \ - rm -f ${DOC}/lightbut3d.c.tex ; \ - rm -f ${DOC}/lightbut3d.c ) - -@ -\section{lighting3d} -<>= -${MIDINT}/lighting3d.c: ${IN}/lighting3d.c.pamphlet - @ echo 19 ${MIDINT}/lighting3d.c from ${IN}/lighting3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/lighting3d.c.pamphlet >lighting3d.c ) - -@ -<>= -${MIDOBJ}/lighting3d.o: ${HEADERS} ${IN}/draw.h ${IN}/cpanel.h \ - ${BIT}/light11.bitmap ${BIT}/light11.mask ${MIDINT}/lighting3d.c - @ echo 20 making ${MIDOBJ}/lighting3d.o from ${MIDINT}/lighting3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/lighting3d.c ) - -@ -<>= -${DOC}/lighting3d.c.dvi: ${IN}/lighting3d.c.pamphlet - @echo 21 making ${DOC}/lighting3d.c.dvi from ${IN}/lighting3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/lighting3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} lighting3d.c ; \ - rm -f ${DOC}/lighting3d.c.pamphlet ; \ - rm -f ${DOC}/lighting3d.c.tex ; \ - rm -f ${DOC}/lighting3d.c ) - -@ -\section{main3d} -<>= -${MIDINT}/main3d.c: ${IN}/main3d.c.pamphlet - @ echo 22 ${MIDINT}/main3d.c from ${IN}/main3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/main3d.c.pamphlet >main3d.c ) - -@ -<>= -${MIDOBJ}/main3d.o: ${HEADERS} ${LINC}/xdefs.h ${IN}/cpanel.h ${IN}/process.h \ - ${LINC}/mode.h ${MIDINT}/main3d.c - @ echo 23 making ${MIDOBJ}/main3d.o from ${MIDINT}/main3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/main3d.c ) - -@ -<>= -${DOC}/main3d.c.dvi: ${IN}/main3d.c.pamphlet - @echo 24 making ${DOC}/main3d.c.dvi from ${IN}/main3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/main3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} main3d.c ; \ - rm -f ${DOC}/main3d.c.pamphlet ; \ - rm -f ${DOC}/main3d.c.tex ; \ - rm -f ${DOC}/main3d.c ) - -@ -\section{mesh3d} -<>= -${MIDINT}/mesh3d.c: ${IN}/mesh3d.c.pamphlet - @ echo 25 ${MIDINT}/mesh3d.c from ${IN}/mesh3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/mesh3d.c.pamphlet >mesh3d.c ) - -@ -<>= -${MIDOBJ}/mesh3d.o: ${HEADERS} ${MIDINT}/mesh3d.c - @ echo 26 making ${MIDOBJ}/mesh3d.o from ${MIDINT}/mesh3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/mesh3d.c ) - -@ -<>= -${DOC}/mesh3d.c.dvi: ${IN}/mesh3d.c.pamphlet - @echo 27 making ${DOC}/mesh3d.c.dvi from ${IN}/mesh3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/mesh3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} mesh3d.c ; \ - rm -f ${DOC}/mesh3d.c.pamphlet ; \ - rm -f ${DOC}/mesh3d.c.tex ; \ - rm -f ${DOC}/mesh3d.c ) - -@ -\section{msort3d} -<>= -${MIDINT}/msort3d.c: ${IN}/msort3d.c.pamphlet - @ echo 28 ${MIDINT}/msort3d.c from ${IN}/msort3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/msort3d.c.pamphlet >msort3d.c ) - -@ -<>= -${MIDOBJ}/msort3d.o: ${HEADERS} ${MIDINT}/msort3d.c - @ echo 29 making ${MIDOBJ}/msort3d.o from ${MIDINT}/msort3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/msort3d.c ) - -@ -<>= -${DOC}/msort3d.c.dvi: ${IN}/msort3d.c.pamphlet - @echo 30 making ${DOC}/msort3d.c.dvi from ${IN}/msort3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/msort3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} msort3d.c ; \ - rm -f ${DOC}/msort3d.c.pamphlet ; \ - rm -f ${DOC}/msort3d.c.tex ; \ - rm -f ${DOC}/msort3d.c ) - -@ -\section{pot3d} -<>= -${MIDINT}/pot3d.c: ${IN}/pot3d.c.pamphlet - @ echo 31 ${MIDINT}/pot3d.c from ${IN}/pot3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/pot3d.c.pamphlet >pot3d.c ) - -@ -<>= -${MIDOBJ}/pot3d.o: ${HEADERS} ${MIDINT}/pot3d.c - @ echo 32 making ${MIDOBJ}/pot3d.o from ${MIDINT}/pot3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/pot3d.c ) - -@ -<>= -${DOC}/pot3d.c.dvi: ${IN}/pot3d.c.pamphlet - @echo 33 making ${DOC}/pot3d.c.dvi from ${IN}/pot3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/pot3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} pot3d.c ; \ - rm -f ${DOC}/pot3d.c.pamphlet ; \ - rm -f ${DOC}/pot3d.c.tex ; \ - rm -f ${DOC}/pot3d.c ) - -@ -\section{process3d} -<>= -${MIDINT}/process3d.c: ${IN}/process3d.c.pamphlet - @ echo 34 ${MIDINT}/process3d.c from ${IN}/process3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/process3d.c.pamphlet >process3d.c ) - -@ -<>= -${MIDOBJ}/process3d.o: ${HEADERS} ${IN}/cpanel.h ${IN}/process.h \ - ${IN}/volume.h ${LINC}/mode.h ${MIDINT}/process3d.c - @ echo 35 making ${MIDOBJ}/process3d.o from ${MIDINT}/process3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/process3d.c ) - -@ -<>= -${DOC}/process3d.c.dvi: ${IN}/process3d.c.pamphlet - @echo 36 making ${DOC}/process3d.c.dvi from ${IN}/process3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/process3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} process3d.c ; \ - rm -f ${DOC}/process3d.c.pamphlet ; \ - rm -f ${DOC}/process3d.c.tex ; \ - rm -f ${DOC}/process3d.c ) - -@ -\section{project3d} -<>= -${MIDINT}/project3d.c: ${IN}/project3d.c.pamphlet - @ echo 37 ${MIDINT}/project3d.c from ${IN}/project3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/project3d.c.pamphlet >project3d.c ) - -@ -<>= -${MIDOBJ}/project3d.o: ${HEADERS} ${IN}/draw.h ${MIDINT}/project3d.c - @ echo 38 making ${MIDOBJ}/project3d.o from ${MIDINT}/project3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/project3d.c ) - -@ -<>= -${DOC}/project3d.c.dvi: ${IN}/project3d.c.pamphlet - @echo 39 making ${DOC}/project3d.c.dvi from ${IN}/project3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/project3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} project3d.c ; \ - rm -f ${DOC}/project3d.c.pamphlet ; \ - rm -f ${DOC}/project3d.c.tex ; \ - rm -f ${DOC}/project3d.c ) - -@ -\section{quitbut3d} -<>= -${MIDINT}/quitbut3d.c: ${IN}/quitbut3d.c.pamphlet - @ echo 40 ${MIDINT}/quitbut3d.c from ${IN}/quitbut3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/quitbut3d.c.pamphlet >quitbut3d.c ) - -@ -<>= -${MIDOBJ}/quitbut3d.o: ${HEADERS} ${IN}/cpanel.h ${MIDINT}/quitbut3d.c - @ echo 41 making ${MIDOBJ}/quitbut3d.o from ${MIDINT}/quitbut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/quitbut3d.c ) - -@ -<>= -${DOC}/quitbut3d.c.dvi: ${IN}/quitbut3d.c.pamphlet - @echo 42 making ${DOC}/quitbut3d.c.dvi from ${IN}/quitbut3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/quitbut3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} quitbut3d.c ; \ - rm -f ${DOC}/quitbut3d.c.pamphlet ; \ - rm -f ${DOC}/quitbut3d.c.tex ; \ - rm -f ${DOC}/quitbut3d.c ) - -@ -\section{quit3d} -<>= -${MIDINT}/quit3d.c: ${IN}/quit3d.c.pamphlet - @ echo 43 ${MIDINT}/quit3d.c from ${IN}/quit3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/quit3d.c.pamphlet >quit3d.c ) - -@ -<>= -${MIDOBJ}/quit3d.o: ${HEADERS} ${IN}/cpanel.h ${MIDINT}/quit3d.c - @ echo 44 making ${MIDOBJ}/quit3d.o from ${MIDINT}/quit3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/quit3d.c ) - -@ -<>= -${DOC}/quit3d.c.dvi: ${IN}/quit3d.c.pamphlet - @echo 45 making ${DOC}/quit3d.c.dvi from ${IN}/quit3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/quit3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} quit3d.c ; \ - rm -f ${DOC}/quit3d.c.pamphlet ; \ - rm -f ${DOC}/quit3d.c.tex ; \ - rm -f ${DOC}/quit3d.c ) - -@ -\section{save3d} -<>= -${MIDINT}/save3d.c: ${IN}/save3d.c.pamphlet - @ echo 46 ${MIDINT}/save3d.c from ${IN}/save3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/save3d.c.pamphlet >save3d.c ) - -@ -<>= -${MIDOBJ}/save3d.o: ${HEADERS} ${IN}/cpanel.h ${MIDINT}/save3d.c - @ echo 47 making ${MIDOBJ}/savebut3d.o from ${MIDINT}/savebut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/save3d.c ) - -@ -<>= -${DOC}/save3d.c.dvi: ${IN}/save3d.c.pamphlet - @echo 48 making ${DOC}/save3d.c.dvi from ${IN}/save3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/save3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} save3d.c ; \ - rm -f ${DOC}/save3d.c.pamphlet ; \ - rm -f ${DOC}/save3d.c.tex ; \ - rm -f ${DOC}/save3d.c ) - -@ -\section{savebut3d} -<>= -${MIDINT}/savebut3d.c: ${IN}/savebut3d.c.pamphlet - @ echo 49 ${MIDINT}/savebut3d.c from ${IN}/savebut3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/savebut3d.c.pamphlet >savebut3d.c ) - -@ -<>= -${MIDOBJ}/savebut3d.o: ${HEADERS} ${IN}/cpanel.h ${MIDINT}/savebut3d.c - @ echo 50 making ${MIDOBJ}/savebutbut3d.o from ${MIDINT}/savebutbut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/savebut3d.c ) - -@ -<>= -${DOC}/savebut3d.c.dvi: ${IN}/savebut3d.c.pamphlet - @echo 51 making ${DOC}/savebut3d.c.dvi from ${IN}/savebut3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/savebut3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} savebut3d.c ; \ - rm -f ${DOC}/savebut3d.c.pamphlet ; \ - rm -f ${DOC}/savebut3d.c.tex ; \ - rm -f ${DOC}/savebut3d.c ) - -@ -\section{smoothshade3d} -<>= -${MIDINT}/smoothshade3d.c: ${IN}/smoothshade3d.c.pamphlet - @ echo 52 ${MIDINT}/smoothshade3d.c from ${IN}/smoothshade3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/smoothshade3d.c.pamphlet >smoothshade3d.c ) - -@ -<>= -${MIDOBJ}/smoothshade3d.o: ${HEADERS} ${GINC}/spadcolors.h ${IN}/draw.h \ - ${MIDINT}/smoothshade3d.c - @ echo 53 making ${MIDOBJ}/smoothShadebut3d.o from ${MIDINT}/smoothShadebut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/smoothshade3d.c ) - -@ -<>= -${DOC}/smoothshade3d.c.dvi: ${IN}/smoothshade3d.c.pamphlet - @echo 54 making ${DOC}/smoothshade3d.c.dvi from ${IN}/smoothshade3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/smoothshade3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} smoothshade3d.c ; \ - rm -f ${DOC}/smoothshade3d.c.pamphlet ; \ - rm -f ${DOC}/smoothshade3d.c.tex ; \ - rm -f ${DOC}/smoothshade3d.c ) - -@ -\section{spadaction3d} -<>= -${MIDINT}/spadaction3d.c: ${IN}/spadaction3d.c.pamphlet - @ echo 55 ${MIDINT}/spadaction3d.c from ${IN}/spadaction3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/spadaction3d.c.pamphlet >spadaction3d.c ) - -@ -<>= -${MIDOBJ}/spadaction3d.o: ${HEADERS} ${LINC}/mode.h ${MIDINT}/spadaction3d.c - @ echo 56 making ${MIDOBJ}/spadActionbut3d.o from ${MIDINT}/spadActionbut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/spadaction3d.c ) - -@ -<>= -${DOC}/spadaction3d.c.dvi: ${IN}/spadaction3d.c.pamphlet - @echo 57 making ${DOC}/spadaction3d.c.dvi from ${IN}/spadaction3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/spadaction3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} spadaction3d.c ; \ - rm -f ${DOC}/spadaction3d.c.pamphlet ; \ - rm -f ${DOC}/spadaction3d.c.tex ; \ - rm -f ${DOC}/spadaction3d.c ) - -@ -\section{stuff3d} -<>= -${MIDINT}/stuff3d.c: ${IN}/stuff3d.c.pamphlet - @ echo 58 ${MIDINT}/stuff3d.c from ${IN}/stuff3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/stuff3d.c.pamphlet >stuff3d.c ) - -@ -<>= -${MIDOBJ}/stuff3d.o: ${HEADERS} ${MIDINT}/stuff3d.c - @ echo 59 making ${MIDOBJ}/stuffbut3d.o from ${MIDINT}/stuffbut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/stuff3d.c ) - -@ -<>= -${DOC}/stuff3d.c.dvi: ${IN}/stuff3d.c.pamphlet - @echo 60 making ${DOC}/stuff3d.c.dvi from ${IN}/stuff3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/stuff3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} stuff3d.c ; \ - rm -f ${DOC}/stuff3d.c.pamphlet ; \ - rm -f ${DOC}/stuff3d.c.tex ; \ - rm -f ${DOC}/stuff3d.c ) - -@ -\section{surface3d} -<>= -${MIDINT}/surface3d.c: ${IN}/surface3d.c.pamphlet - @ echo 61 ${MIDINT}/surface3d.c from ${IN}/surface3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/surface3d.c.pamphlet >surface3d.c ) - -@ -<>= -${MIDOBJ}/surface3d.o: ${HEADERS} ${IN}/draw.h ${MIDINT}/surface3d.c - @ echo 62 making ${MIDOBJ}/surfacebut3d.o from ${MIDINT}/surfacebut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/surface3d.c ) - -@ -<>= -${DOC}/surface3d.c.dvi: ${IN}/surface3d.c.pamphlet - @echo 63 making ${DOC}/surface3d.c.dvi from ${IN}/surface3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/surface3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} surface3d.c ; \ - rm -f ${DOC}/surface3d.c.pamphlet ; \ - rm -f ${DOC}/surface3d.c.tex ; \ - rm -f ${DOC}/surface3d.c ) - -@ -\section{transform3d} -<>= -${MIDINT}/transform3d.c: ${IN}/transform3d.c.pamphlet - @ echo 64 ${MIDINT}/transform3d.c from ${IN}/transform3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/transform3d.c.pamphlet >transform3d.c ) - -@ -<>= -${MIDOBJ}/transform3d.o: ${HEADERS} ${MIDINT}/transform3d.c - @ echo 65 making ${MIDOBJ}/transformbut3d.o from ${MIDINT}/transformbut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/transform3d.c ) - -@ -<>= -${DOC}/transform3d.c.dvi: ${IN}/transform3d.c.pamphlet - @echo 66 making ${DOC}/transform3d.c.dvi from ${IN}/transform3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/transform3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} transform3d.c ; \ - rm -f ${DOC}/transform3d.c.pamphlet ; \ - rm -f ${DOC}/transform3d.c.tex ; \ - rm -f ${DOC}/transform3d.c ) - -@ -\section{viewport3d} -<>= -${MIDINT}/viewport3d.c: ${IN}/viewport3d.c.pamphlet - @ echo 67 ${MIDINT}/viewport3d.c from ${IN}/viewport3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/viewport3d.c.pamphlet >viewport3d.c ) - -@ -<>= -${MIDOBJ}/viewport3d.o: ${HEADERS} ${IN}/draw.h ${IN}/static.h ${IN}/volume.h \ - ${BIT}/spadbitmap.bitmap ${BIT}/spadmask.mask ${MIDINT}/viewport3d.c - @ echo 68 making ${MIDOBJ}/viewportbut3d.o from ${MIDINT}/viewportbut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/viewport3d.c ) - -@ -<>= -${DOC}/viewport3d.c.dvi: ${IN}/viewport3d.c.pamphlet - @echo 69 making ${DOC}/viewport3d.c.dvi from ${IN}/viewport3d.c.pamphlet - (cd ${DOC} ; \ - cp ${IN}/viewport3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} viewport3d.c ; \ - rm -f ${DOC}/viewport3d.c.pamphlet ; \ - rm -f ${DOC}/viewport3d.c.tex ; \ - rm -f ${DOC}/viewport3d.c ) - -@ -\section{volume3d} -<>= -${MIDINT}/volume3d.c: ${IN}/volume3d.c.pamphlet - @ echo 70 ${MIDINT}/volume3d.c from ${IN}/volume3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/volume3d.c.pamphlet >volume3d.c ) - -@ -<>= -${MIDOBJ}/volume3d.o: ${HEADERS} ${IN}/cpanel.h ${IN}/process.h \ - ${IN}/volume.h ${BIT}/volume.bitmap ${BIT}/volume.mask \ - ${MIDINT}/volume3d.c - @ echo 71 making ${MIDOBJ}/volumebut3d.o from ${MIDINT}/volumebut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/volume3d.c ) - -@ -<>= -${DOC}/volume3d.c.dvi: ${IN}/volume3d.c.pamphlet - @echo 72 making ${DOC}/volume3d.c.dvi from ${IN}/volume3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/volume3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} volume3d.c ; \ - rm -f ${DOC}/volume3d.c.pamphlet ; \ - rm -f ${DOC}/volume3d.c.tex ; \ - rm -f ${DOC}/volume3d.c ) - -@ -\section{write3d} -<>= -${MIDINT}/write3d.c: ${IN}/write3d.c.pamphlet - @ echo 73 ${MIDINT}/write3d.c from ${IN}/write3d.c.pamphlet - @( cd ${MIDINT} ; \ - ${TANGLE} ${IN}/write3d.c.pamphlet >write3d.c ) - -@ -<>= -${MIDOBJ}/write3d.o: ${HEADERS} ${LINC}/write.h ${MIDINT}/write3d.c - @ echo 74 making ${MIDOBJ}/writebut3d.o from ${MIDINT}/writebut3d.c - @ ( cd ${MIDOBJ} ; ${CC} ${CFLAGS} -c ${MIDINT}/write3d.c ) - -@ -<>= -${DOC}/write3d.c.dvi: ${IN}/write3d.c.pamphlet - @echo 75 making ${DOC}/write3d.c.dvi from ${IN}/write3d.c.pamphlet - @(cd ${DOC} ; \ - cp ${IN}/write3d.c.pamphlet ${DOC} ; \ - ${DOCUMENT} ${NOISE} write3d.c ; \ - rm -f ${DOC}/write3d.c.pamphlet ; \ - rm -f ${DOC}/write3d.c.tex ; \ - rm -f ${DOC}/write3d.c ) - -@ -\section{view3d} -<>= -${OUT}/view3d: ${OBJS} ${GDRAW_OBJS} ${LIB}/bsdsignal.o ${LIB}/util.o \ - ${LIB}/xshade.o ${LIB}/halloc.o ${LIB}/pixmap.o \ - ${LIB}/spadcolors.o ${LIB}/xspadfill.o ${LIB}/xdither.o - @ echo 76 linking ${OUT}/view3d $(LDFLAGS) - @ ${CC} ${OBJS} ${GDRAW_OBJS} ${LIB}/bsdsignal.o \ - ${LIB}/util.o ${LIB}/xshade.o ${LIB}/halloc.o \ - ${LIB}/pixmap.o ${LIB}/spadcolors.o ${LIB}/xspadfill.o \ - ${LIB}/xdither.o -o ${OUT}/view3d $(LDFLAGS) -lXpm - -@ -<<*>>= -<> - -DOCFILES= ${DOC}/buttons3d.c.dvi ${DOC}/closeview3d.c.dvi \ - ${DOC}/component3d.c.dvi ${DOC}/control3d.c.dvi \ - ${DOC}/illuminate3d.c.dvi ${DOC}/lightbut3d.c.dvi \ - ${DOC}/lighting3d.c.dvi ${DOC}/main3d.c.dvi \ - ${DOC}/mesh3d.c.dvi ${DOC}/msort3d.c.dvi \ - ${DOC}/pot3d.c.dvi ${DOC}/process3d.c.dvi \ - ${DOC}/project3d.c.dvi ${DOC}/quitbut3d.c.dvi \ - ${DOC}/quit3d.c.dvi ${DOC}/save3d.c.dvi \ - ${DOC}/savebut3d.c.dvi ${DOC}/smoothshade3d.c.dvi \ - ${DOC}/spadaction3d.c.dvi ${DOC}/stuff3d.c.dvi \ - ${DOC}/surface3d.c.dvi ${DOC}/transform3d.c.dvi \ - ${DOC}/viewport3d.c.dvi ${DOC}/volume3d.c.dvi \ - ${DOC}/write3d.c.dvi - -CFLAGS = ${CCF} -I${LINC} -I${GINC} -I${IN} -LDFLAGS = ${LDF} ${STATIC} -lX11 -lm - -OBJS = \ - ${MIDOBJ}/buttons3d.o ${MIDOBJ}/closeview3d.o ${MIDOBJ}/component3d.o \ - ${MIDOBJ}/control3d.o ${MIDOBJ}/illuminate3d.o ${MIDOBJ}/lightbut3d.o \ - ${MIDOBJ}/lighting3d.o ${MIDOBJ}/main3d.o ${MIDOBJ}/mesh3d.o \ - ${MIDOBJ}/msort3d.o ${MIDOBJ}/pot3d.o ${MIDOBJ}/process3d.o \ - ${MIDOBJ}/project3d.o ${MIDOBJ}/quitbut3d.o ${MIDOBJ}/quit3d.o \ - ${MIDOBJ}/save3d.o ${MIDOBJ}/savebut3d.o ${MIDOBJ}/smoothshade3d.o \ - ${MIDOBJ}/spadaction3d.o ${MIDOBJ}/stuff3d.o ${MIDOBJ}/surface3d.o \ - ${MIDOBJ}/transform3d.o ${MIDOBJ}/viewport3d.o ${MIDOBJ}/volume3d.o \ - ${MIDOBJ}/write3d.o - -GDRAW_OBJS = ${GDRAW}/gfun.o ${OBJ}/${SYS}/lib/hash.o - -HEADERS = ${IN}/header.h ${IN}/globals.h \ - ${LINC}/component.h ${LINC}/view3d.h ${LINC}/tube.h \ - ${LINC}/actions.h ${LINC}/viewcommand.h \ - ${GINC}/view.h ${LINC}/g.h - -all: ${OBJS} ${GDRAW_OBJS} ${OUT}/view3d ${DOCFILES} - @echo 78 finished ${IN} - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> -<> -<> - -<> - -clean: - @ echo 79 cleaning ${IN}/view3d - -document: - @ echo 80 documenting ${IN}/view3d - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/buttons3d.c.pamphlet b/src/graph/view3d/buttons3d.c.pamphlet deleted file mode 100644 index 42fa559..0000000 --- a/src/graph/view3d/buttons3d.c.pamphlet +++ /dev/null @@ -1,443 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d buttons3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _BUTTONS3D_C - -#include "header.h" -#include "cpanel.h" - -#include "all-3d.h1" -#define BH 31 /* button window height */ -#define PH 80 /* potentiometer window height */ -#define XEDGE 5 /* leftmost button starts here */ - -/***************************************************** - * int initButtons(buttons) * - * * - * Creates the fields for each button window in the * - * three dimensional control panel, and returns the * - * number of buttons created. * - * * - *****************************************************/ - -int -initButtons (buttonStruct *buttons) -{ - - int PBY = 297; /* panel button Y coordinate at which buttons appear */ - int ii, num = 0; - - /* Rotate, Zoom, and Translate Potentiometer Buttons */ - - /* Title: "Rotate" */ - ii = rotate; - buttons[ii].buttonX = XEDGE; buttons[ii].buttonY = 85; - buttons[ii].buttonWidth = 110; buttons[ii].buttonHeight = PH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = yes; /* rotate is a potentiometer */ - buttons[ii].mask = potMASK; - buttons[ii].textColor = 139; /* line color of rotate dial */ - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Title: "Scale" */ - ii = zoom; - buttons[ii].buttonX = 121; buttons[ii].buttonY = 85; - buttons[ii].buttonWidth = 58; buttons[ii].buttonHeight = PH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = yes; /* zoom(scale) is a potentiometer */ - buttons[ii].mask = potMASK; - buttons[ii].textColor = 165; /* line color of scale arrow */ - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - - /* Title: "Translate" */ - ii = translate; - buttons[ii].buttonX = 185; buttons[ii].buttonY = 85; - buttons[ii].buttonWidth = 110; buttons[ii].buttonHeight = PH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = yes; /* translate is a potentiometer */ - buttons[ii].mask = potMASK; - buttons[ii].textColor = 21; /* line color of translate arrows */ - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* All the rest of the buttons are regular, toggle only buttons and - have the potentiometer variable set to "no". */ - - /* First Row of Buttons */ - /* The four rendering mode buttons: - wireframe, hiddenline solid, hiddenline shaded and smooth shaded **/ - - /* Wirefram mesh */ - ii = transparent; - buttons[ii].buttonX = XEDGE; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 45; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Wire"; - buttons[ii].textColor = modeColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Hidden surface mesh */ - ii = opaqueMesh; - buttons[ii].buttonX = 55; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 53; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Solid"; - buttons[ii].textColor = modeColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Lambertian polygon fill with phong illumination model */ - ii = render; - buttons[ii].buttonX = 113; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 53; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Shade"; - buttons[ii].textColor = modeColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Phong smooth shading and illumination */ - ii = smooth; - buttons[ii].buttonX = 171; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 59; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Smooth"; - buttons[ii].textColor = modeColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Reset View Position Button */ - ii = resetView; - buttons[ii].buttonX = 240; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 53; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Reset"; - buttons[ii].textColor = 149; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - - /* Second Row of Buttons */ - - /* update y displacement of buttons row */ - PBY=PBY+BH+3; - - /* Bounding Region On/Off */ - ii = region3D; - buttons[ii].buttonX = XEDGE; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 58; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Bounds"; - buttons[ii].textColor = 6; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Axes Turned On/Off */ - ii = axesOnOff; - buttons[ii].buttonX = 68; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 49; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Axes"; - buttons[ii].textColor = offColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Outline polygons with black lines in render mode */ - ii = outlineOnOff; - buttons[ii].buttonX = 122; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 70; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Outline"; - buttons[ii].textColor = offColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Display as if a 1-bit plane image */ - ii = bwColor; - buttons[ii].buttonX = 197; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 33; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "BW"; - buttons[ii].textColor = offColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Hide Control Panel */ - ii = hideControl; - buttons[ii].buttonX = 240; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 53; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Hide"; - buttons[ii].textColor = 149; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - - /* Third Row of Buttons */ - - /* update y displacement of buttons row */ - PBY=PBY+BH+3; - - /* Shows Lighting Control Panel */ - ii = lighting; - buttons[ii].buttonX = XEDGE; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 65; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Light"; - buttons[ii].textColor = 149; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Shows View Volume Control Panel */ - ii = viewVolume; - buttons[ii].buttonX = 75; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 100; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "View Volume"; - buttons[ii].textColor = 149; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Shows Save Panel */ - ii = saveit; - buttons[ii].buttonX = 180; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 50; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Save"; - buttons[ii].textColor = 149; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Exits from the viewport running */ - ii = closeAll; - buttons[ii].buttonX = 240; buttons[ii].buttonY = PBY; - buttons[ii].buttonWidth = 53; buttons[ii].buttonHeight = BH; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "Quit"; - buttons[ii].textColor = offColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Buttons to control potentiometers */ - /* These buttons appear above the potentiometer windows which they affect. */ - - /* Rotate potentiometer buttons */ - - /* Rotate about the origin indicated by the axes */ - /* Red is off, Green is on */ - ii = originr; - buttons[ii].buttonX = XEDGE; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth = 53; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "origin"; - buttons[ii].textColor = onColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Rotate about the objects center of volume */ - /* Red is off, Green is on */ - ii = objectr; - buttons[ii].buttonX = 62; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth = 53; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "object"; - buttons[ii].textColor = offColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Scale potentiometer buttons */ - - /* Scale along X axis: Red is off, Green is on */ - ii = zoomx; - buttons[ii].buttonX = 121; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth = 17; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "x"; - buttons[ii].textColor = onColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Scale along Y axis: Red is off, Green is on */ - ii = zoomy; - buttons[ii].buttonX = 141; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth = 17; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "y"; - buttons[ii].textColor = onColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Zoom along Z axis: Red is off, Green is on */ - ii = zoomz; - buttons[ii].buttonX = 161; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth = 17; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "z"; - buttons[ii].textColor = onColor; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Translate potentiometer buttons */ - - /* Indicates an orthographic projection of the xy-plane, - translation is in x and y coordinates */ - ii = xy; - buttons[ii].buttonX = 185; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth= 34; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "xy"; - buttons[ii].textColor = 35; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Indicates an orthographic projection of the xz-plane, - translation is in x and z coordinates */ - ii = xz; - buttons[ii].buttonX = 223; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth= 34; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "xz"; - buttons[ii].textColor = 35; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - /* Indicates an orthographic projection of the yz-plane, - translation is in y and z coordinates */ - ii = yz; - buttons[ii].buttonX = 261; buttons[ii].buttonY = 55; - buttons[ii].buttonWidth= 34; buttons[ii].buttonHeight = 25; - buttons[ii].buttonKey = ii; - buttons[ii].pot = no; - buttons[ii].mask = buttonMASK; - buttons[ii].text = "yz"; - buttons[ii].textColor = 35; - buttons[ii].xHalf = buttons[ii].buttonWidth/2; - buttons[ii].yHalf = buttons[ii].buttonHeight/2; - ++num; - - return(num); - -} /* initButtons() */ - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/closeview3d.c.pamphlet b/src/graph/view3d/closeview3d.c.pamphlet deleted file mode 100644 index a40f08d..0000000 --- a/src/graph/view3d/closeview3d.c.pamphlet +++ /dev/null @@ -1,110 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d closeview3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _CLOSEVIEW3D_C - -#include -#include "header.h" - -#include "util.h1" -#include "gfun.h1" -#include "all-3d.h1" - - - -/***************************************************** - * int closeViewport() * - * * - * This closes all of the windows created for the * - * control panel window and the viewport window of * - * the current graph being displayed. * - * It does not currently return a specified value. * - * * - *****************************************************/ - -void -closeViewport (void) -{ - int i; - - /* First, unlink viewport from global list of viewports */ - if (viewport->prevViewport) { /* if there is a viewport before it */ - (viewport->prevViewport)->nextViewport = viewport->nextViewport; - } else { /* this is the first viewport */ - viewport = viewport->nextViewport; - } - if (viewport->nextViewport) { /* if there is a viewport following it */ - (viewport->nextViewport)->prevViewport = viewport->prevViewport; - } - - /* Free up the control panel button windows */ - for (i=0; ibuttonQueue[i]).self); - } - - /* Free up the control panel window */ - XDestroyWindow(dsply,control->controlWindow); - free(control); - - /* Free up the viewport window */ - - XDestroyWindow(dsply,viewport->viewWindow); - XDestroyWindow(dsply,viewport->titleWindow); - free(viewport); - - XFlush(dsply); - -} /* closeViewport() */ - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/component3d.c.pamphlet b/src/graph/view3d/component3d.c.pamphlet deleted file mode 100644 index f0d3c93..0000000 --- a/src/graph/view3d/component3d.c.pamphlet +++ /dev/null @@ -1,876 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d component3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _COMPONENT3D_C - -#include "header.h" -#include "draw.h" - -#include "gfun.h1" -#include "util.h1" -#include "xspadfill.h1" - -#include "all-3d.h1" - -#define axisLength 1.0 /* use 100.0, if data is not to be normalized */ - -#define samePoint(a,b) ((refPt3D(viewData,a)->x == refPt3D(viewData,b)->x) &&\ - (refPt3D(viewData,a)->y == refPt3D(viewData,b)->y) &&\ - (refPt3D(viewData,a)->z == refPt3D(viewData,b)->z)) -#define MAX_POINT 1000.0 -#define MIN_POINT -1000.0 - - -void -scaleComponents (void) -{ - - double xRange,yRange,zRange; - int i; - viewTriple *aPoint; - - /* Temporary range limits until the three dimensional clipping - package is fully functional */ - - if (viewData.xmin < MIN_POINT) viewData.xmin = MIN_POINT; - if (viewData.xmax > MAX_POINT) viewData.xmax = MAX_POINT; - if (viewData.ymin < MIN_POINT) viewData.ymin = MIN_POINT; - if (viewData.ymax > MAX_POINT) viewData.ymax = MAX_POINT; - if (viewData.zmin < MIN_POINT) viewData.zmin = MIN_POINT; - if (viewData.zmax > MAX_POINT) viewData.zmax = MAX_POINT; - - xRange = viewData.xmax - viewData.xmin; - yRange = viewData.ymax - viewData.ymin; - zRange = viewData.zmax - viewData.zmin; - - /* We scale down, normalize the data, if it is coming from AXIOM - (handled by viewman). If the data is coming from a file (handled by - viewalone) then it should already been scaled down. - */ - - /* Find the coordinate axis with the larges range of data and scale - the others relative to it. - */ - /* compare x and y ranges */ - if (xRange > yRange) { - if (xRange > zRange) { - if (absolute(viewData.xmax) >= absolute(viewData.xmin)) - viewData.scaleToView = axisLength/(absolute(viewData.xmax)); - else - viewData.scaleToView = axisLength/(absolute(viewData.xmin)); - } else { - if (absolute(viewData.zmax) >= absolute(viewData.zmin)) - viewData.scaleToView = axisLength/(absolute(viewData.zmax)); - else - viewData.scaleToView = axisLength/(absolute(viewData.zmin)); - } - } else { - if (yRange > zRange) { - if (absolute(viewData.ymax) >= absolute(viewData.ymin)) - viewData.scaleToView = axisLength/(absolute(viewData.ymax)); - else - viewData.scaleToView = axisLength/(absolute(viewData.ymin)); - } else { - if (absolute(viewData.zmax) >= absolute(viewData.zmin)) - viewData.scaleToView = axisLength/(absolute(viewData.zmax)); - else - viewData.scaleToView = axisLength/(absolute(viewData.zmin)); - } - } - - /* We now normalize all the points in this program. The information - needed to link the normalized set of points back to the real object - space scale created in AXIOM is held in viewData.scaleToView. */ - viewData.xmin *= viewData.scaleToView; - viewData.xmax *= viewData.scaleToView; - viewData.ymin *= viewData.scaleToView; - viewData.ymax *= viewData.scaleToView; - viewData.zmin *= viewData.scaleToView; - viewData.zmax *= viewData.scaleToView; - viewData.clipXmin = viewData.xmin; - viewData.clipXmax = viewData.xmax; - viewData.clipYmin = viewData.ymin; - viewData.clipYmax = viewData.ymax; - viewData.clipZmin = viewData.zmin; - viewData.clipZmax = viewData.zmax; - - for (i=0, aPoint=viewData.points; ix *= viewData.scaleToView; - aPoint->y *= viewData.scaleToView; - aPoint->z *= viewData.scaleToView; - } - -} /* scaleComponents() */ - - -/* - void makeTriangle(a,b,c) - Given three indices to three points, a triangular polygon is created - and inserted into the polygon list of viewData. If two or more of the - points are coincidental, no polygon is created since that would be a - degenerate (collapsed) polygon. - */ - -void -makeTriangle (int a, int b, int c) -{ - poly *aPoly; - - if (!(samePoint(a,b) || samePoint(b,c) || samePoint(c,a))) { - /* create triangle only if the three vertex points are distinct */ - aPoly = (poly *)saymem("component.c",1,sizeof(poly)); - aPoly->num = aPoly->sortNum = viewData.numPolygons++; - aPoly->split = aPoly->moved = no; - aPoly->numpts = 3; - aPoly->primitiveType = polygonComponent; - aPoly->indexPtr = (int *)saymem("component.c",3,sizeof(int)); - *(aPoly->indexPtr) = a; - *(aPoly->indexPtr + 1) = b; - *(aPoly->indexPtr + 2) = c; - aPoly->doNotStopDraw = yes; - aPoly->next = viewData.polygons; - viewData.polygons = aPoly; - } /* if all points are unique */ - -} /* makeTriangle() */ - - - - -/* - void triangulate() - - Only if there is more than one list do we triangulate; a single list - is used for either a space curve or simply a point. Actually, in that - case, we now make "flat" *polygons, flagged by the primitiveType field - (pointComponent, etc. in tube.h). We need to examine two lists at a time - (and if the structure is closed, the last and first as well). For every - three points in the two lists, alternating between one in one and two in - the other, we construct triangles. If one list is shorter, then its last - point becomes the vertex for the remaining pairs of points from the other - list. It turns out that any distribution of points in the two lists - (preserving cyclic order) will produce the same desired polygon. - */ - -void -triangulate (void) -{ - - int u,l; - int uBound,lBound; - int i,j,k; - LLPoint *anLLPoint; - LPoint *list1,*list2; - poly *aPoly; - - anLLPoint = viewData.lllp.llp; - for (i=0; inumOfLists > 1) { - list2 = anLLPoint->lp; - for (j=1; jnumOfLists; j++) { - list1 = list2; - list2 = list1 + 1; - u = l = 0; - uBound = u+1 < list1->numOfPoints; - lBound = l+1 < list2->numOfPoints; - while (uBound || lBound) { - if (uBound) { - makeTriangle(*(list1->indices + u + 1), - *(list1->indices + u), *(list2->indices + l)); - u++; - uBound = u+1 < list1->numOfPoints; - } - if (lBound) { - makeTriangle(*(list2->indices + l), - *(list2->indices + l + 1), *(list1->indices + u)); - l++; - lBound = l+1 < list2->numOfPoints; - } - } /* while (uBound || lBound) */ - } /* for jnumOfLists */ - } /* if anLLPoint->numOfLists > 1 */ - else { - /* if anLLPoint->numOfLists <= 1...assume this means =1 */ - /* Flat polygons are to be drawn when hidden - surface algorithm is used.*/ - if (anLLPoint->numOfLists == 1) { - if (anLLPoint->lp->numOfPoints == 1) { - /* this graph is a single point */ - aPoly = (poly *)saymem("component.c",1,sizeof(poly)); - aPoly->num = aPoly->sortNum = viewData.numPolygons++; - aPoly->split = aPoly->moved = no; - aPoly->primitiveType = pointComponent; - aPoly->numpts = 1; - aPoly->indexPtr = (int *)saymem("component.c",1,intSize); - *(aPoly->indexPtr) = *(anLLPoint->lp->indices); - aPoly->doNotStopDraw = yes; - aPoly->next = viewData.polygons; - viewData.polygons = aPoly; - } else { - /* this graph is a curve */ - for (k=0; klp->numOfPoints-1; k++) { - aPoly = (poly *)saymem("component.c",1,sizeof(poly)); - aPoly->num = aPoly->sortNum = viewData.numPolygons++; - aPoly->split = aPoly->moved = no; - aPoly->primitiveType = lineComponent; /* curveComponent */ - aPoly->numpts = 2; - aPoly->indexPtr = - (int *)saymem("component.c",2,sizeof(int)); - *(aPoly->indexPtr) = *(anLLPoint->lp->indices + k); - *(aPoly->indexPtr+1) = *(anLLPoint->lp->indices + k + 1); - aPoly->doNotStopDraw = yes; - aPoly->next = viewData.polygons; - viewData.polygons = aPoly; - } /* for k */ - if (anLLPoint->lp->prop.closed) { - aPoly = (poly *)saymem("component.c",1,sizeof(poly)); - aPoly->num = aPoly->sortNum = viewData.numPolygons++; - aPoly->split = aPoly->moved = no; - aPoly->primitiveType = lineComponent; /* curveComponent */ - aPoly->numpts = 2; - aPoly->indexPtr = - (int *)saymem("component.c",2,sizeof(int)); - *(aPoly->indexPtr) = *(anLLPoint->lp->indices + k); - *(aPoly->indexPtr+1) = *(anLLPoint->lp->indices); - aPoly->doNotStopDraw = yes; - aPoly->next = viewData.polygons; - viewData.polygons = aPoly; - } /* if list of points is closed */ - } /* else */ - } /* point, line, polygon, surface components are taken care of above */ - } /* else anLLPoint->numOfLists <= 1 */ - } /* for LLPoints in LLLPoints (i) */ - -} /* triangulate */ - - - -void -readComponentsFromViewman (void) -{ - int i,j,k; - LLPoint *anLLPoint; - LPoint *anLPoint; - viewTriple *aPoint; - /* maxLength holds the max(llp,lp) figure regarding how large to - make the array of XPoints, i.e. quadMesh, for use in calling XDraw(). */ - int maxLength=0; - - int *anIndex; - - readViewman(&(viewData.numOfPoints),intSize); - aPoint = viewData.points = - (viewTriple *)saymem("component.c",viewData.numOfPoints, - sizeof(viewTriple)); - for (i=0; ix),floatSize); - readViewman(&(aPoint->y),floatSize); - readViewman(&(aPoint->z),floatSize); - readViewman(&(aPoint->c),floatSize); -#ifdef NANQ_DEBUG - if (!(aPoint->z < 0) && !(aPoint->z > 0) && !(aPoint->z == 0)) - fprintf(stderr,"%g\n", aPoint->z); -#endif - } - - readViewman(&(viewData.lllp.numOfComponents),intSize); - anLLPoint = viewData.lllp.llp = - (LLPoint *)saymem("component.c, i",viewData.lllp.numOfComponents, - sizeof(LLPoint)); - for (i=0; iprop.closed),intSize); - readViewman(&(anLLPoint->prop.solid),intSize); - readViewman(&(anLLPoint->numOfLists),intSize); - anLPoint = anLLPoint->lp = - (LPoint *)saymem("component.c, ii",anLLPoint->numOfLists, - sizeof(LPoint)); - for (j=0; jnumOfLists; j++,anLPoint++) { - if (anLLPoint->numOfLists > maxLength) - maxLength = anLLPoint->numOfLists; - readViewman(&(anLPoint->prop.closed),intSize); - readViewman(&(anLPoint->prop.solid),intSize); - readViewman(&(anLPoint->numOfPoints),intSize); - anIndex = anLPoint->indices = - (int *)saymem("component.c, index",anLPoint->numOfPoints,intSize); - if (anLPoint->numOfPoints > maxLength) - maxLength = anLPoint->numOfPoints; - for (k=0; knumOfPoints; k++,anIndex++) { - readViewman(anIndex,intSize); - /* AXIOM arrays are one based, C arrays are zero based */ - if (!viewAloned) (*anIndex)--; - } - } /* for LPoints in LLPoints (j) */ - } /* for LLPoints in LLLPoints (i) */ - - quadMesh = (XPoint *)saymem("component.c",maxLength+2,sizeof(XPoint)); - -} /* readComponentsFromViewman() */ - - - -/* - void calcNormData() * - Calculates the surface normals for the polygons that make up the tube. - Also finds the fourth coefficient to the plane equation: - Ax + By + Cz + D = 0 - A,B, and C are in the normal N[3] and D is the planeConst. - Figures out the color as well (from the average of the points) and - resets the moved flag - */ - -void -calcNormData (void) -{ - - poly *aPoly; - int *index; - - for (aPoly = viewData.polygons; aPoly != NIL(poly); aPoly = aPoly->next) { - index = aPoly->indexPtr; - switch (aPoly->primitiveType) { - case pointComponent: - case lineComponent: - aPoly->moved = 0; - aPoly->color = refPt3D(viewData,*index)->c; - break; - default: - /* - The following line takes 3 consecutive points and asks - for the normal vector defined by them. This assumes that - these do not contain co-linear points. For some reason, - co-linear points are allowed, this needs to be changed. - */ - getMeshNormal(refPt3D(viewData,*index)->x, - refPt3D(viewData,*index)->y, - refPt3D(viewData,*index)->z, - refPt3D(viewData,*(index+1))->x, - refPt3D(viewData,*(index+1))->y, - refPt3D(viewData,*(index+1))->z, - refPt3D(viewData,*(index+2))->x, - refPt3D(viewData,*(index+2))->y, - refPt3D(viewData,*(index+2))->z, 0.0, 1.0, aPoly->N); - - /* calculate the constant term, D, for the plane equation */ - aPoly->planeConst = - -(aPoly->N[0] * refPt3D(viewData,*index)->x + - aPoly->N[1] * refPt3D(viewData,*index)->y + - aPoly->N[2] * refPt3D(viewData,*index)->z); - aPoly->moved = 0; - aPoly->color = (refPt3D(viewData,*index)->c + - (refPt3D(viewData,*(index+1)))->c + - (refPt3D(viewData,*(index+2)))->c) / 3.0; - break; - } /* switch */ - } - -} /* calcNormData() */ - - - -/* - viewPoints *make3DComponents() - - Read in all the 3D data from the viewport manager and construct the - model of it. The model is based upon a list of lists of lists of points. - Each top level list makes a component in 3-space. The interpretation - really begins at the level below that, where the list of lists of - points is. For 3D explicit equations of two variables, the closed - boolean for this level is False and the closed boolean for each sublist - is False as well. For 3D parameterized curves of one variable, the - closed boolean for this level is defined by the user from AXIOM , - (which defaults to False) and the closed boolean for each sublist is True. - */ - -viewPoints * -make3DComponents (void) -{ - viewPoints *graphData; - - readComponentsFromViewman(); - - /* The initial boundaries for the clipping region are set to those - of the boundaries of the data region. */ - viewData.clipXmin = viewData.xmin; viewData.clipXmax = viewData.xmax; - viewData.clipYmin = viewData.ymin; viewData.clipYmax = viewData.ymax; - viewData.clipZmin = viewData.zmin; viewData.clipZmax = viewData.zmax; - - /* normalize the data coordinates */ - if (viewData.scaleDown) scaleComponents(); - viewData.numPolygons = 0; - /* initially the list of polygons is empty */ - viewData.polygons = NIL(poly); - /* create the polygons; (sets viewData.polygons and viewData.numPolygons) */ - triangulate(); - /* calculate the plane equations for all the polygons */ - calcNormData(); - - graphData = makeViewport(); - - imageX = XCreateImage(/* display */ dsply, - /* visual */ DefaultVisual(dsply,scrn), - /* depth */ DefaultDepth(dsply,scrn), - /* format */ ZPixmap, - /* offset */ 0, - /* data */ NULL, - /* width */ vwInfo.width, - /* height */ 1, - /* bitmap_pad */ 32, - /* bytes_per_line */ 0); - imageX->data = NIL(char); - - /* windowing displaying */ - writeTitle(); - postMakeViewport(); - drawViewport(Xoption); - firstTime = yes; - XMapWindow(dsply, graphData->viewWindow); - XMapWindow(dsply, graphData->titleWindow); - XFlush(dsply); - - return(graphData); - -} /* make3DComponents */ - - - - - -void -draw3DComponents (int dFlag) -{ - - int i, j, k, hue, x1, y1, x2, y2; - LLPoint *anLLPoint; - LPoint *anLPoint; - int *anIndex; - int componentType; /* what the component is to be interpreted as */ - int clip_a,clip_i; /* for use in wire mesh mode clipping */ - XEvent peekEvent; - viewTriple *aLPt; - XPoint line[2]; - RGB col_rgb; - - calcEyePoint(); - while ((XPending(dsply) > 0) && (scanline > 0)) - XNextEvent(dsply,&peekEvent); - switch (viewData.style) { - - case transparent: - GSetLineAttributes(componentGC,0,LineSolid,CapButt,JoinMiter,dFlag); - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, (float)foregroundColor, dFlag); - else - GSetForeground(componentGC, (float) meshOutline, dFlag); - } else { - GSetForeground(componentGC, psBlack, dFlag); - } - /* no need to check "keep drawing" for ps */ - if (dFlag == Xoption) drawMore = keepDrawingViewport(); - - /* - This is where we interpret the list of lists of lists of points struct. - We want to extract the following forms of data: - - individual points (drawn as filled points) - - lines (space curves) - - defined polygon primitives - - surfaces - the last one is the one that will replace the function of 2 variables, - tubes as well as 3D parameterized functions of 2 variables. - Since there could be many other ways of constructing L L L Pts - much - more than could be usefully interpreted - any other formats are - currently not allowed. When they are, this comment should be updated - appropriately. - - ************************************************************************ - - Traverse each component. - We decide here, before we begin traversing the - component what we want to interpret it as. - Here's the convention used to figure that out: - - points: #anLLPoint->numOfLists was 1 - #anLPoint->numOfPoints is 1 - - lines: #anLLPoint->numOfLists was 1 - #anLPoint->numOfPoints > 1 - - polygons: #anLLPoint->numOfLists was 2 - #anLPoint->numOfPoints is 1 - - surface: #anLLPoint->numOfLists was some m>1 - #anLPoint->numOfPoints all point lists are the same. - - */ - - anLLPoint = viewData.lllp.llp; - for (i=0; inumOfLists == 1) { - if (anLLPoint->lp->numOfPoints == 1) componentType = pointComponent; - else componentType = lineComponent; - } else if (anLLPoint->numOfLists == 2) { - if ((anLLPoint->lp->numOfPoints == 1) && - ((anLLPoint->lp+1)->numOfPoints > 2)) - componentType = polygonComponent; - } - /* Check for corrupt data and NaN data is made in AXIOM . */ - if (componentType == stillDontKnow) - componentType = surfaceComponent; - - anLPoint = anLLPoint->lp; - - switch (componentType) { - - case pointComponent: - /* anLLPoint->numOfLists == anLLPoint->lp->numOfPoints == 1 here */ - aLPt = refPt3D(viewData,*(anLPoint->indices)); - project(aLPt,quadMesh,0); - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, (float)foregroundColor, dFlag); - else { - hue = hueValue(aLPt->c); - GSetForeground(componentGC, (float)XSolidColor(hue,2), dFlag); - } - } else GSetForeground(componentGC, psBlack, dFlag); - GFillArc(componentGC,viewport->viewWindow,quadMesh->x,quadMesh->y, - viewData.pointSize,viewData.pointSize,0,360*64,dFlag); - break; - - case lineComponent: - /* anLLPoint->numOfLists == 1 here */ - anIndex = anLPoint->indices; - aLPt = refPt3D(viewData,*anIndex); - project(aLPt,quadMesh,0); - x1 = quadMesh[0].x; y1 = quadMesh[0].y; anIndex++; - for (k=1; knumOfPoints; k++,anIndex++) { - aLPt = refPt3D(viewData,*anIndex); - project(aLPt,quadMesh,k); - x2 = quadMesh[k].x; y2 = quadMesh[k].y; - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, (float)foregroundColor, dFlag); - else { - hue = hueValue(aLPt->c); - GSetForeground(componentGC, (float)XSolidColor(hue,2), dFlag); - } - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } else { - if (dFlag==PSoption && !mono && !viewport->monoOn) { - hue = getHue(aLPt->c); - col_rgb = hlsTOrgb((float)hue,0.5,0.8); - line[0].x = x1; line[0].y = y1; - line[1].x = x2; line[1].y = y2; - PSDrawColor(col_rgb.r,col_rgb.g,col_rgb.b,line,2); - } else { - if (foregroundColor == white) - GSetForeground(componentGC, 0.0, dFlag); - else - GSetForeground(componentGC, psBlack, dFlag); - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } - } - x1 = x2; y1 = y2; - } /* for points in LPoints (k) */ - if (anLPoint->prop.closed) { - project(refPt3D(viewData,*(anLPoint->indices)),quadMesh, - anLPoint->numOfPoints); - x2 = quadMesh[anLPoint->numOfPoints].x; - y2 = quadMesh[anLPoint->numOfPoints].y; - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, (float)foregroundColor, dFlag); - else { - hue = hueValue(aLPt->c); - GSetForeground(componentGC, (float)XSolidColor(hue,2), dFlag); - } - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } - else { - if (dFlag==PSoption && !mono && !viewport->monoOn) { - hue = getHue(aLPt->c); - col_rgb = hlsTOrgb((float)hue,0.5,0.8); - line[0].x = x1; line[0].y = y1; - line[1].x = x2; line[1].y = y2; - PSDrawColor(col_rgb.r,col_rgb.g,col_rgb.b,line,2); - } - else { - if (foregroundColor == white) - GSetForeground(componentGC, 0.0, dFlag); - else - GSetForeground(componentGC, psBlack, dFlag); - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } - } - } - break; - - case polygonComponent: - /* first pt of polygon is a single list */ - project(refPt3D(viewData,*(anLPoint->indices)),quadMesh,0); - /* remaining points in the 2nd list (always of size 2 or greater) */ - x1 = quadMesh[0].x; y1 = quadMesh[0].y; - anLPoint = anLLPoint->lp + 1; - anIndex = anLPoint->indices; - for (k=1; k<=anLPoint->numOfPoints; k++,anIndex++) { - aLPt = refPt3D(viewData,*anIndex); - project(aLPt,quadMesh,k); - x2 = quadMesh[k].x; y2 = quadMesh[k].y; - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, (float)foregroundColor, dFlag); - else { - hue = hueValue(aLPt->c); - GSetForeground(componentGC, (float)XSolidColor(hue,2), dFlag); - } - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } - else { - if (dFlag==PSoption && !mono && !viewport->monoOn) { - hue = getHue(aLPt->c); - col_rgb = hlsTOrgb((float)hue,0.5,0.8); - line[0].x = x1; line[0].y = y1; - line[1].x = x2; line[1].y = y2; - PSDrawColor(col_rgb.r,col_rgb.g,col_rgb.b,line,2); - } - else { - if (foregroundColor == white) - GSetForeground(componentGC, 0.0, dFlag); - else - GSetForeground(componentGC, psBlack, dFlag); - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } - } - x1 = x2; y1 = y2; - } /* for points in LPoints (k) */ - project(refPt3D(viewData,*(anLLPoint->lp->indices)),quadMesh,k); - x2 = quadMesh[k].x; y2 = quadMesh[k].y; - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, (float)foregroundColor, dFlag); - else { - hue = hueValue(refPt3D(viewData,*anIndex)->c); - GSetForeground(componentGC, (float)XSolidColor(hue,2), dFlag); - } - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } else { - if (dFlag==PSoption && !mono && !viewport->monoOn) { - hue = getHue(refPt3D(viewData,*anIndex)->c); - col_rgb = hlsTOrgb((float)hue,0.5,0.8); - line[0].x = x1; line[0].y = y1; - line[1].x = x2; line[1].y = y2; - PSDrawColor(col_rgb.r,col_rgb.g,col_rgb.b,line,2); - } - else { - if (foregroundColor == white) - GSetForeground(componentGC, 0.0, dFlag); - else - GSetForeground(componentGC, psBlack, dFlag); - if (!eqNANQ(x1) && !eqNANQ(y1) && !eqNANQ(x2) && !eqNANQ(y2)) - GDrawLine(componentGC,viewport->viewWindow,x1,y1,x2,y2,dFlag); - } - } - /* close a polygon */ - break; - - case surfaceComponent: - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, (float)foregroundColor, dFlag); - else - GSetForeground(componentGC, (float) meshOutline, dFlag); - } - else { - GSetForeground(componentGC, psBlack, dFlag); - } - - /* traverse down one direction first (all points - in a list at a time) */ - for (j=0; drawMore && jnumOfLists; j++,anLPoint++) { - anIndex = anLPoint->indices; - clip_a = 0; - for (k=0, clip_i=0; - drawMore && knumOfPoints; - k++, anIndex++, clip_i++) { - aLPt = refPt3D(viewData,*anIndex); - project(aLPt,quadMesh,k); - - if (behindClipPlane(aLPt->pz) || - (viewData.clipStuff && - outsideClippedBoundary(aLPt->x, aLPt->y, aLPt->z))) { - if (clip_i - clip_a > 1) { - GDrawLines(componentGC,viewport->viewWindow,(quadMesh+clip_a), - clip_i-clip_a, CoordModeOrigin, dFlag ); - } - clip_a = clip_i + 1; - } - - drawMore = keepDrawingViewport(); - } /* for points in LPoints (k) */ - if (drawMore) { - /* if drawMore is true, then the above loop terminated with - clip_i incremented properly */ - if (anLPoint->prop.closed) { - /* If closed, then do the first point again - no need to project - just copy over from the first one */ - aLPt = refPt3D(viewData,*(anLPoint->indices)); - project(aLPt,quadMesh, anLPoint->numOfPoints); - if (behindClipPlane(aLPt->pz) || - (viewData.clipStuff && - outsideClippedBoundary(aLPt->x, aLPt->y, aLPt->z))) { - if (clip_i - clip_a > 1) { - GDrawLines(componentGC, viewport->viewWindow, - (quadMesh+clip_a), clip_i-clip_a, - CoordModeOrigin, dFlag); - } - clip_a = clip_i + 1; - } - clip_i++; - } /* closed */ - if (clip_i - clip_a > 1) { - GDrawLines(componentGC, viewport->viewWindow, (quadMesh+clip_a), - clip_i-clip_a, CoordModeOrigin, dFlag); - } - } /* drawMore */ - } /* for LPoints in LLPoints (j) */ - - /* now traverse down the list in the other direction - (one point from each list at a time) */ - for (j=0; drawMore && jlp->numOfPoints; j++) { - clip_a = 0; - for (k=0, clip_i=0; - drawMore && knumOfLists; - k++, clip_i++) { - aLPt = refPt3D(viewData,*((anLLPoint->lp + k)->indices + j)); - project(aLPt, quadMesh,k); - - if (behindClipPlane(aLPt->pz) || - (viewData.clipStuff && - outsideClippedBoundary(aLPt->x, aLPt->y, aLPt->z))) { - if (clip_i - clip_a > 1) { - GDrawLines(componentGC,viewport->viewWindow,quadMesh+clip_a, - clip_i-clip_a, CoordModeOrigin, dFlag ); - } - clip_a = clip_i + 1; - } - drawMore = keepDrawingViewport(); - } /* for points in LPoints (k) */ - - if (drawMore) { - /* if drawMore is true, then the above loop terminated with - clip_i incremented properly */ - if (anLLPoint->prop.closed) { - /* if closed, do the first point again - no need to project - just copy over from the first one */ - aLPt = refPt3D(viewData,*((anLLPoint->lp + 0)->indices + j)); - project(aLPt, quadMesh, anLLPoint->numOfLists); - if (behindClipPlane(aLPt->pz) || - (viewData.clipStuff && - outsideClippedBoundary(aLPt->x, aLPt->y, aLPt->z))) { - if (clip_i - clip_a > 1) { - GDrawLines(componentGC, viewport->viewWindow, - quadMesh + clip_a, clip_i - clip_a, - CoordModeOrigin, dFlag); - } - clip_a = clip_i + 1; - } - clip_i++; - } /* closed */ - if (clip_i - clip_a > 1) { - GDrawLines(componentGC, viewport->viewWindow, quadMesh+clip_a, - clip_i-clip_a, CoordModeOrigin, dFlag); - } - } /* drawMore */ - } /* for a point in each LPoint (j) */ - break; - } /* switch componentType */ - } /* for LLPoints in LLLPoints (i) */ - break; - - case opaqueMesh: - if (dFlag==Xoption) { - GSetForeground(globGC, (float)opaqueForeground, dFlag); - GSetForeground(opaqueGC, (float)opaqueOutline, dFlag); - } - else { - GSetForeground(globGC, psBlack, dFlag); - GSetForeground(opaqueGC, psBlack, dFlag); - } - GSetLineAttributes(opaqueGC,0,LineSolid,CapButt,JoinRound,dFlag); - drawPolygons(dFlag); - break; - - case render: - if (viewData.outlineRenderOn) { - GSetLineAttributes(renderGC,0,LineSolid,CapButt,JoinRound,dFlag); - if (dFlag==Xoption) GSetForeground(renderGC,(float)black, dFlag); - else GSetForeground(renderGC,psBlack, dFlag ); - } - drawPolygons(dFlag); - break; - - case smooth: - drawPhong(dFlag); - break; - - } /* switch on style */ - -} /* draw3DComponents() */ - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/contour.h b/src/graph/view3d/contour.h deleted file mode 100755 index d037c44..0000000 --- a/src/graph/view3d/contour.h +++ /dev/null @@ -1,195 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - - - /*********************************************************************** - contour.h - ***********************************************************************/ -#define segDEBUG - -/* #define contour -100*/ - -#define CONTOUR_float double -#define ACTIVE_poly_struct poly - -#define line_crosses_plane(z_min, z_max, z_val) \ - ((z_min < z_val) && (z_max >= z_val)) - -#ifdef oldie -typedef struct _active_poly_struct { - struct _active_poly_struct *next; - int num; - struct _poly *polygon; -} active_poly_struct; -#endif - -typedef struct _segment_struct { - struct _segment_struct *next; - struct _viewTriple *point1, *point2; -} segment_struct; - -typedef struct _segment_list_struct { - int num_segs; - segment_struct *segments; - int num, max_num; /* num=slice num, max_num=#slices for this contour */ -} segment_list_struct; - - /*=====================================================================* - Macro Definitions - *=====================================================================*/ -#define foreach_slice(index, slice, slice_list, max_slices) \ - for (index=0; \ - (indexsegments; (fl) && (seg != NIL(segment_struct)); seg=seg->next) - -#define foreach_segment_old(idx, s, sl, max, fl) \ - for (idx=0; idxsegments; (fl) && (s != NIL(segment_struct)); s=s->next) - - /*---------------------------------------------------------------------* - interface stuff - *---------------------------------------------------------------------*/ -#ifdef oldie -#define contourCursorForeground moColor(red1, light) -#define contourCursorBackground moColor(green0, normal) -#else -#define contourCursorForeground monoColor(68) -#define contourCursorBackground monoColor(197) -#endif - -#define contourMASK ExposureMask - -#define contourPlaneTextCOLOR 28 - - /*---------------------------------------------------* - title, dividing lines & stuff - *---------------------------------------------------*/ -#define contourTitleColor moColor(blue0, normal) -#define contourTitleA 190 -#define contourTitleB 217 - -#define dotSize 8 -#define dotExt 12 -#define dotColor moColor(red2, pastel) - - /*---------------------------------------------------* - Button Positions & Dimensions - *---------------------------------------------------*/ -#define contourPlaneXY_X 150 -#define contourPlaneXY_Y 250 -#define contourPlaneXZ_X 190 -#define contourPlaneXZ_Y 250 -#define contourPlaneYZ_X 230 -#define contourPlaneYZ_Y 250 -#define contourLittleButt_W 20 -#define contourLittleButt_H 20 - -#define contourFlatView_X 120 -#define contourFlatView_Y 290 -#define contourAppendSegs_X 120 -#define contourAppendSegs_Y 320 -#ifdef oldie -#define contourBigButt_W 170 -#define contourBigButt_H 20 -#else -#define contourBigButt_W 10 -#define contourBigButt_H 10 -#endif - /*---------------------------------------------------* - Line & button colors - *---------------------------------------------------*/ -#define abort_FG moColor(red1, pastel) -#define return_FG moColor(green2, pastel) -#define littleButt_FG moColor(yellow0, pastel) -#define bigButt_FG moColor(orange1, pastel) - - /*---------------------------------------------------* - longitude part - *---------------------------------------------------*/ -#define contourLongitude_X 10 -#define contourLongitude_Y 55 -#define contourLongitude_W 135 -#define contourLongitude_H 120 - -#define long_FG moColor(green1, normal) -#define long_corner_X 36 -#define long_corner_Y 72 -#define long_RADIUS 40 -#define long_W (long_RADIUS<<1) -#define long_H (long_RADIUS<<1) - -#define long_center_X (long_corner_X + long_RADIUS) -#define long_center_Y (long_corner_Y + long_RADIUS) - -#define long_str_X 15 -#define long_str_Y 48 - - /*---------------------------------------------------* - latitude part - *---------------------------------------------------*/ -#define contourLatitude_X 160 -#define contourLatitude_Y 55 -#define contourLatitude_W 135 -#define contourLatitude_H 120 - -#define lat_FG moColor(green1, normal) -#define lat_corner_X 130 -#define lat_corner_Y 85 -#define lat_RADIUS 60 -#define lat_W (lat_RADIUS<<1) -#define lat_H (lat_RADIUS<<1) -#define lat_quad_X (lat_corner_X + lat_RADIUS) -#define lat_quad_Y (lat_corner_Y + lat_RADIUS) - -#define lat_str_X 176 -#define lat_str_Y 48 - - /*---------------------------------------------------* - slice part - *---------------------------------------------------*/ -#define contourSliceNum_X 10 -#define contourSliceNum_Y 245 -#define contourSliceNum_W 90 -#define contourSliceNum_H 115 - -#define slice_FG moColor(red1, normal) - -#define slice_str_X 20 -#define slice_str_Y 240 -#define slicer_image_X 50 -#define slicer_image_Y 253 - -#define MAX_SLICES 100 - diff --git a/src/graph/view3d/contour3d.c.out b/src/graph/view3d/contour3d.c.out deleted file mode 100755 index 7fd51db..0000000 --- a/src/graph/view3d/contour3d.c.out +++ /dev/null @@ -1,677 +0,0 @@ - /*********************************************************************** - contour.c - - begun 19 September 1992, Jim Wen - ***********************************************************************/ - -#include "header.h" -#include "draw.h" - -#define segmentDEBUG_X - -#define contourDEBUG_X -#define use_min -#define realloc_bug_fixed_NOT - - /*=====================================================================* - Static variables - *=====================================================================*/ -int noo=0; -poly *contour_poly_list; -poly *active_list_first, *active_list_last, *active_list_current; -segment_list_struct *tmp_segment_list; - - /*=====================================================================* - macro definitions - *=====================================================================*/ -#define foreach_poly(p) for ((p)=contour_poly_list; p != NIL(poly); p=p->next) -#define foreach_active(p,f,l) if (f != NIL(poly)) for (p=f; p!=l; p=(p)->next) -#define in_range(x,a,b) ( ((x>=a) && (x=b)) ) -#define poly_in_plane(p,z) ( (p->contour_min==z) && (p->contour_max==z) ) - - - - /*=====================================================================* - local function declarations - *=====================================================================*/ -int contour_compare(poly *p1, poly *p2); -void add_segment(segment_list_struct * seg_list, int index, - segment_struct * seg); -segment_struct *make_the_segment(viewTriple * pt1, viewTriple * pt2); -viewTriple *mkpoint(viewTriple * vt1, viewTriple * vt2, - CONTOUR_float z_val); -CONTOUR_float get_t_from_pts(CONTOUR_float z_min, CONTOUR_float z_max, - CONTOUR_float z_val); -void make_active_list(poly *da_list, CONTOUR_float z_min, - CONTOUR_float z_max, poly ** af, poly ** al, poly ** ac); -int maintain_active_list(poly ** af, poly ** al, poly ** ac, - CONTOUR_float z_max, CONTOUR_float z_min); -void contour_minMaxPolygons(poly * aPoly); - - /*=====================================================================* - contour_compare() - - The compare function passed to msort. - *=====================================================================*/ -int -contour_compare(poly *p1, poly *p2) -{ - -#ifdef use_min - if (p1->contour_min < p2->contour_min) return(-1); - else if (p1->contour_min == p2->contour_min) return(0); - else return(1); -#else - if (p1->contour_max > p2->contour_max) return(-1); - else if (p1->contour_max == p2->contour_max) return(0); - else return(1); -#endif /* use_min */ -} /* contour_compare() */ - - /*=====================================================================* - do_contour_map() - *=====================================================================*/ -int -do_contour_map(void) -{ - - poly *pp; - poly *ap; - CONTOUR_float z_now; - int got_more; - int *anIndex; - viewTriple *aPt, *daPt, *one_point; - int jj, segment_index; - int got_one_intersection; - int done; - segment_list_struct *sl; -#ifdef contour_object_rotate - float rotMat[4][4]; - float transformed_zmax, transformed_zmin; -#endif -#ifdef conDEBUG - segment_struct *seg; -#endif - - /*---------------------------------------------------* - the flag "did_contour" should be set to "no" whenever - the user modifies one of the parameters - *---------------------------------------------------*/ -#ifdef contourDEBUG_x - fprintf(stderr,"Contour is %s\n",(did_contour)?"yes":"no"); -#endif - if (did_contour) return 1; - did_contour = yes; - -#ifdef contour_object_rotate - /*---------------------------------------------------* - transform all the points for arbitrary plane - slicing. this includes all the viewTriples - being referenced as well as the boundaries - in viewData (to get contour_min, contour_max). - *---------------------------------------------------*/ -#ifdef oldie - rot_theta = 0; - rot_phi = pi/2; -#endif - - sinTheta = sin(-rot_theta); - cosTheta = cos(-rot_theta); - sinPhi = sin(rot_phi); - cosPhi = cos(rot_phi); - ROTATE1(rotMat); - - /*---------------------------------------------------* - transform all the points. - the zmin and zmax values need to be recalculated - now that the object has been transformed. note - that transforming the z extreme points will not - work correctly (i know, i've tried it). - *---------------------------------------------------*/ - { - int i,j,k; - LLPoint *anLLPoint; - LPoint *anLPoint; - int *anIndex; - viewTriple *daPoint; - float v_in[4], v_out[4]; - int first_time = yes; - - anLLPoint = viewData.lllp.llp; - for (i=0; ilp; - for (j=0; jnumOfLists; j++,anLPoint++) { - anIndex = anLPoint->indices; - for (k=0; knumOfPoints; k++,anIndex++) { - daPoint = refPt3D(viewData, *anIndex); - /*---------------------------------------------------* - inefficient code so that the vector package could - be used to see if things work; - should change viewTriple's to an array(?) - *---------------------------------------------------*/ - v_in[0] = daPoint->x; v_in[1] = daPoint->y; - v_in[2] = daPoint->z; v_in[3] = 1.0; - vectorMatrix4(v_in, rotMat, v_out); - daPoint->contour_x = v_out[0]; - daPoint->contour_y = v_out[1]; - daPoint->contour_z = v_out[2]; - if (first_time) { - first_time = no; - transformed_zmin = transformed_zmax = v_out[2]; - } else { - if (v_out[2] < transformed_zmin) - transformed_zmin = v_out[2]; - else if (v_out[2] > transformed_zmax) - transformed_zmax = v_out[2]; - } - } /* for points in LPoints (k) */ - } /* for LPoints in LLPoints (j) */ - } /* for LLPoints in LLLPoints (i) */ - - } - -#endif - - - /*---------------------------------------------------* - set up the step size - it should be user adjustable - and include all the slices possible. - max_cuts is #slices seen - z_step is #slices made - cuts_used is #slices actually displayed - *---------------------------------------------------*/ - z_step = (transformed_zmax - transformed_zmin)/max_cuts; -#ifdef oldie - cuts_used = max_cuts; -#endif - - /*---------------------------------------------------* - calculate the bounds of the polygons - the - contour_minMaxPolygons routine looks at the - contour points rather than the object or - projected points - *---------------------------------------------------*/ - contour_poly_list = copyPolygons(viewData.polygons); - contour_minMaxPolygons(contour_poly_list); - - /*---------------------------------------------------* - sort the polygons by the zmax value - (or whatever transformed value, in general) - *---------------------------------------------------*/ - contour_poly_list = msort(contour_poly_list, 0, - viewData.numPolygons, contour_compare); - - /*---------------------------------------------------* - having figured out how many cuts we need (should - be a one time overhead so the following stuff - should be in the initialization routine), we - allocate an array of segment lists and initialize - them (this part can stay here). - *---------------------------------------------------*/ -#ifdef oldie - segment_list = saymem("contour.c: segment_list", - max_cuts, sizeof(segment_list_struct)); -#else - /*---------------------------------------------------* - if the append flag is set, then we want to add - the new segment stuff onto the end of the old - stuff (to build up a model of the surface). - tmp_segment_list is use to keep track of the - head of the new list while the routine goes - through its paces. - *---------------------------------------------------*/ - if (contour_append_lists_flag) { - noo = 0; -#ifdef segmentDEBUG - fprintf(stderr,"======= series %d ========\n",noo); - fprintf(stderr," ---> before: sl->num=%d [%x]\n", - segment_list->num, segment_list); -#endif - -#ifdef realloc_bug_fixed - realloc(segment_list, (cuts_used + max_cuts) * sizeof(segment_list_struct)); - tmp_segment_list = segment_list; - segment_list += cuts_used; /* shift to end of list */ - cuts_used += max_cuts; /* size of new list */ - -#ifdef segmentDEBUG - fprintf(stderr,"> %d cuts => seg at %x [old=%x]\n", - cuts_used, segment_list, tmp_segment_list); - fprintf(stderr," sl->num=%d, tsl->num=%d\n", - segment_list->num, tmp_segment_list->num); -#endif - -#else /* DONT_WORK */ - - /*---------------------------------------------------* - Because realloc doesn't seem to work properly, - we need to do this by hand - *---------------------------------------------------*/ - /*---------------------------------------------------* - allocate new space - *---------------------------------------------------*/ - tmp_segment_list = saymem("contour.c: segment_list, append", - cuts_used + max_cuts, - sizeof(segment_list_struct)); - - /*---------------------------------------------------* - copy over old data (1..cuts_used) - *---------------------------------------------------*/ - { - segment_list_struct *tsl; - - for (segment_index=0, sl=segment_list, tsl=tmp_segment_list; - segment_indexnum = sl->num; - tsl->max_num = sl->max_num; - tsl->num_segs = sl->num_segs; - tsl->segments = sl->segments; - } - } - - /*---------------------------------------------------* - free the old stuff - *---------------------------------------------------*/ -/* free(segment_list); */ - - /*---------------------------------------------------* - now set segment_list to point to the point - where tmp_segment_list stops - there ought - to me max_cuts storage spaces left. - *---------------------------------------------------*/ - segment_list = tmp_segment_list + cuts_used; - - /*---------------------------------------------------* - update cuts_used to have everything for a possible - next iteration - *---------------------------------------------------*/ - cuts_used += max_cuts; - -#endif /* realloc_BUG */ - - - } else { - if (contour_allocated) { -/* free(segment_list); */ - } else { - contour_allocated = yes; - } - noo = 0; - segment_list = saymem("contour.c: segment_list", - max_cuts, sizeof(segment_list_struct)); - cuts_used = max_cuts; -#ifdef segmentDEBUG - fprintf(stderr,"======= series %d ========\n",noo); - fprintf(stderr,"%d cuts => seg at %x\n",cuts_used, segment_list); -#endif - } -#endif - - for (segment_index=0, sl=segment_list; - segment_indexnum = ++noo; - sl->max_num = max_cuts; -#ifdef segmentDEBUG - fprintf(stderr,"Made segment list %d [%x]\n",noo,sl); -/* fprintf(stderr," ...(tsl->num=%d [%x]\n", - tmp_segment_list->num, tmp_segment_list); */ -#endif - sl->num_segs = 0; - sl->segments = NIL(segment_struct); - } - /*---------------------------------------------------* - create an "active_list" of polygons such that - this slice step intersects all and only those - polygons in the active list. - *---------------------------------------------------*/ - make_active_list(contour_poly_list, -#ifdef use_min - transformed_zmin, transformed_zmin+z_step, -#else - transformed_zmax, transformed_zmax-z_step, -#endif - &active_list_first, &active_list_last, &active_list_current); - - /*---------------------------------------------------* - iterate from zmax down to zmin with z_step increments - *---------------------------------------------------*/ - segment_index = 0; -#ifdef use_min - for (z_now=transformed_zmin; z_nowtransformed_zmin; /* see below for incr*/) { -#endif - /*---------------------------------------------------* - for each of the polygons on the active list, - intersect each of line equation for the sides - with the plane equation for the plane at z_now. - one of the following may occur: - no intersections: haha - can't happen coz active - one intersection : at the point, create point line - two intersections: create line connecting points - lies in the plane: create three segments - note that this is a fairly inefficient approach but - i'm just throwing this stuff together in an afternoon - to see how it looks - *---------------------------------------------------*/ - foreach_active(ap, active_list_first, active_list_last) { - - /*---------------------------------------------------* - do line-plane equation for each side of the - polygon - for now - just 3+ sided polygons (no degenerates) - *---------------------------------------------------*/ - - if (ap->numpts >= 3) { - if (poly_in_plane(ap, z_now)) { - /*---------------------------------------------------* - re-create all the segments of the polygon - *---------------------------------------------------*/ - daPt = refPt3D(viewData, *(ap->indexPtr + (ap->numpts - 1))); - for (jj=0, anIndex=ap->indexPtr; jjnumpts; jj++, anIndex++) { - aPt = refPt3D(viewData, *anIndex); - add_segment(segment_list, segment_index, - make_the_segment(aPt, daPt)); - daPt = aPt; - } - } else { - /*---------------------------------------------------* - find the line that defines the intersection of - the polygon with the z-plane - *---------------------------------------------------*/ - got_one_intersection = no; - done = no; - daPt = refPt3D(viewData, *(ap->indexPtr + (ap->numpts - 1))); - for (jj=0, anIndex=ap->indexPtr; - !done && jjnumpts; - jj++, anIndex++) { - aPt = refPt3D(viewData, *anIndex); - if (in_range(z_now, aPt->contour_z, daPt->contour_z)) { - if (got_one_intersection) { - add_segment(segment_list, segment_index, - make_the_segment(one_point, - mkpoint(aPt, daPt, z_now))); - done = yes; - } else { - one_point = mkpoint(aPt, daPt, z_now); - got_one_intersection = yes; - } - } - daPt = aPt; - } /* for */ - } /* else not lie in plane */ - - } - } /* foreach_active(ap) */ - - /*---------------------------------------------------* - maintain/update the active list, pruning off things - the fall off the top (beyond z_now - z_step) and -===> adding on things to the bottom that now fall into - the range [z_now ---> z_now-z_step]. - *---------------------------------------------------*/ - segment_index++; -#ifdef use_min - z_now += z_step; - got_more = maintain_active_list(&active_list_first, - &active_list_last, - &active_list_current, - z_now + z_step, - z_now); -#else - z_now -= z_step; - got_more = maintain_active_list(&active_list_first, - &active_list_last, - &active_list_current, - z_now, - z_now - z_step); -#endif - } /* for z_now from zmax to zmin */ - - /*---------------------------------------------------* - if the segment lists have been appended, reset - the global segment lists pointer to the top of - the lists - *---------------------------------------------------*/ - if (contour_append_lists_flag) { - segment_list = tmp_segment_list; -#ifdef segmentDEBUG -#ifdef oldie - fprintf(stderr," setting seg to old=%x\n", segment_list); - fprintf(stderr," num is %d\n",segment_list->num); -#endif - { - - for (segment_index=0, sl=segment_list; - segment_indexnum = %d\n",sl->num); - } - } - -#endif - } - -} /* do_contour_map() */ - - - /*=====================================================================* - make_active_list(da_list, z_min, z_max, af, al, ac) - *=====================================================================*/ -void -make_active_list(poly *da_list, CONTOUR_float z_min, CONTOUR_float z_max, - poly ** af, poly ** al, poly ** ac) -{ - - poly *tmp_p; - - /*---------------------------------------------------* - the first active polygon is the first one in the - given, sorted list. note that if it doesn't fall -===> inside the z_max --> z_min range, af is set to NIL. - *---------------------------------------------------*/ -#ifdef use_min - if (da_list->contour_min > z_max) { -#else - if (da_list->contour_max < z_min) { -#endif - *af = NIL(poly); - return; - } else { - *af = da_list; - } - - /*---------------------------------------------------* - the current active polygon is set to "af" at this - point but it could be the case that it is set to - "al" if, for example, the current span of z-values - has no polygons - af is set to NIL, and the next - time we look we start at ac=af. - *---------------------------------------------------*/ - *ac = *af; - - /*---------------------------------------------------* - the last active polygon is the polygon right before -===> the first one whose zmax is too small to make the - list - *---------------------------------------------------*/ - *al = da_list; - tmp_p = da_list->next; - for (; tmp_p != NIL(poly); tmp_p = tmp_p->next) { -#ifdef use_min - if (tmp_p->contour_min > z_max) return; -#else - if (tmp_p->contour_max < z_min) return; -#endif - *al = tmp_p; - } - -} /* make_active_list() */ - - - /*=====================================================================* - maintain_active_list(af, al, ac, z_max, z_min) - *=====================================================================*/ -int -maintain_active_list(poly ** af, poly ** al, poly ** ac, - CONTOUR_float z_max, CONTOUR_float z_min) -{ - - poly *tmp_p; - - /*---------------------------------------------------* - first, get the lower boundary to be within range, - pruning elements from the head of the list - *---------------------------------------------------*/ - *af = *ac; -#ifdef use_min - while ((*af) && (*af)->contour_max < z_min) { -#else - while ((*af) && (*af)->contour_min > z_max) { -#endif - *af = (*af)->next; - } - - /*---------------------------------------------------* - check to see if the upper boundary is still in - range - *---------------------------------------------------*/ -#ifdef use_min - if ((*af) == NIL(poly) || ((*af)->contour_min > z_max)) { -#else - if ((*af) == NIL(poly) || ((*af)->contour_max < z_min)) { -#endif - /* --- nope, it wasn't --- */ - *ac = *af; - *af = NIL(poly); - return(0); - } - - /*---------------------------------------------------* - upper boundary is okay...see if we need to add to - the list on the lower bound side - *---------------------------------------------------*/ - tmp_p = (*al)->next; - for (; tmp_p != NIL(poly); tmp_p = tmp_p->next) { -#ifdef use_min - if (tmp_p->contour_min > z_max) return; -#else - if (tmp_p->contour_max < z_min) return; -#endif - *al = tmp_p; - } - - return(1); - -} /* maintain_active_list() */ - - - /*=====================================================================* - add_segment(seg_list, index, seg) - *=====================================================================*/ -void -add_segment(segment_list_struct * seg_list, int index, segment_struct * seg) -{ - - segment_list_struct *sl; - - sl = seg_list + index; - - seg->next = sl->segments; - sl->segments = seg; - sl->num_segs++; - -} /* add_segment() */ - - - /*=====================================================================* - make_the_segment(pt1, pt2) - *=====================================================================*/ -segment_struct * -make_the_segment(viewTriple * pt1, viewTriple * pt2) -{ - segment_struct *seg; - - seg = (segment_struct *)saymem("contour.c: segment",1,sizeof(segment_struct)); - seg->point1 = pt1; - seg->point2 = pt2; - - return(seg); - -} /* make_the_segment() */ - - - /*=====================================================================* - viewTriple *mkpoint(vt1, vt2, z_val) - *=====================================================================*/ -viewTriple * -mkpoint(viewTriple * vt1, viewTriple * vt2, CONTOUR_float z_val) -{ - - viewTriple *vt; - CONTOUR_float t; - - vt = (viewTriple *)saymem("contour.c: viewTriple",1,sizeof(viewTriple)); - - t = get_t_from_pts(vt1->contour_z, vt2->contour_z, z_val); - -#ifdef waitaminute - vt->x = vt1->contour_x + (vt2->contour_x - vt1->contour_x) * t; - vt->y = vt1->contour_y + (vt2->contour_y - vt1->contour_y) * t; - vt->z = z_val; -#else - vt->x = vt1->x + (vt2->x - vt1->x) * t; - vt->y = vt1->y + (vt2->y - vt1->y) * t; - vt->z = vt1->z + (vt2->z - vt1->z) * t; -#endif - - vt->contour_x = vt1->contour_x + (vt2->contour_x - vt1->contour_x) * t; - vt->contour_y = vt1->contour_y + (vt2->contour_y - vt1->contour_y) * t; - vt->contour_z = z_val; - - return(vt); - -} /* mkpoint() */ - - - - /*=====================================================================* - get_t_from_pts(z_min, z_max, z_val) - *=====================================================================*/ -CONTOUR_float -get_t_from_pts(CONTOUR_float z_min, CONTOUR_float z_max, CONTOUR_float z_val) -{ - CONTOUR_float t; - - if (z_min == z_max) return 0; - - t = (z_val - z_min)/(z_max - z_min); - - return(t); -} /* get_t_from_pts() */ - - -void -contour_minMaxPolygons(poly * aPoly) -{ - - int *anIndex; - int i; - - - for (; aPoly != NIL(poly); aPoly = aPoly->next) { - anIndex = aPoly->indexPtr; - aPoly->contour_min = aPoly->contour_max = - refPt3D(viewData,*anIndex)->contour_z; - for (i=1,anIndex++; inumpts; i++,anIndex++) { - if (refPt3D(viewData,*anIndex)->contour_z < aPoly->contour_min) - aPoly->contour_min = refPt3D(viewData,*anIndex)->contour_z; - else if (refPt3D(viewData,*anIndex)->contour_z > aPoly->contour_max) - aPoly->contour_max = refPt3D(viewData,*anIndex)->contour_z; - } - } - - -} /* contour_minMaxPolygons */ diff --git a/src/graph/view3d/contour_panel3d.c.out b/src/graph/view3d/contour_panel3d.c.out deleted file mode 100755 index 9de2b1c..0000000 --- a/src/graph/view3d/contour_panel3d.c.out +++ /dev/null @@ -1,766 +0,0 @@ - /*********************************************************************** - contour_panel.c - - begun 25 November 1992, Jim Wen - ***********************************************************************/ - -#include "header.h" -#include "cpanel.h" -#include "draw.h" -#include "../include/purty/volume.bitmap" -#include "../include/purty/volume.mask" -#include "../include/purty/slicer.bitmap" - -#define use_fat - -#define gStuff_NOT - -#define contourWinDEBUG -#define drawDEBUG -#define contourDEBUG - -#define stickColor moColor(orange2, pastel) - - /*=====================================================================* - Static Variables - *=====================================================================*/ -XImage slicer_image_stuff, *slicer_image = &slicer_image_stuff; -int last_tip_long_x, last_tip_long_y; -int last_tip_lat_x, last_tip_lat_y; - - /*=====================================================================* - Local Functions - *=====================================================================*/ -int initContourButtons(void); - - /*---------------------------------------------------------------------* - makeContourPanel() - *---------------------------------------------------------------------*/ -int -makeContourPanel(void) -{ - - int i; - XSetWindowAttributes cwAttrib, controlAttrib; - XSizeHints sizehint; - Pixmap contourbits, contourmask, slicer_pixmap; - XColor foreColor, backColor; - - contourbits = XCreateBitmapFromData(dsply,rtWindow,volumeBitmap_bits, - volumeBitmap_width,volumeBitmap_height); - contourmask = XCreateBitmapFromData(dsply,rtWindow,volumeMask_bits, - volumeMask_width,volumeMask_height); - cwAttrib.background_pixel = backgroundColor; - cwAttrib.border_pixel = foregroundColor; - cwAttrib.event_mask = contourMASK; - cwAttrib.colormap = colorMap; - cwAttrib.override_redirect = overrideManager; - foreColor.pixel = contourCursorForeground; - XQueryColor(dsply,colorMap,&foreColor); - backColor.pixel = contourCursorBackground; - XQueryColor(dsply,colorMap,&backColor); - cwAttrib.cursor = XCreatePixmapCursor(dsply,contourbits,contourmask, - &foreColor,&backColor, - volumeBitmap_x_hot, - volumeBitmap_y_hot); - -#define slicer_pixmap_FG moColor(yellow1,normal) -#define slicer_pixmap_BG backgroundColor - slicer_pixmap = XCreatePixmapFromBitmapData(dsply, control->controlWindow, - slicer_bits, slicer_width, slicer_height, - slicer_pixmap_FG, slicer_pixmap_BG, - DefaultDepthOfScreen - (DefaultScreenOfDisplay(dsply))); - slicer_image = XGetImage(dsply, slicer_pixmap, 0, 0, slicer_width, slicer_height, - AllPlanes, ZPixmap); - - - contourWindow = XCreateWindow(dsply,control->controlWindow, - -3,-3,controlWidth,controlHeight,3, - CopyFromParent,InputOutput,CopyFromParent, - controlCreateMASK,&cwAttrib); - - sizehint.flags = USPosition | USSize; - sizehint.x = 0; - sizehint.y = 0; - sizehint.width = controlWidth; - sizehint.height = controlHeight; - /*** the None stands for icon pixmap ***/ - XSetNormalHints(dsply,contourWindow,&sizehint); - XSetStandardProperties(dsply,contourWindow,"Control Panel 3D", - "Contour Slicing",None,NULL,0,&sizehint); - - /*** volume frustrum window ***/ - - /*** do contour buttons ***/ - initContourButtons(control->buttonQueue); - for (i=contourButtonsStart; i<(contourButtonsEnd); i++) { - controlAttrib.event_mask = (control->buttonQueue[i]).mask; - (control->buttonQueue[i]).self = - XCreateWindow(dsply,contourWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight, - 0,0,InputOnly,CopyFromParent, - buttonCreateMASK,&controlAttrib); - XMakeAssoc(dsply,table,(control->buttonQueue[i]).self, - &((control->buttonQueue[i]).buttonKey)); - XMapWindow(dsply,(control->buttonQueue[i]).self); - } - -} /* makeContourPanel() */ - - -int -initContourButtons(buttonStruct * contourButtons) -{ - - int ii, num = 0; - - ii = contourReturn; - contourButtons[ii].buttonX = 154; - contourButtons[ii].buttonY = 370; - contourButtons[ii].buttonWidth = 110; - contourButtons[ii].buttonHeight = 24; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = no; - contourButtons[ii].mask = buttonMASK; - contourButtons[ii].text = "Return"; - contourButtons[ii].textColor = return_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourXY; - contourButtons[ii].buttonX = contourPlaneXY_X; - contourButtons[ii].buttonY = contourPlaneXY_Y; - contourButtons[ii].buttonWidth = contourLittleButt_W; - contourButtons[ii].buttonHeight = contourLittleButt_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = no; - contourButtons[ii].mask = buttonMASK; - contourButtons[ii].text = "XY"; - contourButtons[ii].textColor = littleButt_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourXZ; - contourButtons[ii].buttonX = contourPlaneXZ_X; - contourButtons[ii].buttonY = contourPlaneXZ_Y; - contourButtons[ii].buttonWidth = contourLittleButt_W; - contourButtons[ii].buttonHeight = contourLittleButt_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = no; - contourButtons[ii].mask = buttonMASK; - contourButtons[ii].text = "XZ"; - contourButtons[ii].textColor = littleButt_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourYZ; - contourButtons[ii].buttonX = contourPlaneYZ_X; - contourButtons[ii].buttonY = contourPlaneYZ_Y; - contourButtons[ii].buttonWidth = contourLittleButt_W; - contourButtons[ii].buttonHeight = contourLittleButt_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = no; - contourButtons[ii].mask = buttonMASK; - contourButtons[ii].text = "YZ"; - contourButtons[ii].textColor = littleButt_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourFlatView; - contourButtons[ii].buttonX = contourFlatView_X; - contourButtons[ii].buttonY = contourFlatView_Y; - contourButtons[ii].buttonWidth = contourBigButt_W; - contourButtons[ii].buttonHeight = contourBigButt_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = no; - contourButtons[ii].mask = potMASK; - contourButtons[ii].text = "Flat View Upon Return"; - contourButtons[ii].textColor = bigButt_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourAppendSegs; - contourButtons[ii].buttonX = contourAppendSegs_X; - contourButtons[ii].buttonY = contourAppendSegs_Y; - contourButtons[ii].buttonWidth = contourBigButt_W; - contourButtons[ii].buttonHeight = contourBigButt_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = no; - contourButtons[ii].mask = potMASK; - contourButtons[ii].text = "Append Contours"; - contourButtons[ii].textColor = bigButt_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourLongitude; - contourButtons[ii].buttonX = contourLongitude_X; - contourButtons[ii].buttonY = contourLongitude_Y; - contourButtons[ii].buttonWidth = contourLongitude_W; - contourButtons[ii].buttonHeight = contourLongitude_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = yes; - contourButtons[ii].mask = potMASK; - contourButtons[ii].text = "XZ"; - contourButtons[ii].textColor = long_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourLatitude; - contourButtons[ii].buttonX = contourLatitude_X; - contourButtons[ii].buttonY = contourLatitude_Y; - contourButtons[ii].buttonWidth = contourLatitude_W; - contourButtons[ii].buttonHeight = contourLatitude_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = yes; - contourButtons[ii].mask = potMASK; - contourButtons[ii].text = "XZ"; - contourButtons[ii].textColor = lat_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourSliceNum; - contourButtons[ii].buttonX = contourSliceNum_X; - contourButtons[ii].buttonY = contourSliceNum_Y; - contourButtons[ii].buttonWidth = contourSliceNum_W; - contourButtons[ii].buttonHeight = contourSliceNum_H; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = yes; - contourButtons[ii].mask = potMASK; - contourButtons[ii].text = "XZ"; - contourButtons[ii].textColor = slice_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - ii = contourAbort; - contourButtons[ii].buttonX = 36; - contourButtons[ii].buttonY = 370; - contourButtons[ii].buttonWidth = 110; - contourButtons[ii].buttonHeight = 24; - contourButtons[ii].buttonKey = ii; - contourButtons[ii].pot = no; - contourButtons[ii].mask = buttonMASK; - contourButtons[ii].text = "Abort"; - contourButtons[ii].textColor = abort_FG; - contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2; - contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2; - ++num; - - - return(num); - -} /* initContourButtons() */ - - -void -drawContourPanel(void) -{ - - int i,strlength; - - /*---------------------------------------------------* - Set the function to copy for first painting - *---------------------------------------------------*/ - XSetFunction(dsply, contourGC, GXcopy); - - /* Draw some lines for the contour panel, break up da space */ - GSetForeground(contourGC /* ZZZ */,(float)foregroundColor,X); - GSetLineAttributes(contourGC /* ZZZ */,3,LineSolid,CapButt,JoinMiter,X); - GDrawLine(contourGC /* ZZZ */, contourWindow, 0, potA, controlWidth, potA, X); - - - GSetLineAttributes(contourGC /* ZZZ */,2,LineSolid,CapButt,JoinMiter,X); - GDrawLine(contourGC /* ZZZ */, contourWindow, 0, contourTitleA, controlWidth, - contourTitleA, X); - GDrawLine(contourGC /* ZZZ */, contourWindow, 0, contourTitleB, controlWidth, - contourTitleB, X); - - writeControlTitle(contourWindow); - s = "Contour Slicing Panel"; - strlength = strlen(s); - GSetForeground(anotherGC,(float)contourTitleColor,X); - GDrawString(anotherGC,contourWindow, - centerX(anotherGC,s,strlength,controlWidth), - contourTitleA+18,s,strlength,X); - - for (i=contourButtonsStart; i<(contourButtonsEnd); i++) { - /*---------------------------------------------------* - NOTE: different from other control panels in that - the "monoColor" is defined in the button - and "moColor" is used there - *---------------------------------------------------*/ - GSetForeground(contourGC /* ZZZ */, -#ifdef oldie - (float)monoColor((control->buttonQueue[i]).textColor),X); -#else - (float)((control->buttonQueue[i]).textColor),X); -#endif - switch (i) { - - case contourFlatView: - case contourAppendSegs: - GSetForeground(contourGC, - (float)((control->buttonQueue[i]).textColor),X); - GDrawRectangle(contourGC,contourWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,X); - GDrawString(contourGC,contourWindow, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).buttonWidth + 4, - (control->buttonQueue[i]).buttonY + - centerY(contourGC,(control->buttonQueue[i]).buttonHeight), - (control->buttonQueue[i]).text, - strlen(control->buttonQueue[i].text),X); - if (i==contourFlatView && contour_flat_view_flag) - GDrawString(contourGC,contourWindow, - (control->buttonQueue[i]).buttonX + - centerX(contourGC,"x",1, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(contourGC,(control->buttonQueue[i]).buttonHeight), - "x",1,X); - else if (i==contourAppendSegs && contour_append_lists_flag) - GDrawString(contourGC,contourWindow, - (control->buttonQueue[i]).buttonX + - centerX(contourGC,"x",1, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(contourGC,(control->buttonQueue[i]).buttonHeight), - "x",1,X); - break; - - case contourLongitude: - GDrawRectangle(contourGC /* ZZZ */,contourWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,X); - draw_contour_longitude(); - break; - - case contourLatitude: -#ifdef oldie - GDrawRectangle(contourGC /* ZZZ */,contourWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,X); -#else - XDrawRectangle(dsply,contourWindow, contourGC /* ZZZ */, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight); -#endif - draw_contour_latitude(); - break; - - case contourSliceNum: - GDrawRectangle(contourGC /* ZZZ */,contourWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,X); - draw_contour_slicing(); - break; - - default: - GDrawRectangle(contourGC /* ZZZ */,contourWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,X); - s = (control->buttonQueue[i]).text; - strlength = strlen(s); - GSetForeground(contourGC /* ZZZ */, -#ifdef oldie - (float)monoColor((control->buttonQueue[i]).textColor),X); -#else - (float)((control->buttonQueue[i]).textColor),X); -#endif - GDrawString(trashGC /* ZZZ */,contourWindow, - (control->buttonQueue[i]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(processGC,(control->buttonQueue[i]).buttonHeight), - s,strlen(s),X); - break; - } /* switch on i */ - } /* for contour buttons */ - - /*---------------------------------------------------* - Set the function to XOR for updating - *---------------------------------------------------*/ - XSetFunction(dsply, contourGC, GXxor); - update_contour_longitude(); /* to get the xor stuff going */ - update_contour_latitude(); /* to get the xor stuff going */ - -} /* drawContourPanel() */ - - - /*---------------------------------------------------------------------* - draw_contour_longitude() - *---------------------------------------------------------------------*/ -void -draw_contour_longitude(void) -{ - - int tip_x, tip_y; - char stringo[20]; - - - /*---------------------------------------------------* - print out the longitude in degrees - *---------------------------------------------------*/ - sprintf(stringo,"Longitude: %d",(int)(rot_theta * DEGREES)); - XClearArea(dsply, contourWindow, long_str_X, long_str_Y - 12, - long_W + 50, 18, False); - XDrawString(dsply, contourWindow, anotherGC, - long_str_X, long_str_Y, - stringo, strlen(stringo)); - - /*---------------------------------------------------* - draw the background artwork - *---------------------------------------------------*/ - XClearArea(dsply, contourWindow, - contourLongitude_X, contourLongitude_Y, - contourLongitude_W, contourLongitude_H, - False); -#ifdef use_fat - XSetForeground(dsply, contourGC /* ZZZ */, long_FG); - XDrawArc(dsply, contourWindow, contourGC /* ZZZ */, - long_corner_X, long_corner_Y, - long_W, long_H, - 0, 360*64); -#else - XSetForeground(dsply, contourGC, long_FG); - XSetForeground(dsply, trashGC, long_FG); - XDrawArc(dsply, contourWindow, trashGC /* ZZZ */, - long_corner_X, long_corner_Y, - long_W, long_H, - 0, 360*64); -#endif - - /*---------------------------------------------------* - some spokes to make it look purty - *---------------------------------------------------*/ - { - float a, xp, yp; - for (a=0; a>1), tip_y - (dotSize>>1), - dotSize, dotSize, - 0, 360*64); - XSetFunction(dsply, contourGC, GXcopy); - -} /* draw_contour_longitude() */ - - - /*---------------------------------------------------------------------* - draw_contour_latitude() - *---------------------------------------------------------------------*/ -void -draw_contour_latitude(void) -{ - - int tip_x, tip_y; - char stringo[20]; - - /*---------------------------------------------------* - print out the latitude in degrees - *---------------------------------------------------*/ - sprintf(stringo,"Latitude: %d",(int)(rot_phi * DEGREES)); - XClearArea(dsply, contourWindow, lat_str_X, lat_str_Y - 12, - lat_W, 18, False); - XDrawString(dsply, contourWindow, anotherGC, - lat_str_X, lat_str_Y, - stringo, strlen(stringo)); - - /*---------------------------------------------------* - draw the background superduper work of art - *---------------------------------------------------*/ - XClearArea(dsply, contourWindow, - contourLatitude_X, contourLatitude_Y, - contourLatitude_W, contourLatitude_H, - False); - XSetForeground(dsply, contourGC /* ZZZ */, lat_FG); - XDrawArc(dsply, contourWindow, contourGC /* ZZZ */, - lat_corner_X, lat_corner_Y, - lat_W, lat_H, - 0, 90*64); - XDrawLine(dsply, contourWindow, contourGC, - lat_quad_X, lat_quad_Y, - lat_quad_X, lat_quad_Y - lat_RADIUS); - XDrawLine(dsply, contourWindow, contourGC, - lat_quad_X, lat_quad_Y, - lat_quad_X + lat_RADIUS, lat_quad_Y); - - /*---------------------------------------------------* - purty leettle tabs - *---------------------------------------------------*/ - { - float a, xp, yp; - for (a=0; a>1), tip_y - (dotSize>>1), - dotSize, dotSize, - 0, 360*64); - XSetFunction(dsply, contourGC, GXcopy); - -} /* draw_contour_latitude() */ - - - - /*---------------------------------------------------------------------* - draw_contour_slicing() - *---------------------------------------------------------------------*/ -void -draw_contour_slicing(void) -{ - - int tip_y, cut_spacing; -#ifdef oldie - XDrawString(dsply, contourWindow, anotherGC, - slice_str_X, slice_str_Y, - "Slicer", 6); -#else - char stringo[20]; - - sprintf(stringo,"Cuts: %d",max_cuts); - XClearArea(dsply, contourWindow, - slice_str_X, - slice_str_Y - 12, - contourSliceNum_W, 16, False); - XDrawString(dsply, contourWindow, anotherGC, - slice_str_X, slice_str_Y, - stringo, strlen(stringo)); -#endif - - /*---------------------------------------------------* - put up the piece de resistance - *---------------------------------------------------*/ - XClearArea(dsply, contourWindow, - contourSliceNum_X, contourSliceNum_Y, - contourSliceNum_W, contourSliceNum_H, - False); - XPutImage(dsply, contourWindow, contourGC, - slicer_image, - 0, 0, - slicer_image_X, - slicer_image_Y, - slicer_width, slicer_height); - - /*---------------------------------------------------* - draw the number of slices - *---------------------------------------------------*/ -#define cuts_X (contourSliceNum_X + 15) -#define cuts_Y (contourSliceNum_Y + 15) -#define cuts_W 20 -#define cuts_H 85 - - XSetLineAttributes(dsply, trashGC, 1, LineSolid, CapButt, JoinMiter); - XClearArea(dsply, contourWindow, - cuts_X, cuts_Y, cuts_W, cuts_H, False); -#ifdef oldie - cut_spacing = ( -(max_cuts - 1) + MAX_SLICES ) * cuts_H / MAX_SLICES; -#else - { - float tmp; - tmp = (float)(-(max_cuts - 1) + MAX_SLICES) / MAX_SLICES; - cut_spacing = tmp*tmp * cuts_H; - if (cut_spacing < 1) cut_spacing = 1; - else if (cut_spacing > cuts_H) cut_spacing = cuts_H; - } -#endif - - XSetForeground(dsply, trashGC, moColor(violet0, pastel)); - for (tip_y=cuts_Y+cuts_H; tip_y>=cuts_Y; tip_y-=cut_spacing) { - XDrawLine(dsply, contourWindow, trashGC, - cuts_X, tip_y, - cuts_X + cuts_W, tip_y); - } - -#define slide_Y (contourSliceNum_Y + 30) -#define slide_H 55 - { - float where; - int here; - where = (float)max_cuts/MAX_SLICES; /* [0..1] */ - here = where * slide_H + slide_Y; - XSetForeground(dsply, contourGC, moColor(red1, normal)); - XDrawLine(dsply, contourWindow, contourGC, - cuts_X + 45, here, - cuts_X + 55, here); - } - -} /* draw_contour_slicing() */ - - - /*---------------------------------------------------------------------* - update_contour_longitude() - - To be called for all subsequent updates after the contour window has - been mapped and drawn. - *---------------------------------------------------------------------*/ -void -update_contour_longitude(void) -{ - - int tip_x, tip_y; - char stringo[20]; - - /*---------------------------------------------------* - print out the longitude in degrees - *---------------------------------------------------*/ - sprintf(stringo,"Longitude: %d",(int)(rot_theta * DEGREES)); - XClearArea(dsply, contourWindow, long_str_X, long_str_Y - 12, - long_W + 50, 18, False); - XDrawString(dsply, contourWindow, anotherGC, - long_str_X, long_str_Y, - stringo, strlen(stringo)); - - - /*---------------------------------------------------* - calculate and draw the longitudal pointer - *---------------------------------------------------*/ - GSetForeground(contourGC,(float)stickColor,X); - GDrawLine(contourGC /* ZZZ */, contourWindow, - long_center_X, long_center_Y, - last_tip_long_x, last_tip_long_y, X); - GSetForeground(contourGC,(float)dotColor,X); - XFillArc(dsply, contourWindow, contourGC /* ZZZ */, - last_tip_long_x - (dotSize>>1), last_tip_long_y - (dotSize>>1), - dotSize, dotSize, - 0, 360*64); - tip_x = (int)(cos(rot_theta) * (long_RADIUS + dotExt)) + long_center_X; - tip_y = (int)(-sin(rot_theta) * (long_RADIUS + dotExt)) + long_center_Y; - last_tip_long_x = tip_x; - last_tip_long_y = tip_y; - GSetForeground(contourGC,(float)stickColor,X); - GDrawLine(contourGC /* ZZZ */, contourWindow, - long_center_X, long_center_Y, - tip_x, tip_y, X); - GSetForeground(contourGC,(float)dotColor,X); - XFillArc(dsply, contourWindow, contourGC /* ZZZ */, - tip_x - (dotSize>>1), tip_y - (dotSize>>1), - dotSize, dotSize, - 0, 360*64); - -} /* update_contour_longitude() */ - - - /*---------------------------------------------------------------------* - update_contour_latitude() - - To be called for all subsequent updates after the contour window has - been mapped and drawn. - *---------------------------------------------------------------------*/ -void -update_contour_latitude(void) -{ - - int tip_x, tip_y; - char stringo[20]; - - /*---------------------------------------------------* - print out the latitude in degrees - *---------------------------------------------------*/ - sprintf(stringo,"Latitude: %d",(int)(rot_phi * DEGREES)); - XClearArea(dsply, contourWindow, lat_str_X, lat_str_Y - 12, - lat_W, 18, False); - XDrawString(dsply, contourWindow, anotherGC, - lat_str_X, lat_str_Y, - stringo, strlen(stringo)); - - /*---------------------------------------------------* - calculate and draw the latitudal pointer - *---------------------------------------------------*/ - GSetForeground(contourGC,(float)stickColor,X); - GDrawLine(contourGC /* ZZZ */, contourWindow, - lat_quad_X, lat_quad_Y, - last_tip_lat_x, last_tip_lat_y, X); - XSetForeground(dsply, contourGC, dotColor); - XFillArc(dsply, contourWindow, contourGC /* ZZZ */, - last_tip_lat_x - (dotSize>>1), - last_tip_lat_y - (dotSize>>1), - dotSize, dotSize, - 0, 360*64); - tip_x = (int)(sin(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_X; - tip_y = (int)(-cos(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_Y; - last_tip_lat_x = tip_x; - last_tip_lat_y = tip_y; - GSetForeground(contourGC,(float)stickColor,X); - GDrawLine(contourGC /* ZZZ */, contourWindow, - lat_quad_X, lat_quad_Y, - tip_x, tip_y, X); - XSetForeground(dsply, contourGC, dotColor); - XFillArc(dsply, contourWindow, contourGC /* ZZZ */, - tip_x - (dotSize>>1), tip_y - (dotSize>>1), - dotSize, dotSize, - 0, 360*64); - -} /* update_contour_latitude() */ diff --git a/src/graph/view3d/control3d.c.pamphlet b/src/graph/view3d/control3d.c.pamphlet deleted file mode 100644 index 74d4dec..0000000 --- a/src/graph/view3d/control3d.c.pamphlet +++ /dev/null @@ -1,1039 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d control3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _CONTROL3D_C -#include -#include -#include -#include - -#include "mouse11.bitmap" -#include "mouse11.mask" - -#include "header.h" -#include "cpanel.h" - -#include "util.h1" -#include "xshade.h1" -#include "xspadfill.h1" -#include "gfun.h1" -#include "all-3d.h1" - -/* Defines the pixmap for the arrow displayed in the scale window */ -#define zoomArrowN 11 -static XPoint zoomArrow[zoomArrowN] = { - {29,14},{38,23},{33,23}, - {40,45},{53,45}, - {29,69}, - {5,45},{18,45}, - {25,23},{20,23},{29,14} }; - -/* Defines the pixmap for the arrows displayed in the translate window */ -#define translateArrowN 25 -static XPoint translateArrow[translateArrowN] = { - {55,2},{60,10},{58,10},{58,37}, - {85,37},{85,35},{93,40},{85,45},{85,43},{58,43}, - {58,70},{60,70},{55,78},{50,70},{52,70},{52,43}, - {25,43},{25,45},{17,40},{25,35},{25,37},{52,37}, - {52,10},{50,10},{55,2} }; - -static int rotateX, rotateY, rotateR; - -/* - void drawColorMap () - */ - -void -drawColorMap (void) -{ - - controlPanelStruct *cp; - int i,shadeWidth; - - /* Draw the color map window */ - - cp = viewport->controlPanel; - - XClearArea(dsply,cp->controlWindow,5,colormapY,colormapW,colormapH,False); - - /* if window is grayscale, show the grayscale colormap */ - if (mono || (viewport->monoOn)) { - shadeWidth = 230/maxGreyShade; - for (i=0; icontrolWindow, - colormapX + colorOffsetX + i*shadeWidth, - colormapY + colorOffsetY - 10, shadeWidth, 40); - } - } else { - GDrawString(globalGC2,cp->controlWindow,colorWidth, - colormapY + 13,"-",1,Xoption); - GDrawString(globalGC2,cp->controlWindow,30*colorWidth + 40, - colormapY + 13,"+",1,Xoption); - GDrawString(globalGC2,cp->controlWindow,colorWidth, - colormapY + 46,"-",1,Xoption); - GDrawString(globalGC2,cp->controlWindow,30*colorWidth + 40, - colormapY + 46,"+",1,Xoption); - for (i=0; icontrolWindow, - colormapX + i*colorWidth + colorOffsetX, - colormapY + colorOffsetY, - colormapX + i*colorWidth + colorOffsetX, - colormapY + colorOffsetY + colorHeight,Xoption); - } - - if (viewport->hueTop > totalHues-1) viewport->hueTop = totalHues-1; - if (viewport->hueOffset > totalHues-1) viewport->hueOffset = totalHues-1; - - GSetForeground(globGC, (float)monoColor(7), Xoption); - /* Bottom (zmin) color indicator */ - GDrawLine(globGC,cp->controlWindow, - colormapX + viewport->hueOffset * colorWidth + colorOffsetX, - colormapY + colorOffsetY+colorHeight, - colormapX + viewport->hueOffset * colorWidth + colorOffsetX, - colormapY + colorOffsetY+colorHeight+colorPointer,Xoption); - - /* Top (zmax) color indicator */ - GDrawLine(globGC,cp->controlWindow, - colormapX + viewport->hueTop * colorWidth+colorOffsetX, - colormapY + colorOffsetY, - colormapX + viewport->hueTop * colorWidth+colorOffsetX, - colormapY + colorOffsetY-colorPointer,Xoption); - - /* Connect the bottom and top color indicator bars */ - GSetForeground(globGC, (float)monoColor(0), Xoption); - GDrawLine(globGC,cp->controlWindow, - colormapX + viewport->hueOffset * colorWidth + colorOffsetX, - colormapY + colorOffsetY+colorHeight, - colormapX + viewport->hueTop * colorWidth+colorOffsetX, - colormapY + colorOffsetY,Xoption); - } - XSync(dsply,0); - -} /* drawColorMap() */ - - -/******************************* - * void writeControlTitle(w) * - * * - * We need the window argument * - * here because there are * - * multiple control panels in * - * 3D. * - *******************************/ - -void -writeControlTitle (Window w) -{ - int strlength; - - s = viewport->title; - strlength = strlen(s); - XClearArea(dsply,w,0,0,controlWidth,potA,False); - - GSetForeground(anotherGC,(float)controlTitleColor,Xoption); - GDrawString(anotherGC,w,centerX(anotherGC,s,strlength,controlWidth), - 15,s,strlength,Xoption); - -} /* writeControlTitle() */ - - -/************************************/ -/*** void clearControlMessage() ***/ -/************************************/ - -void -clearControlMessage (void) -{ - int strlength; - - strcpy(viewport->controlPanel->message," "); - strlength = strlen(viewport->controlPanel->message); - GDrawImageString(globalGC1,viewport->controlPanel->controlWindow, - centerX(globalGC1,viewport->controlPanel->message, - strlength,controlWidth), - controlMessageY + globalFont->max_bounds.ascent + 8, - viewport->controlPanel->message,strlength,Xoption); - -} - -/************************************/ -/*** void writeControlMessage() ***/ -/************************************/ - -void -writeControlMessage (void) -{ - - int strlength; - controlPanelStruct *cp; - - cp = viewport->controlPanel; - strlength = strlen(cp->message); - XClearArea(dsply,cp->controlWindow, - 0,controlMessageY+ globalFont->max_bounds.ascent + 8, - 0,controlMessageHeight,False); - GSetForeground(globalGC1, (float)controlMessageColor, Xoption); - GDrawImageString(globalGC1,cp->controlWindow, - centerX(globalGC1,cp->message,strlength,controlWidth), - controlMessageY + globalFont->max_bounds.ascent + 8, - cp->message,strlength,Xoption); - - XFlush(dsply); - -} - -/*********************************/ -/*** void drawControlPanel() ***/ -/*********************************/ - -void -drawControlPanel(void ) -{ - - int offShade=14; - controlPanelStruct *cp; - int i, strlength; - char *s; - - cp = viewport->controlPanel; - - GSetForeground(trashGC, (float)foregroundColor, Xoption); - - /* Draw border lines to separate the potentiometer, message, colormap and - button regions of the control panel. */ - GSetLineAttributes(trashGC, 2, LineSolid, CapButt, JoinMiter, Xoption); - - /* Draw a horizontal white line below the potentiometer area. */ - GDrawLine(trashGC, cp->controlWindow, 0, potB-1, controlWidth, potB-1, Xoption); - - /* Draw a horizontal white line above the rendering mode buttons. */ - GDrawLine(trashGC, cp->controlWindow, 0, butA, controlWidth, butA, Xoption); - - /* Draw a horizontal white line above the color mapping area. */ - GDrawLine(trashGC, cp->controlWindow, 0, cmapA, controlWidth, cmapA, Xoption); - - GSetLineAttributes(trashGC, 3, LineSolid, CapButt, JoinMiter, Xoption); - /* Draw a horizontal white line above the potentiometer area. */ - GDrawLine(trashGC, cp->controlWindow, 0, potA, controlWidth, potA, Xoption); - - /* Set the line width as 1 here because it is used below as well. */ - GSetLineAttributes(trashGC, 1, LineSolid, CapButt, JoinMiter, Xoption); - - /* Draw inner white lines around quit, hide panel, and reset buttons. */ - GDrawLine(trashGC, cp->controlWindow, closeL, butA, closeL, butA+110, Xoption); - - /* Write potentiometer titles on the control panel. */ - - writeControlTitle(cp->controlWindow); - GSetForeground(globGC, (float)controlPotHeaderColor, Xoption); - - s = "Rotate"; - GDrawString(globGC,cp->controlWindow,35,31+headerHeight,s,strlen(s),Xoption); - s = "Translate"; - GDrawString(globGC,cp->controlWindow,202,31+headerHeight,s,strlen(s),Xoption); - s = "Scale"; - GDrawString(globGC,cp->controlWindow,126,31+headerHeight,s,strlen(s),Xoption); - - GSetForeground(globGC, (float)controlColorColor, Xoption); - - /* Write labels on regular buttons, draw pixmaps on the potentiometers. */ - - GSetForeground(globalGC1, (float)monoColor(buttonColor), Xoption); - - for (i=controlButtonsStart3D; i<(controlButtonsEnd3D); i++) { - /* special cases depending on initial conditions */ - - /* check if axes are set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == axesOnOff) && - (viewport->axesOn)) { - (cp->buttonQueue[i]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1, (float)backgroundColor, Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[axesOnOff]).buttonX, - (control->buttonQueue[axesOnOff]).buttonY, - (control->buttonQueue[axesOnOff]).buttonWidth, - (control->buttonQueue[axesOnOff]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[axesOnOff]).buttonX, - (control->buttonQueue[axesOnOff]).buttonY, - (control->buttonQueue[axesOnOff]).buttonWidth, - (control->buttonQueue[axesOnOff]).buttonHeight,Xoption); - } - } else { - if (((cp->buttonQueue[i]).buttonKey == axesOnOff) && - (!viewport->axesOn)) { - (cp->buttonQueue[i]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,cp->controlWindow, - (cp->buttonQueue[i]).buttonX, - (cp->buttonQueue[i]).buttonY, - (cp->buttonQueue[i]).buttonWidth, - (cp->buttonQueue[i]).buttonHeight); - s = (control->buttonQueue[axesOnOff]).text; - strlength = strlen(s); - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[axesOnOff]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[axesOnOff]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[axesOnOff]).buttonWidth), - (control->buttonQueue[axesOnOff]).buttonY + - centerY(processGC, - (control->buttonQueue[axesOnOff]).buttonHeight), - s,strlength,Xoption); - } /* if mono */ - } - } /* if axes */ - - /* check if bounding region is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == region3D) && - (viewport->regionOn)) { - (cp->buttonQueue[i]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1, (float)backgroundColor, Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[region3D]).buttonX, - (control->buttonQueue[region3D]).buttonY, - (control->buttonQueue[region3D]).buttonWidth, - (control->buttonQueue[region3D]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[region3D]).buttonX, - (control->buttonQueue[region3D]).buttonY, - (control->buttonQueue[region3D]).buttonWidth, - (control->buttonQueue[region3D]).buttonHeight,Xoption); - } - } else { - if (((cp->buttonQueue[i]).buttonKey == region3D) && - (!viewport->regionOn)) { - (cp->buttonQueue[i]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,cp->controlWindow, - (cp->buttonQueue[i]).buttonX, - (cp->buttonQueue[i]).buttonY, - (cp->buttonQueue[i]).buttonWidth, - (cp->buttonQueue[i]).buttonHeight); - s = (control->buttonQueue[region3D]).text; - strlength = strlen(s); - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[region3D]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[region3D]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[region3D]).buttonWidth), - (control->buttonQueue[region3D]).buttonY + - centerY(processGC, - (control->buttonQueue[region3D]).buttonHeight), - s,strlength,Xoption); - } /* if mono */ - } - } /* if bounding region */ - - /* check if black and white is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == bwColor) && (mono)) { - (cp->buttonQueue[i]).text = " "; - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,cp->controlWindow, - (cp->buttonQueue[i]).buttonX, - (cp->buttonQueue[i]).buttonY, - (cp->buttonQueue[i]).buttonWidth, - (cp->buttonQueue[i]).buttonHeight); - } else { - if (((cp->buttonQueue[i]).buttonKey == bwColor) && viewport->monoOn) { - (cp->buttonQueue[i]).textColor = onColor; - s = (control->buttonQueue[bwColor]).text; - strlength = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[bwColor]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[bwColor]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[bwColor]).buttonWidth), - (control->buttonQueue[bwColor]).buttonY + - centerY(processGC, - (control->buttonQueue[bwColor]).buttonHeight), - s,strlength,Xoption); - } else { - if (((cp->buttonQueue[i]).buttonKey == bwColor) && (!viewport->monoOn)) { - (cp->buttonQueue[i]).textColor = offColor; - s = (control->buttonQueue[bwColor]).text; - strlength = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[bwColor]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[bwColor]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[bwColor]).buttonWidth), - (control->buttonQueue[bwColor]).buttonY + - centerY(processGC, - (control->buttonQueue[bwColor]).buttonHeight), - s,strlength,Xoption); - } - } - } /* if black and white */ - - /* check if object rotation is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == objectr) && - (viewport->objectrOn)) { - (control->buttonQueue[objectr]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1, (float)backgroundColor, Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight,Xoption); - } - } else { - if (((cp->buttonQueue[i]).buttonKey == objectr) && - (!viewport->objectrOn)) { - (control->buttonQueue[objectr]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight,Xoption); - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[objectr]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[objectr]).buttonX + - centerX(processGC,(control->buttonQueue[objectr]).text, - strlen((control->buttonQueue[objectr]).text), - (control->buttonQueue[objectr]).buttonWidth), - (control->buttonQueue[objectr]).buttonY + - centerY(processGC, - (control->buttonQueue[objectr]).buttonHeight), - (control->buttonQueue[objectr]).text, - strlen((control->buttonQueue[objectr]).text),Xoption); - } - } /* else not object rotation */ - } /* if object rotation */ - - /* check if origin rotation is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == originr) && - (viewport->originrOn)) { - (control->buttonQueue[originr]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1, (float)backgroundColor, Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight,Xoption); - } - } else { - if (((cp->buttonQueue[i]).buttonKey == originr) && - (!viewport->originrOn)) { - (control->buttonQueue[originr]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight,Xoption); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[originr]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[originr]).buttonX + - centerX(processGC,(control->buttonQueue[originr]).text, - strlen((control->buttonQueue[originr]).text), - (control->buttonQueue[originr]).buttonWidth), - (control->buttonQueue[originr]).buttonY + - centerY(processGC, - (control->buttonQueue[originr]).buttonHeight), - (control->buttonQueue[originr]).text, - strlen((control->buttonQueue[originr]).text),Xoption); - } - } /* else not origin rotation */ - } /* if origin rotation */ - - /* check if zoom X is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == zoomx) && - (viewport->zoomXOn)) { - (control->buttonQueue[zoomx]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1, (float)backgroundColor, Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight,Xoption); - } - } else { - if (((cp->buttonQueue[i]).buttonKey == zoomx) && - (!viewport->zoomXOn)) { - (control->buttonQueue[zoomx]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight,Xoption); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[zoomx]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[zoomx]).buttonX + - centerX(processGC,(control->buttonQueue[zoomx]).text, - strlen((control->buttonQueue[zoomx]).text), - (control->buttonQueue[zoomx]).buttonWidth), - (control->buttonQueue[zoomx]).buttonY + - centerY(processGC, - (control->buttonQueue[zoomx]).buttonHeight), - (control->buttonQueue[zoomx]).text, - strlen((control->buttonQueue[zoomx]).text),Xoption); - } - } /* else not zoom X */ - } /* if zoom X */ - - /* check if zoom Y is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == zoomy) && - (viewport->zoomYOn)) { - (control->buttonQueue[zoomy]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1, (float)backgroundColor, Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight,Xoption); - } - } else { - if (((cp->buttonQueue[i]).buttonKey == zoomy) && - (!viewport->zoomYOn)) { - (control->buttonQueue[zoomy]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight,Xoption); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[zoomy]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[zoomy]).buttonX + - centerX(processGC,(control->buttonQueue[zoomy]).text, - strlen((control->buttonQueue[zoomy]).text), - (control->buttonQueue[zoomy]).buttonWidth), - (control->buttonQueue[zoomy]).buttonY + - centerY(processGC, - (control->buttonQueue[zoomy]).buttonHeight), - (control->buttonQueue[zoomy]).text, - strlen((control->buttonQueue[zoomy]).text),Xoption); - } - } /* else not zoom Y */ - } /* if zoom Y */ - - /* check if zoom Z is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == zoomz) && - (viewport->zoomZOn)) { - (control->buttonQueue[zoomz]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1, (float)backgroundColor, Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight,Xoption); - } - } else { - if (((cp->buttonQueue[i]).buttonKey == zoomz) && - (!viewport->zoomZOn)) { - (control->buttonQueue[zoomz]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight); - GSetForeground(globalGC1, (float)foregroundColor, Xoption); - GDrawRectangle(globalGC1,control->controlWindow, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight,Xoption); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[zoomz]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[zoomz]).buttonX + - centerX(processGC,(control->buttonQueue[zoomz]).text, - strlen((control->buttonQueue[zoomz]).text), - (control->buttonQueue[zoomz]).buttonWidth), - (control->buttonQueue[zoomz]).buttonY + - centerY(processGC, - (control->buttonQueue[zoomz]).buttonHeight), - (control->buttonQueue[zoomz]).text, - strlen((control->buttonQueue[zoomz]).text),Xoption); - } - } /* else not zoom Y */ - } /* if zoom Y */ - - /* check if outline is set on or off */ - - if (((cp->buttonQueue[i]).buttonKey == outlineOnOff) && - (viewData.outlineRenderOn)) { - (cp->buttonQueue[i]).textColor = onColor; - } else { - if (((cp->buttonQueue[i]).buttonKey == outlineOnOff) && - !(viewData.outlineRenderOn)) { - (cp->buttonQueue[i]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,cp->controlWindow, - (cp->buttonQueue[i]).buttonX, - (cp->buttonQueue[i]).buttonY, - (cp->buttonQueue[i]).buttonWidth, - (cp->buttonQueue[i]).buttonHeight); - s = (control->buttonQueue[outlineOnOff]).text; - strlength = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[outlineOnOff]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[outlineOnOff]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[outlineOnOff]).buttonWidth), - (control->buttonQueue[outlineOnOff]).buttonY + - centerY(processGC, - (control->buttonQueue[outlineOnOff]).buttonHeight), - s,strlength,Xoption); - } /* if mono */ - } /* outline off */ - } /* outline on */ - - /* Draw the button window border */ - - GDraw3DButtonOut(globalGC1,cp->controlWindow, - (cp->buttonQueue[i]).buttonX, (cp->buttonQueue[i]).buttonY, - (cp->buttonQueue[i]).buttonWidth, - (cp->buttonQueue[i]).buttonHeight,Xoption); - - GSetForeground(trashGC, - (float)monoColor((cp->buttonQueue[i]).textColor), Xoption); - switch (i) { - case rotate: - GDrawArc(trashGC, cp->controlWindow, - rotateX, rotateY, rotateR, rotateR, 0, 360*64, Xoption); - break; - - case zoom: - GDrawLines(trashGC, cp->controlWindow, zoomArrow, zoomArrowN, - CoordModeOrigin, Xoption); - break; - - case translate: - GDrawLines(trashGC, cp->controlWindow, translateArrow, - translateArrowN, CoordModeOrigin, Xoption); - break; - - default: - s = (cp->buttonQueue[i]).text; - strlength = strlen(s); - GDrawString(trashGC, cp->controlWindow, - (cp->buttonQueue[i]).buttonX + - centerX(processGC,s,strlength, - (cp->buttonQueue[i]).buttonWidth), - (cp->buttonQueue[i]).buttonY + - centerY(processGC, - (cp->buttonQueue[i]).buttonHeight),s,strlen(s),Xoption); - break; - }; - - if ((cp->buttonQueue[i]).pot) { - /* draw horizontal and vertical centerlines */ - - GDrawLine(globalGC1,cp->controlWindow, - (cp->buttonQueue[i]).buttonX + (cp->buttonQueue[i]).xHalf, - (cp->buttonQueue[i]).buttonY, - (cp->buttonQueue[i]).buttonX + (cp->buttonQueue[i]).xHalf, - (cp->buttonQueue[i]).buttonY + 2*(cp->buttonQueue[i]).yHalf,Xoption); - - GDrawLine(globalGC1,cp->controlWindow, - (cp->buttonQueue[i]).buttonX, - (cp->buttonQueue[i]).buttonY + (cp->buttonQueue[i]).yHalf, - (cp->buttonQueue[i]).buttonX + 2*(cp->buttonQueue[i]).xHalf, - (cp->buttonQueue[i]).buttonY + (cp->buttonQueue[i]).yHalf,Xoption); - } - } - - /* refresh the latest message */ - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - - /* Draw the color map window */ - cp = viewport->controlPanel; - drawColorMap(); - XFlush(dsply); - -} /* drawControlPanel() */ - - -/***************************** - * void getControlXY() * - * * - * Determines the x and y * - * coordinate where the * - * control panel is to be * - * placed, based upon where * - * the mouse button was * - * pressed within the graph * - * viewport window. * - *****************************/ - -controlXY -getControlXY (int whereDoYouWantPanel) -{ - - XWindowAttributes wAttrib; - controlXY cXY; - int viewX, viewY, viewW, viewH, tmp=1; - Window rootW, parentW, *childrenWs, tmpW; - unsigned int nChildren; - - tmpW = viewport->titleWindow; - while(tmp) { - XQueryTree(dsply,tmpW,&rootW,&parentW,&childrenWs,&nChildren); - XFree(childrenWs); - if (parentW == rtWindow) { - tmp = 0; - } else { - tmpW = parentW; - } - } - XGetWindowAttributes(dsply,tmpW,&wAttrib); - - viewX = wAttrib.x; - viewY = wAttrib.y; - viewW = wAttrib.width; - viewH = wAttrib.height; - - if (whereDoYouWantPanel) { - switch (whereDoYouWantPanel) { - case 1: /* right */ - cXY.putX = viewX + viewW; - cXY.putY = viewY; - break; - case 2: /* bottom */ - cXY.putX = viewX + (viewW - controlWidth)/2; /* center it */ - cXY.putY = viewY + viewH; - break; - case 3: /* left */ - cXY.putX = viewX - controlWidth - borderWidth; - cXY.putY = viewY; - break; - case 4: /* top */ - cXY.putX = viewX + (viewW - controlWidth)/2; /* center it */ - cXY.putY = viewY - controlHeight - borderHeight; - } - } else { - if ((physicalWidth - (viewX + viewW)) >= controlWidth) { - cXY.putX = viewX + viewW; - cXY.putY = viewY; - } else if ((physicalHeight - (viewY + viewH)) >= controlHeight) { - cXY.putX = viewX + (viewW - controlWidth)/2; /* center it */ - cXY.putY = viewY + viewH; - } else if (viewX >= controlWidth) { - cXY.putX = viewX - controlWidth - borderWidth; - cXY.putY = viewY; - } else if (viewY >= controlHeight) { - cXY.putX = viewX + (viewW - controlWidth)/2; /* center it */ - cXY.putY = viewY - controlHeight - borderHeight; - } else { /* put inside of viewport */ - cXY.putX = viewX + viewW - controlWidth; - cXY.putY = viewY + viewH - controlHeight; - } - } - if (cXY.putX < 0) cXY.putX = 0; - if (cXY.putY < 0) cXY.putY = 0; - return(cXY); - -} - - - -/************************************************/ -/*** controlPanelStruct *makeControlPanel() ***/ -/************************************************/ - -controlPanelStruct * -makeControlPanel (void) -{ - - Window cw; - int i, num; - controlPanelStruct *control; - buttonStruct *buttons; - controlXY cXY; - XSetWindowAttributes cwAttrib, controlAttrib; - XSizeHints sizehint; - Pixmap mousebits, mousemask; - XColor foreColor, backColor; - - if (!(control = (controlPanelStruct *)saymem("control.c",1, - sizeof(controlPanelStruct)))) { - fprintf(stderr,"Ran out of memory trying to create control panel.\n"); - exitWithAck(RootWindow(dsply,scrn),Window,-1); - } - - cXY = getControlXY(0); - - mousebits = XCreateBitmapFromData(dsply,rtWindow, mouseBitmap_bits, - mouseBitmap_width, mouseBitmap_height); - mousemask = XCreateBitmapFromData(dsply,rtWindow, mouseMask_bits, - mouseMask_width, mouseMask_height); - cwAttrib.background_pixel = backgroundColor; - cwAttrib.border_pixel = foregroundColor; - cwAttrib.event_mask = controlMASK; - cwAttrib.colormap = colorMap; - cwAttrib.override_redirect = overrideManager; - foreColor.pixel = controlCursorForeground; - XQueryColor(dsply,colorMap,&foreColor); - backColor.pixel = controlCursorBackground; - XQueryColor(dsply,colorMap,&backColor); - cwAttrib.cursor = XCreatePixmapCursor(dsply,mousebits, - mousemask, &foreColor,&backColor, - mouseBitmap_x_hot,mouseBitmap_y_hot); - cw = XCreateWindow(dsply,rtWindow, - cXY.putX,cXY.putY,controlWidth,controlHeight,3, - CopyFromParent,InputOutput,CopyFromParent, - controlCreateMASK,&cwAttrib); - - sizehint.flags = PPosition | PSize; - sizehint.x = cXY.putX; - sizehint.y = cXY.putY; - sizehint.width = controlWidth; - sizehint.height = controlHeight; - /*** the None stands for icon pixmap ***/ - XSetNormalHints(dsply,cw,&sizehint); - XSetStandardProperties(dsply,cw,"3D Control Panel","3D Control Panel", - None,NULL,0,&sizehint); - - /* Define and assign a mouse cursor */ - control->controlWindow = cw; - - num = initButtons(control->buttonQueue); - buttons = control->buttonQueue; - for (i=controlButtonsStart3D; i<(controlButtonsEnd3D); i++) { - controlAttrib.event_mask = (control->buttonQueue[i]).mask; - (control->buttonQueue[i]).self = XCreateWindow(dsply,cw, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight, - 0,0,InputOnly,CopyFromParent, - buttonCreateMASK,&controlAttrib); - XMakeAssoc(dsply,table,(control->buttonQueue[i]).self, - &((control->buttonQueue[i]).buttonKey)); - /* use buttonKey and not i because buttonKey has a permanent address */ - - XMapWindow(dsply,(control->buttonQueue[i]).self); - - } /* for each button */ - - - /* Set up the potentiometer pixmaps. */ - for (i=0; ibuttonQueue[rotate].buttonX+17; - rotateY = control->buttonQueue[rotate].buttonY+2; - rotateR = control->buttonQueue[rotate].buttonHeight-4; - - strcpy(control->message," "); - - /* Create the color mapping window */ - controlAttrib.event_mask = colorMASK; - control->colormapWindow = XCreateWindow(dsply,cw, colorWidth,colormapY, - colormapW,colormapH,0, 0,InputOnly, - CopyFromParent, colormapCreateMASK, - &controlAttrib); - XMapWindow(dsply,control->colormapWindow); - viewport->justMadeControl = yes; - - return(control); - -} /* makeControlPanel() */ - - - - -/****************************************** - * void putControlPanelSomewhere() * - * This routine puts up the control panel * - * associated with the viewport passed * - * in. It first tries to put it to the * - * right of the viewport. If there isn't * - * enough room, it tries the bottom and * - * so on going clockwise. If the viewport * - * is too big and there is no room to put * - * the control panel outside of it, the * - * control panel is placed on the bottom * - * right hand corner of the viewport. * - *****************************************/ - -void -putControlPanelSomewhere (int whereDoesPanelGo) -{ - controlPanelStruct *control; - controlXY whereControl; - - control = viewport->controlPanel; - whereControl = getControlXY(whereDoesPanelGo); - - viewport->haveControl = yes; - - XRaiseWindow(dsply,control->controlWindow); - XMoveWindow(dsply, control->controlWindow, - whereControl.putX, whereControl.putY); - - drawControlPanel(); - XSync(dsply,0); - if (viewport->justMadeControl) { - XMapWindow(dsply,control->controlWindow); - viewport->justMadeControl = no; - } - XMapWindow(dsply,control->controlWindow); - XFlush(dsply); - -} - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/cpanel.h b/src/graph/view3d/cpanel.h deleted file mode 100755 index 37da020..0000000 --- a/src/graph/view3d/cpanel.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - - -/* -to be included in control.c for drawing the colormap and -process.c for getting the mouse input - */ - -#define controlMASK (ButtonPressMask + ButtonReleaseMask + ExposureMask) -#define potMASK (ButtonPressMask + ButtonReleaseMask + ButtonMotionMask + LeaveWindowMask) -#define buttonMASK (ButtonPressMask + ButtonReleaseMask + ButtonMotionMask + LeaveWindowMask) -#define colorMASK (ButtonPressMask + ButtonReleaseMask + ButtonMotionMask + LeaveWindowMask) - - -#define mouseWait 50 - /* make mouse grab for stationary mouse on a potentiometer slower */ - -#define controlCreateMASK CWBackPixel | CWBorderPixel | CWEventMask |CWCursor |CWColormap | CWOverrideRedirect -#define buttonCreateMASK CWEventMask -#define messageCreateMASK 0 -#define colormapCreateMASK CWEventMask - -#define controlWidth 300 -#define controlHeight 400 -#define quitWidth 63 -#define quitHeight 107 -#define saveWidth 63 -#define saveHeight 107 -#define borderWidth 22 -#define borderHeight 45 - - -#define controlCursorForeground monoColor(4) -#define controlCursorBackground monoColor(54) -#define controlTitleColor monoColor(36) -#define controlPotHeaderColor monoColor(52) -#define controlColorColor monoColor(13) -#define controlColorSignColor monoColor(22) - -#define headerHeight headerFont->max_bounds.ascent -#define controlMessageHeight globalFont->max_bounds.ascent +globalFont->max_bounds.descent+4 - -#define potA 25 /* y coordinate of line dividing - potentiometers from stuff above it */ -#define potB 173 /* y coordinate of line dividing - potentiometers from title */ - -#define cmapA 233 /* y coordinate of line dividing - colormap from stuff above it */ - -#define butA ((cp->buttonQueue[render]).buttonY - 5) - -#define closeL ((cp->buttonQueue[closeAll]).buttonX - 5) -#define closeA ((cp->buttonQueue[closeAll]).buttonY - 5) - -#define controlMessageY 181 -#define controlMessageColor monoColor(68) - -#define offColor 13 -#define onColor 98 -#define modeColor 44 - -#define colormapX 21 -#define colormapY 240 -#define colormapW 290 -#define colormapH 48 -#define colorWidth 8 -#define colorHeight 8 -#define colorOffset 3 -#define colorOffsetX 24 -#define colorOffsetY 16 -#define colorPointer 16 diff --git a/src/graph/view3d/draw.h b/src/graph/view3d/draw.h deleted file mode 100755 index 1239f2a..0000000 --- a/src/graph/view3d/draw.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#define meshOutline monoColor(140) -#define opaqueOutline monoColor(85) -#define opaqueForeground backgroundColor - - -#define clipOffset 500 - -/* recalculation occurs if any of these situations have occured */ - -#define recalc (rotated || zoomed || translated || !finishedList || \ - firstTime || switchedPerspective || changedEyeDistance) - - -/*** projection macros if matrices are not used ***/ -#define projPersp(z) (viewData.eyeDistance / (z+viewData.eyeDistance)) - -#define proj2PX(x,y) -(x*cosTheta + y*sinTheta) -#define proj2PY(x,y,z) -(y*cosTheta*cosPhi - x*sinTheta*cosPhi + z*sinPhi) - -/*** For clipping points ***/ - -#define behindClipPlane(pz) lessThan(pz,viewData.clipPlane) - -#define outsideClippedBoundary(x,y,z) (lessThan(x,viewData.clipXmin) || \ - greaterThan(x,viewData.clipXmax) || \ - lessThan(y,viewData.clipYmin) || \ - greaterThan(y,viewData.clipYmax) || \ - lessThan(z,viewData.clipZmin) || \ - greaterThan(z,viewData.clipZmax) || \ - isNaNPoint(x,y,z)) -#include - -#define NotPoint (SHRT_MAX) -#define eqNANQ(x) (x == NotPoint) - - - -/* Tests for NaN clipping should be added in here. */ - - diff --git a/src/graph/view3d/eventnames.h b/src/graph/view3d/eventnames.h deleted file mode 100755 index ecfcab3..0000000 --- a/src/graph/view3d/eventnames.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -static char *event_name[] = { - "", /* 0 */ - "", /* 1 */ - "KeyPress", /* 2 */ - "KeyRelease", /* 3 */ - "ButtonPress", /* 4 */ - "ButtonRelease", /* 5 */ - "MotionNotify", /* 6 */ - "EnterNotify", /* 7 */ - "LeaveNotify", /* 8 */ - "FocusIn", /* 9 */ - "FocusOut", /* 10 */ - "KeymapNotify", /* 11 */ - "Expose", /* 12 */ - "GraphicsExpose", /* 13 */ - "NoExpose", /* 14 */ - "VisibilityNotify", /* 15 */ - "CreateNotify", /* 16 */ - "DestroyNotify", /* 17 */ - "UnmapNotify", /* 18 */ - "MapNotify", /* 19 */ - "MapRequest", /* 20 */ - "ReparentNotify", /* 21 */ - "ConfigureNotify", /* 22 */ - "ConfigureRequest", /* 23 */ - "GravityNotify", /* 24 */ - "ResizeRequest", /* 25 */ - "CirculateNotify", /* 26 */ - "CirculateRequest", /* 27 */ - "PropertyNotify", /* 28 */ - "SelectionClear", /* 29 */ - "SelectionRequest", /* 30 */ - "SelectionNotify", /* 31 */ - "ColormapNotify", /* 32 */ - "ClientMessage", /* 33 */ - "MappingNotify" /* 34 */ - }; diff --git a/src/graph/view3d/globals.h b/src/graph/view3d/globals.h deleted file mode 100755 index a779690..0000000 --- a/src/graph/view3d/globals.h +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -extern int scrn; -extern Display *dsply; -extern XFontStruct *globalFont, *buttonFont, *headerFont, - *titleFont, *graphFont, - *lightingFont, *volumeFont, *quitFont, *saveFont, - *serverFont; -extern XrmDatabase rDB; - -extern char scaleReport[5], deltaXReport[5], deltaYReport[5]; -extern unsigned long *spadColors; -extern int followMouse, gotToggle, viewportKeyNum; -extern Window rtWindow, quitWindow, saveWindow; -extern GC globalGC1, globalGC2, anotherGC, globGC, trashGC, - componentGC, opaqueGC, renderGC, - controlMessageGC, lightingGC, volumeGC, quitGC, - saveGC, graphGC; -extern XSizeHints viewSizeHints; -extern HashTable *table; -extern Colormap colorMap; -extern int Socket, ack; - -extern GC processGC; -extern viewPoints *viewport; -extern controlPanelStruct *control; -extern XGCValues gcVals; -extern char *s; -extern int someInt; - -extern unsigned long foregroundColor, backgroundColor; -extern int mono, totalColors, - totalHues, totalSolidShades, totalSolid, - totalDitheredAndSolids,totalShades; - -extern int drawMore; -extern int spadMode,spadDraw; -extern int spadSignalReceived; -extern int inNextEvent; -extern jmp_buf jumpFlag; - -extern char errorStr[80]; - -extern view3DStruct viewData; - -extern Window lightingWindow, lightingAxes; -extern float lightPointer[3], tempLightPointer[3]; -extern float lightIntensity, tempLightIntensity; -extern float backLightIntensity; - -extern char filename[256]; - - - /** stuff from draw viewport routines */ -extern float sinTheta, sinPhi, cosTheta, cosPhi, - viewScale, viewScaleX, viewScaleY, viewScaleZ, reScale; -extern int xCenter, yCenter; -extern XWindowAttributes vwInfo; -extern XWindowAttributes graphWindowAttrib; -extern XPoint *quadMesh; -extern int *xPts; -extern XImage *imageX; - -extern float eyePoint[3]; - -extern XPoint polygonMesh[20]; - -extern int saveFlag; -extern int firstTime, noTrans, startup; -extern int redrawView; -extern int finishedList, redoSmooth, redoColor, zoomed, - rotated, switchedPerspective, changedEyeDistance, - translated, changedIntensity, movingLight, writeImage, - pixelSetFlag, redoDither, multiColorFlag; -extern poly *quickList; - -extern int viewAloned; - -extern viewTriple corners[8], clipCorners[8]; -extern boxSideStruct box[6], clipBox[6]; -extern int axesXY[3][4]; -extern float axesZ[3][2]; - -extern viewTriple *splitPoints; -extern int resMax; - -extern Window volumeWindow; -extern int frustrumVertex; -extern int doingPanel; -extern int doingVolume; -extern int screenX; -extern float xClipMinN, xClipMaxN, - yClipMinN, yClipMaxN, - zClipMinN, zClipMaxN, - clipValue; - -extern float pzMin, pzMax; - -extern int maxGreyShade; - -extern char propertyName[]; -extern char propertyBuffer[]; - -extern float transform[4][4], transform1[4][4], - R[4][4], R1[4][4], S[4][4], T[4][4], I[4][4]; -extern float vxmax,vxmin,vymax,vymin, - wxmax,wxmin,wymax,wymin,wzmax,wzmin; - -extern polyList *scanList[ARRAY_HEIGHT]; -extern int scanline, polyCount; -extern float xleft, xright; - -extern colorBuffer cBuffer[ARRAY_WIDTH]; -extern float zBuffer[ARRAY_WIDTH]; - -extern float zC, dzdx; -extern float intersectColor[2], dcolor; -extern triple dpt, dnorm; - -extern float Cspec, Cdiff, Camb, coeff, lum, saturation; - -extern Pixmap viewmap; -extern int viewmap_valid; -extern int smoothHue; -extern int smoothConst; -extern int smoothError; - -extern char *PSfilename; /* output file name in user directory */ -extern char *envAXIOM; /* used for ps file paths */ - -extern Atom wm_delete_window; - diff --git a/src/graph/view3d/header.h b/src/graph/view3d/header.h deleted file mode 100755 index a443a4c..0000000 --- a/src/graph/view3d/header.h +++ /dev/null @@ -1,386 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#define view3D - - -#include -#include -#include -#include - -#include "hash.h" - -#include "view.h" - - -#include "view3d.h" -#include "actions.h" -#include "viewcommand.h" -#include "xdefs.h" -#include "override.h" -#include "g.h" /* Gdraw functions header file */ - -#define swap(a,b) {a^=b; b^=a; a^=b;} - - /**********************************/ - /*** axes stuff ***/ - /**********************************/ - -#define viewportCreateMASK CWBackPixel | CWBorderPixel | CWEventMask | CWCursor | CWColormap -#define viewportTitleCreateMASK CWBackPixel | CWBorderPixel | CWCursor | CWColormap | CWEventMask | CWOverrideRedirect -#define carefullySetFont(gc,font) if (font != serverFont) XSetFont(dsply,gc,font->fid) - -#define viewportMASK (KeyPressMask + ButtonPressMask + ExposureMask) -#define titleMASK (ExposureMask) - -#define lineWidth 1 -#define lineHeight 1 - -#define titleColor monoColor(36) -#define titleHeight 24 -#define appendixHeight 0 - -#define viewWidth 400 -#define viewHeight 400 -#define viewYmax vwInfo.height -#define viewYmin vwInfo.y -#define viewXmax vwInfo.width -#define viewXmin vwInfo.x - -#define GC9991 ((GC)9991) - - -/* For smooth shading buffers. Should be screen resolution size, - and one for each of screen width and height may be needed, or - it can be changed dynamically if desired. */ - -#ifdef RIOSplatform -#define ARRAY_WIDTH 1280 + 1 /* DisplayWidth(dsply,scrn) */ -#define ARRAY_HEIGHT 1024 + 1 /* DisplayHeight(dsply,scrn) */ -#else -#define ARRAY_WIDTH 1300 /* DisplayWidth(dsply,scrn) */ -#define ARRAY_HEIGHT 1100 /* DisplayHeight(dsply,scrn) */ -#endif - -#define viewBorderWidth 0 /* make sure ps.h (postscript header) is the same */ - -#define initDeltaX 0.0 -#define initDeltaY 0.0 -#define initTheta pi_half/2.0 -#define initPhi -pi_half/2.0 - -#define maxDeltaX 1500.0 -#define maxDeltaY 1500.0 -#define minScale 0.01 -#define maxScale 1000.0 - -#define rotateFactor 0.2 -#define scaleFactor 0.2 -#define translateFactor 8 - -#define viewCursorForeground monoColor(166) -#define viewCursorBackground monoColor(5) - -#define axesColor 52 -#define buttonColor 120 -#define labelColor 12 - - /**********************************/ - /*** graph stuff ***/ - /**********************************/ - -#define graphBarLeft 76 -#define graphBarTop 180 -#define graphBarWidth graphFont->max_bounds.width + 5 -#define graphBarHeight graphFont->max_bounds.ascent + graphFont->max_bounds.descent -#define graphBarDefaultColor monoColor(85) -#define graphBarShowingColor monoColor(45) -#define graphBarHiddenColor monoColor(146) -#define graphBarSelectColor monoColor(45) -#define graphBarNotSelectColor monoColor(145) - - /******************************/ - /*** colors ***/ - /******************************/ - -#define totalHuesConst 27 - -#define hueEnd 360 -#define hueStep (hueEnd/totalHuesConst) - -#define black BlackPixel(dsply,scrn) -#define white WhitePixel(dsply,scrn) -#define numPlanes 1 -#define numColors 10 -#define startColor 0 -#define endColor (startColor+numColors) -#define maxColors (DisplayCells(dsply,scrn)-1) -#define maxPlanes (DefaultVisual((dpy),(scr))->bits_per_rgb) - -#define colorStep ((maxColors+1)/numColors) - - /**********************************/ - /*** Screen and Window Sizes */ - /**********************************/ - -#define physicalWidth DisplayWidth(dsply,scrn) -#define physicalHeight DisplayHeight(dsply,scrn) -#define deep DisplayPlanes(dsply,scrn) - -#define basicScreen 19 - -#define yes 1 -#define no 0 - -#define pi_half 1.57079632 -#define pi 3.14159265 -#define three_pi_halves 4.71238898 -#define two_pi 6.28318530 -#define pi_sq 9.86960440 - -#define degrees_in_two_pi 57 -#define d2Pi 57 - -#define nbuckets 128 - - -#define anywhere 0 - -#ifdef DEBUG -#include "eventnames.h" -#endif - -#define intSize sizeof(int) -#define floatSize sizeof(float) - -/* Types so far are X, PS */ -#define drawViewport(type) { drawPreViewport(type); drawTheViewport(type); } -#define spadDrawViewport() spadMode++; drawTheViewport(X); spadMode--; - - - /********************************/ - /*** lighting panel ***/ - /********************************/ - -/* These are the lighting panel buttons, they start at 101 - (numbers less than 101 are reserved for control panel buttons */ - -/* From ../include/actions.h */ - -#define lightingButtonsStart controlButtonsEnd3D - -#define lightMove (lightingButtonsStart) -#define lightMoveXY (lightingButtonsStart+1) -#define lightMoveZ (lightingButtonsStart+2) -#define lightAbort (lightingButtonsStart+3) -#define lightReturn (lightingButtonsStart+4) -#define lightTranslucent (lightingButtonsStart+5) - -#define maxlightingButtons 6 -#define lightingButtonsEnd (lightingButtonsStart + maxlightingButtons) - - /***********************************/ - /*** view volume panel ***/ - /***********************************/ - -/* These are the volume panel buttons, they start at 200 - (numbers less than 101 are reserved for control panel buttons */ - -#define volumeButtonsStart lightingButtonsEnd - -#define volumeReturn (volumeButtonsStart) -#define frustrumBut (volumeButtonsStart+1) -#define clipXBut (volumeButtonsStart+2) -#define clipYBut (volumeButtonsStart+3) -#define clipZBut (volumeButtonsStart+4) -#define perspectiveBut (volumeButtonsStart+5) -#define clipRegionBut (volumeButtonsStart+6) -#define clipSurfaceBut (volumeButtonsStart+7) -#define volumeAbort (volumeButtonsStart+8) - -#define maxVolumeButtons 9 -#define volumeButtonsEnd (volumeButtonsStart + maxVolumeButtons) - - /**** quit panel ****/ - -#define quitButtonsStart volumeButtonsEnd - -#define quitAbort (quitButtonsStart) -#define quitReturn (quitButtonsStart+1) -#define maxQuitButtons 2 -#define quitButtonsEnd (quitButtonsStart + maxQuitButtons) - - /**** save panel ****/ - -#define saveButtonsStart quitButtonsEnd - -#define saveExit (saveButtonsStart) -#define pixmap (saveButtonsStart+1) -#define ps (saveButtonsStart+2) -#define maxSaveButtons 3 -#define saveButtonsEnd (saveButtonsStart + maxSaveButtons) - - /******************************************/ - /*** buttons to be allocated ***/ - /******************************************/ - -#define maxButtons3D saveButtonsEnd - - - /************************ Type Declarations *************************/ - - /**********************************/ - /*** control stuff ***/ - /**********************************/ - -typedef struct _buttonStruct { - int buttonKey, pot, mask; - short buttonX, buttonY, buttonWidth, buttonHeight, xHalf, yHalf; - Window self; - char *text; - int textColor,textHue,textShade; -} buttonStruct; - -typedef struct _controlPanelStruct { - Window controlWindow, messageWindow, colormapWindow; - char message[40]; - buttonStruct buttonQueue[maxButtons3D]; -} controlPanelStruct; - -typedef struct _mouseCoord { - float x, y; -} mouseCoord; - - - /**********************************/ - /*** mesh stuff ***/ - /**********************************/ - -typedef struct _meshStruct { - float N0[4], N1[4]; /* the fourth element is Zmin */ -} meshStruct; - -typedef struct _points3D { - float xmin, xmax, - ymin, ymax, - xstep, ystep, - zmin, zmax, - scaleToView; - float *zPoints; - int xnum, ynum, - nextRow, - style; - meshStruct *normData; /* list of normals */ -} points3D; - - - -typedef struct _colorBuffer { - int indx; - char axes; -} colorBuffer; - - - /**********************************/ - /*** axes stuff ***/ - /**********************************/ - -typedef struct _point { - float x, y, z; - int flag; -} point; - - - /**** one of the (many) sloppy things that need to be - cleaned up is the viewPoints structure. a lot of - stuff in it is used solely for the function of - two variables stuff. they should be moved to - the fun2Var substructure. ****/ - -typedef struct _viewPoints { - int viewportKey; - char title[80]; - Window viewWindow, titleWindow; - float deltaX, deltaY, - scale, scaleX, scaleY, scaleZ, - theta, phi, - deltaX0, deltaY0, /* initial values */ - scale0, transX, transY, transZ, thetaObj, phiObj, - theta0, phi0, theta1, phi1, axestheta, axesphi; - float deltaZ, deltaZ0; - controlPanelStruct *controlPanel; - int axesOn, regionOn, monoOn; - int zoomXOn, zoomYOn, zoomZOn; - int originrOn, objectrOn; - int xyOn, xzOn, yzOn; - int originFlag; - int justMadeControl, haveControl, - closing, allowDraw, needNorm; - points3D meshData; - float lightVector[3], translucency; - int hueOffset, numberOfHues, hueTop, diagonals; - struct _viewPoints *prevViewport, *nextViewport; -} viewPoints; - - -typedef struct _controlXY { - int putX, putY; -} controlXY; - - - - /************************** Bitmap Files ***************************/ -#if 0 -#include "../include/purty/mouse11.bitmap" -#include "../include/purty/mouse11.mask" -#include "../include/purty/spadbitmap.bitmap" -#include "../include/purty/spadmask.mask" -#include "../include/purty/light11.bitmap" -#include "../include/purty/light11.mask" -#endif - - - /******* useful definitions *******/ - -#define CONTROLpanel 1 -#define LIGHTpanel 2 -#define VOLUMEpanel 3 -#define CONTOURpanel 4 -#define QUITpanel 5 -#define SAVEpanel 6 - -#define machine0 0.0002 - -#include "globals.h" - diff --git a/src/graph/view3d/illuminate3d.c.pamphlet b/src/graph/view3d/illuminate3d.c.pamphlet deleted file mode 100644 index 8fdb521..0000000 --- a/src/graph/view3d/illuminate3d.c.pamphlet +++ /dev/null @@ -1,208 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d illuminate3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _ILLUMINATE3D_C - -#include - -#include "header.h" -#include "draw.h" - -#include "all-3d.h1" - -/*********************** - * void phong(pt,N) * - * * - * a general routine * - * for determining the * - * intensity values at * - * a particular point * - * using the Phong * - * illumination model * - * with Phong shading * - ***********************/ - -float -phong(triple pt,float N[3]) -{ - float dotLN, dotHN, H[3], E[3], P[3], NM[3], L[3]; - float color, diffuse, specular; - - diffuse = 0.0; specular = 0.0; - - /* renormalize average normal vector for the point */ - normalizeVector(N); - /* temporary norm, in case the sign is switched */ - NM[0] = N[0]; NM[1] = N[1]; NM[2] = N[2]; - - P[0] = pt.x; P[1] = pt.y; P[2] = pt.z; - normalizeVector(P); - - /* vector from infinite light source */ - L[0] = viewport->lightVector[0]; - L[1] = viewport->lightVector[1]; - L[2] = viewport->lightVector[2]; - normalizeVector(L); - - /* vector from point to observers eye */ - normalizeVector(eyePoint); - E[0] = 8.0*eyePoint[0] - P[0]; - E[1] = 8.0*eyePoint[1] - P[1]; - E[2] = 8.0*eyePoint[2] - P[2]; - normalizeVector(E); - - /* light returned even if normal faces away from light source */ - dotLN = L[0]*NM[0] + L[1]*NM[1] + L[2]*NM[2]; - if (dotLN < 0.0) dotLN = -dotLN; - diffuse = dotLN*lightIntensity; - /* calculate specular highlight if surface faces light source */ - if (dotLN > 0.0) { - H[0] = E[0] + L[0]; - H[1] = E[1] + L[1]; - H[2] = E[2] + L[2]; - normalizeVector(H); - dotHN = NM[0]*H[0]+NM[1]*H[1]+NM[2]*H[2]; - if (dotHN < 0.0) dotHN = -dotHN; - specular = pow((double)dotHN,coeff)*lightIntensity; - } - - /* return intensity value from 0.0 to 1.0 */ - color = Camb + diffuse*Cdiff + specular*Cspec; - - if (color > 1.0) color = 1.0; - if (color < 0.0) color = 0.0; - - return(color); -} - -int -hueValue(float val) -{ - int hue; - - hue = floor(absolute(val) * viewport->numberOfHues) + viewport->hueOffset; - if (hue > 26) hue = 26; - - return hue; -} - -int -getHue(float val) -{ - int hue; - - hue = hueValue(val); - if (hue < 11) - hue *= 6; - else - if (hue > 10 && hue < 16) - hue = hue*20 - 140; - else - hue = hue*12 - 12; - - return hue; -} - -/**** Conversion functions for different color models ****/ - -float -Value(float n1, float n2, float hue) -{ - float v; - - if (hue > 360.0) hue -= 360.0; - if (hue < 0.0) hue += 360.0; - if (hue < 60.0) { - v = n1 + (n2-n1)*hue/60.0; - } else { - if (hue < 180.0) { - v = n2; - } else { - if (hue < 240.0) { - v = n1 + (n2-n1)*(240.0-hue)/60.0; - } else { - v = n1; - } - } - } - return(v); -} - - -RGB -hlsTOrgb(float h,float l,float s) -{ - RGB rgb; - float m1, m2; - - if (l <= 0.5) { - m2 = l*(1.0+s); - } - else { - m2 = l+s-l*s; - } - m1 = 2.0*l-m2; - rgb.r = Value(m1,m2,h+120.0); - rgb.g = Value(m1,m2,h); - rgb.b = Value(m1,m2,h-120.0); - - return(rgb); -} - - - - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/lightbut3d.c.pamphlet b/src/graph/view3d/lightbut3d.c.pamphlet deleted file mode 100644 index bcdd9cc..0000000 --- a/src/graph/view3d/lightbut3d.c.pamphlet +++ /dev/null @@ -1,166 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d lightbut3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _LIGHTBUT3D_C - -#include "header.h" -#include "cpanel.h" - -#include "all-3d.h1" -/***************************************************** - * int initLightButtons (lightButtons) * - * * - * Creates the fields for each button window in the * - * three dimensional lighting subpanel, and returns * - * the number of buttons created. * - * * - *****************************************************/ - -int -initLightButtons (buttonStruct *lightButtons) -{ - int ii; - int num = 0; - - /* Not functional -- can be used to allow light window as a potentiometer */ - ii = lightMove; - lightButtons[ii].buttonX = 63; - lightButtons[ii].buttonY = 30; - lightButtons[ii].buttonWidth = 171; - lightButtons[ii].buttonHeight = 171; - lightButtons[ii].buttonKey = ii; - lightButtons[ii].pot = yes; /* a potentiometer */ - lightButtons[ii].mask = potMASK; - lightButtons[ii].textColor = 163; - lightButtons[ii].xHalf = lightButtons[ii].buttonWidth/2; - lightButtons[ii].yHalf = lightButtons[ii].buttonHeight/2; - ++num; - - /* Change x and y coordinate of light source */ - ii = lightMoveXY; - lightButtons[ii].buttonX = 20; - lightButtons[ii].buttonY = 247; - lightButtons[ii].buttonWidth = 110; - lightButtons[ii].buttonHeight = 110; - lightButtons[ii].buttonKey = ii; - lightButtons[ii].pot = yes; /* a potentiometer */ - lightButtons[ii].mask = potMASK; - lightButtons[ii].textColor = 133; - lightButtons[ii].xHalf = lightButtons[ii].buttonWidth/2; - lightButtons[ii].yHalf = lightButtons[ii].buttonHeight/2; - ++num; - - /* Change z coordinate of light source */ - ii = lightMoveZ; - lightButtons[ii].buttonX = 149; - lightButtons[ii].buttonY = 247; - lightButtons[ii].buttonWidth = 58; - lightButtons[ii].buttonHeight = 110; - lightButtons[ii].buttonKey = ii; - lightButtons[ii].pot = yes; /* a potentiometer */ - lightButtons[ii].mask = potMASK; - lightButtons[ii].textColor = 165; - lightButtons[ii].xHalf = lightButtons[ii].buttonWidth/2; - lightButtons[ii].yHalf = lightButtons[ii].buttonHeight/2; - ++num; - - /* Change intensity of light source */ - ii = lightTranslucent; - lightButtons[ii].buttonX = 250; - lightButtons[ii].buttonY = 247; - lightButtons[ii].buttonWidth = 34; - lightButtons[ii].buttonHeight = 110; - lightButtons[ii].buttonKey = ii; - lightButtons[ii].pot = yes; /* a potentiometer */ - lightButtons[ii].mask = potMASK; - lightButtons[ii].textColor = 37; - lightButtons[ii].xHalf = lightButtons[ii].buttonWidth/2; - lightButtons[ii].yHalf = lightButtons[ii].buttonHeight/2; - ++num; - - /* Leave lighting window without updating changes made. */ - ii = lightAbort; - lightButtons[ii].buttonX = 36; - lightButtons[ii].buttonY = 370; - lightButtons[ii].buttonWidth = 110; - lightButtons[ii].buttonHeight = 24; - lightButtons[ii].buttonKey = ii; - lightButtons[ii].pot = no; - lightButtons[ii].mask = buttonMASK; - lightButtons[ii].text = "Abort"; - lightButtons[ii].textColor = 52; - lightButtons[ii].xHalf = lightButtons[ii].buttonWidth/2; - lightButtons[ii].yHalf = lightButtons[ii].buttonHeight/2; - ++num; - - /* Leave lighting window and update changes made. */ - ii = lightReturn; - lightButtons[ii].buttonX = 154; - lightButtons[ii].buttonY = 370; - lightButtons[ii].buttonWidth = 110; - lightButtons[ii].buttonHeight = 24; - lightButtons[ii].buttonKey = ii; - lightButtons[ii].pot = no; - lightButtons[ii].mask = buttonMASK; - lightButtons[ii].text = "Return"; - lightButtons[ii].textColor = 28; - lightButtons[ii].xHalf = lightButtons[ii].buttonWidth/2; - lightButtons[ii].yHalf = lightButtons[ii].buttonHeight/2; - ++num; - - return(num); -} - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/lighting3d.c.pamphlet b/src/graph/view3d/lighting3d.c.pamphlet deleted file mode 100644 index 2140dc2..0000000 --- a/src/graph/view3d/lighting3d.c.pamphlet +++ /dev/null @@ -1,610 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d lighting3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _LIGHTING3D_C - -#include -#include - -#include "light11.bitmap" -#include "light11.mask" - - -#include "header.h" -#include "static.h" -#include "draw.h" -#include "cpanel.h" -#include "volume.h" - -#include "gfun.h1" -#include "xspadfill.h1" -#include "all-3d.h1" - -#define lightMASK ExposureMask -#define lightCursorForeground lightingTitleColor -#define lightCursorBackground foregroundColor - -#define lightFontHeight (lightingFont->max_bounds.ascent+lightingFont->max_bounds.descent) - -#define lightingAxesColor monoColor(52) -#define lightingLabelColor monoColor(12) -#define lightingBoxColor monoColor(138) -#define lightingLightColor monoColor(7) -#define lightingTitleColor monoColor(69) -#define lightingButtonColor monoColor(140) -#define lightingTransColor monoColor(140) -#define lightingTransArrowColor monoColor(100) -#define lightingTransLabelColor monoColor(207) - -#define lightingAxesSize 175 -#define lightingAxesX 61 -#define lightingAxesY 28 - -#define lightAxesScale 110 /* the extent of the axes in object space */ -#define lightScale 0.63 /* projected scale factor */ - -#define arrowHead (control->buttonQueue[lightTranslucent].buttonX + 5) -static viewTriple point0 = {0,0,0}; - - -/*************************** - * int makeLightingPanel() * - ***************************/ - -int -makeLightingPanel(void) -{ - - int i; - XSetWindowAttributes cwAttrib, controlAttrib; - XSizeHints sizehint; - Pixmap lightbits,lightmask; - XColor foreColor, backColor; - - lightbits = XCreateBitmapFromData(dsply,rtWindow, lightBitmap_bits, - lightBitmap_width,lightBitmap_height); - lightmask = XCreateBitmapFromData(dsply,rtWindow, lightMask_bits, - lightMask_width,lightMask_height); - cwAttrib.background_pixel = backgroundColor; - cwAttrib.border_pixel = foregroundColor; - cwAttrib.event_mask = lightMASK; - cwAttrib.colormap = colorMap; - cwAttrib.override_redirect = overrideManager; - foreColor.pixel = lightCursorForeground; - XQueryColor(dsply,colorMap,&foreColor); - backColor.pixel = lightCursorBackground; - XQueryColor(dsply,colorMap,&backColor); - cwAttrib.cursor = XCreatePixmapCursor(dsply,lightbits,lightmask, - &foreColor,&backColor, - lightBitmap_x_hot,lightBitmap_y_hot); - lightingWindow = XCreateWindow(dsply,control->controlWindow, - -3,-3,controlWidth,controlHeight,3, - CopyFromParent,InputOutput,CopyFromParent, - controlCreateMASK,&cwAttrib); - - sizehint.flags = USPosition | USSize; - sizehint.x = 0; - sizehint.y = 0; - sizehint.width = controlWidth; - sizehint.height = controlHeight; - /*** the None stands for icon pixmap. ***/ - XSetNormalHints(dsply,lightingWindow,&sizehint); - XSetStandardProperties(dsply,lightingWindow,"Lighting Panel 3D", - "Lighting Panel",None,NULL,0,&sizehint); - - /*** lighting axes window ***/ - cwAttrib.event_mask = 0; - lightingAxes = XCreateWindow(dsply,lightingWindow, - lightingAxesX,lightingAxesY, - lightingAxesSize,lightingAxesSize, - 0,CopyFromParent,InputOutput,CopyFromParent, - controlCreateMASK,&cwAttrib); - - sizehint.flags = USPosition | USSize; - sizehint.x = lightingAxesX; - sizehint.y = lightingAxesY; - sizehint.width = lightingAxesSize; - sizehint.height = lightingAxesSize; - /*** the None stands for icon pixmap ***/ - XSetNormalHints(dsply,lightingAxes,&sizehint); - XSetStandardProperties(dsply,lightingAxes,"Lighting Axes","Lighting Axes", - None,NULL,0,&sizehint); - XMapWindow(dsply,lightingAxes); - - /*** draw lighting buttons ***/ - initLightButtons(control->buttonQueue); -/* - controlAttrib.event_mask = (control->buttonQueue[lightingButtonsStart]).mask; - (control->buttonQueue[lightingButtonsStart]).self = - XCreateWindow(dsply, lightingWindow, - (control->buttonQueue[lightingButtonsStart]).buttonX, - (control->buttonQueue[lightingButtonsStart]).buttonY, - (control->buttonQueue[lightingButtonsStart]).buttonWidth, - (control->buttonQueue[lightingButtonsStart]).buttonHeight, - 0,0,InputOnly,CopyFromParent, - buttonCreateMASK,&controlAttrib); - XMakeAssoc(dsply,table,(control->buttonQueue[lightingButtonsStart]).self, - &((control->buttonQueue[lightingButtonsStart]).buttonKey)); - XMapWindow(dsply,(control->buttonQueue[lightingButtonsStart]).self); -*/ - for (i=(lightingButtonsStart + 1); i<(lightingButtonsEnd); i++) { - controlAttrib.event_mask = (control->buttonQueue[i]).mask; - (control->buttonQueue[i]).self = - XCreateWindow(dsply,lightingWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight, - 0,0,InputOnly,CopyFromParent, - buttonCreateMASK,&controlAttrib); - XMakeAssoc(dsply,table,(control->buttonQueue[i]).self, - &((control->buttonQueue[i]).buttonKey)); - XMapWindow(dsply,(control->buttonQueue[i]).self); - } - - /* assign global direction variables for light projections */ - sinTheta = sin(-viewport->theta); - cosTheta = cos(-viewport->theta); - sinPhi = sin(viewport->phi); - cosPhi = cos(viewport->phi); - - return(0); - -} /* makeLightingPanel() */ - -/*************************** - * void drawLightingAxes() * - ***************************/ - -void -drawLightingAxes(void) -{ - - XWindowAttributes laInfo; - int i,xCenter,yCenter; - float Px0,Py0; - int vPx0,vPy0,vPx1,vPy1; - viewTriple pointX,pointY,pointXY,pointXYZ; - - XGetWindowAttributes(dsply,lightingAxes,&laInfo); - XClearWindow(dsply,lightingAxes); - xCenter = laInfo.width / 2; - yCenter = laInfo.height / 2; - - sinTheta = sin(-viewport->theta); - cosTheta = cos(-viewport->theta); - sinPhi = sin(viewport->phi); - cosPhi = cos(viewport->phi); - - GSetForeground(lightingGC,(float)monoColor(buttonColor),Xoption); - for (i=0; i < 3; i++) { - Px0 = proj2PX(axes[i][0],axes[i][1]); - Py0 = proj2PY(axes[i][0],axes[i][1],axes[i][2]); - vPx0 = Px0 * lightScale + xCenter; - vPy0 = laInfo.height - (Py0 * lightScale + yCenter); - Px0 = proj2PX(axes[i][3],axes[i][4]); - Py0 = proj2PY(axes[i][3],axes[i][4],axes[i][5]); - vPx1 = Px0 * lightScale + xCenter; - vPy1 = laInfo.height - (Py0 * lightScale + yCenter); - GDrawLine(lightingGC,lightingAxes,vPx0,vPy0,vPx1,vPy1,Xoption); - } - - GSetForeground(lightingGC,(float)lightingLabelColor,Xoption); - for (i=0; i < basicScreen; i++) { - Px0 = proj2PX(labels[i][0],labels[i][1]); - Py0 = proj2PY(labels[i][0],labels[i][1],labels[i][2]); - vPx0 = Px0 * lightScale + xCenter; - vPy0 = laInfo.height - (Py0 * lightScale + yCenter); - Px0 = proj2PX(labels[i][3],labels[i][4]); - Py0 = proj2PY(labels[i][3],labels[i][4],labels[i][5]); - vPx1 = Px0 * lightScale + xCenter; - vPy1 = laInfo.height - (Py0 * lightScale + yCenter); - GDrawLine(lightingGC,lightingAxes,vPx0,vPy0,vPx1,vPy1,Xoption); - } - - GSetForeground(lightingGC,(float)lightingBoxColor,Xoption); - pointX.x = tempLightPointer[0] * lightAxesScale; - pointX.y = 0; - pointX.z = 0; - - pointY.x = 0; - pointY.y = tempLightPointer[1] * lightAxesScale; - pointY.z = 0; - - pointXY.x = tempLightPointer[0] * lightAxesScale; - pointXY.y = tempLightPointer[1] * lightAxesScale; - pointXY.z = 0; - - pointXYZ.x = tempLightPointer[0] * lightAxesScale; - pointXYZ.y = tempLightPointer[1] * lightAxesScale; - pointXYZ.z = tempLightPointer[2] * lightAxesScale; - - Px0 = proj2PX(pointXY.x,pointXY.y); - Py0 = proj2PY(pointXY.x,pointXY.y,pointXY.z); - vPx0 = Px0 * lightScale + xCenter; - vPy0 = laInfo.height - (Py0 * lightScale + yCenter); - - Px0 = proj2PX(pointX.x,pointX.y); - Py0 = proj2PY(pointX.x,pointX.y,pointX.z); - vPx1 = Px0 * lightScale + xCenter; - vPy1 = laInfo.height - (Py0 * lightScale + yCenter); - GDrawLine(lightingGC,lightingAxes,vPx0,vPy0,vPx1,vPy1,Xoption); - - Px0 = proj2PX(pointY.x,pointY.y); - Py0 = proj2PY(pointY.x,pointY.y,pointY.z); - vPx1 = Px0 * lightScale + xCenter; - vPy1 = laInfo.height - (Py0 * lightScale + yCenter); - GDrawLine(lightingGC,lightingAxes,vPx0,vPy0,vPx1,vPy1,Xoption); - - Px0 = proj2PX(pointXYZ.x,pointXYZ.y); - Py0 = proj2PY(pointXYZ.x,pointXYZ.y,pointXYZ.z); - vPx1 = Px0 * lightScale + xCenter; - vPy1 = laInfo.height - (Py0 * lightScale + yCenter); - GDrawLine(lightingGC,lightingAxes,vPx0,vPy0,vPx1,vPy1,Xoption); - - GSetForeground(lightingGC,(float)lightingLightColor,Xoption); - Px0 = proj2PX(point0.x,point0.y); - Py0 = proj2PY(point0.x,point0.y,point0.z); - vPx0 = Px0 * lightScale + xCenter; - vPy0 = laInfo.height - (Py0 * lightScale + yCenter); - GDrawLine(lightingGC,lightingAxes,vPx0,vPy0,vPx1,vPy1,Xoption); - -} /* drawLightingAxes */ - - -/****************************** - * void drawLightTransArrow() * - ******************************/ - -void -drawLightTransArrow(void) -{ - - int i; - float f; - - /*** Draw the intensity potentiometer window. ***/ - XClearArea(dsply,lightingWindow, - (control->buttonQueue[lightTranslucent]).buttonX, - (control->buttonQueue[lightTranslucent]).buttonY-5, - (control->buttonQueue[lightTranslucent]).buttonWidth, - (control->buttonQueue[lightTranslucent]).buttonHeight+10, - False); - GDrawLine(controlMessageGC,lightingWindow, - (control->buttonQueue[lightTranslucent]).buttonX, - (control->buttonQueue[lightTranslucent]).buttonY, - (control->buttonQueue[lightTranslucent]).buttonX, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).buttonHeight,Xoption); - GDrawLine(controlMessageGC,lightingWindow, - (control->buttonQueue[lightTranslucent]).buttonX + 1, - (control->buttonQueue[lightTranslucent]).buttonY, - (control->buttonQueue[lightTranslucent]).buttonX + - (control->buttonQueue[lightTranslucent]).buttonWidth * 3/10, - (control->buttonQueue[lightTranslucent]).buttonY,Xoption); - GDrawLine(controlMessageGC,lightingWindow, - (control->buttonQueue[lightTranslucent]).buttonX + 1, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).yHalf/2, - (control->buttonQueue[lightTranslucent]).buttonX + - (control->buttonQueue[lightTranslucent]).buttonWidth * 2/10, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).yHalf/2,Xoption); - GDrawLine(controlMessageGC,lightingWindow, - (control->buttonQueue[lightTranslucent]).buttonX + 1, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).yHalf, - (control->buttonQueue[lightTranslucent]).buttonX + - (control->buttonQueue[lightTranslucent]).buttonWidth * 3/10, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).yHalf,Xoption); - GDrawLine(controlMessageGC,lightingWindow, - (control->buttonQueue[lightTranslucent]).buttonX + 1, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).buttonHeight*3/4, - (control->buttonQueue[lightTranslucent]).buttonX + - (control->buttonQueue[lightTranslucent]).buttonWidth * 2/10, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).buttonHeight*3/4,Xoption); - GDrawLine(controlMessageGC,lightingWindow, - (control->buttonQueue[lightTranslucent]).buttonX + 1, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).buttonHeight, - (control->buttonQueue[lightTranslucent]).buttonX + - (control->buttonQueue[lightTranslucent]).buttonWidth * 3/10, - (control->buttonQueue[lightTranslucent]).buttonY + - (control->buttonQueue[lightTranslucent]).buttonHeight,Xoption); - - /*** Draw the intensity selection arrow ***/ - GSetForeground(lightingGC,(float)lightingTransArrowColor,Xoption); - - f = (control->buttonQueue[lightTranslucent].buttonY + - control->buttonQueue[lightTranslucent].buttonHeight) - - (tempLightIntensity * - control->buttonQueue[lightTranslucent].buttonHeight); - i = f; - GDrawLine(lightingGC, lightingWindow, arrowHead + 10, i, - arrowHead + 22, i + 2, Xoption); - GDrawLine(lightingGC, lightingWindow, arrowHead + 22, i + 2, - arrowHead + 22, i - 2, Xoption); - GDrawLine(lightingGC, lightingWindow, arrowHead + 22, i - 2, - arrowHead + 10, i, Xoption); - -} /* drawLightTransArrow() */ - - - - - -/**************************** - * void drawLightingPanel() * - ****************************/ - -void -drawLightingPanel(void) -{ - - char *s; - int i,strlength; - - /* Draw border lines to separate the lighting window, potentiometers, - and button regions of the lightng subpanel. */ - GSetForeground(trashGC,(float)foregroundColor,Xoption); - GSetLineAttributes(trashGC,3,LineSolid,CapButt,JoinMiter,Xoption); - GDrawLine(trashGC, lightingWindow, 0, potA, controlWidth, potA, Xoption); - - GSetLineAttributes(trashGC,2,LineSolid,CapButt,JoinMiter,Xoption); - GDrawLine(trashGC, lightingWindow, 0, lightB, controlWidth, lightB, Xoption); - GDrawLine(trashGC, lightingWindow, 0, lightPotA, controlWidth, - lightPotA, Xoption); - GDrawLine(trashGC, lightingWindow, 0, lightPotB, controlWidth, - lightPotB, Xoption); - GDrawLine(trashGC, lightingWindow, lightTransL, lightPotA, - lightTransL, lightPotB, Xoption); - - writeControlTitle(lightingWindow); - s = "Lighting Control Panel"; - strlength = strlen(s); - GSetForeground(anotherGC,(float)lightingTitleColor,Xoption); - GDrawString(anotherGC, lightingWindow, - centerX(anotherGC, s, strlength, controlWidth), - lightB+18, s, strlength, Xoption); - - for (i=lightingButtonsStart; i<(lightingButtonsEnd); i++) { - switch (i) { - case lightMove: - GSetForeground(lightingGC,(float)lightingButtonColor,Xoption); - GDraw3DButtonOut(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - GSetForeground(lightingGC,(float)monoColor(buttonColor),Xoption); - GDrawLine(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY + - 2*(control->buttonQueue[i]).yHalf,Xoption); - GDrawLine(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY + - (control->buttonQueue[i]).yHalf, - (control->buttonQueue[i]).buttonX + - 2*(control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY + - (control->buttonQueue[i]).yHalf,Xoption); - break; - case lightMoveXY: - GSetForeground(lightingGC,(float)lightingButtonColor,Xoption); - GDraw3DButtonOut(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - GSetForeground(lightingGC,(float)monoColor(buttonColor),Xoption); - GDrawLine(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY + - 2*(control->buttonQueue[i]).yHalf,Xoption); - GDrawLine(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY + - (control->buttonQueue[i]).yHalf, - (control->buttonQueue[i]).buttonX + - 2*(control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY + - (control->buttonQueue[i]).yHalf,Xoption); - break; - case lightMoveZ: - GSetForeground(lightingGC,(float)lightingButtonColor,Xoption); - GDraw3DButtonOut(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - GSetForeground(lightingGC,(float)monoColor(buttonColor),Xoption); - GDrawLine(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf, - (control->buttonQueue[i]).buttonY + - 2*(control->buttonQueue[i]).yHalf,Xoption); - GDrawLine(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf - - (control->buttonQueue[i]).xHalf/2, - (control->buttonQueue[i]).buttonY + - (control->buttonQueue[i]).yHalf, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).xHalf + - (control->buttonQueue[i]).xHalf/2, - (control->buttonQueue[i]).buttonY + - (control->buttonQueue[i]).yHalf,Xoption); - break; - case lightTranslucent: - drawLightTransArrow(); - break; - default: - GDraw3DButtonOut(lightingGC,lightingWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - s = (control->buttonQueue[i]).text; - strlength = strlen(s); - GSetForeground(trashGC, - (float)monoColor((control->buttonQueue[i]).textColor),Xoption); - GDrawString(trashGC, lightingWindow, - (control->buttonQueue[i]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(processGC,(control->buttonQueue[i]).buttonHeight), - s,strlen(s),Xoption); - } /* switch */ - } /* for i in control->buttonQueue */ - - GSetForeground(lightingGC,(float)monoColor(labelColor),Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightMoveXY].buttonX + - control->buttonQueue[lightMoveXY].buttonWidth + 3, - control->buttonQueue[lightMoveXY].buttonY + - control->buttonQueue[lightMoveXY].yHalf, - "x",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightMoveXY].buttonX + - control->buttonQueue[lightMoveXY].xHalf - 2, - control->buttonQueue[lightMoveXY].buttonY - 4, - "y",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightMoveZ].buttonX + - control->buttonQueue[lightMoveZ].xHalf - 2, - control->buttonQueue[lightMoveZ].buttonY - 4, - "z",1,Xoption); - - /** Draw the title for the intensity potentiometer. */ - GSetForeground(lightingGC,(float)lightingTransColor,Xoption); - - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY, - "I",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight, - "n",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight*2, - "t",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight*3, - "e",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight*4, - "n",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight*5, - "s",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight*6, - "i",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight*7, - "t",1,Xoption); - GDrawString(lightingGC,lightingWindow, - control->buttonQueue[lightTranslucent].buttonX + - control->buttonQueue[lightTranslucent].buttonWidth + 3, - control->buttonQueue[lightTranslucent].buttonY + - lightFontHeight*8, - "y",1,Xoption); - drawLightingAxes(); - drawLightTransArrow(); - -} /* drawLightingPanel */ - - - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/main3d.c.pamphlet b/src/graph/view3d/main3d.c.pamphlet deleted file mode 100644 index e1dd6b8..0000000 --- a/src/graph/view3d/main3d.c.pamphlet +++ /dev/null @@ -1,654 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d main3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _MAIN3D_C -#include -#include -#include -#include -#include - -#include "header.h" -#include "cpanel.h" -#include "process.h" -#include "bsdsignal.h" - -#include "bsdsignal.h1" -#include "util.h1" -#include "gfun.h1" -#include "xspadfill.h1" -#include "xshade.h1" -#include "all-3d.h1" - - /**********************/ - /** global variables **/ - /**********************/ - -unsigned long * spadColors; -Display *dsply; -int scrn; -XFontStruct *globalFont, *buttonFont, *headerFont, *titleFont, *graphFont, - *lightingFont, *volumeFont, *quitFont, *saveFont,*serverFont; -char scaleReport[5]; -char deltaXReport[5], deltaYReport[5]; -int followMouse=no, - viewportKeyNum=0; -Window rtWindow; -GC globalGC1, globalGC2, anotherGC, globGC, trashGC, - controlMessageGC, lightingGC, volumeGC, quitGC, - saveGC, graphGC, componentGC, opaqueGC, renderGC; -XSizeHints viewSizeHints; -HashTable *table; -Colormap colorMap; -int Socket=1, ack=1; - -GC processGC; -viewPoints *viewport; -controlPanelStruct *control; -XGCValues gcVals; -char *s; -int someInt; - -/* check /usr/include/X11 for current implementation of - pixels (e.g. BlackPixel()) */ -unsigned long foregroundColor, backgroundColor; - - /** totalShades is initially set to totalShadesConst. - If X cannot allocate 8 shades for each hue, total- - Shades is decremented. there is currently only a check for - this value to be positive. --> something to add: change over - to monochrome if totalShades=0. just modify the spadcolors.c - file. spadcolors.c has been modified so that it returns the - value for totalShades. since the return value had previously - been unused, a modification in this way ensures continued - support of other routines calling this function (e.g. - hypertex stuff). **/ - -int mono, totalColors, totalSolid, totalDithered, totalHues, - totalSolidShades, totalDitheredAndSolids,totalShades; - -int drawMore; - -int spadMode=no, /* yes if receiving AXIOM command and - calling drawViewport */ - spadDraw=no; /* yes if drawing viewport for - an AXIOM command */ -int spadSignalReceived=0; /* yes if current state is a result of - a signal from AXIOM */ -int inNextEvent=no; /* true just before a call to - XNextEvent */ -jmp_buf jumpFlag; - -char errorStr[80]; - -view3DStruct viewData; - -Window quitWindow, saveWindow; - - /** variables below assume only one viewport per process **/ - -Window lightingWindow, lightingAxes; -float lightPointer[3], tempLightPointer[3]; - -int axesXY[3][4]; -float axesZ[3][2]; - -float lightIntensity=1.0, tempLightIntensity; -float backLightIntensity = 1.0; - - /** used for writing viewport info out to a file **/ -char filename[256]; - - - /** used for draw viewport routines */ -float sinTheta, sinPhi, cosTheta, cosPhi, viewScale, - viewScaleX, viewScaleY, viewScaleZ, reScale; -int xCenter, yCenter; - -XWindowAttributes vwInfo; -XWindowAttributes graphWindowAttrib; - -XPoint *quadMesh; -XImage *imageX; -int *xPts; /* pointer to projected points (x followed by y) */ -float transform[4][4], transform1[4][4], - R[4][4], R1[4][4], S[4][4], T[4][4], I[4][4]; -float A[4][4], B[4][4], D[4], E[4][4], F[4], array[4][4]; - - -int scanline, polyCount; -polyList *scanList[ARRAY_HEIGHT]; -float xleft = (float)0 ,xright = (float)ARRAY_WIDTH; - -colorBuffer cBuffer[ARRAY_WIDTH]; -float zBuffer[ARRAY_WIDTH]; - -float zC, dzdx, lum, point_norm[3]; -float intersectColor[2], dcolor; -triple dpt, dnorm; - - /** eyePoint **/ -float eyePoint[3]; - - /** tube stuff **/ -XPoint polygonMesh[20]; - - /* bypass the hidden surface algorithm if no rotations, etc */ -int saveFlag=no; -int firstTime=yes, noTrans = yes, startup = yes; -int redrawView = no; /* set to yes when returning from - subpanels */ -int redoColor = no, pixelSetFlag = no, redoDither = no; -int redoSmooth = no, multiColorFlag = no; - -/* In order to set recalc to true (see draw.h) */ -int finishedList=no, zoomed=yes, translated = yes, - changedIntensity, movingLight = no, writeImage = no, - rotated=yes, switchedPerspective, changedEyeDistance, - gotToggle = no; -poly *quickList; - - /** if not connected to AXIOM **/ -int viewAloned; - - /** for drawing the box **/ -viewTriple corners[8], clipCorners[8]; -boxSideStruct box[6], clipBox[6]; - - /** for freeing up points created frrom split polygons **/ -viewTriple *splitPoints; -int resMax=0; /* number of points in the split point resevoir */ - - /** view volume stuff **/ -Window volumeWindow; -int frustrumVertex; -int doingPanel=CONTROLpanel; /* rewrite titles in proper panel */ -int doingVolume; - -int screenX; /* global floating point indicating mouse position - on frustrum screen */ -float xClipMinN, xClipMaxN, /* normalized values for - clip volume */ - yClipMinN, yClipMaxN, - zClipMinN, zClipMaxN, - clipValue; /* mouse input */ -float pzMin, pzMax; /* for a given (theta,phi): calculated in - drawViewport(), used in drawFrustrum() */ - - /** B/W shades **/ -int maxGreyShade=0; - /** events from the viewport manager **/ -char propertyName[14]; -char propertyBuffer[256]; - - /* global ps variables */ -int psInit=no; /* need to call globaInitPs() each run */ -GCptr GChead=NULL; /* ptr to head of ps GC linked list */ -char *PSfilename; /* output file name used in user directory */ -char *envAXIOM; /* used for ps file paths */ - - /** Resource database **/ -XrmDatabase rDB; - - /** variables used for smooth shading **/ -int smoothError = no; -Pixmap viewmap; -int viewmap_valid = 0; -float Cspec = 0.30; -float Cdiff = 0.4; -float Camb = 0.3; -float coeff = 35.0; -float saturation = 0.8; -int smoothHue; -int smoothConst = 50; - - - -int -the_handler(Display *display,XErrorEvent *event) -{ - char buffer[512]; - XGetErrorText(display,event->error_code,buffer,511); - fprintf(stderr,"%s\n",buffer); - return(0); -} - -int -main(void) -{ - - XGCValues controlGCVals; - int i, code; - - char property[256]; - char *prop = &property[0]; - char *str_type[20]; - XrmValue value; - - - /**** Global inits ****/ - splitPoints = NIL(viewTriple); - - /**** Set up display ****/ - if ((dsply = XOpenDisplay(getenv("DISPLAY"))) == NULL) - {fprintf(stderr,"Could not open display.\n");exit (-1);} - scrn = DefaultScreen(dsply); - rtWindow = RootWindow(dsply,scrn); - XSetErrorHandler(the_handler); - /* XSynchronize(dsply,False); */ - - /**** link Xwindows to viewports - X10 feature ****/ - table = XCreateAssocTable(nbuckets); - - /**** Create AXIOM color map ****/ - totalShades = 0; - totalColors = XInitSpadFill(dsply,scrn,&colorMap, - &totalHues,&totalSolidShades, - &totalDitheredAndSolids,&totalShades); - if (totalColors < 0) { - fprintf(stderr,"ERROR: Could not allocate all the necessary colors.\n"); - exitWithAck(RootWindow(dsply,scrn),Window,-1); - } - - - mergeDatabases(); - - /*** Determine whether monochrome or color is used ***/ - if (XrmGetResource(rDB,"Axiom.3D.monochrome","",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop, "off"); - } - - - mono = ((totalSolid == 2) || (strcmp(prop,"on") == 0)); - if (mono) maxGreyShade=XInitShades(dsply,scrn) ; - - if (XrmGetResource(rDB,"Axiom.3D.inverse","",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop, "off"); - } - - if (mono) { - if (strcmp(prop,"on") == 0) { /* 0 if equal - inverse video */ - foregroundColor = white; - backgroundColor = black; - } else { /* off - no inverse video */ - foregroundColor = black; - backgroundColor = white; - } - } else { /* inverse of inverse in color (for some strange reason) */ - if (strcmp(prop,"on") == 0) { /* 0 if equal - inverse video */ - foregroundColor = white; - backgroundColor = black; - } else { /* off - no inverse video */ - foregroundColor = black; - backgroundColor = white; - } - } - - /* read default file name for postScript output */ - if (XrmGetResource(rDB,"Axiom.3D.postscriptFile","",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop, "axiom3d.ps"); - } - PSfilename = (char *)malloc(strlen(prop)+1); - strcpy(PSfilename,prop); - - XSync(dsply,0); - - /**** Open global fonts ****/ - serverFont = XQueryFont(dsply,XGContextFromGC(DefaultGC(dsply,scrn))); - - if (XrmGetResource(rDB,"Axiom.3D.messageFont","Axiom.3D.Font",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop,messageFontDefault); - } - if ((globalFont = XLoadQueryFont(dsply, prop)) == NULL) { - fprintf(stderr, "Warning: could not get the %s font for messageFont\n",prop); - globalFont = serverFont; - } - - if (XrmGetResource(rDB,"Axiom.3D.buttonFont","Axiom.3D.Font",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop,buttonFontDefault); - } - if ((buttonFont = XLoadQueryFont(dsply, prop)) == NULL) { - fprintf(stderr, "Warning: could not get the %s font for buttonFont\n",prop); - buttonFont = serverFont; - } - - if (XrmGetResource(rDB,"Axiom.3D.headerFont","Axiom.3D.Font",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop,headerFontDefault); - } - if ((headerFont = XLoadQueryFont(dsply, prop)) == NULL) { - fprintf(stderr, "Warning: could not get the %s font for headerFont\n",prop); - headerFont = serverFont; - } - - if (XrmGetResource(rDB,"Axiom.3D.titleFont","Axiom.3D.Font",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop,titleFontDefault); - } - if ((titleFont = XLoadQueryFont(dsply, prop)) == NULL) { - fprintf(stderr, "Warning: could not get the %s font for titleFont\n",prop); - titleFont = serverFont; - } - - if (XrmGetResource(rDB,"Axiom.3D.lightingFont","Axiom.3D.Font",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop,lightingFontDefault); - } - if ((lightingFont = XLoadQueryFont(dsply, prop)) == NULL) { - fprintf(stderr, "Warning: could not get the %s font for lightingFont\n",prop); - lightingFont = serverFont; - } - - if (XrmGetResource(rDB,"Axiom.3D.volumeFont","Axiom.3D.Font",str_type,&value) == True){ - (void) strncpy(prop,value.addr,(int)value.size); - } - else { - (void) strcpy(prop,volumeFontDefault); - } - if ((volumeFont = XLoadQueryFont(dsply, prop)) == NULL) { - fprintf(stderr, "Warning: could not get the %s font for volumeFont\n",prop); - volumeFont = serverFont; - - } - /**** Create widely used Graphic Contexts ****/ - - - PSGlobalInit(); - /* must initiate before using any G/PS functions */ - /* need character name: used as postscript GC variable */ - /* need to create ps GCs for all GCs used by drawing in viewWindow */ - - /* globalGC1 */ - controlGCVals.foreground = monoColor(axesColor); - controlGCVals.background = backgroundColor; - globalGC1 = XCreateGC(dsply,rtWindow,GCForeground | - GCBackground ,&controlGCVals); - carefullySetFont(globalGC1,globalFont); - PSCreateContext(globalGC1, "globalGC1", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* controlMessageGC */ - controlGCVals.foreground = controlMessageColor; - controlGCVals.background = backgroundColor; - controlMessageGC = XCreateGC(dsply,rtWindow,GCForeground | - GCBackground ,&controlGCVals); - carefullySetFont(controlMessageGC,globalFont); - - /* globalGC2 */ - controlGCVals.foreground = monoColor(labelColor); - globalGC2 = XCreateGC(dsply,rtWindow,GCForeground,&controlGCVals); - carefullySetFont(globalGC2,buttonFont); - PSCreateContext(globalGC2, "globalGC2", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* trashGC */ - controlGCVals.function = GXcopy; - trashGC = XCreateGC(dsply,rtWindow,0 ,&controlGCVals); - carefullySetFont(trashGC,buttonFont); - PSCreateContext(trashGC, "trashGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* componentGC */ - componentGC = XCreateGC(dsply,rtWindow,0 ,&controlGCVals); - carefullySetFont(componentGC,buttonFont); - PSCreateContext(componentGC, "componentGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* opaqueGC */ - opaqueGC = XCreateGC(dsply,rtWindow,0 ,&controlGCVals); - carefullySetFont(opaqueGC,buttonFont); - PSCreateContext(opaqueGC, "opaqueGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* renderGC */ - renderGC = XCreateGC(dsply,rtWindow,0,&controlGCVals); - carefullySetFont(renderGC,buttonFont); - PSCreateContext(renderGC, "renderGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* globGC */ - globGC = XCreateGC(dsply,rtWindow,0,&controlGCVals); - carefullySetFont(globGC,headerFont); - PSCreateContext(globGC, "globGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* anotherGC */ - controlGCVals.line_width = colorWidth; - anotherGC = XCreateGC(dsply,rtWindow,GCBackground | GCLineWidth | - GCFunction ,&controlGCVals); - carefullySetFont(anotherGC,titleFont); - PSCreateContext(anotherGC, "anotherGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* also create one for rendering (grayscale only for now) */ - /* assign arbitrary number to renderGC as 9991 - see header.h */ - PSCreateContext(GC9991, "renderGC", psNormalWidth, psButtCap, - psRoundJoin, psWhite, psBlack ); - - - /* processGC */ - gcVals.background = backgroundColor; - processGC = XCreateGC(dsply,rtWindow,GCBackground | - GCFillStyle,&gcVals); - carefullySetFont(processGC,buttonFont); - - /* lightingGC */ - controlGCVals.foreground = monoColor(axesColor); - controlGCVals.background = backgroundColor; - lightingGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(lightingGC,lightingFont); - - - /* volumeGC */ - volumeGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(volumeGC,volumeFont); - - /* quitGC */ - quitGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(quitGC,buttonFont); - - /* saveGC */ - saveGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(saveGC,buttonFont); - - - /* graphGC */ - graphGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(graphGC,buttonFont); - - /**** Get Data from the Viewport Manager ****/ - - i = 123; /* Used in viewman, what is this for? */ - code = check(write(Socket,&i,intSize)); - - /* Check if I am getting stuff from AXIOM or, if I am viewalone. */ - readViewman(&viewAloned,intSize); - readViewman(&viewData,sizeof(view3DStruct)); - readViewman(&i,intSize); - - if (!(viewData.title = (char *)saymem("main.c",i,sizeof(char)))) { - fprintf(stderr,"VIEW3D: Fatal Error>> Ran out of memory trying to receive\ - the title.\n"); - exitWithAck(RootWindow(dsply,scrn),Window,-1); - } - readViewman(viewData.title,i); - - readViewman(&(viewData.lightVec[0]),floatSize); - readViewman(&(viewData.lightVec[1]),floatSize); - readViewman(&(viewData.lightVec[2]),floatSize); - - viewData.scaleDown = yes; - - switch (viewData.typeOf3D) { - - /* Currently, the view3DType information doesn't get sent from - AXIOM - all surfaces are alike regardless of how they - were created. We may revert back to receiving this information - in case we want to take advantage of certain properties of - certain surfaces (e.g. z=f(x,y)). */ - - case view3DType: - case viewTubeType: - viewport = make3DComponents(); - viewData.box = no; - viewData.pointSize = 3; - break; - }; /* switch typeOf3D */ - - - /************************************************* - ** Do some temporary assignments that would ** - ** later be coded in the makeViewport routines ** - ** when the corresponding code has been put ** - ** into the viewalone, viewman and spad files. ** - *************************************************/ - - viewData.distortX = viewData.distortY = viewData.distortZ = 1; - viewData.clipPlane = clipPlaneMin; - viewData.clipStuff = yes; - - xClipMinN = yClipMinN = zClipMinN = 0.0; - xClipMaxN = yClipMaxN = zClipMaxN = 1.0; - - control = viewport->controlPanel; - - bsdSignal(SIGTERM,goodbye,DontRestartSystemCalls); - bsdSignal(SIGSEGV,goodbye,DontRestartSystemCalls); - - /** send acknowledgement to viewport manager**/ - i = 345; - - sprintf(errorStr,"sending window info to viewport manager"); - check(write(Socket,&(viewport->viewWindow),sizeof(Window))); - - viewmap = XCreatePixmap(dsply,viewport->viewWindow, - vwInfo.width,vwInfo.height, - DisplayPlanes(dsply,scrn)); - viewmap_valid = 1; - - processEvents(); - - goodbye(-1); - return(0); /* control never gets here but compiler complains */ -} /* main() */ - - - -void -mergeDatabases(void) -{ - XrmDatabase homeDB,serverDB,applicationDB; - char filenamebuf[1024]; - char *filename = &filenamebuf[0]; - char *classname = "Axiom"; - char name[255]; - - (void) XrmInitialize(); - (void) strcpy(name, "/usr/lib/X11/app-defaults/"); - (void) strcat(name, classname); - applicationDB = XrmGetFileDatabase(name); - (void) XrmMergeDatabases(applicationDB, &rDB); - - if (XResourceManagerString(dsply) != NULL){ - serverDB = XrmGetStringDatabase(XResourceManagerString(dsply)); - } - else { - (void) strcpy(filename,getenv("HOME")); - (void) strcat(filename,"/.Xdefaults"); - serverDB = XrmGetFileDatabase(filename); - } - XrmMergeDatabases(serverDB,&rDB); - if ( getenv ("XENVIRONMENT") == NULL) { - int len; - (void) strcpy(filename,getenv("HOME")); - (void) strcat(filename,"/.Xdefaults-"); - len = strlen(filename); - - (void) gethostname(filename+len,1024-len); - - } - else { - (void) strcpy (filename,getenv ("XENVIRONMENT")); - } - homeDB = XrmGetFileDatabase(filename); - XrmMergeDatabases(homeDB,&rDB); -} - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/mesh3d.c.pamphlet b/src/graph/view3d/mesh3d.c.pamphlet deleted file mode 100644 index 7650620..0000000 --- a/src/graph/view3d/mesh3d.c.pamphlet +++ /dev/null @@ -1,138 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d mesh3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _MESH3D_C -#include - -#include "header.h" -#include "all-3d.h1" - -/*************************************************************************** - *** void getMeshNormal(x0,y0,z0,x1,y1,z1,x2,y2,z2,zMin,zRange,Normal); *** - ***************************************************************************/ - -void -getMeshNormal(float x0,float y0,float z0,float x1,float y1,float z1, - float x2,float y2,float z2,float zMin,float zRange,float Normal[3]) -{ - float Ax,Ay,Az,Bx,By,Bz, - UnitFactor; - - Ax = x0-x1; Ay = y0-y1; Az = z0-z1; - Bx = x2-x1; By = y2-y1; Bz = z2-z1; - - /* compute cross product */ - - Normal[0] = (Ay*Bz - Az*By); - Normal[1] = (Az*Bx - Ax*Bz); - Normal[2] = (Ax*By - Ay*Bx); - - /* normalize normal vector */ - - UnitFactor = sqrt(Normal[0]*Normal[0] + - Normal[1]*Normal[1] + - Normal[2]*Normal[2]); - if (UnitFactor > 0.0) { - Normal[0] /= UnitFactor; - Normal[1] /= UnitFactor; - Normal[2] /= UnitFactor; - } else { - Normal[0] = 0.0; - Normal[1] = 0.0; - Normal[2] = 0.0; - } - -} /* getMeshNormal() */ - - -/*********************************** - **** void normalizeVector(v) **** - ***********************************/ - -void -normalizeVector(float *v) -{ - /* v should be a triple (ignoring the rest of the array if necessary) */ - - float UnitFactor; - - UnitFactor = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); - if (UnitFactor != 0.0) { - v[0] /= UnitFactor; - v[1] /= UnitFactor; - v[2] /= UnitFactor; - } else { - v[0] = v[1] = v[2] = 0.0; - } - -} /* normalizeVector() */ - - -/************************************ - **** void dotProduct(a,b,size) **** - ************************************/ - -float -dotProduct(float * a,float *b,int size) -{ - int i; - float f=0; - - for (i=0; i>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _MSORT3D_C - -/***************************************************** - * Mergesort routine * - * * - * This file depends on the file msort.h. There, a * - * data type called linkElement is defined. It is * - * used here and is the main structure being sorted * - * here. You can sort any linked structure, under * - * any name - so long as it has a next field (see * - * below). The define statement, below, renames * - * linkElement to linkThing. All you need to do * - * is change the define statement to rename * - * your structure to linkThing. The first argument * - * you pass to the sort routine is a pointer to * - * the unsorted list. The function returns with * - * that same pointer pointing to a sorted list. * - * * - * Usage: * - * linkElement *msort(p,min,max,compare) * - * linkElement *L; * - * int min,max; * - * int (*compare)(); * - * * - * e.g. * - * msort(L,0,N,compare); * - * * - * where * - * L is the list of things to be sorted, * - * it is expected to be a linked list * - * where the following element is pointed * - * to by a field called "next" * - * 0 is the index of the first element * - * (since this routine is called recursively, * - * this field is kept for clarity; it will * - * always be zero at top level) * - * N the number of elements in the list * - * minus one * - * compare(X,Y) is a comparison function that * - * returns a -1 if X is less than Y * - * 0 if X is the same as Y * - * and 1 if X is greater than Y * - * * - *****************************************************/ - - -#include "header.h" - -#include "all-3d.h1" - - -#define linkThing poly - - - -/********************** - * merge(p,q,compare) * - **********************/ - -linkThing * -merge(linkThing *p, linkThing *q,int (*compare)(linkThing *, linkThing *)) -{ - linkThing *returnVal,*current,*pN,*qN; - - /* return if only one item - take out when insert sort implemented */ - if (!p) return(q); else if (!q) return(p); - - /* set up the head of the list (first element) */ - if (compare(p,q) <= 0) { - returnVal = current = p; - pN = p->next; - qN = q; - } else { - returnVal = current = q; - pN = p; - qN = q->next; - } - - /* merge the two lists */ - while ((pN != NULL) && (qN != NULL)) { - if (compare(pN,qN) <= 0) { /* pN <= qN */ - current->next = pN; - current = pN; - pN = pN->next; - } else { - current->next = qN; - current = qN; - qN = qN->next; - } - } - - /* tag on the tail end */ - if (pN == NULL) current->next = qN; - else current->next = pN; - - return(returnVal); - -} /* merge() */ - - - -/********************************* - * msort: the top level function * - *********************************/ - -linkThing * -msort(linkThing *p,int min,int max,int (*compare)(linkThing *, linkThing *)) -{ - int mid; - int i; - linkThing *q,*temp,*xxx; - - if (min == max) return p; - else { - mid = (min + max - 1)/2; - /* e.g. [min,max] = [1,6] => mid=3 => q points to 4th */ - for (i=min,q=p; inext); - temp = q->next; - q->next = 0; - xxx = merge(msort(p,min,mid,compare), - msort(temp,mid+1,max,compare), compare); - - return(xxx); - } - -} /* msort() */ - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/pot3d.c.pamphlet b/src/graph/view3d/pot3d.c.pamphlet deleted file mode 100644 index 25e6b90..0000000 --- a/src/graph/view3d/pot3d.c.pamphlet +++ /dev/null @@ -1,106 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d pot3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _POT3D_C - -#include "header.h" -#include "all-3d.h1" - -/****************************/ -/*** void getPotValue() ***/ -/****************************/ - -mouseCoord -getPotValue(short eX,short eY,short xH,short yH) -{ - - mouseCoord whereMouse; - float x,y; - - x = (float)eX/xH - 1; - y = -((float)eY/yH -1); - - /* make non-linear potentiometer */ - whereMouse.x = x*x*x; - whereMouse.y = y*y*y; - if (whereMouse.x > 1.0) whereMouse.x = 1.0; - if (whereMouse.y > 1.0) whereMouse.y = 1.0; - if (whereMouse.x < -1.0) whereMouse.x = -1.0; - if (whereMouse.y < -1.0) whereMouse.y = -1.0; - - return(whereMouse); - -} /* getPotValue() */ - - - -/**********************************/ -/*** void getLinearPotValue() ***/ -/**********************************/ - -mouseCoord -getLinearPotValue(short eX,short eY,short xH,short yH) -{ - - mouseCoord whereMouse; - - whereMouse.x = (float)eX/xH - 1; - whereMouse.y = -((float)eY/yH -1); - - return(whereMouse); - -} /* getLinearPotValue() */ - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/process.h b/src/graph/view3d/process.h deleted file mode 100755 index 82f80c7..0000000 --- a/src/graph/view3d/process.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#define maxEyeDistance 2000.0 -#define minEyeDistance 200.0 -#define eyeIncrement 25.0 - -#define clipPlaneMin (-250.0) -#define clipPlaneMax 250.0 -#define clipPlaneIncrement 10.0 diff --git a/src/graph/view3d/process3d.c.pamphlet b/src/graph/view3d/process3d.c.pamphlet deleted file mode 100644 index 11cbcc0..0000000 --- a/src/graph/view3d/process3d.c.pamphlet +++ /dev/null @@ -1,1614 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d process3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _PROCESS3D_C - -#include -#include -#include -#include -#include -#include - - -#include "header.h" -#include "cpanel.h" -#include "volume.h" -#include "mode.h" -#include "process.h" -#include "draw.h" -#include "com.h" - - -#include "util.h1" -#include "gfun.h1" -#include "pixmap.h1" -#include "xshade.h1" -#include "xspadfill.h1" -#include "all-3d.h1" - -#define inside(A,B) (((XButtonEvent *)event)->x >= A && \ - ((XButtonEvent *)event)->x <= B) - - -void -buttonAction (int bKey) -{ - - char *s1, *s2; - int strL, strL1, strL2, offShade=14; - - /* Button colors which are offColor, RED, are turned off, and those which - are onColor, GREEN, indicate the mode is in effect. */ - - switch (bKey) { - - case hideControl: - if (viewport->haveControl) { - viewport->haveControl = no; - XUnmapWindow(dsply,control->controlWindow); - } - break; - - case region3D: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - if (viewport->regionOn) { - viewport->regionOn = no; - (control->buttonQueue[region3D]).textColor = offColor; - viewData.box = 0; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[region3D]).buttonX, - (control->buttonQueue[region3D]).buttonY, - (control->buttonQueue[region3D]).buttonWidth, - (control->buttonQueue[region3D]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[region3D]).buttonX, - (control->buttonQueue[region3D]).buttonY, - (control->buttonQueue[region3D]).buttonWidth, - (control->buttonQueue[region3D]).buttonHeight,Xoption); - } - } else { /* inverted color for region off */ - viewport->regionOn = yes; - viewData.box = 1; - (control->buttonQueue[region3D]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[region3D]).buttonX, - (control->buttonQueue[region3D]).buttonY, - (control->buttonQueue[region3D]).buttonWidth, - (control->buttonQueue[region3D]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[region3D]).buttonX, - (control->buttonQueue[region3D]).buttonY, - (control->buttonQueue[region3D]).buttonWidth, - (control->buttonQueue[region3D]).buttonHeight,Xoption); - } - } - - s = (control->buttonQueue[region3D]).text; - strL = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[region3D]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[region3D]).buttonX + - centerX(processGC,s,strL, - (control->buttonQueue[region3D]).buttonWidth), - (control->buttonQueue[region3D]).buttonY + - centerY(processGC, - (control->buttonQueue[region3D]).buttonHeight), - s,strL,Xoption); - redoSmooth = yes; - drawViewport(Xoption); - break; - - - - case bwColor: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - if (!mono) { - if (viewport->monoOn) { - viewport->monoOn = no; - if (viewport->hueTop == viewport->hueOffset) redoColor = yes; - else redoDither = yes; - (control->buttonQueue[bwColor]).textColor = offColor; - (control->buttonQueue[bwColor]).text = "BW"; - } else { - viewport->monoOn = yes; - maxGreyShade = XInitShades(dsply,scrn); - if (viewport->hueTop == viewport->hueOffset) redoColor = yes; - else redoDither = yes; - (control->buttonQueue[bwColor]).textColor = onColor; - (control->buttonQueue[bwColor]).text = "BW"; - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[bwColor]).buttonX, - (control->buttonQueue[bwColor]).buttonY, - (control->buttonQueue[bwColor]).buttonWidth, - (control->buttonQueue[bwColor]).buttonHeight); - GSetForeground(globalGC1,(float)monoColor(buttonColor),Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[bwColor]).buttonX, - (control->buttonQueue[bwColor]).buttonY, - (control->buttonQueue[bwColor]).buttonWidth, - (control->buttonQueue[bwColor]).buttonHeight,Xoption); - } - - s = (control->buttonQueue[bwColor]).text; - strL = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[bwColor]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[bwColor]).buttonX + - centerX(processGC,s,strL, - (control->buttonQueue[bwColor]).buttonWidth), - (control->buttonQueue[bwColor]).buttonY + - centerY(processGC, - (control->buttonQueue[bwColor]).buttonHeight), - s,strL,Xoption); - drawColorMap(); - redoSmooth = yes; - writeTitle(); - drawViewport(Xoption); - } - break; - - - - case outlineOnOff: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - if (viewData.outlineRenderOn) { - viewData.outlineRenderOn = 0; - (control->buttonQueue[outlineOnOff]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[outlineOnOff]).buttonX, - (control->buttonQueue[outlineOnOff]).buttonY, - (control->buttonQueue[outlineOnOff]).buttonWidth, - (control->buttonQueue[outlineOnOff]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[outlineOnOff]).buttonX, - (control->buttonQueue[outlineOnOff]).buttonY, - (control->buttonQueue[outlineOnOff]).buttonWidth, - (control->buttonQueue[outlineOnOff]).buttonHeight,Xoption); - } - } else { - viewData.outlineRenderOn = 1; - (control->buttonQueue[outlineOnOff]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[outlineOnOff]).buttonX, - (control->buttonQueue[outlineOnOff]).buttonY, - (control->buttonQueue[outlineOnOff]).buttonWidth, - (control->buttonQueue[outlineOnOff]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[outlineOnOff]).buttonX, - (control->buttonQueue[outlineOnOff]).buttonY, - (control->buttonQueue[outlineOnOff]).buttonWidth, - (control->buttonQueue[outlineOnOff]).buttonHeight,Xoption); - } - } - s = (control->buttonQueue[outlineOnOff]).text; - strL = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[outlineOnOff]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[outlineOnOff]).buttonX + - centerX(processGC,s,strL, - (control->buttonQueue[outlineOnOff]).buttonWidth), - (control->buttonQueue[outlineOnOff]).buttonY + - centerY(processGC, - (control->buttonQueue[outlineOnOff]).buttonHeight), - s,strL,Xoption); - if (viewData.style == render) { - drawViewport(Xoption); - } - break; - - - case lighting: - if (saveFlag) { - doingPanel = CONTROLpanel; - XUnmapWindow(dsply,saveWindow); - } - doingPanel = LIGHTpanel; - tempLightPointer[0] = viewport->lightVector[0]; - tempLightPointer[1] = viewport->lightVector[1]; - tempLightPointer[2] = viewport->lightVector[2]; - tempLightIntensity = lightIntensity; - XMapWindow(dsply,lightingWindow); - break; - - - case viewVolume: - if (saveFlag) { - doingPanel = CONTROLpanel; - XUnmapWindow(dsply,saveWindow); - } - doingPanel = VOLUMEpanel; - XMapWindow(dsply,volumeWindow); - redrawView = yes; - drawViewport(Xoption); /* draw it with doingVolume set to yes */ - break; - - - case volumeReturn: - doingPanel = CONTROLpanel; - redoSmooth = yes; - redrawView = yes; - XUnmapWindow(dsply,volumeWindow); - break; - - - case volumeAbort: - doingPanel = CONTROLpanel; - redrawView = yes; - XUnmapWindow(dsply,volumeWindow); - break; - - - case lightReturn: - doingPanel = CONTROLpanel; - viewport->lightVector[0] = lightPointer[0] = tempLightPointer[0]; - viewport->lightVector[1] = lightPointer[1] = tempLightPointer[1]; - viewport->lightVector[2] = lightPointer[2] = tempLightPointer[2]; - lightIntensity = tempLightIntensity; - normalizeVector(viewport->lightVector); - redrawView = ((viewData.style == render) || (viewData.style == smooth)); - if (movingLight || changedIntensity) redoSmooth = yes; - XUnmapWindow(dsply,lightingWindow); - break; - - - case lightAbort: - movingLight = no; changedIntensity = no; - doingPanel = CONTROLpanel; - XUnmapWindow(dsply,lightingWindow); - break; - - - case resetView: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - viewport->axesOn = yes; - viewport->regionOn = no; viewData.box = 0; - viewData.outlineRenderOn = 0; - viewport->monoOn = no; - viewport->zoomXOn = viewport->zoomYOn = viewport->zoomZOn = yes; - viewport->originrOn = yes; viewport->objectrOn = no; - viewport->originFlag = no; - viewport->xyOn = viewport->xzOn = viewport->yzOn = no; - viewport->lightVector[0] = -0.5; - viewport->lightVector[1] = 0.5; - viewport->lightVector[2] = 0.5; - viewport->translucency = viewData.translucency; - viewport->deltaX = viewport->deltaX0; - viewport->deltaY = viewport->deltaY0; - viewport->deltaY = viewport->deltaZ0; - viewport->scale = viewport->scale0; - viewport->scaleX = viewport->scaleY = viewport->scaleZ = 1.0; - if (!equal(viewport->theta,viewport->theta0) || !equal(viewport->phi,viewport->phi0)) - rotated = yes; - viewport->theta = viewport->axestheta = viewport->theta0 = viewData.theta; - viewport->phi = viewport->axesphi = viewport->phi0 = viewData.phi; - viewport->thetaObj = 0.0; - viewport->phiObj = 0.0; - redoSmooth = yes; - drawViewport(Xoption); - if (viewport->haveControl) drawControlPanel(); - writeTitle(); - break; - - - case axesOnOff: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - if (viewport->axesOn) { - viewport->axesOn = no; - (control->buttonQueue[axesOnOff]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[axesOnOff]).buttonX, - (control->buttonQueue[axesOnOff]).buttonY, - (control->buttonQueue[axesOnOff]).buttonWidth, - (control->buttonQueue[axesOnOff]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[axesOnOff]).buttonX, - (control->buttonQueue[axesOnOff]).buttonY, - (control->buttonQueue[axesOnOff]).buttonWidth, - (control->buttonQueue[axesOnOff]).buttonHeight,Xoption); - } - } else { /* draw invert-color button */ - viewport->axesOn = yes; - (control->buttonQueue[axesOnOff]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[axesOnOff]).buttonX, - (control->buttonQueue[axesOnOff]).buttonY, - (control->buttonQueue[axesOnOff]).buttonWidth, - (control->buttonQueue[axesOnOff]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[axesOnOff]).buttonX, - (control->buttonQueue[axesOnOff]).buttonY, - (control->buttonQueue[axesOnOff]).buttonWidth, - (control->buttonQueue[axesOnOff]).buttonHeight,Xoption); - } - } - - s = (control->buttonQueue[axesOnOff]).text; - strL = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[axesOnOff]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[axesOnOff]).buttonX + - centerX(processGC,s,strL, - (control->buttonQueue[axesOnOff]).buttonWidth), - (control->buttonQueue[axesOnOff]).buttonY + - centerY(processGC, - (control->buttonQueue[axesOnOff]).buttonHeight), - s,strL,Xoption); - if (viewData.style == smooth) { - if (multiColorFlag) redoDither = yes; - else redoColor = yes; - } - drawViewport(Xoption); - break; - - - case zoomx: - if (viewport->zoomXOn) { - viewport->zoomXOn = no; - (control->buttonQueue[zoomx]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight,Xoption); - } - } else { - viewport->zoomXOn = yes; - (control->buttonQueue[zoomx]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[zoomx]).buttonX, - (control->buttonQueue[zoomx]).buttonY, - (control->buttonQueue[zoomx]).buttonWidth, - (control->buttonQueue[zoomx]).buttonHeight,Xoption); - } - } - - s = (control->buttonQueue[zoomx]).text; - strL = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[zoomx]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[zoomx]).buttonX + - centerX(processGC,s,strL, - (control->buttonQueue[zoomx]).buttonWidth), - (control->buttonQueue[zoomx]).buttonY + - centerY(processGC, - (control->buttonQueue[zoomx]).buttonHeight), - s,strL,Xoption); - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - break; - - - case zoomy: - if (viewport->zoomYOn) { - viewport->zoomYOn = no; - (control->buttonQueue[zoomy]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight,Xoption); - } - } else { - viewport->zoomYOn = yes; - (control->buttonQueue[zoomy]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[zoomy]).buttonX, - (control->buttonQueue[zoomy]).buttonY, - (control->buttonQueue[zoomy]).buttonWidth, - (control->buttonQueue[zoomy]).buttonHeight,Xoption); - } - } - - s = (control->buttonQueue[zoomy]).text; - strL = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[zoomy]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[zoomy]).buttonX + - centerX(processGC,s,strL, - (control->buttonQueue[zoomy]).buttonWidth), - (control->buttonQueue[zoomy]).buttonY + - centerY(processGC, - (control->buttonQueue[zoomy]).buttonHeight), - s,strL,Xoption); - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - break; - - - case zoomz: - if (viewport->zoomZOn) { - viewport->zoomZOn = no; - (control->buttonQueue[zoomz]).textColor = offColor; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight,Xoption); - } - } else { - viewport->zoomZOn = yes; - (control->buttonQueue[zoomz]).textColor = onColor; - if (mono) { - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[zoomz]).buttonX, - (control->buttonQueue[zoomz]).buttonY, - (control->buttonQueue[zoomz]).buttonWidth, - (control->buttonQueue[zoomz]).buttonHeight,Xoption); - } - } - - s = (control->buttonQueue[zoomz]).text; - strL = strlen(s); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[zoomz]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[zoomz]).buttonX + - centerX(processGC,s,strL, - (control->buttonQueue[zoomz]).buttonWidth), - (control->buttonQueue[zoomz]).buttonY + - centerY(processGC, - (control->buttonQueue[zoomz]).buttonHeight), - s,strL,Xoption); - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - break; - - - case originr: - viewport->originrOn = yes; - (control->buttonQueue[originr]).textColor = onColor; - viewport->objectrOn = no; - (control->buttonQueue[objectr]).textColor = offColor; - viewport->originFlag = yes; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight,Xoption); - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight,Xoption); - } - s1 = (control->buttonQueue[objectr]).text; - strL1 = strlen(s1); - s2 = (control->buttonQueue[originr]).text; - strL2 = strlen(s2); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[objectr]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[objectr]).buttonX + - centerX(processGC,s1,strL1, - (control->buttonQueue[objectr]).buttonWidth), - (control->buttonQueue[objectr]).buttonY + - centerY(processGC, - (control->buttonQueue[objectr]).buttonHeight), - s1,strL1,Xoption); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[originr]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[originr]).buttonX + - centerX(processGC,s2,strL2, - (control->buttonQueue[originr]).buttonWidth), - (control->buttonQueue[originr]).buttonY + - centerY(processGC, - (control->buttonQueue[originr]).buttonHeight), - s2,strL2,Xoption); - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - break; - - - - case objectr: - viewport->objectrOn = yes; - (control->buttonQueue[objectr]).textColor = onColor; - viewport->originrOn = no; - (control->buttonQueue[originr]).textColor = offColor; - - viewport->originFlag = no; - if (mono) { - XChangeShade(dsply,offShade); - XShadeRectangle(dsply,control->controlWindow, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[originr]).buttonX, - (control->buttonQueue[originr]).buttonY, - (control->buttonQueue[originr]).buttonWidth, - (control->buttonQueue[originr]).buttonHeight,Xoption); - GSetForeground(globalGC1,(float)backgroundColor,Xoption); - XFillRectangle(dsply, control->controlWindow, globalGC1, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight); - GSetForeground(globalGC1,(float)foregroundColor,Xoption); - GDrawRectangle(globalGC1, control->controlWindow, - (control->buttonQueue[objectr]).buttonX, - (control->buttonQueue[objectr]).buttonY, - (control->buttonQueue[objectr]).buttonWidth, - (control->buttonQueue[objectr]).buttonHeight,Xoption); - } - s1 = (control->buttonQueue[objectr]).text; - strL1 = strlen(s1); - s2 = (control->buttonQueue[originr]).text; - strL2 = strlen(s2); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[objectr]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[objectr]).buttonX + - centerX(processGC,s1,strL1, - (control->buttonQueue[objectr]).buttonWidth), - (control->buttonQueue[objectr]).buttonY + - centerY(processGC, - (control->buttonQueue[objectr]).buttonHeight), - s1,strL1,Xoption); - - GSetForeground(processGC, - (float)monoColor((control->buttonQueue[originr]).textColor),Xoption); - GDrawImageString(processGC,control->controlWindow, - (control->buttonQueue[originr]).buttonX + - centerX(processGC,s2,strL2, - (control->buttonQueue[originr]).buttonWidth), - (control->buttonQueue[originr]).buttonY + - centerY(processGC, - (control->buttonQueue[originr]).buttonHeight), - s2,strL2,Xoption); - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - break; - - - - case ps: - strcpy(control->message," Creating postscript file ... "); - writeControlMessage(); - if (PSInit(viewport->viewWindow, viewport->titleWindow) == psError) { - strcpy(control->message," Aborted: PSInit error. "); - writeControlMessage(); - return; /* make new tmpnam for new file */ - } - - redoSmooth = yes; - drawViewport(PSoption); /* draw picture in PS; create ps script file */ - - if (PSCreateFile(viewBorderWidth, viewport->viewWindow, - viewport->titleWindow, viewport->title) == psError) { - strcpy(control->message," Aborted: PSCreateFile error. "); - writeControlMessage(); - return; - } - - clearControlMessage(); - strcpy(control->message,PSfilename); - strcat(control->message," in working dir "); - writeControlMessage(); - break; - - - - case pixmap: - strcpy(control->message," Creating axiom3D.xpm now ... "); - writeControlMessage(); - XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); - write_pixmap_file(dsply,scrn,"axiom3D.xpm", - viewport->titleWindow,0,0,vwInfo.width, - vwInfo.height+titleHeight); - clearControlMessage(); - strcpy(control->message," axiom3D.xpm in working dir "); - writeControlMessage(); - break; - - - - case transparent: - case opaqueMesh: - case render: - case smooth: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - viewData.style = bKey; - drawViewport(Xoption); /* draw picture in viewWindow with X routines */ - break; - - - case closeAll: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - doingPanel = QUITpanel; - viewport->closing = yes; - XMapWindow(dsply,quitWindow); - break; - - - case quitReturn: - XUnmapWindow(dsply,quitWindow); - break; - - - case quitAbort: - doingPanel = CONTROLpanel; - XUnmapWindow(dsply,quitWindow); - break; - - - case saveit: - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - saveFlag = yes; - doingPanel = SAVEpanel; - XMapWindow(dsply,saveWindow); - break; - - - case saveExit: - saveFlag = no; - doingPanel = CONTROLpanel; - XUnmapWindow(dsply,saveWindow); - break; - - - case xy: - viewport->theta = pi; - viewport->phi = 0.0; - viewport->axestheta = pi; - viewport->axesphi = 0.0; - rotated = yes; - viewport->yzOn = viewport->xzOn = no; - viewport->xyOn = yes; - drawViewport(Xoption); - break; - - - case xz: - viewport->theta = pi; - viewport->phi = -pi_half; - viewport->axestheta = pi; - viewport->axesphi = -pi_half; - rotated = yes; - viewport->yzOn = viewport->xyOn = no; - viewport->xzOn = yes; - drawViewport(Xoption); - break; - - - case yz: - viewport->theta = pi_half; - viewport->phi = -pi_half; - viewport->axestheta = pi_half; - viewport->axesphi = -pi_half; - rotated = yes; - viewport->xzOn = viewport->xyOn = no; - viewport->yzOn = yes; - drawViewport(Xoption); - break; - - - default: - fprintf(stderr,"Received a non-functioning button request: %d \n",bKey); - break; - } /* switch (action) */ - -} /* processEvents() */ - - - -/************************** X Event Processing *****************************/ -void -processEvents(void) -{ - - XEvent *event, tempEvent; - Window whichWindow; - buttonStruct *controlButton; - mouseCoord mouseXY, linearMouseXY; - int someInt, mouseW4, mouseH4; - int toggleReady =yes; - int checkButton = no; - int first_time = yes; - int changingColor = yes; - int gotEvent = 0, exposeView = no; - int tempTW, tempTH, tempVW, tempVH; - int buttonTablePtr; - float f1, f2; - int px, py, lx, ly; - unsigned int lbuttons; - Window dummy; - int Xcon,externalControl,len; - fd_set rd; - - externalControl = 0; - Xcon = ConnectionNumber(dsply); - - /** assign lightPointer for light panel **/ - lightPointer[0] = tempLightPointer[0] = viewport->lightVector[0]; - lightPointer[1] = tempLightPointer[1] = viewport->lightVector[1]; - lightPointer[2] = tempLightPointer[2] = viewport->lightVector[2]; - - if (!(event = (XEvent *)saymem("process.c",1,sizeof(XEvent)))) { - fprintf(stderr,"Ran out of memory initializing event processing.\n"); - exitWithAck(RootWindow(dsply,scrn),Window,-1); - } - - controlButton = 0; - - while(1) { - - /* Store old viewport window size attributes for resizing comparison. */ - XGetWindowAttributes(dsply,viewport->titleWindow,&graphWindowAttrib); - tempTW = graphWindowAttrib.width; - tempTH = graphWindowAttrib.height; - XGetWindowAttributes(dsply,viewport->viewWindow,&graphWindowAttrib); - tempVW = graphWindowAttrib.width; - tempVH = graphWindowAttrib.height; - - /* Get the next X event. The check for pending events is so that - a held down mouse button is interpreted as an event - even if nothing is pending. */ - - len=0; - while(len<=0) { - FD_ZERO(&rd); - if (externalControl==0) FD_SET(0, &rd); - FD_SET(Xcon,&rd); - - if (XEventsQueued(dsply, QueuedAlready)) { - len=1; - break; - } - if (!followMouse) - len=select(FD_SETSIZE,(void *)&rd,0,0,0); - else - len=1; - } - - if (FD_ISSET(Xcon,&rd)|| - XEventsQueued(dsply, QueuedAfterFlush) || - followMouse) { - - if (followMouse) { - if (XPending(dsply)) - XNextEvent(dsply,event); - gotEvent++; - } else { - XNextEvent(dsply,event); - gotEvent++; - } - - if (gotToggle || !followMouse) - checkButton = no; - - if (gotEvent) { - whichWindow = ((XButtonEvent *)event)->window; - first_time = no; - - switch(((XEvent *)event)->type) { - case ClientMessage: - if (event->xclient.data.l[0] == wm_delete_window) { - goodbye(-1); - } - else { - fprintf(stderr,"Unknown Client Message ...\n"); - } - break; - case Expose: - if (whichWindow == viewport->titleWindow) { - exposeView = yes; - followMouse = no; - XSync(dsply,0); - /* get rid of redundant exposure events */ - XCheckWindowEvent(dsply,viewport->titleWindow, - ExposureMask,&tempEvent); - writeTitle(); - XGetWindowAttributes(dsply,viewport->titleWindow, - &graphWindowAttrib); - if ((graphWindowAttrib.width!=tempTW) || - ((graphWindowAttrib.height)!=tempTH)) { - XResizeWindow(dsply,viewport->viewWindow, - graphWindowAttrib.width, graphWindowAttrib.height); - redoSmooth = yes; /* recompute smooth image pixmap if resized */ - } - } else if (whichWindow == viewport->viewWindow) { - exposeView = yes; - followMouse = no; - XSync(dsply,0); - XCheckWindowEvent(dsply,viewport->viewWindow,ExposureMask, - &tempEvent); - XGetWindowAttributes(dsply,viewport->viewWindow,&graphWindowAttrib); - if ((graphWindowAttrib.width!=tempVW) || - ((graphWindowAttrib.height)!=tempVH)) { - XResizeWindow(dsply,viewport->viewWindow,graphWindowAttrib.width, - graphWindowAttrib.height); - redoSmooth = yes; /* recompute smooth image pixmap if resized */ - } - drawViewport(Xoption); - XMapWindow(dsply,whichWindow); - } else if (whichWindow == lightingWindow) { - XGetWindowAttributes(dsply,control->controlWindow, - &graphWindowAttrib); - /* do not allow resizing of control panel */ - if ((graphWindowAttrib.width!=controlWidth) || - (graphWindowAttrib.height!=controlHeight)) { - XResizeWindow(dsply,control->controlWindow,controlWidth, - controlHeight); - } - drawLightingPanel(); - } else if (whichWindow == volumeWindow) { - XGetWindowAttributes(dsply,control->controlWindow, - &graphWindowAttrib); - /* do not allow resizing of control panel */ - if ((graphWindowAttrib.width!=controlWidth) || - (graphWindowAttrib.height!=controlHeight)) { - XResizeWindow(dsply,control->controlWindow,controlWidth, - controlHeight); - } - drawVolumePanel(); - if (redrawView) { - redrawView = no; - drawViewport(Xoption); - } - } else if (whichWindow == quitWindow) { - XGetWindowAttributes(dsply,control->controlWindow, - &graphWindowAttrib); - /* do not allow resizing of control panel */ - if ((graphWindowAttrib.width!=controlWidth) || - (graphWindowAttrib.height!=controlHeight)) { - XResizeWindow(dsply,control->controlWindow,controlWidth, - controlHeight); - } - drawQuitPanel(); - } else if (whichWindow == saveWindow) { - XGetWindowAttributes(dsply,control->controlWindow, - &graphWindowAttrib); - /* do not allow resizing of control panel */ - if ((graphWindowAttrib.width!=controlWidth) || - (graphWindowAttrib.height!=controlHeight)) { - XResizeWindow(dsply,control->controlWindow,controlWidth, - controlHeight); - } - drawSavePanel(); - } else if (whichWindow == control->controlWindow) { - XGetWindowAttributes(dsply,control->controlWindow, - &graphWindowAttrib); - /* do not allow resizing of control panel */ - if ((graphWindowAttrib.width != controlWidth) || - (graphWindowAttrib.height != controlHeight)) { - XResizeWindow(dsply,control->controlWindow, - controlWidth,controlHeight); - } - if (viewport->haveControl) drawControlPanel(); - followMouse = no; - if (redrawView || exposeView) { - redrawView = no; - drawViewport(Xoption); - } - exposeView = no; - } else { - fprintf(stderr,"Not a valid window.\n"); - } - - XFlush(dsply); - while(XCheckTypedWindowEvent(dsply, whichWindow, Expose, &tempEvent)); - break; - - - case MotionNotify: - exposeView = no; - if (followMouse) { - if (whichWindow == control->colormapWindow) { - while (XCheckMaskEvent(dsply,ButtonMotionMask,event)); - first_time = checkButton = followMouse = changingColor = yes; - gotToggle = no; - } else if (whichWindow != control->controlWindow) { - if (controlButton->pot) { - while (XCheckMaskEvent(dsply,ButtonMotionMask,event)); - mouseXY = getPotValue(((XButtonEvent *)event)->x, - ((XButtonEvent *)event)->y, - controlButton->xHalf, - controlButton->yHalf); - linearMouseXY = getLinearPotValue(((XButtonEvent *)event)->x, - ((XButtonEvent *)event)->y, - controlButton->xHalf, - controlButton->yHalf); - first_time = checkButton = followMouse = yes; - gotToggle = no; - } - } - } - break; - - case ButtonRelease: - exposeView = followMouse = no; - toggleReady = yes; gotToggle = yes; - break; - - case LeaveNotify: - XQueryPointer(dsply,rtWindow,&dummy,&dummy,&px,&py,&lx,&ly,&lbuttons); - if ( (controlButton) && - ((whichWindow == control->colormapWindow) || - (controlButton->pot)) && - (lbuttons & Button1Mask || - lbuttons & Button2Mask || - lbuttons & Button3Mask)) { - followMouse = yes; - if (whichWindow == control->colormapWindow) - changingColor = yes; - } - else { - followMouse = no; - changingColor = no; - } - toggleReady = yes; - checkButton = exposeView = no; - break; - - case ButtonPress: - exposeView = no; changingColor = no; - if (whichWindow == viewport->viewWindow) { - /* find out where the mouse button is pressed on the viewport, - this determines where to put the control panel */ - XGetWindowAttributes(dsply,whichWindow,&graphWindowAttrib); - mouseW4 = graphWindowAttrib.width/4; - if (((XButtonEvent *)event)->x > (graphWindowAttrib.width-mouseW4)) - someInt = 1; - else { - mouseH4 = graphWindowAttrib.height/4; - if (((XButtonEvent *)event)->y > - (graphWindowAttrib.height - mouseH4)) someInt = 2; - else if (((XButtonEvent *)event)->x < mouseW4) someInt = 3; - else if (((XButtonEvent *)event)->y < mouseH4) someInt = 4; - else someInt = 0; - } - if (viewport->haveControl) { - XUnmapWindow(dsply,control->controlWindow); - } - putControlPanelSomewhere(someInt); - writeControlMessage(); - XSync(dsply,0); - } else if (whichWindow == control->colormapWindow) { - gotToggle = no; - first_time = checkButton = followMouse = changingColor = yes; - } else if (whichWindow != control->controlWindow) { - /* mouse clicked on one of the buttons */ - if (!controlButton || (controlButton->self != whichWindow)) { - buttonTablePtr = *((int *)XLookUpAssoc(dsply,table,whichWindow)); - /** lighting buttons have indices greater than 100 **/ - /** all buttons share the same array now **/ - controlButton = &(control->buttonQueue[buttonTablePtr]); - } - if (controlButton->pot) { - /* figure out [x,y] for this button in the range [-1..1,-1..1] */ - mouseXY = getPotValue(((XButtonEvent *)event)->x, - ((XButtonEvent *)event)->y, - controlButton->xHalf,controlButton->yHalf); - linearMouseXY = getLinearPotValue(((XButtonEvent *)event)->x, - ((XButtonEvent *)event)->y, - controlButton->xHalf, - controlButton->yHalf); - followMouse = yes; - gotToggle = no; - } else { - followMouse = no; - gotToggle = yes; /* auto-repeat of toggle buttons not allowed */ - if (toggleReady) toggleReady = no; - } - checkButton = yes; - first_time = yes; - } - break; - - default: - toggleReady = gotToggle = yes; - exposeView = changingColor = checkButton = followMouse = no; - break; - - } /* switch */ - gotEvent--; - } /* if gotEvent */ - - /* Allow a pressed mouse button on a potentiometer to poll repeatedly. */ - if (followMouse && !first_time && (followMouse++ > mouseWait)) { - /* reset for next timing loop */ - followMouse = yes; - checkButton = yes; - } - if (checkButton) { - if (viewport->closing && (controlButton->buttonKey == quitReturn)) { - goodbye(-1); - } else if (changingColor) { - viewport->closing = no; - /* moving top color map pointer */ - if (((XButtonEvent *)event)->y < colorOffsetY) { - if (((XButtonEvent *)event)->x < (colorOffset+colorWidth)) { - /* decreasing top hue number */ - if (viewport->hueTop > 0) viewport->hueTop--; - } else if (((XButtonEvent *)event)->x >= - (colorOffsetX + totalHues*colorWidth + colorWidth)) { - if (viewport->hueTop < totalHues) viewport->hueTop++; - } else { - viewport->hueTop = - (((XButtonEvent *)event)->x - - colorOffsetX + colorWidth/2 - 13) / colorWidth; - } - } else if (((XButtonEvent *)event)->y > - (colorOffsetY + colorHeight)) { - /* moving bottom color map pointer */ - if (((XButtonEvent *)event)->x < (colorOffset+colorWidth)) { - /* decreasing offset number */ - if (viewport->hueOffset > 0) viewport->hueOffset--; - } else if (((XButtonEvent *)event)->x >= - (colorOffsetX + totalHues*colorWidth + colorWidth)) { - if (viewport->hueOffset < totalHues) viewport->hueOffset++; - } else { - viewport->hueOffset = - (((XButtonEvent *)event)->x - - colorOffsetX + colorWidth/2 - 13) / colorWidth; - } - } - /* color map pointer does not wrap around */ - if (viewport->hueOffset < 0) viewport->hueOffset = 0; - if (viewport->hueTop < 0) viewport->hueTop = 0; - if (viewport->hueOffset >= totalHues) - viewport->hueOffset = totalHues-1; - if (viewport->hueTop >= totalHues) viewport->hueTop = totalHues-1; - viewport->numberOfHues = viewport->hueTop - viewport->hueOffset; - if ((viewport->hueTop == viewport->hueOffset) && !viewport->monoOn) { - redoColor = yes; - redoDither = no; - } else { - redoColor = no; - redoDither = yes; - } - /* update color map changes on control panel */ - drawColorMap(); - } else { - viewport->closing = no; - clearControlMessage(); - /* reset all the things that might affect a recalculation for - redrawing removing hidden surfaces */ - - /* determine what type of button has been pressed */ - switch(controlButton->buttonKey) { - - /*** Potentiometers ***/ - case rotate: - if (!((viewport->originrOn) && (viewport->objectrOn))) { - /* update the amount of rotation around the object center - of volume */ - if (viewport->objectrOn) { - viewport->thetaObj += mouseXY.x * rotateFactor; - viewport->phiObj -= mouseXY.y * rotateFactor; - while (viewport->thetaObj >= two_pi) { - viewport->thetaObj -= two_pi; - } - while (viewport->thetaObj < 0.0) { - viewport->thetaObj += two_pi; - } - while (viewport->phiObj > pi) { - viewport->phiObj -= two_pi; - } - while (viewport->phiObj <= -pi) { - viewport->phiObj += two_pi; - } - } - /* update amount of rotation around the world space origin */ - if (viewport->originrOn) { - viewport->theta += mouseXY.x * rotateFactor; - viewport->phi -= mouseXY.y * rotateFactor; - while (viewport->theta >= two_pi) { - viewport->theta -= two_pi; - } - while (viewport->theta < 0.0) { - viewport->theta += two_pi; - } - while (viewport->phi > pi) { - viewport->phi -= two_pi; - } - while (viewport->phi <= -pi) { - viewport->phi += two_pi; - } - viewport->axestheta += mouseXY.x * rotateFactor; - viewport->axesphi -= mouseXY.y * rotateFactor; - while (viewport->axestheta >= two_pi) { - viewport->axestheta -= two_pi; - } - while (viewport->axestheta < 0.0) { - viewport->axestheta += two_pi; - } - while (viewport->axesphi > pi) { - viewport->axesphi -= two_pi; - } - while (viewport->axesphi <= -pi) { - viewport->axesphi += two_pi; - } - } - rotated = yes; - viewport->yzOn = viewport->xzOn = viewport->xyOn = no; - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - drawViewport(Xoption); - } - break; - - case zoom: - /* if uniform scaling */ - if ((viewport->zoomXOn) && - (viewport->zoomYOn) && - (viewport->zoomZOn)) { - viewport->scale *= 1 - mouseXY.y * scaleFactor; - } else { /* else scale axes independently */ - if (viewport->zoomXOn) viewport->scaleX *= (1 - mouseXY.y); - if (viewport->zoomYOn) viewport->scaleY *= (1 - mouseXY.y); - if (viewport->zoomZOn) viewport->scaleZ *= (1 - mouseXY.y); - } - if (viewport->scale > maxScale) viewport->scale = maxScale; - else if (viewport->scale < minScale) viewport->scale = minScale; - if (viewport->scaleX > maxScale) viewport->scaleX = maxScale; - else if (viewport->scaleX < minScale) viewport->scaleX = minScale; - if (viewport->scaleY > maxScale) viewport->scaleY = maxScale; - else if (viewport->scaleY < minScale) viewport->scaleY = minScale; - if (viewport->scaleZ > maxScale) viewport->scaleZ = maxScale; - else if (viewport->scaleZ < minScale) viewport->scaleZ = minScale; - zoomed = yes; - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - if ((viewport->zoomXOn) || - (viewport->zoomYOn) || - (viewport->zoomZOn)) - drawViewport(Xoption); - break; - - case translate: - viewport->deltaX += mouseXY.x * translateFactor; - viewport->deltaY += mouseXY.y * translateFactor; - if (viewport->deltaX > maxDeltaX) viewport->deltaX = maxDeltaX; - else if (viewport->deltaX < -maxDeltaX) viewport->deltaX = -maxDeltaX; - - if (viewport->deltaY > maxDeltaY) viewport->deltaY = maxDeltaY; - else if (viewport->deltaY < -maxDeltaY) viewport->deltaY = -maxDeltaY; - translated = yes; - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - drawViewport(Xoption); - break; - - /*** Lighting panel ***/ - case lightMoveXY: - tempLightPointer[0] = linearMouseXY.x; - tempLightPointer[1] = linearMouseXY.y; - if (tempLightPointer[0] > 1) tempLightPointer[0] = 1; - else if (tempLightPointer[0] < -1) tempLightPointer[0] = -1; - if (tempLightPointer[1] > 1) tempLightPointer[1] = 1; - else if (tempLightPointer[1] < -1) tempLightPointer[1] = -1; - movingLight = yes; - drawLightingAxes(); - break; - - case lightMoveZ: - tempLightPointer[2] = linearMouseXY.y; - /* linearMouse => no checking necessary */ - if (tempLightPointer[2] > 1) tempLightPointer[2] = 1; - else if (tempLightPointer[2] < -1) tempLightPointer[2] = -1; - movingLight = yes; - drawLightingAxes(); - break; - - /* changes the light intensity */ - case lightTranslucent: - tempLightIntensity = (linearMouseXY.y+1)/2; - if (tempLightIntensity > 1) tempLightIntensity = 1; - else if (tempLightIntensity < 0) tempLightIntensity = 0; - changedIntensity = yes; - drawLightTransArrow(); - break; - - /*** volume panel ***/ - case frustrumBut: - screenX = ((XButtonEvent *)event)->x; - if inside(eyeMinX,eyeMaxX) { - /* object coordinate */ - f2 = mouseXY.x * (maxEyeDistance - minEyeDistance) + - minEyeDistance; - if (f2 != viewData.eyeDistance) { - doingVolume = 2; /* flag for using screenX */ - changedEyeDistance = yes; - viewData.eyeDistance = f2; - drawFrustrum(); - drawViewport(Xoption); - } - } - else if inside(hitherMinX,hitherMaxX) { - f1 = ((float)hitherMaxX - ((XButtonEvent *)event)->x) / - (hitherMaxX - hitherMinX); - /* object coordinate */ - f2 = f1 * (clipPlaneMax - clipPlaneMin) + clipPlaneMin; - if (f2 != viewData.clipPlane) { - doingVolume = 3; /* flag for using screenX */ - viewData.clipPlane = f2; - drawFrustrum(); - drawViewport(Xoption); - } - } - else { - doingVolume = 1; /* check out doingVolume */ - doingPanel = VOLUMEpanel; - } - break; - - case clipXBut: /* this is a horizontal button */ - clipValue = linearMouseXY.x * 0.5 + 0.5; /* normalize to 0..1 */ - if (lessThan(clipValue,0.0)) clipValue = 0.0; - if (greaterThan(clipValue,1.0)) clipValue = 1.0; - if (lessThan(linearMouseXY.y,0.0)) { - if (!equal(xClipMinN,clipValue)) { - if (greaterThan(xClipMaxN-clipValue,minDistXY)) - xClipMinN = clipValue; - else - xClipMinN = xClipMaxN - minDistXY; - viewData.clipXmin = xClipMinN * - (viewData.xmax - viewData.xmin) + - viewData.xmin; - drawClipXBut(); - drawClipVolume(); - if (viewData.clipbox) - drawViewport(Xoption); - } - } else { - if (!equal(xClipMaxN,clipValue)) { - if (greaterThan(clipValue-xClipMinN,minDistXY)) - xClipMaxN = clipValue; - else - xClipMaxN = xClipMinN + minDistXY; - viewData.clipXmax = xClipMaxN * - (viewData.xmax - viewData.xmin) + - viewData.xmin; - drawClipXBut(); - drawClipVolume(); - if (viewData.clipbox) - drawViewport(Xoption); - } - } - break; - - case clipYBut: /* this is a vertical button */ - /* normalize to 0..1, bottom up */ - clipValue = 1 - (linearMouseXY.y * 0.5 + 0.5); - if (lessThan(clipValue,0.0)) clipValue = 0.0; - if (greaterThan(clipValue,1.0)) clipValue = 1.0; - if (lessThan(linearMouseXY.x,0.0)) { - if (!equal(yClipMinN,clipValue)) { - if (greaterThan(yClipMaxN-clipValue,minDistXY)) - yClipMinN = clipValue; - else - yClipMinN = yClipMaxN - minDistXY; - viewData.clipYmin = yClipMinN * - (viewData.ymax - viewData.ymin) + - viewData.ymin; - drawClipYBut(); - drawClipVolume(); - if (viewData.clipbox) - drawViewport(Xoption); - } - } else { - if (!equal(yClipMaxN,clipValue)) { - if (greaterThan(clipValue-yClipMinN,minDistXY)) - yClipMaxN = clipValue; - else - yClipMaxN = yClipMinN + minDistXY; - viewData.clipYmax = yClipMaxN * - (viewData.ymax - viewData.ymin) + - viewData.ymin; - drawClipYBut(); - drawClipVolume(); - if (viewData.clipbox) - drawViewport(Xoption); - } - } - break; - - case clipZBut: /* this is a diagonally aligned button! */ - /* f1 is the distance from the center of the button along - the diagonal line with a slope of -1. If f1 is negative, - the direction is downward from the center, if f1 is - positive, the direction is upward from the center. - Note that there ought to be a constant factor, namely - cos(45), multiplied by f1 for the correct normalized value; - however, we exploit this by foreshortening the length of the - diagonal by that same factor (so instead of normalizing the - numbers to, the line we normalize the line to the numbers) - since we need to shorten the line at some point anyway - (both to match the length of the diagonal side of the box - and to allow more area for mouse input. */ - - /* cos(45), etc => 0.4 */ - f1 = (linearMouseXY.x - linearMouseXY.y) * 0.4 + 0.5; - if (lessThan(f1,0.0)) f1 = 0.0; - if (greaterThan(f1,1.0)) f1 = 1.0; - /* note that x moving upward */ - if (lessThan(-linearMouseXY.x,linearMouseXY.y)) { - if (!equal(zClipMaxN,f1)) { - if (greaterThan(f1-zClipMinN,minDistZ)) - zClipMaxN = f1; - else - zClipMaxN = zClipMinN + minDistZ; - viewData.clipZmax = zClipMaxN * - (viewData.zmax - viewData.zmin) + - viewData.zmin; - drawClipZBut(); - drawClipVolume(); - if (viewData.clipbox) - drawViewport(Xoption); - } - } else { - if (!equal(zClipMinN,f1)) { - if (greaterThan(zClipMaxN-f1,minDistZ)) - zClipMinN = f1; - else - zClipMinN = zClipMaxN - minDistZ; - viewData.clipZmin = zClipMinN * - (viewData.zmax - viewData.zmin) + - viewData.zmin; - drawClipZBut(); - drawClipVolume(); - if (viewData.clipbox) - drawViewport(Xoption); - } - } /* if lessThan(x,y) */ - break; - - case perspectiveBut: - if ((viewData.perspective = !viewData.perspective)) { - switchedPerspective = yes; - GSetForeground(volumeGC, - (float)monoColor((control->buttonQueue[perspectiveBut]).textColor),Xoption); - GDrawString(volumeGC,volumeWindow, - controlButton->buttonX + - centerX(volumeGC,"x",1,controlButton->buttonWidth), - controlButton->buttonY + - centerY(volumeGC,controlButton->buttonHeight), - "x",1,Xoption); - } - else - XClearArea(dsply,volumeWindow, - controlButton->buttonX+1, - controlButton->buttonY+1, - controlButton->buttonHeight-2, - controlButton->buttonWidth-2, - False); - drawViewport(Xoption); - break; - - case clipRegionBut: - if ((viewData.clipbox = !viewData.clipbox)) { - GSetForeground(volumeGC, - (float)monoColor((control->buttonQueue[clipRegionBut]).textColor),Xoption); - GDrawString(volumeGC,volumeWindow, - controlButton->buttonX + - centerX(volumeGC,"x",1,controlButton->buttonWidth), - controlButton->buttonY + - centerY(volumeGC,controlButton->buttonHeight), - "x",1,Xoption); - } - else - XClearArea(dsply,volumeWindow, - controlButton->buttonX+1, - controlButton->buttonY+1, - controlButton->buttonWidth-2, - controlButton->buttonHeight-2, - False); - - drawViewport(Xoption); - break; - - case clipSurfaceBut: - if ((viewData.clipStuff = !viewData.clipStuff)) { - GSetForeground(volumeGC, - (float)monoColor((control->buttonQueue[clipSurfaceBut]).textColor),Xoption); - GDrawString(volumeGC,volumeWindow, - controlButton->buttonX + - centerX(volumeGC,"x",1,controlButton->buttonWidth), - controlButton->buttonY + - centerY(volumeGC,controlButton->buttonHeight), - "x",1,Xoption); - } - else - XClearArea(dsply,volumeWindow, - controlButton->buttonX+1, - controlButton->buttonY+1, - controlButton->buttonWidth-2, - controlButton->buttonHeight-2, - False); - break; - - default: - buttonAction(controlButton->buttonKey); - } /* switch on buttonKey */ - - } /* else - not closing */ - } /* if checkButton */ - } /* if FD_ISSET(Xcon,.. */ - else if FD_ISSET(0,&rd) { - externalControl = spadAction(); - if (spadDraw && (externalControl==0)) drawViewport(Xoption); - } - } /* for (until closed) */ -} /* processEvents() */ - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/project3d.c.pamphlet b/src/graph/view3d/project3d.c.pamphlet deleted file mode 100644 index 3471db4..0000000 --- a/src/graph/view3d/project3d.c.pamphlet +++ /dev/null @@ -1,411 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d project3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _PROJECT3D_C -#include - -#include "header.h" -#include "draw.h" -#include "mode.h" /* for #define components */ - -#include "all-3d.h1" - -/******************************************* - * void project(aViewTriple,someXpoints,i) * - * * - * orthogonal projection for a point * - * setting the ith Xpoint as well * - *******************************************/ - -void -project(viewTriple * aViewTriple,XPoint *someXpoints,int i) -{ - float Vtmp[4], V[4], V1[4]; - - V[0] = aViewTriple->x; V[1] = aViewTriple->y; - V[2] = aViewTriple->z; V[3] = 1.0; - - if (isNaNPoint(V[0], V[1], V[2])) { - (someXpoints+i)->x = aViewTriple->px = NotPoint; - (someXpoints+i)->y = aViewTriple->py = NotPoint; - return; - } - - V[0] -= viewport->transX; V[1] -= viewport->transY; - V[2] -= viewport->transZ; - vectorMatrix4(V,R1,Vtmp); - - matrixMultiply4x4(S,R,transform); - vectorMatrix4(Vtmp,transform,V1); - - aViewTriple->wx = V1[0]; aViewTriple->wy = V1[1]; - aViewTriple->wz = V1[2]; - - V1[0] *= reScale; V1[1] *= reScale; V1[2] *= reScale; - - aViewTriple->pz = V1[2]; - if (viewData.perspective) { - V1[0] *= projPersp(aViewTriple->pz); - V1[1] *= projPersp(aViewTriple->pz); - } - - matrixMultiply4x4(I,T,transform); - vectorMatrix4(V1,transform,V); - V[0] = V[0]*viewScale + xCenter; - V[1] = vwInfo.height - (V[1]*viewScale + yCenter); - - (someXpoints+i)->x = aViewTriple->px = V[0]; - (someXpoints+i)->y = aViewTriple->py = V[1]; -} - - -/*************************************************** - * void projectAPoint(aViewTriple) * - * * - * orthogonal projection for a point. sort of * - * like the above, but no Xpoint assignment * - ***************************************************/ - -void -projectAPoint(viewTriple *aViewTriple) -{ - float Vtmp[4], V[4], V1[4]; - - V[0] = aViewTriple->x; V[1] = aViewTriple->y; - V[2] = aViewTriple->z; V[3] = 1.0; - - if (isNaNPoint(V[0], V[1], V[2])) { - aViewTriple->px = NotPoint; - aViewTriple->py = NotPoint; - return; - } - - V[0] -= viewport->transX; V[1] -= viewport->transY; - V[2] -= viewport->transZ; - vectorMatrix4(V,R1,Vtmp); - - matrixMultiply4x4(S,R,transform); - vectorMatrix4(Vtmp,transform,V1); - - aViewTriple->wx = V1[0]; aViewTriple->wy = V1[1]; - aViewTriple->wz = V1[2]; - - V1[0] *= reScale; V1[1] *= reScale; V1[2] *= reScale; - - aViewTriple->pz = V1[2]; - if (viewData.perspective) { - V1[0] *= projPersp(aViewTriple->pz); - V1[1] *= projPersp(aViewTriple->pz); - } - - matrixMultiply4x4(I,T,transform); - vectorMatrix4(V1,transform,V); - V[0] = V[0]*viewScale + xCenter; - V[1] = vwInfo.height - (V[1]*viewScale + yCenter); - - aViewTriple->px = V[0]; - aViewTriple->py = V[1]; -} - - -/*************************** - * void projectAllPoints() * - ***************************/ - -void -projectAllPoints(void) -{ - - int i,j,k; - LLPoint *anLLPoint; - LPoint *anLPoint; - int *anIndex; - - anLLPoint = viewData.lllp.llp; - for (i=0; ilp; - for (j=0; jnumOfLists; j++,anLPoint++) { - anIndex = anLPoint->indices; - for (k=0; knumOfPoints; k++,anIndex++) { - projectAPoint(refPt3D(viewData,*anIndex)); - } /* for points in LPoints (k) */ - } /* for LPoints in LLPoints (j) */ - } /* for LLPoints in LLLPoints (i) */ - -} /* projectAllPoints() */ - - -/******************************* - * void projectAllPolys(pList) * - * * - * orthogonal projection of * - * all the polygons in a given * - * list in one go. pz holds * - * the projected depth info * - * for hidden surface removal. * - * Polygons totally outside of * - * the window dimensions after * - * projection are discarded * - * from the list. * - *******************************/ - -void -projectAllPolys (poly *pList) -{ - - int i,clipped,clippedPz; - float x0=0.0; - float y0=0.0; - float xA=0.0; - float yA=0.0; - float xB=0.0; - float yB=0.0; - int *anIndex; - viewTriple *aPt; - - strcpy(control->message," Projecting Polygons "); - writeControlMessage(); - - projectAllPoints(); - for (;pList != NIL(poly);pList=pList->next) { - /* totalClip==yes => partialClip==yes (of course) */ - pList->totalClipPz = yes; /* start with 1, AND all points with Pz<0 */ - pList->partialClipPz = no; /* start with 0, OR any points with Pz<0 */ - pList->totalClip = yes; /* same idea, only wrt clip volume */ - pList->partialClip = no; - for (i=0,anIndex=pList->indexPtr; inumpts; i++,anIndex++) { - aPt = refPt3D(viewData,*anIndex); - clipped = outsideClippedBoundary(aPt->x, aPt->y, aPt->z); - pList->totalClip = pList->totalClip && clipped; - pList->partialClip = pList->partialClip || clipped; - clippedPz = behindClipPlane(aPt->pz); - pList->totalClipPz = pList->totalClipPz && clippedPz; - pList->partialClipPz = pList->partialClipPz || clippedPz; - - /* stuff for figuring out normalFacingOut, after the loop */ - if (!i) { - x0 = aPt->px; y0 = aPt->py; - } else if (i==1) { - xA = x0 - aPt->px; yA = y0 - aPt->py; - x0 = aPt->px; y0 = aPt->py; - } else if (i==2) { - xB = aPt->px - x0; yB = aPt->py - y0; - } - } /* for i */ - /* store face facing info */ - /* For now, we shall give faces facing the user a factor of -1, - and faces facing away from the user a factor of +1. this is - to mimic the eye vector (pointing away from the user) dotted - into the surface normal. - This routine is being done because the surface normal in object - space does not transform over to image space linearly and so - has to be recalculated. but the triple product is zero in the - X and Y directions so we just take the Z component, of which, - we just examine the sign. */ - if ((x0 = xA*yB - yA*xB) > machine0) pList->normalFacingOut = 1; - else if (x0 < machine0) pList->normalFacingOut = -1; - else pList->normalFacingOut = 0; - - } - strcpy(control->message,viewport->title); - writeControlMessage(); - -} /* projectAllPolys */ - - - -/******************************* - * void projectAPoly(p) * - * * - * orthogonal projection of * - * all a polygon. pz holds * - * the projected depth info * - * for hidden surface removal * - *******************************/ - - -void -projectAPoly (poly *p) -{ - - int i,clipped,clippedPz; - float Vtmp[4],V[4],V1[4]; - float x0=0.0; - float y0=0.0; - float xA=0.0; - float yA=0.0; - float xB=0.0; - float yB=0.0; - - int *anIndex; - viewTriple *aPt; - -/* totalClip==yes => partialClip==yes */ - p->totalClipPz = yes; /* start with 1, AND all points with Pz<0 */ - p->partialClipPz = no; /* start with 0, OR any points with Pz<0 */ - p->totalClip = yes; /* same idea, only with respect to clip volume */ - p->partialClip = no; - for (i=0,anIndex=p->indexPtr; inumpts; i++,anIndex++) { - aPt = refPt3D(viewData,*anIndex); - V[0] = aPt->x; V[1] = aPt->y; V[2] = aPt->z; V[3] = 1.0; - - V[0] -= viewport->transX; V[1] -= viewport->transY; - V[2] -= viewport->transZ; - vectorMatrix4(V,R1,Vtmp); - - matrixMultiply4x4(S,R,transform); - vectorMatrix4(Vtmp,transform,V1); - - aPt->wx = V1[0]; aPt->wy = V1[1]; aPt->wz = V1[2]; - - V1[0] *= reScale; V1[1] *= reScale; V1[2] *= reScale; - - aPt->pz = V1[2]; - if (viewData.perspective) { - V1[0] *= projPersp(V1[2]); - V1[1] *= projPersp(V1[2]); - } - - matrixMultiply4x4(I,T,transform); - vectorMatrix4(V1,transform,V); - V[0] = V[0]*viewScale + xCenter; - V[1] = vwInfo.height - (V[1]*viewScale + yCenter); - - aPt->px = V[0]; aPt->py = V[1]; - - clipped = outsideClippedBoundary(aPt->x, aPt->y, aPt->z); - p->totalClip = p->totalClip && clipped; - p->partialClip = p->partialClip || clipped; - clippedPz = behindClipPlane(aPt->pz); - p->totalClipPz = p->totalClipPz && clippedPz; - p->partialClipPz = p->partialClipPz || clippedPz; - - /* stuff for figuring out normalFacingOut, after the loop */ - if (!i) { - x0 = aPt->px; y0 = aPt->py; - } else if (i==1) { - xA = x0 - aPt->px; yA = y0 - aPt->py; - x0 = aPt->px; y0 = aPt->py; - } else if (i==2) { - xB = aPt->px - x0; yB = aPt->py - y0; - } - } - - if ((x0 = xA*yB - yA*xB) > machine0) p->normalFacingOut = 1; - else if (x0 < machine0) p->normalFacingOut = -1; - else p->normalFacingOut = 0; - -} /* projectAPoly */ - - - -/********************************** - * void projectStuff(x,y,z,px,py) * - * * - * sort of like the project stuff * - * in tube.c but used exclusively * - * for the functions of two * - * variables. probably will need * - * to be changed later to be more * - * general (i.e. have everybody * - * use the viewTriple point * - * structure). * - **********************************/ - -void -projectStuff(float x,float y,float z,int *px,int *py,float *Pz) -{ - float tempx,tempy,tempz,temps,V[4],V1[4],stuffScale=100.0; - - tempx = viewport->scaleX; - tempy = viewport->scaleY; - tempz = viewport->scaleZ; - temps = viewScale; - - if (viewport->scaleX > 5.0) viewport->scaleX = 5.0; - if (viewport->scaleY > 5.0) viewport->scaleY = 5.0; - if (viewport->scaleZ > 3.0) viewport->scaleZ = 3.0; - if (viewScale > 5.0) viewScale = 5.0; - - V[0] = x; V[1] = y; - V[2] = z; V[3] = 1.0; - - V[0] -= viewport->transX*stuffScale; - V[1] -= viewport->transY*stuffScale; - V[2] -= viewport->transZ*stuffScale; - - matrixMultiply4x4(S,R,transform); - vectorMatrix4(V,transform,V1); - *Pz = V1[2]; - - if (viewData.perspective) { - V1[0] *= projPersp(V1[2]); - V1[1] *= projPersp(V1[2]); - } - - matrixMultiply4x4(I,T,transform); - vectorMatrix4(V1,transform,V); - - V[0] = V[0]*viewScale + xCenter; - V[1] = vwInfo.height - (V[1]*viewScale + yCenter); - - *px = V[0]; - *py = V[1]; - - viewport->scaleX = tempx; - viewport->scaleY = tempy; - viewport->scaleZ = tempz; - viewScale = temps; -} -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/quit3d.c.pamphlet b/src/graph/view3d/quit3d.c.pamphlet deleted file mode 100644 index 64b0d2f..0000000 --- a/src/graph/view3d/quit3d.c.pamphlet +++ /dev/null @@ -1,183 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d quit3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _QUIT3D_C - -#include -#include "header.h" -#include "cpanel.h" -#include "volume.h" -#include "../include/purty/volume.bitmap" -#include "../include/purty/volume.mask" - -#include "util.h1" -#include "gfun.h1" -#include "xspadfill.h1" -#include "all-3d.h1" - -#define quitMASK ExposureMask -#define quitCursorForeground monoColor(55) -#define quitCursorBackground monoColor(197) -#define quitTitleColor monoColor(69) -#define quitButtonColor monoColor(195) -#define quitFontHeight (quitFont->max_bounds.ascent+quitFont->max_bounds.descent) - - -/*************************** - * int makeQuitPanel() * - ***************************/ - -int -makeQuitPanel(void) -{ - - int i; - XSetWindowAttributes quitter,QuitterAttrib; - XSizeHints sizeh; - Pixmap quitbits, quitmask; - XColor quitterColor,qColor; - - quitbits = XCreateBitmapFromData(dsply,rtWindow, volumeBitmap_bits, - volumeBitmap_width,volumeBitmap_height); - quitmask = XCreateBitmapFromData(dsply,rtWindow,volumeMask_bits, - volumeMask_width,volumeMask_height); - quitter.background_pixel = backgroundColor; - quitter.border_pixel = foregroundColor; - quitter.event_mask = quitMASK; - quitter.colormap = colorMap; - quitter.override_redirect = overrideManager; - quitterColor.pixel = quitCursorForeground; - XQueryColor(dsply,colorMap,&quitterColor); - qColor.pixel = quitCursorBackground; - XQueryColor(dsply,colorMap,&qColor); - quitter.cursor = XCreatePixmapCursor(dsply,quitbits,quitmask, - &quitterColor,&qColor, - volumeBitmap_x_hot,volumeBitmap_y_hot); - quitWindow = XCreateWindow(dsply,control->controlWindow, - controlWidth-quitWidth-2,controlHeight-quitHeight-2, - quitWidth-2,quitHeight-2,2, - CopyFromParent,InputOutput,CopyFromParent, - controlCreateMASK,&quitter); - - sizeh.flags = USPosition | USSize; - sizeh.x = 0; - sizeh.y = 0; - sizeh.width = quitWidth-2; - sizeh.height = quitHeight-2; - - XSetNormalHints(dsply,quitWindow,&sizeh); - XSetStandardProperties(dsply,quitWindow,"Quit Panel","Quit Panel", - None,NULL,0,&sizeh); - - /*** do quit buttons ***/ - initQuitButtons(control->buttonQueue); - for (i=quitButtonsStart; i<(quitButtonsEnd); i++) { - QuitterAttrib.event_mask = (control->buttonQueue[i]).mask; - (control->buttonQueue[i]).self = - XCreateWindow(dsply,quitWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight, - 0,0,InputOnly,CopyFromParent, - buttonCreateMASK,&QuitterAttrib); - XMakeAssoc(dsply,table,(control->buttonQueue[i]).self, - &((control->buttonQueue[i]).buttonKey)); - XMapWindow(dsply,(control->buttonQueue[i]).self); - } - - return(0); - -} /* makeQuitPanel() */ - - -/**************************** - * void drawQuitPanel() * - ****************************/ - -void -drawQuitPanel(void) -{ - - char *s; - int i,strlength; - - s = "Really?"; - strlength = strlen(s); - GSetForeground(anotherGC,(float)quitTitleColor,Xoption); - GDrawString(anotherGC,quitWindow, - centerX(anotherGC,s,strlength,quitWidth),centerY(anotherGC,39),s,strlength,Xoption); - - GSetForeground(anotherGC,(float)quitButtonColor,Xoption); - for (i=quitButtonsStart; i<(quitButtonsEnd); i++) { - GDraw3DButtonOut(quitGC,quitWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - s = (control->buttonQueue[i]).text; - strlength = strlen(s); - GSetForeground(trashGC, - (float)monoColor((control->buttonQueue[i]).textColor),Xoption); - GDrawString(trashGC,quitWindow, - (control->buttonQueue[i]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(processGC,(control->buttonQueue[i]).buttonHeight), - s,strlen(s),Xoption); - } /* for i in control->buttonQueue */ - -} /* drawQuitPanel */ -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/quitbut3d.c.pamphlet b/src/graph/view3d/quitbut3d.c.pamphlet deleted file mode 100644 index 2d19b32..0000000 --- a/src/graph/view3d/quitbut3d.c.pamphlet +++ /dev/null @@ -1,102 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d quitbut3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _QUITBUT3D_C - -#include "header.h" -#include "cpanel.h" - -#include "all-3d.h1" - - - -int -initQuitButtons (buttonStruct *quitButtons) -{ - int ii; - int num = 0; - - ii = quitAbort; - quitButtons[ii].buttonX = 5; - quitButtons[ii].buttonY = 41; - quitButtons[ii].buttonWidth = 53; - quitButtons[ii].buttonHeight = 25; - quitButtons[ii].buttonKey = ii; - quitButtons[ii].pot = no; - quitButtons[ii].mask = buttonMASK; - quitButtons[ii].text = "No"; - quitButtons[ii].textColor = 6; - quitButtons[ii].xHalf = quitButtons[ii].buttonWidth/2; - quitButtons[ii].yHalf = quitButtons[ii].buttonHeight/2; - ++num; - - ii = quitReturn; - quitButtons[ii].buttonX = 5; - quitButtons[ii].buttonY = 75; - quitButtons[ii].buttonWidth = 53; - quitButtons[ii].buttonHeight = 25; - quitButtons[ii].buttonKey = ii; - quitButtons[ii].pot = no; - quitButtons[ii].mask = buttonMASK; - quitButtons[ii].text = "Yes"; - quitButtons[ii].textColor = onColor; - quitButtons[ii].xHalf = quitButtons[ii].buttonWidth/2; - quitButtons[ii].yHalf = quitButtons[ii].buttonHeight/2; - ++num; - - return(num); -} - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/save3d.c.pamphlet b/src/graph/view3d/save3d.c.pamphlet deleted file mode 100644 index a21d611..0000000 --- a/src/graph/view3d/save3d.c.pamphlet +++ /dev/null @@ -1,178 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d save3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _SAVE3D_C - -#include -#include -#include "header.h" -#include "cpanel.h" -#include "volume.h" -#include "../include/purty/volume.bitmap" -#include "../include/purty/volume.mask" - -#include "gfun.h1" -#include "xspadfill.h1" -#include "all-3d.h1" - -#define saveMASK ExposureMask -#define saveCursorForeground monoColor(55) -#define saveCursorBackground monoColor(197) -#define saveTitleColor monoColor(70) -#define saveButtonColor monoColor(195) -#define saveFontHeight (saveFont->max_bounds.ascent+saveFont->max_bounds.descent) - - -/*************************** - * int makeSavePanel() * - ***************************/ - -int -makeSavePanel(void) -{ - - int i; - XSetWindowAttributes saver,SaverAttrib; - XSizeHints sizeh; - Pixmap savebits, savemask; - XColor saveColor,sColor; - - savebits = XCreateBitmapFromData(dsply,rtWindow, volumeBitmap_bits, - volumeBitmap_width,volumeBitmap_height); - savemask = XCreateBitmapFromData(dsply,rtWindow,volumeMask_bits, - volumeMask_width,volumeMask_height); - saver.background_pixel = backgroundColor; - saver.border_pixel = foregroundColor; - saver.event_mask = saveMASK; - saver.colormap = colorMap; - saver.override_redirect = overrideManager; - saveColor.pixel = saveCursorForeground; - XQueryColor(dsply,colorMap,&saveColor); - sColor.pixel = saveCursorBackground; - XQueryColor(dsply,colorMap,&sColor); - saver.cursor = XCreatePixmapCursor(dsply,savebits,savemask, - &saveColor,&sColor, - volumeBitmap_x_hot,volumeBitmap_y_hot); - - saveWindow = XCreateWindow(dsply,control->controlWindow, - controlWidth-saveWidth-2, controlHeight-saveHeight-2, - saveWidth-2,saveHeight-2,2, - CopyFromParent,InputOutput,CopyFromParent, - controlCreateMASK,&saver); - - sizeh.flags = USPosition | USSize; - sizeh.x = 0; - sizeh.y = 0; - sizeh.width = saveWidth-2; - sizeh.height = saveHeight-2; - - XSetNormalHints(dsply,saveWindow,&sizeh); - XSetStandardProperties(dsply,saveWindow,"Save Panel","Save Panel", - None,NULL,0,&sizeh); - - /*** Create save buttons ***/ - initSaveButtons(control->buttonQueue); - for (i=saveButtonsStart; i<(saveButtonsEnd); i++) { - SaverAttrib.event_mask = (control->buttonQueue[i]).mask; - (control->buttonQueue[i]).self = - XCreateWindow(dsply,saveWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight, - 0,0,InputOnly,CopyFromParent, - buttonCreateMASK,&SaverAttrib); - XMakeAssoc(dsply,table,(control->buttonQueue[i]).self, - &((control->buttonQueue[i]).buttonKey)); - XMapWindow(dsply,(control->buttonQueue[i]).self); - } - - return(0); - -} /* makeSavePanel() */ - - -/**************************** - * void drawSavePanel() * - ****************************/ - -void -drawSavePanel(void) -{ - - char *s; - int i,strlength; - - GSetForeground(saveGC,(float)saveButtonColor,Xoption); - for (i=saveButtonsStart; i<(saveButtonsEnd); i++) { - GDraw3DButtonOut(saveGC,saveWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - s = (control->buttonQueue[i]).text; - strlength = strlen(s); - GSetForeground(trashGC, - (float)monoColor((control->buttonQueue[i]).textColor),Xoption); - GDrawString(trashGC,saveWindow, - (control->buttonQueue[i]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(processGC,(control->buttonQueue[i]).buttonHeight), - s,strlen(s),Xoption); - } /* for i in control->buttonQueue */ - -} /* drawSavePanel */ -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/savebut3d.c.pamphlet b/src/graph/view3d/savebut3d.c.pamphlet deleted file mode 100644 index a79ff4d..0000000 --- a/src/graph/view3d/savebut3d.c.pamphlet +++ /dev/null @@ -1,112 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d savebut3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _SAVEBUT3D_C - -#include "header.h" -#include "cpanel.h" - -#include "all-3d.h1" -int -initSaveButtons (buttonStruct *saveButtons) -{ - int ii; - int num = 0; - - ii = saveExit; - saveButtons[ii].buttonX = 5; - saveButtons[ii].buttonY = 7; - saveButtons[ii].buttonWidth = 53; - saveButtons[ii].buttonHeight = 25; - saveButtons[ii].buttonKey = ii; - saveButtons[ii].pot = no; - saveButtons[ii].mask = buttonMASK; - saveButtons[ii].text = "Cancel"; - saveButtons[ii].textColor = 6; - saveButtons[ii].xHalf = saveButtons[ii].buttonWidth/2; - saveButtons[ii].yHalf = saveButtons[ii].buttonHeight/2; - ++num; - - ii = pixmap; - saveButtons[ii].buttonX = 5; - saveButtons[ii].buttonY = 41; - saveButtons[ii].buttonWidth = 53; - saveButtons[ii].buttonHeight = 25; - saveButtons[ii].buttonKey = ii; - saveButtons[ii].pot = no; - saveButtons[ii].mask = buttonMASK; - saveButtons[ii].text = "Pixmap"; - saveButtons[ii].textColor = 28; - saveButtons[ii].xHalf = saveButtons[ii].buttonWidth/2; - saveButtons[ii].yHalf = saveButtons[ii].buttonHeight/2; - ++num; - - ii = ps; - saveButtons[ii].buttonX = 5; - saveButtons[ii].buttonY = 75; - saveButtons[ii].buttonWidth = 53; - saveButtons[ii].buttonHeight = 25; - saveButtons[ii].buttonKey = ii; - saveButtons[ii].pot = no; - saveButtons[ii].mask = buttonMASK; - saveButtons[ii].text = "PS"; - saveButtons[ii].textColor = 149; - saveButtons[ii].xHalf = saveButtons[ii].buttonWidth/2; - saveButtons[ii].yHalf = saveButtons[ii].buttonHeight/2; - - return(num); -} - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/smoothshade3d.c.pamphlet b/src/graph/view3d/smoothshade3d.c.pamphlet deleted file mode 100644 index 9ad7220..0000000 --- a/src/graph/view3d/smoothshade3d.c.pamphlet +++ /dev/null @@ -1,1055 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d smoothshade3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _SMOOTHSHADE_C - -#include -#include -#include - -#include "header.h" -#include "draw.h" -#include "volume.h" -#include "mode.h" /* for #define components */ - -#include "spadcolors.h1" -#include "gfun.h1" -#include "util.h1" -#include "xspadfill.h1" -#include "all-3d.h1" - -#define SAFE_VALUE 892347 - - - - - - -char -get_cBuffer_axes(int ix) -{ - if( ix >=0 && ix =0 && ix =0 && ix =0 && ix =0 && ix data[ix] = val; -} - - - - -/*************************** - * void drawPhongSpan() * - * * - * This routine sets the * - * buffer values for each * - * span of pixels which * - * intersect the current * - * scanline. * - ***************************/ -void -drawPhongSpan(triple pt,float N[3],int dFlag) -{ - int xpixel,hue,shade; - float colorindx, col; - triple hs; - - - /* negative values of xleft and xright have been pushed to machine0 */ - - xpixel = (int)xleft; - - - while (xpixel <= (int)xright) { - /* if z is closer to viewer than value in zBuffer continue */ - if ( (zC < get_zBuffer(xpixel)) ) { - /* get the intensity for current point */ - col = phong(pt,N); - put_cBuffer_axes(xpixel,'0'); - put_zBuffer(xpixel,zC); - /* if mono (bw dsply) do black and white semi-random dithering */ - if (mono || (dFlag == PSoption) || viewport->monoOn) { - if (get_random() < 100.0*exp((double)-1.3*(pi_sq*(col-.2)*(col-.2)))) { - put_cBuffer_indx(xpixel,black); - } else { - put_cBuffer_indx(xpixel,white); - } - } else { - /* glossy shading for one hue else dithered for many hues */ - if (viewport->hueOffset == viewport->hueTop && !smoothError) { - colorindx = (float)(smoothConst+1) * col; - if (colorindx > (smoothConst+1)) colorindx = smoothConst+1; - put_cBuffer_indx(xpixel,XPixelColor((int)colorindx-1)); - } else { /* probabalistic multi-hued dithering */ - hs = norm_dist(); - hue = (int)(intersectColor[0]+hs.x/20.0); - /* cannot dither out of color map range */ - if (viewport->hueOffset < viewport->hueTop) { - if (hue < viewport->hueOffset) - hue = viewport->hueOffset; - else { - if (hue > viewport->hueTop) - hue = viewport->hueTop; - } - } else { - if (hue < viewport->hueTop) - hue = viewport->hueTop; - else { - if (hue > viewport->hueOffset) - hue = viewport->hueOffset; - } - } - col += hs.y/6.0; /* perturb intensity */ - if (col > 1.0) put_cBuffer_indx(xpixel,white); - else { - if (col < 0.0) put_cBuffer_indx(xpixel,black); - else { - shade = (int)(col * 4.0); - put_cBuffer_indx(xpixel,XSolidColor(hue,shade)); - } - } - } - } - } /* zC < zBuffer */ - zC += dzdx; - if (viewport->hueOffset != viewport->hueTop || smoothError || - viewport->monoOn) - intersectColor[0] += dcolor; - N[0] += dnorm.x; N[1] += dnorm.y; N[2] += dnorm.z; - pt.x += dpt.x; pt.y += dpt.y; pt.z += dpt.z; - xpixel++; - } /* while each pixel */ - -} - - -/*************************** - * void scanPhong() * - * * - * This routine takes all * - * polygons that intersect * - * with the current scan- * - * line and calculates the * - * intersecting x and z * - * points as well as the * - * color at each point. * - * Interpolation is done * - * according to Phong. * - ***************************/ - -void -scanPhong(int dFlag) -{ - viewTriple *p1, *p2; - polyList *polygon; - poly *p; - int i,num,xtemp,numttt; - int *anIndex, *start, *end; - float x1,x2,y1,y2,z2,zright,wx1,wx2,wy1,wy2,wz1,wz2; - float intersectionx[2], intersectionz[2]; - float c1,c2,colortemp,ztemp,dY,diffy,diffx,n1[3],n2[3],NV[3]; - triple ntemp, intersectPt[2], ptemp, pt, intersectN[2]; - - /* polygon list intersecting the current scanline, will be modified to - edge list structure */ - polygon = scanList[scanline]; - while (polygon != NIL(polyList) && polygon->polyIndx != NIL(poly) ) { - /* for each polygon in the list */ - p = polygon->polyIndx; - /* don't include clipped polygons */ - if ( ! ( p->partialClipPz || - p->totalClipPz || - (viewData.clipStuff && (p->partialClip || p->totalClip ) ) ) ) { - num = 0; /* 0 & 1, for the 2 edges of polygon that intersect scanline */ - numttt =0; - - if ((scanline >= (int)p->pymin) && (scanline <= (int)p->pymax)) { - /* which edges of the polygon intersect the scanline */ - for (i=0, anIndex=p->indexPtr; inumpts; i++) { - start = anIndex + i; - p1 = refPt3D(viewData,*(start)); - x1 = p1->px; y1 = p1->py; zC = p1->pz; c1 = p1->sc; -/* if (x1 < machine0){ x1 = machine0; } */ - wx1 = p1->wx; wy1 = p1->wy; wz1 = p1->wz; - n1[0] = p1->norm[0]; n1[1] = p1->norm[1]; n1[2] = p1->norm[2]; - end = (i != (p->numpts - 1)) ? anIndex + (i + 1) : anIndex; - p2 = refPt3D(viewData,*(end)); - x2 = p2->px; y2 = p2->py; z2 = p2->pz; c2 = p2->sc; -/* if (x2 < machine0){ x2 = machine0; } */ - wx2 = p2->wx; wy2 = p2->wy; wz2 = p2->wz; - n2[0] = p2->norm[0]; n2[1] = p2->norm[1]; n2[2] = p2->norm[2]; - /* find beginning and end for intersecting edge */ - if ((scanline < y1 && scanline >= y2) || - (scanline >= y1 && scanline < y2)) { - dY = (float)scanline - y1; - diffy = y2 - y1; - if (absolute(diffy) < 0.01) diffy = 1.0; - intersectionx[num] = x1 + ((x2-x1)/diffy) * dY; - intersectionz[num] = zC + ((z2-zC)/diffy) * dY; - if (viewport->hueOffset != viewport->hueTop || smoothError || - viewport->monoOn) - intersectColor[num] = c1 + ((c2 - c1)/diffy) * dY; - intersectN[num].x = n1[0] + ((n2[0] - n1[0])/diffy)*dY; - intersectN[num].y = n1[1] + ((n2[1] - n1[1])/diffy)*dY; - intersectN[num].z = n1[2] + ((n2[2] - n1[2])/diffy)*dY; - intersectPt[num].x = wx1 + ((wx2 - wx1)/diffy)*dY; - intersectPt[num].y = wy1 + ((wy2 - wy1)/diffy)*dY; - intersectPt[num].z = wz1 + ((wz2 - wz1)/diffy)*dY; - num = 1-num; - numttt++; - } /* if edge intersects scanline */ - } /* for each edge */ - if (numttt>=2) { /* if numttt 0 or 1 something has gone wrong */ - xleft = intersectionx[0]; xright = intersectionx[1]; - zC = intersectionz[0]; zright = intersectionz[1]; - /* edges are drawn from left to right, so switch if necessary */ - if (xright < xleft) { - xtemp = xright; xright = xleft; xleft = xtemp; - ztemp = zright; zright = zC; zC = ztemp; - if (viewport->hueOffset != viewport->hueTop || smoothError || - viewport->monoOn) { - colortemp = intersectColor[1]; - intersectColor[1] = intersectColor[0]; - intersectColor[0] = colortemp; - } - ntemp = intersectN[1]; intersectN[1] = intersectN[0]; - intersectN[0] = ntemp; - ptemp = intersectPt[1]; - intersectPt[1] = intersectPt[0]; - intersectPt[0] = ptemp; - } - diffx = xright - xleft; - if (absolute(diffx) > .01) { - if (viewport->hueOffset != viewport->hueTop || smoothError || - viewport->monoOn) - dcolor = (intersectColor[1] - intersectColor[0]) / diffx; - dnorm.x = (intersectN[1].x - intersectN[0].x) / diffx; - dnorm.y = (intersectN[1].y - intersectN[0].y) / diffx; - dnorm.z = (intersectN[1].z - intersectN[0].z) / diffx; - dpt.x = (intersectPt[1].x - intersectPt[0].x) / diffx; - dpt.y = (intersectPt[1].y - intersectPt[0].y) / diffx; - dpt.z = (intersectPt[1].z - intersectPt[0].z) / diffx; - dzdx = (zright - zC) / diffx; - } else { - if (viewport->hueOffset != viewport->hueTop || smoothError || - viewport->monoOn) - dcolor = intersectColor[1]; - dnorm.x = 0.0; dnorm.y = 0.0; dnorm.z = 0.0; - dpt.x = 0.0; dpt.y = 0.0; dpt.z = 0.0; - dzdx = 0.0; - } - NV[0] = intersectN[0].x; - NV[1] = intersectN[0].y; - NV[2] = intersectN[0].z; - pt.x = intersectPt[0].x; - pt.y = intersectPt[0].y; - pt.z = intersectPt[0].z; - drawPhongSpan(pt,NV,dFlag); - } /* numttt guard */ - } /* if scanline intersect */ - } /* clipped */ - polygon = polygon->next; - } /* while still polygons */ - -} - -/******************************************** - * boxTObuffer() writes the projection of * - * the x,y bounding box to the z-buffer. * - ********************************************/ - -void -boxTObuffer(void) -{ - int xpix,i,j,k,count,decision; - int xA,xB,yA,yB; - float x,xend,y,yend,diffy,dX,dY,dXY,intersectionx; - - for (i=0;i<6;i++) { - if (box[i].inside) { - for (j=0; j<3; j++) { - quadMesh[j].x = box[i].pointsPtr[j]->px; - quadMesh[j].y = box[i].pointsPtr[j]->py; - } - - intersectionx = 0.0; - for (k=0; k<2; k++) { - xA = quadMesh[k].x; yA = quadMesh[k].y; - xB = quadMesh[k+1].x; yB = quadMesh[k+1].y; - -/* - if (xA > graphWindowAttrib.width+1) xA = graphWindowAttrib.width+1; - if (xB > graphWindowAttrib.width+1) xB = graphWindowAttrib.width+1; - if (yA > graphWindowAttrib.height) yA = graphWindowAttrib.height; - if (yB > graphWindowAttrib.height) yB = graphWindowAttrib.height; - if (xA < 0) xA = 0; if (xB < 0) xB = 0; - if (yA < 0) yA = 0; if (yB < 0) yB = 0; -*/ - x = xA; xend = xB; y = yA; yend = yB; - diffy = (float)scanline - y; - dX = xend - x; dY = yend - y; - if (absolute(dY) > machine0) { - dXY = dX/dY; - } else { - dXY = dX; - } - - if (dXY < 0.0) dXY = -dXY; - - if ((scanline == (int)y) && (absolute(dY) <= 1.0)) { - if (x <= xend) { - for (xpix = (int)x; xpix <= (int)xend; xpix++) { - put_cBuffer_axes(xpix,'b'); - } - } else { - for (xpix = (int)x; xpix >= (int)xend; xpix--) { - put_cBuffer_axes(xpix,'b'); - } - } - } else { - if (xend < x) - decision = (scanline < y && scanline >= yend) || - (scanline > y && scanline <= yend); - else - decision = (scanline <= y && scanline > yend) || - (scanline >= y && scanline < yend); - if (decision) { - intersectionx = x + dX/dY * diffy; - for (count = (int)intersectionx; - count <= (int)intersectionx + (int)dXY; count++) { - put_cBuffer_axes(count,'b'); - } - } - } - } - - } - } - -} - -/******************************************** - * clipboxTObuffer() writes the projection * - * of the x,y,z clipping region box to the * - * z-buffer. * - ********************************************/ - -void -clipboxTObuffer(void) -{ - int xpix,i,j,k,count,decision; - int xA,xB,yA,yB; - float x,xend,y,yend,diffy,dX,dY,dXY,intersectionx; - - for (i=0;i<6;i++) { - if (clipBox[i].inside) { - for (j=0; j<3; j++) { - quadMesh[j].x = clipBox[i].pointsPtr[j]->px; - quadMesh[j].y = clipBox[i].pointsPtr[j]->py; - } - - intersectionx = 0.0; - for (k=0; k<2; k++) { - xA = quadMesh[k].x; yA = quadMesh[k].y; - xB = quadMesh[k+1].x; yB = quadMesh[k+1].y; -/* - - if (xA > graphWindowAttrib.width+1) xA = graphWindowAttrib.width+1; - if (xB > graphWindowAttrib.width+1) xB = graphWindowAttrib.width+1; - if (yA > graphWindowAttrib.height) yA = graphWindowAttrib.height; - if (yB > graphWindowAttrib.height) yB = graphWindowAttrib.height; - if (xA < 0) xA = 0; if (xB < 0) xB = 0; - if (yA < 0) yA = 0; if (yB < 0) yB = 0; -*/ - x = xA; xend = xB; y = yA; yend = yB; - diffy = (float)scanline - y; - dX = xend - x; dY = yend - y; - if (absolute(dY) > machine0) { - dXY = dX/dY; - } else { - dXY = dX; - } - if (dXY < 0.0) dXY = -dXY; - - if ((scanline == (int)y) && (absolute(dY) <= 1.0)) { - if (x <= xend) { - for (xpix = (int)x; xpix <= (int)xend; xpix++) { - put_cBuffer_axes(xpix,'c'); - } - } else { - for (xpix = (int)x; xpix >= (int)xend; xpix--) { - put_cBuffer_axes(xpix,'c'); - } - } - } else { - if (xend < x) - decision = (scanline < y && scanline >= yend) || - (scanline > y && scanline <= yend); - else - decision = (scanline <= y && scanline > yend) || - (scanline >= y && scanline < yend); - if (decision) { - intersectionx = x + dX/dY * diffy; - for (count = (int)intersectionx; - count <= (int)intersectionx + (int)dXY; count++) { - put_cBuffer_axes(count,'c'); - } - } - } - } - - } - } - -} - - - -/******************************************** - * axesTObuffer() writes the projection of * - * the x,y,z axes to the z-buffer. * - ********************************************/ - -void -axesTObuffer(void) -{ - int xpix,i,count,decision; - int xA,xB,yA,yB; - float x,xend,y,yend,diffy,dX,dY,dXY,intersectionx; - float zA,zB,z,zend; - float dZ,dZX,dZY,intersectionz; - - intersectionz = 0.0; intersectionx = 0.0; - for (i=0; i<3; i++) { - xA = axesXY[i][0]; yA = axesXY[i][1]; zA = axesZ[i][0]; - xB = axesXY[i][2]; yB = axesXY[i][3]; zB = axesZ[i][1]; -/* - if (xA > graphWindowAttrib.width+1) xA = graphWindowAttrib.width+1; - if (xB > graphWindowAttrib.width+1) xB = graphWindowAttrib.width+1; - if (yA > graphWindowAttrib.height) yA = graphWindowAttrib.height; - if (yB > graphWindowAttrib.height) yB = graphWindowAttrib.height; - if (xA < 0) xA = 0; if (xB < 0) xB = 0; - if (yA < 0) yA = 0; if (yB < 0) yB = 0; -*/ - x = xA; xend = xB; y = yA; yend = yB; z = zA; zend = zB; - diffy = (float)scanline - y; - dX = xend - x; dY = yend - y; dZ = zend - z; - dZY = dZ/dY; - dXY = dX/dY; - if (dXY < 0.0) dXY = -dXY; - dZX = dZ/dX; - - if ((scanline == (int)y) && (absolute(dY) <= 1.0)) { - if (x <= xend) { - for (xpix = (int)x; xpix <= (int)xend; xpix++) { - put_cBuffer_axes(xpix,'a'); - put_zBuffer(xpix,z + dZY * diffy); - } /* for x */ - } else { - for (xpix = (int)x; xpix >= (int)xend; xpix--) { - put_cBuffer_axes(xpix,'a'); - put_zBuffer(xpix,z + dZY * diffy); - } /* for x */ - } - } else { - if (xend < x) - decision = (scanline < y && scanline >= yend) || - (scanline > y && scanline <= yend); - else - decision = (scanline <= y && scanline > yend) || - (scanline >= y && scanline < yend); - if (decision) { - intersectionx = x + dX/dY * diffy; - intersectionz = z + dZY * diffy; - for (count = (int)intersectionx; - count <= (int)intersectionx + (int)dXY; count++) { - put_cBuffer_axes(count,'a'); - put_zBuffer(count,intersectionz); - intersectionz += dZX; - } - } /* if edge intersects scanline */ - } - } /* for each axes */ - -} - -/******************************************** - * scanLines() scanline z-buffer algorithm * - * initialize z-buffer and color buffer for * - * all scanlines. * - ********************************************/ - -void -scanLines(int dFlag) -{ - unsigned long pixColor; - int i; - char tempA; - - if (dFlag == Xoption) { - if (viewmap_valid) { - XFreePixmap(dsply,viewmap); - viewmap_valid=0; - } - viewmap = XCreatePixmap(/* display */ dsply, - /* drawable */ viewport->viewWindow, - /* width */ vwInfo.width, - /* height */ vwInfo.height, - /* depth */ DefaultDepth(dsply,scrn)); - viewmap_valid =1; - GSetForeground(trashGC,(float)backgroundColor,dFlag); - XFillRectangle(dsply,viewmap,trashGC,0,0,vwInfo.width,vwInfo.height); - XFillRectangle(dsply,viewport->viewWindow,trashGC,0,0, - vwInfo.width,vwInfo.height); - } else { - GSetForeground(GC9991, - 1.0-(float)((int)(psShadeMax-0.3*psShadeMax)-1)*psShadeMul,dFlag); - quadMesh[0].x = 0; quadMesh[0].y = 0; - quadMesh[1].x = graphWindowAttrib.width+2; - quadMesh[1].y = 0; - quadMesh[2].x = graphWindowAttrib.width+2; - quadMesh[2].y = graphWindowAttrib.height; - quadMesh[3].x = 0; - quadMesh[3].y = graphWindowAttrib.height; - quadMesh[4].x = 0; quadMesh[4].y = 0; - PSFillPolygon(GC9991, quadMesh, 5); - } - - if (graphWindowAttrib.height >= physicalHeight) - graphWindowAttrib.height = physicalHeight - 1; - if (graphWindowAttrib.width >= physicalWidth) - graphWindowAttrib.width = physicalWidth - 1; - if (dFlag == Xoption) - strcpy(control->message," Display Scanlines "); - else - strcpy(control->message," Writing Output "); - writeControlMessage(); - - scanline = graphWindowAttrib.height-1; - - imageX = XCreateImage(/* display */ dsply, - /* visual */ DefaultVisual(dsply,scrn), - /* depth */ DefaultDepth(dsply,scrn), - /* format */ ZPixmap, - /* offset */ 0, - /* data */ 0, - /* width */ vwInfo.width, - /* height */ 1, - /* bitmap_pad */ 32, - /* bytes_per_line */ 0); - imageX->data = (char *)malloc(imageX->bytes_per_line); - - - while (scanline >= 0 && keepDrawingViewport()) { - /* initialize buffer values for scanline */ - pixColor = backgroundColor; - for (i=0; i < (int)graphWindowAttrib.width; i++) { - put_zBuffer(i,10000.0); - put_cBuffer_indx(i,-1); - put_cBuffer_axes(i,'0'); - if (mono || viewport->monoOn) - if ((scanline % 2) == 0) - if ((i % 2) == 0) { - if (i>=0 && i=0 && i=0 && i=0 && i=0 && iaxesOn) axesTObuffer(); - - /* fill buffers for current scanline */ - scanPhong(dFlag); - - for (i=0; i < (int)graphWindowAttrib.width; i++) { - /* include bounding region info */ - if (viewData.box) { - if (get_cBuffer_axes(i) == 'b') { - if (dFlag==Xoption) { - if (mono || (viewport->monoOn)) pixColor = foregroundColor; - else pixColor = boxInline; - if (i >=0 && iviewWindow, GC9991, i,scanline,dFlag); - } - } - } - /* include clipping box info */ - if (viewData.clipbox) { - if (get_cBuffer_axes(i)== 'c') { - if (dFlag==Xoption) { - if (mono || (viewport->monoOn)) pixColor = foregroundColor; - else pixColor = clipBoxInline; - if (i >=0 && iviewWindow, GC9991, i,scanline,dFlag); - } - } - } - /* include axes info */ - if (viewport->axesOn) { - if (get_cBuffer_axes(i) == 'a') { - if (dFlag == Xoption) { - if (mono || (viewport->monoOn)) pixColor = foregroundColor; - else pixColor = monoColor(axesColor); - if (i >=0 && iviewWindow, GC9991, i,scanline,dFlag); - } - } /* if buffer slot is an axes point */ - tempA = get_cBuffer_axes(i); - } else tempA = '0'; /* else axes not on */ - - if (get_cBuffer_indx(i) >= 0 && (tempA == '0')) { - if (dFlag == Xoption) { - GSetForeground(trashGC,(float)get_cBuffer_indx(i),dFlag); - pixColor = get_cBuffer_indx(i); - if (i >=0 && iviewWindow, GC9991, i,scanline,dFlag); - } - } - } /* for each pixel in scanline */ - - if (dFlag == Xoption) { - XPutImage(dsply,viewport->viewWindow,trashGC,imageX,0,0,0, - scanline,vwInfo.width,1); - XPutImage(dsply,viewmap,trashGC,imageX,0,0,0, - scanline,vwInfo.width,1); - } - - scanline--; - - } /* while each scanline */ - XDestroyImage(imageX); - -} - -/************************************* - * void freePolyList(); * - * * - * frees up the global scanList l-l * - *************************************/ - -void -freePolyList (void) -{ - polyList *P, *nextP; - int i; - - for (i = 0; (i < ARRAY_HEIGHT); i++) { - P = scanList[i]; - while((P != NIL(polyList))) { - nextP = P->next; - free(P); - P = nextP; - } - } - -} /* freePolyList() */ - - -/******************************************** - * showAxesLabels() writes the axes labels * - * onto the viewmap of a graph. * - ********************************************/ - -void -showAxesLabels(int dFlag) -{ - int xcoord2,ycoord2; - - if (dFlag == Xoption) - if (mono || (viewport->monoOn)) - GSetForeground(globGC,(float)foregroundColor,dFlag); - else - GSetForeground(globGC,(float)monoColor(labelColor),dFlag); - else GSetForeground(GC9991,psBlack,dFlag); - - /* axes label for X */ - if ((int)axesZ[0][0] >= (int)axesZ[0][2]) { - if (axesXY[0][2] < axesXY[0][0]) xcoord2 = axesXY[0][2]-5; - else xcoord2 = axesXY[0][2] + 5; - if (axesXY[0][3] < axesXY[0][1]) ycoord2 = axesXY[0][3]-5; - else ycoord2 = axesXY[0][3] + 5; - if (!viewport->yzOn) { - if (dFlag == Xoption) - GDrawString(globGC,viewmap,xcoord2,ycoord2,"X",1,dFlag); - else - GDrawString(GC9991,viewport->viewWindow,xcoord2,ycoord2,"X",1,dFlag); - } - } - - /* axes label for Y */ - if ((int)axesZ[1][0] >= (int)axesZ[1][1]) { - if (axesXY[1][2] < axesXY[1][0]) xcoord2 = axesXY[1][2]-5; - else xcoord2 = axesXY[1][2] + 5; - if (axesXY[1][3] < axesXY[1][1]) ycoord2 = axesXY[1][3]-5; - else ycoord2 = axesXY[1][3] + 5; - if (!viewport->xzOn) { - if (dFlag == Xoption) - GDrawString(globGC,viewmap,xcoord2,ycoord2,"Y",1,dFlag); - else - GDrawString(GC9991,viewport->viewWindow,xcoord2,ycoord2,"Y",1,dFlag); - } - } - - /* axes label for Z */ - if ((int)axesZ[2][0] >= (int)axesZ[2][1]) { - if (axesXY[2][2] < axesXY[2][0]) xcoord2 = axesXY[2][2]-5; - else xcoord2 = axesXY[2][2] + 5; - if (axesXY[2][3] < axesXY[2][1]) ycoord2 = axesXY[2][3]-5; - else ycoord2 = axesXY[2][3] + 5; - if (!viewport->xyOn) { - if (dFlag == Xoption) - GDrawString(globGC,viewmap,xcoord2,ycoord2,"Z",1,dFlag); - else - GDrawString(GC9991,viewport->viewWindow,xcoord2,ycoord2,"Z",1,dFlag); - } - } -} - - - -/******************************************** - * changeColorMap() modifies the color map * - * for moving in and out of smooth shading. * - ********************************************/ - -void -changeColorMap(void) -{ - int okay, i, hue, *index; - poly *cp; - viewTriple *pt; - - strcpy(control->message," Make New Color Map "); - writeControlMessage(); - if ((viewport->hueOffset == viewport->hueTop) && - !mono && !viewport->monoOn) { - - /* colormap is not an even distribution across spectrum */ - /* see spadcolors.c code to understand why this is done */ - - if (viewport->hueTop < 11) smoothHue = viewport->hueTop * 6; - else - if (viewport->hueTop > 10 && viewport->hueTop < 16) { - smoothHue = viewport->hueTop*20 - 140; - } - else { - smoothHue = viewport->hueTop*12 - 12; - } - - if (redoColor) { - /* reallocate colormap for new hue */ - redoColor = no; - if (pixelSetFlag) { - FreePixels(dsply,colorMap,smoothConst+1); - } - okay = makeNewColorMap(dsply,colorMap,smoothHue); - if (okay) { - pixelSetFlag = yes; - smoothError = no; } - else { - pixelSetFlag = no; - smoothError = yes; } - } /* if redoColor */ - } else { - redoDither = no; - if (pixelSetFlag && !mono) { - FreePixels(dsply,colorMap,smoothConst); - pixelSetFlag = no; - redoColor = no; - multiColorFlag = yes; - } - if (!mono && !viewport->monoOn) { - cp = quickList; - while (cp != NIL(poly) && keepDrawingViewport()) { - for (i = 0, index = cp->indexPtr; - i < cp->numpts; i++, index++) { - pt = refPt3D(viewData,*(index)); - /* get hue for each point if multi-dithering is used */ - if (absolute(cp->color) > 1.0) - hue = floor(absolute(cp->color)); - else - hue = floor(absolute(cp->color) * viewport->numberOfHues) + - viewport->hueOffset; - pt->sc = (float)hue; - } /* for each point in polygon */ - cp = cp->next; - } - } /* multi-color dither */ - } /* else hueOffset != hueTop */ -} - - -/*********************** - * void drawPhong() * - * * - * A general routine * - * for displaying a * - * list of polygons * - * using a simple * - * scanline z-buffer * - * algorithm with * - * phong shading. * - ***********************/ - -void -drawPhong(int dFlag) -{ - - poly *p, *head; - polyList *s; - int i,j,hue; - int *anIndex, redo; - viewTriple *aPoint, *polyPt; - - redo = (recalc || redoSmooth); - if (redo || redoColor || redoDither) { - rotated = no; zoomed = no; translated = no; - switchedPerspective = no; changedEyeDistance = no; - redoSmooth = no; movingLight = no; - - /* If only a color change don't recalculate polygon info. */ - if (!redo) { - /* glossy shading if a single hue is indicated */ - changeColorMap(); - scanLines(dFlag); - /* if axes are on then show axes labels */ - if (viewport->axesOn) showAxesLabels(dFlag); - - /* show pixmap of image */ - XCopyArea(dsply,viewmap,viewport->viewWindow,trashGC,0,0, - vwInfo.width,vwInfo.height,0,0); - } else { - if (keepDrawingViewport()) { - if (!firstTime && !(scanline > 0)) { - strcpy(control->message," Freeing Polygons "); - writeControlMessage(); - freeListOfPolygons(quickList); - freePointResevoir(); - } - if (keepDrawingViewport()) { - strcpy(control->message," Collecting Polygons "); - writeControlMessage(); - quickList = copyPolygons(viewData.polygons); - - if (keepDrawingViewport()) { - strcpy(control->message," Projecting Polygons "); - writeControlMessage(); - projectAllPolys(quickList); - if (keepDrawingViewport()) { - strcpy(control->message, - " Setting Polygon Extremes "); - writeControlMessage(); - minMaxPolygons(quickList); - if (keepDrawingViewport()) { - strcpy(control->message, - " Sorting Polygons "); - writeControlMessage(); - quickList = msort(quickList,0,viewData.numPolygons, - polyCompare); - calcEyePoint(); - head = p = quickList; - - /* glossy shading if a single hue is indicated */ - changeColorMap(); - - for (i=0, aPoint=viewData.points; - inorm[0]= 0.0; - aPoint->norm[1]= 0.0; - aPoint->norm[2]= 0.0; - } - freePolyList(); - for (i = 0; i < ARRAY_HEIGHT; i++) - scanList[i] = NIL(polyList); - /* for each polygon */ - /* calculate average normal for each vertex */ - strcpy(control->message, - " Build Polygon Lists "); - writeControlMessage(); - p = head; - while ((p != NIL(poly)) && keepDrawingViewport()) { - - for (j = 0, anIndex = p->indexPtr; - j < p->numpts; j++, anIndex++) { - polyPt = refPt3D(viewData,*(anIndex)); - polyPt->norm[0] += p->N[0]; - polyPt->norm[1] += p->N[1]; - polyPt->norm[2] += p->N[2]; - normalizeVector(polyPt->norm); - /* get hue for each point if multi-dithering is used */ - if ((viewport->hueOffset != viewport->hueTop || - smoothError) && !mono) { - if (absolute(p->color) > 1.0) { - hue = floor(absolute(p->color)); - } else { - hue = floor(absolute(p->color) * - viewport->numberOfHues) + - viewport->hueOffset; - } - polyPt->sc = (float)hue; - } /* multi-color dither */ - } /* for each point in polygon */ - - if ( ! ( p->partialClipPz || - p->totalClipPz || - (viewData.clipStuff && (p->partialClip || p->totalClip ) ) ) ) { - /* put polygon in each scanline list it intersects */ - for (i=(int)p->pymin; i<= (int)p->pymax; i++) { - if ( (i>=0) && (ipolyIndx = p; - s->next = scanList[i]; - scanList[i] = s; - } - } /* put polygon in each scanline it intersects */ - } /* if polygon not clipped */ - p = p->next; - } /* while still polygons */ - - scanLines(dFlag); - - /* if axes are on then show axes labels */ - if (viewport->axesOn) showAxesLabels(dFlag); - - /* show pixmap of image */ - XCopyArea(dsply,viewmap,viewport->viewWindow,trashGC,0,0, - vwInfo.width,vwInfo.height,0,0); - /* freePolyList(scanList); */ - - } /* keepDrawingViewport() after setting extreme values */ - } /* keepDrawingViewport() after projecting all polygons */ - } /* keepDrawingViewport() after collecting polygons */ - } /* keepDrawingViewport() after freeing polygons */ - } /* keepDrawingViewport() after recalc */ - finishedList = !(scanline>0); - if (firstTime) firstTime = no; - } /* not only a color change */ - - } else { /* else just redisplay current pixmap of image */ - XCopyArea(dsply,viewmap,viewport->viewWindow,trashGC,0,0, - vwInfo.width,vwInfo.height,0,0); - } - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - -} /* drawPhong */ - - - - - - - - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/spadaction3d.c.pamphlet b/src/graph/view3d/spadaction3d.c.pamphlet deleted file mode 100644 index 8786eb3..0000000 --- a/src/graph/view3d/spadaction3d.c.pamphlet +++ /dev/null @@ -1,414 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d spadaction3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _SPADACTION3D_C - -#include -#include -#include - -#include "header.h" -#include "process.h" -#include "draw.h" - -#include "util.h1" -#include "all-3d.h1" - -int -readViewman (void *info,int size) -{ - int m = 0; - - sprintf(errorStr,"%s","read from viewport manager\n"); - m = check(read( 0, info, size)); - - return(m); - -} -void -scalePoint (viewTriple *p) -{ - - p->x *= viewData.scaleToView; - p->y *= viewData.scaleToView; - p->z *= viewData.scaleToView; - - if (viewData.cmin != viewData.cmax) - p->c = (p->c - viewData.cmin)/(viewData.cmax-viewData.cmin); - if (p->c > 1.0) p->c = 1.0; - else if (p->c < 0) p->c = 0.0; - -} /* scalePoint */ - - -/******************** - * int spadAction() * - ********************/ - -int -spadAction (void) -{ - int code, viewCommand; - float f1, f2, f3; - int i1, i2, i3; - - - if (viewAloned==yes) { - close(0); - return(-1); - } - readViewman(&viewCommand, intSize); - - switch (viewCommand) { - - case rotate: - readViewman(&f1, floatSize); - readViewman(&f2, floatSize); - viewport->theta = f1; - viewport->phi = f2; - while (viewport->theta >= two_pi) viewport->theta -= two_pi; - while (viewport->theta < 0.0) viewport->theta += two_pi; - while (viewport->phi > pi) viewport->phi -= two_pi; - while (viewport->phi <= -pi) viewport->phi += two_pi; - viewport->axestheta = viewport->theta; - viewport->axesphi = viewport->phi; - spadDraw=yes; - rotated=yes; - viewport->yzOn = viewport->xzOn = viewport->xyOn = no; - - break; - - case zoom: - readViewman(&f1, floatSize); - viewport->scale = f1; - if (viewport->scale > maxScale) viewport->scale = maxScale; - else if (viewport->scale < minScale) viewport->scale = minScale; - - spadDraw=yes; - zoomed = yes; - break; - - case zoomx: - readViewman(&f1, floatSize); - readViewman(&f2, floatSize); - readViewman(&f3, floatSize); - viewport->scaleX = f1; viewport->scaleY = f2; viewport->scaleZ = f3; - if ((viewport->scaleX == 1.0) && - (viewport->scaleY == 1.0) && - (viewport->scaleZ == 1.0)) { - viewport->zoomXOn = viewport->zoomYOn = viewport->zoomZOn = yes; - } else { - if (viewport->scaleX == 1.0) viewport->zoomXOn = no; - else { - if (viewport->scaleX > maxScale) viewport->scaleX = maxScale; - else if (viewport->scaleX < minScale) viewport->scaleX = minScale; - } - if (viewport->scaleY == 1.0) viewport->zoomYOn = no; - else { - if (viewport->scaleY > maxScale) viewport->scaleY = maxScale; - else if (viewport->scaleY < minScale) viewport->scaleY = minScale; - } - if (viewport->scaleZ == 1.0) viewport->zoomZOn = no; - else { - if (viewport->scaleZ > maxScale) viewport->scaleZ = maxScale; - else if (viewport->scaleZ < minScale) viewport->scaleZ = minScale; - } - } - - spadDraw=yes; - zoomed = yes; - break; - - case translate: - readViewman(&(viewport->deltaX),floatSize); - readViewman(&(viewport->deltaY),floatSize); - if (viewport->deltaX > maxDeltaX) viewport->deltaX = maxDeltaX; - else if (viewport->deltaX < -maxDeltaX) viewport->deltaX = -maxDeltaX; - if (viewport->deltaY > maxDeltaY) viewport->deltaY = maxDeltaY; - else if (viewport->deltaY < -maxDeltaY) viewport->deltaY = -maxDeltaY; - spadDraw=yes; - translated = yes; - break; - - case modifyPOINT: - readViewman(&i1,intSize); - i1--; - readViewman(&(refPt3D(viewData,i1)->x),floatSize); - readViewman(&(refPt3D(viewData,i1)->y),floatSize); - readViewman(&(refPt3D(viewData,i1)->z),floatSize); - readViewman(&(refPt3D(viewData,i1)->c),floatSize); - scalePoint(refPt3D(viewData,i1)); - spadDraw=yes; - break; - - case hideControl: - readViewman(&i1,intSize); - if (i1) { /* show control panel */ - if (viewport->haveControl) - XUnmapWindow(dsply,control->controlWindow); - putControlPanelSomewhere(someInt); - } else { /* turn off control panel */ - if (viewport->haveControl) { - viewport->haveControl = no; - XUnmapWindow(dsply,control->controlWindow); - } - } - break; - - case axesOnOff: - readViewman(&i1,intSize); - viewport->axesOn = i1; - spadDraw=yes; - if (viewData.style == smooth) { - if (multiColorFlag) redoDither = yes; - else redoColor = yes; - } - if (viewport->haveControl) drawControlPanel(); - break; - -/* Non-uniform scaling is not in AXIOM yet. */ -/* Neither is object or origin rotation. */ - - case perspectiveOnOff: - readViewman(&i1,intSize); - viewData.perspective = i1; - switchedPerspective = yes; - spadDraw=yes; - break; - - case region3D: - readViewman(&i1,intSize); - viewport->regionOn = i1; - viewData.box = i1; - spadDraw=yes; - if (viewport->haveControl) drawControlPanel(); - redoSmooth = yes; - break; - - case clipRegionOnOff: - readViewman(&i1,intSize); - viewData.clipbox = i1; - spadDraw=yes; - break; - - case clipSurfaceOnOff: - readViewman(&i1,intSize); - viewData.clipStuff = i1; - spadDraw=yes; - break; - - case eyeDistanceData: - readViewman(&f1,floatSize); - viewData.eyeDistance = f1; - if (viewData.eyeDistance > maxEyeDistance) - viewData.eyeDistance = maxEyeDistance; - else if (viewData.eyeDistance < minEyeDistance) - viewData.eyeDistance = minEyeDistance; - spadDraw=yes; - changedEyeDistance = yes; - break; - - case hitherPlaneData: - readViewman(&f1,floatSize); - viewData.clipPlane = f1; - spadDraw=yes; - changedEyeDistance = yes; - break; - - case colorDef: - readViewman(&(viewport->hueOffset),intSize); - readViewman(&(viewport->numberOfHues),intSize); - /* spadcolors is indexed by 0 */ - viewport->hueOffset --; - viewport->numberOfHues --; - viewport->hueTop = viewport->numberOfHues; - if (viewport->hueOffset < 0) viewport->hueOffset = 0; - if (viewport->hueTop < 0) viewport->hueTop = 0; - if (viewport->hueOffset >= totalHues) - viewport->hueOffset = totalHues-1; - if (viewport->hueTop >= totalHues) viewport->hueTop = totalHues-1; - viewport->numberOfHues = viewport->hueTop - viewport->hueOffset; - if ((viewport->hueTop == viewport->hueOffset) && (!viewport->monoOn)) - redoColor = yes; - else { - redoColor = no; - redoDither = yes; - } - if (viewport->haveControl) drawColorMap(); - break; - - case closeAll: - code = check(write(Socket,&ack,intSize)); - goodbye(-1); - - - case moveViewport: - readViewman(&i1,intSize); - readViewman(&i2,intSize); - XMoveWindow(dsply,viewport->titleWindow,i1,i2); - XSync(dsply,0); - break; - - case resizeViewport: - readViewman(&i1,intSize); - readViewman(&i2,intSize); - XResizeWindow(dsply,viewport->titleWindow,i1,i2+titleHeight); - XResizeWindow(dsply,viewport->viewWindow,i1,i2); - spadDraw=yes; - redoSmooth =yes; - break; - - case transparent: - case opaqueMesh: - case render: - case smooth: - viewData.style = viewCommand; - spadDraw=yes; - redoSmooth =yes; - break; - - case lightDef: - readViewman(&(viewport->lightVector[0]),floatSize); - readViewman(&(viewport->lightVector[1]),floatSize); - readViewman(&(viewport->lightVector[2]),floatSize); - normalizeVector(viewport->lightVector); - movingLight = yes; - drawLightingAxes(); - XSync(dsply,0); - break; - - case translucenceDef: - readViewman(&backLightIntensity,floatSize); - tempLightIntensity = backLightIntensity; - lightIntensity = tempLightIntensity; - changedIntensity = yes; - drawLightTransArrow(); - XSync(dsply,0); - break; - - case changeTitle: - readViewman(&i1,intSize); - readViewman(viewport->title,i1); - viewport->title[i1] = '\0'; - writeTitle(); - switch (doingPanel) { - case CONTROLpanel: - case CONTOURpanel: - writeControlTitle(control->controlWindow); - break; - case VOLUMEpanel: - writeControlTitle(volumeWindow); - break; - case LIGHTpanel: - writeControlTitle(lightingWindow); - break; - } /* switch */ - XFlush(dsply); - break; - - case writeView: - readViewman(&i1,intSize); - readViewman(filename,i1); - filename[i1] = '\0'; - sprintf(errorStr,"writing of viewport data"); - i3 = 0; - readViewman(&i2,intSize); - while (i2) { - i3 = i3 | (1<diagonals = i1; - spadDraw=yes; - } else { - strcpy(control->message," Use this option with Outline "); - writeControlMessage(); - } - break; - - case outlineOnOff: - readViewman(&i1,intSize); - if (viewData.style == render) { - viewData.outlineRenderOn = i1; - spadDraw=yes; - if (viewport->haveControl) drawControlPanel(); - } else { - strcpy(control->message," Use this option in Shaded mode "); - writeControlMessage(); - } - break; - - case spadPressedAButton: - readViewman(&i1,intSize); - buttonAction(i1); - break; - default: - return(-1); - } /* switch */ - - - ack++; - code = check(write(Socket,&ack,intSize)); - return(0); - -} - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/static.h b/src/graph/view3d/static.h deleted file mode 100755 index 5f8b52d..0000000 --- a/src/graph/view3d/static.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - - /* This is a description of script character labels for the - x, y, and z axes */ - -static float axes[3][6] = {{-117,0,0,117,0,0}, /* x axis */ - {0,-117,0,0,117,0}, /* y axis */ - {0,0,-117,0,0,117}}; /* z axis */ - -/* text labels are currently used */ -static float labels[basicScreen][7] = { - {105,0,4,106,0,3,labelColor}, /* script x label - 4 segments */ - {106,0,3,112,0,10,labelColor}, - {112,0,10,114,0,9,labelColor}, - {106,0,10,113,0,3,labelColor}, - {0,106,9,0,107,10,labelColor}, /* script y label - 7 segments */ - {0,107,10,0,107,6,labelColor}, - {0,107,6,0,113,5,labelColor}, - {0,113,10,0,113,-3,labelColor}, - {0,113,-3,0,111,-5,labelColor}, - {0,111,-5,0,110,-1,labelColor}, - {0,110,-1,0,114,3,labelColor}, - {0,5,114,0,6,115,labelColor}, /* script z label - 8 segments */ - {0,6,115,0,11,116,labelColor}, - {0,11,116,0,12,113,labelColor}, - {0,12,113,0,10,111,labelColor}, - {0,10,111,0,11,110,labelColor}, - {0,11,110,0,11,103,labelColor}, - {0,11,103,0,9,102,labelColor}, - {0,9,102,0,9,105,labelColor}}; diff --git a/src/graph/view3d/stuff3d.c.pamphlet b/src/graph/view3d/stuff3d.c.pamphlet deleted file mode 100644 index 9dff7a5..0000000 --- a/src/graph/view3d/stuff3d.c.pamphlet +++ /dev/null @@ -1,176 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d stuff3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _STUFF3D_C - -#include "header.h" - -#include -#include -#include - - - -#include "gfun.h1" -#include "spadcolors.h1" -#include "util.h1" - -#include "all-3d.h1" -/***************************** - *** traverse(n) *** - *** returns the nth point *** - *** in a point resevoir *** - *****************************/ - -viewTriple * -traverse (int n) -{ - - int i; - viewTriple *v; - - v = splitPoints; - for (i=0; inext; - return(v); - -} /* traverse */ - - -/**************************/ -/*** float absolute(x) ***/ -/**************************/ - -float -absolute (float x) -{ - - if (x<0.0) return(-x); - else return(x); - -} - - - - -/****************************/ -/*** float get_random(x) ***/ -/****************************/ - -float -get_random(void) -{ - - float x; - - x = (float)(rand() % 100); - return(x); - -} - - - - -/****************************/ -/*** float norm_dist() ***/ -/****************************/ - -triple -norm_dist(void) -{ - - float u1, u2, v1, v2, ss, rad; - triple pert; - - ss = 2.0; - while (ss >= 1.0) { - u1 = get_random()/100.0; - u2 = get_random()/100.0; - v1 = 2.0*u1 - 1.0; v2 = 2.0*u2 - 1.0; - ss = v1*v1 + v2*v2; - } - if (ss == 0.0) ss += .1; - rad = -2.0*log(ss)/ss; - pert.x = v1 * sqrt(rad); - pert.y = v2 * sqrt(rad); - - return(pert); -} - - - -/************************/ -/*** void goodbye() ***/ -/************************/ - -void -goodbye(int sig) -{ - - int Command; - - PSClose(); /* free PS file and data structure space */ - - if (pixelSetFlag) FreePixels(dsply,colorMap,smoothConst); - if (!viewAloned) { - Command = viewportClosing; - check(write(Socket,&Command,intSize)); - } - - XCloseDisplay(dsply); - exit(0); -} /* goodbye */ - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/surface3d.c.pamphlet b/src/graph/view3d/surface3d.c.pamphlet deleted file mode 100644 index f1e7cff..0000000 --- a/src/graph/view3d/surface3d.c.pamphlet +++ /dev/null @@ -1,791 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d surface3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _SURFACE3D_C - -#include -#include -#include - -#include "header.h" -#include "draw.h" -#include "mode.h" /* for #define components */ -#include "com.h" - -#include "xspadfill.h1" -#include "xshade.h1" -#include "util.h1" -#include "gfun.h1" -#include "all-3d.h1" - - - /**** useful defines ****/ - -#define precisionFactor 1024 - -/* depthChecker turns on the extensive depth checking mechanisms - for the depth sort algorithm. Without it, the hidden surface - removal is just a sort by z which works remarkably well, but, - is insufficient and, at times, may end up being incorrect */ -#define depthChecker - - -pointInfo ptIA, ptIB, ptIC; /* global to this file */ - -/************************************ - * void drawLineComponent(p,dFlag) * - ************************************/ - -void -drawLineComponent (poly * p, int dFlag) -{ - int i, hue; - int *anIndex; - RGB col_rgb; - - /* If the polygon is clipped against the hither plane (clipPz) then - it is not drawn...or...if the clipStuff is set to true, and - the polygon is clipped against the user defined clip volume, it - is also not drawn. */ - if (!((p->partialClipPz) || (viewData.clipStuff && (p->partialClip)))) { - /* This routine will eventually only be skipped if - p->totalClip is true and another routine would - handle the partialClip. this routine would handle - only those polygons without any clipped points */ - for (i=0, anIndex=p->indexPtr; inumpts; i++,anIndex++) { - quadMesh[i].x = refPt3D(viewData,*anIndex)->px; - quadMesh[i].y = refPt3D(viewData,*anIndex)->py; - } - - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(opaqueGC, (float)foregroundColor, dFlag); - else { - hue = hueValue(p->color); - GSetForeground(opaqueGC, (float)XSolidColor(hue,2), dFlag); - } - } else - GSetForeground(opaqueGC, psBlack, dFlag); - - if (dFlag==PSoption && !mono && !viewport->monoOn) { - hue = getHue(p->color); - col_rgb = hlsTOrgb((float)hue,0.5,0.8); - PSDrawColor(col_rgb.r,col_rgb.g,col_rgb.b,quadMesh,p->numpts); - } else { - GDrawLines(opaqueGC, viewport->viewWindow, quadMesh, p->numpts, - CoordModeOrigin, dFlag); - } - if (dFlag == Xoption) - XMapWindow(dsply, viewport->viewWindow); - } -} - - - -/************************************************** - * void drawOpaquePolygon(p,aGC,anotherGC) * - **************************************************/ - -void -drawOpaquePolygon (poly *p,GC aGC,GC anotherGC,int dFlag) -{ - - int *anIndex, i, hue, isNaN = 0; - RGB col_rgb; - - if (mono || viewport->monoOn) { - GSetForeground(anotherGC, (float)foregroundColor, dFlag); - } else { - hue = hueValue(p->color); - GSetForeground(anotherGC, (float)XSolidColor(hue,2), dFlag); - } - - /* If the polygon is clipped against the hither plane (clipPz) then - it is not drawn, or if the clipStuff is set to true, and - the polygon is clipped against the user defined clip volume, it - is also not drawn. */ - - if (!((p->partialClipPz) || (viewData.clipStuff && (p->partialClip)))) { - - /* This routine should eventually only be skipped if - p->totalClip is true and another routine would - handle the partialClip. This routine would handle - only those polygons without any clipped points. */ - - for (i=0, anIndex=p->indexPtr; inumpts; i++,anIndex++) { - quadMesh[i].x = refPt3D(viewData,*anIndex)->px; - quadMesh[i].y = refPt3D(viewData,*anIndex)->py; - if (eqNANQ(quadMesh[i].x) || eqNANQ(quadMesh[i].y)) isNaN = 1; - } - - quadMesh[i].x =refPt3D(viewData,*(p->indexPtr))->px; - quadMesh[i].y =refPt3D(viewData,*(p->indexPtr))->py; - if (eqNANQ(quadMesh[i].x) || eqNANQ(quadMesh[i].y)) isNaN = 1; - - if (dFlag==PSoption && !mono && !viewport->monoOn && !isNaN) { - GSetForeground(GC9991, (float)backgroundColor, PSoption); - PSFillPolygon(GC9991, quadMesh, p->numpts+1); - hue = getHue(p->color); - col_rgb = hlsTOrgb((float)hue,0.5,0.8); - if (viewport->diagonals) - PSDrawColor(col_rgb.r,col_rgb.g,col_rgb.b,quadMesh,p->numpts+1); - else - PSDrawColor(col_rgb.r,col_rgb.g,col_rgb.b,quadMesh,p->numpts); - } else { - if (mono || viewport->monoOn) { - GSetForeground(anotherGC, (float)foregroundColor, dFlag); - } else { - hue = hueValue(p->color); - GSetForeground(anotherGC, (float)XSolidColor(hue,2), dFlag); - } - GSetForeground(aGC,(float)backgroundColor,dFlag); - if (!isNaN) { - XFillPolygon(dsply, viewport->viewWindow, aGC, quadMesh, p->numpts, - Convex,CoordModeOrigin); - if (viewport->diagonals) - GDrawLines(anotherGC,viewport->viewWindow,quadMesh,p->numpts+1, - CoordModeOrigin, dFlag); - else - GDrawLines(anotherGC,viewport->viewWindow,quadMesh,p->numpts, - CoordModeOrigin, dFlag); - } - } - if (dFlag == Xoption) XMapWindow(dsply,viewport->viewWindow); - } /* if not totally clipped */ -} - - - -/************************************* - * poly *copyPolygons(polygonList) * - * * - * copies the given list of polygons * - * into a newly allocated list * - *************************************/ - -poly * -copyPolygons (poly *polygonList) -{ - - int i; - poly *aPoly,*retval,*prev; - - prev = retval = aPoly = (poly *)saymem("surface.c",1,sizeof(poly)); - aPoly->indexPtr = (int *)saymem("surface.c", - polygonList->numpts,sizeof(int)); - aPoly->num = polygonList->num; - aPoly->sortNum = polygonList->sortNum; - aPoly->split = polygonList->split; - aPoly->numpts = polygonList->numpts; - for (i=0; inumpts; i++) - *((aPoly->indexPtr) + i) = *((polygonList->indexPtr) + i); - aPoly->N[0] = polygonList->N[0]; - aPoly->N[1] = polygonList->N[1]; - aPoly->N[2] = polygonList->N[2]; - aPoly->planeConst = polygonList->planeConst; - aPoly->color = polygonList->color; - aPoly->moved = no; - aPoly->pxmin = polygonList->pxmin; - aPoly->pxmax = polygonList->pxmax; - aPoly->pymin = polygonList->pymin; - aPoly->pymax = polygonList->pymax; - aPoly->pzmin = polygonList->pzmin; - aPoly->pzmax = polygonList->pzmax; - aPoly->xmin = polygonList->xmin; - aPoly->xmax = polygonList->xmax; - aPoly->ymin = polygonList->ymin; - aPoly->ymax = polygonList->ymax; - aPoly->zmin = polygonList->zmin; - aPoly->zmax = polygonList->zmax; - aPoly->normalFacingOut = polygonList->normalFacingOut; - aPoly->primitiveType = polygonList->primitiveType; - for (polygonList = polygonList->next; - polygonList != NIL(poly); - polygonList = polygonList->next) { - prev->next = aPoly = (poly *)saymem("surface.c",1,sizeof(poly)); - aPoly->indexPtr = (int *)saymem("surface.c", - polygonList->numpts,sizeof(int)); - aPoly->num = polygonList->num; - aPoly->sortNum = polygonList->sortNum; - aPoly->numpts = polygonList->numpts; - aPoly->split = polygonList->split; - for (i=0; inumpts; i++) - *((aPoly->indexPtr) + i) = *((polygonList->indexPtr) + i); - aPoly->N[0] = polygonList->N[0]; - aPoly->N[1] = polygonList->N[1]; - aPoly->N[2] = polygonList->N[2]; - aPoly->planeConst = polygonList->planeConst; - aPoly->color = polygonList->color; - aPoly->moved = no; - aPoly->pxmin = polygonList->pxmin; - aPoly->pxmax = polygonList->pxmax; - aPoly->pymin = polygonList->pymin; - aPoly->pymax = polygonList->pymax; - aPoly->pzmin = polygonList->pzmin; - aPoly->pzmax = polygonList->pzmax; - aPoly->xmin = polygonList->xmin; - aPoly->xmax = polygonList->xmax; - aPoly->ymin = polygonList->ymin; - aPoly->ymax = polygonList->ymax; - aPoly->zmin = polygonList->zmin; - aPoly->zmax = polygonList->zmax; - aPoly->normalFacingOut = polygonList->normalFacingOut; - aPoly->primitiveType = polygonList->primitiveType; - prev = aPoly; - } - aPoly->next = 0; - return(retval); -} - - -/****************************** - * void minMaxPolygons(aPoly) * - * * - * sets up the xmin, * - * etc, for each polygon * - * for sorting and * - * extent checking. * - ******************************/ - -void -minMaxPolygons (poly *aPoly) -{ - - int *anIndex; - int i; - - for (; aPoly != NIL(poly); aPoly = aPoly->next) { - anIndex = aPoly->indexPtr; - aPoly->pxmin = aPoly->pxmax = refPt3D(viewData,*anIndex)->px; - aPoly->pymin = aPoly->pymax = refPt3D(viewData,*anIndex)->py; - aPoly->pzmin = aPoly->pzmax = refPt3D(viewData,*anIndex)->pz; - aPoly->xmin = aPoly->xmax = refPt3D(viewData,*anIndex)->x; - aPoly->ymin = aPoly->ymax = refPt3D(viewData,*anIndex)->y; - aPoly->zmin = aPoly->zmax = refPt3D(viewData,*anIndex)->z; - for (i=1,anIndex++; inumpts; i++,anIndex++) { - if (refPt3D(viewData,*anIndex)->px < aPoly->pxmin) - aPoly->pxmin = refPt3D(viewData,*anIndex)->px; - else if (refPt3D(viewData,*anIndex)->px > aPoly->pxmax) - aPoly->pxmax = refPt3D(viewData,*anIndex)->px; - if (refPt3D(viewData,*anIndex)->py < aPoly->pymin) - aPoly->pymin = refPt3D(viewData,*anIndex)->py; - else if (refPt3D(viewData,*anIndex)->py > aPoly->pymax) - aPoly->pymax = refPt3D(viewData,*anIndex)->py; - if (refPt3D(viewData,*anIndex)->pz < aPoly->pzmin) - aPoly->pzmin = refPt3D(viewData,*anIndex)->pz; - else if (refPt3D(viewData,*anIndex)->pz > aPoly->pzmax) - aPoly->pzmax = refPt3D(viewData,*anIndex)->pz; - - if (refPt3D(viewData,*anIndex)->x < aPoly->xmin) - aPoly->xmin = refPt3D(viewData,*anIndex)->x; - else if (refPt3D(viewData,*anIndex)->x > aPoly->xmax) - aPoly->xmax = refPt3D(viewData,*anIndex)->x; - if (refPt3D(viewData,*anIndex)->y < aPoly->ymin) - aPoly->ymin = refPt3D(viewData,*anIndex)->y; - else if (refPt3D(viewData,*anIndex)->y > aPoly->ymax) - aPoly->ymax = refPt3D(viewData,*anIndex)->y; - if (refPt3D(viewData,*anIndex)->z < aPoly->zmin) - aPoly->zmin = refPt3D(viewData,*anIndex)->z; - else if (refPt3D(viewData,*anIndex)->z > aPoly->zmax) - aPoly->zmax = refPt3D(viewData,*anIndex)->z; - } - } -} /* minMaxPolygons */ - - - -/*********************************** - * int polyCompare (p1,p2) * - * * - * returns -1 if p1 < p2 * - * 0 if p1 = p2 * - * 1 if p1 > p2 * - * note that this is the reverse * - * of what the msort requested. * - * this is so that the list will * - * be sorted from max to min. * - ***********************************/ - -int -polyCompare (poly *p1,poly *p2) -{ - - if (p1->pzmax > p2->pzmax) return(-1); - else if (p1->pzmax < p2->pzmax) return(1); - else return(0); -} - -/*********************** - * void calcEyePoint() * - * * - * sets the global * - * variable eyePoint[] * - * to where the viewer * - * is pointed towards * - ***********************/ - -void -calcEyePoint (void) -{ - - eyePoint[0] = sinPhi * (sinTheta); - eyePoint[1] = sinPhi * (-cosTheta); - eyePoint[2] = cosPhi; - -} - - - -/* - void drawPolygons() - A general routine for displaying a list of polygons - with the proper hidden surfaces removed. Assumes the - list of polygons is in viewData.polygons. Needs a - routine to split intersecting polygons in object space. * - */ - - -/************************************** - * void drawRenderedPolygon(p,dFlag) * - * * - * calculate the color for the * - * polygon p and draw it * - **************************************/ - -void -drawRenderedPolygon (poly *p,int dFlag) -{ - - int i,hue,shade, isNaN = 0; - float whichSide,H[3],P[3],LN,HN,diff,spec,tempLight,lumens,E[3],N[3]; - int *anIndex, *indx; - RGB col_rgb; - - if (!((p->partialClipPz) || (viewData.clipStuff && (p->partialClip)))) { - /* This routine should eventually only be skipped if - p->totalClip is true and another routine would - handle the partialClip. This routine would handle - only those polygons without any clipped points. */ - - for (i=0, anIndex=p->indexPtr; inumpts; i++,anIndex++) { - quadMesh[i].x = refPt3D(viewData,*anIndex)->px; - quadMesh[i].y = refPt3D(viewData,*anIndex)->py; - if (eqNANQ(quadMesh[i].x) || eqNANQ(quadMesh[i].y)) isNaN = 1; - } - quadMesh[i].x = refPt3D(viewData,*(p->indexPtr))->px; - quadMesh[i].y = refPt3D(viewData,*(p->indexPtr))->py; - if (eqNANQ(quadMesh[i].x) || eqNANQ(quadMesh[i].y)) isNaN = 1; - - if (!isNaN) { - /* calculate polygon illumination */ - indx = p->indexPtr; - P[0] = (refPt3D(viewData,*(indx))->wx + - refPt3D(viewData,*(indx+1))->wx + - refPt3D(viewData,*(indx+2))->wx); - P[1] = (refPt3D(viewData,*(indx))->wy + - refPt3D(viewData,*(indx+1))->wy + - refPt3D(viewData,*(indx+2))->wy); - P[2] = (refPt3D(viewData,*(indx))->wz + - refPt3D(viewData,*(indx+1))->wz + - refPt3D(viewData,*(indx+2))->wz); - normalizeVector(P); - - N[0] = p->N[0]; N[1] = p->N[1]; N[2] = p->N[2]; - normalizeVector(eyePoint); - E[0] = 4.0*eyePoint[0] - P[0]; - E[1] = 4.0*eyePoint[1] - P[1]; - E[2] = 4.0*eyePoint[2] - P[2]; - normalizeVector(E); - diff = 0.0; spec = 0.0; - LN = N[0]*viewport->lightVector[0] + - N[1]*viewport->lightVector[1] + - N[2]*viewport->lightVector[2]; - if (LN < 0.0) LN = -LN; - diff = LN*Cdiff; - - if (LN > 0.0) { - H[0] = E[0] + viewport->lightVector[0]; - H[1] = E[1] + viewport->lightVector[1]; - H[2] = E[2] + viewport->lightVector[2]; - normalizeVector(H); - HN = dotProduct(N,H,3); - if (HN < 0.0) HN = -HN; - spec = pow((double)absolute(HN),coeff); - if (spec > 1.0) spec = 1.0; - } - - lumens = ((Camb + 0.15) + diff + spec*Cspec); - if (lumens > 1.0) lumens = 1.0; - if (lumens < 0.0) lumens = 0.0; - if (dFlag==PSoption && !mono && !viewport->monoOn) { - hue = getHue(p->color); - col_rgb = hlsTOrgb((float)hue,lumens,0.8); - /* NTSC color to grey = .299 red + .587 green + .114 blue */ - maxGreyShade = (int) psShadeMax; - whichSide = (.299*col_rgb.r + .587*col_rgb.g + .114*col_rgb.b) * - (maxGreyShade-1); - } - else { - if (mono || viewport->monoOn) { - hue = getHue(p->color); - col_rgb = hlsTOrgb((float)hue,lumens,0.8); - whichSide = (.299*col_rgb.r + .587*col_rgb.g + .114*col_rgb.b) * - (maxGreyShade-1); - } else - whichSide = lumens*(totalShades-1); - } - - tempLight = lightIntensity; - if (lightIntensity < Camb) lightIntensity = Camb; - - shade = floor(lightIntensity * absolute(whichSide)); - lightIntensity = tempLight; - - if (shade < totalShades) { - /* shade < totalShades is (temporarily) necessary here - because, currently, parameterizations for things like - the sphere would produce triangular shaped polygons - close to the poles which get triangularized leaving a - triangle with coincidental points. the normal for this - would be undefined (since coincidental points would create - a zero vector) and the shade would be large, hence, - the conditional. */ - - if (mono || viewport->monoOn) { - if (dFlag == Xoption) { - XChangeShade(dsply,maxGreyShade-shade-1); - XShadePolygon(dsply,viewport->viewWindow,quadMesh,p->numpts+1, - Convex,CoordModeOrigin); - } - else if (dFlag == PSoption) { /* renderGC has number 9991 - (see main.c, header.h) */ - GSetForeground(GC9991, - 1.0-(float)(maxGreyShade-shade-1)*psShadeMul,PSoption); - PSFillPolygon(GC9991, quadMesh, p->numpts+1); - } - } else { /* not mono */ - if (dFlag == Xoption) { - hue = hueValue(p->color); - XSpadFillPolygon(dsply, viewport->viewWindow, quadMesh, - p->numpts+1, Convex,CoordModeOrigin, hue, shade); - } - else if (dFlag == PSoption) /* draws it out in monochrome */ - PSColorPolygon(col_rgb.r,col_rgb.g,col_rgb.b,quadMesh,p->numpts+1); - } /* if mono-else */ - - if (viewData.outlineRenderOn) { - if (viewport->diagonals) { - if (dFlag == PSoption) { - GSetForeground(renderGC,psBlack, dFlag); - GDrawLines(renderGC,viewport->viewWindow,quadMesh,p->numpts+1, - CoordModeOrigin,dFlag); - } else - GDrawLines(renderGC,viewport->viewWindow,quadMesh,p->numpts+1, - CoordModeOrigin,dFlag); - } else { - if (dFlag == PSoption) { - GSetForeground(renderGC,psBlack,PSoption); - GDrawLines(renderGC,viewport->viewWindow,quadMesh,p->numpts, - CoordModeOrigin,PSoption); - } else - GDrawLines(renderGC,viewport->viewWindow,quadMesh,p->numpts, - CoordModeOrigin,dFlag); - } - } - } - } /* if not NaN */ - if (dFlag == Xoption) XMapWindow(dsply,viewport->viewWindow); - } /* if not clipped */ - -} /* drawRenderedPolygon */ - - -void -freePointResevoir(void) -{ - - viewTriple *v; - - while (splitPoints != NIL(viewTriple)) { - v = splitPoints; - splitPoints = splitPoints->next; - free(v); - } - -} /* freePointResevoir */ - -/*********************************** - * void freeListOfPolygons(pList); * - * * - * frees up a list of polygons. * - ***********************************/ - -void -freeListOfPolygons (poly *pList) -{ - - poly *nextP; - - for (; pList != NIL(poly); pList=nextP) { - nextP=pList->next; - free(pList->indexPtr); - free(pList); - } -} /* freeListOfPolygons() */ - - - -void -drawPolygons(int dFlag) -{ - - poly *p,*head; - poly *tempQuick=NULL; - int quickFirst=yes; - - if (recalc) { - - /* To get around multiple X Expose events the server tends - to send upon startup, leave negation of firstTime to the end. */ - rotated = no; - zoomed = no; - translated = no; - switchedPerspective = no; - changedEyeDistance = no; - redoSmooth = yes; - - if (keepDrawingViewport()) { - if (!firstTime) { - strcpy(control->message," Creating Polygons "); - writeControlMessage(); - freeListOfPolygons(quickList); - freePointResevoir(); - } - strcpy(control->message," Collecting Polygons "); - writeControlMessage(); - quickList = copyPolygons(viewData.polygons); - - if (keepDrawingViewport()) { - /* to get normal facing outside info */ - strcpy(control->message," Projecting Polygons "); - writeControlMessage(); - projectAllPolys(quickList); - if (keepDrawingViewport()) { - strcpy(control->message," Setting Extreme Values "); - writeControlMessage(); - minMaxPolygons(quickList); - if (keepDrawingViewport()) { - strcpy(control->message," Sorting Polygons "); - writeControlMessage(); - quickList = msort(quickList,0,viewData.numPolygons,polyCompare); - if (keepDrawingViewport()) { - calcEyePoint(); - head = p = quickList; - - clearControlMessage(); - strcpy(control->message,viewport->title); - writeControlMessage(); - - if (viewData.scaleDown) { - if (keepDrawingViewport()) { - for (p=quickList; - keepDrawingViewport() && (p != NIL(poly)); - p=p->next) { - switch (p->primitiveType) { - case pointComponent: - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC, - (float)foregroundColor, dFlag); - else - GSetForeground(componentGC, - (float)meshOutline, dFlag); - } else { - GSetForeground(componentGC, psBlack, dFlag); - GFillArc(componentGC, viewport->viewWindow, - (int)refPt3D(viewData,*(p->indexPtr))->px, - (int)refPt3D(viewData,*(p->indexPtr))->py, - viewData.pointSize,viewData.pointSize,0, - 360*64, dFlag); - } - break; - case lineComponent: - drawLineComponent(p,dFlag); - break; - default: - if (viewData.style == opaqueMesh) { - GSetForeground(globGC,(float)backgroundColor,dFlag); - drawOpaquePolygon(p,globGC,opaqueGC,dFlag); - } else { - drawRenderedPolygon(p,dFlag); - } - } /* switch */ - } - } - } - - if (!quickFirst) { - /* append the rest of the polygons onto the list */ - tempQuick->next = head; - /* but do not continue the drawing... */ - if (head != NIL(poly)) head->doNotStopDraw = no; - } /* if !quickFirst */ - finishedList = (p==NIL(poly)); - } /* for various */ - } /* steps */ - } /* of */ - } /* keepDrawingViewport() */ - } /* *** */ - /* May want to have a flag somewhere to stop the drawing yet - continue the freeing */ - if (firstTime) firstTime = no; - } else { /* if recalc else if not recalc just draw stuff in list */ - if (keepDrawingViewport()) { - for (p=quickList; - keepDrawingViewport() && p != NIL(poly) && - (viewData.scaleDown || p->doNotStopDraw); p=p->next) { - projectAPoly(p); - switch (p->primitiveType) { - case pointComponent: - if (dFlag==Xoption) { - if (mono || viewport->monoOn) - GSetForeground(componentGC,(float)foregroundColor, dFlag); - else - GSetForeground(componentGC,(float)meshOutline, dFlag); - } else - GSetForeground(componentGC,psBlack, dFlag); - GFillArc(componentGC, viewport->viewWindow, - (int)refPt3D(viewData,*(p->indexPtr))->px, - (int)refPt3D(viewData,*(p->indexPtr))->py, - viewData.pointSize,viewData.pointSize,0,360*64,dFlag); - break; - case lineComponent: - drawLineComponent(p,dFlag); - break; - default: - if (viewData.style == opaqueMesh) { - GSetForeground(globGC,(float)backgroundColor,dFlag); - drawOpaquePolygon(p,globGC,opaqueGC,dFlag); - } else - drawRenderedPolygon(p,dFlag); - } /* switch */ - } - } - } -} /* drawPolygons */ - - - - - - - -/************************** - * int lessThan(x,y) * - * int greaterThan(x,y) * - * int equal(x,y) * - * * - * Compares two floating * - * point numbers for * - * precision of up to one * - * place in a thousand. * - * returns * - * 1 if true * - * o otherwise * - **************************/ - -int -lessThan (float x,float y) -{ - int xI,yI; - - xI = x*precisionFactor; - yI = y*precisionFactor; - return(xIyI); -} - -int -isNaN (float v) -{ - return (v != v); -} - - -int -isNaNPoint (float x,float y,float z) -{ - return (isNaN(x) || isNaN(y) || isNaN(z)); -} - -int -equal (float x,float y) -{ - int xI,yI; - - xI = x*precisionFactor; - yI = y*precisionFactor; - return(xI==yI); -} - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/testcol.c.pamphlet b/src/graph/view3d/testcol.c.pamphlet deleted file mode 100644 index 50df51d..0000000 --- a/src/graph/view3d/testcol.c.pamphlet +++ /dev/null @@ -1,617 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d testcol.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _MAIN3D_C -#include -#include -#include -#include -#include -#include - -#include "header.h" -#include "cpanel.h" -#include "process.h" -#include "bsdsignal.h" - -#include "bsdsignal.h1" -#include "util.h1" -#include "gfun.h1" -#include "xspadfill.h1" -#include "xshade.h1" -#include "all-3d.h1" - -#include "spadbitmap.bitmap" -#include "spadmask.mask" - -viewPoints *viewport; -GCptr GChead=NULL; /* ptr to head of ps GC linked list */ -char *PSfilename; /* output file name used in user directory */ -int psInit=no; /* need to call globaInitPs() each run */ -char *envAXIOM; /* used for ps file paths */ -int maxGreyShade=0; -GC globalGC1, globalGC2, anotherGC, globGC, trashGC, - controlMessageGC, lightingGC, volumeGC, quitGC, processGC, - saveGC, graphGC, componentGC, opaqueGC, renderGC; -unsigned long foregroundColor, backgroundColor; -int Socket=1, ack=1; -Colormap colorMap; -viewTriple *splitPoints; -Display *dsply; -int scrn; -Window rtWindow; -HashTable *table; -int mono, totalColors, totalSolid, totalDithered, totalHues, - totalSolidShades, totalDitheredAndSolids,totalShades; -XFontStruct *globalFont, *buttonFont, *headerFont, *titleFont, *graphFont, - *lightingFont, *volumeFont, *quitFont, *saveFont,*serverFont; -XGCValues gcVals; -unsigned long * spadColors; -float transform[4][4], transform1[4][4], - R[4][4], R1[4][4], S[4][4], T[4][4], I[4][4]; -float A[4][4], B[4][4], D[4], E[4][4], F[4], array[4][4]; - -int followMouse=no, - viewportKeyNum=0; - /**********************/ - /** global variables **/ - /**********************/ - -char scaleReport[5]; -char deltaXReport[5], deltaYReport[5]; -XSizeHints viewSizeHints; - -GC processGC; -viewPoints *viewport; -controlPanelStruct *control; -char *s; -int someInt; - -/* check /usr/include/X11 for current implementation of - pixels (e.g. BlackPixel()) */ - - /** totalShades is initially set to totalShadesConst. - If X cannot allocate 8 shades for each hue, total- - Shades is decremented. there is currently only a check for - this value to be positive. --> something to add: change over - to monochrome if totalShades=0. just modify the spadcolors.c - file. spadcolors.c has been modified so that it returns the - value for totalShades. since the return value had previously - been unused, a modification in this way ensures continued - support of other routines calling this function (e.g. - hypertex stuff). **/ - - -int drawMore; - -int spadMode=no, /* yes if receiving AXIOM command and - calling drawViewport */ - spadDraw=no; /* yes if drawing viewport for - an AXIOM command */ -int spadSignalReceived=0; /* yes if current state is a result of - a signal from AXIOM */ -int inNextEvent=no; /* true just before a call to - XNextEvent */ -jmp_buf jumpFlag; - -char errorStr[80]; - -view3DStruct viewData; - -Window quitWindow, saveWindow; - - /** variables below assume only one viewport per process **/ - -Window lightingWindow, lightingAxes; -float lightPointer[3], tempLightPointer[3]; - -int axesXY[3][4]; -float axesZ[3][2]; - -float lightIntensity=1.0, tempLightIntensity; -float backLightIntensity = 1.0; - - /** used for writing viewport info out to a file **/ -char filename[256]; - - - /** used for draw viewport routines */ -float sinTheta, sinPhi, cosTheta, cosPhi, viewScale, - viewScaleX, viewScaleY, viewScaleZ, reScale; -int xCenter, yCenter; - -XWindowAttributes vwInfo; -XWindowAttributes graphWindowAttrib; - -XPoint *quadMesh; -XImage *imageX; -int *xPts; /* pointer to projected points (x followed by y) */ -float transform[4][4], transform1[4][4], - R[4][4], R1[4][4], S[4][4], T[4][4], I[4][4]; -float A[4][4], B[4][4], D[4], E[4][4], F[4], array[4][4]; - - -int scanline, polyCount; -polyList *scanList[ARRAY_HEIGHT]; -float xleft = (float)0 ,xright = (float)ARRAY_WIDTH; - -colorBuffer cBuffer[ARRAY_WIDTH]; -float zBuffer[ARRAY_WIDTH]; - -float zC, dzdx, lum, point_norm[3]; -float intersectColor[2], dcolor; -triple dpt, dnorm; - - /** eyePoint **/ -float eyePoint[3]; - - /** tube stuff **/ -XPoint polygonMesh[20]; - - /* bypass the hidden surface algorithm if no rotations, etc */ -int saveFlag=no; -int firstTime=yes, noTrans = yes, startup = yes; -int redrawView = no; /* set to yes when returning from - subpanels */ -int redoColor = no, pixelSetFlag = no, redoDither = no; -int redoSmooth = no, multiColorFlag = no; - -/* In order to set recalc to true (see draw.h) */ -int finishedList=no, zoomed=yes, translated = yes, - changedIntensity, movingLight = no, writeImage = no, - rotated=yes, switchedPerspective, changedEyeDistance, - gotToggle = no; -poly *quickList; - - /** if not connected to AXIOM **/ -int viewAloned; - - /** for drawing the box **/ -viewTriple corners[8], clipCorners[8]; -boxSideStruct box[6], clipBox[6]; - - /** for freeing up points created frrom split polygons **/ -int resMax=0; /* number of points in the split point resevoir */ - - /** view volume stuff **/ -Window volumeWindow; -int frustrumVertex; -int doingPanel=CONTROLpanel; /* rewrite titles in proper panel */ -int doingVolume; - -int screenX; /* global floating point indicating mouse position - on frustrum screen */ -float xClipMinN, xClipMaxN, /* normalized values for - clip volume */ - yClipMinN, yClipMaxN, - zClipMinN, zClipMaxN, - clipValue; /* mouse input */ -float pzMin, pzMax; /* for a given (theta,phi): calculated in - drawViewport(), used in drawFrustrum() */ - - /** B/W shades **/ - /** events from the viewport manager **/ -char propertyName[14]; -char propertyBuffer[256]; - - /* global ps variables */ - - /** Resource database **/ -XrmDatabase rDB; - - /** variables used for smooth shading **/ -int smoothError = no; -Pixmap viewmap; -float Cspec = 0.30; -float Cdiff = 0.4; -float Camb = 0.3; -float coeff = 35.0; -float saturation = 0.8; -int smoothHue; -int smoothConst = 50; - - - - -void -main(void) -{ - - XGCValues controlGCVals; - int i, code; - - char property[256]; - char *prop = &property[0]; - char *str_type[20]; - XrmValue value; - - Atom wm_delete_window; - XColor foreColor, backColor; - XSizeHints titleSizeHints; - Window viewTitleWindow, viewGraphWindow; - XSetWindowAttributes viewAttrib; - Pixmap spadbits,spadmask; - - /**** Global inits ****/ - splitPoints = NIL(viewTriple); - - /**** Set up display ****/ - if ((dsply = XOpenDisplay(getenv("DISPLAY"))) == NULL) - {fprintf(stderr,"Could not open display.\n");exit (-1);} - scrn = DefaultScreen(dsply); - rtWindow = RootWindow(dsply,scrn); - - /**** link Xwindows to viewports - X10 feature ****/ - table = XCreateAssocTable(nbuckets); - - /**** Create AXIOM color map ****/ - totalShades = 0; - totalColors = XInitSpadFill(dsply,scrn,&colorMap, - &totalHues,&totalSolidShades, - &totalDitheredAndSolids,&totalShades); - if (totalColors < 0) { - fprintf(stderr,"ERROR: Could not allocate all the necessary colors.\n"); - exitWithAck(RootWindow(dsply,scrn),Window,-1); - } - - - - PSGlobalInit(); - /* must initiate before using any G/PS functions */ - /* need character name: used as postscript GC variable */ - /* need to create ps GCs for all GCs used by drawing in viewWindow */ - - /* globalGC1 */ - controlGCVals.foreground = monoColor(axesColor); - controlGCVals.background = backgroundColor; - globalGC1 = XCreateGC(dsply,rtWindow,GCForeground | - GCBackground ,&controlGCVals); - carefullySetFont(globalGC1,globalFont); - PSCreateContext(globalGC1, "globalGC1", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* controlMessageGC */ - controlGCVals.foreground = controlMessageColor; - controlGCVals.background = backgroundColor; - controlMessageGC = XCreateGC(dsply,rtWindow,GCForeground | - GCBackground ,&controlGCVals); - carefullySetFont(controlMessageGC,globalFont); - - /* globalGC2 */ - controlGCVals.foreground = monoColor(labelColor); - globalGC2 = XCreateGC(dsply,rtWindow,GCForeground,&controlGCVals); - carefullySetFont(globalGC2,buttonFont); - PSCreateContext(globalGC2, "globalGC2", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* trashGC */ - controlGCVals.function = GXcopy; - trashGC = XCreateGC(dsply,rtWindow,0 ,&controlGCVals); - carefullySetFont(trashGC,buttonFont); - PSCreateContext(trashGC, "trashGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* componentGC */ - componentGC = XCreateGC(dsply,rtWindow,0 ,&controlGCVals); - carefullySetFont(componentGC,buttonFont); - PSCreateContext(componentGC, "componentGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* opaqueGC */ - opaqueGC = XCreateGC(dsply,rtWindow,0 ,&controlGCVals); - carefullySetFont(opaqueGC,buttonFont); - PSCreateContext(opaqueGC, "opaqueGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* renderGC */ - renderGC = XCreateGC(dsply,rtWindow,0,&controlGCVals); - carefullySetFont(renderGC,buttonFont); - PSCreateContext(renderGC, "renderGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* globGC */ - globGC = XCreateGC(dsply,rtWindow,0,&controlGCVals); - carefullySetFont(globGC,headerFont); - PSCreateContext(globGC, "globGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* anotherGC */ - controlGCVals.line_width = colorWidth; - anotherGC = XCreateGC(dsply,rtWindow,GCBackground | GCLineWidth | - GCFunction ,&controlGCVals); - carefullySetFont(anotherGC,titleFont); - PSCreateContext(anotherGC, "anotherGC", psNormalWidth, psButtCap, - psMiterJoin, psWhite, psBlack); - - /* also create one for rendering (grayscale only for now) */ - /* assign arbitrary number to renderGC as 9991 - see header.h */ - PSCreateContext(GC9991, "renderGC", psNormalWidth, psButtCap, - psRoundJoin, psWhite, psBlack ); - - - /* processGC */ - gcVals.background = backgroundColor; - processGC = XCreateGC(dsply,rtWindow,GCBackground | - GCFillStyle,&gcVals); - carefullySetFont(processGC,buttonFont); - - /* lightingGC */ - controlGCVals.foreground = monoColor(axesColor); - controlGCVals.background = backgroundColor; - lightingGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(lightingGC,lightingFont); - - - /* volumeGC */ - volumeGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(volumeGC,volumeFont); - - /* quitGC */ - quitGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(quitGC,buttonFont); - - /* saveGC */ - saveGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(saveGC,buttonFont); - - - /* graphGC */ - graphGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground - ,&controlGCVals); - carefullySetFont(graphGC,buttonFont); - if (!(viewport = (viewPoints *)saymem("viewport3D.c", - 1,sizeof(viewPoints)))) { - fprintf(stderr,"Ran out of memory trying to create a viewport.\n"); - exitWithAck(RootWindow(dsply,scrn),Window,-1); - } - /* Definition of the 4x4 identity matrix. */ - I[0][0] = 1.0; I[0][1] = 0.0; I[0][2] = 0.0; I[0][3] = 0.0; - I[1][0] = 0.0; I[1][1] = 1.0; I[1][2] = 0.0; I[1][3] = 0.0; - I[2][0] = 0.0; I[2][1] = 0.0; I[2][2] = 1.0; I[2][3] = 0.0; - I[3][0] = 0.0; I[3][1] = 0.0; I[3][2] = 0.0; I[3][3] = 1.0; - - viewport->viewportKey = viewportKeyNum++; - viewport->nextViewport = 0; - viewport->prevViewport = 0; - viewport->deltaX = viewport->deltaX0 = viewData.deltaX; - viewport->deltaY = viewport->deltaY0 = viewData.deltaY; - viewport->deltaZ = viewport->deltaZ0 = viewData.deltaZ; - viewport->scale = viewport->scale0 = viewData.scale; - viewport->scaleX = viewData.scaleX; - viewport->scaleY = viewData.scaleY; - viewport->scaleZ = viewData.scaleZ; - viewport->transX = (viewData.xmax + viewData.xmin)/2.0; - viewport->transY = (viewData.ymax + viewData.ymin)/2.0; - viewport->transZ = (viewData.zmax + viewData.zmin)/2.0; - - viewport->theta = viewport->axestheta = viewport->theta0 = viewData.theta; - viewport->phi = viewport->axesphi = viewport->phi0 = viewData.phi; - viewport->thetaObj = 0.0; - viewport->phiObj = 0.0; - - viewData.title = "untitled"; - strcpy(viewport->title,viewData.title); - - viewport->axesOn = yes; - viewport->regionOn = no; - viewport->monoOn = no; - viewport->zoomXOn = yes; - viewport->zoomYOn = yes; - viewport->zoomZOn = yes; - - viewport->originrOn = yes; - viewport->objectrOn = no; - viewport->originFlag = no; - - viewport->xyOn = no; - viewport->xzOn = no; - viewport->yzOn = no; - - viewport->closing = no; - viewport->allowDraw = yes; /*if no, just draw axes the first time */ - viewport->needNorm = yes; - - viewport->lightVector[0] = -0.5; - viewport->lightVector[1] = 0.5; - viewport->lightVector[2] = 0.5; - viewport->translucency = viewData.translucency; - - viewport->hueOffset = viewData.hueOff; - viewport->numberOfHues = viewData.numOfHues; - viewport->hueTop = viewData.hueOff + viewData.numOfHues; - if (viewport->hueTop > totalHues-1) viewport->hueTop = totalHues-1; - viewport->diagonals = viewData.diagonals; - - /* make theta in [0..2pi) and phi in (-pi..pi] */ - while (viewport->theta >= two_pi) { - viewport->theta -= two_pi; - } - while (viewport->theta < 0.0) { - viewport->theta += two_pi; - } - while (viewport->phi > pi) { - viewport->phi -= two_pi; - } - while (viewport->phi <= -pi) { - viewport->phi += two_pi; - } - - while (viewport->axestheta >= two_pi) { - viewport->axestheta -= two_pi; - } - while (viewport->axestheta < 0.0) { - viewport->axestheta += two_pi; - } - while (viewport->axesphi > pi) { - viewport->axesphi -= two_pi; - } - while (viewport->axesphi <= -pi) { - viewport->axesphi += two_pi; - } - - /* Initialize the rotation matrix about the origin. */ - sinTheta = sin(-viewport->theta); - cosTheta = cos(-viewport->theta); - sinPhi = sin(viewport->phi); - cosPhi = cos(viewport->phi); - ROTATE(R); /* angles theta and phi are global */ - - /* Initialize the rotation matrix about the object's center of volume. */ - sinTheta = sin(-viewport->thetaObj); - cosTheta = cos(-viewport->thetaObj); - sinPhi = sin(viewport->phiObj); - cosPhi = cos(viewport->phiObj); - ROTATE1(R1); /* angles theta and phi are global */ - - - /* Initialize the non-uniform scaling matrix. */ - SCALE(viewport->scaleX,viewport->scaleY,viewport->scaleZ,S); - /* Initialize the translation matrix. */ - TRANSLATE(-viewport->deltaX,-viewport->deltaY,0.0,T); - /**** make the windows for the viewport ****/ - spadbits = XCreateBitmapFromData(dsply,rtWindow, - spadBitmap_bits, - spadBitmap_width,spadBitmap_height); - spadmask = XCreateBitmapFromData(dsply,rtWindow, - spadMask_bits, - spadMask_width,spadMask_height); - viewAttrib.background_pixel = backgroundColor; - viewAttrib.border_pixel = foregroundColor; - - viewAttrib.override_redirect = overrideManager; - - viewAttrib.colormap = colorMap; - foreColor.pixel = foregroundColor; - backColor.pixel = backgroundColor; -/* - foreColor.pixel = viewCursorForeground; - backColor.pixel = viewCursorBackground; -*/ - XQueryColor(dsply,colorMap,&foreColor); - XQueryColor(dsply,colorMap,&backColor); - viewAttrib.cursor = XCreatePixmapCursor(dsply,spadbits,spadmask, - &foreColor,&backColor,spadBitmap_x_hot,spadBitmap_y_hot); - viewAttrib.event_mask = titleMASK; - if (viewData.vW) { - titleSizeHints.flags = PPosition | PSize; - titleSizeHints.x = viewData.vX; - titleSizeHints.y = viewData.vY; - titleSizeHints.width = viewData.vW; - titleSizeHints.height = viewData.vH; - } else { /* ain't gonna allow this for now... */ - titleSizeHints.flags = PSize; - titleSizeHints.width = viewWidth; - titleSizeHints.height = viewHeight; - } - - viewTitleWindow = XCreateWindow(dsply,rtWindow,viewData.vX,viewData.vY, - viewData.vW,viewData.vH,viewBorderWidth+3, - CopyFromParent,InputOutput,CopyFromParent, - viewportTitleCreateMASK,&viewAttrib); - - wm_delete_window = XInternAtom(dsply, "WM_DELETE_WINDOW", False); - (void) XSetWMProtocols(dsply, viewTitleWindow, &wm_delete_window, 1); - - XSetNormalHints(dsply,viewTitleWindow,&titleSizeHints); - if (strlen(viewport->title) < 30) - XSetStandardProperties(dsply,viewTitleWindow,"AXIOM 3D",viewport->title, - None,NULL,0,&titleSizeHints); - else - XSetStandardProperties(dsply,viewTitleWindow,"AXIOM 3D","3D AXIOM Graph", - None,NULL,0,&titleSizeHints); - viewport->titleWindow = viewTitleWindow; - - viewAttrib.event_mask = viewportMASK; - viewSizeHints.flags = PPosition | PSize; - viewSizeHints.x = -(viewBorderWidth+3); - viewSizeHints.y = titleHeight; - viewSizeHints.width = titleSizeHints.width; - viewSizeHints.height = titleSizeHints.height-(titleHeight+appendixHeight); - viewGraphWindow = XCreateWindow(dsply,viewTitleWindow, - viewSizeHints.x,viewSizeHints.y, - viewSizeHints.width,viewSizeHints.height, - viewBorderWidth+3, - CopyFromParent,InputOutput,CopyFromParent, - viewportCreateMASK,&viewAttrib); - XSetNormalHints(dsply,viewGraphWindow,&viewSizeHints); - XSetStandardProperties(dsply,viewGraphWindow,"","",None,NULL,0, - &viewSizeHints); - viewport->viewWindow = viewGraphWindow; - graphWindowAttrib.width = viewSizeHints.width; - graphWindowAttrib.height = viewSizeHints.height; - - if (viewport->hueOffset != viewport->hueTop) { - multiColorFlag = yes; - redoColor = no; - } else { - if (viewport->hueTop < 11) - smoothHue = viewport->hueTop*6; - else { - if (viewport->hueTop > 10 && viewport->hueTop < 16) - smoothHue = viewport->hueTop*20 - 140; - else smoothHue = viewport->hueTop*12 - 12; - } - redoColor = yes; - } - - -} /* main() */ - - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/transform3d.c.pamphlet b/src/graph/view3d/transform3d.c.pamphlet deleted file mode 100644 index 035ef19..0000000 --- a/src/graph/view3d/transform3d.c.pamphlet +++ /dev/null @@ -1,146 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d transform3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _TRANSFORM3D_C - -#include "header.h" - -#include "all-3d.h1" - -void -matrixMultiply4x4(float xxA[4][4],float xxB[4][4],float array[4][4]) -{ - array[0][0] = xxA[0][0]*xxB[0][0] + xxA[0][1]*xxB[1][0] + - xxA[0][2]*xxB[2][0] + xxA[0][3]*xxB[3][0]; - array[1][0] = xxA[1][0]*xxB[0][0] + xxA[1][1]*xxB[1][0] + - xxA[1][2]*xxB[2][0] + xxA[1][3]*xxB[3][0]; - array[2][0] = xxA[2][0]*xxB[0][0] + xxA[2][1]*xxB[1][0] + - xxA[2][2]*xxB[2][0] + xxA[2][3]*xxB[3][0]; - array[3][0] = xxA[3][0]*xxB[0][0] + xxA[3][1]*xxB[1][0] + - xxA[3][2]*xxB[2][0] + xxA[3][3]*xxB[3][0]; - array[0][1] = xxA[0][0]*xxB[0][1] + xxA[0][1]*xxB[1][1] + - xxA[0][2]*xxB[2][1] + xxA[0][3]*xxB[3][1]; - array[1][1] = xxA[1][0]*xxB[0][1] + xxA[1][1]*xxB[1][1] + - xxA[1][2]*xxB[2][1] + xxA[1][3]*xxB[3][1]; - array[2][1] = xxA[2][0]*xxB[0][1] + xxA[2][1]*xxB[1][1] + - xxA[2][2]*xxB[2][1] + xxA[2][3]*xxB[3][1]; - array[3][1] = xxA[3][0]*xxB[0][1] + xxA[3][1]*xxB[1][1] + - xxA[3][2]*xxB[2][1] + xxA[3][3]*xxB[3][1]; - array[0][2] = xxA[0][0]*xxB[0][2] + xxA[0][1]*xxB[1][2] + - xxA[0][2]*xxB[2][2] + xxA[0][3]*xxB[3][2]; - array[1][2] = xxA[1][0]*xxB[0][2] + xxA[1][1]*xxB[1][2] + - xxA[1][2]*xxB[2][2] + xxA[1][3]*xxB[3][2]; - array[2][2] = xxA[2][0]*xxB[0][2] + xxA[2][1]*xxB[1][2] + - xxA[2][2]*xxB[2][2] + xxA[2][3]*xxB[3][2]; - array[3][2] = xxA[3][0]*xxB[0][2] + xxA[3][1]*xxB[1][2] + - xxA[3][2]*xxB[2][2] + xxA[3][3]*xxB[3][2]; - array[0][3] = xxA[0][0]*xxB[0][3] + xxA[0][1]*xxB[1][3] + - xxA[0][2]*xxB[2][3] + xxA[0][3]*xxB[3][3]; - array[1][3] = xxA[1][0]*xxB[0][3] + xxA[1][1]*xxB[1][3] + - xxA[1][2]*xxB[2][3] + xxA[1][3]*xxB[3][3]; - array[2][3] = xxA[2][0]*xxB[0][3] + xxA[2][1]*xxB[1][3] + - xxA[2][2]*xxB[2][3] + xxA[2][3]*xxB[3][3]; - array[3][3] = xxA[3][0]*xxB[0][3] + xxA[3][1]*xxB[1][3] + - xxA[3][2]*xxB[2][3] + xxA[3][3]*xxB[3][3]; -} - - -void -vectorMatrix4(float xxD[4],float xxE[4][4],float xxF[4]) -{ - xxF[0]= xxD[0]*xxE[0][0] + xxD[1]*xxE[1][0] + xxD[2]*xxE[2][0] + xxD[3]*xxE[3][0]; - xxF[1]= xxD[0]*xxE[0][1] + xxD[1]*xxE[1][1] + xxD[2]*xxE[2][1] + xxD[3]*xxE[3][1]; - xxF[2]= xxD[0]*xxE[0][2] + xxD[1]*xxE[1][2] + xxD[2]*xxE[2][2] + xxD[3]*xxE[3][2]; - xxF[3]= xxD[0]*xxE[0][3] + xxD[1]*xxE[1][3] + xxD[2]*xxE[2][3] + xxD[3]*xxE[3][3]; -} - - -void -ROTATE(float xxR[4][4]) -{ - xxR[0][0]= -(cosTheta); xxR[0][1]= -(-sinTheta*cosPhi); xxR[0][2]= -(sinTheta*sinPhi); xxR[0][3]= 0.0; - xxR[1][0]= -(sinTheta); xxR[1][1]= -(cosTheta*cosPhi); xxR[1][2]= -(-cosTheta*sinPhi); xxR[1][3]= 0.0; - xxR[2][0]= 0.0; xxR[2][1]= -(sinPhi); xxR[2][2]= -(cosPhi); xxR[2][3]= 0.0; - xxR[3][0]= 0.0; xxR[3][1]= 0.0; xxR[3][2]= 0.0; xxR[3][3]= -(1.0); -} - -void -ROTATE1(float xxR[4][4]) -{ - xxR[0][0]= (cosTheta); xxR[0][1]= (-sinTheta*cosPhi); xxR[0][2]= (sinTheta*sinPhi); xxR[0][3]= 0.0; - xxR[1][0]= (sinTheta); xxR[1][1]= (cosTheta*cosPhi); xxR[1][2]= (-cosTheta*sinPhi); xxR[1][3]= 0.0; - xxR[2][0]= 0.0; xxR[2][1]= (sinPhi); xxR[2][2]= (cosPhi); xxR[2][3]= 0.0; - xxR[3][0]= 0.0; xxR[3][1]= 0.0; xxR[3][2]= 0.0; xxR[3][3]= (1.0); -} - - -void -SCALE(float x,float y,float z,float xxS[4][4]) -{ - xxS[0][0] = x; xxS[0][1] = 0.0; xxS[0][2] = 0.0; xxS[0][3] = 0.0; - xxS[1][0] = 0.0; xxS[1][1] = y; xxS[1][2] = 0.0; xxS[1][3] = 0.0; - xxS[2][0] = 0.0; xxS[2][1] = 0.0; xxS[2][2] = z; xxS[2][3] = 0.0; - xxS[3][0] = 0.0; xxS[3][1] = 0.0; xxS[3][2] = 0.0; xxS[3][3] = 1.0; -} - - -void -TRANSLATE(float x,float y,float z,float xxT[4][4]) -{ - xxT[0][0] = 1.0; xxT[0][1] = 0.0; xxT[0][2] = 0.0; xxT[0][3] = 0.0; - xxT[1][0] = 0.0; xxT[1][1] = 1.0; xxT[1][2] = 0.0; xxT[1][3] = 0.0; - xxT[2][0] = 0.0; xxT[2][1] = 0.0; xxT[2][2] = -1.0; xxT[2][3] = 0.0; - xxT[3][0] = x; xxT[3][1] = y; xxT[3][2] = z; xxT[3][3] = 1.0; -} -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/viewport3d.c.pamphlet b/src/graph/view3d/viewport3d.c.pamphlet deleted file mode 100644 index 77fe1ed..0000000 --- a/src/graph/view3d/viewport3d.c.pamphlet +++ /dev/null @@ -1,913 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d viewport3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _VIEWPORT3D_C - -#include -#include -#include -#include -#include - -#include "spadbitmap.bitmap" -#include "spadmask.mask" - -#include "header.h" - /*** definition for the axes and labels - this is the minimun that will be - drawn on the window - thus allowing the user some idea of the - orientation of the coordinate axes when rotating, etc. The - drawing of the mesh is aborted when an appropriate X event occurs. - The mesh should be scaled to the range of [-100..100] in all - directions. axisRange defines the range...change the stuff below - if that has changed. ***/ -#include "static.h" -#include "draw.h" -#include "volume.h" -#include "mode.h" - -#include "util.h1" -#include "gfun.h1" -#include "xspadfill.h1" -#include "all-3d.h1" - -#define axesOffset 5 - -Atom wm_delete_window; - - -/*************************** - *** void writeTitle() *** - ***************************/ - -void -writeTitle (void) -{ - - int strlength; - XWindowAttributes twInfo; - - XGetWindowAttributes(dsply, viewport->titleWindow, &twInfo); - if (mono || viewport->monoOn) - GSetForeground(anotherGC, (float)foregroundColor, Xoption); - else - GSetForeground(anotherGC, (float)titleColor, Xoption); - XClearWindow(dsply, viewport->titleWindow); - - strlength = strlen(viewport->title); - GDrawImageString(anotherGC, viewport->titleWindow, - centerX(anotherGC, viewport->title, strlength, - twInfo.width), 15, - viewport->title, strlength, Xoption); - -} - - -/**************************** - * void drawPreViewport() * - * * - * draws the axes and boxes * - * before the actual stuff. * - * all incoming signals * - * should be block and no * - * check for pending X * - * events are made. * - * * - ****************************/ - -void -drawPreViewport (int dFlag) -{ - - int i, j, vPx0, vPy0, vPx1, vPy1; - /* for drawing the box */ - float vPz, absTransX, absTransY; - XPoint blackbox[3], line[2]; - RGB axes_rgb, clipbox_rgb, boundbox_rgb; - - axes_rgb.r = 0.8; axes_rgb.g = 0.6; axes_rgb.b = 0.2; - clipbox_rgb.r = 0.4; clipbox_rgb.g = 0.5; clipbox_rgb.b = 0.9; - boundbox_rgb.r = 0.4; boundbox_rgb.g = 0.7; boundbox_rgb.b = 0.9; - - XGetWindowAttributes(dsply, viewport->viewWindow, &vwInfo); - graphWindowAttrib = vwInfo; - - /* Calculate various factors for use in projection */ - /* Scale so that plot the scaling between the axes remains constant - and fits within the smaller of the two dimensions. */ - - xCenter = vwInfo.width / 2; - yCenter = vwInfo.height / 2; - - if (vwInfo.height <= vwInfo.width) { - viewScale = viewport->scale * vwInfo.height / viewHeight; - } - else { - viewScale = viewport->scale * vwInfo.width / viewWidth; - } - - /* Draw the projected image */ - /** draw the axes without heeding to X interrupts, first **/ - - if (dFlag == Xoption) /* do this for X option only */ - XClearWindow(dsply, viewport->viewWindow); - - sinTheta = sin(-viewport->axestheta); - cosTheta = cos(-viewport->axestheta); - sinPhi = sin(viewport->axesphi); - cosPhi = cos(viewport->axesphi); - - /* Create transformation matrices */ - ROTATE(R); /* angles theta and phi are global */ - SCALE(viewport->scaleX,viewport->scaleY,viewport->scaleZ,S); - TRANSLATE(-viewport->deltaX,-viewport->deltaY,0.0,T); - - /**** Pre Draw Routine ****/ - - if ((dFlag == PSoption) && (foregroundColor == white)) { - GSetForeground(globGC,(float)backgroundColor,dFlag); - blackbox[0].x = vwInfo.width; blackbox[0].y = vwInfo.height; - blackbox[1].x = 0; blackbox[1].y = 0; - blackbox[2].x = 0; blackbox[2].y = vwInfo.height; - if (viewport->monoOn || mono) { - PSFillPolygon(globGC, blackbox, 3); - } else { - PSColorPolygon(0.0,0.0,0.0,blackbox,4); - } - blackbox[0].x = vwInfo.width; blackbox[0].y = 0; - blackbox[1].x = 0; blackbox[1].y = 0; - blackbox[2].x = vwInfo.width; blackbox[2].y = vwInfo.height; - if (viewport->monoOn || mono) { - PSFillPolygon(globGC, blackbox, 3); - } else { - PSColorPolygon(0.0,0.0,0.0,blackbox,4); - } - } - - /* axes */ - - for (i=0; i < 3; i++) { - projectStuff(axes[i][0],axes[i][1],axes[i][2],&vPx0,&vPy0,&vPz); - axesXY[i][0] = vPx0; axesXY[i][1] = vPy0; axesZ[i][0] = vPz; - projectStuff(axes[i][3],axes[i][4],axes[i][5],&vPx1,&vPy1,&vPz); - axesXY[i][2] = vPx1; axesXY[i][3] = vPy1; axesZ[i][1] = vPz; - if (viewport->axesOn) { - if (viewport->monoOn || mono) { - GSetForeground(globalGC1,(float)foregroundColor,dFlag); - GSetForeground(globGC,(float)foregroundColor,dFlag); - GDrawLine(globalGC1,viewport->viewWindow,vPx0,vPy0,vPx1,vPy1,dFlag); - } else { - if (dFlag == PSoption) { - GSetForeground(globGC,(float)foregroundColor,dFlag); - line[0].x = vPx0; line[0].y = vPy0; - line[1].x = vPx1; line[1].y = vPy1; - PSDrawColor(axes_rgb.r,axes_rgb.g,axes_rgb.b,line,2); - } else { - GSetForeground(globalGC1,(float)monoColor(axesColor),dFlag); - GSetForeground(globGC,(float)monoColor(labelColor),dFlag); - GDrawLine(globalGC1,viewport->viewWindow,vPx0,vPy0,vPx1,vPy1,dFlag); - } - } - if (i == 0) { - if (axesXY[0][2] < axesXY[0][0]) vPx1 -= axesOffset; - else vPx1 += axesOffset; - if (axesXY[0][3] < axesXY[0][1]) vPy1 -= axesOffset; - else vPy1 += axesOffset; - if (!viewport->yzOn) - GDrawString(globGC,viewport->viewWindow,vPx1,vPy1,"X",1,dFlag); - } else { - if (i == 1) { - if (axesXY[1][2] < axesXY[1][0]) vPx1 -= axesOffset; - else vPx1 += axesOffset; - if (axesXY[1][3] < axesXY[1][1]) vPy1 -= axesOffset; - else vPy1 += axesOffset; - if (!viewport->xzOn) - GDrawString(globGC,viewport->viewWindow,vPx1,vPy1,"Y",1,dFlag); - } else { - if (axesXY[2][2] < axesXY[2][0]) vPx1 -= axesOffset; - else vPx1 += axesOffset; - if (axesXY[2][3] < axesXY[2][1]) vPy1 -= axesOffset; - else vPy1 += axesOffset; - if (!viewport->xyOn) - GDrawString(globGC,viewport->viewWindow,vPx1,vPy1,"Z",1,dFlag); - } - } - GSetForeground(globalGC1,(float)monoColor(buttonColor),dFlag); - GSetForeground(globGC,(float)monoColor(buttonColor),dFlag); - } /* if viewport->axesOn */ - } - - viewport->transX = (viewData.xmax + viewData.xmin)/2.0; - viewport->transY = (viewData.ymax + viewData.ymin)/2.0; - viewport->transZ = (viewData.zmax + viewData.zmin)/2.0; - - absTransX = absolute(viewport->transX); - absTransY = absolute(viewport->transY); - if ((absTransX > 0.5) || (absTransY > 0.5)) { - if (absTransX > absTransY) - reScale = 50.0 * absTransX / viewData.scaleToView; - else - reScale = 50.0 * absTransY / viewData.scaleToView; - if (reScale < 100.0) reScale = 100.0; - } else { - reScale = 100.0; - } - - sinTheta = sin(-viewport->thetaObj); - cosTheta = cos(-viewport->thetaObj); - sinPhi = sin(viewport->phiObj); - cosPhi = cos(viewport->phiObj); - ROTATE1(R1); - - if (viewport->originFlag) viewport->originFlag = no; - sinTheta = sin(-viewport->axestheta); - cosTheta = cos(-viewport->axestheta); - sinPhi = sin(viewport->axesphi); - cosPhi = cos(viewport->axesphi); - ROTATE(R); - - /* region box */ - if (viewData.clipbox) { - clipCorners[0].x = viewData.clipXmin; - clipCorners[0].y = viewData.clipYmin; - clipCorners[0].z = viewData.clipZmin; - clipCorners[1].x = viewData.clipXmax; - clipCorners[1].y = viewData.clipYmin; - clipCorners[1].z = viewData.clipZmin; - clipCorners[2].x = viewData.clipXmax; - clipCorners[2].y = viewData.clipYmin; - clipCorners[2].z = viewData.clipZmax; - clipCorners[3].x = viewData.clipXmin; - clipCorners[3].y = viewData.clipYmin; - clipCorners[3].z = viewData.clipZmax; - clipCorners[4].x = viewData.clipXmin; - clipCorners[4].y = viewData.clipYmax; - clipCorners[4].z = viewData.clipZmin; - clipCorners[5].x = viewData.clipXmax; - clipCorners[5].y = viewData.clipYmax; - clipCorners[5].z = viewData.clipZmin; - clipCorners[6].x = viewData.clipXmax; - clipCorners[6].y = viewData.clipYmax; - clipCorners[6].z = viewData.clipZmax; - clipCorners[7].x = viewData.clipXmin; - clipCorners[7].y = viewData.clipYmax; - clipCorners[7].z = viewData.clipZmax; - - GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,dFlag); - - /* project the 8 corners of the box */ - for (i=0;i<8;i++) projectAPoint(&(clipCorners[i])); - - for (i=0;i<6;i++) { - clipBox[i].inside = ((clipBox[i].pointsPtr[2]->px - - clipBox[i].pointsPtr[1]->px) * - (clipBox[i].pointsPtr[1]->py - - clipBox[i].pointsPtr[0]->py) - - (clipBox[i].pointsPtr[2]->py - - clipBox[i].pointsPtr[1]->py) * - (clipBox[i].pointsPtr[1]->px - - clipBox[i].pointsPtr[0]->px)) < 0; - if (clipBox[i].inside) { - for (j=0; j<3; j++) { - quadMesh[j].x = clipBox[i].pointsPtr[j]->px; - quadMesh[j].y = clipBox[i].pointsPtr[j]->py; - } - if (viewport->monoOn || mono) { - GSetForeground(trashGC,(float)foregroundColor,dFlag); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } else { - if (dFlag == PSoption) { - GSetForeground(trashGC,(float)clipBoxInline, dFlag); - line[0].x = quadMesh[0].x; line[0].y = quadMesh[0].y; - line[1].x = quadMesh[1].x; line[1].y = quadMesh[1].y; - PSDrawColor(clipbox_rgb.r,clipbox_rgb.g,clipbox_rgb.b,line,2); - line[0].x = quadMesh[1].x; line[0].y = quadMesh[1].y; - line[1].x = quadMesh[2].x; line[1].y = quadMesh[2].y; - PSDrawColor(clipbox_rgb.r,clipbox_rgb.g,clipbox_rgb.b,line,2); - } else { - GSetForeground(trashGC,(float)clipBoxInline, dFlag); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } - } - } - } - } /* if viewData.clipbox */ - - /* VOLUME panel stuff */ - if ((doingPanel == VOLUMEpanel) || viewData.box) { - - GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,dFlag); - - for (i=0;i<8;i++) { - /* project the 8 corners of the box */ - projectAPoint(&(corners[i])); - if (i) { - if (corners[i].pz > pzMax) pzMax = corners[i].pz; - else if (corners[i].pz < pzMin) pzMin = corners[i].pz; - } else - pzMax = pzMin = corners[i].pz; - } - - for (i=0;i<6;i++) { - /* Process the 6 sides of the boxes. - Here, we calculate, for each side (defined by two segments) - whether it is facing towards or away from the viewer. if - facing, away, we draw them first. later we draw the ones - facing the viewer. (this is a sort of backface removal - scheme. */ - /* We define the normal vector for the box as vA X vB where - vA=p2-p0 and vB=p1-p0. All we really care about, though, - is what sign the normal is (whether it is towards or away - from the viewer - so we just take the triple product of - it against the eye vector, which is, conveniently enough, - simply [0 0 1]. Hence, only the Z component of the - cross product is calculated. (Actually, we are using the - projected normal - that's how we are able to use the - trick of just taking the Z component. */ - box[i].inside = ((box[i].pointsPtr[2]->px - - box[i].pointsPtr[0]->px) * /* Ax * */ - (box[i].pointsPtr[1]->py - - box[i].pointsPtr[0]->py) - /* By - */ - (box[i].pointsPtr[2]->py - - box[i].pointsPtr[0]->py) * /* Ay * */ - (box[i].pointsPtr[1]->px - - box[i].pointsPtr[0]->px)) /* Bx */ - < 0; - if (box[i].inside) { - for (j=0; j<3; j++) { - quadMesh[j].x = box[i].pointsPtr[j]->px; - quadMesh[j].y = box[i].pointsPtr[j]->py; - } - if (viewport->monoOn || mono) { - GSetForeground(trashGC,(float)foregroundColor,dFlag); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } else { - if (dFlag == PSoption) { - GSetForeground(trashGC,(float)boxInline, dFlag ); - line[0].x = quadMesh[0].x; line[0].y = quadMesh[0].y; - line[1].x = quadMesh[1].x; line[1].y = quadMesh[1].y; - PSDrawColor(boundbox_rgb.r,boundbox_rgb.g,boundbox_rgb.b,line,2); - line[0].x = quadMesh[1].x; line[0].y = quadMesh[1].y; - line[1].x = quadMesh[2].x; line[1].y = quadMesh[2].y; - PSDrawColor(boundbox_rgb.r,boundbox_rgb.g,boundbox_rgb.b,line,2); - } else { - GSetForeground(trashGC,(float)boxInline, dFlag ); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } - } - } - } - } /* if viewData.box */ - - /* Write out view data */ - if (dFlag == Xoption) { /* do this only for X option */ - writeControlMessage(); - XFlush(dsply); - } -} - - -/********************************/ -/*** void drawTheViewport() ***/ -/********************************/ - -void -drawTheViewport (int dFlag) -{ - - int i,j; - XPoint line[2]; - RGB clipbox_rgb, boundbox_rgb; - - clipbox_rgb.r = 0.4; clipbox_rgb.g = 0.5; clipbox_rgb.b = 0.9; - boundbox_rgb.r = 0.4; boundbox_rgb.g = 0.7; boundbox_rgb.b = 0.9; - - /**** Draw Routine ****/ - - if (viewport->allowDraw && (doingPanel != VOLUMEpanel)) { - /* Do not draw the mesh stuff if we're in the process of changing - the viewing volume; we just want to see the volume */ - - /* drawMore allows the drawing to continue if no relevant XEvent occurs */ - drawMore = yes; - drawMore = keepDrawingViewport(); - draw3DComponents(dFlag); - - } /*if viewport->allowDraw */ - - /**** Post Draw Routine ****/ - if (viewData.clipbox) { /* draw the front 3 lines of region box */ - GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,dFlag); - for (i=0; i<6; i++) { - if (!(clipBox[i].inside)) { - for (j=0; j<4; j++) { - quadMesh[j].x = clipBox[i].pointsPtr[j]->px; - quadMesh[j].y = clipBox[i].pointsPtr[j]->py; - } - if (viewport->monoOn || mono) { - GSetForeground(trashGC,(float)foregroundColor,dFlag); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } else { - if (dFlag == PSoption) { - GSetForeground(trashGC,(float)boxInline, dFlag ); - line[0].x = quadMesh[0].x; line[0].y = quadMesh[0].y; - line[1].x = quadMesh[1].x; line[1].y = quadMesh[1].y; - PSDrawColor(clipbox_rgb.r,clipbox_rgb.g,clipbox_rgb.b,line,2); - line[0].x = quadMesh[1].x; line[0].y = quadMesh[1].y; - line[1].x = quadMesh[2].x; line[1].y = quadMesh[2].y; - PSDrawColor(clipbox_rgb.r,clipbox_rgb.g,clipbox_rgb.b,line,2); - } else { - GSetForeground(trashGC,(float)boxInline, dFlag ); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } - } - } - } - } - - if ((doingPanel==VOLUMEpanel) || viewData.box) { - GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,dFlag); - for (i=0; i<6; i++) { - if (!(box[i].inside)) { - for (j=0; j<4; j++) { - quadMesh[j].x = box[i].pointsPtr[j]->px; - quadMesh[j].y = box[i].pointsPtr[j]->py; - } - if (viewport->monoOn || mono) { - GSetForeground(trashGC,(float)foregroundColor,dFlag); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } else { - if (dFlag == PSoption) { - GSetForeground(trashGC,(float)boxInline, dFlag ); - line[0].x = quadMesh[0].x; line[0].y = quadMesh[0].y; - line[1].x = quadMesh[1].x; line[1].y = quadMesh[1].y; - PSDrawColor(boundbox_rgb.r,boundbox_rgb.g,boundbox_rgb.b,line,2); - line[0].x = quadMesh[1].x; line[0].y = quadMesh[1].y; - line[1].x = quadMesh[2].x; line[1].y = quadMesh[2].y; - PSDrawColor(boundbox_rgb.r,boundbox_rgb.g,boundbox_rgb.b,line,2); - } else { - GSetForeground(trashGC,(float)boxInline, dFlag ); - GDrawLines(trashGC, viewport->viewWindow, quadMesh, 3, - CoordModeOrigin, dFlag); - } - } - } - } - } - - if (dFlag == Xoption) /* do this for X option only */ - XFlush(dsply); - - if (smoothError) { - strcpy(control->message,"Cannot alloc more smooth shades."); - writeControlMessage(); - smoothError = no; - } - -} /* drawTheViewport */ - -/************************************ - *** viewPoints *makeViewport() *** - ************************************/ - -viewPoints * -makeViewport (void) -{ - - Pixmap spadbits,spadmask; - XSetWindowAttributes viewAttrib; - XSizeHints titleSizeHints; - Window viewTitleWindow, viewGraphWindow; - XColor foreColor, backColor; - - /**** create a viewport ****/ - - if (!(viewport = (viewPoints *)saymem("viewport3D.c", - 1,sizeof(viewPoints)))) { - fprintf(stderr,"Ran out of memory trying to create a viewport.\n"); - exitWithAck(RootWindow(dsply,scrn),Window,-1); - } - /* Definition of the 4x4 identity matrix. */ - I[0][0] = 1.0; I[0][1] = 0.0; I[0][2] = 0.0; I[0][3] = 0.0; - I[1][0] = 0.0; I[1][1] = 1.0; I[1][2] = 0.0; I[1][3] = 0.0; - I[2][0] = 0.0; I[2][1] = 0.0; I[2][2] = 1.0; I[2][3] = 0.0; - I[3][0] = 0.0; I[3][1] = 0.0; I[3][2] = 0.0; I[3][3] = 1.0; - - viewport->viewportKey = viewportKeyNum++; - viewport->nextViewport = 0; - viewport->prevViewport = 0; - viewport->deltaX = viewport->deltaX0 = viewData.deltaX; - viewport->deltaY = viewport->deltaY0 = viewData.deltaY; - viewport->deltaZ = viewport->deltaZ0 = viewData.deltaZ; - viewport->scale = viewport->scale0 = viewData.scale; - viewport->scaleX = viewData.scaleX; - viewport->scaleY = viewData.scaleY; - viewport->scaleZ = viewData.scaleZ; - viewport->transX = (viewData.xmax + viewData.xmin)/2.0; - viewport->transY = (viewData.ymax + viewData.ymin)/2.0; - viewport->transZ = (viewData.zmax + viewData.zmin)/2.0; - - viewport->theta = viewport->axestheta = viewport->theta0 = viewData.theta; - viewport->phi = viewport->axesphi = viewport->phi0 = viewData.phi; - viewport->thetaObj = 0.0; - viewport->phiObj = 0.0; - - strcpy(viewport->title,viewData.title); - - viewport->axesOn = yes; - viewport->regionOn = no; - viewport->monoOn = no; - viewport->zoomXOn = yes; - viewport->zoomYOn = yes; - viewport->zoomZOn = yes; - - viewport->originrOn = yes; - viewport->objectrOn = no; - viewport->originFlag = no; - - viewport->xyOn = no; - viewport->xzOn = no; - viewport->yzOn = no; - - viewport->closing = no; - viewport->allowDraw = yes; /*if no, just draw axes the first time */ - viewport->needNorm = yes; - - viewport->lightVector[0] = -0.5; - viewport->lightVector[1] = 0.5; - viewport->lightVector[2] = 0.5; - viewport->translucency = viewData.translucency; - - viewport->hueOffset = viewData.hueOff; - viewport->numberOfHues = viewData.numOfHues; - viewport->hueTop = viewData.hueOff + viewData.numOfHues; - if (viewport->hueTop > totalHues-1) viewport->hueTop = totalHues-1; - viewport->diagonals = viewData.diagonals; - - /* make theta in [0..2pi) and phi in (-pi..pi] */ - while (viewport->theta >= two_pi) { - viewport->theta -= two_pi; - } - while (viewport->theta < 0.0) { - viewport->theta += two_pi; - } - while (viewport->phi > pi) { - viewport->phi -= two_pi; - } - while (viewport->phi <= -pi) { - viewport->phi += two_pi; - } - - while (viewport->axestheta >= two_pi) { - viewport->axestheta -= two_pi; - } - while (viewport->axestheta < 0.0) { - viewport->axestheta += two_pi; - } - while (viewport->axesphi > pi) { - viewport->axesphi -= two_pi; - } - while (viewport->axesphi <= -pi) { - viewport->axesphi += two_pi; - } - - /* Initialize the rotation matrix about the origin. */ - sinTheta = sin(-viewport->theta); - cosTheta = cos(-viewport->theta); - sinPhi = sin(viewport->phi); - cosPhi = cos(viewport->phi); - ROTATE(R); /* angles theta and phi are global */ - - /* Initialize the rotation matrix about the object's center of volume. */ - sinTheta = sin(-viewport->thetaObj); - cosTheta = cos(-viewport->thetaObj); - sinPhi = sin(viewport->phiObj); - cosPhi = cos(viewport->phiObj); - ROTATE1(R1); /* angles theta and phi are global */ - - - /* Initialize the non-uniform scaling matrix. */ - SCALE(viewport->scaleX,viewport->scaleY,viewport->scaleZ,S); - /* Initialize the translation matrix. */ - TRANSLATE(-viewport->deltaX,-viewport->deltaY,0.0,T); - /**** make the windows for the viewport ****/ - spadbits = XCreateBitmapFromData(dsply,rtWindow, - spadBitmap_bits, - spadBitmap_width,spadBitmap_height); - spadmask = XCreateBitmapFromData(dsply,rtWindow, - spadMask_bits, - spadMask_width,spadMask_height); - viewAttrib.background_pixel = backgroundColor; - viewAttrib.border_pixel = foregroundColor; - - viewAttrib.override_redirect = overrideManager; - - viewAttrib.colormap = colorMap; - foreColor.pixel = foregroundColor; - backColor.pixel = backgroundColor; -/* - foreColor.pixel = viewCursorForeground; - backColor.pixel = viewCursorBackground; -*/ - XQueryColor(dsply,colorMap,&foreColor); - XQueryColor(dsply,colorMap,&backColor); - viewAttrib.cursor = XCreatePixmapCursor(dsply,spadbits,spadmask, - &foreColor,&backColor,spadBitmap_x_hot,spadBitmap_y_hot); - viewAttrib.event_mask = titleMASK; - if (viewData.vW) { - titleSizeHints.flags = PPosition | PSize; - titleSizeHints.x = viewData.vX; - titleSizeHints.y = viewData.vY; - titleSizeHints.width = viewData.vW; - titleSizeHints.height = viewData.vH; - } else { /* ain't gonna allow this for now... */ - titleSizeHints.flags = PSize; - titleSizeHints.width = viewWidth; - titleSizeHints.height = viewHeight; - } - - viewTitleWindow = XCreateWindow(dsply /* display */, - rtWindow, /* parent */ - viewData.vX, /* x */ - viewData.vY, /* y */ - viewData.vW, /* width */ - viewData.vH, /* height */ - /* viewBorderWidth+3*/ 0, /* border width */ - CopyFromParent, /* depth */ - InputOutput, /* class */ - CopyFromParent, /* visual */ - viewportTitleCreateMASK,/* valuemask */ - &viewAttrib /* attributes */); - - wm_delete_window = XInternAtom(dsply, "WM_DELETE_WINDOW", False); - (void) XSetWMProtocols(dsply, viewTitleWindow, &wm_delete_window, 1); - - XSetNormalHints(dsply,viewTitleWindow,&titleSizeHints); - if (strlen(viewport->title) < 30) - XSetStandardProperties(dsply,viewTitleWindow,"AXIOM 3D",viewport->title, - None,NULL,0,&titleSizeHints); - else - XSetStandardProperties(dsply,viewTitleWindow,"AXIOM 3D","3D AXIOM Graph", - None,NULL,0,&titleSizeHints); - viewport->titleWindow = viewTitleWindow; - - viewAttrib.event_mask = viewportMASK; - viewSizeHints.flags = PPosition | PSize; - viewSizeHints.x = -(viewBorderWidth+3); - viewSizeHints.x = 0; /* lose this */ - viewSizeHints.y = titleHeight; - viewSizeHints.width = titleSizeHints.width; - viewSizeHints.height = titleSizeHints.height-(titleHeight+appendixHeight); - - viewGraphWindow = XCreateWindow(dsply, /* display */ - viewTitleWindow, /* parent */ - viewSizeHints.x, /* x */ - viewSizeHints.y, /* y */ - viewSizeHints.width, /* width */ - viewSizeHints.height, /* height */ - /* viewBorderWidth+3*/0, /* border width */ - CopyFromParent, /* depth */ - InputOutput, /* class */ - CopyFromParent, /* visual */ - viewportCreateMASK, /* valuemask */ - &viewAttrib /* attributes */); - XSetNormalHints(dsply,viewGraphWindow,&viewSizeHints); - XSetStandardProperties(dsply,viewGraphWindow,"","",None,NULL,0, - &viewSizeHints); - viewport->viewWindow = viewGraphWindow; - graphWindowAttrib.width = viewSizeHints.width; - graphWindowAttrib.height = viewSizeHints.height; - - if (viewport->hueOffset != viewport->hueTop) { - multiColorFlag = yes; - redoColor = no; - } else { - if (viewport->hueTop < 11) - smoothHue = viewport->hueTop*6; - else { - if (viewport->hueTop > 10 && viewport->hueTop < 16) - smoothHue = viewport->hueTop*20 - 140; - else smoothHue = viewport->hueTop*12 - 12; - } - redoColor = yes; - } - - /**** Make the control panel for the viewport. ****/ - - XSync(dsply,0); - - control = viewport->controlPanel = makeControlPanel(); - makeLightingPanel(); - makeVolumePanel(); - makeSavePanel(); - makeQuitPanel(); - - if ((viewport->haveControl = viewData.showCP)) - putControlPanelSomewhere(anywhere); - - firstTime = yes; - return(viewport); - -} /* makeViewport() */ - - -/***************************** - * void postMakeViewport() * - * * - * post processing when * - * creating a viewport. * - * 1) assign min,max values * - * for the box volume * - *****************************/ - -void -postMakeViewport (void) -{ - - corners[0].x = viewData.xmin; corners[0].y = viewData.ymin; - corners[0].z = viewData.zmin; - corners[1].x = viewData.xmax; corners[1].y = viewData.ymin; - corners[1].z = viewData.zmin; - corners[2].x = viewData.xmax; corners[2].y = viewData.ymin; - corners[2].z = viewData.zmax; - corners[3].x = viewData.xmin; corners[3].y = viewData.ymin; - corners[3].z = viewData.zmax; - corners[4].x = viewData.xmin; corners[4].y = viewData.ymax; - corners[4].z = viewData.zmin; - corners[5].x = viewData.xmax; corners[5].y = viewData.ymax; - corners[5].z = viewData.zmin; - corners[6].x = viewData.xmax; corners[6].y = viewData.ymax; - corners[6].z = viewData.zmax; - corners[7].x = viewData.xmin; corners[7].y = viewData.ymax; - corners[7].z = viewData.zmax; - - box[2].pointsPtr[0] = &(corners[0]); - box[2].pointsPtr[1] = &(corners[1]); - box[2].pointsPtr[2] = &(corners[2]); - box[2].pointsPtr[3] = &(corners[3]); - - box[3].pointsPtr[0] = &(corners[1]); - box[3].pointsPtr[1] = &(corners[5]); - box[3].pointsPtr[2] = &(corners[6]); - box[3].pointsPtr[3] = &(corners[2]); - - box[0].pointsPtr[0] = &(corners[4]); - box[0].pointsPtr[1] = &(corners[7]); - box[0].pointsPtr[2] = &(corners[6]); - box[0].pointsPtr[3] = &(corners[5]); - - box[1].pointsPtr[0] = &(corners[0]); - box[1].pointsPtr[1] = &(corners[3]); - box[1].pointsPtr[2] = &(corners[7]); - box[1].pointsPtr[3] = &(corners[4]); - - box[5].pointsPtr[0] = &(corners[3]); - box[5].pointsPtr[1] = &(corners[2]); - box[5].pointsPtr[2] = &(corners[6]); - box[5].pointsPtr[3] = &(corners[7]); - - box[4].pointsPtr[0] = &(corners[0]); - box[4].pointsPtr[1] = &(corners[4]); - box[4].pointsPtr[2] = &(corners[5]); - box[4].pointsPtr[3] = &(corners[1]); - - /* clip box */ - - clipBox[0].pointsPtr[0] = &(clipCorners[0]); - clipBox[0].pointsPtr[1] = &(clipCorners[1]); - clipBox[0].pointsPtr[2] = &(clipCorners[2]); - clipBox[0].pointsPtr[3] = &(clipCorners[3]); - - clipBox[1].pointsPtr[0] = &(clipCorners[1]); - clipBox[1].pointsPtr[1] = &(clipCorners[5]); - clipBox[1].pointsPtr[2] = &(clipCorners[6]); - clipBox[1].pointsPtr[3] = &(clipCorners[2]); - - clipBox[2].pointsPtr[0] = &(clipCorners[4]); - clipBox[2].pointsPtr[1] = &(clipCorners[7]); - clipBox[2].pointsPtr[2] = &(clipCorners[6]); - clipBox[2].pointsPtr[3] = &(clipCorners[5]); - - clipBox[3].pointsPtr[0] = &(clipCorners[0]); - clipBox[3].pointsPtr[1] = &(clipCorners[3]); - clipBox[3].pointsPtr[2] = &(clipCorners[7]); - clipBox[3].pointsPtr[3] = &(clipCorners[4]); - - clipBox[4].pointsPtr[0] = &(clipCorners[3]); - clipBox[4].pointsPtr[1] = &(clipCorners[2]); - clipBox[4].pointsPtr[2] = &(clipCorners[6]); - clipBox[4].pointsPtr[3] = &(clipCorners[7]); - - clipBox[5].pointsPtr[0] = &(clipCorners[0]); - clipBox[5].pointsPtr[1] = &(clipCorners[4]); - clipBox[5].pointsPtr[2] = &(clipCorners[5]); - clipBox[5].pointsPtr[3] = &(clipCorners[1]); - - -} - - -/***************************************** - *** int keepDrawingViewport() *** - *****************************************/ - - - - -int -keepDrawingViewport(void) -{ - - XEvent peekEvent; - int retVal; - - if (XPending(dsply)) { - XPeekEvent(dsply,&peekEvent); - if (((peekEvent.type == Expose) && - ((peekEvent.xany).window == viewport->viewWindow)) || - ((peekEvent.type == Expose) && - ((peekEvent.xany).window == viewport->titleWindow)) || - ((peekEvent.type == Expose) && - ((peekEvent.xany).window == control->controlWindow))) { - retVal = firstTime; - } else if ((peekEvent.xbutton.type == ButtonRelease) || - ((peekEvent.type == LeaveNotify) && !(followMouse)) || - ((peekEvent.type == MotionNotify) && !(followMouse)) || - (peekEvent.type == ResizeRequest)) { - XNextEvent(dsply,&peekEvent); - followMouse = no; - retVal = yes; - } else if ((peekEvent.xany).window == (control->buttonQueue[hideControl]).self) { - viewport->haveControl = no; - XUnmapWindow(dsply,control->controlWindow); - retVal = yes; - } else { - retVal = no; - } - } else { - retVal = !followMouse; - } - - if (writeImage) retVal = yes; - drawMore = no; - return(retVal); - -} -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/volume.h b/src/graph/view3d/volume.h deleted file mode 100755 index 35d60c4..0000000 --- a/src/graph/view3d/volume.h +++ /dev/null @@ -1,169 +0,0 @@ -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*#define rightLeft*/ -#define leftRight -#define newStuff - - /******* Define's ********/ - /*** box colors ***/ -#define boxInline monoColor(140) -#define boxOutline monoColor(140) -#define clipBoxInline monoColor(148) -#define clipBoxOutline monoColor(148) - -#define lightB 205 -#define lightPotA (control->buttonQueue[lightMoveZ].buttonY - 15) -#define lightPotB (control->buttonQueue[lightMoveZ].buttonY +\ - control->buttonQueue[lightMoveZ].buttonHeight + 7) -#define lightTransL (control->buttonQueue[lightTranslucent].buttonX - 20) - -#define volumeTitleColor monoColor(77) -#define volumeTitleA 190 -#define volumeTitleB 217 - -#define volumeMASK ExposureMask - -#define frustrumColor monoColor(147) -#define frustrumX 30 -#define frustrumY 20 -#define frustrumLength 100 -#define frustrumMidY 70 /* frustrumY + frustrumLength/2 */ -#define frustrumBotY (frustrumY + frustrumLength) -#ifdef newStuff -#define frustrumMin (control->buttonQueue[frustrumBut].xHalf) -#define frustrumMax (frustrumMin + \ - (control->buttonQueue[frustrumBut].xHalf)) -#endif - -#define hitherColor monoColor(68) /* clipping plane */ -#define hitherMinX (frustrumX + 5) -#define hitherMaxX (frustrumMin - 30) -#define hitherWinX (hitherMinX - 5) -#define hitherWinY (frustrumBotY + 10) -#define hitherWidth (hitherMaxX - hitherMinX + 10) -#define hitherHeight 20 -#define hitherBarY (hitherWinY + 10) /* hitherWinY + hitherHeight/2 */ - -#ifdef newStuff -#define eyeColor monoColor(131) -#define eyeMinX frustrumMin -#define eyeMaxX frustrumMax -#define eyeWinX (eyeMinX - 5) -#define eyeWinY hitherWinY -#define eyeWidth (eyeMaxX - eyeMinX + 10) -#define eyeHeight hitherHeight -#define eyeBarY hitherBarY -#endif - -#define volumeButtonColor monoColor(157) - -#define frustrumWindowX 30 -#define frustrumWindowY 28 -#define frustrumWindowWidth (controlWidth - 60) -#define frustrumWindowHeight (frustrumBotY + 40) - -/**** clip volume ****/ -#define lengthFace 80 -#ifdef rightLeft -#define backFaceX 190 -#endif -#ifdef leftRight -#define backFaceX 33 -#endif -#define backFaceY 255 -#define deltaFace 25 -#define zLength 35.355 /* sqrt(2*deltaFace^2) */ -#ifdef rightLeft -#define frontFaceX (backFaceX - deltaFace) -#endif -#ifdef leftRight -#define frontFaceX (backFaceX + deltaFace) -#endif -#define frontFaceY (backFaceY + deltaFace) - - -#define majorAxis lengthFace /* size of the potentiometers */ -#define minorAxis 20 -#define midAxis 40 - -#define clipXButX backFaceX -#define clipXButY (backFaceY-30) - -#ifdef rightLeft -#define clipYButX (frontFaceX - minorAxis - 10) -#endif -#ifdef leftRight -#define clipYButX (frontFaceX + lengthFace + 10) -#endif -#define clipYButY frontFaceY - -#ifdef rightLeft -#define clipZButX clipYButX /* align left side */ -#endif -#ifdef leftRight -#define clipZButX (clipYButX+minorAxis-midAxis) /* align right side */ -#endif -#define clipZButY clipXButY - -#define zFactor 0.6 /* ratio of clipZBut box & actual input area */ -#define minDistXY 0.1 /* min distance between normalized clip faces */ -#define minDistZ 0.06 /* 2/3 of XY */ - - -#ifdef rightLeft -#define AA (clipZButX + midAxis) -#define BB clipZButY -#define CC backFaceX -#define DD backFaceY -#define EE frontFaceX -#define FF frontFaceY -#define clipZButTopEndX ((AA+BB+CC-DD)/2) -#define clipZButTopEndY ((AA+BB-CC+DD)/2) -#define clipZButBotEndX ((AA+BB+EE-FF)/2) -#define clipZButBotEndY ((AA+BB-EE+FF)/2) -#endif - -#ifdef leftRight -#define AA clipZButX -#define BB clipZButY -#define CC (backFaceX + majorAxis) -#define DD backFaceY -#define EE (frontFaceX + majorAxis) -#define FF frontFaceY - -#define clipZButTopEndX ((AA-BB+CC+DD)/2) -#define clipZButTopEndY ((BB-AA+CC+DD)/2) -#define clipZButBotEndX ((AA-BB+EE+FF)/2) -#define clipZButBotEndY ((BB-AA+EE+FF)/2) -#endif diff --git a/src/graph/view3d/volume3d.c.pamphlet b/src/graph/view3d/volume3d.c.pamphlet deleted file mode 100644 index ee72fe7..0000000 --- a/src/graph/view3d/volume3d.c.pamphlet +++ /dev/null @@ -1,857 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d volume3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _VOLUME3D_C - -#include -#include - -#include "header.h" -#include "cpanel.h" -#include "process.h" -#include "volume.h" -#include "../include/purty/volume.bitmap" -#include "../include/purty/volume.mask" - - - -#include "xspadfill.h1" -#include "gfun.h1" -#include "all-3d.h1" - -#define eyeDistMessX (frusX(eyeWinX+27)) -#define eyeDistMessY (frusY(eyeWinY-5)) -#define hitherMessX (frusX(hitherWinX+15)) -#define hitherMessY (frusY(hitherWinY)) - -#define clipXMessX (control->buttonQueue[clipXBut].buttonX + \ - control->buttonQueue[clipXBut].xHalf) -#define clipXMessY (control->buttonQueue[clipXBut].buttonY + 2) -#define clipYMessX (control->buttonQueue[clipYBut].buttonX + \ - control->buttonQueue[clipYBut].buttonWidth-2) -#define clipYMessY (control->buttonQueue[clipYBut].buttonY + \ - control->buttonQueue[clipYBut].yHalf) -#define clipZMessX (control->buttonQueue[clipZBut].buttonX + \ - control->buttonQueue[clipZBut].xHalf+4) -#define clipZMessY (control->buttonQueue[clipZBut].buttonY + \ - control->buttonQueue[clipZBut].yHalf-4) - -#define volumeCursorForeground monoColor(68) -#define volumeCursorBackground monoColor(197) - -#define hitherBoxColor monoColor(141) -#define hitherBoxTop (frustrumMidY - 10) -#define hitherBoxHeight 20 - -#define clipButtonColor 144 -#define toggleColor 42 -#define arcColor 75 - -#define arcSize 6 -#define tinyArc 5 -#define blank 4 -#define toggleX 190 -#define toggleY 280 - -#define oldWay - -#define frusX(x) (control->buttonQueue[frustrumBut].buttonX + x) -#define frusY(y) (control->buttonQueue[frustrumBut].buttonY + y) - -#define clipMessX 7 -#define clipMessY (control->buttonQueue[clipXBut].buttonY + 15) - /* someotherFont holds title font (see main.c) */ -#define clipMessDy (globalFont->max_bounds.ascent/2 + \ - globalFont->max_bounds.descent) -static char *clipMess = "Clip Volume"; - -#define eyeMess1Dy clipMessDy -#define eyeMess1X 7 -#define eyeMess1Y (frustrumY + 40 + 3*eyeMess1Dy) -static char *eyeMess1 = "Eye"; - -#define eyeMess2X (globalFont->max_bounds.width + 14) -#define eyeMess2Y (frustrumY + 40) -#define eyeMess2Dy eyeMess1Dy -static char *eyeMess2 = "Reference"; - - - /* global stuff */ -int flatClipBoxX[8], flatClipBoxY[8]; - - - - -/******************* volume buttons **********************/ - -int -initVolumeButtons (buttonStruct *volumeButtons) -{ - int ii, num = 0; - - ii = volumeReturn; - volumeButtons[ii].buttonX = 154; - volumeButtons[ii].buttonY = 370; - volumeButtons[ii].buttonWidth = 110; - volumeButtons[ii].buttonHeight = 24; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = no; - volumeButtons[ii].mask = buttonMASK; - volumeButtons[ii].text = "Return"; - volumeButtons[ii].textColor = 52; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = volumeAbort; - volumeButtons[ii].buttonX = 36; - volumeButtons[ii].buttonY = 370; - volumeButtons[ii].buttonWidth = 110; - volumeButtons[ii].buttonHeight = 24; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = no; - volumeButtons[ii].mask = buttonMASK; - volumeButtons[ii].text = "Abort"; - volumeButtons[ii].textColor = 28; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = frustrumBut; - volumeButtons[ii].buttonX = frustrumWindowX; - volumeButtons[ii].buttonY = frustrumWindowY; - volumeButtons[ii].buttonWidth = frustrumWindowWidth; - volumeButtons[ii].buttonHeight = frustrumWindowHeight; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = yes; - volumeButtons[ii].mask = potMASK; - volumeButtons[ii].text = "Frustrum Window"; - volumeButtons[ii].textColor = frustrumColor; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = perspectiveBut; - volumeButtons[ii].buttonX = toggleX; - volumeButtons[ii].buttonY = toggleY; - volumeButtons[ii].buttonWidth = 10; - volumeButtons[ii].buttonHeight = 10; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = no; - volumeButtons[ii].mask = potMASK; - volumeButtons[ii].text = "Perspective"; - volumeButtons[ii].textColor = arcColor; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = clipRegionBut; - volumeButtons[ii].buttonX = toggleX; - volumeButtons[ii].buttonY = toggleY+20; - volumeButtons[ii].buttonWidth = 10; - volumeButtons[ii].buttonHeight = 10; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = no; - volumeButtons[ii].mask = potMASK; - volumeButtons[ii].text = "Show Region"; - volumeButtons[ii].textColor = arcColor; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = clipSurfaceBut; - volumeButtons[ii].buttonX = toggleX; - volumeButtons[ii].buttonY = toggleY+40; - volumeButtons[ii].buttonWidth = 10; - volumeButtons[ii].buttonHeight = 10; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = no; - volumeButtons[ii].mask = potMASK; - volumeButtons[ii].text = "Clipping On"; - volumeButtons[ii].textColor = arcColor; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = clipXBut; - volumeButtons[ii].buttonX = clipXButX; - volumeButtons[ii].buttonY = clipXButY; - volumeButtons[ii].buttonWidth = majorAxis; - volumeButtons[ii].buttonHeight = minorAxis; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = yes; - volumeButtons[ii].mask = potMASK; - volumeButtons[ii].text = "Clip X"; - volumeButtons[ii].textColor = clipButtonColor; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = clipYBut; - volumeButtons[ii].buttonX = clipYButX; - volumeButtons[ii].buttonY = clipYButY; - volumeButtons[ii].buttonWidth = minorAxis; - volumeButtons[ii].buttonHeight = majorAxis; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = yes; - volumeButtons[ii].mask = potMASK; - volumeButtons[ii].text = "Clip Y"; - volumeButtons[ii].textColor = clipButtonColor; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - ii = clipZBut; - volumeButtons[ii].buttonX = clipZButX; - volumeButtons[ii].buttonY = clipZButY; - volumeButtons[ii].buttonWidth = midAxis; - volumeButtons[ii].buttonHeight = midAxis; - volumeButtons[ii].buttonKey = ii; - volumeButtons[ii].pot = yes; - volumeButtons[ii].mask = potMASK; - volumeButtons[ii].text = "Clip Z"; - volumeButtons[ii].textColor = clipButtonColor; - volumeButtons[ii].xHalf = volumeButtons[ii].buttonWidth/2; - volumeButtons[ii].yHalf = volumeButtons[ii].buttonHeight/2; - ++num; - - return(num); -} - - -/************************* - * int makeVolumePanel() * - *************************/ - -void -makeVolumePanel (void) -{ - - int i; - XSetWindowAttributes cwAttrib, controlAttrib; - XSizeHints sizehint; - Pixmap volumebits, volumemask; - XColor foreColor, backColor; - - volumebits = XCreateBitmapFromData(dsply,rtWindow,volumeBitmap_bits, - volumeBitmap_width,volumeBitmap_height); - volumemask = XCreateBitmapFromData(dsply,rtWindow,volumeMask_bits, - volumeMask_width,volumeMask_height); - cwAttrib.background_pixel = backgroundColor; - cwAttrib.border_pixel = foregroundColor; - cwAttrib.event_mask = volumeMASK; - cwAttrib.colormap = colorMap; - cwAttrib.override_redirect = overrideManager; - foreColor.pixel = volumeCursorForeground; - XQueryColor(dsply,colorMap,&foreColor); - backColor.pixel = volumeCursorBackground; - XQueryColor(dsply,colorMap,&backColor); - cwAttrib.cursor = XCreatePixmapCursor(dsply,volumebits,volumemask, - &foreColor,&backColor, - volumeBitmap_x_hot, - volumeBitmap_y_hot); - volumeWindow = XCreateWindow(dsply,control->controlWindow, - -3,-3,controlWidth,controlHeight,3, - CopyFromParent,InputOutput,CopyFromParent, - controlCreateMASK,&cwAttrib); - - sizehint.flags = USPosition | USSize; - sizehint.x = 0; - sizehint.y = 0; - sizehint.width = controlWidth; - sizehint.height = controlHeight; - /*** the None stands for icon pixmap ***/ - XSetNormalHints(dsply,volumeWindow,&sizehint); - XSetStandardProperties(dsply,volumeWindow,"Volume Panel 3D", - "View Volume",None,NULL,0,&sizehint); - - /*** volume frustrum window ***/ - - /*** do volume buttons ***/ - initVolumeButtons(control->buttonQueue); - for (i=volumeButtonsStart; i<(volumeButtonsEnd); i++) { - controlAttrib.event_mask = (control->buttonQueue[i]).mask; - (control->buttonQueue[i]).self = - XCreateWindow(dsply,volumeWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight, - 0,0,InputOnly,CopyFromParent, - buttonCreateMASK,&controlAttrib); - XMakeAssoc(dsply,table,(control->buttonQueue[i]).self, - &((control->buttonQueue[i]).buttonKey)); - XMapWindow(dsply,(control->buttonQueue[i]).self); - } - -} /* makeVolumePanel() */ - - -void -drawClipXBut (void) -{ - - XClearArea(dsply,volumeWindow,clipXButX,clipXButY, - majorAxis+blank,minorAxis+blank,False); - GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipXBut]).buttonX, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf, - (control->buttonQueue[clipXBut]).buttonX + - (control->buttonQueue[clipXBut]).buttonWidth, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipXBut]).buttonX-3, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf-3, - (control->buttonQueue[clipXBut]).buttonX, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipXBut]).buttonX-3, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf+3, - (control->buttonQueue[clipXBut]).buttonX, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipXBut]).buttonX + - (control->buttonQueue[clipXBut]).buttonWidth+3, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf-3, - (control->buttonQueue[clipXBut]).buttonX + - (control->buttonQueue[clipXBut]).buttonWidth, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipXBut]).buttonX + - (control->buttonQueue[clipXBut]).buttonWidth+3, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf+3, - (control->buttonQueue[clipXBut]).buttonX + - (control->buttonQueue[clipXBut]).buttonWidth, - (control->buttonQueue[clipXBut]).buttonY + - (control->buttonQueue[clipXBut]).yHalf,Xoption); - - GSetForeground(trashGC,(float)monoColor(arcColor),Xoption); - GFillArc(trashGC,volumeWindow, - (int)(xClipMinN * (majorAxis-tinyArc) + clipXButX), /* x value */ - (int)(clipXButY + minorAxis/2 + 1), /* y value */ - arcSize,arcSize,0,360*64,Xoption); /* 64 units per degree */ - GFillArc(trashGC,volumeWindow, - (int)(xClipMaxN * (majorAxis-tinyArc) + clipXButX), /* x value */ - (int)(clipXButY + minorAxis/2 - 7), /* y value */ - arcSize,arcSize,0,360*64,Xoption); /* 64 units per degree */ - - GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption); - GDrawString(volumeGC,volumeWindow,clipXMessX,clipXMessY,"X",1,Xoption); - -} - -void -drawClipYBut (void) -{ - - XClearArea(dsply,volumeWindow,clipYButX,clipYButY, - minorAxis+blank,majorAxis+blank,False); - GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf, - (control->buttonQueue[clipYBut]).buttonY, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf, - (control->buttonQueue[clipYBut]).buttonY + - (control->buttonQueue[clipYBut]).buttonHeight,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf-3, - (control->buttonQueue[clipYBut]).buttonY-3, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf, - (control->buttonQueue[clipYBut]).buttonY,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf+3, - (control->buttonQueue[clipYBut]).buttonY-3, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf, - (control->buttonQueue[clipYBut]).buttonY,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf-3, - (control->buttonQueue[clipYBut]).buttonY + - (control->buttonQueue[clipYBut]).buttonHeight+3, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf, - (control->buttonQueue[clipYBut]).buttonY + - (control->buttonQueue[clipYBut]).buttonHeight,Xoption); - GDrawLine(trashGC,volumeWindow, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf+3, - (control->buttonQueue[clipYBut]).buttonY + - (control->buttonQueue[clipYBut]).buttonHeight+3, - (control->buttonQueue[clipYBut]).buttonX + - (control->buttonQueue[clipYBut]).xHalf, - (control->buttonQueue[clipYBut]).buttonY + - (control->buttonQueue[clipYBut]).buttonHeight,Xoption); - - GSetForeground(trashGC,(float)monoColor(arcColor),Xoption); - - /* note: minimum buttons closer to the box */ - GFillArc(trashGC,volumeWindow, - (int)(clipYButX + minorAxis/2 - 8), - (int)(yClipMinN * (majorAxis-tinyArc) + clipYButY), - arcSize,arcSize,90*64,360*64,Xoption); /* 64 units per degree */ - GFillArc(trashGC,volumeWindow, - (int)(clipYButX + minorAxis/2 + 3), - (int)(yClipMaxN * (majorAxis-tinyArc) + clipYButY), - arcSize,arcSize,90*64,360*64,Xoption); /* 64 units per degree */ - - GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption); - GDrawString(volumeGC,volumeWindow,clipYMessX,clipYMessY,"Y",1,Xoption); - -} - - -void -drawClipZBut (void) -{ - - XClearArea(dsply,volumeWindow,clipZButX,clipZButY, - midAxis+blank,midAxis+blank,False); - GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption); - GDrawLine(trashGC,volumeWindow,clipZButTopEndX,clipZButTopEndY, - clipZButBotEndX,clipZButBotEndY,Xoption); - GDrawLine(trashGC,volumeWindow,clipZButTopEndX-4,clipZButTopEndY, - clipZButTopEndX,clipZButTopEndY,Xoption); - - GDrawLine(trashGC,volumeWindow,clipZButTopEndX,clipZButTopEndY-4, - clipZButTopEndX,clipZButTopEndY,Xoption); - - GDrawLine(trashGC,volumeWindow,clipZButBotEndX+4,clipZButBotEndY, - clipZButBotEndX,clipZButBotEndY,Xoption); - - GDrawLine(trashGC,volumeWindow,clipZButBotEndX,clipZButBotEndY+4, - clipZButBotEndX,clipZButBotEndY,Xoption); - - - GSetForeground(trashGC,(float)monoColor(arcColor),Xoption); - GFillArc(trashGC,volumeWindow, - (int)(zClipMinN * midAxis * zFactor + clipZButTopEndX - 3), - (int)(zClipMinN * midAxis * zFactor + clipZButTopEndY + 3), - arcSize,arcSize,45*64,360*64,Xoption); /* 64 units per degree */ - GFillArc(trashGC,volumeWindow, - (int)(zClipMaxN * midAxis * zFactor + clipZButTopEndX + 3), - (int)(zClipMaxN * midAxis * zFactor + clipZButTopEndY - 5), - arcSize,arcSize,45*64,360*64,Xoption); /* 64 units per degree */ - - GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption); - GDrawString(volumeGC,volumeWindow,clipZMessX,clipZMessY,"Z",1,Xoption); - -} - - -void -drawClipVolume (void) -{ - - float xminL,xmaxL,yminL,ymaxL,zminL,zmaxL; - - XClearArea(dsply,volumeWindow,backFaceX-1,backFaceY, - lengthFace+deltaFace+2,lengthFace+deltaFace+1,False); - - GSetForeground(trashGC,(float)boxInline,Xoption); /*boxOutline=133*/ - GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,Xoption); - - /* define corners of volume, clockwise, back to front */ - xminL = xClipMinN*lengthFace; - xmaxL = xClipMaxN*lengthFace; - yminL = yClipMinN*lengthFace; - ymaxL = yClipMaxN*lengthFace; - zminL = zClipMinN*zLength; - zmaxL = (1-zClipMaxN)*zLength; /* percentage upwards from bottom */ - - flatClipBoxX[0] = backFaceX + xminL + zminL; - flatClipBoxY[0] = backFaceY + yminL + zminL; - flatClipBoxX[1] = backFaceX + xmaxL + zminL; - flatClipBoxY[1] = flatClipBoxY[0]; - flatClipBoxX[2] = flatClipBoxX[1]; - flatClipBoxY[2] = backFaceY + ymaxL + zminL; - flatClipBoxX[3] = flatClipBoxX[0]; - flatClipBoxY[3] = flatClipBoxY[2]; - flatClipBoxX[4] = frontFaceX + xminL - zmaxL; - flatClipBoxY[4] = frontFaceY + yminL - zmaxL; - flatClipBoxX[5] = frontFaceX + xmaxL - zmaxL; - flatClipBoxY[5] = flatClipBoxY[4]; - flatClipBoxX[6] = flatClipBoxX[5]; - flatClipBoxY[6] = frontFaceY + ymaxL - zmaxL; - flatClipBoxX[7] = flatClipBoxX[4]; - flatClipBoxY[7] = flatClipBoxY[6]; - - /* now draw the volume */ - GDrawRectangle(trashGC,volumeWindow, - flatClipBoxX[0],flatClipBoxY[0], - flatClipBoxX[2]-flatClipBoxX[0], - flatClipBoxY[2]-flatClipBoxY[0],Xoption); - GDrawLine(trashGC,volumeWindow, - flatClipBoxX[0],flatClipBoxY[0],flatClipBoxX[4],flatClipBoxY[4],Xoption); - GDrawLine(trashGC,volumeWindow, - flatClipBoxX[1],flatClipBoxY[1],flatClipBoxX[5],flatClipBoxY[5],Xoption); - GDrawLine(trashGC,volumeWindow, - flatClipBoxX[2],flatClipBoxY[2],flatClipBoxX[6],flatClipBoxY[6],Xoption); - GDrawLine(trashGC,volumeWindow, - flatClipBoxX[3],flatClipBoxY[3],flatClipBoxX[7],flatClipBoxY[7],Xoption); - GSetForeground(trashGC,(float)boxOutline,Xoption); - GDrawRectangle(trashGC,volumeWindow, - flatClipBoxX[4],flatClipBoxY[4], - flatClipBoxX[6]-flatClipBoxX[4], - flatClipBoxY[6]-flatClipBoxY[4],Xoption); - /* make sure volumeGC is set properly before calling these functions */ - -} /* drawClipVolume() */ - - -void -drawHitherControl (void) -{ - - float xx,b,slope; - int hitherTop, hitherBot; - - float b0x,b1x; - - /* draw box indicating minimum and maximum distance of projection */ - GSetForeground(trashGC,(float)hitherBoxColor,Xoption); - b0x = (pzMin - clipPlaneMin)/(clipPlaneMax-clipPlaneMin); - b0x = hitherMaxX - b0x*(hitherMaxX - hitherMinX); /* screen x */ - b1x = (pzMax - clipPlaneMin)/(clipPlaneMax-clipPlaneMin); - b1x = hitherMaxX - b1x*(hitherMaxX - hitherMinX); /* screen x */ - GDraw3DButtonOut(trashGC,volumeWindow, - (int)(b0x),frusY(hitherBoxTop), - (int)fabs(b1x-b0x),hitherBoxHeight,Xoption); - - /* draw the hither plane */ - GSetForeground(trashGC,(float)hitherColor,Xoption); - - /* percentage x */ - xx = ((viewData.clipPlane-clipPlaneMin)/(clipPlaneMax-clipPlaneMin)); - xx = hitherMaxX - xx*(hitherMaxX - hitherMinX); /* screen x */ - slope = ((float)frustrumY - frustrumMidY)/(frustrumX - frustrumVertex); - b = ((float)frustrumX*frustrumMidY - frustrumVertex*frustrumY) / - (frustrumX - frustrumVertex); - hitherTop = slope * xx + b + 0.5; - slope = (float)(frustrumBotY - frustrumMidY)/(frustrumX - frustrumVertex); - b = ((float)frustrumX*frustrumMidY - frustrumVertex*frustrumBotY) / - (frustrumX - frustrumVertex); - hitherBot = slope * xx + b + 0.5; - GDrawLine(trashGC,volumeWindow, frusX((int)xx),frusY(hitherTop), - frusX((int)xx),frusY(hitherBot),Xoption); - - /* draw hither control box and bar */ - GDraw3DButtonOut(trashGC,volumeWindow, - frusX(hitherWinX),frusY(hitherWinY+5), - hitherWidth,hitherHeight,Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(hitherMinX),frusY(hitherBarY+5), - frusX(hitherMaxX),frusY(hitherBarY+5),Xoption); - /* draw hither plane I/O pointer arrow */ - - GDrawLine(trashGC,volumeWindow, - frusX((int)xx),frusY(hitherBarY+2), - frusX((int)xx),frusY(hitherBarY+8),Xoption); - - /* print string label */ - GSetForeground(volumeGC,(float)hitherColor,Xoption); - GDrawString(volumeGC,volumeWindow,hitherMessX,hitherMessY,"Hither",6,Xoption); - -} - -void -drawEyeControl (void) -{ - - float here; - int there; - - GSetForeground(trashGC,(float)eyeColor,Xoption); - - /* draw the eyeDistance box & slide bar */ - GDraw3DButtonOut(trashGC,volumeWindow, - frusX(eyeWinX),frusY(eyeWinY+5),eyeWidth,eyeHeight,Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(eyeMinX),frusY(eyeBarY+5),frusX(eyeMaxX),frusY(eyeBarY+5),Xoption); - here = (viewData.eyeDistance - minEyeDistance) / - (maxEyeDistance - minEyeDistance); - here = pow((double)here,0.333333); - there = here * (eyeMaxX - eyeMinX) + eyeMinX; /* screen x */ - GDrawLine(trashGC,volumeWindow, - frusX(there),frusY(eyeBarY+2),frusX(there),frusY(eyeBarY+8),Xoption); - - /* draw the eye */ - GSetLineAttributes(trashGC,2,LineSolid,CapButt,JoinMiter,Xoption); - GSetForeground(trashGC,(float)monoColor(52),Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(there),frusY(frustrumMidY-5), - frusX(there+8),frusY(frustrumMidY),Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(there+2),frusY(frustrumMidY+4), - frusX(there+8),frusY(frustrumMidY-1),Xoption); - GSetForeground(trashGC,(float)frustrumColor,Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(there+4),frusY(frustrumMidY-3), - frusX(there+2),frusY(frustrumMidY),Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(there+4),frusY(frustrumMidY+2), - frusX(there+3),frusY(frustrumMidY),Xoption); - GSetLineAttributes(trashGC,0,LineSolid,CapButt,JoinMiter,Xoption); - - /* draw string label */ - GSetForeground(volumeGC,(float)eyeColor,Xoption); - GDrawString(volumeGC,volumeWindow,eyeDistMessX,eyeDistMessY, - "Eye Distance",strlen("eye distance"),Xoption); - -} - - -/************************** - * void drawFrustrum() * - **************************/ - -void -drawFrustrum (void) -{ - - float normalizedEyeDistance; - - XClearArea(dsply,volumeWindow, - control->buttonQueue[frustrumBut].buttonX, - control->buttonQueue[frustrumBut].buttonY, - control->buttonQueue[frustrumBut].buttonWidth+9, - control->buttonQueue[frustrumBut].buttonHeight,False); - GSetForeground(trashGC,(float)frustrumColor,Xoption); - normalizedEyeDistance = (viewData.eyeDistance - minEyeDistance) / - (maxEyeDistance - minEyeDistance); - normalizedEyeDistance = pow((double)normalizedEyeDistance,0.333333333); - frustrumVertex = normalizedEyeDistance * (frustrumMax - frustrumMin) + - frustrumMin - 4; - GDrawLine(trashGC,volumeWindow, - frusX(frustrumX),frusY(frustrumY), - frusX(frustrumX),frusY(frustrumY+frustrumLength),Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(frustrumX),frusY(frustrumY), - frusX(frustrumVertex),frusY(frustrumMidY),Xoption); - GDrawLine(trashGC,volumeWindow, - frusX(frustrumX),frusY(frustrumBotY), - frusX(frustrumVertex),frusY(frustrumMidY),Xoption); - - /* draw controls */ - drawHitherControl(); - drawEyeControl(); - -} /* drawFrustrum() */ - - - -/************************** - * void drawVolumePanel() * - **************************/ - -void -drawVolumePanel (void) -{ - - int i,strlength; - - - /* Draw some lines for volume panel. */ - GSetForeground(trashGC,(float)foregroundColor,Xoption); - GSetLineAttributes(trashGC,3,LineSolid,CapButt,JoinMiter,Xoption); - GDrawLine(trashGC, volumeWindow, 0, potA, controlWidth, potA, Xoption); - - GSetLineAttributes(trashGC,2,LineSolid,CapButt,JoinMiter,Xoption); - GDrawLine(trashGC, volumeWindow, 0, volumeTitleA, controlWidth, - volumeTitleA, Xoption); - GDrawLine(trashGC, volumeWindow, 0, volumeTitleB, controlWidth, - volumeTitleB, Xoption); - - writeControlTitle(volumeWindow); - s = "Viewing Volume Panel"; - strlength = strlen(s); - GSetForeground(anotherGC,(float)volumeTitleColor,Xoption); - GDrawString(anotherGC,volumeWindow, - centerX(anotherGC,s,strlength,controlWidth), - volumeTitleA+18,s,strlength,Xoption); - - GSetForeground(anotherGC,(float)monoColor(toggleColor),Xoption); - GDrawString(anotherGC,volumeWindow, - control->buttonQueue[perspectiveBut].buttonX + 4, - control->buttonQueue[perspectiveBut].buttonY - 17, - "Settings", 8, Xoption); - - GSetForeground(trashGC,(float)monoColor(toggleColor),Xoption); - GDraw3DButtonOut(trashGC,volumeWindow, - control->buttonQueue[perspectiveBut].buttonX - 7, - control->buttonQueue[perspectiveBut].buttonY - 36, - 100,100,Xoption); - - - for (i=0; ibuttonQueue[i]).textColor),Xoption); - switch (i) { - case perspectiveBut: - case clipRegionBut: - case clipSurfaceBut: - GSetForeground(volumeGC,(float)monoColor(toggleColor),Xoption); - GDraw3DButtonOut(volumeGC,volumeWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - GSetForeground(volumeGC, - (float)monoColor((control->buttonQueue[i]).textColor),Xoption); - GDrawString(volumeGC,volumeWindow, - (control->buttonQueue[i]).buttonX + - (control->buttonQueue[i]).buttonWidth + 4, - (control->buttonQueue[i]).buttonY + - centerY(volumeGC,(control->buttonQueue[i]).buttonHeight), - (control->buttonQueue[i]).text, - strlen(control->buttonQueue[i].text),Xoption); - if (i==perspectiveBut && viewData.perspective) - GDrawString(volumeGC,volumeWindow, - (control->buttonQueue[i]).buttonX + - centerX(volumeGC,"x",1, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(volumeGC,(control->buttonQueue[i]).buttonHeight), - "x",1,Xoption); - else if (i==clipRegionBut && viewData.clipbox) - GDrawString(volumeGC,volumeWindow, - (control->buttonQueue[i]).buttonX + - centerX(volumeGC,"x",1, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(volumeGC,(control->buttonQueue[i]).buttonHeight), - "x",1,Xoption); - else if (i==clipSurfaceBut && viewData.clipStuff) - GDrawString(volumeGC,volumeWindow, - (control->buttonQueue[i]).buttonX + - centerX(volumeGC,"x",1, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(volumeGC,(control->buttonQueue[i]).buttonHeight), - "x",1,Xoption); - - break; - - case clipXBut: - drawClipXBut(); - break; - - case clipYBut: - drawClipYBut(); - break; - - case clipZBut: - drawClipZBut(); - break; - - case frustrumBut: - break; - - default: - GDraw3DButtonOut(trashGC,volumeWindow, - (control->buttonQueue[i]).buttonX, - (control->buttonQueue[i]).buttonY, - (control->buttonQueue[i]).buttonWidth, - (control->buttonQueue[i]).buttonHeight,Xoption); - s = (control->buttonQueue[i]).text; - strlength = strlen(s); - GSetForeground(trashGC, - (float)monoColor((control->buttonQueue[i]).textColor),Xoption); - GDrawString(trashGC,volumeWindow, - (control->buttonQueue[i]).buttonX + - centerX(processGC,s,strlength, - (control->buttonQueue[i]).buttonWidth), - (control->buttonQueue[i]).buttonY + - centerY(processGC,(control->buttonQueue[i]).buttonHeight), - s,strlen(s),Xoption); - } /* switch */ - } /* for i in volumeButtons */ - - drawFrustrum(); - drawClipVolume(); /*** put in header ***/ - drawClipXBut(); - drawClipYBut(); - drawClipZBut(); - -} /* drawVolumePanel() */ - - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} diff --git a/src/graph/view3d/write3d.c.pamphlet b/src/graph/view3d/write3d.c.pamphlet deleted file mode 100644 index 7fb1819..0000000 --- a/src/graph/view3d/write3d.c.pamphlet +++ /dev/null @@ -1,229 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/graph/view3d write3d.c} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{License} -<>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -@ -<<*>>= -<> - -#define _WRITE3D_C - -#include -#include - -#include "header.h" -#include "write.h" -#include "mode.h" - - -#include "pixmap.h1" -#include "xshade.h1" -#include "gfun.h1" - -#include "all-3d.h1" - - /* upper limit as to how many kinds of files could be written (numBits-1) */ -#define numBits (8*sizeof(int)) -#define StellarColors 9 - -int -writeViewport (int thingsToWrite) -{ - - int i, j, k, ii, code, *anIndex; - LLPoint *anLLPoint; - LPoint *anLPoint; - viewTriple *aPt; - XWindowAttributes vwInfo; - FILE *viewDataFile; - char viewDirName[80], viewDataFilename[80], - viewBitmapFilename[80], viewPixmapFilename[80], - command[80]; - - XGetWindowAttributes(dsply,viewport->titleWindow,&vwInfo); - sprintf(viewDirName,"%s%s",filename,".view"); - sprintf(command,"%s%s%s","rm -r ",viewDirName," > /dev/null 2>&1"); - code = system(command); - sprintf(command,"%s%s%s","mkdir ",viewDirName," > /dev/null 2>&1"); - system(command); - if (0) { - fprintf(stderr," Error: Cannot create %s\n",viewDirName); - return(-1); - } else { - - /*** Create the data file ***/ - sprintf(viewDataFilename,"%s%s",viewDirName,"/data"); - if ((viewDataFile = fopen(viewDataFilename,"w")) == NULL) { - fprintf(stderr," Error: Cannot create %s\n",viewDataFilename); - perror("fopen"); - return(-1); - } else { - /*** write out the view3dStruct stuff ***/ - fprintf(viewDataFile,"%d\n",viewData.typeOf3D); - fprintf(viewDataFile,"%g %g %g %g %g %g\n", - viewData.xmin,viewData.xmax,viewData.ymin,viewData.ymax, - viewData.zmin,viewData.zmax); - fprintf(viewDataFile,"%s\n",viewport->title); - fprintf(viewDataFile,"%g %g %g %g %g %g %g %g\n",viewport->deltaX, - viewport->deltaY,viewport->scale, - viewport->scaleX,viewport->scaleY,viewport->scaleZ, - viewport->theta,viewport->phi); - fprintf(viewDataFile,"%d %d %d %d\n",vwInfo.x,vwInfo.y,vwInfo.width, - vwInfo.height); - fprintf(viewDataFile,"%d %d %d %d %d %d %d\n",viewport->haveControl, - viewData.style, viewport->axesOn, - viewport->hueOffset,viewport->numberOfHues, - viewport->diagonals, viewData.outlineRenderOn); - fprintf(viewDataFile,"%g %g %g %g\n",viewport->lightVector[0], - viewport->lightVector[1], viewport->lightVector[2], - viewport->translucency); - fprintf(viewDataFile,"%d %g\n",viewData.perspective, - viewData.eyeDistance); - - /* write out the generalized 3D components */ - fprintf(viewDataFile,"%d\n",viewData.numOfPoints); - for (i=0; ix, aPt->y, aPt->z, aPt->c); - } - fprintf(viewDataFile,"%d\n",viewData.lllp.numOfComponents); - anLLPoint = viewData.lllp.llp; - for (i=0; iprop.closed, - anLLPoint->prop.solid); - fprintf(viewDataFile,"%d\n",anLLPoint->numOfLists); - anLPoint = anLLPoint->lp; - for (j=0; jnumOfLists; j++,anLPoint++) { - fprintf(viewDataFile,"%d %d\n",anLPoint->prop.closed, - anLPoint->prop.solid); - fprintf(viewDataFile,"%d\n",anLPoint->numOfPoints); - anIndex = anLPoint->indices; - for (k=0; knumOfPoints; k++,anIndex++) { - fprintf(viewDataFile,"%d\n",*anIndex); - } /* for points in LPoints (k) */ - } /* for LPoints in LLPoints (j) */ - } /* for LLPoints in LLLPoints (i) */ - fclose(viewDataFile); - } /* else was able to open file under the given filename */ - - /* write out special files */ - for (ii=1; iiviewWindow,&vwInfo); - code = XWriteBitmapFile(dsply,viewBitmapFilename, - viewport->titleWindow,vwInfo.width, - vwInfo.height+vwInfo.border_width+20,-1,-1); - break; - - case Pixmap: - /*** Create the pixmap (bitmaps need leaf name) ***/ - sprintf(viewPixmapFilename,"%s%s%s",viewDirName,"/","image.xpm"); - XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); - write_pixmap_file(dsply,scrn,viewPixmapFilename, - viewport->titleWindow,0,0,vwInfo.width, - vwInfo.height+titleHeight); - break; - - case Image: - /*** Create the image (bitmaps need leaf name) ***/ - writeImage = yes; - sprintf(viewPixmapFilename,"%s%s%s",viewDirName,"/","image.xpm"); - XResizeWindow(dsply,viewport->titleWindow,300,300+titleHeight); - XResizeWindow(dsply,viewport->viewWindow,300,300); - viewport->hueTop = totalHues-1; viewport->hueOffset = 0; - viewport->numberOfHues = viewport->hueTop - viewport->hueOffset; - firstTime = 1; - if (viewData.style == transparent) { - viewData.style = render; - viewData.outlineRenderOn = 1; - } else { - if (viewData.style == render) viewData.outlineRenderOn = 1; - } - drawViewport(Xoption); - writeTitle(); - XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); - write_pixmap_file(dsply,scrn,viewPixmapFilename, - viewport->titleWindow,0,0,vwInfo.width, - vwInfo.height+titleHeight); - viewport->monoOn = 1; - maxGreyShade = XInitShades(dsply,scrn); - firstTime = 1; - drawViewport(Xoption); - writeTitle(); - sprintf(viewBitmapFilename,"%s%s%s",viewDirName,"/","image.bm"); - code = XWriteBitmapFile(dsply,viewBitmapFilename, - viewport->titleWindow,vwInfo.width, - vwInfo.height+vwInfo.border_width+20,-1,-1); - - writeImage = no; - break; - - case Postscript: - /*** Create postscript output for viewport (in axiom3d.ps) ***/ - sprintf(PSfilename,"%s%s",viewDirName,"/axiom3d.ps"); - if (PSInit(viewport->viewWindow,viewport->titleWindow) == psError) - return(-1); - drawViewport(PSoption); /* write new script file in /tmp */ - if (PSCreateFile(viewBorderWidth,viewport->viewWindow, - viewport->titleWindow, viewport->title) == psError) - return(-1); /* concat script & proc into axiom3d.ps */ - break; - } /* switch on ii */ - } /* if thingsToWrite >> ii */ - } /* for ii */ - - return(0); - } /* else create directory okay */ - -} -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document}