aboutsummaryrefslogtreecommitdiff
path: root/src/graph/view3D/process3d.c.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/graph/view3D/process3d.c.pamphlet')
-rw-r--r--src/graph/view3D/process3d.c.pamphlet1625
1 files changed, 0 insertions, 1625 deletions
diff --git a/src/graph/view3D/process3d.c.pamphlet b/src/graph/view3D/process3d.c.pamphlet
deleted file mode 100644
index d6174388..00000000
--- a/src/graph/view3D/process3d.c.pamphlet
+++ /dev/null
@@ -1,1625 +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}
-<<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.
-*/
-@
-<<*>>=
-<<license>>
-
-#define _PROCESS3D_C
-#include "axiom-c-macros.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/time.h>
-
-
-#include "header.h"
-#include "cpanel.h"
-#include "volume.h"
-#include "mode.h"
-#include "process.h"
-#include "draw.h"
-#include "sockio.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
-#ifdef _NO_PROTO
-buttonAction (bKey)
-int bKey;
-#else
-buttonAction (int bKey)
-#endif
-{
-
- 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
-#ifdef _NO_PROTO
-processEvents()
-#else
-processEvents(void)
-#endif
-{
-
- 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<y => 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}