home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume16 / x3d / part02 < prev    next >
Internet Message Format  |  1992-02-05  |  57KB

  1. Path: uunet!think.com!mips!msi!dcmartin
  2. From: spy@castlab.engr.wisc.edu (Mark Spychalla)
  3. Newsgroups: comp.sources.x
  4. Subject: v16i047: 3D Wireframe viewer, Part02/06
  5. Message-ID: <1992Feb6.143929.29285@msi.com>
  6. Date: 6 Feb 92 14:39:29 GMT
  7. References: <csx-16i046-x3d@uunet.UU.NET>
  8. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  9. Organization: Molecular Simulations, Inc.
  10. Lines: 1713
  11. Approved: dcmartin@msi.com
  12. Originator: dcmartin@fascet
  13.  
  14. Submitted-by: spy@castlab.engr.wisc.edu (Mark Spychalla)
  15. Posting-number: Volume 16, Issue 47
  16. Archive-name: x3d/part02
  17.  
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  22. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  23. # If this archive is complete, you will see the following message at the end:
  24. #        "End of archive 2 (of 6)."
  25. # Contents:  Imakefile Makefile con/Imakefile con/Makefile.sav
  26. #   con/cube.obj con/cube.segs gi.c
  27. # Wrapped by dcmartin@fascet on Thu Feb  6 06:38:05 1992
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'Imakefile' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'Imakefile'\"
  31. else
  32. echo shar: Extracting \"'Imakefile'\" \(181 characters\)
  33. sed "s/^X//" >'Imakefile' <<'END_OF_FILE'
  34. XIMAKE_DEFINES= -DManSuffix=6
  35. X
  36. XDEFINES = -DFAST_FLOATS #-D_POSIX_SOURCE -DPROTOTYPES 
  37. XDEPLIBS = $(DEPXLIB)
  38. XLOCAL_LIBRARIES = $(XLIB)
  39. XEXTRA_LIBRARIES = -lm
  40. X
  41. XSimpleProgramTarget(x3d)
  42. X
  43. END_OF_FILE
  44. if test 181 -ne `wc -c <'Imakefile'`; then
  45.     echo shar: \"'Imakefile'\" unpacked with wrong size!
  46. fi
  47. # end of 'Imakefile'
  48. fi
  49. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  50.   echo shar: Will not clobber existing file \"'Makefile'\"
  51. else
  52. echo shar: Extracting \"'Makefile'\" \(10370 characters\)
  53. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  54. X# Makefile generated by imake - do not edit!
  55. X# $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $
  56. X#
  57. X# The cpp used on this machine replaces all newlines and multiple tabs and
  58. X# spaces in a macro expansion with a single space.  Imake tries to compensate
  59. X# for this, but is not always successful.
  60. X#
  61. X
  62. X# -------------------------------------------------------------------------
  63. X# Makefile generated from "Imake.tmpl" and <Imakefile>
  64. X# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
  65. X#
  66. X# Platform-specific parameters may be set in the appropriate <vendor>.cf
  67. X# configuration files.  Site-specific parameters should be set in the file
  68. X# site.def.  Full rebuilds are recommended if any parameters are changed.
  69. X#
  70. X# If your C preprocessor does not define any unique symbols, you will need
  71. X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
  72. X# "make World" the first time).
  73. X#
  74. X
  75. X# -------------------------------------------------------------------------
  76. X# site-specific configuration parameters that need to come before
  77. X# the platform-specific parameters - edit site.def to change
  78. X
  79. X# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
  80. X
  81. X# -------------------------------------------------------------------------
  82. X# platform-specific configuration parameters - edit sun.cf to change
  83. X
  84. X# platform:  $XConsortium: sun.cf,v 1.68 91/07/30 11:34:39 rws Exp $
  85. X
  86. X# operating system:  SunOS 4.1.1
  87. X
  88. X# $XConsortium: sunLib.rules,v 1.6 91/03/24 17:55:58 rws Exp $
  89. X
  90. X# -------------------------------------------------------------------------
  91. X# site-specific configuration parameters that go after
  92. X# the platform-specific parameters - edit site.def to change
  93. X
  94. X# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
  95. X
  96. X            SHELL = /bin/sh
  97. X
  98. X              TOP = .
  99. X      CURRENT_DIR = .
  100. X
  101. X               AR = ar clq
  102. X  BOOTSTRAPCFLAGS =
  103. X               CC = cc
  104. X               AS = as
  105. X
  106. X         COMPRESS = compress
  107. X              CPP = /lib/cpp $(STD_CPP_DEFINES)
  108. X    PREPROCESSCMD = cc -E $(STD_CPP_DEFINES)
  109. X          INSTALL = install
  110. X               LD = ld
  111. X             LINT = lint
  112. X      LINTLIBFLAG = -C
  113. X         LINTOPTS = -axz
  114. X               LN = ln -s
  115. X             MAKE = make
  116. X               MV = mv
  117. X               CP = cp
  118. X
  119. X           RANLIB = ranlib
  120. X  RANLIBINSTFLAGS =
  121. X
  122. X               RM = rm -f
  123. X            TROFF = psroff
  124. X         MSMACROS = -ms
  125. X              TBL = tbl
  126. X              EQN = eqn
  127. X     STD_INCLUDES =
  128. X  STD_CPP_DEFINES =
  129. X      STD_DEFINES =
  130. X EXTRA_LOAD_FLAGS =
  131. X  EXTRA_LIBRARIES =
  132. X             TAGS = ctags
  133. X
  134. X    SHAREDCODEDEF = -DSHAREDCODE
  135. X         SHLIBDEF = -DSUNSHLIB
  136. X
  137. X    PROTO_DEFINES =
  138. X
  139. X     INSTPGMFLAGS =
  140. X
  141. X     INSTBINFLAGS = -m 0755
  142. X     INSTUIDFLAGS = -m 4755
  143. X     INSTLIBFLAGS = -m 0644
  144. X     INSTINCFLAGS = -m 0444
  145. X     INSTMANFLAGS = -m 0444
  146. X     INSTDATFLAGS = -m 0444
  147. X    INSTKMEMFLAGS = -m 4755
  148. X
  149. X      PROJECTROOT = /usr/X11/R5
  150. X
  151. X     TOP_INCLUDES = -I$(INCROOT)
  152. X
  153. X      CDEBUGFLAGS = -O
  154. X        CCOPTIONS = -pipe
  155. X
  156. X      ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
  157. X       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
  158. X           CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
  159. X        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
  160. X
  161. X           LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  162. X
  163. X        LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
  164. X
  165. X   LDCOMBINEFLAGS = -X -r
  166. X      DEPENDFLAGS =
  167. X
  168. X        MACROFILE = sun.cf
  169. X           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
  170. X
  171. X    IMAKE_DEFINES =
  172. X
  173. X         IRULESRC = $(CONFIGDIR)
  174. X        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
  175. X
  176. X     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
  177. X            $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
  178. X            $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
  179. X
  180. X# -------------------------------------------------------------------------
  181. X# X Window System Build Parameters
  182. X# $XConsortium: Project.tmpl,v 1.138 91/09/10 09:02:12 rws Exp $
  183. X
  184. X# -------------------------------------------------------------------------
  185. X# X Window System make variables; this need to be coordinated with rules
  186. X
  187. X          PATHSEP = /
  188. X        USRLIBDIR = /usr/X11/R5/lib
  189. X           BINDIR = /usr/X11/R5/bin
  190. X          INCROOT = /usr/X11/R5/include
  191. X     BUILDINCROOT = $(TOP)
  192. X      BUILDINCDIR = $(BUILDINCROOT)/X11
  193. X      BUILDINCTOP = ..
  194. X           INCDIR = $(INCROOT)/X11
  195. X           ADMDIR = /usr/adm
  196. X           LIBDIR = $(USRLIBDIR)/X11
  197. X        CONFIGDIR = $(LIBDIR)/config
  198. X       LINTLIBDIR = $(USRLIBDIR)/lint
  199. X
  200. X          FONTDIR = $(LIBDIR)/fonts
  201. X         XINITDIR = $(LIBDIR)/xinit
  202. X           XDMDIR = $(LIBDIR)/xdm
  203. X           TWMDIR = $(LIBDIR)/twm
  204. X          MANPATH = /usr/X11/R5/man
  205. X    MANSOURCEPATH = $(MANPATH)/man
  206. X        MANSUFFIX = n
  207. X     LIBMANSUFFIX = 3
  208. X           MANDIR = $(MANSOURCEPATH)$(MANSUFFIX)
  209. X        LIBMANDIR = $(MANSOURCEPATH)$(LIBMANSUFFIX)
  210. X           NLSDIR = $(LIBDIR)/nls
  211. X        PEXAPIDIR = $(LIBDIR)/PEX
  212. X      XAPPLOADDIR = $(LIBDIR)/app-defaults
  213. X       FONTCFLAGS = -t
  214. X
  215. X     INSTAPPFLAGS = $(INSTDATFLAGS)
  216. X
  217. X            IMAKE = imake
  218. X           DEPEND = makedepend
  219. X              RGB = rgb
  220. X
  221. X            FONTC = bdftopcf
  222. X
  223. X        MKFONTDIR = mkfontdir
  224. X        MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier
  225. X
  226. X        CONFIGSRC = $(TOP)/config
  227. X       DOCUTILSRC = $(TOP)/doc/util
  228. X        CLIENTSRC = $(TOP)/clients
  229. X          DEMOSRC = $(TOP)/demos
  230. X           LIBSRC = $(TOP)/lib
  231. X          FONTSRC = $(TOP)/fonts
  232. X       INCLUDESRC = $(TOP)/X11
  233. X        SERVERSRC = $(TOP)/server
  234. X          UTILSRC = $(TOP)/util
  235. X        SCRIPTSRC = $(UTILSRC)/scripts
  236. X       EXAMPLESRC = $(TOP)/examples
  237. X       CONTRIBSRC = $(TOP)/../contrib
  238. X           DOCSRC = $(TOP)/doc
  239. X           RGBSRC = $(TOP)/rgb
  240. X        DEPENDSRC = $(UTILSRC)/makedepend
  241. X         IMAKESRC = $(CONFIGSRC)
  242. X         XAUTHSRC = $(LIBSRC)/Xau
  243. X          XLIBSRC = $(LIBSRC)/X
  244. X           XMUSRC = $(LIBSRC)/Xmu
  245. X       TOOLKITSRC = $(LIBSRC)/Xt
  246. X       AWIDGETSRC = $(LIBSRC)/Xaw
  247. X       OLDXLIBSRC = $(LIBSRC)/oldX
  248. X      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
  249. X      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
  250. X      BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
  251. X      BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
  252. X     MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
  253. X         FSLIBSRC = $(FONTSRC)/lib/fs
  254. X    FONTSERVERSRC = $(FONTSRC)/server
  255. X     EXTENSIONSRC = $(TOP)/extensions
  256. X         XILIBSRC = $(EXTENSIONSRC)/lib/xinput
  257. X      PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
  258. X
  259. X# $XConsortium: sunLib.tmpl,v 1.11 91/07/31 11:32:08 rws Exp $
  260. X
  261. XSHLIBLDFLAGS = -assert pure-text
  262. XPICFLAGS = -pic
  263. X
  264. X  DEPEXTENSIONLIB =
  265. X     EXTENSIONLIB = -lXext
  266. X
  267. X          DEPXLIB = $(DEPEXTENSIONLIB)
  268. X             XLIB = $(EXTENSIONLIB) -lX11
  269. X
  270. X        DEPXMULIB = $(USRLIBDIR)/libXmu.sa.$(SOXMUREV)
  271. X           XMULIB = -lXmu
  272. X
  273. X       DEPOLDXLIB =
  274. X          OLDXLIB = -loldX
  275. X
  276. X      DEPXTOOLLIB = $(USRLIBDIR)/libXt.sa.$(SOXTREV)
  277. X         XTOOLLIB = -lXt
  278. X
  279. X        DEPXAWLIB = $(USRLIBDIR)/libXaw.sa.$(SOXAWREV)
  280. X           XAWLIB = -lXaw
  281. X
  282. X        DEPXILIB =
  283. X           XILIB = -lXi
  284. X
  285. X        SOXLIBREV = 4.10
  286. X          SOXTREV = 4.10
  287. X         SOXAWREV = 5.0
  288. X        SOOLDXREV = 4.10
  289. X         SOXMUREV = 4.10
  290. X        SOXEXTREV = 4.10
  291. X      SOXINPUTREV = 4.10
  292. X
  293. X      DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
  294. X         XAUTHLIB =  -lXau
  295. X      DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
  296. X         XDMCPLIB =  -lXdmcp
  297. X
  298. X        DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
  299. X           PHIGSLIB =  -lphigs
  300. X
  301. X       DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
  302. X          XBSDLIB =  -lXbsd
  303. X
  304. X LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
  305. X         LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
  306. X          LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
  307. X        LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
  308. X          LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
  309. X           LINTXI = $(LINTLIBDIR)/llib-lXi.ln
  310. X        LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
  311. X
  312. X          DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
  313. X
  314. X         DEPLIBS1 = $(DEPLIBS)
  315. X         DEPLIBS2 = $(DEPLIBS)
  316. X         DEPLIBS3 = $(DEPLIBS)
  317. X
  318. X# -------------------------------------------------------------------------
  319. X# Imake rules for building libraries, programs, scripts, and data files
  320. X# rules:  $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
  321. X
  322. X# -------------------------------------------------------------------------
  323. X# start of Imakefile
  324. X
  325. XIMAKE_DEFINES= -DManSuffix=6
  326. X
  327. XDEFINES = -DFAST_FLOATS #-D_POSIX_SOURCE -DPROTOTYPES
  328. XDEPLIBS = $(DEPXLIB)
  329. XLOCAL_LIBRARIES = $(XLIB)
  330. XEXTRA_LIBRARIES = -lm
  331. X
  332. X OBJS = x3d.o
  333. X SRCS = x3d.c
  334. X
  335. X PROGRAM = x3d
  336. X
  337. Xall:: x3d
  338. X
  339. Xx3d: $(OBJS) $(DEPLIBS)
  340. X    $(RM) $@
  341. X    $(CC) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS)
  342. X
  343. Xsaber_x3d:: $(SRCS)
  344. X    # load $(ALLDEFINES) $(SRCS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  345. X
  346. Xosaber_x3d:: $(OBJS)
  347. X    # load $(ALLDEFINES) $(OBJS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  348. X
  349. Xinstall:: x3d
  350. X    @if [ -d $(DESTDIR)$(BINDIR) ]; then set +x; \
  351. X    else (set -x; $(MKDIRHIER) $(DESTDIR)$(BINDIR)); fi
  352. X    $(INSTALL) -c $(INSTPGMFLAGS)  x3d $(DESTDIR)$(BINDIR)
  353. X
  354. Xinstall.man:: x3d.man
  355. X    @if [ -d $(DESTDIR)$(MANDIR) ]; then set +x; \
  356. X    else (set -x; $(MKDIRHIER) $(DESTDIR)$(MANDIR)); fi
  357. X    $(INSTALL) -c $(INSTMANFLAGS) x3d.man $(DESTDIR)$(MANDIR)/x3d.$(MANSUFFIX)
  358. X
  359. Xdepend::
  360. X    $(DEPEND) $(DEPENDFLAGS) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
  361. X
  362. Xlint:
  363. X    $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
  364. Xlint1:
  365. X    $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
  366. X
  367. Xclean::
  368. X    $(RM) $(PROGRAM)
  369. X
  370. X# -------------------------------------------------------------------------
  371. X# common rules for all Makefiles - do not edit
  372. X
  373. Xemptyrule::
  374. X
  375. Xclean::
  376. X    $(RM_CMD) "#"*
  377. X
  378. XMakefile::
  379. X    -@if [ -f Makefile ]; then set -x; \
  380. X    $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
  381. X    else exit 0; fi
  382. X    $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
  383. X
  384. Xtags::
  385. X    $(TAGS) -w *.[ch]
  386. X    $(TAGS) -xw *.[ch] > TAGS
  387. X
  388. Xsaber:
  389. X    # load $(ALLDEFINES) $(SRCS)
  390. X
  391. Xosaber:
  392. X    # load $(ALLDEFINES) $(OBJS)
  393. X
  394. X# -------------------------------------------------------------------------
  395. X# empty rules for directories that do not have SUBDIRS - do not edit
  396. X
  397. Xinstall::
  398. X    @echo "install in $(CURRENT_DIR) done"
  399. X
  400. Xinstall.man::
  401. X    @echo "install.man in $(CURRENT_DIR) done"
  402. X
  403. XMakefiles::
  404. X
  405. Xincludes::
  406. X
  407. X# -------------------------------------------------------------------------
  408. X# dependencies generated by makedepend
  409. X
  410. END_OF_FILE
  411. if test 10370 -ne `wc -c <'Makefile'`; then
  412.     echo shar: \"'Makefile'\" unpacked with wrong size!
  413. fi
  414. # end of 'Makefile'
  415. fi
  416. if test -f 'con/Imakefile' -a "${1}" != "-c" ; then 
  417.   echo shar: Will not clobber existing file \"'con/Imakefile'\"
  418. else
  419. echo shar: Extracting \"'con/Imakefile'\" \(76 characters\)
  420. sed "s/^X//" >'con/Imakefile' <<'END_OF_FILE'
  421. XIMAKE_DEFINES= -DManSuffix=6
  422. XEXTRA_LIBRARIES = -lm
  423. XSimpleProgramTarget(con)
  424. END_OF_FILE
  425. if test 76 -ne `wc -c <'con/Imakefile'`; then
  426.     echo shar: \"'con/Imakefile'\" unpacked with wrong size!
  427. fi
  428. # end of 'con/Imakefile'
  429. fi
  430. if test -f 'con/Makefile.sav' -a "${1}" != "-c" ; then 
  431.   echo shar: Will not clobber existing file \"'con/Makefile.sav'\"
  432. else
  433. echo shar: Extracting \"'con/Makefile.sav'\" \(122 characters\)
  434. sed "s/^X//" >'con/Makefile.sav' <<'END_OF_FILE'
  435. XCFLAGS = -pipe -O4 -fsingle
  436. XLIBS   = -lm
  437. X  CC   = cc
  438. X
  439. Xcon: con.c 
  440. X    $(CC) $(CFLAGS) -o con con.c $(LIBS) 
  441. X
  442. Xclean:
  443. X    rm con 
  444. END_OF_FILE
  445. if test 122 -ne `wc -c <'con/Makefile.sav'`; then
  446.     echo shar: \"'con/Makefile.sav'\" unpacked with wrong size!
  447. fi
  448. # end of 'con/Makefile.sav'
  449. fi
  450. if test -f 'con/cube.obj' -a "${1}" != "-c" ; then 
  451.   echo shar: Will not clobber existing file \"'con/cube.obj'\"
  452. else
  453. echo shar: Extracting \"'con/cube.obj'\" \(202 characters\)
  454. sed "s/^X//" >'con/cube.obj' <<'END_OF_FILE'
  455. X9 12
  456. X-1000 -1000 -1000
  457. X-1000 1000 -1000
  458. X-1000 -1000 1000
  459. X-1000 1000 -1000
  460. X-1000 1000 1000
  461. X1000 -1000 -1000
  462. X1000 1000 -1000
  463. X1000 -1000 1000
  464. X1000 1000 1000
  465. X0 5
  466. X0 3
  467. X0 2
  468. X5 7
  469. X2 7
  470. X7 8
  471. X2 4
  472. X3 4
  473. X4 8
  474. X5 6
  475. X1 6
  476. X6 8
  477. END_OF_FILE
  478. if test 202 -ne `wc -c <'con/cube.obj'`; then
  479.     echo shar: \"'con/cube.obj'\" unpacked with wrong size!
  480. fi
  481. # end of 'con/cube.obj'
  482. fi
  483. if test -f 'con/cube.segs' -a "${1}" != "-c" ; then 
  484.   echo shar: Will not clobber existing file \"'con/cube.segs'\"
  485. else
  486. echo shar: Extracting \"'con/cube.segs'\" \(473 characters\)
  487. sed "s/^X//" >'con/cube.segs' <<'END_OF_FILE'
  488. X -1000 -1000 -1000    1000 -1000 -1000
  489. X -1000 -1000 -1000   -1000  1000 -1000
  490. X -1000 -1000 -1000   -1000 -1000  1000
  491. X  1000 -1000  1000    1000 -1000 -1000 
  492. X  1000 -1000  1000   -1000 -1000  1000
  493. X  1000 -1000  1000    1000  1000  1000
  494. X -1000  1000  1000   -1000 -1000  1000
  495. X -1000  1000  1000   -1000  1000 -1000 
  496. X -1000  1000  1000    1000  1000  1000
  497. X  1000  1000 -1000    1000 -1000 -1000 
  498. X  1000  1000 -1000   -1000  1000 -1000 
  499. X  1000  1000 -1000    1000  1000  1000 
  500. END_OF_FILE
  501. if test 473 -ne `wc -c <'con/cube.segs'`; then
  502.     echo shar: \"'con/cube.segs'\" unpacked with wrong size!
  503. fi
  504. # end of 'con/cube.segs'
  505. fi
  506. if test -f 'gi.c' -a "${1}" != "-c" ; then 
  507.   echo shar: Will not clobber existing file \"'gi.c'\"
  508. else
  509. echo shar: Extracting \"'gi.c'\" \(39449 characters\)
  510. sed "s/^X//" >'gi.c' <<'END_OF_FILE'
  511. X
  512. X/*
  513. X  Copyright 1992 Mark Spychalla
  514. X
  515. X  Permission to use, copy, modify, distribute, and sell this software and
  516. X  its documentation for any purpose is hereby granted without fee,
  517. X  provided that the above copyright notice appear in all copies and that
  518. X  both that copyright notice and this permission notice appear in
  519. X  supporting documentation, and that the name of Mark Spychalla not be used
  520. X  in advertising or publicity pertaining to distribution of the software
  521. X  without specific, written prior permission.  Mark Spychalla makes no
  522. X  representations about the suitability of this software for any purpose.
  523. X  It is provided "as is" without express or implied warranty.
  524. X
  525. X  Mark Spychalla disclaims all warranties with regard to this software,
  526. X  including all implied warranties of merchantability and fitness, in no
  527. X  event shall Mark Spychalla be liable for any special, indirect or
  528. X  consequential damages or any damages whatsoever resulting from loss of use,
  529. X  data or profits, whether in an action of contract, negligence or other
  530. X  tortious action, arising out of or in connection with the use or performance
  531. X  of this software.
  532. X*/
  533. X
  534. X#include <stdio.h>
  535. X#include "gi.h"
  536. X#include "char.h"
  537. X
  538. X
  539. Xint GIerrno = GIE_OK; 
  540. X
  541. X
  542. X/* Graphics interface functions */
  543. X
  544. X
  545. Xvoid GI_Rotate(points, cx, cy, cz, sx, sy, sz)
  546. XanglePoint *points;
  547. Xdouble cx, cy, cz, sx, sy, sz;
  548. X/******************************************************************************
  549. X   Rotate about Z, X, then Y, for two points.
  550. X******************************************************************************/
  551. X{
  552. Xint index;
  553. Xdouble x, y, z, t;
  554. X
  555. X    for(index = 0; index < 2; index++){
  556. X       x = points[index].x;
  557. X       y = points[index].y;
  558. X       z = points[index].z;
  559. X
  560. X       t = x * cz + y * sz;
  561. X       y = y * cz - x * sz;
  562. X       x = t;
  563. X   
  564. X       points[index].y = y * cx + z * sx;
  565. X
  566. X       z = z * cx - y * sx;
  567. X
  568. X       points[index].x = x * cy + z * sy;
  569. X       points[index].z = z * cy - x * sy;
  570. X       }
  571. X}
  572. X
  573. X
  574. X
  575. Xdouble GI_DotProduct(x1, Y1, x2, y2)
  576. Xdouble x1, Y1, x2, y2;
  577. X/******************************************************************************
  578. X   Dot product (calculate the cosine of the angle between two vectors).
  579. X******************************************************************************/
  580. X{
  581. Xdouble temp;
  582. X
  583. X   if((x1 == 0.0 && Y1 == 0.0)){
  584. X      return 1.0;
  585. X      }
  586. X
  587. X   temp = sqrt(x1 * x1 + Y1 * Y1);
  588. X   x1 = x1 / temp;
  589. X   Y1 = Y1 / temp;
  590. X  
  591. X   temp = x1 * x2 + Y1 * y2;
  592. X
  593. X   if(temp > 1.0)
  594. X      temp = fmod(temp, 1.0); 
  595. X   
  596. X   if(temp < -1.0)
  597. X      temp = -fmod(-temp, 1.0); 
  598. X      
  599. X   return(temp); 
  600. X}
  601. X
  602. X
  603. X
  604. Xvoid GI_CalculateAngles(X, Y, Z, X1, Y1, Z1)
  605. Xdouble *X, *Y, *Z;
  606. Xdouble X1, Y1, Z1;
  607. X/******************************************************************************
  608. X   Calculate what the result of the angle changes of X1, Y1, and Z1 are
  609. X   in my weird coordinate system.
  610. X******************************************************************************/
  611. X{
  612. XanglePoint points[2];
  613. X
  614. X   points[0].x = 0.0; points[0].y = 0.0; points[0].z = 1.0;
  615. X   points[1].x = 1.0; points[1].y = 0.0; points[1].z = 0.0;
  616. X
  617. X   GI_Rotate(points, cos(*X), cos(*Y), cos(*Z), sin(*X), sin(*Y), sin(*Z));
  618. X   GI_Rotate(points, cos(X1), cos(Y1), cos(Z1), sin(X1), sin(Y1), sin(Z1));
  619. X
  620. X   *Y = acos(GI_DotProduct(points[0].x, points[0].z, 0.0, 1.0)); 
  621. X
  622. X   if(points[0].x < 0.0)
  623. X      *Y = -*Y;
  624. X
  625. X   GI_Rotate(points, 1.0, cos(-*Y), 1.0, 0.0, sin(-*Y), 0.0);
  626. X   *X = acos(GI_DotProduct(points[0].y, points[0].z, 0.0, 1.0)); 
  627. X
  628. X   if(points[0].y < 0.0)
  629. X      *X = -*X;
  630. X
  631. X   GI_Rotate(points, cos(-*X), 1.0, 1.0, sin(-*X), 0.0, 0.0);
  632. X   *Z = acos(GI_DotProduct(points[1].x, points[1].y, 1.0, 0.0)); 
  633. X
  634. X   if(!(points[1].y < 0.0))
  635. X      *Z = -*Z;
  636. X}
  637. X
  638. X
  639. X
  640. Xvoid GI_ParseCommandLine(argc, argv, filename, scale, gi)
  641. Xint argc;
  642. Xchar *argv[];
  643. Xchar **filename;
  644. Xdouble *scale;
  645. XGIinfo *gi;
  646. X/******************************************************************************
  647. X   Parse the command line set the filename and the appropriate flags
  648. X******************************************************************************/
  649. X{
  650. Xstatic char *options[] = {
  651. X   "-help",
  652. X   "-display",
  653. X   "-geometry",
  654. X   "-flicker",
  655. X   "-menu",
  656. X   "-stats",
  657. X   "-stereo",
  658. X   "-controls",
  659. X   "-scale"
  660. X};
  661. Xint NUMOPTIONS = 9;
  662. Xint filenameValid = 0;
  663. Xint index, option;
  664. Xfloat temp;
  665. X
  666. X   gi->Flicker = 0;
  667. X   gi->Menu = gi->Stats = gi->Stereo = 1;
  668. X   gi->DisplayName = gi->Geometry = NULL;
  669. X   *scale = 1.0;
  670. X
  671. X   for(index = 1; index < argc; index++){
  672. X      for(option = 0; option < NUMOPTIONS; option++)
  673. X         if(!strcmp(argv[index], options[option]))
  674. X            break;
  675. X
  676. X      switch(option){
  677. X         
  678. X         case 0:    
  679. X            fprintf(stderr, "Options:\n");  
  680. X            fprintf(stderr, "-display  <display>        X display name\n");  
  681. X            fprintf(stderr, "-flicker                   Make window flicker\n");
  682. X            fprintf(stderr, "-geometry <geometry>       Window geometry\n");  
  683. X            fprintf(stderr, "-help                      Print this message\n"); 
  684. X            fprintf(stderr, "-menu                      Turn off menu\n");  
  685. X            fprintf(stderr, "-stats                     Turn off stats\n");  
  686. X            fprintf(stderr, "-stereo                    Turn off stereo\n");
  687. X            fprintf(stderr, "-controls                  Switch controls style\n");
  688. X            fprintf(stderr, "-scale <amount>            Scale object by amount\n");
  689. X            exit(0);
  690. X            break;
  691. X       
  692. X         case 1:
  693. X            gi->DisplayName = argv[++index];
  694. X            break;
  695. X
  696. X         case 2:
  697. X            gi->Geometry = argv[++index];
  698. X            break;
  699. X
  700. X         case 3:
  701. X            gi->Flicker = 1;
  702. X            break;
  703. X
  704. X         case 4:
  705. X            gi->Menu = 0;
  706. X            break;
  707. X
  708. X         case 5:
  709. X            gi->Stats = 0;
  710. X            break;
  711. X
  712. X         case 6:
  713. X            gi->Stereo = 0;     
  714. X            break;
  715. X  
  716. X         case 7:
  717. X            gi->Relative = 0;     
  718. X            break;
  719. X  
  720. X         case 8:
  721. X            if(!sscanf(argv[++index], "%f\n", &temp)){
  722. X               fprintf(stderr, "Bad scale argument\n");
  723. X               exit(1);
  724. X               }
  725. X            *scale = (double)temp;
  726. X            break;
  727. X  
  728. X         default:
  729. X            if(!filenameValid){
  730. X               *filename = (char *)(argv[index]);
  731. X               filenameValid = 1;
  732. X            }else{
  733. X               fprintf(stderr,"usage:    %s <object file>\n", argv[0]);
  734. X               fprintf(stderr,"%s -help  for a list of options\n", argv[0]);
  735. X               exit(1);
  736. X               }
  737. X            break; 
  738. X         }
  739. X      }
  740. X
  741. X   if(!filenameValid){
  742. X      fprintf(stderr,"usage:    %s <object file>\n", argv[0]);
  743. X      fprintf(stderr,"%s -help  for a list of options\n", argv[0]);
  744. X      exit(1);
  745. X      }
  746. X}
  747. X
  748. X
  749. X
  750. Xvoid GI_ResizeFont(gi)
  751. XGIinfo *gi;
  752. X/******************************************************************************
  753. X   Resize the font according to the current window dimensions.
  754. X******************************************************************************/
  755. X{
  756. Xint index;
  757. Xfloat xFontScale, yFontScale;
  758. X
  759. X   xFontScale = (float)gi->winX / (float)(NUMCOLS * XLENGTH); 
  760. X   yFontScale = (float)gi->winY / (float)(NUMROWS * YLENGTH);
  761. X
  762. X   if(xFontScale < yFontScale)
  763. X      gi->fontScale = xFontScale;
  764. X   else
  765. X      gi->fontScale = yFontScale;
  766. X
  767. X   gi->xCharacterLength = (number)((float)XLENGTH * GAPFACTOR * gi->fontScale); 
  768. X   gi->yCharacterLength = (number)((float)YLENGTH * GAPFACTOR * gi->fontScale);
  769. X
  770. X   for(index = 0; index < NUMLINES; index++){
  771. X      Lines[index].x1=(number)((float)lines[index].x1 * gi->fontScale)+ xOffset;
  772. X      Lines[index].y1=(number)((float)lines[index].y1 * gi->fontScale)+ yOffset;
  773. X      Lines[index].x2=(number)((float)lines[index].x2 * gi->fontScale)+ xOffset;
  774. X      Lines[index].y2=(number)((float)lines[index].y2 * gi->fontScale)+ yOffset;
  775. X      }
  776. X}
  777. X
  778. X
  779. X
  780. Xvoid GI_PrintString(string, gi)
  781. Xchar *string;
  782. XGIinfo *gi;
  783. X/******************************************************************************
  784. X   Print the string specified in the vector font at the current cursor
  785. X   position. 
  786. X******************************************************************************/
  787. X{
  788. Xint index, x1, Y1, x2, y2, stringIndex;
  789. Xint charNo;
  790. Xchar c;
  791. X
  792. X   if(string){
  793. X      
  794. X      stringIndex = 0;
  795. X
  796. X      while(c = string[stringIndex++]){
  797. X
  798. X         switch(c){
  799. X            case '\n': charNo = 0; gi->cursorX = (number)-1;
  800. X                       gi->cursorY += (number)1; break;
  801. X            case 'A' : charNo =  1; break; 
  802. X            case 'B' : charNo =  2; break; 
  803. X            case 'C' : charNo =  3; break; 
  804. X            case 'D' : charNo =  4; break; 
  805. X            case 'E' : charNo =  5; break; 
  806. X            case 'F' : charNo =  6; break; 
  807. X            case 'G' : charNo =  7; break; 
  808. X            case 'H' : charNo =  8; break; 
  809. X            case 'I' : charNo =  9; break; 
  810. X            case 'J' : charNo = 10; break; 
  811. X            case 'K' : charNo = 11; break; 
  812. X            case 'L' : charNo = 12; break; 
  813. X            case 'M' : charNo = 13; break; 
  814. X            case 'N' : charNo = 14; break; 
  815. X            case 'O' : charNo = 15; break; 
  816. X            case 'P' : charNo = 16; break; 
  817. X            case 'Q' : charNo = 17; break; 
  818. X            case 'R' : charNo = 18; break; 
  819. X            case 'S' : charNo = 19; break; 
  820. X            case 'T' : charNo = 20; break; 
  821. X            case 'U' : charNo = 21; break; 
  822. X            case 'V' : charNo = 22; break; 
  823. X            case 'W' : charNo = 23; break; 
  824. X            case 'X' : charNo = 24; break; 
  825. X            case 'Y' : charNo = 25; break; 
  826. X            case 'Z' : charNo = 26; break; 
  827. X            case '0' : charNo = 27; break; 
  828. X            case '1' : charNo = 28; break; 
  829. X            case '2' : charNo = 29; break; 
  830. X            case '3' : charNo = 30; break; 
  831. X            case '4' : charNo = 31; break; 
  832. X            case '5' : charNo = 32; break; 
  833. X            case '6' : charNo = 33; break; 
  834. X            case '7' : charNo = 34; break; 
  835. X            case '8' : charNo = 35; break; 
  836. X            case '9' : charNo = 36; break; 
  837. X            case '-' : charNo = 37; break; 
  838. X            case '.' : charNo = 38; break; 
  839. X            default  : charNo =  0; break;
  840. X            }
  841. X
  842. X         if(charNo){
  843. X
  844. X            for(index = 0; index < numLines[charNo]; index++){
  845. X
  846. X               x1 = (int)Lines[chars[charNo][index]].x1 +
  847. X                    gi->cursorX * gi->xCharacterLength;
  848. X
  849. X               Y1 = (int)Lines[chars[charNo][index]].y1 +
  850. X                    gi->cursorY * gi->yCharacterLength;
  851. X
  852. X               x2 = (int)Lines[chars[charNo][index]].x2 +
  853. X                    gi->cursorX * gi->xCharacterLength;
  854. X
  855. X               y2 = (int)Lines[chars[charNo][index]].y2 +
  856. X                    gi->cursorY * gi->yCharacterLength;
  857. X
  858. X               GI_AddMenuRedSegment(x1, Y1, x2, y2, gi)       
  859. X    
  860. X               if((!gi->Monochrome) || (!gi->Stereo)){ 
  861. X                  GI_AddMenuBlueSegment(x1, Y1, x2, y2, gi)       
  862. X                  }
  863. X               }
  864. X            }
  865. X
  866. X         gi->cursorX += (number)1;
  867. X         }
  868. X      }
  869. X}
  870. X
  871. X
  872. X
  873. Xvoid GI_DisplayMenu(gi)
  874. XGIinfo *gi;
  875. X/******************************************************************************
  876. X   Display the controls menu.
  877. X******************************************************************************/
  878. X{
  879. Xchar buf[256];
  880. X  
  881. X   GI_Print(buf, gi,"\n\n");
  882. X   GI_Print(buf, gi,"                             O   O   OOOOO   OOOO\n");
  883. X   GI_Print(buf, gi,"                              O O        O   O   O\n");
  884. X   GI_Print(buf, gi,"                               O       OOO   O   O\n");
  885. X   GI_Print(buf, gi,"                              O O        O   O   O\n");
  886. X   GI_Print(buf, gi,"                             O   O   OOOOO   OOOO\n");
  887. X   GI_Print(buf, gi,"                                  VERSION 1.1\n");
  888. X   GI_Print(buf, gi,"\n");
  889. X   GI_Print(buf, gi,"     CONTROLS SUMMARY\n");
  890. X   GI_Print(buf, gi,"\n");
  891. X   GI_Print(buf, gi,"     QUIT                    UPPERCASE AND LOWERCASE Q\n");
  892. X   GI_Print(buf, gi,"     TOGGLE CONTROLS MENU    UPPERCASE AND LOWERCASE M\n");
  893. X   GI_Print(buf, gi,"     TOGGLE POSITION DISPLAY UPPERCASE AND LOWERCASE P\n");
  894. X   GI_Print(buf, gi,"     TOGGLE STEREO DISPLAY   UPPERCASE AND LOWERCASE S\n");
  895. X   GI_Print(buf, gi,"     TOGGLE FLICKER          UPPERCASE AND LOWERCASE F\n");
  896. X   GI_Print(buf, gi,"     TOGGLE CONTROLS STYLE   UPPERCASE AND LOWERCASE R\n");
  897. X   GI_Print(buf, gi,"     ROTATE OBJECT ABOUT X   VERTICAL   POINTER MOVEMENT WHILE HOLDING LEFT BUTTON \n");
  898. X   GI_Print(buf, gi,"     ROTATE OBJECT ABOUT Z   HORIZONTAL POINTER MOVEMENT WHILE HOLDING LEFT BUTTON \n");
  899. X   GI_Print(buf, gi,"     MOVE OBJECT BACKWARD    UPPERCASE AND LOWERCASE J\n");
  900. X   GI_Print(buf, gi,"     MOVE OBJECT FOREWARD    UPPERCASE AND LOWERCASE K\n");
  901. X   GI_Print(buf, gi,"     MOVE OBJECT RIGHT       UPPERCASE AND LOWERCASE H\n");
  902. X   GI_Print(buf, gi,"     MOVE OBJECT LEFT        UPPERCASE AND LOWERCASE L\n");
  903. X   GI_Print(buf, gi,"     MOVE OBJECT UP          UPPERCASE AND LOWERCASE I\n");
  904. X   GI_Print(buf, gi,"     MOVE OBJECT DOWN        UPPERCASE AND LOWERCASE U\n");
  905. X   GI_Print(buf, gi,"     ROTATE ABOUT X          UPPERCASE AND LOWERCASE X A\n");
  906. X   GI_Print(buf, gi,"     ROTATE ABOUT Y          UPPERCASE AND LOWERCASE Y B\n");
  907. X   GI_Print(buf, gi,"     ROTATE ABOUT Z          UPPERCASE AND LOWERCASE Z C\n");
  908. X   GI_Print(buf, gi,"     AUTOROTATE ABOUT X      1 2 3\n");
  909. X   GI_Print(buf, gi,"     AUTOROTATE ABOUT Y      4 5 6\n");
  910. X   GI_Print(buf, gi,"     AUTOROTATE ABOUT Z      7 8 9\n");
  911. X   GI_Print(buf, gi,"     ADJUST FOCUS            SQUARE AND CURLY BRACKETS\n");
  912. X}
  913. X
  914. X
  915. X
  916. Xvoid GI_ResetPurpleRectangle(XL, YL, XH, YH, gi)
  917. Xint XL, YL, XH, YH;
  918. XGIinfo *gi;
  919. X/******************************************************************************
  920. X   Reset the vertices of the purple rectangle.
  921. X******************************************************************************/
  922. X{
  923. X   gi->redSegments[3].x1  = (XL + MARGIN);
  924. X   gi->blueSegments[3].x1 = (XL + MARGIN);
  925. X   gi->redSegments[3].y1  = (YL + MARGIN);
  926. X   gi->blueSegments[3].y1 = (YL + MARGIN);
  927. X   gi->redSegments[3].x2  = (XH - MARGIN);
  928. X   gi->blueSegments[3].x2 = (XH - MARGIN);
  929. X   gi->redSegments[3].y2  = (YL + MARGIN);
  930. X   gi->blueSegments[3].y2 = (YL + MARGIN);
  931. X   gi->redSegments[2].x1  = (XH - MARGIN);
  932. X   gi->blueSegments[2].x1 = (XH - MARGIN);
  933. X   gi->redSegments[2].y1  = (YH - MARGIN);
  934. X   gi->blueSegments[2].y1 = (YH - MARGIN);
  935. X   gi->redSegments[2].x2  = (XL + MARGIN);
  936. X   gi->blueSegments[2].x2 = (XL + MARGIN);
  937. X   gi->redSegments[2].y2  = (YH - MARGIN);
  938. X   gi->blueSegments[2].y2 = (YH - MARGIN);
  939. X   gi->redSegments[1].x1  = (XH - MARGIN);
  940. X   gi->blueSegments[1].x1 = (XH - MARGIN);
  941. X   gi->redSegments[1].y1  = (YL + MARGIN);
  942. X   gi->blueSegments[1].y1 = (YL + MARGIN);
  943. X   gi->redSegments[1].x2  = (XH - MARGIN);
  944. X   gi->blueSegments[1].x2 = (XH - MARGIN);
  945. X   gi->redSegments[1].y2  = (YH - MARGIN);
  946. X   gi->blueSegments[1].y2 = (YH - MARGIN);
  947. X   gi->redSegments[0].x1  = (XL + MARGIN);
  948. X   gi->blueSegments[0].x1 = (XL + MARGIN);
  949. X   gi->redSegments[0].y1  = (YL + MARGIN);
  950. X   gi->blueSegments[0].y1 = (YL + MARGIN);
  951. X   gi->redSegments[0].x2  = (XL + MARGIN);
  952. X   gi->blueSegments[0].x2 = (XL + MARGIN);
  953. X   gi->redSegments[0].y2  = (YH - MARGIN);
  954. X   gi->blueSegments[0].y2 = (YH - MARGIN);
  955. X}
  956. X
  957. X
  958. X
  959. Xint GI_InitDisplay(gi, numSegments)
  960. XGIinfo *gi;
  961. Xint numSegments;
  962. X/******************************************************************************
  963. X   Set up an X window and our colormap.  We rely on X's own error handling and
  964. X   reporting for most bad X calls because X buffers requests.
  965. X
  966. X   Returns GIE_OK if successful, an GI error otherwise.
  967. X******************************************************************************/
  968. X{
  969. XXColor BLACK, BLUE, RED, PURPLE, oldColormap[NUMCOLORS];
  970. XXWindowAttributes attributes;
  971. XXSetWindowAttributes attribs;
  972. Xint index, screen;
  973. XXVisualInfo vInfo;
  974. XXSizeHints sizehint;
  975. Xint x, y;
  976. Xunsigned int width, height;
  977. X
  978. X/*
  979. X   Allocate memory for the XSegments.
  980. X   Note: We will crash if we try to draw too many segments.
  981. X   The best way to handle this would be the flush the segment
  982. X   buffers when they get full.  As a current fix just allocate
  983. X   LOTS of memory when this gives you trouble.
  984. X */ 
  985. X
  986. X   if((gi->redSegments = (XSegment *)malloc((numSegments + 4) *
  987. X   sizeof(XSegment))) == (XSegment *)NULL){
  988. X      fprintf(stderr, "Unable to allocate memory for redSegments\n"); exit(1);}
  989. X
  990. X   if((gi->blueSegments = (XSegment *)malloc((numSegments + 4) *
  991. X   sizeof(XSegment))) == (XSegment *)NULL){
  992. X      fprintf(stderr, "Unable to allocate memory for blueSegments\n"); exit(1);}
  993. X
  994. X   if((gi->menuRedSegments = (XSegment *)malloc(NUMSEGMENTS * sizeof(XSegment))
  995. X   ) == (XSegment *)NULL){
  996. X      fprintf(stderr, "Unable to allocate memory for menuRedSegments\n");
  997. X      exit(1);}
  998. X
  999. X   if((gi->menuBlueSegments = (XSegment *)malloc(NUMSEGMENTS * sizeof(XSegment)
  1000. X   )) == (XSegment *)NULL){
  1001. X      fprintf(stderr, "Unable to allocate memory for menuBlueSegments\n");
  1002. X      exit(1);}
  1003. X
  1004. X/* Can we connect with the server? */
  1005. X
  1006. X   if((gi->dpy = XOpenDisplay(gi->DisplayName)) == NULL)
  1007. X      GI_ERROR(NO_CONNECT);
  1008. X
  1009. X   screen = DefaultScreen(gi->dpy);
  1010. X
  1011. X   XSynchronize(gi->dpy, 1);
  1012. X
  1013. X/* Initialize various flags and default values */
  1014. X
  1015. X   gi->dpyX = DisplayWidth(gi->dpy, screen);
  1016. X   gi->dpyY = DisplayHeight(gi->dpy, screen);
  1017. X   gi->winX = gi->dpyX;
  1018. X   gi->winY = gi->dpyY - 25;
  1019. X   gi->ColorSelect = gi->oldPointerX = gi->oldPointerY = 0;
  1020. X   gi->Block = gi->Monochrome = gi->Order = gi->Relative = 1;
  1021. X
  1022. X/* Initialize the font */
  1023. X
  1024. X   GI_ResizeFont(gi);
  1025. X
  1026. X/* Which visual do we get? */
  1027. X
  1028. X   gi->trueColor = gi->pseudoColor = 0;
  1029. X
  1030. X/* An 8 bit PseudoColor ? */
  1031. X
  1032. X   if(XMatchVisualInfo(gi->dpy, screen, 8, PseudoColor, &vInfo))
  1033. X      gi->pseudoColor = 1;
  1034. X   else
  1035. X
  1036. X/* A 24 bit TrueColor ? */
  1037. X      if(XMatchVisualInfo(gi->dpy, screen, 24, TrueColor, &vInfo))
  1038. X         gi->trueColor = 1;
  1039. X
  1040. X/* Everything else we treat as monochrome whether or not
  1041. X   something better may be supported */
  1042. X
  1043. X/* Make a vanilla window */
  1044. X
  1045. X   gi->win = XCreateSimpleWindow(gi->dpy, RootWindow(gi->dpy,screen), 0, 0,
  1046. X      gi->winX, gi->winY, 0, 0, 0);
  1047. X
  1048. X   if(X_ERROR(gi->win))
  1049. X      GI_ERROR(NO_CREATE_WINDOW) 
  1050. X   
  1051. X/* Any user geometry? */
  1052. X
  1053. X   if(gi->Geometry){
  1054. X
  1055. X      x = 0;
  1056. X      y = 0;
  1057. X      width = gi->winX;
  1058. X      height = gi->winY;
  1059. X      sizehint.flags = USPosition | USSize;
  1060. X
  1061. X      XParseGeometry(gi->Geometry, &x, &y, &width, &height); 
  1062. X
  1063. X      sizehint.x = x;
  1064. X      sizehint.y = y;
  1065. X      sizehint.width  = width;
  1066. X      sizehint.height = height;
  1067. X      gi->winX = width;
  1068. X      gi->winY = height;
  1069. X
  1070. X      XResizeWindow(gi->dpy, gi->win, width, height);
  1071. X      XSetNormalHints(gi->dpy, gi->win, &sizehint);
  1072. X      } 
  1073. X
  1074. X/* Set horizontal and vertical ranges */
  1075. X
  1076. X   gi->winH = (int)(gi->winX / 2.0); 
  1077. X   gi->winV = (int)(gi->winY / 2.0); 
  1078. X
  1079. X/* Make our graphics context */
  1080. X
  1081. X   gi->gc = XCreateGC(gi->dpy, gi->win, 0x0, NULL);
  1082. X
  1083. X   if(X_ERROR((int)gi->gc))
  1084. X      GI_ERROR(NO_CREATE_GC) 
  1085. X
  1086. X/* We want to have the input focus if we can */
  1087. X
  1088. X   XSetInputFocus(gi->dpy, PointerRoot, RevertToNone, CurrentTime);
  1089. X
  1090. X/* Please do not do backing store on the contents of our window */
  1091. X
  1092. X   attribs.backing_store = NotUseful;
  1093. X   XChangeWindowAttributes(gi->dpy, gi->win, CWBackingStore, &attribs);
  1094. X
  1095. X/* We only want certain kinds of events */
  1096. X
  1097. X   XSelectInput(gi->dpy, gi->win, ButtonPressMask | ButtonReleaseMask |
  1098. X      KeyPressMask | Button1MotionMask | Button2MotionMask |
  1099. X      StructureNotifyMask | ExposureMask | ColormapChangeMask);
  1100. X
  1101. X/* Do not generate expose events */
  1102. X
  1103. X   XSetGraphicsExposures(gi->dpy,gi->gc, 0);
  1104. X
  1105. X/* Name our window */
  1106. X
  1107. X   XStoreName(gi->dpy, gi->win, "X3D"); 
  1108. X
  1109. X   if(gi->pseudoColor){
  1110. X
  1111. X/* Make our colormap */
  1112. X
  1113. X      gi->colormap = XCreateColormap(gi->dpy, gi->win, DefaultVisual(gi->dpy,
  1114. X      DefaultScreen(gi->dpy)), AllocAll);
  1115. X
  1116. X      if(X_ERROR(gi->colormap))
  1117. X          GI_ERROR(NO_CREATE_COLORMAP) 
  1118. X
  1119. X/* Get the current colormap */
  1120. X
  1121. X      XGetWindowAttributes(gi->dpy, RootWindow(gi->dpy,screen), &attributes);
  1122. X
  1123. X/* Since we only use 16 colors, set all our other entries to the old values.
  1124. X   Hopefully some other windows might display in true colors */
  1125. X    
  1126. X      for(index = 0; index < NUMCOLORS; index++)
  1127. X         oldColormap[index].pixel = index;
  1128. X
  1129. X      XQueryColors(gi->dpy, attributes.colormap, oldColormap, NUMCOLORS);
  1130. X      XStoreColors(gi->dpy, gi->colormap, oldColormap, NUMCOLORS);
  1131. X
  1132. X/* Initialize the two sets of color values we switch between */
  1133. X
  1134. X      BLACK.red  = 0       ; BLACK.green  = 0; BLACK.blue  = 0       ;
  1135. X      BLUE.red   = 0       ; BLUE.green   = 0; BLUE.blue   = 255 << 8;
  1136. X      RED.red    = 255 << 8; RED.green    = 0; RED.blue    = 0       ;
  1137. X      PURPLE.red = 255 << 8; PURPLE.green = 0; PURPLE.blue = 255 << 8;
  1138. X
  1139. X      BLACK.flags  = DoRed | DoGreen | DoBlue;
  1140. X      BLUE.flags   = DoRed | DoGreen | DoBlue;
  1141. X      RED.flags    = DoRed | DoGreen | DoBlue;
  1142. X      PURPLE.flags = DoRed | DoGreen | DoBlue;
  1143. X
  1144. X/* These colors never change */
  1145. X      BLACK.pixel  = COLOROFFSET + 0; 
  1146. X      BLUE.pixel   = COLOROFFSET + 5 ;
  1147. X      RED.pixel    = COLOROFFSET + 10;
  1148. X      PURPLE.pixel = COLOROFFSET + 15;
  1149. X
  1150. X      XStoreColor(gi->dpy, gi->colormap, &BLACK);
  1151. X      XStoreColor(gi->dpy, gi->colormap, &BLUE);
  1152. X      XStoreColor(gi->dpy, gi->colormap, &RED);
  1153. X      XStoreColor(gi->dpy, gi->colormap, &PURPLE);
  1154. X
  1155. X/* Set up the color values we switch between */
  1156. X
  1157. X      BLACK.pixel  = COLOROFFSET + 1 ; gi->colors[0][0]  = BLACK;
  1158. X      BLACK.pixel  = COLOROFFSET + 2 ; gi->colors[0][1]  = BLACK;
  1159. X      BLACK.pixel  = COLOROFFSET + 3 ; gi->colors[0][2]  = BLACK;
  1160. X      BLUE.pixel   = COLOROFFSET + 4 ; gi->colors[0][3]  = BLUE;
  1161. X      BLUE.pixel   = COLOROFFSET + 6 ; gi->colors[0][4]  = BLUE;
  1162. X      BLUE.pixel   = COLOROFFSET + 7 ; gi->colors[0][5]  = BLUE;
  1163. X      RED.pixel    = COLOROFFSET + 8 ; gi->colors[0][6]  = RED;
  1164. X      RED.pixel    = COLOROFFSET + 9 ; gi->colors[0][7]  = RED;
  1165. X      RED.pixel    = COLOROFFSET + 11; gi->colors[0][8]  = RED;
  1166. X      PURPLE.pixel = COLOROFFSET + 12; gi->colors[0][9]  = PURPLE;
  1167. X      PURPLE.pixel = COLOROFFSET + 13; gi->colors[0][10] = PURPLE;
  1168. X      PURPLE.pixel = COLOROFFSET + 14; gi->colors[0][11] = PURPLE;
  1169. X
  1170. X      BLUE.pixel   = COLOROFFSET + 1 ; gi->colors[1][0]  = BLUE;
  1171. X      RED.pixel    = COLOROFFSET + 2 ; gi->colors[1][1]  = RED;
  1172. X      PURPLE.pixel = COLOROFFSET + 3 ; gi->colors[1][2]  = PURPLE;
  1173. X      BLACK.pixel  = COLOROFFSET + 4 ; gi->colors[1][3]  = BLACK;
  1174. X      RED.pixel    = COLOROFFSET + 6 ; gi->colors[1][4]  = RED;
  1175. X      PURPLE.pixel = COLOROFFSET + 7 ; gi->colors[1][5]  = PURPLE;
  1176. X      BLACK.pixel  = COLOROFFSET + 8 ; gi->colors[1][6]  = BLACK;
  1177. X      BLUE.pixel   = COLOROFFSET + 9 ; gi->colors[1][7]  = BLUE;
  1178. X      PURPLE.pixel = COLOROFFSET + 11; gi->colors[1][8]  = PURPLE;
  1179. X      BLACK.pixel  = COLOROFFSET + 12; gi->colors[1][9]  = BLACK;
  1180. X      BLUE.pixel   = COLOROFFSET + 13; gi->colors[1][10] = BLUE;
  1181. X      RED.pixel    = COLOROFFSET + 14; gi->colors[1][11] = RED;
  1182. X
  1183. X/* Set our special 12 colors to something */
  1184. X
  1185. X      XStoreColors(gi->dpy, gi->colormap, gi->colors[0], 12);
  1186. X      XSetWindowColormap(gi->dpy, gi->win, gi->colormap);
  1187. X      }
  1188. X
  1189. X/* Make the purple rectangle */
  1190. X
  1191. X   GI_ResetPurpleRectangle(0, 0, gi->winX, gi->winY, gi);
  1192. X
  1193. X/* 
  1194. X   Make the window appear. 
  1195. X*/
  1196. X   XMapWindow(gi->dpy, gi->win);
  1197. X
  1198. X   return GIE_OK;
  1199. X}
  1200. X
  1201. X
  1202. X
  1203. Xvoid GI_MakeImageCurrent(gi)
  1204. XGIinfo *gi;
  1205. X/******************************************************************************
  1206. X   Flush the remaining contents of the line segment buffers out onto the
  1207. X   screen.  Toggle the colors.  Erase the old lines.
  1208. X******************************************************************************/
  1209. X{
  1210. X
  1211. X/* Pretend we are a monochrome display */
  1212. X  
  1213. X   if((gi->Monochrome) || ((!(gi->pseudoColor)) && (!(gi->trueColor)))){
  1214. X      XSetPlaneMask (gi->dpy, gi->gc,  AllPlanes);
  1215. X      XSetForeground(gi->dpy, gi->gc, BlackPixel(gi->dpy,
  1216. X         DefaultScreen(gi->dpy)));
  1217. X      XFillRectangle(gi->dpy, gi->win, gi->gc, 0, 0, gi->winX, gi->winY);
  1218. X      XSetForeground(gi->dpy, gi->gc, WhitePixel(gi->dpy,
  1219. X         DefaultScreen(gi->dpy)));
  1220. X      XDrawSegments(gi->dpy, gi->win, gi->gc, gi->redSegments, gi->numberRed);
  1221. X
  1222. X      if(gi->menuNumberRed){
  1223. X         XDrawSegments(gi->dpy, gi->win, gi->gc, gi->menuRedSegments,
  1224. X         gi->menuNumberRed);
  1225. X         gi->menuNumberRed = 0;
  1226. X         gi->menuNumberBlue = 0;
  1227. X         }
  1228. X      XSync(gi->dpy, 0);
  1229. X      gi->ColorSelect = 1;  
  1230. X   }else{
  1231. X
  1232. X/* We want to flicker with the current color values */
  1233. X      if((gi->Flicker) || (gi->trueColor)){
  1234. X         gi->Order = !gi->Order;
  1235. X
  1236. X         if(gi->pseudoColor){
  1237. X            gi->ColorSelect = 1;  
  1238. X            XStoreColors(gi->dpy, gi->colormap, gi->colors[gi->ColorSelect],12);
  1239. X             gi->red = COLOROFFSET + 2;
  1240. X            gi->blue = COLOROFFSET + 1;
  1241. X            gi->mask = COLOROFFSET + 15; 
  1242. X            XSetPlaneMask (gi->dpy, gi->gc, gi->mask);
  1243. X            XSetForeground(gi->dpy, gi->gc, COLOROFFSET);
  1244. X            XFillRectangle(gi->dpy, gi->win, gi->gc, 0, 0, gi->winX, gi->winY);
  1245. X         }else{
  1246. X            gi->red = 255 << 16;
  1247. X           gi->blue = 255; 
  1248. X           }
  1249. X
  1250. X/* Alternate line display order because it helps even out the amount
  1251. X   of time red and blue lines are displayed */
  1252. X
  1253. X         if(gi->Order){
  1254. X            XSetForeground(gi->dpy, gi->gc, gi->red);
  1255. X            XDrawSegments (gi->dpy, gi->win, gi->gc, gi->redSegments,
  1256. X               gi->numberRed);
  1257. X            if(gi->menuNumberRed){
  1258. X               XDrawSegments(gi->dpy, gi->win, gi->gc, gi->menuRedSegments,
  1259. X               gi->menuNumberRed);
  1260. X               gi->menuNumberRed = 0;
  1261. X               }
  1262. X            XSetFunction  (gi->dpy, gi->gc,  GXor);
  1263. X            }
  1264. X      
  1265. X         if(gi->Stereo){
  1266. X            XSetForeground(gi->dpy, gi->gc,  gi->blue);
  1267. X            XDrawSegments (gi->dpy, gi->win, gi->gc, gi->blueSegments,
  1268. X               gi->numberBlue);
  1269. X            if(gi->menuNumberBlue){
  1270. X               XDrawSegments(gi->dpy, gi->win, gi->gc, gi->menuBlueSegments,
  1271. X               gi->menuNumberBlue);
  1272. X               gi->menuNumberBlue = 0;
  1273. X               }
  1274. X         }
  1275. X
  1276. X         if(!gi->Order){
  1277. X            XSetFunction  (gi->dpy, gi->gc,  GXor);
  1278. X            XSetForeground(gi->dpy, gi->gc, gi->red);
  1279. X            XDrawSegments (gi->dpy, gi->win, gi->gc, gi->redSegments,
  1280. X               gi->numberRed);
  1281. X            if(gi->menuNumberRed){
  1282. X               XDrawSegments(gi->dpy, gi->win, gi->gc, gi->menuRedSegments,
  1283. X               gi->menuNumberRed);
  1284. X               gi->menuNumberRed = 0;
  1285. X               }
  1286. X            }
  1287. X      
  1288. X         XSetFunction  (gi->dpy, gi->gc,  GXcopy);
  1289. X         XSync(gi->dpy, 0);
  1290. X      }else{
  1291. X
  1292. X/* Do our wonderful flicker free screen update */
  1293. X         
  1294. X         XSetForeground(gi->dpy, gi->gc,  COLOROFFSET);
  1295. X         XFillRectangle(gi->dpy, gi->win, gi->gc, 0, 0, gi->winX, gi->winY);
  1296. X
  1297. X         gi->ColorSelect = !gi->ColorSelect;  
  1298. X
  1299. X         if(gi->ColorSelect){
  1300. X             gi->red = COLOROFFSET + 2;
  1301. X            gi->blue = COLOROFFSET + 1;
  1302. X            gi->mask = COLOROFFSET + 12;
  1303. X         }else{
  1304. X             gi->red = COLOROFFSET + 8;
  1305. X            gi->blue = COLOROFFSET + 4;
  1306. X            gi->mask = COLOROFFSET + 3;
  1307. X         }
  1308. X         
  1309. X         XSetForeground(gi->dpy, gi->gc, gi->red);
  1310. X         XDrawSegments (gi->dpy, gi->win, gi->gc, gi->redSegments,
  1311. X            gi->numberRed);
  1312. X         if(gi->menuNumberRed){
  1313. X            XDrawSegments(gi->dpy, gi->win, gi->gc, gi->menuRedSegments,
  1314. X            gi->menuNumberRed);
  1315. X            gi->menuNumberRed = 0;
  1316. X            }
  1317. X         XSetFunction  (gi->dpy, gi->gc,  GXor);
  1318. X      
  1319. X         if(gi->Stereo){
  1320. X            XSetForeground(gi->dpy, gi->gc,  gi->blue);
  1321. X            XDrawSegments (gi->dpy, gi->win, gi->gc, gi->blueSegments,
  1322. X               gi->numberBlue);
  1323. X            if(gi->menuNumberBlue){
  1324. X               XDrawSegments(gi->dpy, gi->win, gi->gc, gi->menuBlueSegments,
  1325. X               gi->menuNumberBlue);
  1326. X               gi->menuNumberBlue = 0;
  1327. X               }
  1328. X         }
  1329. X
  1330. X         XSetFunction (gi->dpy, gi->gc, GXcopy);
  1331. X         XSetPlaneMask(gi->dpy, gi->gc, gi->mask);
  1332. X         XStoreColors(gi->dpy, gi->colormap, gi->colors[gi->ColorSelect],12);
  1333. X         XSync(gi->dpy,0);
  1334. X         }
  1335. X      }
  1336. X
  1337. X/* Reset the number of lines (We always keep the purple rectangle) */
  1338. X
  1339. X   gi->numberRed  = 4;
  1340. X   gi->numberBlue = 4;
  1341. X   gi->menuNumberRed  = 0;
  1342. X   gi->menuNumberBlue = 0;
  1343. X}
  1344. X
  1345. X
  1346. X
  1347. Xint GI_CheckEvent(display, event, arg)
  1348. XDisplay *display;
  1349. XXEvent *event;
  1350. Xchar *arg;
  1351. X/******************************************************************************
  1352. X   Check an event to see if it is one we are interested in.
  1353. X
  1354. X   Returns: 1 if we are interested, 0 if we are not. 
  1355. X******************************************************************************/
  1356. X{
  1357. X   if((event->type == MotionNotify) || (event->type == KeyPress) ||
  1358. X      (event->type == ConfigureNotify) || (event->type == Expose) ||
  1359. X      (event->type == ColormapNotify))
  1360. X      return 1;
  1361. X
  1362. X   return 0;
  1363. X}
  1364. X
  1365. X
  1366. X
  1367. Xvoid GI_GetInput(pointerX, pointerY, command, same, gi)
  1368. Xint *pointerX, *pointerY;
  1369. Xchar *command;
  1370. Xint *same;
  1371. XGIinfo *gi;
  1372. X/******************************************************************************
  1373. X   Get an interesting event and update the user input information.
  1374. X
  1375. X   The routine will eventually block waiting for an event if block is 1 
  1376. X   and the no events of interest have shown up.
  1377. X   Returns: GIE_OK if successful, an GI error code otherwise.
  1378. X******************************************************************************/
  1379. X{
  1380. XXEvent event;
  1381. XXSizeHints sizehint;
  1382. Xint  numEvents, block, count;
  1383. Xchar string[TMPSTRLEN];
  1384. X
  1385. X   block = 0;
  1386. X   count = 0;
  1387. X
  1388. X/* set command to a meaningless value (hopefully) */
  1389. X
  1390. X   *command = '\0';
  1391. X
  1392. X   do{
  1393. X
  1394. X/* If the user falls asleep stop using CPU cycles */
  1395. X
  1396. X       if(count++ > BLOCKCOUNT)
  1397. X          if(gi->Block)
  1398. X             block = 1;
  1399. X
  1400. X       string[0] = '\0';
  1401. X
  1402. X/* How many events? */
  1403. X
  1404. X       numEvents = XEventsQueued(gi->dpy,QueuedAfterFlush);
  1405. X
  1406. X/* Block to obtain an event yet? */
  1407. X
  1408. X       if((numEvents == 0) && (block)){
  1409. X          XIfEvent(gi->dpy, &event, GI_CheckEvent, NULL);
  1410. X          numEvents = 1;
  1411. X       }else{
  1412. X
  1413. X/* If we have at least one event , fetch the first event off the queue*/
  1414. X
  1415. X          if(numEvents)
  1416. X             XNextEvent(gi->dpy,&event);
  1417. X       }
  1418. X
  1419. X   }while((numEvents == 0) && (gi->Block));
  1420. X
  1421. X/* Process the events we have obtained (if any) */
  1422. X       
  1423. X   while(numEvents){
  1424. X
  1425. X      switch(event.type){
  1426. X
  1427. X         case MotionNotify    : 
  1428. X            if(numEvents == 1){
  1429. X               *pointerX = (int)event.xmotion.x;
  1430. X               *pointerY = (int)event.xmotion.y;
  1431. X            }
  1432. X            break;
  1433. X
  1434. X         case KeyPress        :
  1435. X            if(numEvents == 1){
  1436. X               XLookupString(&event.xkey,string,TMPSTRLEN,NULL,NULL);
  1437. X               *command = string[0];
  1438. X               }
  1439. X            break;
  1440. X
  1441. X         case ConfigureNotify :
  1442. X            if(event.xconfigure.window == gi->win){
  1443. X               gi->winX = event.xconfigure.width;
  1444. X               gi->winY = event.xconfigure.height;
  1445. X               gi->winH = (int)(gi->winX / 2.0); 
  1446. X               gi->winV = (int)(gi->winY / 2.0); 
  1447. X               GI_ResetPurpleRectangle(0, 0, gi->winX, gi->winY, gi);
  1448. X               GI_ResizeFont(gi);
  1449. X               sizehint.flags  = USSize;
  1450. X               sizehint.width  = gi->winX;
  1451. X               sizehint.height = gi->winY;
  1452. X               XSetNormalHints(gi->dpy, gi->win, &sizehint);
  1453. X               }
  1454. X            *same = 0;
  1455. X            break;
  1456. X
  1457. X         case Expose          :
  1458. X            *same = 0;
  1459. X            break;
  1460. X
  1461. X         case ColormapNotify  :
  1462. X
  1463. X            if(event.xcolormap.colormap == gi->colormap){
  1464. X
  1465. X               if(event.xcolormap.state == ColormapInstalled){
  1466. X                  gi->Monochrome = 0;
  1467. X               }else{
  1468. X                  gi->Monochrome = 1; 
  1469. X                  }
  1470. X
  1471. X              *same = 0;
  1472. X              }
  1473. X            break;
  1474. X
  1475. X         default              :
  1476. X            break;
  1477. X         }
  1478. X
  1479. X         numEvents--;
  1480. X
  1481. X         if(numEvents)
  1482. X            XNextEvent(gi->dpy,&event);
  1483. X      }
  1484. X}
  1485. X
  1486. X
  1487. X
  1488. Xvoid GI_UpdatePosition(obj, gi)
  1489. XObjectInfo *obj;
  1490. XGIinfo *gi;
  1491. X/******************************************************************************
  1492. X   Update the scene position information using user input. 
  1493. X
  1494. X   The routine will eventually block waiting for an event if block is True
  1495. X   and the no events of interest show up due to the call to GI_GetInput()
  1496. X******************************************************************************/
  1497. X{
  1498. Xint same, pointerX, pointerY, dx, dy;
  1499. Xchar buffer[128], command;
  1500. Xdouble X, Y, Z;
  1501. X
  1502. X   X = Y = Z = 0.0;
  1503. X
  1504. X   same = 1;
  1505. X      
  1506. X   pointerX = gi->oldPointerX;                             
  1507. X   pointerY = gi->oldPointerY;
  1508. X
  1509. X   while(same) {
  1510. X   
  1511. X/* dx, dy, dz are the amount to step about each axis every frame 
  1512. X   We want the scene to continue to rotate even if the user does
  1513. X   not give any new input */
  1514. X
  1515. X/* Do not forget to put your automatic update variables into this if
  1516. X   statement.  Be careful somehow you can get MANY bugs with these!  */
  1517. X
  1518. X      if((obj->dX) || (obj->dY) || (obj->dZ)){
  1519. X         same = 0;
  1520. X         gi->Block = 0;
  1521. X      }else
  1522. X         gi->Block = 1;
  1523. X/* Get the input */
  1524. X                            
  1525. X      GI_GetInput(&pointerX, &pointerY, &command, &same, gi);
  1526. X
  1527. X/* Fill in code for your favorite keyboard and pointer controls */
  1528. X/* My default controls */
  1529. X
  1530. X/* Note: I do not move the origin which the scene is rotated about around.
  1531. X   You may want to do originX += ???; originY += ???; originZ += ???    */ 
  1532. X
  1533. X      switch(command){
  1534. X         case ' ' : break;
  1535. X         case 'm' : same = 0; gi->Menu    = !gi->Menu; break;
  1536. X         case 'M' : same = 0; gi->Menu    = !gi->Menu; break;
  1537. X         case 'p' : same = 0; gi->Stats   = !gi->Stats; break;
  1538. X         case 'P' : same = 0; gi->Stats   = !gi->Stats; break;
  1539. X         case 's' : same = 0; gi->Stereo  = !gi->Stereo; break;
  1540. X         case 'S' : same = 0; gi->Stereo  = !gi->Stereo; break;
  1541. X         case 'f' : same = 0; gi->Flicker = !gi->Flicker; break;
  1542. X         case 'F' : same = 0; gi->Flicker = !gi->Flicker; break;
  1543. X         case 'r' : same = 0; gi->Relative = !gi->Relative; break;
  1544. X         case 'R' : same = 0; gi->Relative = !gi->Relative; break;
  1545. X         case 'h' : same = 0; obj->translateX  -= (number) 100; break;
  1546. X         case 'j' : same = 0; obj->translateY  -= (number) 100; break;
  1547. X         case 'k' : same = 0; obj->translateY  += (number) 100; break;
  1548. X         case 'l' : same = 0; obj->translateX  += (number) 100; break;
  1549. X         case 'u' : same = 0; obj->translateZ  += (number) 100; break;
  1550. X         case 'i' : same = 0; obj->translateZ  -= (number) 100; break;
  1551. X         case 'H' : same = 0; obj->translateX  -= (number)1500; break;
  1552. X         case 'J' : same = 0; obj->translateY  -= (number)1500; break;
  1553. X         case 'K' : same = 0; obj->translateY  += (number)1500; break;
  1554. X         case 'L' : same = 0; obj->translateX  += (number)1500; break;
  1555. X         case 'U' : same = 0; obj->translateZ  += (number)1500; break;
  1556. X         case 'I' : same = 0; obj->translateZ  -= (number)1500; break;
  1557. X         case '1' : same = 0; obj->dX = -0.09; break;
  1558. X         case '2' : same = 0; obj->dX =  0.0 ; break;
  1559. X         case '3' : same = 0; obj->dX =  0.09; break;
  1560. X         case '4' : same = 0; obj->dY = -0.09; break;
  1561. X         case '5' : same = 0; obj->dY =  0.0 ; break;
  1562. X         case '6' : same = 0; obj->dY =  0.09; break;
  1563. X         case '7' : same = 0; obj->dZ = -0.09; break;
  1564. X         case '8' : same = 0; obj->dZ =  0.0 ; break;
  1565. X         case '9' : same = 0; obj->dZ =  0.09; break;
  1566. X         case 'x' : same = 0; X += 0.03; break;
  1567. X         case 'X' : same = 0; X -= 0.03; break;
  1568. X         case 'y' : same = 0; Y += 0.03; break;
  1569. X         case 'Y' : same = 0; Y -= 0.03; break;
  1570. X         case 'z' : same = 0; Z += 0.03; break;
  1571. X         case 'Z' : same = 0; Z -= 0.03; break;
  1572. X         case 'a' : same = 0; X += 0.05; break;
  1573. X         case 'A' : same = 0; X -= 0.05; break;
  1574. X         case 'b' : same = 0; Y += 0.05; break;
  1575. X         case 'B' : same = 0; Y -= 0.05; break;
  1576. X         case 'c' : same = 0; Z += 0.05; break;
  1577. X         case 'C' : same = 0; Z -= 0.05; break;
  1578. X         case '[' : same = 0;
  1579. X                    obj->focus = obj->focus += 0.1;
  1580. X                    if((obj->focus > 1.8))
  1581. X                       obj->focus = 1.8;
  1582. X                    break;
  1583. X         case ']' : same = 0;
  1584. X                    obj->focus = obj->focus -= 0.1;
  1585. X                    if((obj->focus < -0.8))
  1586. X                       obj->focus = -0.8;
  1587. X                    break;
  1588. X         case '{' : same = 0; obj->BViewpointX -= (number)4; break;
  1589. X         case '}' : same = 0; obj->BViewpointX += (number)4; break;
  1590. X         case 'q' : exit(0);
  1591. X         case 'Q' : exit(0);
  1592. X
  1593. X         default : {
  1594. X
  1595. X/* My pointer movement stuff */
  1596. X
  1597. X/* Only update if the movement was reasonably small */
  1598. X             
  1599. X            dx = pointerX - gi->oldPointerX;
  1600. X            dy = pointerY - gi->oldPointerY;
  1601. X
  1602. X            if((dy * dy <= SMALLMOVEMENT) &&
  1603. X               (dx * dx <= SMALLMOVEMENT)){
  1604. X
  1605. X/* Rotate proportionally with the amount the pointer moved */
  1606. X/* Note: I only control the X and Z axes by the pointer */
  1607. X            
  1608. X               X += (dy * POINTERRATIO);
  1609. X               Z += (dx * POINTERRATIO);
  1610. X               same = 0;
  1611. X               }
  1612. X
  1613. X            gi->oldPointerY = pointerY;
  1614. X            gi->oldPointerX = pointerX;
  1615. X            }
  1616. X         }
  1617. X      }
  1618. X
  1619. X/* Keep angles 0 - 6.28 */
  1620. X
  1621. X   X = fmod(X + obj->dX, TWOPI);
  1622. X   Y = fmod(Y + obj->dY, TWOPI);
  1623. X   Z = fmod(Z + obj->dZ, TWOPI);
  1624. X
  1625. X/* Fix up the angles */
  1626. X
  1627. X   if(gi->Relative){
  1628. X      obj->X = fmod(X + obj->X, TWOPI);
  1629. X      obj->Y = fmod(Y + obj->Y, TWOPI);
  1630. X      obj->Z = fmod(Z + obj->Z, TWOPI);
  1631. X   }else{
  1632. X      GI_CalculateAngles(&(obj->X), &(obj->Y), &(obj->Z), X, Y, Z);
  1633. X      }
  1634. X
  1635. X   gi->cursorX = (number)0;
  1636. X   gi->cursorY = (number)0;
  1637. X
  1638. X/* Display our stats? */
  1639. X
  1640. X   if(gi->Stats){
  1641. X      sprintf(buffer, "OX %6d  OY %6d  OZ %6d  X %3d  Y %3d  Z %3d", 
  1642. X         (int)-obj->translateX, (int)obj->translateY,
  1643. X         -(int)obj->translateZ, (int)(obj->X * 57.32),
  1644. X          (int)(obj->Y * 57.32), (int)(obj->Z * 57.32));
  1645. X   
  1646. X      GI_PrintString(buffer, gi);
  1647. X      }
  1648. X
  1649. X/* Display Menu? */
  1650. X
  1651. X   if(gi->Menu)
  1652. X      GI_DisplayMenu(gi);
  1653. X}
  1654. X
  1655. X
  1656. X
  1657. Xvoid GI_PrintError(errString)
  1658. Xchar *errString;
  1659. X/******************************************************************************
  1660. X   Write the string errString onto stderr, then write the last error message
  1661. X   produced by the GI layer onto stderr as well.
  1662. X
  1663. X   Returns: no return value.
  1664. X******************************************************************************/
  1665. X{
  1666. X/* List of strings for error reporting */
  1667. X
  1668. Xstatic char *ErrMsgList[] = {
  1669. X   "No error",                                           /* errno =  0 */
  1670. X   "Unable to connect with server",                      /* errno = -1 */
  1671. X   "Unable to create window",                            /* errno = -2 */
  1672. X   "Unable to create gc",                                /* errno = -2 */
  1673. X   "Unable to create colormap",                          /* errno = -3 */
  1674. X   "Unknown error code"                                  /* last errno */
  1675. X};
  1676. X
  1677. X/* Instead of doing a switch on all the error codes we set up our array of
  1678. X   strings so that GIerrno corresponds to ErrMsgList[-GIerrno] */
  1679. X
  1680. X/* Prints errString given by user, and then the error message
  1681. X   corresponding to the currently set GIerrno */
  1682. X
  1683. X   if(errString)
  1684. X      fprintf(stderr, "%s ", errString);
  1685. X
  1686. X   if((GIerrno > GIE_LASTERRNO) && (GIerrno <= 0))
  1687. X      fprintf(stderr, "%s\n", ErrMsgList[-GIerrno]);
  1688. X   else
  1689. X      fprintf(stderr, "%s %d ***\n", ErrMsgList[-(GIE_LASTERRNO)], GIerrno);
  1690. X
  1691. X   fflush(stderr);
  1692. X
  1693. X} /* GI_PrintError() */
  1694. END_OF_FILE
  1695. if test 39449 -ne `wc -c <'gi.c'`; then
  1696.     echo shar: \"'gi.c'\" unpacked with wrong size!
  1697. fi
  1698. # end of 'gi.c'
  1699. fi
  1700. echo shar: End of archive 2 \(of 6\).
  1701. cp /dev/null ark2isdone
  1702. MISSING=""
  1703. for I in 1 2 3 4 5 6 ; do
  1704.     if test ! -f ark${I}isdone ; then
  1705.     MISSING="${MISSING} ${I}"
  1706.     fi
  1707. done
  1708. if test "${MISSING}" = "" ; then
  1709.     echo You have unpacked all 6 archives.
  1710.     rm -f ark[1-9]isdone
  1711. else
  1712.     echo You still need to unpack the following archives:
  1713.     echo "        " ${MISSING}
  1714. fi
  1715. ##  End of shell archive.
  1716. exit 0
  1717. -- 
  1718. Molecular Simulations, Inc.             mail: dcmartin@msi.com
  1719. 796 N. Pastoria Avenue                  uucp: uunet!dcmartin
  1720. Sunnyvale, California 94086             at&t: 408/522-9236
  1721.