riley@mipsdal.mips.com (Riley Rainey) (10/08/90)
Submitted-by: riley@mipsdal.mips.com (Riley Rainey) Posting-number: Volume 9, Issue 70 Archive-name: acm/part02 echo x - ./V/test/f16 sed 's/^X//' >./V/test/f16 <<'*-*-END-of-./V/test/f16-*-*' XF-16-fighter X130 12 X1 -18.165 0 0 X2 -18.165 -1.191 0 X3 -15.187 -2.085 0 X4 -13.698 -2.382 0 X5 -17.272 -2.382 0 X6 -17.272 -3.573 0 X7 -10.923 -3.573 0 X8 -4.169 -3.573 0 X9 -4.169 -4.765 0 X10 5.598 -4.765 0 X11 18.463 -2.144 0 X12 18.939 -1.787 0 X13 22.274 -1.489 0 X14 24.895 -1.191 0 X15 27.992 0 0 X16 -6.551 -3.573 0 X17 -6.551 -15.485 0 X18 0.357 -15.485 0 X19 0.357 -15.187 0 X20 -2.978 -15.008 0 X21 5.598 -4.765 0 X22 -4.169 -4.765 0 X23 -4.169 -3.573 0 X24 -17.272 -3.573 0 X25 -17.272 -8.934 0.893 X26 -15.187 -8.934 0.893 X27 -10.923 -3.573 0 X28 27.992 0 0 X29 24.895 1.191 0 X30 22.274 1.489 0 X31 18.939 1.787 0 X32 18.463 2.144 0 X33 5.598 4.765 0 X34 -4.169 4.765 0 X35 -4.169 3.573 0 X36 -10.923 3.573 0 X37 -17.272 3.573 0 X38 -17.272 2.382 0 X39 -13.698 2.382 0 X40 -15.187 2.085 0 X41 -18.165 1.191 0 X42 -18.165 0 0 X43 5.598 4.765 0 X44 -2.978 15.008 0 X45 0.357 15.187 0 X46 0.357 15.485 0 X47 -6.551 15.485 0 X48 -6.551 3.573 0 X49 -4.169 3.573 0 X50 -4.169 4.765 0 X51 -10.923 3.573 0 X52 -15.187 8.934 0.893 X53 -17.272 8.934 0.893 X54 -17.272 3.573 0 X55 27.992 0 0 X56 23.525 0 -1.191 X57 17.272 0 -2.382 X58 15.783 0 -3.812 X59 13.996 0 -4.169 X60 11.316 0 -4.05 X61 8.338 0 -3.335 X62 1.787 0 -2.382 X63 -4.169 0 -2.382 X64 -13.936 0 -1.906 X65 -15.128 0 -1.906 X66 -15.187 0 -1.787 X67 -18.165 0 -1.191 X68 -18.165 0 0 X69 -4.169 0 -2.382 X70 -10.125 0 -4.05 X71 -15.783 0 -10.482 X72 -19.654 0 -10.482 X73 -19.654 0 -9.529 X74 -19.654 0 -9.529 X75 -16.378 0 -3.573 X76 -16.378 0 -2.144 X77 -14.889 0 -2.382 X78 -13.936 0 -2.382 X79 -13.936 0 -1.906 X80 -18.165 0 0 X81 -18.165 0 1.191 X82 -15.187 0 2.085 X83 -13.698 0 2.263 X84 -2.68 0 2.382 X85 8.04 0 2.382 X86 12.507 0 2.263 X87 12.507 0 0.596 X88 19.952 0 0.596 X89 23.525 0 0.476 X90 27.992 0 0 X91 -3.551 0 -2.382 X92 -3.551 -3.871 -0.10 X93 -3.551 -15.485 0 X94 -3.551 -15.485 0.1065 X95 -3.551 -3.871 0.142 X96 -3.551 -2.58 0.2556 X97 -3.551 -2.387 1.818 X98 -3.551 -2.102 2.015 X99 -3.551 -1.03 2.251 X100 -3.551 0 2.282 X101 -3.551 1.03 2.251 X102 -3.551 2.102 2.015 X103 -3.551 2.387 1.818 X104 -3.551 2.58 0.2556 X105 -3.551 3.871 0.142 X106 -3.551 15.485 0.1065 X107 -3.551 15.485 0 X108 -3.551 3.871 -0.10 X109 13.996 0 -4.169 X110 13.996 -0.8932 -3.692 X111 13.996 -1.191 -2.978 X112 13.996 -1.251 -2.502 X113 13.996 -1.787 -1.311 X114 13.996 -3.054 0 X115 13.996 -1.583 0.3568 X116 13.996 0 0.596 X117 13.996 1.583 0.3568 X118 13.996 3.054 0 X119 13.996 1.787 -1.311 X120 13.996 1.251 -2.502 X121 13.996 1.191 -2.978 X122 13.996 0.8932 -3.692 X123 -18.165 1.191 0 X124 -18.165 0.842 0.842 X125 -18.165 0 1.191 X126 -18.165 -0.842 0.842 X127 -18.165 -1.191 0 X128 -18.165 -0.842 -0.842 X129 -18.165 0 -1.191 X130 -18.165 0.842 -0.842 Xgray33 14 109 110 111 112 113 114 115 116 117 118 119 120 121 122 Xgray33 18 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 Xgray33 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Xgray33 8 16 17 18 19 20 21 22 23 Xgray33 4 24 25 26 27 Xgray33 15 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Xgray33 8 43 44 45 46 47 48 49 50 Xgray33 4 51 52 53 54 Xgray33 14 55 56 57 58 59 60 61 62 63 64 65 66 67 68 Xgray33 11 69 70 71 72 73 74 75 76 77 78 79 Xgray33 11 80 81 82 83 84 85 86 87 88 89 90 Xgray33 8 123 124 125 126 127 128 129 130 *-*-END-of-./V/test/f16-*-* echo x - ./V/test/Makefile sed 's/^X//' >./V/test/Makefile <<'*-*-END-of-./V/test/Makefile-*-*' X# Makefile for V library test programs X# X# Riley Rainey; riley@10hnl1.ceo.dg.com X# X# This makefile can be used to create a demonstration program X# for the V library. This program, named animate, uses the V library X# and X color palette manipulation to create an animated flying scene. XOBJFILES = animate.o app.o XCFLAGS = -g X Xanimate: $(OBJFILES) X cc -g -o animate $(OBJFILES) -L/usr/lib/X11 -L../lib -lV -lX11 -lm -lbsd X Xclean: X rm *.o core X Xclobber: X rm *.o animate *-*-END-of-./V/test/Makefile-*-* echo x - ./V/test/fixf16.c sed 's/^X//' >./V/test/fixf16.c <<'*-*-END-of-./V/test/fixf16.c-*-*' X#include "../lib/Vlib.h" X Xmain () { X X int i, k; X VObject *obj; X VPolygon **poly; X VPoint *q, tmp; X VMatrix mtx; X X if ((obj = VReadObject(stdin)) == (VObject *) NULL) { X fprintf (stderr, "Error reading the object definition.\n"); X exit (1); X } X X/* X * Prepare a transformation matrix that: X * (a) swaps X and Y coordinates. X * (b) negates Z coordinate. X */ X X VIdentMatrix (&mtx); X mtx.m[0][0] = 0.0; X mtx.m[0][1] = 1.0; X mtx.m[1][0] = 1.0; X mtx.m[1][1] = 0.0; X mtx.m[2][2] = -1.0; X X poly = obj->polygon; X X for (i=0; i<obj->numPolys; ++i) { X for ((k=0, q=poly[i]->vertex); k<poly[i]->numVtces; (++k, ++q)) { X VTransform(q, &mtx, &tmp); X *q = tmp; X } X } X X VWriteObject (stdout, obj); X} *-*-END-of-./V/test/fixf16.c-*-* echo x - ./V/test/f sed 's/^X//' >./V/test/f <<'*-*-END-of-./V/test/f-*-*' XF-16-fighter X90 9 X1 -18.165 0 0 X2 -18.165 -1.191 0 X3 -15.187 -2.085 0 X4 -13.698 -2.382 0 X5 -17.272 -2.382 0 X6 -17.272 -3.573 0 X7 -10.923 -3.573 0 X8 -4.169 -3.573 0 X9 -4.169 -4.765 0 X10 5.598 -4.765 0 X11 18.463 -2.144 0 X12 18.939 -1.787 0 X13 22.274 -1.489 0 X14 24.895 -1.191 0 X15 27.992 0 0 X16 -6.551 -3.573 0 X17 -6.551 -15.485 0 X18 0.357 -15.485 0 X19 0.357 -15.187 0 X20 -2.978 -15.008 0 X21 5.598 -4.765 0 X22 -4.169 -4.765 0 X23 -4.169 -3.573 0 X24 -17.272 -3.573 0 X25 -17.272 -8.934 0.893 X26 -15.187 -8.934 0.893 X27 -10.923 -3.573 0 X28 27.992 0 0 X29 24.895 1.191 0 X30 22.274 1.489 0 X31 18.939 1.787 0 X32 18.463 2.144 0 X33 5.598 4.765 0 X34 -4.169 4.765 0 X35 -4.169 3.573 0 X36 -10.923 3.573 0 X37 -17.272 3.573 0 X38 -17.272 2.382 0 X39 -13.698 2.382 0 X40 -15.187 2.085 0 X41 -18.165 1.191 0 X42 -18.165 0 0 X43 5.598 4.765 0 X44 -2.978 15.008 0 X45 0.357 15.187 0 X46 0.357 15.485 0 X47 -6.551 15.485 0 X48 -6.551 3.573 0 X49 -4.169 3.573 0 X50 -4.169 4.765 0 X51 -10.923 3.573 0 X52 -15.187 8.934 0.893 X53 -17.272 8.934 0.893 X54 -17.272 3.573 0 X55 27.992 0 0 X56 23.525 0 -1.191 X57 17.272 0 -2.382 X58 15.783 0 -3.812 X59 13.996 0 -4.169 X60 11.316 0 -4.05 X61 8.338 0 -3.335 X62 1.787 0 -2.382 X63 -4.169 0 -2.382 X64 -13.936 0 -1.906 X65 -15.128 0 -1.906 X66 -15.187 0 -1.787 X67 -18.165 0 -1.191 X68 -18.165 0 0 X69 -4.169 0 -2.382 X70 -10.125 0 -4.05 X71 -15.783 0 -10.482 X72 -19.654 0 -10.482 X73 -19.654 0 -9.529 X74 -19.654 0 -9.529 X75 -16.378 0 -3.573 X76 -16.378 0 -2.144 X77 -14.889 0 -2.382 X78 -13.936 0 -2.382 X79 -13.936 0 -1.906 X80 -18.165 0 0 X81 -18.165 0 1.191 X82 -15.187 0 2.085 X83 -13.698 0 2.263 X84 -2.68 0 2.382 X85 8.04 0 2.382 X86 12.507 0 2.263 X87 12.507 0 0.596 X88 19.952 0 0.596 X89 23.525 0 0.476 X90 27.992 0 0 Xgray 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Xgray 8 16 17 18 19 20 21 22 23 Xgray 4 24 25 26 27 Xgray 15 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Xgray 8 43 44 45 46 47 48 49 50 Xgray 4 51 52 53 54 Xgray 14 55 56 57 58 59 60 61 62 63 64 65 66 67 68 Xgray 11 69 70 71 72 73 74 75 76 77 78 79 Xgray 11 80 81 82 83 84 85 86 87 88 89 90 *-*-END-of-./V/test/f-*-* echo x - ./V/test/mig23 sed 's/^X//' >./V/test/mig23 <<'*-*-END-of-./V/test/mig23-*-*' Xmig-23-wings-swept X88 10 X1 36.5891 0 0 X2 34.4368 0.86092 0 X3 30.9931 1.29138 0 X4 27.119 1.72184 0 X5 20.6621 1.72184 0 X6 18.9402 2.1523 0 X7 14.2052 3.01322 0 X8 -3.44368 2.58276 0 X9 -9.03966 2.1523 0 X10 -16.7879 0.86092 0 X11 -18.0793 0.43046 0 X12 -18.0793 0 0 X13 36.5891 0 0 X14 34.4368 -0.86092 0 X15 30.9931 -1.29138 0 X16 27.119 -1.72184 0 X17 20.6621 -1.72184 0 X18 18.9402 -2.1523 0 X19 14.2052 -3.01322 0 X20 -3.44368 -2.58276 0 X21 -9.03966 -2.1523 0 X22 -16.7879 -0.86092 0 X23 -18.0793 -0.43046 0 X24 -18.0793 0 0 X25 14.2052 3.01322 -3.01322 X26 4.73506 7.31782 -3.01322 X27 6.02644 8.6092 -3.01322 X28 -11.192 13.7747 -3.01322 X29 -12.0529 13.7747 -3.01322 X30 -14.2052 11.192 -3.01322 X31 -14.2052 10.7615 -3.01322 X32 -3.44368 2.58276 -3.01322 X33 14.2052 -3.01322 -3.01322 X34 4.73506 -7.31782 -3.01322 X35 6.02644 -8.6092 -3.01322 X36 -11.192 -13.7747 -3.01322 X37 -12.0529 -13.7747 -3.01322 X38 -14.2052 -11.192 -3.01322 X39 -14.2052 -10.7615 -3.01322 X40 -3.44368 -2.58276 -3.01322 X41 -18.9402 3.01322 -1.72184 X42 -20.2316 7.31782 -1.72184 X43 -18.5098 8.6092 -1.72184 X44 -9.03966 2.1523 -1.72184 X45 -16.7879 0.86092 -1.72184 X46 -18.9402 -3.01322 -1.72184 X47 -20.2316 -7.31782 -1.72184 X48 -18.5098 -8.6092 -1.72184 X49 -9.03966 -2.1523 -1.72184 X50 -16.7879 -0.86092 -1.72184 X51 36.5891 0 0 X52 33.1454 0 -1.29138 X53 30.1322 0 -2.1523 X54 25.8276 0 -2.58276 X55 22.3839 0 -3.87414 X56 18.0793 0 -4.3046 X57 9.47012 0 -3.87414 X58 -0.860918 0 -3.44368 X59 -8.6092 0 -6.02644 X60 -16.3575 0 -10.331 X61 -18.9402 0 -9.03966 X62 -18.0793 0 -3.87414 X63 -19.8012 0 -3.44368 X64 -17.2184 0 -1.72184 X65 -18.0793 0 -1.72184 X66 -18.0793 0 1.29138 X67 -15.4966 0 1.72184 X68 -6.4569 0 2.1523 X69 10.331 0 2.1523 X70 20.2316 0 1.72184 X71 28.8408 0 1.29138 X72 33.1454 0 0.86092 X73 -15.4966 0 1.72184 X74 -15.4966 0 4.3046 X75 -13.3443 0 5.16552 X76 -6.4569 0 2.1523 X77 20.6621 1.72184 -3.01322 X78 18.9402 2.1523 -3.01322 X79 14.2052 3.01322 -3.01322 X80 -3.44368 2.58276 -3.01322 X81 -3.44368 -2.58276 -3.01322 X82 14.2052 -3.01322 -3.01322 X83 18.9402 -2.1523 -3.01322 X84 20.6621 -1.72184 -3.01322 X85 -3.44368 2.58276 -3.01322 X86 -16.7879 0.86092 -1.72184 X87 -16.7879 -0.86092 -1.72184 X88 -3.44368 -2.58276 -3.01322 Xgray 12 1 2 3 4 5 6 7 8 9 10 11 12 Xgray 12 13 14 15 16 17 18 19 20 21 22 23 24 Xgray 8 25 26 27 28 29 30 31 32 Xgray 8 33 34 35 36 37 38 39 40 Xgray 5 41 42 43 44 45 Xgray 5 46 47 48 49 50 Xgray 22 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 Xgray 4 73 74 75 76 Xgray 8 77 78 79 80 81 82 83 84 Xgray 4 85 86 87 88 *-*-END-of-./V/test/mig23-*-* echo x - ./V/test/fixmig.c sed 's/^X//' >./V/test/fixmig.c <<'*-*-END-of-./V/test/fixmig.c-*-*' X#include "../lib/Vlib.h" X Xmain () { X X int i, k; X VObject *obj; X VPolygon **poly; X VPoint *q, tmp; X VMatrix mtx; X X if ((obj = VReadObject(stdin)) == (VObject *) NULL) { X fprintf (stderr, "Error reading the object definition.\n"); X exit (1); X } X X/* X * Prepare a transformation matrix that: X * (a) swaps X and Y coordinates. X * (b) negates Z coordinate. X */ X X VIdentMatrix (&mtx); X mtx.m[0][3] = 39.60232; X mtx.m[0][0] = -2.1523; X mtx.m[1][1] = 2.1523; X mtx.m[2][2] = 2.1523; X X poly = obj->polygon; X X for (i=0; i<obj->numPolys; ++i) { X for ((k=0, q=poly[i]->vertex); k<poly[i]->numVtces; (++k, ++q)) { X VTransform(q, &mtx, &tmp); X *q = tmp; X } X } X X VWriteObject (stdout, obj); X} *-*-END-of-./V/test/fixmig.c-*-* echo x - ./V/test/fullrwy sed 's/^X//' >./V/test/fullrwy <<'*-*-END-of-./V/test/fullrwy-*-*' XRunway X280 69 X1 0.000000 -75.000000 0.000000 X2 12000.000000 -75.000000 0.000000 X3 12000.000000 75.000000 0.000000 X4 0.000000 75.000000 0.000000 X5 0.000000 -75.000000 0.000000 X6 12000.000000 -75.000000 0.000000 X7 12000.000000 -70.000000 0.000000 X8 0.000000 -70.000000 0.000000 X9 0.000000 75.000000 0.000000 X10 12000.000000 75.000000 0.000000 X11 12000.000000 70.000000 0.000000 X12 0.000000 70.000000 0.000000 X13 1000.000000 -66.000000 0.000000 X14 1125.000000 -66.000000 0.000000 X15 1125.000000 -36.000000 0.000000 X16 1000.000000 -36.000000 0.000000 X17 1000.000000 66.000000 0.000000 X18 1125.000000 66.000000 0.000000 X19 1125.000000 36.000000 0.000000 X20 1000.000000 36.000000 0.000000 X21 11000.000000 -66.000000 0.000000 X22 10875.000000 -66.000000 0.000000 X23 10875.000000 -36.000000 0.000000 X24 11000.000000 -36.000000 0.000000 X25 11000.000000 66.000000 0.000000 X26 10875.000000 66.000000 0.000000 X27 10875.000000 36.000000 0.000000 X28 11000.000000 36.000000 0.000000 X29 4.000000 -66.000000 0.000000 X30 129.000000 -66.000000 0.000000 X31 129.000000 -54.888889 0.000000 X32 4.000000 -54.888889 0.000000 X33 4.000000 -50.888889 0.000000 X34 129.000000 -50.888889 0.000000 X35 129.000000 -39.777779 0.000000 X36 4.000000 -39.777779 0.000000 X37 4.000000 -35.777779 0.000000 X38 129.000000 -35.777779 0.000000 X39 129.000000 -24.666666 0.000000 X40 4.000000 -24.666666 0.000000 X41 4.000000 -20.666666 0.000000 X42 129.000000 -20.666666 0.000000 X43 129.000000 -9.555555 0.000000 X44 4.000000 -9.555555 0.000000 X45 4.000000 9.555555 0.000000 X46 129.000000 9.555555 0.000000 X47 129.000000 20.666666 0.000000 X48 4.000000 20.666666 0.000000 X49 4.000000 24.666666 0.000000 X50 129.000000 24.666666 0.000000 X51 129.000000 35.777779 0.000000 X52 4.000000 35.777779 0.000000 X53 4.000000 39.777779 0.000000 X54 129.000000 39.777779 0.000000 X55 129.000000 50.888889 0.000000 X56 4.000000 50.888889 0.000000 X57 4.000000 54.888889 0.000000 X58 129.000000 54.888889 0.000000 X59 129.000000 66.000000 0.000000 X60 4.000000 66.000000 0.000000 X61 11996.000000 -66.000000 0.000000 X62 11871.000000 -66.000000 0.000000 X63 11871.000000 -54.888889 0.000000 X64 11996.000000 -54.888889 0.000000 X65 11996.000000 -50.888889 0.000000 X66 11871.000000 -50.888889 0.000000 X67 11871.000000 -39.777779 0.000000 X68 11996.000000 -39.777779 0.000000 X69 11996.000000 -35.777779 0.000000 X70 11871.000000 -35.777779 0.000000 X71 11871.000000 -24.666666 0.000000 X72 11996.000000 -24.666666 0.000000 X73 11996.000000 -20.666666 0.000000 X74 11871.000000 -20.666666 0.000000 X75 11871.000000 -9.555555 0.000000 X76 11996.000000 -9.555555 0.000000 X77 11996.000000 9.555555 0.000000 X78 11871.000000 9.555555 0.000000 X79 11871.000000 20.666666 0.000000 X80 11996.000000 20.666666 0.000000 X81 11996.000000 24.666666 0.000000 X82 11871.000000 24.666666 0.000000 X83 11871.000000 35.777779 0.000000 X84 11996.000000 35.777779 0.000000 X85 11996.000000 39.777779 0.000000 X86 11871.000000 39.777779 0.000000 X87 11871.000000 50.888889 0.000000 X88 11996.000000 50.888889 0.000000 X89 11996.000000 54.888889 0.000000 X90 11871.000000 54.888889 0.000000 X91 11871.000000 66.000000 0.000000 X92 11996.000000 66.000000 0.000000 X93 258.000000 -2.500000 0.000000 X94 383.000000 -2.500000 0.000000 X95 383.000000 2.500000 0.000000 X96 258.000000 2.500000 0.000000 X97 508.000000 -2.500000 0.000000 X98 633.000000 -2.500000 0.000000 X99 633.000000 2.500000 0.000000 X100 508.000000 2.500000 0.000000 X101 758.000000 -2.500000 0.000000 X102 883.000000 -2.500000 0.000000 X103 883.000000 2.500000 0.000000 X104 758.000000 2.500000 0.000000 X105 1008.000000 -2.500000 0.000000 X106 1133.000000 -2.500000 0.000000 X107 1133.000000 2.500000 0.000000 X108 1008.000000 2.500000 0.000000 X109 1258.000000 -2.500000 0.000000 X110 1383.000000 -2.500000 0.000000 X111 1383.000000 2.500000 0.000000 X112 1258.000000 2.500000 0.000000 X113 1508.000000 -2.500000 0.000000 X114 1633.000000 -2.500000 0.000000 X115 1633.000000 2.500000 0.000000 X116 1508.000000 2.500000 0.000000 X117 1758.000000 -2.500000 0.000000 X118 1883.000000 -2.500000 0.000000 X119 1883.000000 2.500000 0.000000 X120 1758.000000 2.500000 0.000000 X121 2008.000000 -2.500000 0.000000 X122 2133.000000 -2.500000 0.000000 X123 2133.000000 2.500000 0.000000 X124 2008.000000 2.500000 0.000000 X125 2258.000000 -2.500000 0.000000 X126 2383.000000 -2.500000 0.000000 X127 2383.000000 2.500000 0.000000 X128 2258.000000 2.500000 0.000000 X129 2508.000000 -2.500000 0.000000 X130 2633.000000 -2.500000 0.000000 X131 2633.000000 2.500000 0.000000 X132 2508.000000 2.500000 0.000000 X133 2758.000000 -2.500000 0.000000 X134 2883.000000 -2.500000 0.000000 X135 2883.000000 2.500000 0.000000 X136 2758.000000 2.500000 0.000000 X137 3008.000000 -2.500000 0.000000 X138 3133.000000 -2.500000 0.000000 X139 3133.000000 2.500000 0.000000 X140 3008.000000 2.500000 0.000000 X141 3258.000000 -2.500000 0.000000 X142 3383.000000 -2.500000 0.000000 X143 3383.000000 2.500000 0.000000 X144 3258.000000 2.500000 0.000000 X145 3508.000000 -2.500000 0.000000 X146 3633.000000 -2.500000 0.000000 X147 3633.000000 2.500000 0.000000 X148 3508.000000 2.500000 0.000000 X149 3758.000000 -2.500000 0.000000 X150 3883.000000 -2.500000 0.000000 X151 3883.000000 2.500000 0.000000 X152 3758.000000 2.500000 0.000000 X153 4008.000000 -2.500000 0.000000 X154 4133.000000 -2.500000 0.000000 X155 4133.000000 2.500000 0.000000 X156 4008.000000 2.500000 0.000000 X157 4258.000000 -2.500000 0.000000 X158 4383.000000 -2.500000 0.000000 X159 4383.000000 2.500000 0.000000 X160 4258.000000 2.500000 0.000000 X161 4508.000000 -2.500000 0.000000 X162 4633.000000 -2.500000 0.000000 X163 4633.000000 2.500000 0.000000 X164 4508.000000 2.500000 0.000000 X165 4758.000000 -2.500000 0.000000 X166 4883.000000 -2.500000 0.000000 X167 4883.000000 2.500000 0.000000 X168 4758.000000 2.500000 0.000000 X169 5008.000000 -2.500000 0.000000 X170 5133.000000 -2.500000 0.000000 X171 5133.000000 2.500000 0.000000 X172 5008.000000 2.500000 0.000000 X173 5258.000000 -2.500000 0.000000 X174 5383.000000 -2.500000 0.000000 X175 5383.000000 2.500000 0.000000 X176 5258.000000 2.500000 0.000000 X177 5508.000000 -2.500000 0.000000 X178 5633.000000 -2.500000 0.000000 X179 5633.000000 2.500000 0.000000 X180 5508.000000 2.500000 0.000000 X181 5758.000000 -2.500000 0.000000 X182 5883.000000 -2.500000 0.000000 X183 5883.000000 2.500000 0.000000 X184 5758.000000 2.500000 0.000000 X185 6008.000000 -2.500000 0.000000 X186 6133.000000 -2.500000 0.000000 X187 6133.000000 2.500000 0.000000 X188 6008.000000 2.500000 0.000000 X189 6258.000000 -2.500000 0.000000 X190 6383.000000 -2.500000 0.000000 X191 6383.000000 2.500000 0.000000 X192 6258.000000 2.500000 0.000000 X193 6508.000000 -2.500000 0.000000 X194 6633.000000 -2.500000 0.000000 X195 6633.000000 2.500000 0.000000 X196 6508.000000 2.500000 0.000000 X197 6758.000000 -2.500000 0.000000 X198 6883.000000 -2.500000 0.000000 X199 6883.000000 2.500000 0.000000 X200 6758.000000 2.500000 0.000000 X201 7008.000000 -2.500000 0.000000 X202 7133.000000 -2.500000 0.000000 X203 7133.000000 2.500000 0.000000 X204 7008.000000 2.500000 0.000000 X205 7258.000000 -2.500000 0.000000 X206 7383.000000 -2.500000 0.000000 X207 7383.000000 2.500000 0.000000 X208 7258.000000 2.500000 0.000000 X209 7508.000000 -2.500000 0.000000 X210 7633.000000 -2.500000 0.000000 X211 7633.000000 2.500000 0.000000 X212 7508.000000 2.500000 0.000000 X213 7758.000000 -2.500000 0.000000 X214 7883.000000 -2.500000 0.000000 X215 7883.000000 2.500000 0.000000 X216 7758.000000 2.500000 0.000000 X217 8008.000000 -2.500000 0.000000 X218 8133.000000 -2.500000 0.000000 X219 8133.000000 2.500000 0.000000 X220 8008.000000 2.500000 0.000000 X221 8258.000000 -2.500000 0.000000 X222 8383.000000 -2.500000 0.000000 X223 8383.000000 2.500000 0.000000 X224 8258.000000 2.500000 0.000000 X225 8508.000000 -2.500000 0.000000 X226 8633.000000 -2.500000 0.000000 X227 8633.000000 2.500000 0.000000 X228 8508.000000 2.500000 0.000000 X229 8758.000000 -2.500000 0.000000 X230 8883.000000 -2.500000 0.000000 X231 8883.000000 2.500000 0.000000 X232 8758.000000 2.500000 0.000000 X233 9008.000000 -2.500000 0.000000 X234 9133.000000 -2.500000 0.000000 X235 9133.000000 2.500000 0.000000 X236 9008.000000 2.500000 0.000000 X237 9258.000000 -2.500000 0.000000 X238 9383.000000 -2.500000 0.000000 X239 9383.000000 2.500000 0.000000 X240 9258.000000 2.500000 0.000000 X241 9508.000000 -2.500000 0.000000 X242 9633.000000 -2.500000 0.000000 X243 9633.000000 2.500000 0.000000 X244 9508.000000 2.500000 0.000000 X245 9758.000000 -2.500000 0.000000 X246 9883.000000 -2.500000 0.000000 X247 9883.000000 2.500000 0.000000 X248 9758.000000 2.500000 0.000000 X249 10008.000000 -2.500000 0.000000 X250 10133.000000 -2.500000 0.000000 X251 10133.000000 2.500000 0.000000 X252 10008.000000 2.500000 0.000000 X253 10258.000000 -2.500000 0.000000 X254 10383.000000 -2.500000 0.000000 X255 10383.000000 2.500000 0.000000 X256 10258.000000 2.500000 0.000000 X257 10508.000000 -2.500000 0.000000 X258 10633.000000 -2.500000 0.000000 X259 10633.000000 2.500000 0.000000 X260 10508.000000 2.500000 0.000000 X261 10758.000000 -2.500000 0.000000 X262 10883.000000 -2.500000 0.000000 X263 10883.000000 2.500000 0.000000 X264 10758.000000 2.500000 0.000000 X265 11008.000000 -2.500000 0.000000 X266 11133.000000 -2.500000 0.000000 X267 11133.000000 2.500000 0.000000 X268 11008.000000 2.500000 0.000000 X269 11258.000000 -2.500000 0.000000 X270 11383.000000 -2.500000 0.000000 X271 11383.000000 2.500000 0.000000 X272 11258.000000 2.500000 0.000000 X273 11508.000000 -2.500000 0.000000 X274 11633.000000 -2.500000 0.000000 X275 11633.000000 2.500000 0.000000 X276 11508.000000 2.500000 0.000000 X277 11758.000000 -2.500000 0.000000 X278 11883.000000 -2.500000 0.000000 X279 11883.000000 2.500000 0.000000 X280 11758.000000 2.500000 0.000000 Xblack 4 1 2 3 4 Xwhite 4 5 6 7 8 Xwhite 4 9 10 11 12 Xwhite 4 13 14 15 16 Xwhite 4 17 18 19 20 Xwhite 4 21 22 23 24 Xwhite 4 25 26 27 28 Xwhite 4 29 30 31 32 Xwhite 4 33 34 35 36 Xwhite 4 37 38 39 40 Xwhite 4 41 42 43 44 Xwhite 4 45 46 47 48 Xwhite 4 49 50 51 52 Xwhite 4 53 54 55 56 Xwhite 4 57 58 59 60 Xwhite 4 61 62 63 64 Xwhite 4 65 66 67 68 Xwhite 4 69 70 71 72 Xwhite 4 73 74 75 76 Xwhite 4 77 78 79 80 Xwhite 4 81 82 83 84 Xwhite 4 85 86 87 88 Xwhite 4 89 90 91 92 Xwhite 4 93 94 95 96 Xwhite 4 97 98 99 100 Xwhite 4 101 102 103 104 Xwhite 4 105 106 107 108 Xwhite 4 109 110 111 112 Xwhite 4 113 114 115 116 Xwhite 4 117 118 119 120 Xwhite 4 121 122 123 124 Xwhite 4 125 126 127 128 Xwhite 4 129 130 131 132 Xwhite 4 133 134 135 136 Xwhite 4 137 138 139 140 Xwhite 4 141 142 143 144 Xwhite 4 145 146 147 148 Xwhite 4 149 150 151 152 Xwhite 4 153 154 155 156 Xwhite 4 157 158 159 160 Xwhite 4 161 162 163 164 Xwhite 4 165 166 167 168 Xwhite 4 169 170 171 172 Xwhite 4 173 174 175 176 Xwhite 4 177 178 179 180 Xwhite 4 181 182 183 184 Xwhite 4 185 186 187 188 Xwhite 4 189 190 191 192 Xwhite 4 193 194 195 196 Xwhite 4 197 198 199 200 Xwhite 4 201 202 203 204 Xwhite 4 205 206 207 208 Xwhite 4 209 210 211 212 Xwhite 4 213 214 215 216 Xwhite 4 217 218 219 220 Xwhite 4 221 222 223 224 Xwhite 4 225 226 227 228 Xwhite 4 229 230 231 232 Xwhite 4 233 234 235 236 Xwhite 4 237 238 239 240 Xwhite 4 241 242 243 244 Xwhite 4 245 246 247 248 Xwhite 4 249 250 251 252 Xwhite 4 253 254 255 256 Xwhite 4 257 258 259 260 Xwhite 4 261 262 263 264 Xwhite 4 265 266 267 268 Xwhite 4 269 270 271 272 Xwhite 4 273 274 275 276 Xwhite 4 277 278 279 280 *-*-END-of-./V/test/fullrwy-*-* echo x - ./V/test/hold sed 's/^X//' >./V/test/hold <<'*-*-END-of-./V/test/hold-*-*' XF-16-fighter X122 11 X1 -18.165 0 0 X2 -18.165 -1.191 0 X3 -15.187 -2.085 0 X4 -13.698 -2.382 0 X5 -17.272 -2.382 0 X6 -17.272 -3.573 0 X7 -10.923 -3.573 0 X8 -4.169 -3.573 0 X9 -4.169 -4.765 0 X10 5.598 -4.765 0 X11 18.463 -2.144 0 X12 18.939 -1.787 0 X13 22.274 -1.489 0 X14 24.895 -1.191 0 X15 27.992 0 0 X16 -6.551 -3.573 0 X17 -6.551 -15.485 0 X18 0.357 -15.485 0 X19 0.357 -15.187 0 X20 -2.978 -15.008 0 X21 5.598 -4.765 0 X22 -4.169 -4.765 0 X23 -4.169 -3.573 0 X24 -17.272 -3.573 0 X25 -17.272 -8.934 0.893 X26 -15.187 -8.934 0.893 X27 -10.923 -3.573 0 X28 27.992 0 0 X29 24.895 1.191 0 X30 22.274 1.489 0 X31 18.939 1.787 0 X32 18.463 2.144 0 X33 5.598 4.765 0 X34 -4.169 4.765 0 X35 -4.169 3.573 0 X36 -10.923 3.573 0 X37 -17.272 3.573 0 X38 -17.272 2.382 0 X39 -13.698 2.382 0 X40 -15.187 2.085 0 X41 -18.165 1.191 0 X42 -18.165 0 0 X43 5.598 4.765 0 X44 -2.978 15.008 0 X45 0.357 15.187 0 X46 0.357 15.485 0 X47 -6.551 15.485 0 X48 -6.551 3.573 0 X49 -4.169 3.573 0 X50 -4.169 4.765 0 X51 -10.923 3.573 0 X52 -15.187 8.934 0.893 X53 -17.272 8.934 0.893 X54 -17.272 3.573 0 X55 27.992 0 0 X56 23.525 0 -1.191 X57 17.272 0 -2.382 X58 15.783 0 -3.812 X59 13.996 0 -4.169 X60 11.316 0 -4.05 X61 8.338 0 -3.335 X62 1.787 0 -2.382 X63 -4.169 0 -2.382 X64 -13.936 0 -1.906 X65 -15.128 0 -1.906 X66 -15.187 0 -1.787 X67 -18.165 0 -1.191 X68 -18.165 0 0 X69 -4.169 0 -2.382 X70 -10.125 0 -4.05 X71 -15.783 0 -10.482 X72 -19.654 0 -10.482 X73 -19.654 0 -9.529 X74 -19.654 0 -9.529 X75 -16.378 0 -3.573 X76 -16.378 0 -2.144 X77 -14.889 0 -2.382 X78 -13.936 0 -2.382 X79 -13.936 0 -1.906 X80 -18.165 0 0 X81 -18.165 0 1.191 X82 -15.187 0 2.085 X83 -13.698 0 2.263 X84 -2.68 0 2.382 X85 8.04 0 2.382 X86 12.507 0 2.263 X87 12.507 0 0.596 X88 19.952 0 0.596 X89 23.525 0 0.476 X90 27.992 0 0 X91 -3.551 0 -2.382 X92 -3.551 -3.871 -0.10 X93 -3.551 -15.485 0 X94 -3.551 -15.485 0.1065 X95 -3.551 -3.871 0.142 X96 -3.551 -2.58 0.2556 X97 -3.551 -2.387 1.818 X98 -3.551 -2.102 2.015 X99 -3.551 -1.03 2.251 X100 -3.551 0 2.282 X101 -3.551 1.03 2.251 X102 -3.551 2.102 2.015 X103 -3.551 2.387 1.818 X104 -3.551 2.58 0.2556 X105 -3.551 3.871 0.142 X106 -3.551 15.485 0.1065 X107 -3.551 15.485 0 X108 -3.551 3.871 -0.10 X109 13.996 0 -4.169 X110 13.996 -0.8932 -3.692 X111 13.996 -1.191 -2.978 X112 13.996 -1.251 -2.502 X113 13.996 -1.787 -1.311 X114 13.996 -3.054 0 X115 13.996 -1.583 0.3568 X116 13.996 0 0.596 X117 13.996 1.583 0.3568 X118 13.996 3.054 0 X119 13.996 1.787 -1.311 X120 13.996 1.251 -2.502 X121 13.996 1.191 -2.978 X122 13.996 0.8932 -3.692 Xgray 14 109 110 111 112 113 114 115 116 117 118 119 120 121 122 Xgray 18 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 Xgray 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Xgray 8 16 17 18 19 20 21 22 23 Xgray 4 24 25 26 27 Xgray 15 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Xgray 8 43 44 45 46 47 48 49 50 Xgray 4 51 52 53 54 Xgray 14 55 56 57 58 59 60 61 62 63 64 65 66 67 68 Xgray 11 69 70 71 72 73 74 75 76 77 78 79 Xgray 11 80 81 82 83 84 85 86 87 88 89 90 *-*-END-of-./V/test/hold-*-* echo x - ./fsim sed 's/^X//' >./fsim <<'*-*-END-of-./fsim-*-*' *-*-END-of-./fsim-*-* echo x - ./fsim/pm.c sed 's/^X//' >./fsim/pm.c <<'*-*-END-of-./fsim/pm.c-*-*' X/* X * xflight : an aerial combat simulator for X X * X * Written by Riley Rainey, riley@mips.com X * X * Permission to use, copy, modify and distribute (without charge) this X * software, documentation, images, etc. is granted, provided that this X * comment and the author's name is retained. X * X */ X X#include <stdio.h> X#include <math.h> X#include "pm.h" X Xint debug = 0; X X/* X * A Flight Simulator X * X * Riley Rainey X */ X X/* X * We keep a table of atmospheric constants for different altitudes. X * These values are important to flight calculations. X */ X Xstruct { X double alt; /* altitude in feet */ X double rho; /* rho value (air density) */ X double speedOfSound; /* speed of sound in feet per second */ X } *rhop, rhoTable[] = { X 0.0, 23.77, 1116.9, X 2.0, 22.41, 1109.2, X 4.0, 21.11, 1101.4, X 6.0, 19.87, 1093.6, X 8.0, 18.68, 1085.7, X 10.0, 17.55, 1077.8, X 15.0, 14.96, 1057.7, X 20.0, 12.66, 1037.3, X 25.0, 10.65, 1016.4, X 30.0, 8.89, 995.1, X 35.0, 7.365, 973.3, X 40.0, 5.851, 968.5, X 50.0, 3.618, 968.5, X 60.0, 2.238, 968.5, X 80.0, 0.9065, 980.0, X 100.0, 0.3371, 1015.0, X 120.0, 0.1340, 1053.0, X 160.0, 0.02622, 1083.0, X 100000.0, 0.02622, 1083.0}; /* a large value for alt at the end */ X Xdouble deltaT; /* Update interval in seconds */ Xdouble halfDeltaTSquared; /* 0.5 * deltaT * deltaT */ Xdouble CM, CN; X X/* X * calcRho : Calculate air density by interpolation. X */ X Xdouble calcRho (alt) Xdouble alt; { X X double deltaAlt, b; X X alt = alt / 1000.0; X X for (rhop=rhoTable; alt>rhop->alt; ++rhop) ; X deltaAlt = (rhop+1)->alt - rhop->alt; X b = ((rhop+1)->rho - rhop->rho) / deltaAlt; X return (rhop->rho + b * (alt - rhop->alt)) / 10000.0; X X} X X/* X * calcCoefficients : Calculate CLift and friends X */ X Xvoid calcCoefficients (c, CLift, CDrag) Xcraft *c; Xdouble *CLift, *CDrag; { X X double CDAlpha, CDBeta; X X/* X * We used to interpolate these values, but now use several characteristic X * equations to compute these values for a given alpha value. The basic X * formulas are: X * X * X * C = C + (alpha * (C + sin(curFlap) * cFlap )) X * L LOrigin LSlope X * X * X * C = C + (C * Cos (alpha + C )) X * D DOrigin DFactor DPhase X * X * There are independent equations defining drag resulting from alpha X * and beta values. The hypoteneuse of those two values becomes the X * resultant CDrag value. X */ X X if (c->alpha < c->cinfo->CLNegStall || c->alpha > c->cinfo->CLPosStall) { X X *CLift = 0.0; X CM = c->cinfo->cmFactor * sin (c->alpha); X } X else { X *CLift = c->cinfo->CLOrigin + X (c->cinfo->CLSlope + sin (c->curFlap) * c->cinfo->cFlap) X * c->alpha; X CM = (c->alpha - c->Se * c->cinfo->effElevator) * c->cinfo->cmSlope; X } X X/* CDAlpha = c->cinfo->CDOrigin + c->cinfo->CDFactor * X cos (c->alpha + c->cinfo->CDPhase); X*/ X X CDAlpha = c->cinfo->CDOrigin + X *CLift * *CLift / (pi * c->cinfo->aspectRatio); X CDAlpha += sin (c->curSpeedBrake) * c->cinfo->cSpeedBrake; X X if (fabs(c->beta) > c->cinfo->betaStall) X CN = c->cinfo->cnFactor * sin (c->beta); X else X CN = (c->beta - c->Sr) * c->cinfo->cnSlope; X X CDBeta = c->cinfo->CDBOrigin + c->cinfo->CDBFactor * X cos (c->beta + c->cinfo->CDBPhase); X X *CDrag = sqrt (CDAlpha * CDAlpha + CDBeta * CDBeta); X X} X Xdouble heading (x) XVPoint *x; { X X double m; X X if (x->x == 0.0 && x->y == 0.0) X return 0.0; X X if ((m = atan2 (x->y, x->x)) < 0.0) X return (pi * 2.0 + m); X else X return m; X} X Xvoid pitchAndRoll (x, y, p, r) XVPoint *x; XVPoint *y; Xdouble *p; Xdouble *r; { X X double h; X X h = sqrt (x->x * x->x + x->y * x->y); X/* X * Is all this needed? X */ X if (h == 0.0) X if (x->z > 0.0) X *p = pi * 0.5; X else X *p = - pi * 0.5; X else X *p = atan2 (x->z, h); X X h = sqrt (y->x * y->x + y->y * y->y); X *r = atan2 (y->z, h); X} X Xvoid craftToGround (c, p, g) Xcraft *c; XVPoint *p; XVPoint *g; { X X VTransform (p, &(c->trihedral), g); X X} X Xvoid calcGForces (c, f, w) Xcraft *c; XVPoint *f; Xdouble w; { X X VPoint t; X X t = *f; X t.z -= w; X X VTransform (&t, &(c->Itrihedral), &(c->G)); X c->G.x = - c->G.x / w; X c->G.y = - c->G.y / w; X c->G.z = - c->G.z / w; X} X Xvoid calcAlphaBeta (c, alpha, beta) Xcraft *c; Xdouble *alpha, *beta; { X X VPoint C; X double h; X X if (mag(c->Cg) > 0.0) { X VTransform (&(c->Cg), &(c->Itrihedral), &C); X *alpha = atan2 (C.z, C.x); X h = sqrt (C.z * C.z + C.x * C.x); X *beta = atan2 (C.y, h); X } X else { X *alpha = 0.0; X *beta = 0.0; X } X X} X X/* X * buildEulerMatrix : Build a transformation matrix based on the supplied X * euler angles. X */ X Xvoid buildEulerMatrix (roll, pitch, heading, m) Xdouble roll, pitch, heading; XVMatrix *m; { X X VIdentMatrix (m); X if (roll != 0.0) X VRotate (m, XRotation, roll); X if (pitch != 0.0) X VRotate (m, YRotation, -pitch); X if (heading != 0.0) X VRotate (m, ZRotation, heading); X} X Xint flightCalculations (c) Xcraft *c; { X X double q, CLift, CDrag; X double FLift, FDrag, FWeight; X double Vmag, D, angle; X double ar, ap, aq, cosR, sinR; X double deltaRoll, deltaPitch, deltaYaw; X double muStatic, muKinetic; X double ke, be; X VPoint F, Fg, V, tmpPt, r; X VMatrix turn, tmpMatrix, mtx; X int positionUpdated = 0; X X c->prevSg = c->Sg; X X c->rho = calcRho (-(c->Sg.z)); X calcAlphaBeta(c, &(c->alpha), &(c->beta)); X X/* X * A note about thrust: Normal thrust deminishes in proportion to the decrease in X * air density. Afterburners are not affectected in this way. The following formula X * approximates this effect. X */ X X c->curThrust = calcThrust(c); X calcCoefficients (c, &CLift, &CDrag); X X if (debug) X printf ("alpha = %g, beta = %g\nCL = %g, CD = %g\n", RADtoDEG(c->alpha), X RADtoDEG(c->beta), CLift, CDrag); X X X/* X * Compute the resultant force vector on the aircraft. X */ X X Vmag = mag(c->Cg); X q = c->rho * c->cinfo->wingS * Vmag * Vmag * 0.5; X FLift = CLift * q; X FDrag = CDrag * q; X X if (debug) { X printf ("rho = %g, FLift = %g, FDrag = %g\n", c->rho, FLift, FDrag); X printf ("FThrust = %g\n", c->curThrust); X } X X F.x = c->curThrust - sin(c->alpha) * cos(c->beta) * FLift - X cos(c->alpha) * cos(c->beta) * FDrag; X F.y = sin(c->alpha) * sin(c->beta) * FLift - sin(c->alpha) * sin(c->beta) * X FDrag; X F.z = -cos(c->alpha) * cos(c->beta) * FLift - sin(c->alpha) * cos(c->beta) * X FDrag; X X/* X * Get ground friction coefficients X */ X X if (c->groundContact) X if (c->flags & FL_BRAKES) { X muStatic = c->cinfo->muBStatic; X muKinetic = c->cinfo->muBKinetic; X } X else { X muStatic = c->cinfo->muStatic; X muKinetic = c->cinfo->muKinetic; X } X X/* X * Now calculate changes in position (Sg) and velocity (Cg). X */ X X if (Vmag > c->cinfo->maxNWS || c->groundContact == 0) X c->flags &= ~FL_NWS; X else X c->flags |= FL_NWS; X X if (c->flags & FL_NWS) { X X c->curNWDef = c->Sa * c->cinfo->maxNWDef; X X if (c->curNWDef != 0.0) { X X r.x = c->cinfo->gearD2; X r.y = c->cinfo->gearD1 / tan(c->curNWDef); X r.z = 0.0; X angle = Vmag / r.y * deltaT; X X/* X * Nose wheel steering mode. X * Relocate the aircraft and its trihedral (this code assumes that the X * plane is rolling on a flat surface (i.e. z is constant). X */ X X tmpPt = r; X VTransform(&tmpPt, &(c->trihedral), &r); X X VIdentMatrix (&turn); X turn.m[0][3] = - c->Sg.x - r.x; X turn.m[1][3] = - c->Sg.y - r.y; X turn.m[2][3] = - c->Sg.z; X VRotate (&turn, ZRotation, angle); X turn.m[0][3] = turn.m[0][3] + c->Sg.x + r.x; X turn.m[1][3] = turn.m[1][3] + c->Sg.y + r.y; X turn.m[2][3] = turn.m[2][3] + c->Sg.z; X VTransform (&(c->Sg), &turn, &tmpPt); X c->Sg = tmpPt; X X VIdentMatrix (&turn); X VRotate (&turn, ZRotation, angle); X tmpMatrix = c->trihedral; X VMatrixMult (&tmpMatrix, &turn, &(c->trihedral)); X VTransform (&(c->Cg), &turn, &tmpPt); X c->Cg = tmpPt; X X transpose (&c->trihedral, &c->Itrihedral); X X addHeading (c, angle); X positionUpdated = 1; X } X X craftToGround (c, &F, &Fg); X FWeight = c->cinfo->emptyWeight + c->fuel; X X if ((c->fuel -= fuelUsed(c)) <= 0.0) { X c->fuel = 0.0; X c->curThrust = 0.0; X c->throttle = 0; X } X X Fg.z += FWeight; X X/* X * Factor in ground friction for both static and moving planes. X */ X X if (c->Cg.x + c->Cg.y == 0.0 && sqrt (Fg.x*Fg.x + Fg.y*Fg.y) <= X muStatic * Fg.z) { X Fg.x = 0.0; X Fg.y = 0.0; X } X else { X X/* X * Okay, the plane is moving. Quantify the current kinetic energy of the X * moving craft and add the energy added this period by all forces EXCEPT X * ground friction (we'll name this "ke"). If the energy removed by the friction X * force is greater than ke, then the craft will stop sometime during this X * period -- we won't bother to calculate exactly where we stop; just zero out X * the x and y force and velocity components. X */ X X ke = 0.5 * FWeight / a * sqrt (c->Cg.x * c->Cg.x + X c->Cg.y * c->Cg.y); X ke += pow(sqrt(Fg.x * Fg.x + Fg.y * Fg.y), 2.0) * X halfDeltaTSquared * a / FWeight; X be = pow(Fg.z * muKinetic, 2.0) * halfDeltaTSquared * a / FWeight; X if (be >= ke) { X Fg.x = 0.0; X Fg.y = 0.0; X c->Cg.x = 0.0; X c->Cg.y = 0.0; X } X else { X X/* X * Getting to this point means that we're rolling along the ground (and not stopping) X * -- make sure our roll is zeroed, then cancel the local Y-component of our X * velocity vector (tires don't roll sideways) and then calculate the drag X * contributed by the rolling wheels. X */ X X c->curRoll = 0.0; X VTransform (&(c->Cg), &(c->Itrihedral), &V); X V.y = 0.0; X VTransform (&V, &(c->trihedral), &(c->Cg)); X D = Fg.z * muKinetic; X Vmag = mag (c->Cg); X if (Vmag > 0.0) { X Fg.x -= D * c->Cg.x / Vmag; X Fg.y -= D * c->Cg.y / Vmag; X Fg.z -= D * c->Cg.z / Vmag; X } X } X } X X X/* Nose wheel steering is only active when we cannot lift off -- cancel z */ X X Fg.z = 0.0; X calcGForces (c, &Fg, FWeight); X X } X else { X X/* X * Resolve moments X */ X X ap = fsign (c->p); X aq = fsign (c->q); X ar = fsign (c->r); X if (c->groundContact == 0) { X ap = (c->Sa * c->cinfo->effAileron * q - c->cinfo->LDamp * X ap * c->p * c->p * 0.5) / c->cinfo->I.m[0][0]; X ap += c->beta * c->cinfo->CLbeta * q / c->cinfo->I.m[0][0]; X } X else X ap = 0.0; X X aq = (CM * q - c->cinfo->MDamp * aq * c->q * c->q * 0.5) / X c->cinfo->I.m[1][1]; X ar = (CN * q - c->cinfo->NDamp * ar * c->r * c->r * 0.5) / X c->cinfo->I.m[2][2]; X X if (debug) X printf ("ap = %g, aq = %g, ar = %g\n", ap, aq, ar); X X deltaRoll = c->p * deltaT + ap * halfDeltaTSquared; X deltaPitch = c->q * deltaT + aq * halfDeltaTSquared; X deltaYaw = c->r * deltaT + ar * halfDeltaTSquared; X c->p = c->p + ap * deltaT; X c->q = c->q + aq * deltaT; X c->r = c->r + ar * deltaT; X X cosR = cos (c->curRoll); X sinR = sin (c->curRoll); X X X c->curRoll += deltaRoll; X c->curHeading += sinR * deltaPitch + cosR * deltaYaw; X c->curPitch += cosR * deltaPitch - sinR * deltaYaw; X X/* X * Normalize picth and heading Euler angles X */ X X if (c->curPitch > pi / 2.0) { X c->curPitch = pi - c->curPitch; X c->curHeading = (c->curHeading > pi) ? X c->curHeading - pi : c->curHeading + pi; X c->curRoll = pi - c->curRoll; X } X else if (c->curPitch < -pi/2.0) { X c->curPitch = -pi - c->curPitch; X c->curHeading = (c->curHeading > pi) ? X c->curHeading - pi : c->curHeading + pi; X c->curRoll = pi - c->curRoll; X } X X if (c->curHeading < 0.0) { X c->curHeading += 2.0 * pi; X } X else if (c->curHeading > 2.0 * pi) { X c->curHeading -= 2.0 * pi; X } X X/* X * Compute transformation matrices X */ X X buildEulerMatrix (c->curRoll, c->curPitch, c->curHeading, &(c->trihedral)); X transpose (&c->trihedral, &c->Itrihedral); X X craftToGround (c, &F, &Fg); X FWeight = c->cinfo->emptyWeight + c->fuel; X X if ((c->fuel -= fuelUsed(c)) <= 0.0) { X c->fuel = 0.0; X c->curThrust = 0.0; X } X X Fg.z += FWeight; X X/* X * If we are on the ground, level the wings and compute wheel drag forces. Wheel X * drag always acts in the opposite direction of the velocity vector. X */ X X if (c->groundContact) { X c->curRoll = 0.0; X VTransform (&(c->Cg), &(c->Itrihedral), &V); X V.y = 0.0; X VTransform (&V, &(c->trihedral), &(c->Cg)); X D = Fg.z * muKinetic; X Vmag = mag (c->Cg); X Fg.x -= D * c->Cg.x / Vmag; X Fg.y -= D * c->Cg.y / Vmag; X Fg.z -= D * c->Cg.z / Vmag; X } X X if (debug) { X printf ("v = %g, Fg = { %g, %g, %g }\n", FPStoKTS(Vmag), X Fg.x, Fg.y, Fg.z); X printf ("F = { %g, %g, %g }\n", X F.x, F.y, F.z); X } X X X/* X * Are we on the ground without the prospect of gaining altitude? X * If so, cancel the vertical force component. X */ X X if (c->groundContact && Fg.z > 0.0) X Fg.z = 0.0; X X calcGForces (c, &Fg, FWeight); X X X } X X/* X * Update our position (in flight mode). X */ X X if (positionUpdated == 0) { X X c->Sg.x += c->Cg.x * deltaT + Fg.x / FWeight X * a * halfDeltaTSquared; X c->Sg.y += c->Cg.y * deltaT + Fg.y / FWeight X * a * halfDeltaTSquared; X c->Sg.z += c->Cg.z * deltaT + Fg.z / FWeight X * a * halfDeltaTSquared; X X } X X c->Cg.x += Fg.x / FWeight * a * deltaT; X c->Cg.y += Fg.y / FWeight * a * deltaT; X c->Cg.z += Fg.z / FWeight * a * deltaT; X X if (debug) { X printf ("Altitude = %g\n", -c->Sg.z); X printf ("Euler angles { %g, %g, %g }\n", RADtoDEG(c->curRoll), X RADtoDEG(c->curPitch), RADtoDEG(c->curHeading)); X printf ("Cg = { %g, %g, %g }\n", c->Cg.x, c->Cg.y, c->Cg.z); X printf ("Sg = { %g, %g, %g }\n", c->Sg.x, c->Sg.y, c->Sg.z); X X printf ("X = { %g, %g, %g }\n", c->trihedral.m[0][0], X c->trihedral.m[1][0], c->trihedral.m[2][0]); X printf ("Z = { %g, %g, %g }\n\n", c->trihedral.m[0][2], X c->trihedral.m[1][2], c->trihedral.m[2][2]); X } X X X/* X * Normalize the vertical position. If our altitude is now below our X * contact threshold, mark us as having "groundContact" and adjust the X * altitude. X */ X X if (c->Sg.z >= - c->cinfo->groundingPoint.z) { X c->groundContact = 1; X c->Sg.z = - c->cinfo->groundingPoint.z; X X/* X * If the vertical velocity component is too great, the plane has crashed ... X */ X X if (c->Cg.z > c->cinfo->crashC) X return 1; X else X c->Cg.z = 0.0; X X } X else { X c->groundContact = 0; X c->flags &= ~FL_NWS; X } X X X return 0; X} *-*-END-of-./fsim/pm.c-*-* echo x - ./fsim/pm.h sed 's/^X//' >./fsim/pm.h <<'*-*-END-of-./fsim/pm.h-*-*' X#include "manifest.h" X#include "eng.xbm" X#include "flaps0.xbm" X#include "flaps1.xbm" X#include "flaps2.xbm" X#include "flaps3.xbm" X#include "scale.h" X#include <Vlib.h> X X#define MAXSURFACE 8 X#define MAXPLAYERS 16 X#define MAXPROJECTILES MAXPLAYERS*8 X#define MAXCRAFTTYPES 16 X#define STATIONS 9 X#define WEAPONTYPES 4 X Xtypedef struct _viewer { X struct _viewer *next; X Display *dpy; /* display for this user */ X Window win; /* window for this user */ X Window twin, rwin; /* threat window and radar window */ X GC gc; /* GC for drawing */ X XFontStruct *font; /* HUD font */ X XFontStruct *rfont; /* radar font */ X Viewport *v; /* Viewport for out-of-cockpit views */ X Pixmap eng; /* Engine "RPM" gauge */ X Pixmap flap[5]; /* flap setting indicators */ X int cn; /* X connection fd */ X int width, height; /* width & height of viewing window */ X int xCenter, yCenter; /* center of viewing window */ X int ftw, fth; /* HUD font width & height */ X int rftw, rfth; X int radarWidth; X int radarHeight; X scaleControl altScale; /* altitude scale control */ X scaleControl velScale; /* airspeed scale control */ X scaleControl hdgScale; /* heading scale control */ X int TEWSx, TEWSy; /* location of center of TEWS display */ X int TEWSSize; /* size of TEWS display, in pixels */ X } viewer; X X/* X * This structure describes a class of aircraft. X */ X Xtypedef struct { X char *name; /* name of aircraft class */ X X double aspectRatio; /* wing aspect ratio */ X X double CLOrigin, CLSlope; /* Defines the CL characteristic eqn */ X double CLNegStall, CLPosStall; X double betaStall; /* Stall angle for rudder */ X double CDOrigin, CDFactor; /* Defines the CD Characteristic eqn */ X double CDPhase; X double CDBOrigin, CDBFactor; /* Defines the CD Characteristic eqn */ X double CDBPhase; X double CLbeta; /* coefficient rolling moment due to sideslip */ X double CMOrigin, CMFactor; /* Defines the CM Characteristic eqn */ X double CNOrigin, CNFactor; /* Defines the CM Characteristic eqn */ X X double effAileron; /* Aileron effectiveness */ X double effElevator; /* Elevator effectiveness */ X double effRudder; /* Rudder effectiveness */ X X VMatrix I; /* Moments of Intertia about CG in [xyz] */ X double LDamp; /* roll damping factor */ X double MDamp; /* pitch damping factor */ X double NDamp; /* yaw damping factor */ X double cmSlope; X double cmFactor; X double cnSlope; X double cnFactor; X X double maxFlap; /* maximum flap setting (radians) */ X double cFlap; /* lift coefficient of flaps */ X double flapRate; /* flap movement rate (radians/sec) */ X X double maxSpeedBrake; /* maximum speed brake setting (radians) */ X double cSpeedBrake; /* drag coefficient of 90 degree speed brake */ X double speedBrakeRate; /* rate of speed brake movement (radians/sec) */ X double speedBrakeIncr; /* number of radians than one keystroke moves brake */ X X double wingS; /* wing area (ft^2) */ X double emptyWeight; /* empty weight (lbs.) */ X double maxFuel; /* maximum internal fuel (lbs.) */ X X double maxThrust; /* maximum thrust, military power (lb) */ X double maxABThrust; /* maximum thrust, afterburner on (lb) */ X double spFuelConsump; /* specific fuel consump(lb fuel/lb T x hr)*/ X double spABFuelConsump; X VPoint groundingPoint; /* hypothetical single pt of contact w/ground */ X VPoint viewPoint; /* pilot's viewing location wrt CG */ X double crashC; /* maximum tolerable touchdown z component */ X X double muStatic; /* static coefficient of friction no-brakes */ X double muKinetic; /* moving coefficient of friction no-brakes */ X double muBStatic; /* static brakes-on */ X double muBKinetic; /* kinetic brakes-on */ X X double maxNWDef; /* maximum nosewheel deflection (radians) */ X double NWIncr; /* deflection for each unit */ X double maxNWS; /* maximum NWS velocity */ X double gearD1; /* x station wrt nose gear of main gear */ X double gearD2; /* x station wrt CG of main gear */ X double armDelay; /* arming delay for missiles */ X double radarOutput; /* radar output (watts) */ X double radarTRange; /* tracking radar range */ X double radarDRange; /* detection radar range */ X double TEWSThreshold; X X int sCount; /* number of weapon stations */ X VPoint wStation[STATIONS]; /* weapon's stations (launch points) */ X X int (*placeProc)(); /* object placement procedure (for special craft) */ X VObject *object; /* what it looks like */ X } craftType; X Xtypedef struct _wdsc { X int mask; /* key mask */ X int (*select)(); /* weapon select procedure */ X int (*update)(); /* per tick update procedure */ X int (*display)(); /* display update procedure */ X int (*firePress)(); /* fire button pressed procedure */ X int (*fireRelease)(); /* fire button released */ X craftType *w; /* description of this weapon */ X } weaponDesc; X Xtypedef struct _wctl { X int type; /* type of weapon at this station */ X int info; /* extra info (weapon specific) */ X int info2; /* " " */ X int info3; /* " " */ X } weaponStation; X X#define WK_M61A1 0x01 /* M-61A1 Vulcan 20mm cannon */ X#define WK_AIM9M 0x02 /* Sidewinder missile */ X X/* X * This structure describes a particular instance of aircraft. X */ X Xtypedef struct _craft { X int index; /* index number of this element in the vector */ X int type; /* craft type */ X int team; /* team number */ X double createTime; /* creation time of this craft */ X viewer *vl; /* list of viewers */ X VMatrix trihedral; /* transforms [x, y, z] to Geoparallel */ X /* x = forward, y=right wing, z=down */ X /* does not include origin translation */ X VMatrix Itrihedral; /* transforms geoparallel to [x, y, z] */ X VPoint C; /* Velocity vector in [x, y, z] */ X VPoint Cg; /* Velocity vector in Geoparallel system */ X VPoint Sg; /* Position in Geoparallel system */ X double rho; /* current rho value */ X VPoint G; /* g-force vector in acft system */ X VPoint prevSg; /* last interval's Sg value */ X double p, q, r; /* roll, pitch, and yaw rates */ X double Se, Sa, Sr; /* control settings */ X double curHeading, curPitch, curRoll; /* Euler angles for acft */ X double curThrust; /* Current thrust value */ X double curFlap; /* current flap setting (radians) */ X double flapSetting; /* current target flap setting (radians) */ X double curSpeedBrake; /* current speed brake position (radians) */ X double speedBrakeSetting; /* current target speed brake setting (radians) */ X int throttle; /* thrust setting 0 - 32768 */ X double alpha, beta; /* angles of attack and sideslip */ X double fuel; /* current fuel on board */ X int groundContact; /* 1, when on ground */ X int flags; /* flag word */ X int radarMode; /* radar mode */ X double curNWDef; /* Current nosewheel deflection (radians) */ X int armFuse; /* missile arming countdown */ X craftType *cinfo; /* General craft information */ X double order; /* temporary value used to sort craft */ X struct _craft *next; /* next craft in sorted list */ X VPoint viewDirection; /* where the pilot is currently looking */ X VPoint viewUp; /* the "up" direction of the pilot's view */ X X char name[32]; /* logname of player */ X char display[32]; /* display name of player */ X X short curRadarTarget; /* our primary "threat" */ X double targetDistance; /* distance to primary target */ X double targetClosure; /* closure rate on primary target */ X short relValid[MAXPLAYERS]; X VPoint relPos[MAXPLAYERS]; X double rval[MAXPLAYERS];/* radar strength seen by us from other craft */ X /* relative positions of possible targets */ X char *leftHUD[3]; /* strings in lower left corner of HUD */ X /* (reserved for weapons' status */ X char *rightHUD[3]; /* strings in lower right corner of HUD */ X /* (reserved for future use) */ X int curWeapon; /* index of currently selected weapon */ X weaponStation station[STATIONS]; /* what's at each weapon station */ X } craft; X X/* X * We'll use some defines to reduce the storage required for the craft X * (unions would be cleaner, perhaps). X */ X X#define rounds curRadarTarget X#define tracerMod groundContact X#define tracerVal radarMode X X/* X * Craft type definitions X */ X X#define CT_FREE 0 /* an unused craft entry */ X#define CT_PLANE 1 /* a player */ X#define CT_MISSILE 2 /* an air to air missile */ X#define CT_CANNON 3 /* a stream of cannon fire */ X#define CT_SURFACE 4 /* surface object (e.g. a runway) */ X#define CT_OBSERVER 5 /* a non-player "watcher" */ X#define CT_DRONE 6 /* a target drone */ X X#define FL_RECORD 0x01 /* activate recording function */ X#define FL_AFTERBURNER 0x02 /* afterburner state */ X#define FL_BRAKES 0x04 /* wheel brake state */ X#define FL_NWS 0x08 /* nose-wheel steering mode */ X#define FL_HAS_GYRO 0x10 /* missile is gyroscope equiped */ X X#define RM_OFF 0 /* radar is off */ X#define RM_STANDBY 1 /* standby */ X#define RM_GUN_DIRECTOR 2 /* gun director mode */ X#define RM_HUD 3 /* 20 degree scan */ X#define RM_NORMAL 4 /* 65 degree scan */ X Xint recordCount; /* number of players recording info */ Xdouble curTime; /* current time */ X Xcraft stbl[MAXSURFACE]; /* table of surface objects */ Xcraft ptbl[MAXPLAYERS]; /* table of player aircraft */ Xcraft mtbl[MAXPROJECTILES]; /* table of missiles and cannon streams */ XweaponDesc wtbl[WEAPONTYPES]; /* descriptions of different weapons */ X Xdouble deltaT; /* Update interval in seconds */ Xdouble halfDeltaTSquared; /* 0.5 * deltaT * deltaT */ Xint HUDPixel; /* index of HUD color in viewport(s) */ XVColor *HUDColor; Xint whitePixel; /* index of white in viewport(s) */ XVColor *whiteColor; /* white in viewport(s) */ Xint blackPixel; /* index of black in viewport(s) */ XVColor *blackColor; /* black in viewport(s) */ XVColor *groundColor; /* ground color in viewport(s) */ X X#define a 32.15 /* acceleration due to gravity (fps^2) */ X#define pi 3.1415927 X#define mag(v) (sqrt (v.x * v.x + v.y * v.y + v.z * v.z)) X#define calcAplha(p) (atan2 (p.C.z, p.C.x)) X#define calcBeta(p) (atan2 (p.C.y, sqrt (pow (mag(p.C), 2.0) \ X + p.C.y * p.C.y))) X#define unitVector(v) {double m; m = mag(v); \ X v.x /= m; v.y /= m; v.z /= m; } X X#define addHeading(c, dh) {c->curHeading = c->curHeading + dh; \ X if (c->curHeading > pi * 2.0 || c->curHeading <= 0.0) \ X c->curHeading = (c->curHeading <= 0.0) ? c->curHeading + \ X 2.0 * pi : c->curHeading - 2.0 * pi; } X X#define NM 6076.115 X#define FPStoMPH(v) (v / 5280.0 * 3600.0) X#define FPStoKTS(v) (v / 6076.115 * 3600.0) X#define RADtoDEG(a) (a * 180.0 / pi) X#define DEGtoRAD(a) (a * pi / 180.0) X#define fsign(d) (d < 0 ? -1.0 : 1.0) X#define calcThrust(c) ((((c->flags & FL_AFTERBURNER) ? \ X c->cinfo->maxABThrust : c->cinfo->maxThrust) - \ X c->cinfo->maxThrust * (1.0 - (c->rho / 0.002377))) * \ X (double) c->throttle / 32768.0) X#define fuelUsed(c) (((c->flags & FL_AFTERBURNER) ? \ X c->cinfo->spABFuelConsump : c->cinfo->spFuelConsump) * c->curThrust * \ X deltaT / 3600.0) X X#define VIEW_WINDOW_HEIGHT 500 X#define VIEW_WINDOW_WIDTH 1200 X#define RADAR_WINDOW_WIDTH 200 X#define RADAR_WINDOW_HEIGHT 200 X#define RADAR_X (1200/2-200/2) X#define RADAR_Y (500) X#define TEWS_X (1200/2-200/2-100) X#define TEWS_Y (VIEW_WINDOW_HEIGHT+60) X#define TEWS_SIZE 81 X#define FS_WINDOW_WIDTH (VIEW_WINDOW_WIDTH) X#define FS_WINDOW_HEIGHT (VIEW_WINDOW_HEIGHT+RADAR_WINDOW_HEIGHT) X#define FLAP_X (1200/2-200/2-95) X#define FLAP_Y (FS_WINDOW_HEIGHT-53) X#define DESIGNATOR_SIZE 40 X X/* X * Location of the center of the engine RPM gauge. X */ X X#define ENG_X (FS_WINDOW_WIDTH-400) X#define ENG_Y (VIEW_WINDOW_HEIGHT+60) X X#define ALT_ORG_X 760 X#define ALT_ORG_Y 360 X#define ALT_LENGTH 199 X#define ALT_ORIENT orientRight X#define ALT_SCALE (1700.0 / (double) ALT_LENGTH) X#define ALT_INDEX_SIZE 30 X#define ALT_MIN_INTERVAL 100 X#define ALT_MIN_SIZE 8 X#define ALT_MAJ_INTERVAL 500 X#define ALT_MAJ_SIZE 15 X#define ALT_DIVISOR 1000.0 X#define ALT_FORMAT "%4.3g" X X#define VEL_ORG_X 440 X#define VEL_ORG_Y 360 X#define VEL_LENGTH ALT_LENGTH X#define VEL_ORIENT 0 X#define VEL_SCALE (170.0 / (double) VEL_LENGTH) X#define VEL_INDEX_SIZE 30 X#define VEL_MIN_INTERVAL 10 X#define VEL_MIN_SIZE 8 X#define VEL_MAJ_INTERVAL 50 X#define VEL_MAJ_SIZE 15 X#define VEL_DIVISOR 10.0 X#define VEL_FORMAT "%3.3g" X X#define HDG_ORG_X (VIEW_WINDOW_WIDTH / 2 - (6*30+1) / 2) X#define HDG_ORG_Y 400 X#define HDG_LENGTH (6*30+1) X#define HDG_ORIENT 0 X#define HDG_SCALE (3000.0 / (double) VEL_LENGTH) X#define HDG_INDEX_SIZE 10 X#define HDG_MIN_INTERVAL 500 X#define HDG_MIN_SIZE 5 X#define HDG_MAJ_INTERVAL 1000 X#define HDG_MAJ_SIZE 10 X#define HDG_DIVISOR 1000.0 X#define HDG_FORMAT "%2.2g" *-*-END-of-./fsim/pm.h-*-* echo x - ./fsim/doViews.c sed 's/^X//' >./fsim/doViews.c <<'*-*-END-of-./fsim/doViews.c-*-*' X/* X * xflight : an aerial combat simulator for X X * X * Written by Riley Rainey, riley@mips.com X * X * Permission to use, copy, modify and distribute (without charge) this X * software, documentation, images, etc. is granted, provided that this X * comment and the author's name is retained. X * X */ X X#include "pm.h" X#include <math.h> X X#define lim ((double) -1052500.0) X Xstatic VPoint horiz[4] = {{-lim, -lim, (double) 0.0}, X {-lim, lim, (double) 0.0}, X { lim, lim, (double) 0.0}, X { lim, -lim, (double) 0.0}}; X X#define MAXPOLYGONS 8192 X Xstatic VPolygon *poly[MAXPOLYGONS]; X Xstatic craft *sortList; X Xvoid insertCraft(); X Xvoid doViews() { X X int polyCount; X register unsigned long curPixel; X register craft *c, *p; X register int i, j, k; X register viewer *q; X VPoint vp, fwd, up; X VPoint horiz[4]; X int mono; X X/* X * Build a vector of polygons for all objects in the scene. X * X * This vector should be ordered from "most distant" to "closest" so that X * the final display will end up correct. Rather than generalizing this X * to death, we'll use a few heuristics to get very close to what we need: X * X * (0) Build a single polygon to represent the ground. X * (1) Objects on the surface (stbl) are collected first. X * (2) Planes and projectiles (ptbl and mtbl) are first sorted in descending X * order by their distance from the observer and then polygons are X * collected. X */ X X X for ((i=0, c=ptbl); i<MAXPLAYERS; (++i, ++c)) { X X if (c->type == CT_DRONE) X doDroneRadar (c); X X if (c->type != CT_PLANE) X continue; X X/* X * Set up the eyespace transformation for this viewpoint X */ X X VTransform (&c->cinfo->viewPoint, &(c->trihedral), &vp); X vp.x += c->Sg.x; X vp.y += c->Sg.y; X vp.z += c->Sg.z; X X VTransform (&c->viewDirection, &(c->trihedral), &fwd); X fwd.x += vp.x; X fwd.y += vp.y; X fwd.z += vp.z; X X VTransform (&c->viewUp, &(c->trihedral), &up); X up.x += vp.x; X up.y += vp.y; X up.z += vp.z; X X VGetEyeSpace (c->vl->v, vp, fwd, up); X X polyCount = 0; X sortList = (craft *) NULL; X X horiz[0].x = c->Sg.x - lim; X horiz[0].y = c->Sg.y - lim; X horiz[0].z = 0.0; X horiz[1].x = c->Sg.x - lim; X horiz[1].y = c->Sg.y + lim; X horiz[1].z = 0.0; X horiz[2].x = c->Sg.x + lim; X horiz[2].y = c->Sg.y + lim; X horiz[2].z = 0.0; X horiz[3].x = c->Sg.x + lim; X horiz[3].y = c->Sg.y - lim; X horiz[3].z = 0.0; X X poly[0] = VCreatePolygon (4, &horiz[0], groundColor); X polyCount = 1; X X for ((j=0, p=stbl); j<MAXSURFACE; (++j, ++p)) { X if (p->type != CT_FREE) X/* placeCraft (p, poly, &polyCount); */ X insertCraft (c, p); X } X X for ((j=0, p=ptbl); j<MAXPLAYERS; (++j, ++p)) { X if (p->type != CT_FREE && p != c) { X insertCraft (c, p); X } X } X X for ((j=0, p=mtbl); j<MAXPROJECTILES; (++j, ++p)) { X if (p->type != CT_FREE) X insertCraft (c, p); X } X X for (p=sortList; p != (craft *) NULL; p=(craft *)p->next) X placeCraft (p, poly, &polyCount); X X/* X * Clip all polygons X */ X X for (j=0; j<polyCount; ++j) { X VTransformPolygon (poly[j], &(c->vl->v->eyeSpace)); X poly[j] = VClipPolygon(poly[j], c->vl->v->clipPoly); X } X X/* X * Display this image for each viewer associated with this craft X */ X X for (q=c->vl; q != NULL; q = q->next) { X X mono = q->v->flags & VPMono; X curPixel = -1; X for (j=0; j<polyCount; ++j) { X if (poly[j]) { X if (curPixel != (k=q->v->pixel[poly[j]->color->index])) { X XSetForeground (q->dpy, q->gc, k); X curPixel = k; X } X VFillPolygon (q->v, q->win, q->gc, poly[j]); X } X X } X X/* Draw Head-Up Display and instrument panel */ X X doHUD(c, q); X doRadar (c, q); X doTEWS (c, q); /* doRadar must be called first */ X doRPM(c, q); X X/* Expose the completed drawing */ X X VExposeBuffer (q->v, q->gc); X X/* X * Erase the un-displayed planes. X */ X X if (mono == 0) { X curPixel = *(q->v->pixel); X XSetForeground (q->dpy, q->gc, curPixel); X XFillRectangle (q->dpy, q->win, q->gc, 0, 0, q->width, q->height); X } X X } X X/* X * Release polygons X */ X X for (j=0; j<polyCount; ++j) X if (poly[j]) X VDestroyPolygon (poly[j]); X X } X} X X/* X * insertCraft : Insert a craft into sortList in descending order. X */ X Xvoid insertCraft (c, p) Xcraft *c, *p; { X X double dist, offset; X VPoint ds; X craft *q, *prev; X X/* X * Here's a kludge for you: to avoid polygon clipping, I'm going to X * cheat and hack a way to get ground objects to display properly. X * if the Z coordinate of an object is zero (i.e. on ground objects), X * I'll add a huge offset to their distance values to force them to be X * plotted first -- and in roughly their correct drawing order. X * X */ X X offset = (p->Sg.z == 0.0) ? 1000.0 * NM : 0.0; X X ds.x = p->Sg.x - c->Sg.x; X ds.y = p->Sg.y - c->Sg.y; X ds.z = p->Sg.z - c->Sg.z; X p->order = dist = mag (ds) + offset; X X if (sortList != (craft *) NULL) { X for ((q=sortList, prev=(craft *) NULL); q != (craft *) NULL;) { X if (q->order < dist) { X p->next = (struct _craft *) q; X if (prev == (craft *) NULL) X sortList = p; X else X prev->next = (struct _craft *) p; X break; X } X prev = q; X q = (craft *) q->next; X } X if (q == (craft *) NULL) { X prev->next = (struct _craft *) p; X p->next = (struct _craft *) NULL; X } X } X else { X sortList = p; X p->next = (struct _craft *) NULL; X } X} X Xint doHUD (c, u) Xcraft *c; Xviewer *u; { X X char buffer[80]; X int i, x, x1, y; X X if (c->viewDirection.x < 0.90) X return 0; X XSetFont (u->dpy, u->gc, u->font->fid); X XSetForeground (u->dpy, u->gc, u->v->pixel[HUDPixel]); X sprintf (buffer, "a=%.1f", RADtoDEG(c->alpha)); X x = 730 * u->width / VIEW_WINDOW_WIDTH; X y = 130 * u->height / VIEW_WINDOW_HEIGHT; X XDrawString (u->dpy, u->win, u->gc, x, y, buffer, strlen(buffer)); X X x1 = 410 * u->width / VIEW_WINDOW_WIDTH; X sprintf (buffer, "%4.1f", c->G.z); X XDrawString (u->dpy, u->win, u->gc, x1, y, buffer, strlen(buffer)); X X y = 390 * u->height / VIEW_WINDOW_HEIGHT; X sprintf (buffer, "%7d", (int)(-c->Cg.z * 60.0)); X XDrawString (u->dpy, u->win, u->gc, x, y, buffer, strlen(buffer)); X X x = 410 * u->width / VIEW_WINDOW_WIDTH; X doCompassScale (u->dpy, u->win, u->gc, &(u->hdgScale), RADtoDEG(c->curHeading)*100.0, X u->fth, u->ftw); X doScale (u->dpy, u->win, u->gc, &(u->altScale), -c->Sg.z, u->fth, u->ftw); X doScale (u->dpy, u->win, u->gc, &(u->velScale), FPStoKTS(mag(c->Cg)), X u->fth, u->ftw); X X sprintf (buffer, "%3d%% %s", (int)((double)c->throttle/327.68), X (c->flags & FL_AFTERBURNER) ? "AB" : ""); X XDrawString (u->dpy, u->win, u->gc, x, y, buffer, strlen(buffer)); X X x = 380 * u->width / VIEW_WINDOW_WIDTH; X y = 420 * u->height / VIEW_WINDOW_HEIGHT; X X doLadder (c, u); X X for (i=0; i<3; ++i) { X XDrawString (u->dpy, u->win, u->gc, x, y, c->leftHUD[i], X strlen (c->leftHUD[i])); X y += u->fth; X } X X return 0; X X} X Xstatic double L_half_width = 90.0; Xstatic double L_end = 25.0; Xstatic double L_height = 220.0; Xstatic double L_major_tick_interval = 10.0; Xstatic double L_major_tick_height = 90.0; X Xint doLadder (c, u) Xcraft *c; Xviewer *u;{ X X double x = c->curPitch, cx, s; X double sinP, cosP, pixelsPerDegree; X XSegment seg[24]; X XRectangle rect[1]; X int i, rung, windX, windY, w, tx, ty; X char buf[16]; X VPoint tmp; X X rect[0].x = u->xCenter - 125; X rect[0].y = u->yCenter - 110; X rect[0].width = 250; X rect[0].height = 220; X X s = ((int)(RADtoDEG(x)) / 10 * 10) - 20; X rung = s; X X pixelsPerDegree = L_major_tick_height / L_major_tick_interval; X cx = (RADtoDEG(x) - s) * pixelsPerDegree; X sinP = cos(c->curRoll); X cosP = sin(c->curRoll); X for (i=0; i<5; ++i, cx -= L_major_tick_height, rung +=10) { X seg[i*2].x1 = L_half_width * sinP + cx * cosP + u->xCenter; X seg[i*2].y1 = -L_half_width * cosP + cx * sinP + u->yCenter; X seg[i*2].x2 = L_end * sinP + cx * cosP + u->xCenter; X seg[i*2].y2 = -L_end * cosP + cx * sinP + u->yCenter; X seg[i*2+1].x1 = -L_end * sinP + cx * cosP + u->xCenter; X seg[i*2+1].y1 = L_end * cosP + cx * sinP + u->yCenter; X seg[i*2+1].x2 = -L_half_width * sinP + cx * cosP + u->xCenter; X seg[i*2+1].y2 = L_half_width * cosP + cx * sinP + u->yCenter; X sprintf (buf, "%d", rung); X if (seg[i*2].x1 >= rect[0].x && seg[i*2].x1 < X rect[0].x+rect[0].width && X seg[i*2].y1 >= rect[0].y && seg[i*2].y1 < X rect[0].y+rect[0].height) X XDrawString (u->dpy, u->win, u->gc, X seg[i*2].x1 + 2, seg[i*2].y1 + 5, X buf, strlen(buf)); X } X X i = i * 2; X X XSetClipRectangles (u->dpy, u->gc, 0, 0, rect, 1, YXBanded); X X windX = (int) (RADtoDEG(c->beta) * pixelsPerDegree) + u->xCenter; X windY = (int) (RADtoDEG(c->alpha) * pixelsPerDegree) + u->yCenter; X X seg[i].x1 = windX - 18; X seg[i].y1 = windY; X seg[i].x2 = windX - 9; X seg[i++].y2 = windY; X X seg[i].x1 = windX + 18; X seg[i].y1 = windY; X seg[i].x2 = windX + 9; X seg[i++].y2 = windY; X X seg[i].x1 = windX; X seg[i].y1 = windY - 9; X seg[i].x2 = windX; X seg[i++].y2 = windY - 15; X X/* X * Gether weapon display info (and maybe draw a reticle). X */ X X doWeaponDisplay (c, u); X X/* X * Draw a target designator around the current primary radar target. X */ X X if (c->curRadarTarget >= 0) { X X w = DESIGNATOR_SIZE * u->height / VIEW_WINDOW_HEIGHT * 0.5; X X VTransform (&(ptbl[c->curRadarTarget].Sg), X &u->v->eyeSpace, &tmp); X X/* radar target is assumed to be ahead of us (tmp.z > 0.0) */ X X tx = u->v->Middl.x + tmp.x * u->v->Scale.x / tmp.z; X ty = u->v->Middl.y - tmp.y * u->v->Scale.y / tmp.z; X X seg[i].x1 = tx - w; X seg[i].y1 = ty - w; X seg[i].x2 = tx + w; X seg[i++].y2 = ty - w; X X seg[i].x1 = tx + w; X seg[i].y1 = ty - w; X seg[i].x2 = tx + w; X seg[i++].y2 = ty + w; X X seg[i].x1 = tx + w; X seg[i].y1 = ty + w; X seg[i].x2 = tx - w; X seg[i++].y2 = ty + w; X X seg[i].x1 = tx - w; X seg[i].y1 = ty + w; X seg[i].x2 = tx - w; X seg[i++].y2 = ty - w; X } X X XDrawSegments (u->dpy, u->win, u->gc, seg, i); X XDrawArc (u->dpy, u->win, u->gc, u->xCenter-2, u->yCenter-2, 4, 4, 0, 360*64); X XDrawArc (u->dpy, u->win, u->gc, windX-8, windY-8, 16, 16, 0, 360*64); X X XSetClipMask (u->dpy, u->gc, None); X X return 0; X} X Xint doRPM (c, u) Xcraft *c; Xviewer *u;{ X X int x, y, x1, y1, len, i; X double percent, p; X char s[32], s1[32]; X X x = ENG_X * u->width / FS_WINDOW_WIDTH; X y = ENG_Y * u->width / FS_WINDOW_WIDTH; X len = (eng_x_hot - 6)* u->width / FS_WINDOW_WIDTH; X X XSetForeground (u->dpy, u->gc, u->v->pixel[whitePixel]); X XSetBackground (u->dpy, u->gc, u->v->pixel[blackPixel]); X XCopyPlane (u->dpy, u->eng, u->win, u->gc, 0, 0, eng_width,eng_height, X x - eng_x_hot, y - eng_y_hot, 1); X X percent = (double) c->throttle / 32768.0 * 100.0; X if (percent < 60.0) { X p = (60.0 - percent) / 120.0 * pi; X x1 = x + len * cos(p); X y1 = y - len * sin(p); X } X else { X p = (percent - 60.0) / 40.0 * pi; X x1 = x + len * cos(p); X y1 = y + len * sin(p); X } X X XDrawLine (u->dpy, u->win, u->gc, x, y, x1, y1); X X/* X * Print Fuel and Fuel consumption rate X */ X X sprintf (s, "%7s lbs Total", ItoA ((int) c->fuel, s1)); X XDrawImageString (u->dpy, u->win, u->gc, x-30, y+68, s, strlen(s)); X sprintf (s, "%7s lbs/hour", ItoA ((int) (fuelUsed(c)*3600.0/deltaT), s1)); X XDrawImageString (u->dpy, u->win, u->gc, x-30, y+68+u->fth, s, strlen(s)); X X/* X * Display Flap Setting X */ X X if (c->flapSetting > DEGtoRAD(29.0)) X i=3; X else if (c->flapSetting > DEGtoRAD(19.0)) X i=2; X else if (c->flapSetting > DEGtoRAD(9.0)) X i=1; X else X i=0; X X x = FLAP_X * u->width / FS_WINDOW_WIDTH; X y = FLAP_Y * u->width / FS_WINDOW_WIDTH; X X XCopyPlane (u->dpy, u->flap[i], u->win, u->gc, 0, 0, flaps0_width, X flaps0_height, x, y, 1); X sprintf (s, "Flaps: %d", (int) RADtoDEG(c->curFlap)); X XDrawImageString (u->dpy, u->win, u->gc, x+flaps0_x_hot, y+flaps0_y_hot, X s, strlen(s)); X X return 0; X} *-*-END-of-./fsim/doViews.c-*-* -- Riley Rainey Internet: riley@mips.com MIPS Computer Systems Phone: +1 214 770-7979 Dallas, Texas dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.