home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume19 / xspringies / part15 < prev    next >
Text File  |  1993-04-28  |  43KB  |  1,419 lines

  1. Newsgroups: comp.sources.x
  2. From: dmd@gradient.cis.upenn.edu (Douglas DeCarlo)
  3. Subject: v19i067:  xspringies - it's a spring simulator...no, it's a game, Part15/16
  4. Message-ID: <1993Mar26.161429.10523@sparky.imd.sterling.com>
  5. X-Md4-Signature: cbc236e059bfcffcc03e93c3e70c0ed3
  6. Date: Fri, 26 Mar 1993 16:14:29 GMT
  7. Approved: chris@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dmd@gradient.cis.upenn.edu (Douglas DeCarlo)
  10. Posting-number: Volume 19, Issue 67
  11. Archive-name: xspringies/part15
  12. Environment: X11
  13. Supersedes: xspringies: Volume 14, Issue 25-30
  14.  
  15. #!/bin/sh
  16. # to extract, remove the header and type "sh filename"
  17. if `test ! -s ./Imakefile`
  18. then
  19. echo "writting ./Imakefile"
  20. cat > ./Imakefile << '\BARFOO\'
  21. # Imakefile for XSpringies
  22.  
  23. SRCS = xdisp.c misc.c keypress.c widget.c obj.c file.c phys.c
  24. OBJS = xdisp.o misc.o keypress.o widget.o obj.o file.o phys.o
  25.  
  26. DEPLIBS =
  27. LOCAL_LIBRARIES = $(XLIB)
  28. SYS_LIBRARIES = -lm
  29.  
  30. # Because the X consortium people are dip-heads
  31. MKDIRHIER = BourneShell `which mkdirhier`
  32.  
  33. # Destination directory for xspringies demo files, executable and manpage
  34. # (Change this to where you want files installed)
  35. DDIR = /usr/games/
  36.  
  37. XSPDIR = $(DDIR)lib/xspringies
  38. BINDIR = $(DDIR)bin
  39. MANDIR = $(DDIR)man/manx
  40.  
  41. DEFINES = -DDEF_PATH=\"$(XSPDIR)/\"
  42.  
  43. MakeDirectories(install, $(XSPDIR))
  44. MakeDirectories(install, $(BINDIR))
  45. MakeDirectories(install, $(MANDIR))
  46.  
  47. ComplexProgramTarget(xspringies)
  48.  
  49. install:: install.man install.lib
  50.  
  51. # I hate imake
  52. XSPLIB = lib/
  53.  
  54. install.lib:
  55.     /bin/cp $(XSPLIB)* $(XSPDIR)
  56. \BARFOO\
  57. else
  58.   echo "will not over write ./Imakefile"
  59. fi
  60. if `test ! -s ./Makefile.std`
  61. then
  62. echo "writting ./Makefile.std"
  63. cat > ./Makefile.std << '\BARFOO\'
  64. # Default Makefile for XSpringies
  65.  
  66. OBJS = xdisp.o misc.o keypress.o widget.o obj.o file.o phys.o
  67. SRCS = xdisp.c misc.c keypress.c widget.c obj.c file.c phys.c
  68.  
  69. DDIR = /usr/games/
  70.  
  71. XSPDIR = $(DDIR)lib/xspringies
  72. BINDIR = $(DDIR)bin
  73. MANDIR = $(DDIR)man/manx
  74.  
  75. LIBS = -lm -lX11
  76. CFLAGS = -O -DDEF_PATH=\"$(XSPDIR)/\"
  77.  
  78. xspringies: $(OBJS)
  79.     $(CC) $(CFLAGS) -o xspringies $(OBJS) $(LIBS)
  80.  
  81. $(OBJS): defs.h
  82. file.o xdisp.o obj.o phys.o: obj.h
  83. xdisp.o: bitmap.h title.h bfbm.h
  84.  
  85. install:: xspringies
  86.     -@mkdirhier $(BINDIR)
  87.     install -c -s xspringies $(BINDIR)
  88.     -@mkdirhier $(MANDIR)
  89.     install -c xspringies.man $(MANDIR)
  90.  
  91. install::
  92.     -@mkdirhier $(XSPDIR)
  93.     /bin/cp lib/* $(XSPDIR)
  94.  
  95. clean:
  96.     rm -f $(OBJS) xspringies
  97. \BARFOO\
  98. else
  99.   echo "will not over write ./Makefile.std"
  100. fi
  101. if `test ! -s ./README`
  102. then
  103. echo "writting ./README"
  104. cat > ./README << '\BARFOO\'
  105. README file for XSpringies 1.1                                    March 1, 1993
  106. ==============================
  107.  
  108. General info:
  109. -------------
  110.   XSpringies is a mass and spring simulation system.  It's intended use is more
  111. like that of a game, than some design package.
  112.  
  113.   It's written using Xlib only.  No Motif or any other widgets sets are used.
  114.  
  115.   The animation in XSpringies is done using an off-screen Pixmap.  The next
  116. frame is drawn on this pixmap, then is blitted onto the screen.  Since the
  117. frame rate is about 30 frames per second, slower machines (or machines which
  118. have poorly written bit-blitting code) will be deathly slow and blinky.
  119.  
  120. Installation info:
  121. ------------------
  122. First, edit the Imakefile/Makefile.std and change the value of DDIR to reflect
  123. where you want to install the xspringies files.  Don't forget the trailing /
  124. on the end of your filename.
  125.  
  126. If you are using the Imakefile, type "xmkmf".
  127.  
  128.     If you have problems at the beginning, and you are using the
  129.     Imakefile, it might be caused by the strange definition I have for
  130.     "MKDIRHIER", which I had to redefine because of the silly way Imake
  131.     is set up.  If this happens, type "which mkdirhier" to see what the
  132.     full path for mkdirhier is, and put this in place of the backquoted
  133.     expression in the Imakefile. (i.e. - if the full path is
  134.     "/usr/local/bin/mkdirhier", then you change the line to
  135.     "MKDIRHIER = BourneShell /usr/local/bin/mkdirhier").
  136.  
  137. Then, type "make install".
  138.  
  139. Then, just run xspringies and have fun.
  140.  
  141. Updates
  142. -------
  143. For version 1.1:
  144.  Bugs fixed:
  145.  - Compiles for NEWS system
  146.  - Keyboard input now works under openlook window manager
  147.  - Animation no longer gets 'stuck' after like 35 minutes
  148.  - File format is more compact by removing unnecessary zeros
  149.    (i.e. - before 1.500000, now 1.5) and has more precision to eliminate
  150.    tiny errors perceived when saving and reloading a file
  151.  - Strange ~-expansion behavior for filenames is gone
  152.  - The GO! button replaces the hard to find Action checkbox
  153.  - A Delete button was added, which is the same as the Delete key
  154.  
  155.  New features:
  156.  - Spring thickness can be specified using the "-st <number>" command
  157.    line switch (0 is default width - thin line)
  158.  - Instead of the entire screen being bit-blitted, only the bounding box
  159.    necessary to draw new objects and cover old objects is drawn.  This
  160.    greatly speeds up the animation when drawing small objects (such as
  161.    a "jello").  If the bounding box changes size periodically (as in the
  162.    "pendbees" file), the "-nbb" command line switch disables this feature
  163.    to allow for slower, but smoother animation.
  164.  - A cursor, and filename editing features were added.  It uses emacs-like
  165.    keys:
  166.       ^B/^F = back/forward
  167.       ^A/^E = goto beginning/end of line
  168.       ^K/^Y = kill to end of line/yank from kill buffer
  169.       ^D    = delete character under cursor
  170.       ^U    = kill all input
  171.       ^T    = transpose character under cursor with previous character
  172.       ESC   = exit from filename edit mode
  173.  
  174. Misc info:
  175. ----------
  176.   The author of xspringies is Douglas DeCarlo.
  177.   Email address:  dmd@gradient.cis.upenn.edu
  178.   Please send any bug-reports/comments/suggestions/demo-files to this address.
  179. \BARFOO\
  180. else
  181.   echo "will not over write ./README"
  182. fi
  183. if `test ! -s ./bfbm.h`
  184. then
  185. echo "writting ./bfbm.h"
  186. cat > ./bfbm.h << '\BARFOO\'
  187. #define BF_SIZ    24
  188.  
  189. static char b_bits[][BF_SIZ*BF_SIZ/8] = {
  190.     {
  191.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00,
  192.     0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
  193.     0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00,
  194.     0x00, 0x04, 0x00, 0x00, 0x04, 0x1e, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11,
  195.     0x00, 0x04, 0x11, 0x00, 0x04, 0x1e, 0x00, 0x04, 0x10, 0x80, 0x24, 0x10,
  196.     0x80, 0x35, 0x11, 0x00, 0x1f, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x00
  197.     }, {
  198.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x30, 0x00, 0x03,
  199.     0x98, 0x89, 0x06, 0x48, 0xda, 0x04, 0x48, 0xa8, 0x04, 0x48, 0x8a, 0x04,
  200.     0x98, 0x89, 0x06, 0x30, 0x00, 0x03, 0xe0, 0xff, 0x01, 0x00, 0x00, 0x00,
  201.     0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x04,
  202.     0x00, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x80, 0x07, 0x00, 0x00, 0x30,
  203.     0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00
  204.     }, {
  205.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
  206.     0x00, 0x10, 0x00, 0x00, 0x54, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x38, 0x00,
  207.     0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x38, 0x0c, 0xc0, 0x7c, 0x06,
  208.     0xfc, 0x7d, 0xff, 0xc0, 0x7c, 0x06, 0x60, 0x38, 0x0c, 0x00, 0x00, 0x00,
  209.     0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x54, 0x00,
  210.     0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00
  211.     }, {
  212.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x92,
  213.     0x00, 0x00, 0x26, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x92, 0x00, 0x00, 0x26,
  214.     0x1c, 0x22, 0x4a, 0x3e, 0x41, 0x92, 0xbe, 0xff, 0x26, 0x3e, 0x41, 0x4a,
  215.     0x1c, 0x22, 0x92, 0x00, 0x00, 0x26, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x92,
  216.     0x00, 0x00, 0x26, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x92, 0x00, 0x00, 0x26,
  217.     0x00, 0x00, 0x4a, 0x00, 0x00, 0x92, 0x00, 0x00, 0x26, 0x00, 0x00, 0x4a
  218.     }
  219. };
  220. \BARFOO\
  221. else
  222.   echo "will not over write ./bfbm.h"
  223. fi
  224. if `test ! -s ./bitmap.h`
  225. then
  226. echo "writting ./bitmap.h"
  227. cat > ./bitmap.h << '\BARFOO\'
  228. #define edit_width 32
  229. #define edit_height 32
  230. static char edit_bits[] = {
  231.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  232.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  233.    0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00,
  234.    0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00,
  235.    0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x80, 0x7f, 0xff, 0x00,
  236.    0x80, 0x00, 0x80, 0x00, 0x80, 0x7f, 0xff, 0x00, 0x00, 0x40, 0x01, 0x00,
  237.    0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00,
  238.    0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
  239.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  240.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  241.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  242.  
  243. #define mass_width 32
  244. #define mass_height 32
  245. static char mass_bits[] = {
  246.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  247.    0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0xf8, 0x3f, 0x00,
  248.    0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x03,
  249.    0xc0, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x07, 0xe0, 0xff, 0xff, 0x0f,
  250.    0xe0, 0xff, 0xff, 0x0f, 0xf0, 0x17, 0xe1, 0x1f, 0xf0, 0xe7, 0xde, 0x1f,
  251.    0xf0, 0xf7, 0xde, 0x1f, 0xf0, 0xf7, 0xde, 0x1f, 0xf0, 0xf7, 0xde, 0x1f,
  252.    0xf0, 0xf7, 0xde, 0x1f, 0xf0, 0xf7, 0xde, 0x1f, 0xe0, 0xff, 0xff, 0x0f,
  253.    0xe0, 0xff, 0xff, 0x0f, 0xc0, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x07,
  254.    0x80, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00,
  255.    0x00, 0xf8, 0x3f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
  256.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  257.  
  258. #define spring_width 32
  259. #define spring_height 32
  260. static char spring_bits[] = {
  261.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
  262.    0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42,
  263.    0x00, 0x00, 0x1c, 0x24, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x47, 0x01,
  264.    0x00, 0x80, 0x8a, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x22, 0x00,
  265.    0x00, 0x70, 0x44, 0x00, 0x00, 0xa8, 0x88, 0x00, 0x00, 0x24, 0x91, 0x00,
  266.    0x00, 0x24, 0x62, 0x00, 0x00, 0x47, 0x04, 0x00, 0x80, 0x8a, 0x08, 0x00,
  267.    0x40, 0x12, 0x09, 0x00, 0x40, 0x22, 0x06, 0x00, 0x40, 0x44, 0x00, 0x00,
  268.    0x80, 0x88, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00,
  269.    0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
  270.    0x84, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
  271.    0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  272.  
  273. #define go_width 58
  274. #define go_height 24
  275. static char go_bits[] = {
  276.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  277.    0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  278.    0x00, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00,
  279.    0x00, 0x00, 0x18, 0x00, 0x80, 0x8f, 0x1f, 0x80, 0x0f, 0x00, 0x3c, 0x00,
  280.    0x80, 0x07, 0x1e, 0xe0, 0x3f, 0x00, 0x7e, 0x00, 0xc0, 0x03, 0x1c, 0xf0,
  281.    0x7f, 0x00, 0x7e, 0x00, 0xc0, 0x01, 0x00, 0xf8, 0xfc, 0x00, 0x7e, 0x00,
  282.    0xe0, 0x01, 0x00, 0x3c, 0xf0, 0x00, 0x3f, 0x00, 0xe0, 0x80, 0x03, 0x1c,
  283.    0xe0, 0x01, 0x3f, 0x00, 0xe0, 0x80, 0x0f, 0x1e, 0xe0, 0x01, 0x3f, 0x00,
  284.    0xe0, 0x81, 0x3f, 0x0e, 0xc0, 0x01, 0x1f, 0x00, 0xc0, 0x01, 0x7f, 0x0e,
  285.    0xc0, 0x81, 0x0f, 0x00, 0xc0, 0x03, 0x7c, 0x1e, 0xc0, 0x81, 0x07, 0x00,
  286.    0x80, 0x03, 0x0e, 0x1c, 0xe0, 0xc1, 0x03, 0x00, 0x80, 0x8f, 0x0f, 0x3c,
  287.    0xe0, 0x80, 0x03, 0x00, 0x00, 0xff, 0x07, 0x38, 0x70, 0x00, 0x01, 0x00,
  288.    0x00, 0xfe, 0x03, 0xf8, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xf0,
  289.    0x3f, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0xf8, 0x00, 0x00,
  290.    0x00, 0x00, 0x00, 0x80, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  291.    0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00};
  292. \BARFOO\
  293. else
  294.   echo "will not over write ./bitmap.h"
  295. fi
  296. if `test ! -s ./defs.h`
  297. then
  298. echo "writting ./defs.h"
  299. cat > ./defs.h << '\BARFOO\'
  300. #include <stdio.h>
  301. #include <math.h>
  302.  
  303. typedef char boolean;
  304.  
  305. #define TRUE            1
  306. #define FALSE           0
  307.  
  308. /* Window size info */
  309. #define D_WID    640
  310. #define D_HT    548
  311. #define B_WID    200
  312. #define T_WID    D_WID
  313. #define T_HT    (F_HT + 4)
  314. #define B_HT    (D_HT + T_HT + 1)
  315. #define M_WID    (B_WID + D_WID + 1)
  316. #define M_HT    B_HT
  317.  
  318. #define COORD_X(x)    (x)
  319. #define COORD_Y(y)    (draw_ht - (y))
  320. #define COORD_DX(dx)    (dx)
  321. #define COORD_DY(dy)    (-(dy))
  322.  
  323. /* Font size info */
  324. #define F_NAME    "6x10"
  325. #define F_WID    6
  326. #define F_HT    10
  327.  
  328. /* File operations */
  329. #define F_NONE        0
  330. #define F_LOAD        1
  331. #define F_SAVE        2
  332. #define F_INSERT    3
  333.  
  334. /* Longest filename */
  335. #define MAXPATH        256
  336.  
  337. #define SQR(x)          ((x) * (x))
  338. #define SGN(x)          ((x) < 0 ? (-1) : 1)
  339. #ifndef ABS
  340. #define ABS(x)          ((x) < 0 ? (-(x)) : (x))
  341. #endif
  342. #ifndef MIN
  343. #define MIN(x,y)        ((x) < (y) ? (x) : (y))
  344. #define MAX(x,y)        ((x) < (y) ? (y) : (x))
  345. #endif
  346.  
  347. /* Key codes used */
  348. #define K_DELETE    (-1)
  349. #define K_RETURN    (-2)
  350. #define K_ESCAPE    (-3)
  351.  
  352. /* Types of widgets */
  353. #define O_NOTHING    (-1)
  354. #define O_ACTING    0
  355. #define O_BUTTON    1
  356. #define O_SLIDER    2
  357. #define O_CHECKBOX    3
  358. #define O_MBUTTON    4
  359. #define O_LSLIDER    5
  360. #define O_RSLIDER    6
  361. #define O_TSLIDER    7
  362.  
  363. /* Types of mouse actions */
  364. #define M_DOWN        0
  365. #define M_UP        1
  366. #define M_DRAG        2
  367. #define M_HOLD        3
  368. #define M_REDISPLAY    4
  369.  
  370. /* Forces */
  371. #define FR_GRAV        0
  372. #define FR_CMASS    1
  373. #define FR_PTATTRACT    2
  374. #define FR_WALL        3
  375.  
  376. #define BF_NUM        4
  377.  
  378. /* Defaults */
  379. #define DEF_TSTEP    0.025
  380.  
  381. typedef struct {
  382.     double cur_mass, cur_rest;
  383.     double cur_ks, cur_kd;
  384.     boolean fix_mass, show_spring;
  385.     int center_id;
  386.     int bf_mode[BF_NUM];
  387.     double cur_grav_val[BF_NUM];
  388.     double cur_misc_val[BF_NUM];
  389.     double cur_visc, cur_stick;
  390.     double cur_dt, cur_prec;
  391.     boolean adaptive_step, grid_snap;
  392.     double cur_gsnap;
  393.     boolean w_top, w_left, w_right, w_bottom;
  394. } t_state;
  395.  
  396. /* -------- Functions/variables defined --------- */
  397.  
  398. /* widget.c */
  399. extern boolean scan_flag, key_widgets(), check_widgets();
  400. extern void init_widgets(), add_button(), add_modebutton(), add_checkbox(), add_slider(), redraw_widgets();
  401. extern void update_slider(), activate_mbutton();
  402. extern int slider_valno();
  403.  
  404. /* xdisp.c */
  405. extern int main_wid, main_ht, draw_wid, draw_ht;
  406. extern char filename[];
  407. extern int cursor_pos, spthick;
  408. extern int file_op, mass_radius();
  409. extern void fatal(), disp_filename(), redraw_system(), review_system();
  410. extern t_state mst;
  411.  
  412. /* keypress.c */
  413. extern void key_press();
  414.  
  415. /* misc.c */
  416. extern char *xmalloc(), *xrealloc();
  417.  
  418. /* obj.c */
  419. extern void init_objects(), delete_mass(), delete_spring(), delete_selected(), add_massparent(), del_massparent();
  420. extern void select_object(), select_objects(), unselect_all(), select_all(), translate_selobj(), set_center();
  421. extern boolean anything_selected();
  422. extern int create_mass(), create_spring(), nearest_object();
  423.  
  424. /* phys.c */
  425. extern boolean animate_obj();
  426. \BARFOO\
  427. else
  428.   echo "will not over write ./defs.h"
  429. fi
  430. if `test ! -s ./file.c`
  431. then
  432. echo "writting ./file.c"
  433. cat > ./file.c << '\BARFOO\'
  434. /* file.c -- file loading and saving for xspringies
  435.  * Copyright (C) 1991,1992  Douglas M. DeCarlo
  436.  *
  437.  * This file is part of XSpringies, a mass and spring simulation system for X
  438.  *
  439.  * XSpringies is free software; you can redistribute it and/or modify
  440.  * it under the terms of the GNU General Public License as published by
  441.  * the Free Software Foundation; either version 1, or (at your option)
  442.  * any later version.
  443.  *
  444.  * XSpringies is distributed in the hope that it will be useful,
  445.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  446.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  447.  * GNU General Public License for more details.
  448.  * 
  449.  * You should have received a copy of the GNU General Public License
  450.  * along with XSpringies; see the file COPYING.  If not, write to
  451.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  452.  *
  453.  */
  454.  
  455. #include "defs.h"
  456. #include "obj.h"
  457. #include <pwd.h>
  458.  
  459. #define USERNAMELEN    8
  460. #define MAGIC_CMD    "#1.0"
  461. #define FILE_EXT    ".xsp"
  462.  
  463. /* tilde_expand: expand ~/.. and ~bar/.. in filenames and put
  464.    the result in filename
  465.    filename is assumed to be null terminated, and after the
  466.    expansion will not exceed MAXPATH in length
  467.  
  468.    tilde_expand returns its argument, or NULL if the user
  469.    is unknown
  470.    */
  471. char *tilde_expand(fname)
  472. char *fname;
  473. {
  474.     register int prelen, len, restlen, i;
  475.     register char *prefix, *s, *u;
  476.     struct passwd *pw;
  477.     char user[USERNAMELEN+1];
  478.     extern char *getenv();
  479.  
  480.     if (*fname == '~') {
  481.     if (*(fname + 1) == '/' || !*(fname + 1)) {
  482.         len = 1;
  483.         /* Do ~/ expansion */
  484.         if ((prefix = getenv("HOME")) == NULL) {
  485.         /* Use . as home directory if HOME not set */
  486.         prefix = ".";
  487.         }
  488.     } else {
  489.         /* Do ~user/ expansion */
  490.         for (len = 1, s = fname + 1, u = user; len <= USERNAMELEN && *s && *s != '/'; *u++ = *s++, len++);
  491.         *u = '\0';
  492.  
  493.         /* Get name */
  494.         if ((pw = getpwnam(user)) == NULL)
  495.           return NULL;
  496.         prefix = pw->pw_dir;
  497.     }
  498.  
  499.     prelen = strlen(prefix);
  500.     restlen = strlen(fname + len);
  501.  
  502.     /* Move over pathname */
  503.     if (prelen < len) {
  504.         for (i = 0; i <= restlen; i++) {
  505.         fname[prelen+i] = fname[len+i];
  506.         }
  507.     } else {
  508.         for (i = restlen; i >= 0; i--) {
  509.         fname[prelen+i] = fname[len+i];
  510.         }
  511.     }
  512.     /* Copy in prefix */
  513.     (void)memcpy(fname, prefix, prelen);
  514.     }
  515.  
  516.     return fname;
  517. }
  518.  
  519. void skip_to_eol(f)
  520. FILE *f;
  521. {
  522.     int ch;
  523.  
  524.     while ((ch = fgetc(f)) != EOF && ch != '\n');
  525. }
  526.  
  527. char *extend_file(file)
  528. char *file;
  529. {
  530.     static char buf[MAXPATH];
  531.     int len, felen;
  532.  
  533.     strcpy(buf, file);
  534.  
  535.     felen = strlen(FILE_EXT);
  536.     len = strlen(buf);
  537.     
  538.     if (len < felen || strcmp(buf + len - felen, FILE_EXT)) {
  539.     strcat(buf, FILE_EXT);
  540.     }
  541.  
  542.     return buf;
  543. }
  544.  
  545. #define IS_CMD(s)    (!strncmp(cmd, s, 4))
  546.         
  547. boolean file_command(file, command)
  548. char *file;
  549. int command;
  550. {
  551.     FILE *f;
  552.     char cmd[5];
  553.     int i, which, spring_start, temp;
  554.     int *mapfrom, *mapto, num_map, num_map_alloc;
  555.     boolean selectnew = FALSE;
  556.  
  557.     if (strlen(file) == 0)
  558.       return FALSE;
  559.  
  560.     tilde_expand(file);
  561.  
  562.     switch (command) {
  563.       case F_INSERT:
  564.       case F_LOAD:    
  565.     if ((f = fopen(extend_file(file), "r")) == NULL) {
  566.         return FALSE;
  567.     }
  568.  
  569.     /* Check first line */
  570.     if (fgets(cmd, 5, f) != NULL && IS_CMD(MAGIC_CMD)) {
  571.         skip_to_eol(f);
  572.  
  573.         if (command == F_LOAD) {
  574.         delete_all();
  575.         init_objects();
  576.         } else {
  577.         if (!anything_selected())
  578.           selectnew = TRUE;
  579.         }
  580.         spring_start = num_spring;
  581.  
  582.         num_map = 0;
  583.         num_map_alloc = ALLOC_SIZE;
  584.         mapfrom = (int *)xmalloc(sizeof(int) * num_map_alloc);
  585.         mapto = (int *)xmalloc(sizeof(int) * num_map_alloc);
  586.  
  587.         while (fgets(cmd, 5, f) != NULL) {
  588.         if (IS_CMD("mass")) {
  589.             if (num_map >= num_map_alloc) {
  590.             num_map_alloc += ALLOC_SIZE;
  591.             mapfrom = (int *)xrealloc(mapfrom, sizeof(int) * num_map_alloc);
  592.             mapto = (int *)xrealloc(mapto, sizeof(int) * num_map_alloc);
  593.             }
  594.             
  595.             which = create_mass();
  596.             mapto[num_map] = which;
  597.             fscanf(f, "%d %lf %lf %lf %lf %lf %lf\n", &mapfrom[num_map], &masses[which].x, &masses[which].y,
  598.                &masses[which].vx, &masses[which].vy, &masses[which].mass, &masses[which].elastic);
  599.             num_map++;
  600.             if (masses[which].mass < 0) {
  601.             masses[which].mass = -masses[which].mass;
  602.             masses[which].status |= S_FIXED;
  603.             }
  604.             masses[which].radius = mass_radius(masses[which].mass);
  605.             if (selectnew) {
  606.             select_object(which, TRUE, FALSE);
  607.             }
  608.         } else if (IS_CMD("spng")) {
  609.             int bogus;
  610.             
  611.             which = create_spring();
  612.             fscanf(f, "%d %d %d %lf %lf %lf\n", &bogus, &springs[which].m1, &springs[which].m2,
  613.                &springs[which].ks, &springs[which].kd, &springs[which].restlen);
  614.             if (selectnew) {
  615.             select_object(which, FALSE, FALSE);
  616.             }
  617.  
  618.         } else if (command == F_INSERT) {
  619.             /* skip non mass/spring commands if in insert mode */
  620.         } else if (IS_CMD("cmas")) {
  621.             fscanf(f, "%lf\n", &(mst.cur_mass));
  622.         } else if (IS_CMD("elas")) {
  623.             fscanf(f, "%lf\n", &(mst.cur_rest));
  624.         } else if (IS_CMD("kspr")) {
  625.             fscanf(f, "%lf\n", &(mst.cur_ks));
  626.         } else if (IS_CMD("kdmp")) {
  627.             fscanf(f, "%lf\n", &(mst.cur_kd));
  628.         } else if (IS_CMD("fixm")) {
  629.             fscanf(f, "%d\n", &temp);
  630.             mst.fix_mass = temp ? TRUE : FALSE;
  631.         } else if (IS_CMD("shws")) {
  632.             fscanf(f, "%d\n", &temp);
  633.             mst.show_spring = temp ? TRUE : FALSE;
  634.         } else if (IS_CMD("cent")) {
  635.             fscanf(f, "%d\n", &(mst.center_id));
  636.  
  637.         } else if (IS_CMD("frce")) {
  638.             int which, temp;
  639.             
  640.             fscanf(f, "%d", &which);
  641.             if (which >= 0 && which < BF_NUM) {
  642.             fscanf(f, "%d %lf %lf\n", &temp, &(mst.cur_grav_val[which]), &(mst.cur_misc_val[which]));
  643.             
  644.             activate_mbutton(&(mst.bf_mode[which]), temp);
  645.             }
  646.         } else if (IS_CMD("visc")) {
  647.             fscanf(f, "%lf\n", &(mst.cur_visc));
  648.         } else if (IS_CMD("stck")) {
  649.             fscanf(f, "%lf\n", &(mst.cur_stick));
  650.         } else if (IS_CMD("step")) {
  651.             fscanf(f, "%lf\n", &(mst.cur_dt));
  652.         } else if (IS_CMD("prec")) {
  653.             fscanf(f, "%lf\n", &(mst.cur_prec));
  654.         } else if (IS_CMD("adpt")) {
  655.             fscanf(f, "%d\n", &temp);
  656.             mst.adaptive_step = temp ? TRUE : FALSE;
  657.  
  658.         } else if (IS_CMD("gsnp")) {
  659.             fscanf(f, "%lf %d\n", &(mst.cur_gsnap), &temp);
  660.             mst.grid_snap = temp ? TRUE : FALSE;
  661.         } else if (IS_CMD("wall")) {
  662.             int wt, wl, wr, wb;
  663.             fscanf(f, "%d %d %d %d\n", &wt, &wl, &wr, &wb);
  664.             mst.w_top = (boolean)wt;
  665.             mst.w_left = (boolean)wl;
  666.             mst.w_right = (boolean)wr;
  667.             mst.w_bottom = (boolean)wb;
  668.         } else {
  669.             /* unknown command */
  670.             fprintf(stderr, "Unknown command: %4.4s\n", cmd);
  671.             skip_to_eol(f);
  672.         }
  673.         }
  674.  
  675.         /* Connect springs to masses */
  676.         for (i = spring_start; i < num_spring; i++) {
  677.         int j;
  678.         boolean m1done, m2done;
  679.  
  680.         m1done = m2done = FALSE;
  681.  
  682.         if (i == fake_spring)
  683.           continue;
  684.  
  685.         for (j = 0; (!m1done || !m2done) && j < num_map; j++) {
  686.             if (!m1done && springs[i].m1 == mapfrom[j]) {
  687.             springs[i].m1 = mapto[j];
  688.             m1done = TRUE;
  689.             }
  690.             if (!m2done && springs[i].m2 == mapfrom[j]) {
  691.             springs[i].m2 = mapto[j];
  692.             m2done = TRUE;
  693.             }
  694.         }
  695.         if (!m1done && !m2done) {
  696.             /* delete spring */
  697.             delete_spring(i);
  698.             fprintf(stderr, "Spring %d not connected to existing mass\n", i);
  699.         }
  700.         }
  701.  
  702.         free(mapfrom);
  703.         free(mapto);
  704.         reconnect_masses();
  705.         review_system(TRUE);
  706.         redisplay_widgets();
  707.     } else {
  708.         return FALSE;
  709.     }
  710.     
  711.     (void)fclose(f);
  712.  
  713.     break;
  714.       case F_SAVE:
  715.     if ((f = fopen(extend_file(file), "w")) == NULL) {
  716.         return FALSE;
  717.     }
  718.     fprintf(f, "%s *** XSpringies data file\n", MAGIC_CMD);
  719.     /* Settings */
  720.     fprintf(f, "cmas %.12lg\n", mst.cur_mass);
  721.     fprintf(f, "elas %.12lg\n", mst.cur_rest);
  722.     fprintf(f, "kspr %.12lg\n", mst.cur_ks);
  723.     fprintf(f, "kdmp %.12lg\n", mst.cur_kd);
  724.     fprintf(f, "fixm %d\n", mst.fix_mass);
  725.     fprintf(f, "shws %d\n", mst.show_spring);
  726.     fprintf(f, "cent %d\n", mst.center_id);
  727.  
  728.     for (i = 0; i < BF_NUM; i++)
  729.       fprintf(f, "frce %d %d %.12lg %.12lg\n", i, (mst.bf_mode[i] >= 0) ? 1 : 0, mst.cur_grav_val[i], mst.cur_misc_val[i]);
  730.  
  731.     fprintf(f, "visc %.12lg\n", mst.cur_visc);
  732.     fprintf(f, "stck %.12lg\n", mst.cur_stick);
  733.     fprintf(f, "step %.12lg\n", mst.cur_dt);
  734.     fprintf(f, "prec %.12lg\n", mst.cur_prec);
  735.     fprintf(f, "adpt %d\n", mst.adaptive_step);
  736.  
  737.     fprintf(f, "gsnp %.12lg %d\n", mst.cur_gsnap, mst.grid_snap);
  738.     fprintf(f, "wall %d %d %d %d\n", (int)mst.w_top, (int)mst.w_left, (int)mst.w_right, (int)mst.w_bottom);
  739.  
  740.     /* Masses and springs */
  741.     for (i = 0; i < num_mass; i++) {
  742.         if (masses[i].status & S_ALIVE) {
  743.         fprintf(f, "mass %d %.18lg %.18lg %.12lg %.12lg %.8lg %.8lg\n", i, masses[i].x, masses[i].y, masses[i].vx, masses[i].vy,
  744.                (masses[i].status & S_FIXED) ? -masses[i].mass : masses[i].mass, masses[i].elastic);
  745.         }
  746.     }
  747.     for (i = 0; i < num_spring; i++) {
  748.         if (springs[i].status & S_ALIVE) {
  749.         fprintf(f, "spng %d %d %d %.8lg %.8lg %.18lg\n", i, springs[i].m1, springs[i].m2,
  750.             springs[i].ks, springs[i].kd, springs[i].restlen);
  751.         }
  752.     }
  753.  
  754.     if (fclose(f) == EOF)
  755.       return FALSE;
  756.     break;
  757.     }
  758.  
  759.     return TRUE;
  760. }
  761. \BARFOO\
  762. else
  763.   echo "will not over write ./file.c"
  764. fi
  765. if `test ! -s ./keypress.c`
  766. then
  767. echo "writting ./keypress.c"
  768. cat > ./keypress.c << '\BARFOO\'
  769. /* keypress.c -- keyboard input support for xspringies
  770.  * Copyright (C) 1991,1992  Douglas M. DeCarlo
  771.  *
  772.  * This file is part of XSpringies, a mass and spring simulation system for X
  773.  *
  774.  * XSpringies is free software; you can redistribute it and/or modify
  775.  * it under the terms of the GNU General Public License as published by
  776.  * the Free Software Foundation; either version 1, or (at your option)
  777.  * any later version.
  778.  *
  779.  * XSpringies is distributed in the hope that it will be useful,
  780.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  781.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  782.  * GNU General Public License for more details.
  783.  * 
  784.  * You should have received a copy of the GNU General Public License
  785.  * along with XSpringies; see the file COPYING.  If not, write to
  786.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  787.  *
  788.  */
  789.  
  790. #include "defs.h"
  791. #include <X11/Xlib.h>
  792. #include <X11/keysym.h>
  793.  
  794. /* key_press: process a key press of key */
  795. void key_press(key, ksym, win)
  796. int key;
  797. KeySym ksym;
  798. Window win;
  799. {
  800.     int i;
  801.     static char cutbuff[MAXPATH];
  802.  
  803.     switch (ksym) {
  804.       case XK_BackSpace:
  805.       case XK_Delete:
  806.     key = K_DELETE;
  807.     break;
  808.       case XK_Return:
  809.     key = K_RETURN;
  810.     break;
  811.       case XK_Escape:
  812.     key = K_ESCAPE;
  813.     break;
  814.     }
  815.  
  816.     /* Check for widget keyboard input */
  817.     if (key_widgets(key, win))
  818.       return;
  819.  
  820.     if (file_op != F_NONE) {
  821.     int len;
  822.  
  823.     len = strlen(filename);
  824.  
  825.     if (ksym == XK_BackSpace || ksym == XK_Delete) {
  826.         if (len > 0 && cursor_pos > 0) {
  827.         for (i = cursor_pos-1; i < len; i++) {
  828.             filename[i] = filename[i+1];
  829.         }
  830.         cursor_pos--;
  831.         }
  832.     } else if (ksym == XK_Return) {
  833.         if (!file_command(filename, file_op))
  834.           file_error();
  835.         file_op = F_NONE;
  836.     } else if (ksym == XK_Escape) {
  837.         file_op = F_NONE;
  838.     } else if (ksym == XK_Left || key == '\002') {
  839.         /* control-b */
  840.         if (cursor_pos > 0)
  841.           cursor_pos--;
  842.     } else if (ksym == XK_Right || key == '\006') {
  843.         /* control-f */
  844.         if (cursor_pos < len)
  845.           cursor_pos++;
  846.     } else if (ksym == XK_Begin || ksym == XK_Home || key == '\001') {
  847.         /* control-a */
  848.         cursor_pos = 0;
  849.     } else if (ksym == XK_End || key == '\005') {
  850.         /* control-e */
  851.         cursor_pos = len;
  852.     } else if (ksym == XK_Clear || key == '\025') {
  853.         /* control-u */
  854.         filename[0] = '\0';
  855.         cursor_pos = 0;
  856.     } else if (ksym == XK_Tab) {
  857.         /* File complete ... */
  858.  
  859.     } else if (key != '\0') {
  860.         switch (key) {
  861.           case '\004': /* control-d */
  862.         if (len > 0 && cursor_pos < len) {
  863.             for (i = cursor_pos; i < len; i++) {
  864.             filename[i] = filename[i+1];
  865.             }
  866.         }
  867.         break;
  868.  
  869.           case '\013': /* control-k */
  870.         strcpy(cutbuff, filename + cursor_pos);
  871.         filename[cursor_pos] = '\0';
  872.         break;
  873.           case '\031': /* control-y */
  874.         {
  875.             int cblen = strlen(cutbuff);
  876.             
  877.             if (len + cblen < MAXPATH) {
  878.             for (i = len; i >= cursor_pos; i--) {
  879.                 filename[i + cblen] = filename[i];
  880.             }
  881.             for (i = 0; i < cblen; i++) {
  882.                 filename[i + cursor_pos] = cutbuff[i];
  883.             }
  884.             cursor_pos += cblen;        
  885.             }
  886.         }
  887.         break;
  888.         
  889.           case '\024': /* control-t */
  890.         if (cursor_pos > 0 && len > 1) {
  891.             char tempc;
  892.             int cpos;
  893.             
  894.             cpos = (cursor_pos == len) ? cursor_pos-1 : cursor_pos;
  895.             
  896.             tempc = filename[cpos-1];
  897.             filename[cpos-1] = filename[cpos];
  898.             filename[cpos] = tempc;
  899.             
  900.             if (cursor_pos < len)
  901.               cursor_pos++;
  902.         }
  903.         break;
  904.  
  905.           default:
  906.         if (len < MAXPATH - 1 && key >= ' ') {
  907.             for (i = len+1; i > cursor_pos; i--) {
  908.             filename[i] = filename[i-1];
  909.             }
  910.             filename[cursor_pos] = key;
  911.             cursor_pos++;
  912.         }      
  913.         }
  914.     }
  915.  
  916.     disp_filename(FALSE);
  917.     return;
  918.     }
  919.  
  920.     switch (key) {
  921.       case K_DELETE:
  922.     delete_selected();
  923.     review_system(TRUE);
  924.     break;
  925.       case 'Q':
  926.     fatal(NULL);
  927.     break;
  928.       case 0x0c:
  929.     /* ^L is redraw screen */
  930.     review_system(TRUE);
  931.     break;
  932.       default:
  933.     break;
  934.     }
  935. }
  936. \BARFOO\
  937. else
  938.   echo "will not over write ./keypress.c"
  939. fi
  940. if `test ! -d ./lib`
  941. then
  942.   mkdir ./lib
  943.   echo "mkdir ./lib"
  944. fi
  945. if `test ! -s ./lib/plane.xsp`
  946. then
  947. echo "writting ./lib/plane.xsp"
  948. cat > ./lib/plane.xsp << '\BARFOO\'
  949. #1.0 *** XSpringies data file
  950. cmas 1
  951. elas 1
  952. kspr 1
  953. kdmp 1
  954. fixm 0
  955. shws 1
  956. cent -1
  957. frce 0 0 10 0
  958. frce 1 0 5 2
  959. frce 2 0 10 0
  960. frce 3 0 10000 1
  961. visc 0
  962. stck 0
  963. step 0.025
  964. prec 1
  965. adpt 0
  966. gsnp 10 1
  967. wall 0 1 0 0
  968. mass 1 786 219 -198 -6 1 1
  969. mass 2 814 226 -198 -6 1 1
  970. mass 3 954 226 -198 -6 0.8 1
  971. mass 4 944 256 -198 -6 1 1
  972. mass 5 964 256 -198 -6 1 1
  973. mass 6 835 226 -198 -6 0.3 1
  974. mass 7 835 234 -198 -6 1 1
  975. mass 8 914 216 -198 -6 1 1
  976. mass 9 819 213 -198 -6 1 1
  977. mass 10 830 218 -198 -6 1 1
  978. mass 11 884 218 -198 -6 1 1
  979. mass 12 884 200 -198 -6 1 1
  980. mass 13 902 200 -198 -6 1 1
  981. mass 14 881 214 -198 -6 0.11 1
  982. mass 15 890 205 -198 -6 0.11 1
  983. mass 16 962 247 -198 -6 0.11 1
  984. mass 17 957 233 -198 -6 0.11 1
  985. mass 18 949 233 -198 -6 0.11 1
  986. mass 19 955 247 -198 -6 0.11 1
  987. mass 20 839 230 -198 -6 0.3 1
  988. mass 21 842 235 -198 -6 0.3 1
  989. mass 22 845 235 -198 -6 0.3 1
  990. mass 23 843 232 -198 -6 0.3 1
  991. mass 24 910 226 -198 -6 0.3 1
  992. mass 25 948 255 -198 -6 0.3 1
  993. mass 26 954 219 -198 -6 0.8 1
  994. mass 27 957 225 -198 -6 0.2 1
  995. mass 28 908 228 -198 -6 1 1
  996. mass 30 0 328 0 0 1 1
  997. mass 31 0 278 0 0 1 1
  998. mass 32 0 228 0 0 1 1
  999. mass 33 0 178 0 0 1 1
  1000. mass 34 0 128 0 0 1 1
  1001. mass 35 0 78 0 0 1 1
  1002. mass 36 10 78 0 0 1 1
  1003. mass 37 10 128 0 0 1 1
  1004. mass 38 10 178 0 0 1 1
  1005. mass 39 10 228 0 0 1 1
  1006. mass 40 10 278 0 0 1 1
  1007. mass 41 10 328 0 0 1 1
  1008. spng 1 1 2 1 1 28.8617393793236232
  1009. spng 2 5 3 1 1 31.6227766016837926
  1010. spng 3 4 5 1 1 20
  1011. spng 4 2 6 1 1 21
  1012. spng 5 6 7 1 1 8
  1013. spng 6 7 2 1 1 22.4722050542442311
  1014. spng 7 1 9 1 1 33.5410196624968435
  1015. spng 8 9 8 1 1 95.0473566176356144
  1016. spng 9 10 12 1 1 56.9209978830308287
  1017. spng 10 12 13 1 1 18
  1018. spng 11 13 11 1 1 25.4558441227157104
  1019. spng 12 11 10 1 1 54
  1020. spng 13 14 15 1 1 12.7279220613578552
  1021. spng 14 14 11 1 1 5
  1022. spng 15 15 13 1 1 13
  1023. spng 16 19 18 1 1 15.2315462117278173
  1024. spng 17 19 16 1 1 7
  1025. spng 18 18 17 1 1 8
  1026. spng 19 6 20 1 1 5.65685424949238058
  1027. spng 20 20 7 1 1 5.65685424949238058
  1028. spng 21 20 22 1 1 7.81024967590665398
  1029. spng 22 24 25 1 1 47.8016736108684768
  1030. spng 23 8 26 1 1 40.1123422402631604
  1031. spng 24 7 28 1 1 73.2461603089199542
  1032. spng 25 28 3 1 1 46.0434577328853507
  1033. spng 26 28 4 1 1 45.6070170039655167
  1034. spng 27 27 26 1 1 6.70820393249936942
  1035. spng 28 3 26 1 1 7
  1036. spng 29 30 31 1 1 50
  1037. spng 30 31 32 1 1 50
  1038. spng 31 32 33 1 1 50
  1039. spng 32 33 34 1 1 50
  1040. spng 33 34 35 1 1 50
  1041. spng 34 30 40 1 1 50.9901951359278485
  1042. spng 35 40 32 1 1 50.9901951359278485
  1043. spng 36 32 38 1 1 50.9901951359278485
  1044. spng 37 38 34 1 1 50.9901951359278485
  1045. spng 38 34 36 1 1 50.9901951359278485
  1046. spng 39 35 37 1 1 50.9901951359278485
  1047. spng 40 37 33 1 1 50.9901951359278485
  1048. spng 41 38 39 1 1 50
  1049. spng 42 33 39 1 1 50.9901951359278485
  1050. spng 43 39 31 1 1 50.9901951359278485
  1051. spng 44 31 41 1 1 50.9901951359278485
  1052. \BARFOO\
  1053. else
  1054.   echo "will not over write ./lib/plane.xsp"
  1055. fi
  1056. if `test ! -s ./lib/2snake.xsp`
  1057. then
  1058. echo "writting ./lib/2snake.xsp"
  1059. cat > ./lib/2snake.xsp << '\BARFOO\'
  1060. #1.0 *** XSpringies data file
  1061. cmas 1.0
  1062. elas 1.0
  1063. kspr 200.0
  1064. kdmp 1.500000
  1065. fixm 0
  1066. shws 1
  1067. cent -1
  1068. frce 0 0 10.0 0.0
  1069. frce 1 0 5.0 2.0
  1070. frce 2 0 10.0 0.0
  1071. frce 3 0 10000.0 1.0
  1072. visc 0.0
  1073. stck 0.0
  1074. step 0.025000
  1075. prec 1.0
  1076. adpt 0
  1077. gsnp 18.0 0
  1078. wall 1 1 1 1
  1079. mass 1 19.0 328.0 0.0 0.0 1.0 1.0
  1080. mass 2 36.0 328.0 0.0 0.0 1.0 1.0
  1081. mass 3 54.0 328.0 0.0 0.0 1.0 1.0
  1082. mass 4 72.0 328.0 0.0 0.0 1.0 1.0
  1083. mass 5 90.0 328.0 0.0 0.0 1.0 1.0
  1084. mass 6 108.0 328.0 0.0 0.0 1.0 1.0
  1085. mass 7 126.0 328.0 0.0 0.0 1.0 1.0
  1086. mass 8 144.0 328.0 0.0 0.0 1.0 1.0
  1087. mass 9 162.0 328.0 0.0 0.0 1.0 1.0
  1088. mass 10 180.0 328.0 0.0 0.0 1.0 1.0
  1089. mass 11 198.0 328.0 0.0 0.0 1.0 1.0
  1090. mass 12 216.0 328.0 0.0 0.0 1.0 1.0
  1091. mass 13 234.0 328.0 0.0 0.0 1.0 1.0
  1092. mass 14 252.0 328.0 0.0 0.0 1.0 1.0
  1093. mass 15 270.0 328.0 0.0 0.0 1.0 1.0
  1094. mass 16 288.0 328.0 0.0 0.0 1.0 1.0
  1095. mass 17 306.0 328.0 0.0 0.0 1.0 1.0
  1096. mass 18 324.0 328.0 0.0 0.0 1.0 1.0
  1097. mass 19 342.0 328.0 0.0 0.0 1.0 1.0
  1098. mass 20 360.0 328.0 0.0 0.0 1.0 1.0
  1099. mass 21 378.0 328.0 0.0 0.0 1.0 1.0
  1100. mass 22 396.0 328.0 0.0 0.0 1.0 1.0
  1101. mass 23 414.0 328.0 0.0 0.0 1.0 1.0
  1102. mass 24 432.0 328.0 0.0 0.0 1.0 1.0
  1103. mass 25 450.0 328.0 0.0 0.0 1.0 1.0
  1104. mass 26 468.0 328.0 0.0 0.0 1.0 1.0
  1105. mass 27 504.0 328.0 0.0 0.0 1.0 1.0
  1106. mass 28 486.0 328.0 0.0 0.0 1.0 1.0
  1107. mass 29 522.0 328.0 0.0 0.0 1.0 1.0
  1108. mass 30 540.0 328.0 0.0 0.0 1.0 1.0
  1109. mass 31 558.0 328.0 0.0 0.0 1.0 1.0
  1110. mass 32 576.0 328.0 0.0 0.0 1.0 1.0
  1111. mass 33 594.0 328.0 0.0 0.0 1.0 1.0
  1112. mass 34 612.0 328.0 0.0 0.0 1.0 1.0
  1113. mass 35 630.0 328.0 0.0 0.0 1.0 1.0
  1114. spng 1 1 2 200.0 1.500000 18.0
  1115. spng 2 3 2 200.0 1.500000 18.0
  1116. spng 3 3 4 200.0 1.500000 18.0
  1117. spng 4 4 5 200.0 1.500000 18.0
  1118. spng 5 5 6 200.0 1.500000 18.0
  1119. spng 6 6 7 200.0 1.500000 18.0
  1120. spng 7 7 8 200.0 1.500000 18.0
  1121. spng 8 8 9 200.0 1.500000 18.0
  1122. spng 9 9 10 200.0 1.500000 18.0
  1123. spng 10 10 11 200.0 1.500000 18.0
  1124. spng 11 11 12 200.0 1.500000 18.0
  1125. spng 12 12 13 200.0 1.500000 18.0
  1126. spng 13 13 14 200.0 1.500000 18.0
  1127. spng 14 14 15 200.0 1.500000 18.0
  1128. spng 15 15 16 200.0 1.500000 18.0
  1129. spng 16 16 17 200.0 1.500000 18.0
  1130. spng 17 17 18 200.0 1.500000 18.0
  1131. spng 18 18 19 200.0 1.500000 18.0
  1132. spng 19 19 20 200.0 1.500000 18.0
  1133. spng 20 20 21 200.0 1.500000 18.0
  1134. spng 21 21 22 200.0 1.500000 18.0
  1135. spng 22 22 23 200.0 1.500000 18.0
  1136. spng 23 23 24 200.0 1.500000 18.0
  1137. spng 24 24 25 200.0 1.500000 18.0
  1138. spng 25 25 26 200.0 1.500000 18.0
  1139. spng 26 26 28 200.0 1.500000 18.0
  1140. spng 27 28 27 200.0 1.500000 18.0
  1141. spng 28 27 29 200.0 1.500000 18.0
  1142. spng 29 29 30 200.0 1.500000 18.0
  1143. spng 30 30 31 200.0 1.500000 18.0
  1144. spng 31 31 32 200.0 1.500000 18.0
  1145. spng 32 32 33 200.0 1.500000 18.0
  1146. spng 33 33 34 200.0 1.500000 18.0
  1147. spng 34 34 35 200.0 1.500000 18.0
  1148. spng 35 1 3 200.0 1.500000 36.0
  1149. spng 36 2 4 200.0 1.500000 36.0
  1150. spng 37 3 5 200.0 1.500000 36.0
  1151. spng 38 4 6 200.0 1.500000 36.0
  1152. spng 39 5 7 200.0 1.500000 36.0
  1153. spng 40 6 8 200.0 1.500000 36.0
  1154. spng 41 7 9 200.0 1.500000 36.0
  1155. spng 42 8 10 200.0 1.500000 36.0
  1156. spng 43 9 11 200.0 1.500000 36.0
  1157. spng 44 10 12 200.0 1.500000 36.0
  1158. spng 45 11 13 200.0 1.500000 36.0
  1159. spng 46 12 14 200.0 1.500000 36.0
  1160. spng 47 13 15 200.0 1.500000 36.0
  1161. spng 48 14 16 200.0 1.500000 36.0
  1162. spng 49 15 17 200.0 1.500000 36.0
  1163. spng 50 16 18 200.0 1.500000 36.0
  1164. spng 51 17 19 200.0 1.500000 36.0
  1165. spng 52 18 20 200.0 1.500000 36.0
  1166. spng 53 19 21 200.0 1.500000 36.0
  1167. spng 54 20 22 200.0 1.500000 36.0
  1168. spng 55 21 23 200.0 1.500000 36.0
  1169. spng 56 22 24 200.0 1.500000 36.0
  1170. spng 57 23 25 200.0 1.500000 36.0
  1171. spng 58 24 26 200.0 1.500000 36.0
  1172. spng 59 25 28 200.0 1.500000 36.0
  1173. spng 60 26 27 200.0 1.500000 36.0
  1174. spng 61 28 29 200.0 1.500000 36.0
  1175. spng 62 27 30 200.0 1.500000 36.0
  1176. spng 63 29 31 200.0 1.500000 36.0
  1177. spng 64 30 32 200.0 1.500000 36.0
  1178. spng 65 31 33 200.0 1.500000 36.0
  1179. spng 66 32 34 200.0 1.500000 36.0
  1180. spng 67 33 35 200.0 1.500000 36.0
  1181. \BARFOO\
  1182. else
  1183.   echo "will not over write ./lib/2snake.xsp"
  1184. fi
  1185. if `test ! -s ./lib/2x2snake.xsp`
  1186. then
  1187. echo "writting ./lib/2x2snake.xsp"
  1188. cat > ./lib/2x2snake.xsp << '\BARFOO\'
  1189. #1.0 *** XSpringies data file
  1190. cmas 1.0
  1191. elas 1.0
  1192. kspr 200.0
  1193. kdmp 1.500000
  1194. fixm 0
  1195. shws 1
  1196. cent -1
  1197. frce 0 0 10.0 0.0
  1198. frce 1 0 5.0 2.0
  1199. frce 2 0 10.0 0.0
  1200. frce 3 0 10000.0 1.0
  1201. visc 0.0
  1202. stck 0.0
  1203. step 0.025000
  1204. prec 1.0
  1205. adpt 0
  1206. gsnp 18.0 0
  1207. wall 1 1 1 1
  1208. mass 1 147.0 324.0 0.0 0.0 1.0 1.0
  1209. mass 2 164.0 324.0 0.0 0.0 1.0 1.0
  1210. mass 3 182.0 324.0 0.0 0.0 1.0 1.0
  1211. mass 4 200.0 324.0 0.0 0.0 1.0 1.0
  1212. mass 5 218.0 324.0 0.0 0.0 1.0 1.0
  1213. mass 6 236.0 324.0 0.0 0.0 1.0 1.0
  1214. mass 7 254.0 324.0 0.0 0.0 1.0 1.0
  1215. mass 8 272.0 324.0 0.0 0.0 1.0 1.0
  1216. mass 9 290.0 324.0 0.0 0.0 1.0 1.0
  1217. mass 10 308.0 324.0 0.0 0.0 1.0 1.0
  1218. mass 11 326.0 324.0 0.0 0.0 1.0 1.0
  1219. mass 12 344.0 324.0 0.0 0.0 1.0 1.0
  1220. mass 13 362.0 324.0 0.0 0.0 1.0 1.0
  1221. mass 14 380.0 324.0 0.0 0.0 1.0 1.0
  1222. mass 15 398.0 324.0 0.0 0.0 1.0 1.0
  1223. mass 16 416.0 324.0 0.0 0.0 1.0 1.0
  1224. mass 17 434.0 324.0 0.0 0.0 1.0 1.0
  1225. mass 18 452.0 324.0 0.0 0.0 1.0 1.0
  1226. mass 19 470.0 324.0 0.0 0.0 1.0 1.0
  1227. mass 20 147.0 298.0 0.0 0.0 1.0 1.0
  1228. mass 21 164.0 298.0 0.0 0.0 1.0 1.0
  1229. mass 22 182.0 298.0 0.0 0.0 1.0 1.0
  1230. mass 23 200.0 298.0 0.0 0.0 1.0 1.0
  1231. mass 24 218.0 298.0 0.0 0.0 1.0 1.0
  1232. mass 25 236.0 298.0 0.0 0.0 1.0 1.0
  1233. mass 26 254.0 298.0 0.0 0.0 1.0 1.0
  1234. mass 27 272.0 298.0 0.0 0.0 1.0 1.0
  1235. mass 28 290.0 298.0 0.0 0.0 1.0 1.0
  1236. mass 29 308.0 298.0 0.0 0.0 1.0 1.0
  1237. mass 30 326.0 298.0 0.0 0.0 1.0 1.0
  1238. mass 31 344.0 298.0 0.0 0.0 1.0 1.0
  1239. mass 32 362.0 298.0 0.0 0.0 1.0 1.0
  1240. mass 33 380.0 298.0 0.0 0.0 1.0 1.0
  1241. mass 34 398.0 298.0 0.0 0.0 1.0 1.0
  1242. mass 35 416.0 298.0 0.0 0.0 1.0 1.0
  1243. mass 36 434.0 298.0 0.0 0.0 1.0 1.0
  1244. mass 37 452.0 298.0 0.0 0.0 1.0 1.0
  1245. mass 38 470.0 298.0 0.0 0.0 1.0 1.0
  1246. spng 1 1 2 200.0 1.500000 18.0
  1247. spng 2 3 2 200.0 1.500000 18.0
  1248. spng 3 3 4 200.0 1.500000 18.0
  1249. spng 4 4 5 200.0 1.500000 18.0
  1250. spng 5 5 6 200.0 1.500000 18.0
  1251. spng 6 6 7 200.0 1.500000 18.0
  1252. spng 7 7 8 200.0 1.500000 18.0
  1253. spng 8 8 9 200.0 1.500000 18.0
  1254. spng 9 9 10 200.0 1.500000 18.0
  1255. spng 10 10 11 200.0 1.500000 18.0
  1256. spng 11 11 12 200.0 1.500000 18.0
  1257. spng 12 12 13 200.0 1.500000 18.0
  1258. spng 13 13 14 200.0 1.500000 18.0
  1259. spng 14 14 15 200.0 1.500000 18.0
  1260. spng 15 15 16 200.0 1.500000 18.0
  1261. spng 16 16 17 200.0 1.500000 18.0
  1262. spng 17 17 18 200.0 1.500000 18.0
  1263. spng 18 18 19 200.0 1.500000 18.0
  1264. spng 19 1 3 200.0 1.500000 36.0
  1265. spng 20 2 4 200.0 1.500000 36.0
  1266. spng 21 3 5 200.0 1.500000 36.0
  1267. spng 22 4 6 200.0 1.500000 36.0
  1268. spng 23 5 7 200.0 1.500000 36.0
  1269. spng 24 6 8 200.0 1.500000 36.0
  1270. spng 25 7 9 200.0 1.500000 36.0
  1271. spng 26 8 10 200.0 1.500000 36.0
  1272. spng 27 9 11 200.0 1.500000 36.0
  1273. spng 28 10 12 200.0 1.500000 36.0
  1274. spng 29 11 13 200.0 1.500000 36.0
  1275. spng 30 12 14 200.0 1.500000 36.0
  1276. spng 31 13 15 200.0 1.500000 36.0
  1277. spng 32 14 16 200.0 1.500000 36.0
  1278. spng 33 15 17 200.0 1.500000 36.0
  1279. spng 34 16 18 200.0 1.500000 36.0
  1280. spng 35 17 19 200.0 1.500000 36.0
  1281. spng 36 20 21 200.0 1.500000 18.0
  1282. spng 37 22 21 200.0 1.500000 18.0
  1283. spng 38 22 23 200.0 1.500000 18.0
  1284. spng 39 23 24 200.0 1.500000 18.0
  1285. spng 40 24 25 200.0 1.500000 18.0
  1286. spng 41 25 26 200.0 1.500000 18.0
  1287. spng 42 26 27 200.0 1.500000 18.0
  1288. spng 43 27 28 200.0 1.500000 18.0
  1289. spng 44 28 29 200.0 1.500000 18.0
  1290. spng 45 29 30 200.0 1.500000 18.0
  1291. spng 46 30 31 200.0 1.500000 18.0
  1292. spng 47 31 32 200.0 1.500000 18.0
  1293. spng 48 32 33 200.0 1.500000 18.0
  1294. spng 49 33 34 200.0 1.500000 18.0
  1295. spng 50 34 35 200.0 1.500000 18.0
  1296. spng 51 35 36 200.0 1.500000 18.0
  1297. spng 52 36 37 200.0 1.500000 18.0
  1298. spng 53 37 38 200.0 1.500000 18.0
  1299. spng 54 20 22 200.0 1.500000 36.0
  1300. spng 55 21 23 200.0 1.500000 36.0
  1301. spng 56 22 24 200.0 1.500000 36.0
  1302. spng 57 23 25 200.0 1.500000 36.0
  1303. spng 58 24 26 200.0 1.500000 36.0
  1304. spng 59 25 27 200.0 1.500000 36.0
  1305. spng 60 26 28 200.0 1.500000 36.0
  1306. spng 61 27 29 200.0 1.500000 36.0
  1307. spng 62 28 30 200.0 1.500000 36.0
  1308. spng 63 29 31 200.0 1.500000 36.0
  1309. spng 64 30 32 200.0 1.500000 36.0
  1310. spng 65 31 33 200.0 1.500000 36.0
  1311. spng 66 32 34 200.0 1.500000 36.0
  1312. spng 67 33 35 200.0 1.500000 36.0
  1313. spng 68 34 36 200.0 1.500000 36.0
  1314. spng 69 35 37 200.0 1.500000 36.0
  1315. spng 70 36 38 200.0 1.500000 36.0
  1316. spng 71 1 20 200.0 1.500000 26.0
  1317. spng 72 2 21 200.0 1.500000 26.0
  1318. spng 73 3 22 200.0 1.500000 26.0
  1319. spng 74 4 23 200.0 1.500000 26.0
  1320. spng 75 5 24 200.0 1.500000 26.0
  1321. spng 76 25 6 200.0 1.500000 26.0
  1322. spng 77 7 26 200.0 1.500000 26.0
  1323. spng 78 27 8 200.0 1.500000 26.0
  1324. spng 79 9 28 200.0 1.500000 26.0
  1325. spng 80 29 10 200.0 1.500000 26.0
  1326. spng 81 11 30 200.0 1.500000 26.0
  1327. spng 82 31 12 200.0 1.500000 26.0
  1328. spng 83 13 32 200.0 1.500000 26.0
  1329. spng 84 33 14 200.0 1.500000 26.0
  1330. spng 85 15 34 200.0 1.500000 26.0
  1331. spng 86 35 16 200.0 1.500000 26.0
  1332. spng 87 17 36 200.0 1.500000 26.0
  1333. spng 88 37 18 200.0 1.500000 26.0
  1334. spng 89 19 38 200.0 1.500000 26.0
  1335. spng 90 1 21 200.0 1.500000 31.064449
  1336. spng 91 2 20 200.0 1.500000 31.064449
  1337. spng 92 2 22 200.0 1.500000 31.622777
  1338. spng 93 3 21 200.0 1.500000 31.622777
  1339. spng 94 3 23 200.0 1.500000 31.622777
  1340. spng 95 4 22 200.0 1.500000 31.622777
  1341. spng 96 4 24 200.0 1.500000 31.622777
  1342. spng 97 5 23 200.0 1.500000 31.622777
  1343. spng 98 5 25 200.0 1.500000 31.622777
  1344. spng 99 6 24 200.0 1.500000 31.622777
  1345. spng 100 6 26 200.0 1.500000 31.622777
  1346. spng 101 7 25 200.0 1.500000 31.622777
  1347. spng 102 7 27 200.0 1.500000 31.622777
  1348. spng 103 8 26 200.0 1.500000 31.622777
  1349. spng 104 8 28 200.0 1.500000 31.622777
  1350. spng 105 9 27 200.0 1.500000 31.622777
  1351. spng 106 9 29 200.0 1.500000 31.622777
  1352. spng 107 10 28 200.0 1.500000 31.622777
  1353. spng 108 10 30 200.0 1.500000 31.622777
  1354. spng 109 11 29 200.0 1.500000 31.622777
  1355. spng 110 11 31 200.0 1.500000 31.622777
  1356. spng 111 12 30 200.0 1.500000 31.622777
  1357. spng 112 12 32 200.0 1.500000 31.622777
  1358. spng 113 13 31 200.0 1.500000 31.622777
  1359. spng 114 13 33 200.0 1.500000 31.622777
  1360. spng 115 14 32 200.0 1.500000 31.622777
  1361. spng 116 14 34 200.0 1.500000 31.622777
  1362. spng 117 15 33 200.0 1.500000 31.622777
  1363. spng 118 15 35 200.0 1.500000 31.622777
  1364. spng 119 16 34 200.0 1.500000 31.622777
  1365. spng 120 16 36 200.0 1.500000 31.622777
  1366. spng 121 17 35 200.0 1.500000 31.622777
  1367. spng 122 17 37 200.0 1.500000 31.622777
  1368. spng 123 18 36 200.0 1.500000 31.622777
  1369. spng 124 18 38 200.0 1.500000 31.622777
  1370. spng 125 19 37 200.0 1.500000 31.622777
  1371. spng 126 1 22 200.0 1.500000 43.600459
  1372. spng 127 3 20 200.0 1.500000 43.600459
  1373. spng 128 2 23 200.0 1.500000 44.407207
  1374. spng 129 4 21 200.0 1.500000 44.407207
  1375. spng 130 3 24 200.0 1.500000 44.407207
  1376. spng 131 5 22 200.0 1.500000 44.407207
  1377. spng 132 4 25 200.0 1.500000 44.407207
  1378. spng 133 6 23 200.0 1.500000 44.407207
  1379. spng 134 5 26 200.0 1.500000 44.407207
  1380. spng 135 7 24 200.0 1.500000 44.407207
  1381. spng 136 6 27 200.0 1.500000 44.407207
  1382. spng 137 8 25 200.0 1.500000 44.407207
  1383. spng 138 7 28 200.0 1.500000 44.407207
  1384. spng 139 9 26 200.0 1.500000 44.407207
  1385. spng 140 8 29 200.0 1.500000 44.407207
  1386. spng 141 10 27 200.0 1.500000 44.407207
  1387. spng 142 9 30 200.0 1.500000 44.407207
  1388. spng 143 11 28 200.0 1.500000 44.407207
  1389. spng 144 10 31 200.0 1.500000 44.407207
  1390. spng 145 12 29 200.0 1.500000 44.407207
  1391. spng 146 11 32 200.0 1.500000 44.407207
  1392. spng 147 13 30 200.0 1.500000 44.407207
  1393. spng 148 12 33 200.0 1.500000 44.407207
  1394. spng 149 14 31 200.0 1.500000 44.407207
  1395. spng 150 13 34 200.0 1.500000 44.407207
  1396. spng 151 15 33 200.0 1.500000 31.622777
  1397. spng 152 32 15 200.0 1.500000 44.407207
  1398. spng 153 14 35 200.0 1.500000 44.407207
  1399. spng 154 16 33 200.0 1.500000 44.407207
  1400. spng 155 15 36 200.0 1.500000 44.407207
  1401. spng 156 34 17 200.0 1.500000 44.407207
  1402. spng 157 16 37 200.0 1.500000 44.407207
  1403. spng 158 18 35 200.0 1.500000 44.407207
  1404. spng 159 17 38 200.0 1.500000 44.407207
  1405. spng 160 19 36 200.0 1.500000 44.407207
  1406. \BARFOO\
  1407. else
  1408.   echo "will not over write ./lib/2x2snake.xsp"
  1409. fi
  1410. echo "Finished archive 15 of 16"
  1411. exit
  1412.  
  1413. exit 0 # Just in case...
  1414. -- 
  1415.   // chris@IMD.Sterling.COM            | Send comp.sources.x submissions to:
  1416. \X/  Amiga - The only way to fly!      |
  1417.  "It's intuitively obvious to the most |    sources-x@imd.sterling.com
  1418.   casual observer..."                  |
  1419.