diff --git a/Makefile.am b/Makefile.am index 7de01bb4d..b03e6a450 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,9 +13,8 @@ EXTRA_DIST= ChangeLog configure.ac \ tools/gas2masm/gas2masm.dsp tools/gas2masm/gas2masm.dsw \ tools/gas2masm/gas2masm.mak tools/gas2masm/gas2masm.mdp -changelog:: - ( cd $(top_srcdir); \ - tools/cvs2cl/cvs2cl.pl --stdout -b --utc -S --no-wrap) > ChangeLog +ChangeLog: + git log > ChangeLog NOCONV_DIST= $(distdir)/include/win32/resources/icon1.ico diff --git a/bootstrap b/bootstrap index b2677a226..569b84253 100755 --- a/bootstrap +++ b/bootstrap @@ -19,7 +19,7 @@ if test "$1" = "clean"; then rm -f aclocal.m4 build-stamp changelog-stamp config.cache config.log \ config.status configure configure-stamp install-sh libtool missing \ mkinstalldirs quakeforge-config quakeforge.lsm - rm -f compile config.guess config.sub depcomp ltmain.sh + rm -f compile config.guess config.sub depcomp ltmain.sh ylwrap rm -rf autom4te.cache cd - diff --git a/config.d/compiling.m4 b/config.d/compiling.m4 index 7a1e2419c..602ce5f31 100644 --- a/config.d/compiling.m4 +++ b/config.d/compiling.m4 @@ -6,6 +6,23 @@ else cvs_def_disabled="!= xno" fi +if test "x$GCC" = xyes; then + set $CC + shift + args="$*" + AC_MSG_CHECKING(for gcc version) + CCVER="gcc `$CC --version | grep '[[0-9]]\.[[0-9]]' | sed -e 's/.*(GCC)//' -e 's/[[^0-9]]*\([[0-9.]]*\).*/\1/'`" + set $CCVER + save_IFS="$IFS" + IFS="." + set $2 + CC_MAJ=$1 + CC_MIN=$2 + CC_SUB=$3 + IFS="$save_IFS" + AC_MSG_RESULT($CCVER) +fi + AC_ARG_ENABLE(debug, [ --disable-debug compile without debugging], debug=$enable_debug @@ -29,20 +46,6 @@ if test "x$optimize" = xyes; then AC_MSG_RESULT(yes) BUILD_TYPE="$BUILD_TYPE Optimize" if test "x$GCC" = xyes; then - set $CC - shift - args="$*" - AC_MSG_CHECKING(for gcc version) - CCVER="gcc `$CC --version | grep '[[0-9]]\.[[0-9]]' | sed -e 's/.*(GCC)//' -e 's/[[^0-9]]*\([[0-9.]]*\).*/\1/'`" - set $CCVER - save_IFS="$IFS" - IFS="." - set $2 - CC_MAJ=$1 - CC_MIN=$2 - CC_SUB=$3 - IFS="$save_IFS" - AC_MSG_RESULT($CCVER) saved_cflags="$CFLAGS" CFLAGS="" QF_CC_OPTION(-frename-registers) diff --git a/configure.ac b/configure.ac index b3e1bb563..912590416 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,14 @@ AC_PREREQ(2.67) dnl This is the only place where the package name and version appear AC_INIT([QuakeForge], [git-master]) AM_INIT_AUTOMAKE([foreign]) + +dnl LT_INIT messes with CFLAGS (evil bastard) +if test "x${CFLAGS-unset}" = xunset; then + CFLAGS="" +fi +saved_CFLAGS="$CFLAGS" LT_INIT([win32-dll]) +CFLAGS="$saved_CFLAGS" AC_REVISION([$Revision$]) dnl @@ -17,9 +24,6 @@ m4_include(config.d/versions.m4) AC_LANG_C -if test "x${CFLAGS-unset}" = xunset; then - CFLAGS="" -fi if test "$x{AR-unset}" = xunset; then AR="ar" fi @@ -115,17 +119,6 @@ if test "x$enable_typecheck_progs" = xyes; then AC_DEFINE(TYPECHECK_PROGS, 1, [Define this if you want progs typechecking]) fi -AC_ARG_ENABLE(boxclip, -[ --enable-boxclip enable box clipping], - boxclip=$enable_boxclip, - boxclip=no -) -if test "x$boxclip" != xno; then - AC_DEFINE(ENABLE_BOXCLIP, 1, [Define if you want boxclipping]) -else - AC_DEFINE(ENABLE_BOXCLIP, 0, [Define if you want boxclipping]) -fi - TOPSRC=`readlink -f ${srcdir}` AC_SUBST(TOPSRC) diff --git a/doc/charchart.png b/doc/charchart.png index 6a32cda1c..a30a136d6 100644 Binary files a/doc/charchart.png and b/doc/charchart.png differ diff --git a/doc/ideas/quack.fig b/doc/ideas/quack.fig new file mode 100644 index 000000000..15646e105 --- /dev/null +++ b/doc/ideas/quack.fig @@ -0,0 +1,60 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 3 0 1 0 0 100 0 20 0.000 1 0.0000 1200 1200 1200 1200 1200 1200 2400 1200 +1 3 0 1 0 7 100 0 20 0.000 1 0.0000 1200 1200 928 928 1200 1200 2128 1200 +3 1 0 1 0 0 100 0 20 0.000 0 0 0 12 + 3000 1200 3000 2100 3300 2400 3900 2400 4200 2100 4200 1200 + 4050 1050 3900 1200 3900 2100 3300 2100 3300 1200 3150 1050 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 +3 1 0 1 0 0 100 0 20 0.000 0 0 0 12 + 4800 2250 4800 1350 5100 1050 5700 1050 6000 1350 6000 2250 + 5850 2400 5700 2250 5700 1350 5100 1350 5100 2250 4950 2400 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 +3 1 0 1 0 0 100 0 20 0.000 0 0 0 12 + 7800 2400 6900 2400 6600 2100 6600 1350 6900 1050 7800 1050 + 7950 1200 7800 1350 6900 1350 6900 2100 7800 2100 7950 2250 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 +3 1 0 1 0 0 100 0 20 0.000 0 0 0 6 + 4950 1800 5100 1650 5700 1650 5850 1800 5700 1950 5100 1950 + 1.000 1.000 1.000 1.000 1.000 1.000 +3 1 0 1 0 0 100 0 20 0.000 0 0 0 10 + 1200 1200 1500 1200 2100 2100 2400 2100 2550 2250 2400 2400 + 2100 2400 1500 1500 1200 1500 1050 1350 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 +3 1 0 1 0 0 100 0 20 0.000 0 0 0 6 + 8700 2250 8550 2400 8400 2250 8400 150 8550 0 8700 150 + 1.000 1.000 1.000 1.000 1.000 1.000 +3 1 0 1 0 0 100 0 20 0.000 0 0 0 12 + 9750 2400 8850 2400 8550 2100 8550 1350 8850 1050 9750 1050 + 9900 1200 9750 1350 8850 1350 8850 2100 9750 2100 9900 2250 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 +3 0 0 1 0 7 100 0 -1 0.000 0 0 0 14 + 375 4725 1200 4125 450 3525 825 2775 2550 2700 3000 3525 + 4200 4050 4275 4200 2700 3750 4200 4575 4050 4650 2550 4050 + 2025 4275 3000 4875 + 0.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 1.000 0.000 +3 3 0 1 0 7 100 0 -1 0.000 0 0 0 4 + 4500 3900 5625 3900 5625 4875 4575 4875 + -1.000 -1.000 -1.000 -1.000 +3 2 0 1 0 7 100 0 -1 0.000 0 0 0 3 + 6150 4950 6150 3900 6900 3900 + 0.000 -1.000 0.000 +3 2 0 1 0 7 100 0 -1 0.000 0 0 0 6 + 8100 4650 7350 4950 7350 3900 8100 3975 8175 5550 7425 5625 + 0.000 -1.000 -1.000 -1.000 -1.000 0.000 +3 2 0 1 0 7 100 0 -1 0.000 0 0 0 5 + 9000 4350 9750 4350 9300 3675 8925 4350 9375 5025 + 0.000 -1.000 -1.000 -1.000 0.000 diff --git a/doc/quakeforge.txt b/doc/quakeforge.txt index eeaae6ba1..bfa25eefc 100644 --- a/doc/quakeforge.txt +++ b/doc/quakeforge.txt @@ -8,10 +8,10 @@ Quake and QuakeWorld game engine. Our purpose? To improve the state of the game by improving the engine and making it accessable to the largest number of players we can. -\li \ref faq -\li \ref key_binding -\li \ref cshift_cvars -\li \ref qw_cap_spec -\li \ref qw_download_spec -\li \ref server_timestampes +\li \subpage faq +\li \subpage key_binding +\li \subpage cshift_cvars +\li \subpage qw_cap_spec +\li \subpage qw_download_spec +\li \subpage server_timestampes */ diff --git a/doc/surround-sound.txt b/doc/surround-sound.txt index 6458ef8ab..881ad5547 100644 --- a/doc/surround-sound.txt +++ b/doc/surround-sound.txt @@ -3,13 +3,15 @@ \page surround_sound_spec Description of Surround-Sound Channels Swiped from the vorbis docs -\li one channel - the stream is monophonic -\li two channels - the stream is stereo. channel order: left, right -\li three channels - the stream is a 1d-surround encoding. channel order: left, center, right -\li four channels - the stream is quadraphonic surround. channel order: front left, front right, rear left, rear right -\li five channels - the stream is five-channel surround. channel order: front left, center, front right, rear left, rear right -\li six channels - the stream is 5.1 surround. channel order: front left, center, front right, rear left, rear right, LFE -\li seven channels - the stream is 6.1 surround. channel order: front left, center, front right, side left, side right, rear center, LFE -\li eight channels - the stream is 7.1 surround. channel order: front left, center, front right, side left, side right, rear left, rear right, LFE -\li greater than eight channels - channel use and order is undefined +
+
one channel
the stream is monophonic
+
two channels
the stream is stereo. channel order: left, right
+
three channels
the stream is a 1d-surround encoding. channel order: left, center, right
+
four channels
the stream is quadraphonic surround. channel order: front left, front right, rear left, rear right
+
five channels
the stream is five-channel surround. channel order: front left, center, front right, rear left, rear right
+
six channels
the stream is 5.1 surround. channel order: front left, center, front right, rear left, rear right, LFE
+
seven channels
the stream is 6.1 surround. channel order: front left, center, front right, side left, side right, rear center, LFE
+
eight channels
the stream is 7.1 surround. channel order: front left, center, front right, side left, side right, rear left, rear right, LFE
+
greater than eight channels
channel use and order is undefined
+
*/ diff --git a/doc/timestamps.txt b/doc/timestamps.txt index 899ccbda6..61af5b449 100644 --- a/doc/timestamps.txt +++ b/doc/timestamps.txt @@ -8,74 +8,76 @@ the date and time. The following special codes are interpreted inside sv_timefmt strings. - \%a The abbreviated weekday name according to the current - locale. +
+
\%a
The abbreviated weekday name according to the current + locale.
- \%A The full weekday name according to the current - locale. +
\%A
The full weekday name according to the current + locale.
- \%b The abbreviated month name according to the current - locale. +
\%b
The abbreviated month name according to the current + locale.
- \%B The full month name according to the current - locale. +
\%B
The full month name according to the current + locale.
- \%c The preferred date and time representation for the - current locale. +
\%c
The preferred date and time representation for the + current locale.
- \%d The day of the month as a decimal number (range 01 - to 31). +
\%d
The day of the month as a decimal number (range 01 + to 31).
- \%h Equivalent to %b. (SU) +
\%h
Equivalent to %b. (SU)
- \%H The hour as a decimal number using a 24-hour clock - (range 00 to 23). +
\%H
The hour as a decimal number using a 24-hour clock + (range 00 to 23).
- \%I The hour as a decimal number using a 12-hour clock - (range 01 to 12). +
\%I
The hour as a decimal number using a 12-hour clock + (range 01 to 12).
- \%j The day of the year as a decimal number (range 001 - to 366). +
\%j
The day of the year as a decimal number (range 001 + to 366).
- \%k The hour (24-hour clock) as a decimal number (range - 0 to 23); single digits are preceded by a blank. - (See also %H.) (TZ) +
\%k
The hour (24-hour clock) as a decimal number (range + 0 to 23); single digits are preceded by a blank. + (See also %H.) (TZ)
- \%m The month as a decimal number (range 01 to 12). +
\%m
The month as a decimal number (range 01 to 12).
- \%M The minute as a decimal number (range 00 to 59). +
\%M
The minute as a decimal number (range 00 to 59).
- \%p Either `AM' or `PM' according to the given time - value, or the corresponding strings for the current - locale. Noon is treated as `pm' and midnight as - `am'. +
\%p
Either `AM' or `PM' according to the given time + value, or the corresponding strings for the current + locale. Noon is treated as `pm' and midnight as + `am'.
- \%S The second as a decimal number (range 00 to 61). +
\%S
The second as a decimal number (range 00 to 61).
- \%U The week number of the current year as a decimal - number, range 00 to 53, starting with the first - Sunday as the first day of week 01. See also %V and - %W. +
\%U
The week number of the current year as a decimal + number, range 00 to 53, starting with the first + Sunday as the first day of week 01. See also %V and + %W.
- \%w The day of the week as a decimal, range 0 to 6, - Sunday being 0. See also %u. +
\%w
The day of the week as a decimal, range 0 to 6, + Sunday being 0. See also %u.
- \%W The week number of the current year as a decimal - number, range 00 to 53, starting with the first - Monday as the first day of week 01. +
\%W
The week number of the current year as a decimal + number, range 00 to 53, starting with the first + Monday as the first day of week 01.
- \%x The preferred date representation for the current - locale without the time. +
\%x
The preferred date representation for the current + locale without the time.
- \%X The preferred time representation for the current - locale without the date. +
\%X
The preferred time representation for the current + locale without the date.
- \%y The year as a decimal number without a century - (range 00 to 99). +
\%y
The year as a decimal number without a century + (range 00 to 99).
- \%Y The year as a decimal number including the century. +
\%Y
The year as a decimal number including the century.
- \%Z The time zone name or abbreviation. - - \%\% A literal `\%' character. +
\%Z
The time zone name or abbreviation.
+ +
\%\%
A literal `\%' character.
+
*/ diff --git a/include/QF/qfplist.h b/include/QF/qfplist.h index 325615004..482b2b4ed 100644 --- a/include/QF/qfplist.h +++ b/include/QF/qfplist.h @@ -39,80 +39,50 @@ /** There are four types of data that can be stored in a property list: - QFDictionary A list of values, each associated with a key (a C - string). - QFArray A list of indexed values - QFString A string. - QFBinary Random binary data. The parser doesn't load these yet. +
+
QFDictionary
A list of values, each associated with a + key (a C string).
+
QFArray
A list of indexed values
+
QFString
A string.
+
QFBinary
Random binary data.
+
In textual form, a dictionary looks like: - + \code { key = value; } - + \endcode An array looks like: - + \code ( value1, value2 ) - + \endcode An unquoted string may contain only alphanumeric characters and/or the - underscore character, '_'. Quoted strings may contain whitespace, C escape - sequences, and so on. The quote character is '"'. Optionally, Python style - long strings ("""...""") may be used, allowing for unquoted '"' quotes in - the string. + underscore character, _. Quoted strings may contain + whitespace, C escape sequences, and so on. The quote character is + \". Optionally, Python style long strings + (\"\"\"...\"\"\") may be used, allowing for unquoted + " quotes in the string. - QFBinary data is hex-encoded and contained within angle brackets, \< \>. - The length of the encoded data must be an even number, so while \ - is valid, \ isn't. + QFBinary data is hex-encoded and contained within angle brackets, \c \< + \c \>. The length of the encoded data must be an even number, so while + \c \ is valid, \c \ isn't. Property lists may contain C-style or BCPL-style comments. */ -typedef enum {QFDictionary, QFArray, QFBinary, QFString} pltype_t; // possible types +typedef enum {QFDictionary, QFArray, QFBinary, QFString} pltype_t; -/* - Generic property list item +/** Generic property list item. + + All inspection and manipulation is to be done via the accessor functions. */ -struct plitem_s { - pltype_t type; // Type - void *data; -}; typedef struct plitem_s plitem_t; -/* - Dictionaries -*/ -struct dictkey_s { - char *key; - plitem_t *value; -}; -typedef struct dictkey_s dictkey_t; - -/* - Arrays -*/ -struct plarray_s { - int numvals; // Number of items in array - int maxvals; - struct plitem_s **values; // Array data -}; -typedef struct plarray_s plarray_t; - -/* - Typeless, unformatted binary data (not supported yet) -*/ -struct plbinary_s { - size_t size; - void *data; -}; -typedef struct plbinary_s plbinary_t; - -struct hashtab_s; - /** Create an in-memory representation of the contents of a property list. \param string the saved plist, as read from a file. @@ -249,10 +219,33 @@ qboolean PL_A_InsertObjectAtIndex (plitem_t *array, plitem_t *item, int index); */ plitem_t *PL_RemoveObjectAtIndex (plitem_t *array, int index); +/** Create a new dictionary object. + The dictionary will be empty. + \return the new dictionary object +*/ plitem_t *PL_NewDictionary (void); + +/** Create a new array object. + The array will be empty. + \return the new array object +*/ plitem_t *PL_NewArray (void); -plitem_t *PL_NewData (void *, int); -plitem_t *PL_NewString (const char *); + +/** Create a new data object from the given data. + Takes ownership of the given data. + \param data pointer to data buffer + \param size number of bytes in the buffer + \return the new dictionary object + \note The data will be freed via free() when the item is freed. +*/ +plitem_t *PL_NewData (void *data, size_t size); + +/** Create a new string object. + Makes a copy of the given string. + \param str C string to copy + \return the new dictionary object +*/ +plitem_t *PL_NewString (const char *str); /** Free a property list object. @@ -263,14 +256,6 @@ plitem_t *PL_NewString (const char *); */ void PL_Free (plitem_t *item); -typedef struct pldata_s { // Unparsed property list string - const char *ptr; - unsigned int end; - unsigned int pos; - unsigned int line; - const char *error; -} pldata_t; - //@} #endif // __QF_qfplist_h_ diff --git a/libs/audio/Makefile.am b/libs/audio/Makefile.am index d9e8564db..5b9b690ec 100644 --- a/libs/audio/Makefile.am +++ b/libs/audio/Makefile.am @@ -6,7 +6,7 @@ INCLUDES= -I$(top_srcdir)/include SDL_LIBS= @SDL_LIBS@ XMMS_LIBS= @XMMS_LIBS@ plugin_version= 1:0:0 -plugin_ldflags= @plugin_ldflags@ -module +plugin_ldflags= @plugin_ldflags@ -module -rpath $(plugindir) plugin_libadd= @plugin_libadd@ EXEEXT= diff --git a/libs/audio/cd_file.c b/libs/audio/cd_file.c index 7130576c2..34c569000 100644 --- a/libs/audio/cd_file.c +++ b/libs/audio/cd_file.c @@ -174,7 +174,7 @@ Load_Tracklist (void) Qread (oggfile, buffile, size); tracklist = PL_GetPropertyList (buffile); - if (!tracklist || tracklist->type != QFDictionary) { + if (!tracklist || PL_Type (tracklist) != QFDictionary) { Sys_Printf ("Malformed or empty tracklist file. check mus_ogglist\n"); return -1; } @@ -198,16 +198,16 @@ I_OGGMus_SetPlayList (int track) Sys_Printf ("No Track entry for track #%d.\n", track); return; } - if (play_list->type == QFString) + if (PL_Type (play_list) == QFString) return; - if (play_list->type != QFArray) { + if (PL_Type (play_list) != QFArray) { Sys_Printf ("Track entry for track #%d not string or array.\n", track); play_list = 0; return; } for (i = 0; i < PL_A_NumObjects (play_list); i++) { plitem_t *item = PL_ObjectAtIndex (play_list, i); - if (!item || item->type != QFString) { + if (!item || PL_Type (item) != QFString) { Sys_Printf ("Bad subtract %d in track %d.\n", i, track); play_list = 0; return; @@ -224,7 +224,7 @@ I_OGGMus_PlayNext (int looping) if (!play_list) return; - if (play_list->type == QFString) { + if (PL_Type (play_list) == QFString) { track = PL_String (play_list); play_pos = 0; } else { @@ -331,7 +331,7 @@ I_OGGMus_Info (void) continue; } - Sys_Printf (" %s - %s\n", trackstring, (char *) currenttrack->data); + Sys_Printf (" %s - %s\n", trackstring, PL_String (currenttrack)); count++; } } diff --git a/libs/audio/renderer/Makefile.am b/libs/audio/renderer/Makefile.am index 30b753cd0..ba1cc7cff 100644 --- a/libs/audio/renderer/Makefile.am +++ b/libs/audio/renderer/Makefile.am @@ -3,7 +3,7 @@ AUTOMAKE_OPTIONS= foreign CFLAGS+= @PREFER_PIC@ @VORBIS_CFLAGS@ @OGG_CFLAGS@ INCLUDES= -I$(top_srcdir)/include plugin_version= 1:0:0 -plugin_ldflags= @plugin_ldflags@ -module +plugin_ldflags= @plugin_ldflags@ -module -rpath $(plugindir) plugin_libadd= @plugin_libadd@ EXEEXT= diff --git a/libs/audio/targets/Makefile.am b/libs/audio/targets/Makefile.am index 9112d2adb..10eb2eac7 100644 --- a/libs/audio/targets/Makefile.am +++ b/libs/audio/targets/Makefile.am @@ -4,7 +4,7 @@ CFLAGS+= @PREFER_PIC@ INCLUDES= -I$(top_srcdir)/include SDL_LIBS = @SDL_LIBS@ plugin_version= 1:0:0 -plugin_ldflags= @plugin_ldflags@ -module +plugin_ldflags= @plugin_ldflags@ -module -rpath $(plugindir) plugin_libadd= @plugin_libadd@ EXEEXT= @@ -50,7 +50,7 @@ snd_output_win_la_CFLAGS= $(WIN32SND_CFLAGS) snd_output_win_la_SOURCES= snd_win.c snd_output_dx_la_LDFLAGS= $(plugin_ldflags) -snd_output_dx_la_LIBADD= $(WINSND_LIBS) $(plugin_libadd) +snd_output_dx_la_LIBADD= $(WINSND_LIBS) $(plugin_libadd) snd_output_dx_la_CFLAGS= $(WIN32SND_CFLAGS) snd_output_dx_la_SOURCES= snd_dx.c diff --git a/libs/console/Makefile.am b/libs/console/Makefile.am index 15486127f..223ee627e 100644 --- a/libs/console/Makefile.am +++ b/libs/console/Makefile.am @@ -3,7 +3,7 @@ AUTOMAKE_OPTIONS= foreign CFLAGS+= @PREFER_PIC@ INCLUDES= -I$(top_srcdir)/include plugin_version= 1:0:0 -plugin_ldflags= @plugin_ldflags@ -module +plugin_ldflags= @plugin_ldflags@ -module -rpath $(plugindir) plugin_libadd= @plugin_libadd@ EXEEXT= diff --git a/libs/models/Makefile.am b/libs/models/Makefile.am index a31de0eb4..f070844a8 100644 --- a/libs/models/Makefile.am +++ b/libs/models/Makefile.am @@ -4,12 +4,6 @@ SUBDIRS= alias brush sprite CFLAGS+= @PREFER_PIC@ INCLUDES= -I$(top_srcdir)/include -noinst_PROGRAMS= testclip - -testclip_SOURCES=testclip.c -testclip_LDADD= libQFmodels.la $(top_builddir)/libs/util/libQFutil.la -testclip_DEPENDENCIES= - lib_LTLIBRARIES= libQFmodels.la @VID_MODEL_TARGETS@ EXTRA_LTLIBRARIES= \ libQFmodels_gl.la libQFmodels_sw.la diff --git a/libs/models/testclip.c b/libs/models/testclip.c deleted file mode 100644 index 1ab4d27c9..000000000 --- a/libs/models/testclip.c +++ /dev/null @@ -1,428 +0,0 @@ -#include "QF/va.h" - -#include "getopt.h" -#include "world.h" - -#undef DIST_EPSILON -#define DIST_EPSILON 0 -#define TEST_BOXCLIP -#include "trace.c" - -dclipnode_t clipnodes0[] = { - { 0, { 1, -1}}, - { 1, {-1, -2}}, -}; - -mplane_t planes0[] = { - {{1, 0, 0}, 0, 0, 0}, // 0 - {{0.8, 0, 0.6}, 0, 4, 0}, // 1 -}; - -hull_t hull0 = { - clipnodes0, - planes0, - 0, - 1, - {0, 0, 0}, - {0, 0, 0}, -}; - -dclipnode_t clipnodes1[] = { - { 0, { 1, -2}}, - { 1, {-2, 2}}, - { 2, {-2, 3}}, - { 3, { 4, -2}}, - { 4, { 5, 6}}, - { 5, {-2, -1}}, - { 6, { 7, 8}}, - { 7, {-1, -2}}, - { 8, { 9, 13}}, - { 9, {10, -1}}, - { 10, {-1, 11}}, - { 11, {12, -2}}, - { 12, {-2, -1}}, - { 13, {-1, -2}}, -}; - -mplane_t planes1[] = { - {{0, 1, 0}, -96, 1, 0}, // 0 wall at right - {{0, 1, 0}, 96, 1, 0}, // 1 wall at left (with ditch) - {{1, 0, 0}, 128, 0, 0}, // 2 wall at front (with shelves) - {{1, 0, 0}, -32, 0, 0}, // 3 wall at back - {{0, 0, 1}, 32, 2, 0}, // 4 top of shelves - {{0, 0, 1}, 104, 2, 0}, // 5 ceiling - {{0, 1, 0}, 32, 1, 0}, // 6 edge of ditch - {{0, 0, 1}, -24, 2, 0}, // 7 floor of ditch - {{0, 0, 1}, 24, 2, 0}, // 8 bottom of selves - {{1, 0, 0}, 64, 0, 0}, // 9 end of shelves - {{0, 1, 0}, -16, 1, 0}, // 10 ditch side of 2nd shelf - {{0, 1, 0}, -64, 1, 0}, // 11 ditch side of 1st shelf - {{0, 1, 0}, -48, 1, 0}, // 12 1st shelf side of 2nd shelf - {{0, 0, 1}, 8, 2, 0}, // 13 main floor -}; - -hull_t hull1 = { - clipnodes1, - planes1, - 0, - 13, - {0, 0, 0}, - {0, 0, 0}, -}; - -dclipnode_t clipnodes2[] = { - {0, {1, 12}}, // 0 - {1, {-1, 2}}, // 1 - {2, {3, 6}}, // 2 - {3, {-1, 4}}, // 3 - {4, {5, -1}}, // 4 - {5, {-1, -2}}, // 5 - {6, {7, 9}}, // 6 - {7, {-1, 8}}, // 7 - {4, {-2, -1}}, // 8 - {8, {10, -1}}, // 9 - {5, {-1, 11}}, // 10 - {4, {-2, -1}}, // 11 - {9, {13, 25}}, // 12 - {2, {-1, 14}}, // 13 - {6, {15, 19}}, // 14 - {10, {-1, 16}}, // 15 - {11, {17, 18}}, // 16 - {7, {-1, -2}}, // 17 - {4, {-2, -1}}, // 18 - {11, {20, 23}}, // 19 - {12, {-1, 21}}, // 20 - {8, {22, -1}}, // 21 - {5, {-1, -2}}, // 22 - {8, {24, -1}}, // 23 - {4, {-2, -1}}, // 24 - {3, {-1, 26}}, // 25 - {8, {27, -1}}, // 26 - {11, {28, -1}}, // 27 - {12, {-1, 29}}, // 28 - {13, {-2, -1}}, // 29 -}; - -mplane_t planes2[] = { - {{1, 0, 0}, 912, 0, 0, {0, 0}}, // 0 0 - {{1, 0, 0}, 1168, 0, 0, {0, 0}}, // 1 1 - {{0, 1, 0}, 2112, 1, 0, {0, 0}}, // 2 2 13 - {{0, 1, 0}, 2128, 1, 0, {0, 0}}, // 3 3 25 - {{0.229038, 0, 0.973417}, 18.3218, 5, 0, {0, 0}}, // 4 4 8 11 18 24 - {{0.229038, -0, 0.973417}, 57.2585, 5, 0, {0, 0}}, // 5 5 10 22 - {{0, 1, 0}, 1984, 1, 0, {0, 0}}, // 6 6 14 - {{0.229039, -0, 0.973417}, 33.8978, 5, 0, {0, 0}}, // 7 7 17 - {{0, 1, 0}, 1968, 1, 0, {0, 0}}, // 8 9 21 23 26 - {{1, 0, 0}, 736, 0, 0, {0, 0}}, // 9 12 - {{0, 0, 1}, -176, 2, 0, {0, 0}}, // 10 15 - {{0, 0, 1}, -192, 2, 0, {0, 0}}, // 11 16 19 27 - {{0, 0, 1}, -152, 2, 0, {0, 0}}, // 12 20 28 - {{1, 0, 0}, 720, 0, 0, {0, 0}}, // 13 29 -}; - -hull_t hull2 = { - clipnodes2, - planes2, - 0, - 6, - {0, 0, 0}, - {0, 0, 0}, -}; - -dclipnode_t clipnodes3[] = { - {0, {1, 12}}, // 0 - {1, {2, 7}}, // 1 - {2, {-2, 3}}, // 2 - {3, {4, -2}}, // 3 - {4, {-2, 5}}, // 4 - {5, {-2, 6}}, // 5 - {6, {-1, -2}}, // 6 - {7, {-2, 8}}, // 7 - {8, {9, -2}}, // 8 - {9, {10, 11}}, // 9 - {10, {-2, -1}}, // 10 - {6, {-1, -2}}, // 11 - {3, {13, -2}}, // 12 - {11, {14, -2}}, // 13 - {4, {-2, 15}}, // 14 - {2, {-2, 16}}, // 15 - {9, {-1, -2}}, // 16 -}; - -mplane_t planes3[] = { - {{0, 1, 0}, -224, 1, 0, {0, 0}}, // 0 - {{0, 1, 0}, -192, 1, 0, {0, 0}}, // 1 - {{0, 0, 1}, 192, 2, 0, {0, 0}}, // 2 - {{1, 0, 0}, 384, 0, 0, {0, 0}}, // 3 - {{1, 0, 0}, 576, 0, 0, {0, 0}}, // 4 - {{0, 1, 0}, -16, 1, 0, {0, 0}}, // 5 - {{-0, 0.242536, 0.970142}, -3.88057, 5, 0, {0, 0}}, // 6 - {{1, 0, 0}, 552, 0, 0, {0, 0}}, // 7 - {{1, 0, 0}, 408, 0, 0, {0, 0}}, // 8 - {{0, 0, 1}, 48, 2, 0, {0, 0}}, // 9 - {{0, 0, 1}, 160, 2, 0, {0, 0}}, // 10 - {{0, 1, 0}, -416, 1, 0, {0, 0}}, // 11 -}; - -hull_t hull3 = { - clipnodes3, - planes3, - 0, - 16, - {0, 0, 0}, - {0, 0, 0}, -}; - -dclipnode_t clipnodes4[] = { - {0, {1, 25}}, // 0 - {1, {-1, 2}}, // 1 - {2, {3, 11}}, // 2 - {3, {4, -1}}, // 3 - {4, {5, 8}}, // 4 - {5, {-1, 6}}, // 5 - {6, {-1, 7}}, // 6 - {7, {-1, -2}}, // 7 - {5, {-1, 9}}, // 8 - {8, {10, -1}}, // 9 - {7, {-1, -2}}, // 10 - {9, {12, 17}}, // 11 - {4, {13, 15}}, // 12 - {6, {-1, 14}}, // 13 - {7, {-1, -2}}, // 14 - {7, {-1, 16}}, // 15 - {8, {-2, -1}}, // 16 - {10, {-1, 18}}, // 17 - {4, {19, 22}}, // 18 - {11, {20, -1}}, // 19 - {6, {-1, 21}}, // 20 - {7, {-1, -2}}, // 21 - {11, {23, -1}}, // 22 - {7, {-1, 24}}, // 23 - {8, {-2, -1}}, // 24 - {11, {26, -1}}, // 25 - {5, {-1, 27}}, // 26 - {12, {28, -1}}, // 27 - {13, {-1, 29}}, // 28 - {14, {-2, -1}}, // 29 -}; - -mplane_t planes4[] = { - {{0, 1, 0}, 832, 1, 0, {0, 0}}, // 0 - {{0, 1, 0}, 1216, 1, 0, {0, 0}}, // 1 - {{1, 0, 0}, 608, 0, 0, {0, 0}}, // 2 - {{1, 0, 0}, 624, 0, 0, {0, 0}}, // 3 - {{0, 0, 1}, -40, 2, 0, {0, 0}}, // 4 - {{1, 0, 0}, 672, 0, 0, {0, 0}}, // 5 - {{0, 0, 1}, -24, 2, 0, {0, 0}}, // 6 - {{0, -0.242536, 0.970142}, -256.118, 5, 0, {0, 0}}, // 7 - {{-0, -0.242536, 0.970142}, -271.64, 5, 0, {0, 0}}, // 8 - {{1, 0, 0}, 480, 0, 0, {0, 0}}, // 9 - {{1, 0, 0}, 464, 0, 0, {0, 0}}, // 10 - {{1, 0, 0}, 416, 0, 0, {0, 0}}, // 11 - {{0, 1, 0}, 768, 1, 0, {0, 0}}, // 12 - {{0, 0, 1}, -64, 2, 0, {0, 0}}, // 13 - {{0, 0, 1}, -80, 2, 0, {0, 0}}, // 14 -}; - -hull_t hull4 = { - clipnodes4, - planes4, - 0, - 6, - {0, 0, 0}, - {0, 0, 0}, -}; - -typedef struct { - const char *desc; - hull_t *hull; - vec3_t start; - vec3_t end; - struct { - float frac; - qboolean allsolid; - qboolean startsolid; - qboolean inopen; - qboolean inwater; - } expect; -} test_t; - -test_t tests[] = { - {0, &hull0, {-20, 0, 28}, {20, 0, 28}, {1, 0, 0, 1, 0}}, - {0, &hull0, {-20, 0, 27}, {20, 0, 27}, {0.1, 0, 0, 1, 0}}, - {0, &hull0, {-20, 0, -76}, {20, 0, -76}, {0.1, 0, 0, 1, 0}}, - {0, &hull0, {-20, 0, -77}, {20, 0, -77}, {0.1, 0, 0, 1, 0}}, - - - {"drop on trench edge", - &hull1, {0, 47, 40}, {0, 47, 32}, {0.5, 0, 0, 1, 0}}, - {"drop past trench edge", - &hull1, {0, 48, 40}, {0, 48, 32}, {1, 0, 0, 1, 0}}, - - {"run into trench edge", - &hull1, {0, 52, 35}, {0, 44, 35}, {0.5, 0, 0, 1, 0}}, - {"run over trench edge", - &hull1, {0, 52, 36}, {0, 44, 36}, {1, 0, 0, 1, 0}}, - - {"run into end of 2nd shelf", - &hull1, {47, -32, 36}, {49, -32, 36}, {0.5, 0, 0, 1, 0}}, - {"run inside end of 2nd shelf", - &hull1, {48, -32, 36}, {50, -32, 36}, {1, 1, 1, 0, 0}}, - - {"run into end of 2nd shelf p2", - &hull1, {44, -32, 59}, {52, -32, 59}, {0.5, 0, 0, 1, 0}}, - {"run over end of 2nd shelf", - &hull1, {44, -32, 60}, {52, -32, 60}, {1, 0, 0, 1, 0}}, - - {"drop past end of 2nd shelf", - &hull1, {47, -32, 76}, {47, -32, 44}, {1, 0, 1, 1, 0}}, - {"drop onto end of 2nd shelf", - &hull1, {48, -32, 76}, {48, -32, 44}, {0.5, 0, 1, 1, 0}}, - - {"drop onto top of ramp: hull2", - &hull2, {896, 2048, -144}, {896, 2048, -152}, {0.5, 0, 0, 1, 0}}, - - {"drop onto edge of 2nd shelf p1", - &hull1, {96, -47, 61}, {96, -47, 59}, {0.5, 0, 0, 1, 0}}, - - {"drop onto edge of 2nd shelf p2", - &hull1, {96, -47.9612, 61}, {96, -47.1025, 59}, {0.5, 0, 0, 1, 0}}, - - {"drop onto edge of 2nd shelf p3", - &hull1, {94.8916, -34.8506, 61}, {94.8146, -28.5696, 59}, - {0.5, 0, 0, 1, 0}}, - - {"run over top of ramp: hull3", - &hull3, {480, -216, 76}, {480, -200, 76}, {1, 0, 0, 1, 0}}, - - {"drop onto top of ramp, A: hull3", - &hull3, {480, -207.977, 77}, {468, -207.977, 75}, {0.5, 0, 0, 1, 0}}, - {"drop onto top of ramp, B: hull3", - &hull3, {480, -208.873, 77}, {468, -208.873, 75}, {0.5, 0, 0, 1, 0}}, - {"diagonal drop onto top of ramp: hull3", - &hull3, {480, -208.873, 77}, {468, -207.977, 75}, {0.5, 0, 0, 1, 0}}, - - {"drop onto thin bridge", - &hull4, {544, 1080, 5}, {544, 1080, 3}, {0.5, 0, 0, 1, 0}}, - {"long drop onto thin bridge", - &hull4, {544, 1080, 78}, {544, 1080, -70}, {0.5, 0, 0, 1, 0}}, -}; -const int num_tests = sizeof (tests) / sizeof (tests[0]); - -int verbose = 0; - -static trace_t -do_trace (hull_t *hull, vec3_t start, vec3_t end) -{ - trace_t trace; - - trace.allsolid = true; - trace.startsolid = false; - trace.inopen = false; - trace.inwater = false; - trace.fraction = 1; - trace.extents[0] = 16; - trace.extents[1] = 16; - trace.extents[2] = 28; - trace.isbox = true; - VectorCopy (end, trace.endpos); - MOD_TraceLine (hull, 0, start, end, &trace); - return trace; -} - -static int -run_test (test_t *test) -{ - const char *desc; - vec3_t end; - int res = 0; - - VectorSubtract (test->end, test->start, end); - VectorMultAdd (test->start, test->expect.frac, end, end); - if (verbose) - printf ("expect: (%g %g %g) -> (%g %g %g) => (%g %g %g)" - " %3g %d %d %d %d\n", - test->start[0], test->start[1], test->start[2], - test->end[0], test->end[1], test->end[2], - end[0], end[1], end[2], - test->expect.frac, - test->expect.allsolid, test->expect.startsolid, - test->expect.inopen, test->expect.inwater); - trace_t trace = do_trace (test->hull, test->start, test->end); - if (verbose) - printf (" got: (%g %g %g) -> (%g %g %g) => (%g %g %g)" - " %3g %d %d %d %d\n", - test->start[0], test->start[1], test->start[2], - test->end[0], test->end[1], test->end[2], - trace.endpos[0], trace.endpos[1], trace.endpos[2], - trace.fraction, - trace.allsolid, trace.startsolid, - trace.inopen, trace.inwater); - if (VectorCompare (end, trace.endpos) - && test->expect.frac == trace.fraction - && test->expect.allsolid == trace.allsolid - && test->expect.startsolid == trace.startsolid - && test->expect.inopen == trace.inopen - && test->expect.inwater == trace.inwater) - res = 1; - - if (test->desc) - desc = va ("(%d) %s", (int)(long)(test - tests), test->desc); - else - desc = va ("test #%d", (int)(long)(test - tests)); - printf ("%s: %s\n", res ? "PASS" : "FAIL", desc); - return res; -} - -int -main (int argc, char **argv) -{ - vec3_t start, end; - int c, i; - int pass = 1; - int test = -1; - - while ((c = getopt (argc, argv, "vt:")) != EOF) { - switch (c) { - case 'v': - verbose = 1; - break; - case 't': - test = atoi (optarg); - break; - default: - fprintf (stderr, - "-v (verbose) and/or -t TEST (test number)\n"); - return 1; - } - } - - if (test == -1) { - for (i = 0; i < num_tests; i++) { - if (verbose && i) - puts (""); - pass &= run_test (&tests[i]); - } - } else if (test >= 0 && test < num_tests) { - pass &= run_test (&tests[test]); - } else { - fprintf (stderr, "Bad test number (0 - %d)\n", num_tests); - return 1; - } - - for (i = 0; i < 0; i++) { - start[0] = 480; - start[1] = -240 + i; - start[2] = 77; - VectorCopy (start, end); - end[2] -= 16; - do_trace (&hull3, start, end); - } -// start[0] = 480; -// start[1] = -207.253967; -// start[2] = 76.03125; -// VectorCopy (start, end); -// end[1] += 16; -// do_trace (&hull3, start, end); - return !pass; -} diff --git a/libs/models/trace.c b/libs/models/trace.c index 4f125379c..1ca6b3e8e 100644 --- a/libs/models/trace.c +++ b/libs/models/trace.c @@ -83,356 +83,7 @@ calc_impact (trace_t *trace, const vec3_t start, const vec3_t end, VectorSubtract (end, start, dist); VectorMultAdd (start, frac, dist, trace->endpos); } -#if ENABLE_BOXCLIP || defined(TEST_BOXCLIP) -#define ALLSOLID 1 -#define STARTSOLID 2 -#define INOPEN 4 -#define INWATER 8 - -#define SOLID (ALLSOLID | STARTSOLID) - -typedef struct { - mplane_t *plane; - vec3_t point; // arbitrary point on plane - int side; -} tp_t; - -typedef struct { - vec3_t p; - vec3_t v; -} line_t; - -typedef struct { - const vec_t *start; - const vec_t *end; - const vec_t *extents; - qboolean isbox; - hull_t hull; - tp_t split; - tp_t impact; - float fraction; - int flags; -} tl_t; - -static inline void -set_split (tl_t *tl, tp_t *n, tp_t *o) -{ - if (o) - *o = tl->split; - if (n) { - tl->split = *n; - } else { - tl->split.plane = 0; - VectorZero (tl->split.point); - tl->split.side = 0; - } -} - -static inline void -set_impact (tl_t *tl, mplane_t *plane, int side) -{ - tl->impact.plane = plane; - tl->impact.side = side; -} - -#define print_tp(tp) \ - Sys_Printf ("%s [(%g %g %g) %g %d]\n", #tp, \ - (tp).plane->normal[0], (tp).plane->normal[1], \ - (tp).plane->normal[2], (tp).plane->dist, (tp).side) - -static inline vec_t -sgn (vec_t v) -{ - return v < 0 ? -1 : (v > 0 ? 1 : 0); -} - -static inline float -calc_offset (tl_t *tl, mplane_t *plane) -{ - if (tl->isbox) { - if (plane->type < 3) - return tl->extents[plane->type]; - else - return (fabs (tl->extents[0] * plane->normal[0]) - + fabs (tl->extents[1] * plane->normal[1]) - + fabs (tl->extents[2] * plane->normal[2])); - } - return 0; -} - - -static void -impact (tl_t *tl, tp_t *split) -{ - float t1, t2, offset, frac; - int side = 0; - - t1 = PlaneDiff (tl->start, split->plane); - t2 = PlaneDiff (tl->end, split->plane); - offset = calc_offset (tl, split->plane); - if (t1 < t2) { - side = -1; - frac = (t1 + offset) / (t1 - t2); - } else if (t1 > t2) { - side = 0; - frac = (t1 - offset) / (t1 - t2); - } else { - frac = 0; - Sys_DPrintf ("help! help! the world is falling apart!\n"); - } - if (frac >= 0) { - tl->fraction = frac; - set_impact (tl, split->plane, side); -// print_tp (tl->impact); - } -} - -static void -select_vertex (tl_t *tl, tp_t *split, vec3_t vert) -{ - int axis; - - for (axis = 0; axis < 3; axis++) { - vec_t s = sgn (tl->split.plane->normal[axis]); - if (!tl->split.side) - s = -s; - if (!s) { - s = sgn (split->plane->normal[axis]); - if (split->side) - s = -s; - if (!s) - s = 1; - } - vert[axis] = tl->extents[axis] * s; - } -} - -static int -intersection_point (const mplane_t *plane, const vec3_t _p1, const vec3_t _p2, - const vec3_t offs, vec3_t point) -{ - vec_t t1, t2; - vec3_t p1, p2; - - VectorAdd (_p1, offs, p1); - VectorAdd (_p2, offs, p2); - - t1 = PlaneDiff (p1, plane); - t2 = PlaneDiff (p2, plane); - - if (!(t1 - t2)) - return 0; - VectorSubtract (p2, p1, point); - VectorMultAdd (p1, t1 / (t1 - t2), point, point); - return 1; -} - -static int -intersection_line (tl_t *tl, tp_t *split, const vec3_t p1, const vec3_t p2, - line_t *line) -{ - const vec_t *pn1 = tl->split.plane->normal; - const vec_t *pp1 = tl->split.point; - const vec_t *pn2 = split->plane->normal; - const vec_t *pp2 = split->point; - vec3_t pvec; - vec_t t; - - // find the line of intersection of the two planes, both direction - // and a point on the line. - CrossProduct (pn1, pn2, line->v); - if (VectorIsZero (line->v)) - //planes are parallel, no intersection - return 0; - CrossProduct (pn1, line->v, pvec); - VectorSubtract (pp2, pp1, line->p); - t = DotProduct (line->p, pn2) / DotProduct (pvec, pn2); - VectorMultAdd (pp1, t, line->p, line->p); - return 1; -} - -static int -traceline (int num, float p1f, float p2f, const vec3_t p1, const vec3_t p2, - tl_t *tl) -{ - dclipnode_t *node; - mplane_t *plane; - float t1, t2, frac, frac2, midf, offset; - int side, cross; - vec3_t mid; - int c1, c2; - - tp_t split, save; - line_t line; - vec3_t dist, vert, vert2, point; - int check_intersection; - - do { - // Skip past non-intersecting nodes -// Sys_Printf ("%d\n", num); - while (num >= 0) { - node = tl->hull.clipnodes + num; - plane = tl->hull.planes + node->planenum; - - t1 = PlaneDiff (p1, plane); - t2 = PlaneDiff (p2, plane); - offset = calc_offset (tl, plane); - - if (t1 >= offset && t2 >= offset) { - num = node->children[side = 0]; - } else if (t1 < -offset && t2 < -offset) { - num = node->children[side = 1]; - } else { - break; - } -// Sys_Printf ("%d\n", num); - } - if (num < 0) { - return num; - } - - split.plane = plane; - split.side = t1 < t2; - VectorSubtract (p2, p1, dist); - VectorMultAdd (p1, t1 / (t1 - t2), dist, split.point); - if (tl->split.plane) { - select_vertex (tl, &split, vert); - if ((t1 >= -offset && t1 < offset) - && (t2 < -offset || t2 >= offset)) { - // p1 straddles the plane, p2 is clear of the plane - intersection_point (tl->split.plane, p1, p2, vert, point); - if ((PlaneDiff (point, plane) < 0) != (t1 < t2)) { - // the trace misses the intersection of the two planes, so - // both ends of the trace are really on the same side of - // the plane - num = node->children[!(t1 < t2)]; - continue; - } - } - } - break; - } while (1); - - check_intersection = 0; - if (tl->split.plane) { - VectorNegate (vert, vert2); - intersection_point (tl->split.plane, p1, p2, vert2, point); - if ((PlaneDiff (point, plane) < 0) != (t1 < t2)) { - // the two edges of the hypercube of motion are on opposite sides - // of the line of intersection of the two planes, so the box hits - // the intersection somewhere - check_intersection = 1; - } - } - cross = !(t1 >= -offset && t1 < offset && t2 >= -offset && t2 < offset); - - if (t1 < t2) { - side = 1; - frac = (t1 - offset) / (t1 - t2); - frac2 = (t1 + offset) / (t1 - t2); - } else { - side = 0; - frac = (t1 + offset) / (t1 - t2); - frac2 = (t1 - offset) / (t1 - t2); - } - - if (check_intersection) { - intersection_line (tl, &split, p1, p2, &line); - } - - set_split (tl, &split, &save); - if (cross) { - frac = bound (0, frac, 1); - midf = p1f + (p2f - p1f) * frac; - VectorMultAdd (p1, frac, dist, mid); - c1 = c2 = traceline (node->children[side], p1f, midf, p1, mid, tl); - - frac2 = bound (0, frac2, 1); - midf = p1f + (p2f - p1f) * frac2; - if (!tl->impact.plane || midf < tl->fraction) { - VectorMultAdd (p1, frac2, dist, mid); - c2 = traceline (node->children[side ^ 1], midf, p2f, mid, p2, tl); - } - } else { - c1 = c2 = traceline (node->children[side], p1f, p2f, p1, mid, tl); - if (c1 != CONTENTS_SOLID) - c2 = traceline (node->children[side ^ 1], p1f, p2f, mid, p2, tl); - if (c1 == CONTENTS_SOLID || c2 == CONTENTS_SOLID) - c1 = c2 = CONTENTS_SOLID; - else - c1 = c2 = min (c1, c2); - } - set_split (tl, &save, 0); - if (cross) { - if (c1 != CONTENTS_SOLID && c2 == CONTENTS_SOLID) - impact (tl, &split); - if (c1 == CONTENTS_SOLID && !(tl->flags & SOLID)) - tl->flags |= STARTSOLID; - if (c1 == CONTENTS_EMPTY || c2 == CONTENTS_EMPTY) { - tl->flags &= ~ALLSOLID; - tl->flags |= INOPEN; - } - if (c1 < CONTENTS_SOLID || c2 < CONTENTS_SOLID) { - tl->flags &= ~ALLSOLID; - tl->flags |= INWATER; - } - return c1; - //return frac2 ? c1 : c2; - } else { - if (c1 == CONTENTS_SOLID || c2 == CONTENTS_SOLID) { - if (!p1f) { - tl->flags &= SOLID; - tl->flags |= STARTSOLID; - } - return CONTENTS_SOLID; - } - if (c1 == CONTENTS_EMPTY && c2 == CONTENTS_EMPTY) { - tl->flags &= ~ALLSOLID; - tl->flags |= INOPEN; - } else { - tl->flags &= ~ALLSOLID; - tl->flags |= INWATER; - } - return min (c1, c2); //FIXME correct? - } -} - -VISIBLE void -MOD_TraceLine (hull_t *hull, int num, - const vec3_t start_point, const vec3_t end_point, - trace_t *trace) -{ - tl_t tl; - int c; - - tl.start = start_point; - tl.end = end_point; - tl.extents = trace->extents; - tl.isbox = trace->isbox; - tl.hull = *hull; - set_split (&tl, 0, 0); - set_impact (&tl, 0, 0); - tl.fraction = 1; - tl.flags = ALLSOLID; - c = traceline (num, 0, 1, start_point, end_point, &tl); - if (c == CONTENTS_EMPTY) { - tl.flags &= ~ALLSOLID; - tl.flags |= INOPEN; - } - if (c < CONTENTS_SOLID) { - tl.flags &= ~ALLSOLID; - tl.flags |= INOPEN; - } - if (tl.fraction < 1) { - calc_impact (trace, start_point, end_point, tl.impact.plane); - } - trace->allsolid = (tl.flags & ALLSOLID) != 0; - trace->startsolid = (tl.flags & STARTSOLID) != 0; - trace->inopen = (tl.flags & INOPEN) != 0; - trace->inwater = (tl.flags & INWATER) != 0; -} -#else typedef struct { vec3_t end; int side; @@ -572,4 +223,3 @@ MOD_TraceLine (hull_t *hull, int num, num = node->children[side]; } } -#endif diff --git a/libs/util/qfplist.c b/libs/util/qfplist.c index 86a2b1da0..b8f4a6a5c 100644 --- a/libs/util/qfplist.c +++ b/libs/util/qfplist.c @@ -45,6 +45,51 @@ static __attribute__ ((used)) const char rcsid[] = #include "QF/qtypes.h" #include "QF/sys.h" +/* + Generic property list item. +*/ +struct plitem_s { + pltype_t type; + void *data; +}; + +/* + Dictionaries +*/ +struct dictkey_s { + char *key; + plitem_t *value; +}; +typedef struct dictkey_s dictkey_t; + +/* + Arrays +*/ +struct plarray_s { + int numvals; ///< Number of items in array + int maxvals; ///< Number of items that can be stored + ///< before a realloc is necesary. + struct plitem_s **values; ///< Array data +}; +typedef struct plarray_s plarray_t; + +/* + Typeless, unformatted binary data +*/ +struct plbinary_s { + size_t size; + void *data; +}; +typedef struct plbinary_s plbinary_t; + +typedef struct pldata_s { // Unparsed property list string + const char *ptr; + unsigned int end; + unsigned int pos; + unsigned int line; + const char *error; +} pldata_t; + // Ugly defines for fast checking and conversion from char to number #define inrange(ch,min,max) ((ch) >= (min) && (ch) <= (max)) #define char2num(ch) \ @@ -119,7 +164,7 @@ PL_NewArray (void) } VISIBLE plitem_t * -PL_NewData (void *data, int size) +PL_NewData (void *data, size_t size) { plitem_t *item = PL_NewItem (QFBinary); plbinary_t *bin = malloc (sizeof (plbinary_t)); diff --git a/libs/util/quakefs.c b/libs/util/quakefs.c index 72c282cdd..21e3a382c 100644 --- a/libs/util/quakefs.c +++ b/libs/util/quakefs.c @@ -308,9 +308,10 @@ qfs_get_gd_params (plitem_t *gdpl, gamedir_t *gamedir, dstring_t *path, hashtab_t *vars) { plitem_t *p; + const char *ps; - if ((p = PL_ObjectForKey (gdpl, "Path")) && *(char *) p->data) { - char *str = qfs_var_subst (p->data, vars); + if ((p = PL_ObjectForKey (gdpl, "Path")) && *(ps = PL_String (p))) { + char *str = qfs_var_subst (ps, vars); char *e = strchr (str, '"'); if (!e) @@ -322,61 +323,77 @@ qfs_get_gd_params (plitem_t *gdpl, gamedir_t *gamedir, dstring_t *path, free (str); } if (!gamedir->gamecode && (p = PL_ObjectForKey (gdpl, "GameCode"))) - gamedir->gamecode = qfs_var_subst (p->data, vars); + gamedir->gamecode = qfs_var_subst (PL_String (p), vars); if (!gamedir->dir.skins && (p = PL_ObjectForKey (gdpl, "SkinPath"))) - gamedir->dir.skins = qfs_var_subst (p->data, vars); + gamedir->dir.skins = qfs_var_subst (PL_String (p), vars); if (!gamedir->dir.progs && (p = PL_ObjectForKey (gdpl, "ProgPath"))) - gamedir->dir.progs = qfs_var_subst (p->data, vars); + gamedir->dir.progs = qfs_var_subst (PL_String (p), vars); if (!gamedir->dir.sound && (p = PL_ObjectForKey (gdpl, "SoundPath"))) - gamedir->dir.sound = qfs_var_subst (p->data, vars); + gamedir->dir.sound = qfs_var_subst (PL_String (p), vars); if (!gamedir->dir.maps && (p = PL_ObjectForKey (gdpl, "MapPath"))) - gamedir->dir.maps = qfs_var_subst (p->data, vars); + gamedir->dir.maps = qfs_var_subst (PL_String (p), vars); } static void qfs_inherit (plitem_t *plist, plitem_t *gdpl, gamedir_t *gamedir, dstring_t *path, hashtab_t *dirs, hashtab_t *vars) { - plitem_t *base; + plitem_t *base_item; - if (!(base = PL_ObjectForKey (gdpl, "Inherit"))) + if (!(base_item = PL_ObjectForKey (gdpl, "Inherit"))) return; - if (base->type == QFString) { - if (Hash_Find (dirs, base->data)) - return; - gdpl = PL_ObjectForKey (plist, base->data); - if (!gdpl) { - Sys_Printf ("base `%s' not found\n", (char *)base->data); - return; - } - qfs_set_var (vars, "gamedir", base->data); - Hash_Add (dirs, strdup (base->data)); - qfs_get_gd_params (gdpl, gamedir, path, vars); - qfs_inherit (plist, gdpl, gamedir, path, dirs, vars); - } else if (base->type == QFArray) { - int i; - plarray_t *a = base->data; - for (i = 0; i < a->numvals; i++) { - base = a->values[i]; - if (Hash_Find (dirs, base->data)) - continue; - gdpl = PL_ObjectForKey (plist, base->data); - if (!gdpl) { - Sys_Printf ("base `%s' not found\n", (char *)base->data); - continue; + switch (PL_Type (base_item)) { + case QFString: + { + const char *base = PL_String (base_item); + if (Hash_Find (dirs, base)) + return; + gdpl = PL_ObjectForKey (plist, base); + if (!gdpl) { + Sys_Printf ("base `%s' not found\n", base); + return; + } + qfs_set_var (vars, "gamedir", base); + Hash_Add (dirs, strdup (base)); + qfs_get_gd_params (gdpl, gamedir, path, vars); + qfs_inherit (plist, gdpl, gamedir, path, dirs, vars); } - qfs_set_var (vars, "gamedir", base->data); - Hash_Add (dirs, strdup (base->data)); - qfs_get_gd_params (gdpl, gamedir, path, vars); - qfs_inherit (plist, gdpl, gamedir, path, dirs, vars); - } + break; + case QFArray: + { + int i, num_dirs; + plitem_t *basedir_item; + const char *basedir; + + num_dirs = PL_A_NumObjects (base_item); + for (i = 0; i < num_dirs; i++) { + basedir_item = PL_ObjectAtIndex (base_item, i); + if (!basedir_item) + continue; + basedir = PL_String (basedir_item); + if (!basedir || Hash_Find (dirs, basedir)) + continue; + gdpl = PL_ObjectForKey (plist, basedir); + if (!gdpl) { + Sys_Printf ("base `%s' not found\n", basedir); + continue; + } + qfs_set_var (vars, "gamedir", basedir); + Hash_Add (dirs, strdup (basedir)); + qfs_get_gd_params (gdpl, gamedir, path, vars); + qfs_inherit (plist, gdpl, gamedir, path, dirs, vars); + } + } + break; + default: + break; } } static int qfs_compare (const void *a, const void *b) { - return strcmp ((*(dictkey_t **)a)->key, (*(dictkey_t **)b)->key); + return strcmp (*(const char **) a, *(const char **) b); } static const char * @@ -397,19 +414,24 @@ qfs_find_gamedir (const char *name, hashtab_t *dirs) plitem_t *gdpl = PL_ObjectForKey (qfs_gd_plist, name); if (!gdpl) { - dictkey_t **list = (dictkey_t **) Hash_GetList (qfs_gd_plist->data); - dictkey_t **l; - for (l = list; *l; l++) - ; - qsort (list, l - list, sizeof (char *), qfs_compare); - while (l-- != list) { - if (!fnmatch ((*l)->key, name, 0)) { - gdpl = (*l)->value; - Hash_Add (dirs, strdup ((*l)->key)); + plitem_t *keys = PL_D_AllKeys (qfs_gd_plist); + int num_keys = PL_A_NumObjects (keys); + const char **list = malloc (num_keys * sizeof (char *)); + int i; + + for (i = 0; i < num_keys; i++) + list[i] = PL_String (PL_ObjectAtIndex (keys, i)); + qsort (list, num_keys, sizeof (const char *), qfs_compare); + + while (i--) { + if (!fnmatch (list[i], name, 0)) { + gdpl = PL_ObjectForKey (qfs_gd_plist, list[i]); + Hash_Add (dirs, strdup (list[i])); break; } } free (list); + PL_Free (keys); } return gdpl; } @@ -566,7 +588,7 @@ qfs_load_config (void) PL_Free (qfs_gd_plist); qfs_gd_plist = PL_GetPropertyList (buf); free (buf); - if (qfs_gd_plist && qfs_gd_plist->type == QFDictionary) + if (qfs_gd_plist && PL_Type (qfs_gd_plist) == QFDictionary) return; // done Sys_Printf ("not a dictionary\n"); no_config: diff --git a/nq/source/sv_cl_phys.c b/nq/source/sv_cl_phys.c index bbcc7b6a3..7fa529bad 100644 --- a/nq/source/sv_cl_phys.c +++ b/nq/source/sv_cl_phys.c @@ -56,10 +56,6 @@ SV_CheckStuck (edict_t *ent) int i, j, z; vec3_t org; -#if ENABLE_BOXCLIP - return; -#endif - if (!SV_TestEntityPosition (ent)) { VectorCopy (SVvector (ent, origin), SVvector (ent, oldorigin)); return; diff --git a/nq/source/sv_phys.c b/nq/source/sv_phys.c index 5d1e744da..0d00c5dca 100644 --- a/nq/source/sv_phys.c +++ b/nq/source/sv_phys.c @@ -237,23 +237,14 @@ SV_FlyMove (edict_t *ent, float time, trace_t *steptrace) time_left = time; for (bumpcount = 0; bumpcount < numbumps; bumpcount++) { -#if ENABLE_BOXCLIP - extern int dp; -#endif if (VectorIsZero (SVvector (ent, velocity))) break; VectorMultAdd (SVvector (ent, origin), time_left, SVvector (ent, velocity), end); -#if ENABLE_BOXCLIP - dp = 1; -#endif trace = SV_Move (SVvector (ent, origin), SVvector (ent, mins), SVvector (ent, maxs), end, false, ent); -#if ENABLE_BOXCLIP - dp = 0; -#endif if (trace.allsolid) { // entity is trapped in another solid VectorZero (SVvector (ent, velocity)); diff --git a/nq/source/world.c b/nq/source/world.c index 3622684d0..d617af55a 100644 --- a/nq/source/world.c +++ b/nq/source/world.c @@ -500,10 +500,6 @@ SV_TestEntityPosition (edict_t *ent) return NULL; } -#if ENABLE_BOXCLIP -int dp; -#endif - /* SV_ClipMoveToEntity @@ -523,7 +519,7 @@ SV_ClipMoveToEntity (edict_t *touched, edict_t *mover, const vec3_t start, trace.fraction = 1; trace.allsolid = true; - trace.isbox = ENABLE_BOXCLIP ? true : false;//XXX box clipping test + trace.isbox = 0; VectorCopy (end, trace.endpos); // get the clipping hull @@ -540,18 +536,6 @@ SV_ClipMoveToEntity (edict_t *touched, edict_t *mover, const vec3_t start, if (trace.fraction != 1) VectorAdd (trace.endpos, offset, trace.endpos); -#if ENABLE_BOXCLIP - if (dp) - printf ("(%g %g %g) -> (%g %g %g) => (%g %g %g)" - " %3g %d %d %d %d\n", - start_l[0], start_l[1], start_l[2], - end_l[0], end_l[1], end_l[2], - trace.endpos[0], trace.endpos[1], trace.endpos[2], - trace.fraction, - trace.allsolid, trace.startsolid, - trace.inopen, trace.inwater); -#endif - // did we clip the move? if (trace.fraction < 1 || trace.startsolid) trace.ent = touched; diff --git a/tools/qfcc/Makefile.am b/tools/qfcc/Makefile.am index 3cccd309e..b7d0269f7 100644 --- a/tools/qfcc/Makefile.am +++ b/tools/qfcc/Makefile.am @@ -31,8 +31,6 @@ SUBDIRS= include source doc # uncomment the following if qfcc requires the math library #qfcc_LDADD=-lm -EXTRA_DIST=qfcc.lsm.in - dist-zip: distdir -chmod -R a+r $(distdir) ZIP="-r9q" zip $(distdir).zip $(NOCONV_DIST) diff --git a/tools/qflight/source/properties.c b/tools/qflight/source/properties.c index 9ea2cc1ef..2b76469a9 100644 --- a/tools/qflight/source/properties.c +++ b/tools/qflight/source/properties.c @@ -156,14 +156,6 @@ parse_noise (const char *arg) } } -static inline const char * -plstring (plitem_t *pl) -{ - if (pl->type == QFString) - return pl->data; - return 0; -} - static plitem_t * get_item (const char *key, plitem_t *d1, plitem_t *d2) { @@ -189,12 +181,12 @@ set_properties (entity_t *ent, plitem_t *dict) } if ((p = get_item ("light", dict, prop)) || (p = get_item ("_light", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->light = parse_light (str, ent->color); } } if ((p = get_item ("style", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->style = atoi (str); if ((unsigned) ent->style > 254) fprintf (stderr, "Bad light style %i (must be 0-254)", @@ -202,29 +194,29 @@ set_properties (entity_t *ent, plitem_t *dict) } } if ((p = get_item ("angle", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->angle = parse_float (str); } } if ((p = get_item ("wait", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->falloff = parse_float (str); ent->falloff *= ent->falloff; // presquared } } if ((p = get_item ("_lightradius", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->lightradius = parse_float (str); } } if ((p = get_item ("color", dict, prop)) || (p = get_item ("_color", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { parse_color (str, ent->color2); } } if ((p = get_item ("_attenuation", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->attenuation = parse_attenuation (str); if (ent->attenuation == -1) { ent->attenuation = options.attenuation; @@ -234,27 +226,27 @@ set_properties (entity_t *ent, plitem_t *dict) } } if ((p = get_item ("_radius", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->radius = parse_float (str); } } if ((p = get_item ("_noise", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->noise = parse_float (str); } } if ((p = get_item ("_noisetype", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->noisetype = parse_noise (str); } } if ((p = get_item ("_persistence", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->persistence = parse_float (str); } } if ((p = get_item ("_resolution", dict, prop))) { - if ((str = plstring (p))) { + if ((str = PL_String (p))) { ent->resolution = parse_float (str); } }