preliminary .xcf support.

imgtool tweaks.
some build system fixups.



git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5560 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2019-10-06 01:59:13 +00:00
parent b1f6417d3a
commit 1c1f04370f
27 changed files with 1483 additions and 301 deletions

View File

@ -61,15 +61,15 @@ IF(ZLIB_FOUND)
SET(FTE_LIB_DEFINES ${FTE_LIB_DEFINES};ZLIB_STATIC) SET(FTE_LIB_DEFINES ${FTE_LIB_DEFINES};ZLIB_STATIC)
SET(FTE_LIBS ${FTE_LIBS} ${ZLIB_LIBRARIES}) SET(FTE_LIBS ${FTE_LIBS} ${ZLIB_LIBRARIES})
SET(FTESV_LIBS ${FTESV_LIBS} ${ZLIB_LIBRARIES}) SET(FTESV_LIBS ${FTESV_LIBS} ${ZLIB_LIBRARIES})
SET(FTEQCC_LIBS ${FTEQCC_LIBS} ${ZLIB_LIBRARIES})
ELSE() ELSE()
MESSAGE(WARNING "libz library NOT available. compressed pk3 will not be available.") MESSAGE(WARNING "libz library NOT available. compressed pk3 will not be available.")
SET(FTE_LIB_DEFINES ${FTE_LIB_DEFINES};NO_ZLIB) SET(FTE_LIB_DEFINES ${FTE_LIB_DEFINES};NO_ZLIB)
SET(ZLIB_LIBRARIES )
ENDIF() ENDIF()
FIND_PACKAGE(BZip2) FIND_PACKAGE(BZip2)
IF(BZIP2_FOUND) IF(BZIP2_FOUND)
SET(FTE_LIB_DEFINES ${FTE_LIB_DEFINES};AVAIL_BZLIB) SET(FTE_LIB_DEFINES ${FTE_LIB_DEFINES};AVAIL_BZLIB;BZLIB_STATIC)
SET(FTE_LIBS ${FTE_LIBS} bz2) SET(FTE_LIBS ${FTE_LIBS} bz2)
SET(FTESV_LIBS ${FTESV_LIBS} bz2) SET(FTESV_LIBS ${FTESV_LIBS} bz2)
MESSAGE(STATUS "bzip2 library found. bz2-compressed pk3s will work for the price of extra bloat! yay!") MESSAGE(STATUS "bzip2 library found. bz2-compressed pk3s will work for the price of extra bloat! yay!")
@ -723,7 +723,7 @@ ELSE()
plugins/bullet/bulletplug.cpp plugins/bullet/bulletplug.cpp
) )
TARGET_INCLUDE_DIRECTORIES(bullet PUBLIC ${BULLET_INCLUDE_DIRS}) TARGET_INCLUDE_DIRECTORIES(bullet PUBLIC ${BULLET_INCLUDE_DIRS})
SET_TARGET_PROPERTIES(bullet PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN") SET_TARGET_PROPERTIES(bullet PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN;${FTE_LIB_DEFINES}")
SET_TARGET_PROPERTIES(bullet PROPERTIES PREFIX "fteplug_") SET_TARGET_PROPERTIES(bullet PROPERTIES PREFIX "fteplug_")
SET_TARGET_PROPERTIES(bullet PROPERTIES LINK_FLAGS "-Wl,--no-undefined") SET_TARGET_PROPERTIES(bullet PROPERTIES LINK_FLAGS "-Wl,--no-undefined")
TARGET_LINK_LIBRARIES(bullet m ${BULLET_LIBRARIES}) TARGET_LINK_LIBRARIES(bullet m ${BULLET_LIBRARIES})
@ -767,13 +767,15 @@ ELSE()
SET_TARGET_PROPERTIES(iqmtool PROPERTIES COMPILE_DEFINITIONS "${FTE_REVISON}") SET_TARGET_PROPERTIES(iqmtool PROPERTIES COMPILE_DEFINITIONS "${FTE_REVISON}")
SET(INSTALLTARGS ${INSTALLTARGS} iqmtool) SET(INSTALLTARGS ${INSTALLTARGS} iqmtool)
ADD_EXECUTABLE(imgtool IF(NOT WIN32)
engine/client/image.c ADD_EXECUTABLE(imgtool
imgtool.c engine/client/image.c
) imgtool.c
SET_TARGET_PROPERTIES(imgtool PROPERTIES COMPILE_DEFINITIONS "IMGTOOL;${FTE_LIB_DEFINES};${FTE_DEFINES};${FTE_REVISON}") )
TARGET_LINK_LIBRARIES(imgtool ${FTE_LIBS} ) SET_TARGET_PROPERTIES(imgtool PROPERTIES COMPILE_DEFINITIONS "IMGTOOL;${FTE_LIB_DEFINES};${FTE_DEFINES};${FTE_REVISON}")
SET(INSTALLTARGS ${INSTALLTARGS} imgtool) TARGET_LINK_LIBRARIES(imgtool ${FTE_LIBS} )
SET(INSTALLTARGS ${INSTALLTARGS} imgtool)
ENDIF()
ADD_EXECUTABLE(qtv ADD_EXECUTABLE(qtv
fteqtv/netchan.c fteqtv/netchan.c
@ -846,7 +848,7 @@ ELSE()
engine/qclib/qcd_main.c engine/qclib/qcd_main.c
) )
SET_TARGET_PROPERTIES(fteqcc PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_REVISON}") SET_TARGET_PROPERTIES(fteqcc PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_REVISON}")
TARGET_LINK_LIBRARIES(fteqcc ${ZLIB_LIBRARIES} m) TARGET_LINK_LIBRARIES(fteqcc ${FTEQCC_LIBS} m)
SET(INSTALLTARGS ${INSTALLTARGS} fteqcc) SET(INSTALLTARGS ${INSTALLTARGS} fteqcc)
IF(${WIN32}) IF(${WIN32})
@ -864,7 +866,7 @@ ELSE()
engine/qclib/qcd_main.c engine/qclib/qcd_main.c
) )
SET_TARGET_PROPERTIES(fteqccgui PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_REVISON}") SET_TARGET_PROPERTIES(fteqccgui PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_REVISON}")
TARGET_LINK_LIBRARIES(fteqccgui ${ZLIB_LIBRARIES} shlwapi ole32 comctl32 comdlg32) TARGET_LINK_LIBRARIES(fteqccgui ${FTEQCC_LIBS} shlwapi ole32 comctl32 comdlg32)
SET(INSTALLTARGS ${INSTALLTARGS} fteqccgui) SET(INSTALLTARGS ${INSTALLTARGS} fteqccgui)
ELSE() ELSE()
FIND_PACKAGE(Qt5Widgets) FIND_PACKAGE(Qt5Widgets)
@ -900,7 +902,7 @@ ELSE()
TARGET_INCLUDE_DIRECTORIES(fteqccgui PUBLIC ${Qt5Widgets_INCLUDE_DIRS} ${QSCINTILLA_INCLUDE_DIR}) TARGET_INCLUDE_DIRECTORIES(fteqccgui PUBLIC ${Qt5Widgets_INCLUDE_DIRS} ${QSCINTILLA_INCLUDE_DIR})
SET_TARGET_PROPERTIES(fteqccgui PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_REVISON};${Qt5Widgets_COMPILE_DEFINITIONS}") SET_TARGET_PROPERTIES(fteqccgui PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_REVISON};${Qt5Widgets_COMPILE_DEFINITIONS}")
SET_PROPERTY(TARGET fteqccgui PROPERTY POSITION_INDEPENDENT_CODE TRUE) SET_PROPERTY(TARGET fteqccgui PROPERTY POSITION_INDEPENDENT_CODE TRUE)
TARGET_LINK_LIBRARIES(fteqccgui ${ZLIB_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${QSCINTILLA_LIBRARY}) TARGET_LINK_LIBRARIES(fteqccgui ${FTEQCC_LIBS} ${Qt5Widgets_LIBRARIES} ${QSCINTILLA_LIBRARY})
ELSE() ELSE()
MESSAGE(WARNING "qscintilla/qt5widgets library not detected, no fteqccgui for you") MESSAGE(WARNING "qscintilla/qt5widgets library not detected, no fteqccgui for you")
SET(INSTALLTARGS ${INSTALLTARGS} fteqccgui) SET(INSTALLTARGS ${INSTALLTARGS} fteqccgui)

View File

@ -33,8 +33,8 @@ ANDROID_ZIPALIGN=$ANDROIDROOT/build-tools/$ANDROIDBUILDTOOLS/zipalign #relative
THREADS="-j 4" THREADS="-j 4"
TARGETS_LINUX="qcc-rel rel dbg vk-rel plugins-rel plugins-dbg" TARGETS_LINUX="qcc-rel rel dbg plugins-rel plugins-dbg" #gl-rel vk-rel
TARGETS_WINDOWS="sv-rel gl-rel vk-rel mingl-rel m-rel d3d-rel qcc-rel qccgui-scintilla qccgui-dbg gl-dbg sv-dbg plugins-dbg plugins-rel" TARGETS_WINDOWS="sv-rel m-rel qcc-rel qccgui-scintilla qccgui-dbg m-dbg sv-dbg plugins-dbg plugins-rel" #gl-rel vk-rel mingl-rel d3d-rel
PLUGINS_DROID="qi ezhud irc" PLUGINS_DROID="qi ezhud irc"
@ -382,7 +382,7 @@ if [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then
#linux distros vary too much with various dependancies and versions and such, so we might as well pre-build our own copies of certain libraries. this really only needs to be done once, but its safe to retry anyway. #linux distros vary too much with various dependancies and versions and such, so we might as well pre-build our own copies of certain libraries. this really only needs to be done once, but its safe to retry anyway.
cd $SVNROOT/engine cd $SVNROOT/engine
if [ "$BUILD_LINUXx86" == "y" ]; then if [ "$BUILD_LINUXx86" == "y" ]; then
echo "Making libraries (x86)..." echo "Making libraries (linux x86)..."
make FTE_TARGET=linux32 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null make FTE_TARGET=linux32 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null
fi fi
if [ "$BUILD_LINUXx64" == "y" ]; then if [ "$BUILD_LINUXx64" == "y" ]; then
@ -397,6 +397,12 @@ if [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then
echo "Making libraries (linux armhf)..." echo "Making libraries (linux armhf)..."
make FTE_TARGET=linuxarmhf makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null make FTE_TARGET=linuxarmhf makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null
fi fi
if [ "$BUILD_WINDOWS" == "y" ]; then
echo "Making libraries (linux armhf)..."
make FTE_TARGET=win32 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null
echo "Making libraries (linux armhf)..."
make FTE_TARGET=win64 makelibs CPUOPTIMISATIONS=-fno-finite-math-only 2>&1 >>/dev/null
fi
if [ "$BUILD_WINDOWS" == "y" ] && [[ "$PLUGINS_WINDOWS" =~ "ode" ]]; then if [ "$BUILD_WINDOWS" == "y" ] && [[ "$PLUGINS_WINDOWS" =~ "ode" ]]; then
echo "Prebuilding ODE library (win32)..." echo "Prebuilding ODE library (win32)..."
make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=ode 2>&1 >>/dev/null make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=ode 2>&1 >>/dev/null

View File

@ -2003,7 +2003,7 @@ endif
plugins-dbg: plugins-dbg:
@-mkdir -p $(DEBUG_DIR) @-mkdir -p $(DEBUG_DIR)
@if test -e ../plugins/Makefile; \ @if test -e ../plugins/Makefile; \
then $(MAKE) native -C ../plugins OUT_DIR="$(DEBUG_DIR)" CC="$(CC) $(W32_CFLAGS) $(DEBUG_CFLAGS)" CCX="$(CC) $(W32_CFLAGS) $(subst -Wno-pointer-sign,,$(DEBUG_CFLAGS))" ARCH="$(ARCH)" BASE_CFLAGS="$(BASE_CFLAGS)" BASE_CXXFLAGS="$(subst -Wno-pointer-sign,,$(BASE_CFLAGS))" FTE_TARGET="$(FTE_TARGET)"; \ then $(MAKE) native -C ../plugins OUT_DIR="$(DEBUG_DIR)" CC="$(CC) $(W32_CFLAGS) $(DEBUG_CFLAGS)" CCX="$(CC) $(W32_CFLAGS) $(subst -Wno-pointer-sign,,$(DEBUG_CFLAGS))" ARCH="$(ARCH)" BASE_CFLAGS="$(BASE_CFLAGS) $(BRANDFLAGS)" BASE_CXXFLAGS="$(subst -Wno-pointer-sign,,$(BASE_CFLAGS)) $(BRANDFLAGS)" FTE_TARGET="$(FTE_TARGET)"; \
else echo no plugins directory installed; \ else echo no plugins directory installed; \
fi fi
plugins: plugins:
@ -2011,7 +2011,7 @@ plugins:
plugins-rel: plugins-rel:
@-mkdir -p $(RELEASE_DIR) @-mkdir -p $(RELEASE_DIR)
@if test -e ../plugins/Makefile; \ @if test -e ../plugins/Makefile; \
then $(MAKE) native -C ../plugins OUT_DIR="$(RELEASE_DIR)" CC="$(CC) $(W32_CFLAGS) $(RELEASE_CFLAGS)" CCX="$(CXX) $(W32_CFLAGS) $(subst -Wno-pointer-sign,,$(RELEASE_CFLAGS))" ARCH="$(ARCH)" BASE_CFLAGS="$(BASE_CFLAGS)" BASE_CXXFLAGS="$(subst -Wno-pointer-sign,,$(BASE_CFLAGS))" FTE_TARGET="$(FTE_TARGET)"; \ then $(MAKE) native -C ../plugins OUT_DIR="$(RELEASE_DIR)" CC="$(CC) $(W32_CFLAGS) $(RELEASE_CFLAGS)" CCX="$(CXX) $(W32_CFLAGS) $(subst -Wno-pointer-sign,,$(RELEASE_CFLAGS))" ARCH="$(ARCH)" BASE_CFLAGS="$(BASE_CFLAGS) $(BRANDFLAGS)" BASE_CXXFLAGS="$(subst -Wno-pointer-sign,,$(BASE_CFLAGS)) $(BRANDFLAGS)" FTE_TARGET="$(FTE_TARGET)"; \
else echo no plugins directory installed; \ else echo no plugins directory installed; \
fi fi
plugins-rel: plugins-rel:
@ -2281,9 +2281,9 @@ libs-$(ARCH)/libspeexdsp.a:
test -f speexdsp-$(SPEEXDSPVER).tar.gz || wget http://downloads.xiph.org/releases/speex/speexdsp-$(SPEEXDSPVER).tar.gz test -f speexdsp-$(SPEEXDSPVER).tar.gz || wget http://downloads.xiph.org/releases/speex/speexdsp-$(SPEEXDSPVER).tar.gz
-test -f libs-$(ARCH)/libspeexdsp.a || (mkdir -p libs-$(ARCH)/speex && cd libs-$(ARCH) && tar -xvzf ../speexdsp-$(SPEEXDSPVER).tar.gz && cd speexdsp-$(SPEEXDSPVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLOVERRIDES) ./configure $(CONFIGARGS) && $(TOOLOVERRIDES) $(MAKE) && cp libspeexdsp/.libs/libspeexdsp.a ../ && cp -r include/speex/*.h ../speex/) -test -f libs-$(ARCH)/libspeexdsp.a || (mkdir -p libs-$(ARCH)/speex && cd libs-$(ARCH) && tar -xvzf ../speexdsp-$(SPEEXDSPVER).tar.gz && cd speexdsp-$(SPEEXDSPVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLOVERRIDES) ./configure $(CONFIGARGS) && $(TOOLOVERRIDES) $(MAKE) && cp libspeexdsp/.libs/libspeexdsp.a ../ && cp -r include/speex/*.h ../speex/)
libs-$(ARCH)/libfreetype.a: libs-$(ARCH)/libpng.a libs-$(ARCH)/libfreetype.a libs-$(ARCH)/ft2build.h: libs-$(ARCH)/libpng.a
test -f freetype-$(FREETYPEVER).tar.gz || wget https://download.savannah.gnu.org/releases/freetype/freetype-$(FREETYPEVER).tar.gz test -f freetype-$(FREETYPEVER).tar.gz || wget https://download.savannah.gnu.org/releases/freetype/freetype-$(FREETYPEVER).tar.gz
-test -f libs-$(ARCH)/libfreetype.a || (mkdir -p libs-$(ARCH) && cd libs-$(ARCH) && tar -xvzf ../freetype-$(FREETYPEVER).tar.gz && cd freetype-$(FREETYPEVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLOVERRIDES) ./configure CPPFLAGS=-I$(NATIVE_ABSBASE_DIR)/libs-$(ARCH)/ LDFLAGS=-L$(NATIVE_ABSBASE_DIR)/libs-$(ARCH)/ $(CONFIGARGS) --with-bzip2=no --with-harfbuzz=no && $(TOOLOVERRIDES) $(MAKE) && cp objs/.libs/libfreetype.a ../ && cp -r include/ ../) -test -f libs-$(ARCH)/libfreetype.a || (mkdir -p libs-$(ARCH) && cd libs-$(ARCH) && tar -xvzf ../freetype-$(FREETYPEVER).tar.gz && cd freetype-$(FREETYPEVER) && CFLAGS="$(CFLAGS) -Os" $(TOOLOVERRIDES) ./configure CPPFLAGS=-I$(NATIVE_ABSBASE_DIR)/libs-$(ARCH)/ LDFLAGS=-L$(NATIVE_ABSBASE_DIR)/libs-$(ARCH)/ $(CONFIGARGS) --with-bzip2=no --with-harfbuzz=no && $(TOOLOVERRIDES) $(MAKE) && cp objs/.libs/libfreetype.a ../ && bash && cp -r include/* ../)
libs-$(ARCH)/libBulletDynamics.a: libs-$(ARCH)/libBulletDynamics.a:
test -f bullet3-$(BULLETVER).tar.gz || wget https://github.com/bulletphysics/bullet3/archive/$(BULLETVER).tar.gz -O bullet3-$(BULLETVER).tar.gz test -f bullet3-$(BULLETVER).tar.gz || wget https://github.com/bulletphysics/bullet3/archive/$(BULLETVER).tar.gz -O bullet3-$(BULLETVER).tar.gz

View File

@ -4905,7 +4905,7 @@ void CL_Init (void)
Cmd_AddCommandD ("fog", CL_Fog_f, "fog <density> <red> <green> <blue> <alpha> <depthbias>"); Cmd_AddCommandD ("fog", CL_Fog_f, "fog <density> <red> <green> <blue> <alpha> <depthbias>");
Cmd_AddCommandD ("waterfog", CL_Fog_f, "waterfog <density> <red> <green> <blue> <alpha> <depthbias>"); Cmd_AddCommandD ("waterfog", CL_Fog_f, "waterfog <density> <red> <green> <blue> <alpha> <depthbias>");
Cmd_AddCommand ("skygroup", CL_Skygroup_f); Cmd_AddCommandD ("skygroup", CL_Skygroup_f, "Provides a way to associate a skybox name with a series of maps, so that the requested skybox will override on a per-map basis.");
// //
// Windows commands // Windows commands
// //

View File

@ -1080,6 +1080,7 @@ void CL_PredictMovePNum (int seat)
if (nopred) if (nopred)
{ {
lerpangles = false;
//match interpolation info //match interpolation info
from.frame = ((char*)cl.previouspackentities - (char*)&cl.inframes[0].packet_entities) / sizeof(inframe_t); from.frame = ((char*)cl.previouspackentities - (char*)&cl.inframes[0].packet_entities) / sizeof(inframe_t);
from.time = cl.inframes[from.frame & UPDATE_MASK].packet_entities.servertime; from.time = cl.inframes[from.frame & UPDATE_MASK].packet_entities.servertime;

File diff suppressed because it is too large Load Diff

View File

@ -2140,6 +2140,7 @@ uploadfmt_t PR_TranslateTextureFormat(int qcformat)
case 11: return PTI_RGB565; case 11: return PTI_RGB565;
case 12: return PTI_RGBA4444; case 12: return PTI_RGBA4444;
case 13: return PTI_RG8; case 13: return PTI_RG8;
case 14: return PTI_RGB32F;
default:return PTI_INVALID; default:return PTI_INVALID;
} }

View File

@ -929,7 +929,7 @@ void skel_generateragdoll_f(void)
//FIXME: only write out the bodies specified as arguments, and with no // //FIXME: only write out the bodies specified as arguments, and with no //
for (i = 0; i < numbones; i++) for (i = 0; i < numbones; i++)
VFS_PUTS(f, va("//body b_%s %s\n", bones[i].name, bones[i].name)); VFS_PUTS(f, va("//body \"b_%s\" \"%s\"\n", bones[i].name, bones[i].name));
VFS_PUTS(f, "\n"); VFS_PUTS(f, "\n");
VFS_PUTS(f, "updatejoint default\n"); VFS_PUTS(f, "updatejoint default\n");

View File

@ -34,25 +34,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
qboolean r_pushdepth; qboolean r_pushdepth;
#endif #endif
extern cvar_t r_ambient; extern cvar_t r_ambient;
static vec3_t modelorg; /*set before recursively entering the visible surface finder*/ static vec3_t modelorg; /*set before recursively entering the visible surface finder*/
model_t *currentmodel; model_t *currentmodel;
size_t maxblocksize; static size_t maxblocksize;
vec3_t *blocknormals; static vec3_t *blocknormals;
unsigned *blocklights; static unsigned *blocklights;
lightmapinfo_t **lightmap; lightmapinfo_t **lightmap;
int numlightmaps; int numlightmaps;
static const float rgb9e5tab[32] = { //multipliers for the 9-bit mantissa, according to the biased mantissa extern const float rgb9e5tab[32];
//aka: pow(2, biasedexponent - bias-bits) where bias is 15 and bits is 9
1.0/(1<<24), 1.0/(1<<23), 1.0/(1<<22), 1.0/(1<<21), 1.0/(1<<20), 1.0/(1<<19), 1.0/(1<<18), 1.0/(1<<17),
1.0/(1<<16), 1.0/(1<<15), 1.0/(1<<14), 1.0/(1<<13), 1.0/(1<<12), 1.0/(1<<11), 1.0/(1<<10), 1.0/(1<<9),
1.0/(1<<8), 1.0/(1<<7), 1.0/(1<<6), 1.0/(1<<5), 1.0/(1<<4), 1.0/(1<<3), 1.0/(1<<2), 1.0/(1<<1),
1.0, 1.0*(1<<1), 1.0*(1<<2), 1.0*(1<<3), 1.0*(1<<4), 1.0*(1<<5), 1.0*(1<<6), 1.0*(1<<7),
};
extern mleaf_t *r_vischain; // linked list of visible leafs extern mleaf_t *r_vischain; // linked list of visible leafs

View File

@ -473,6 +473,7 @@ qboolean Image_WriteKTXFile(const char *filename, enum fs_relative fsroot, struc
qboolean Image_WriteDDSFile(const char *filename, enum fs_relative fsroot, struct pendingtextureinfo *mips); qboolean Image_WriteDDSFile(const char *filename, enum fs_relative fsroot, struct pendingtextureinfo *mips);
void Image_BlockSizeForEncoding(uploadfmt_t encoding, unsigned int *blockbytes, unsigned int *blockwidth, unsigned int *blockheight); void Image_BlockSizeForEncoding(uploadfmt_t encoding, unsigned int *blockbytes, unsigned int *blockwidth, unsigned int *blockheight);
const char *Image_FormatName(uploadfmt_t encoding); const char *Image_FormatName(uploadfmt_t encoding);
qboolean Image_FormatHasAlpha(uploadfmt_t encoding);
image_t *Image_LoadTexture (const char *identifier, int width, int height, uploadfmt_t fmt, void *data, unsigned int flags); image_t *Image_LoadTexture (const char *identifier, int width, int height, uploadfmt_t fmt, void *data, unsigned int flags);
struct pendingtextureinfo *Image_LoadMipsFromMemory(int flags, const char *iname, const char *fname, qbyte *filedata, int filesize); struct pendingtextureinfo *Image_LoadMipsFromMemory(int flags, const char *iname, const char *fname, qbyte *filedata, int filesize);

View File

@ -117,11 +117,13 @@ typedef enum uploadfmt
//floating point formats //floating point formats
PTI_R16F, PTI_R16F,
PTI_R32F, PTI_R32F,
PTI_RGB32F, //so qc can just use vectors for rgb. not really recommended.
PTI_RGBA16F, //consider using e5bgr9 or bc6/astc PTI_RGBA16F, //consider using e5bgr9 or bc6/astc
PTI_RGBA32F, //usually overkill PTI_RGBA32F, //usually overkill
//packed/misaligned formats: these are specified in native endian order (high bits listed first because that's how things are represented in hex), so may need byte swapping... //packed/misaligned formats: these are specified in native endian order (high bits listed first because that's how things are represented in hex), so may need byte swapping...
PTI_A2BGR10, //mostly for rendertargets, might also be useful for overbight lightmaps. PTI_A2BGR10, //mostly for rendertargets, might also be useful for overbight lightmaps.
PTI_E5BGR9, //mostly for fancy lightmaps PTI_E5BGR9, //mostly for fancy lightmaps
PTI_B10G11R11F, //unshared exponents
PTI_RGB565, //16bit alphaless format. PTI_RGB565, //16bit alphaless format.
PTI_RGBA4444, //16bit format (gl) PTI_RGBA4444, //16bit format (gl)
PTI_ARGB4444, //16bit format (d3d) PTI_ARGB4444, //16bit format (d3d)

View File

@ -163,6 +163,7 @@
//#define IMAGEFMT_HDR //#define IMAGEFMT_HDR
//#define IMAGEFMT_PBM //#define IMAGEFMT_PBM
//#define IMAGEFMT_PSD //#define IMAGEFMT_PSD
//#define IMAGEFMT_XCF //flattens, most of the time
//#define IMAGEFMT_VTF //#define IMAGEFMT_VTF
//#define IPLOG //#define IPLOG
//#define MVD_RECORDING //#define MVD_RECORDING

View File

@ -93,6 +93,7 @@
#define IMAGEFMT_ASTC //lame simple header around a single astc image. not needed for astc in ktx files etc. its better to use ktx files. #define IMAGEFMT_ASTC //lame simple header around a single astc image. not needed for astc in ktx files etc. its better to use ktx files.
#define IMAGEFMT_PBM //pbm/ppm/pgm/pfm family formats. #define IMAGEFMT_PBM //pbm/ppm/pgm/pfm family formats.
#define IMAGEFMT_PSD //baselayer only. #define IMAGEFMT_PSD //baselayer only.
#define IMAGEFMT_XCF //flattens, most of the time
#define IMAGEFMT_HDR //an RGBE format. #define IMAGEFMT_HDR //an RGBE format.
#define IMAGEFMT_DDS //.dds files embed mipmaps and texture compression. faster to load. #define IMAGEFMT_DDS //.dds files embed mipmaps and texture compression. faster to load.
#define IMAGEFMT_TGA //somewhat mandatory #define IMAGEFMT_TGA //somewhat mandatory

View File

@ -95,6 +95,7 @@
//#define IMAGEFMT_ASTC //lame simple header around a single astc image. not needed for astc in ktx files etc. its better to use ktx files. //#define IMAGEFMT_ASTC //lame simple header around a single astc image. not needed for astc in ktx files etc. its better to use ktx files.
//#define IMAGEFMT_PBM //pbm/ppm/pgm/pfm family formats. //#define IMAGEFMT_PBM //pbm/ppm/pgm/pfm family formats.
//#define IMAGEFMT_PSD //baselayer only. //#define IMAGEFMT_PSD //baselayer only.
//#define IMAGEFMT_XCF //flattens, most of the time
//#define IMAGEFMT_HDR //an RGBE format. //#define IMAGEFMT_HDR //an RGBE format.
//#define IMAGEFMT_DDS //.dds files embed mipmaps and texture compression. faster to load. //#define IMAGEFMT_DDS //.dds files embed mipmaps and texture compression. faster to load.
#define IMAGEFMT_TGA //somewhat mandatory #define IMAGEFMT_TGA //somewhat mandatory

View File

@ -93,6 +93,7 @@
//#define IMAGEFMT_ASTC //lame simple header around a single astc image. not needed for astc in ktx files etc. its better to use ktx files. //#define IMAGEFMT_ASTC //lame simple header around a single astc image. not needed for astc in ktx files etc. its better to use ktx files.
//#define IMAGEFMT_PBM //pbm/ppm/pgm/pfm family formats. //#define IMAGEFMT_PBM //pbm/ppm/pgm/pfm family formats.
//#define IMAGEFMT_PSD //baselayer only. //#define IMAGEFMT_PSD //baselayer only.
//#define IMAGEFMT_XCF //flattens, most of the time
//#define IMAGEFMT_HDR //an RGBE format. //#define IMAGEFMT_HDR //an RGBE format.
#define IMAGEFMT_DDS //.dds files embed mipmaps and texture compression. faster to load. #define IMAGEFMT_DDS //.dds files embed mipmaps and texture compression. faster to load.
#define IMAGEFMT_TGA //somewhat mandatory #define IMAGEFMT_TGA //somewhat mandatory

View File

@ -178,6 +178,7 @@
//#define IMAGEFMT_HDR //#define IMAGEFMT_HDR
//#define IMAGEFMT_PBM //#define IMAGEFMT_PBM
//#define IMAGEFMT_PSD //#define IMAGEFMT_PSD
//#define IMAGEFMT_XCF //flattens, most of the time
#define IMAGEFMT_TGA #define IMAGEFMT_TGA
#define IMAGEFMT_LMP #define IMAGEFMT_LMP
//#define IMAGEFMT_PNG //#define IMAGEFMT_PNG

View File

@ -845,7 +845,7 @@ static int QDECL COM_Dir_List(const char *name, qofs_t size, time_t mtime, void
#endif #endif
else if (!Q_strcasecmp(ext, "tga") || !Q_strcasecmp(ext, "png") || !Q_strcasecmp(ext, "jpg") || !Q_strcasecmp(ext, "jpeg")|| !Q_strcasecmp(ext, "lmp") || !Q_strcasecmp(ext, "ico") || else if (!Q_strcasecmp(ext, "tga") || !Q_strcasecmp(ext, "png") || !Q_strcasecmp(ext, "jpg") || !Q_strcasecmp(ext, "jpeg")|| !Q_strcasecmp(ext, "lmp") || !Q_strcasecmp(ext, "ico") ||
!Q_strcasecmp(ext, "pcx") || !Q_strcasecmp(ext, "bmp") || !Q_strcasecmp(ext, "dds") || !Q_strcasecmp(ext, "ktx") || !Q_strcasecmp(ext, "vtf") || !Q_strcasecmp(ext, "psd") || !Q_strcasecmp(ext, "pcx") || !Q_strcasecmp(ext, "bmp") || !Q_strcasecmp(ext, "dds") || !Q_strcasecmp(ext, "ktx") || !Q_strcasecmp(ext, "vtf") || !Q_strcasecmp(ext, "psd") ||
!Q_strcasecmp(ext, "astc")|| !Q_strcasecmp(ext, "htga")|| !Q_strcasecmp(ext, "exr") || !Q_strcasecmp(ext, "astc")|| !Q_strcasecmp(ext, "htga")|| !Q_strcasecmp(ext, "exr") || !Q_strcasecmp(ext, "xcf") ||
!Q_strcasecmp(ext, "pbm") || !Q_strcasecmp(ext, "ppm") || !Q_strcasecmp(ext, "pgm") || !Q_strcasecmp(ext, "pam") || !Q_strcasecmp(ext, "pfm") || !Q_strcasecmp(ext, "hdr") ) !Q_strcasecmp(ext, "pbm") || !Q_strcasecmp(ext, "ppm") || !Q_strcasecmp(ext, "pgm") || !Q_strcasecmp(ext, "pam") || !Q_strcasecmp(ext, "pfm") || !Q_strcasecmp(ext, "hdr") )
{ {
//FIXME: image replacements are getting in the way here. //FIXME: image replacements are getting in the way here.
@ -3877,7 +3877,7 @@ static void FS_ReloadPackFilesFlags(unsigned int reloadflags)
{ {
searchpath_t *oldpaths; searchpath_t *oldpaths;
searchpath_t *next; searchpath_t *next;
int i; int i, j;
int orderkey; int orderkey;
COM_AssertMainThread("FS_ReloadPackFilesFlags"); COM_AssertMainThread("FS_ReloadPackFilesFlags");
@ -3912,7 +3912,7 @@ static void FS_ReloadPackFilesFlags(unsigned int reloadflags)
#ifdef NQPROT #ifdef NQPROT
standard_quake = true; standard_quake = true;
#endif #endif
for (i = 0; i < sizeof(fs_manifest->gamepath) / sizeof(fs_manifest->gamepath[0]); i++) for (i = 0; i < countof(fs_manifest->gamepath); i++)
{ {
char *dir = fs_manifest->gamepath[i].path; char *dir = fs_manifest->gamepath[i].path;
if (dir && fs_manifest->gamepath[i].base) if (dir && fs_manifest->gamepath[i].base)
@ -3973,7 +3973,7 @@ static void FS_ReloadPackFilesFlags(unsigned int reloadflags)
next->flags |= SPF_BASEPATH; next->flags |= SPF_BASEPATH;
com_base_searchpaths = com_searchpaths; com_base_searchpaths = com_searchpaths;
for (i = 0; i < sizeof(fs_manifest->gamepath) / sizeof(fs_manifest->gamepath[0]); i++) for (i = 0; i < countof(fs_manifest->gamepath); i++)
{ {
char *dir = fs_manifest->gamepath[i].path; char *dir = fs_manifest->gamepath[i].path;
if (dir && !fs_manifest->gamepath[i].base) if (dir && !fs_manifest->gamepath[i].base)
@ -3987,6 +3987,15 @@ static void FS_ReloadPackFilesFlags(unsigned int reloadflags)
continue; continue;
} }
for (j = 0; j < countof(fs_manifest->gamepath); j++)
{
char *dir2 = fs_manifest->gamepath[j].path;
if (dir2 && fs_manifest->gamepath[j].base && !strcmp(dir, dir2))
break;
}
if (j < countof(fs_manifest->gamepath))
continue; //already loaded above. don't mess up gameonly_gamedir.
if (*dir == '*') if (*dir == '*')
{ {
} }

View File

@ -1338,11 +1338,11 @@ static unsigned int Q1BSP_TranslateContents(int contents)
case Q1CONTENTS_LAVA: case Q1CONTENTS_LAVA:
return FTECONTENTS_LAVA; return FTECONTENTS_LAVA;
case Q1CONTENTS_SKY: case Q1CONTENTS_SKY:
return FTECONTENTS_SKY; return FTECONTENTS_SKY|FTECONTENTS_PLAYERCLIP|FTECONTENTS_MONSTERCLIP;
case Q1CONTENTS_LADDER: case Q1CONTENTS_LADDER:
return FTECONTENTS_LADDER; return FTECONTENTS_LADDER;
case Q1CONTENTS_CLIP: case Q1CONTENTS_CLIP:
return FTECONTENTS_PLAYERCLIP; return FTECONTENTS_PLAYERCLIP|FTECONTENTS_MONSTERCLIP;
case Q1CONTENTS_TRANS: case Q1CONTENTS_TRANS:
return FTECONTENTS_SOLID; return FTECONTENTS_SOLID;

View File

@ -19,6 +19,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
// world.h // world.h
#include "quakedef.h"
typedef struct plane_s typedef struct plane_s
{ {
vec3_t normal; vec3_t normal;

View File

@ -221,7 +221,9 @@ qboolean D3D11_LoadTextureMips(image_t *tex, const struct pendingtextureinfo *mi
case PTI_E5BGR9: case PTI_E5BGR9:
tdesc.Format = DXGI_FORMAT_R9G9B9E5_SHAREDEXP; tdesc.Format = DXGI_FORMAT_R9G9B9E5_SHAREDEXP;
break; break;
case PTI_B10G11R11F:
tdesc.Format = DXGI_FORMAT_R11G11B10_FLOAT;
break;
case PTI_RGBA8_SRGB: case PTI_RGBA8_SRGB:
tdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; tdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
break; break;
@ -299,6 +301,9 @@ qboolean D3D11_LoadTextureMips(image_t *tex, const struct pendingtextureinfo *mi
case PTI_RGBA32F: case PTI_RGBA32F:
tdesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; tdesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
break; break;
case PTI_RGB32F:
tdesc.Format = DXGI_FORMAT_R32G32B32_FLOAT;
break;
case PTI_L8: //UNSUPPORTED case PTI_L8: //UNSUPPORTED
case PTI_P8: //R8, but different usage. case PTI_P8: //R8, but different usage.
case PTI_R8: case PTI_R8:

View File

@ -163,9 +163,12 @@ void GL_SetupFormats(void)
// glfmtc(PTI_RGBA5551,(ver>=3)?GL_RGB555A1:0, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, tc_rgba1); // glfmtc(PTI_RGBA5551,(ver>=3)?GL_RGB555A1:0, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, tc_rgba1);
} }
if (GL_CheckExtension("GL_OES_texture_half_float")) if (GL_CheckExtension("GL_OES_texture_half_float"))
glfmtc(PTI_RGBA16F, (ver>=3)?GL_RGBA16F:0, GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES, 0); //not to be confused with GL_HALF_FLOAT[_ARB] which has a different value glfmt(PTI_RGBA16F, (ver>=3)?GL_RGBA16F:0, GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES); //not to be confused with GL_HALF_FLOAT[_ARB] which has a different value
if (GL_CheckExtension("GL_OES_texture_float")) if (GL_CheckExtension("GL_OES_texture_float"))
glfmtc(PTI_RGBA32F, (ver>=3)?GL_RGBA32F:0, GL_RGBA, GL_RGBA, GL_FLOAT, 0); {
glfmt(PTI_RGBA32F, (ver>=3)?GL_RGBA32F:0, GL_RGBA, GL_RGBA, GL_FLOAT);
glfmt(PTI_RGB32F, (ver>=3)?GL_RGB32F:0, GL_RGB, GL_RGB, GL_FLOAT);
}
if (GL_CheckExtension("GL_WEBGL_depth_texture")) if (GL_CheckExtension("GL_WEBGL_depth_texture"))
{ //24bit is okay with this one. { //24bit is okay with this one.
@ -236,6 +239,8 @@ void GL_SetupFormats(void)
} }
if (ver >= 3.0 || GL_CheckExtension("GL_EXT_texture_shared_exponent")) if (ver >= 3.0 || GL_CheckExtension("GL_EXT_texture_shared_exponent"))
glfmt(PTI_E5BGR9, GL_RGB9_E5, GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV); glfmt(PTI_E5BGR9, GL_RGB9_E5, GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV);
if (ver >= 3.0 || GL_CheckExtension("GL_EXT_packed_float"))
glfmt(PTI_B10G11R11F, GL_R11F_G11F_B10F, GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV);
if (ver >= 3.0 || GL_CheckExtension("GL_EXT_packed_pixels")) //so gl1.2 then. if (ver >= 3.0 || GL_CheckExtension("GL_EXT_packed_pixels")) //so gl1.2 then.
glfmt(PTI_A2BGR10, GL_RGB10_A2, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV); glfmt(PTI_A2BGR10, GL_RGB10_A2, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV);
if (ver >= 3.0 || GL_CheckExtension("GL_ARB_texture_rg")) if (ver >= 3.0 || GL_CheckExtension("GL_ARB_texture_rg"))
@ -260,6 +265,8 @@ void GL_SetupFormats(void)
glfmtc(PTI_RGBA16F, GL_RGBA16F, GL_RGBA, GL_RGBA, GL_HALF_FLOAT, 0); glfmtc(PTI_RGBA16F, GL_RGBA16F, GL_RGBA, GL_RGBA, GL_HALF_FLOAT, 0);
glfmtc(PTI_RGBA32F, GL_RGBA32F, GL_RGBA, GL_RGBA, GL_FLOAT, 0); glfmtc(PTI_RGBA32F, GL_RGBA32F, GL_RGBA, GL_RGBA, GL_FLOAT, 0);
glfmt(PTI_RGB32F, GL_RGB32F, GL_RGB, GL_RGB, GL_FLOAT);
} }
if (ver >= 1.2 && !gl_config_gles) if (ver >= 1.2 && !gl_config_gles)
{ {

View File

@ -58,6 +58,8 @@ void R_SetSky(const char *sky)
const char *shadername; const char *shadername;
extern cvar_t r_skyboxname; extern cvar_t r_skyboxname;
Q_strncpyz(cl.skyname, sky, sizeof(cl.skyname)); Q_strncpyz(cl.skyname, sky, sizeof(cl.skyname));
if (qrenderer <= QR_NONE)
return; //not ready yet...
if (*r_skyboxname.string) //override it with the user's preference if (*r_skyboxname.string) //override it with the user's preference
sky = r_skyboxname.string; sky = r_skyboxname.string;

View File

@ -696,6 +696,11 @@ typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei
#define GL_RG8_SNORM 0x8F95 /*opengl 3.1*/ #define GL_RG8_SNORM 0x8F95 /*opengl 3.1*/
#endif #endif
#ifndef GL_R11F_G11F_B10F
#define GL_R11F_G11F_B10F 0x8C3A
#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
#endif
#ifndef GL_TEXTURE_SWIZZLE_R #ifndef GL_TEXTURE_SWIZZLE_R
#define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_R 0x8E42
#define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_G 0x8E43

View File

@ -10842,7 +10842,7 @@ static BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"crossproduct", PF_crossproduct, 0, 0, 0, 0, D("#define dotproduct(v1,v2) ((vector)(v1)*(vector)(v2))\nvector(vector v1, vector v2)", "Small helper function to calculate the crossproduct of two vectors.")}, {"crossproduct", PF_crossproduct, 0, 0, 0, 0, D("#define dotproduct(v1,v2) ((vector)(v1)*(vector)(v2))\nvector(vector v1, vector v2)", "Small helper function to calculate the crossproduct of two vectors.")},
{"pushmove", PF_pushmove, 0, 0, 0, 0, "float(entity pusher, vector move, vector amove)"}, {"pushmove", PF_pushmove, 0, 0, 0, 0, "float(entity pusher, vector move, vector amove)"},
#ifdef TERRAIN #ifdef TERRAIN
{"terrain_edit", PF_terrain_edit, 0, 0, 0, 278, D("void(float action, optional vector pos, optional float radius, optional float quant, ...)", "Realtime terrain editing. Actions are the TEREDIT_ constants.")},// (??FTE_TERRAIN_EDIT?? {"terrain_edit", PF_terrain_edit, 0, 0, 0, 278, D("__variant(float action, optional vector pos, optional float radius, optional float quant, ...)", "Realtime terrain editing. Actions are the TEREDIT_ constants.")},// (??FTE_TERRAIN_EDIT??
#define qcbrushface \ #define qcbrushface \
"typedef struct\n{\n" \ "typedef struct\n{\n" \
@ -10924,8 +10924,8 @@ static BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"drawline", PF_Fixme, 0, 0, 0, 315, D("void(float width, vector pos1, vector pos2, vector rgb, float alpha, optional float drawflag)", "Draws a 2d line between the two 2d points.")},// (EXT_CSQC) {"drawline", PF_Fixme, 0, 0, 0, 315, D("void(float width, vector pos1, vector pos2, vector rgb, float alpha, optional float drawflag)", "Draws a 2d line between the two 2d points.")},// (EXT_CSQC)
{"iscachedpic", PF_Fixme, 0, 0, 0, 316, D("float(string name)", "Checks to see if the image is currently loaded. Engines might lie, or cache between maps.")},// (EXT_CSQC) {"iscachedpic", PF_Fixme, 0, 0, 0, 316, D("float(string name)", "Checks to see if the image is currently loaded. Engines might lie, or cache between maps.")},// (EXT_CSQC)
{"precache_pic", PF_Fixme, 0, 0, 0, 317, D("string(string name, optional float trywad)", "Forces the engine to load the named image. If trywad is specified, the specified name must any lack path and extension.")},// (EXT_CSQC) {"precache_pic", PF_Fixme, 0, 0, 0, 317, D("string(string name, optional float trywad)", "Forces the engine to load the named image. If trywad is specified, the specified name must any lack path and extension.")},// (EXT_CSQC)
{"r_uploadimage", PF_Fixme, 0, 0, 0, 0, D("void(string imagename, int width, int height, void *pixeldata, optional int datasize, optional int format)", "Updates a texture with the specified rgba data. Will be created if needed. If blobsize is specified then the image is decoded (eg .ktx or .dds data) instead of being raw R8G8B8A data. You'll typically want shaderforname to also generate a shader to use the texture.")}, {"r_uploadimage", PF_Fixme, 0, 0, 0, 0, D("void(string imagename, int width, int height, void *pixeldata, optional int datasize, optional int format)", "Updates a texture with the specified rgba data (uploading it to the gpu). Will be created if needed. If datasize is specified then the image is decoded (eg .ktx or .dds data) instead of being raw R8G8B8A data. You'll typically want shaderforname to also generate a shader to use the texture.")},
{"r_readimage", PF_Fixme, 0, 0, 0, 0, D("int*(string filename, __out int width, __out int height)", "Reads and decodes an image from disk, providing raw R8G8B8A pixel data. Should not be used for dds or ktx etc formats. Returns __NULL__ if the image could not be read for any reason. Use memfree to free the data once you're done with it.")}, {"r_readimage", PF_Fixme, 0, 0, 0, 0, D("int*(string filename, __out int width, __out int height)", "Reads and decodes an image from disk, providing raw R8G8B8A8 pixel data. Should not be used for dds or ktx etc formats. Returns __NULL__ if the image could not be read for any reason. Use memfree to free the data once you're done with it.")},
{"drawgetimagesize",PF_Fixme, 0, 0, 0, 318, D("#define draw_getimagesize drawgetimagesize\nvector(string picname)", "Returns the dimensions of the named image. Images specified with .lmp should give the original .lmp's dimensions even if texture replacements use a different resolution.")},// (EXT_CSQC) {"drawgetimagesize",PF_Fixme, 0, 0, 0, 318, D("#define draw_getimagesize drawgetimagesize\nvector(string picname)", "Returns the dimensions of the named image. Images specified with .lmp should give the original .lmp's dimensions even if texture replacements use a different resolution.")},// (EXT_CSQC)
{"freepic", PF_Fixme, 0, 0, 0, 319, D("void(string name)", "Tells the engine that the image is no longer needed. The image will appear to be new the next time its needed.")},// (EXT_CSQC) {"freepic", PF_Fixme, 0, 0, 0, 319, D("void(string name)", "Tells the engine that the image is no longer needed. The image will appear to be new the next time its needed.")},// (EXT_CSQC)
//320 //320
@ -12544,6 +12544,7 @@ void PR_DumpPlatform_f(void)
{"IMGFMT_R5G6B5", "const float", CS|MENU, D("Packed 16-bit colour pixel format."), 11}, {"IMGFMT_R5G6B5", "const float", CS|MENU, D("Packed 16-bit colour pixel format."), 11},
{"IMGFMT_R4G4B4A4", "const float", CS|MENU, D("Packed 16-bit colour pixel format, with alpha"), 12}, {"IMGFMT_R4G4B4A4", "const float", CS|MENU, D("Packed 16-bit colour pixel format, with alpha"), 12},
{"IMGFMT_R8G8", "const float", CS|MENU, D("16-bit two-channel pixel format."), 13}, {"IMGFMT_R8G8", "const float", CS|MENU, D("16-bit two-channel pixel format."), 13},
{"IMGFMT_R32G32B32F", "const float", CS|MENU, D("A pixel format that matches QC's vector type."), 14},
{"RF_VIEWMODEL", "const float", CS, D("Specifies that the entity is a view model, and that its origin is relative to the current view position. These entities are also subject to viewweapon bob."), CSQCRF_VIEWMODEL}, {"RF_VIEWMODEL", "const float", CS, D("Specifies that the entity is a view model, and that its origin is relative to the current view position. These entities are also subject to viewweapon bob."), CSQCRF_VIEWMODEL},
{"RF_EXTERNALMODEL", "const float", CS, D("Specifies that this entity should be displayed in mirrors (and may still cast shadows), but will not otherwise be visible."), CSQCRF_EXTERNALMODEL}, {"RF_EXTERNALMODEL", "const float", CS, D("Specifies that this entity should be displayed in mirrors (and may still cast shadows), but will not otherwise be visible."), CSQCRF_EXTERNALMODEL},

View File

@ -1366,6 +1366,7 @@ vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t lay
case PTI_RG8_SNORM: format = VK_FORMAT_R8G8_SNORM; break; case PTI_RG8_SNORM: format = VK_FORMAT_R8G8_SNORM; break;
case PTI_A2BGR10: format = VK_FORMAT_A2B10G10R10_UNORM_PACK32; break; case PTI_A2BGR10: format = VK_FORMAT_A2B10G10R10_UNORM_PACK32; break;
case PTI_E5BGR9: format = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; break; case PTI_E5BGR9: format = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; break;
case PTI_B10G11R11F: format = VK_FORMAT_B10G11R11_UFLOAT_PACK32; break;
//swizzled/legacy formats //swizzled/legacy formats
case PTI_L8: format = VK_FORMAT_R8_UNORM; break; case PTI_L8: format = VK_FORMAT_R8_UNORM; break;
case PTI_L8A8: format = VK_FORMAT_R8G8_UNORM; break; case PTI_L8A8: format = VK_FORMAT_R8G8_UNORM; break;
@ -1478,6 +1479,7 @@ vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t lay
//misaligned formats //misaligned formats
case PTI_RGB8: format = VK_FORMAT_R8G8B8_UNORM; break; case PTI_RGB8: format = VK_FORMAT_R8G8B8_UNORM; break;
case PTI_BGR8: format = VK_FORMAT_B8G8R8_UNORM; break; case PTI_BGR8: format = VK_FORMAT_B8G8R8_UNORM; break;
case PTI_RGB32F: format = VK_FORMAT_R32G32B32_SFLOAT; break;
case PTI_RGB8_SRGB: format = VK_FORMAT_R8G8B8_SRGB; break; case PTI_RGB8_SRGB: format = VK_FORMAT_R8G8B8_SRGB; break;
case PTI_BGR8_SRGB: format = VK_FORMAT_B8G8R8_SRGB; break; case PTI_BGR8_SRGB: format = VK_FORMAT_B8G8R8_SRGB; break;
@ -4126,6 +4128,7 @@ void VK_CheckTextureFormats(void)
{PTI_ARGB1555, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT}, {PTI_ARGB1555, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT},
{PTI_RGBA16F, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT}, {PTI_RGBA16F, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT},
{PTI_RGBA32F, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT}, {PTI_RGBA32F, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT},
{PTI_RGB32F, VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT},
{PTI_L8, VK_FORMAT_R8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, {PTI_L8, VK_FORMAT_R8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT},
{PTI_L8A8, VK_FORMAT_R8G8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, {PTI_L8A8, VK_FORMAT_R8G8_UNORM, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT},
{PTI_L8_SRGB, VK_FORMAT_R8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT}, {PTI_L8_SRGB, VK_FORMAT_R8_SRGB, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT},

366
imgtool.c
View File

@ -3,6 +3,7 @@
#undef stderr #undef stderr
#define stderr stdout #define stderr stdout
#include <limits.h>
#ifdef _WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#endif #endif
@ -97,7 +98,7 @@ void FS_CreatePath(const char *pname, enum fs_relative relativeto)
} }
free(t); free(t);
} }
qboolean Sys_remove (const char *path) qboolean FS_Remove (const char *path, enum fs_relative relativeto)
{ {
//remove is part of c89. //remove is part of c89.
if (remove(path) == -1) if (remove(path) == -1)
@ -293,7 +294,7 @@ void Image_GenerateMips(struct pendingtextureinfo *mips, unsigned int flags);
int Image_WritePNG (const char *filename, enum fs_relative fsroot, int compression, void **buffers, int numbuffers, qintptr_t bufferstride, int width, int height, enum uploadfmt fmt, qboolean writemetadata); int Image_WritePNG (const char *filename, enum fs_relative fsroot, int compression, void **buffers, int numbuffers, qintptr_t bufferstride, int width, int height, enum uploadfmt fmt, qboolean writemetadata);
qboolean WriteTGA(const char *filename, enum fs_relative fsroot, const qbyte *fte_restrict rgb_buffer, qintptr_t bytestride, int width, int height, enum uploadfmt fmt); qboolean WriteTGA(const char *filename, enum fs_relative fsroot, const qbyte *fte_restrict rgb_buffer, qintptr_t bytestride, int width, int height, enum uploadfmt fmt);
static qboolean ImgTool_ASTCToLDR(uploadfmt_t fmt) static enum uploadfmt ImgTool_ASTCToLDR(uploadfmt_t fmt)
{ {
if (fmt >= PTI_ASTC_FIRST && fmt <= PTI_ASTC_LAST) if (fmt >= PTI_ASTC_FIRST && fmt <= PTI_ASTC_LAST)
{ {
@ -302,6 +303,8 @@ static qboolean ImgTool_ASTCToLDR(uploadfmt_t fmt)
if (fmt >= PTI_ASTC_4X4_SRGB) if (fmt >= PTI_ASTC_4X4_SRGB)
return (fmt-PTI_ASTC_4X4_SRGB)+PTI_ASTC_4X4_LDR; return (fmt-PTI_ASTC_4X4_SRGB)+PTI_ASTC_4X4_LDR;
} }
if (fmt == PTI_BC1_RGB)
return PTI_BC1_RGBA;
return fmt; return fmt;
} }
#ifdef _WIN32 #ifdef _WIN32
@ -330,7 +333,7 @@ static void FS_MakeTempName(char *out, size_t outsize, char *prefix, char *suffi
close(mkstemps(out, strlen(suffix))); //bsd4.3/posix1-2001 close(mkstemps(out, strlen(suffix))); //bsd4.3/posix1-2001
} }
#endif #endif
static void ImgTool_ConvertPixelFormat(struct opts_s *args, const char *inname, struct pendingtextureinfo *mips) static qboolean ImgTool_ConvertPixelFormat(struct opts_s *args, const char *inname, struct pendingtextureinfo *mips)
{ {
struct pendingtextureinfo tmp, *ret; struct pendingtextureinfo tmp, *ret;
size_t m; size_t m;
@ -344,6 +347,10 @@ static void ImgTool_ConvertPixelFormat(struct opts_s *args, const char *inname,
qboolean canktx = false; qboolean canktx = false;
uploadfmt_t targfmt = args->newpixelformat; uploadfmt_t targfmt = args->newpixelformat;
//force it to bc1 if bc2 or bc3 with no alpha channel.
if ((targfmt == PTI_BC2_RGBA || targfmt == PTI_BC3_RGBA) && !Image_FormatHasAlpha(mips->encoding))
targfmt = PTI_BC1_RGB;
if (targfmt >= PTI_ASTC_FIRST && targfmt <= PTI_ASTC_LAST) if (targfmt >= PTI_ASTC_FIRST && targfmt <= PTI_ASTC_LAST)
{ {
Q_snprintfz(command, sizeof(command), "astcenc -c"); Q_snprintfz(command, sizeof(command), "astcenc -c");
@ -361,8 +368,12 @@ static void ImgTool_ConvertPixelFormat(struct opts_s *args, const char *inname,
Q_snprintfz(command, sizeof(command), "nvcompress -bc4"); Q_snprintfz(command, sizeof(command), "nvcompress -bc4");
else if (targfmt == PTI_BC5_RG8) else if (targfmt == PTI_BC5_RG8)
Q_snprintfz(command, sizeof(command), "nvcompress -bc5"); Q_snprintfz(command, sizeof(command), "nvcompress -bc5");
else if (targfmt == PTI_BC6_RGB_SFLOAT || targfmt == PTI_BC6_RGB_UFLOAT)
Q_snprintfz(command, sizeof(command), "nvcompress -bc6");
else if (targfmt == PTI_BC7_RGBA)
Q_snprintfz(command, sizeof(command), "nvcompress -bc7");
else else
return; return false;
if (canktx) if (canktx)
FS_MakeTempName(raw, sizeof(raw), "itr", ".ktx"); FS_MakeTempName(raw, sizeof(raw), "itr", ".ktx");
else else
@ -382,6 +393,8 @@ static void ImgTool_ConvertPixelFormat(struct opts_s *args, const char *inname,
Q_strncatz(command, " -srgb", sizeof(command)); Q_strncatz(command, " -srgb", sizeof(command));
if (targfmt >= PTI_ASTC_4X4_HDR && targfmt <= PTI_ASTC_12X12_HDR) if (targfmt >= PTI_ASTC_4X4_HDR && targfmt <= PTI_ASTC_12X12_HDR)
Q_strncatz(command, " -hdr", sizeof(command)); Q_strncatz(command, " -hdr", sizeof(command));
if (targfmt >= PTI_BC1_RGB && targfmt <= PTI_BC7_RGBA_SRGB && (strstr(inname, "_n.")||strstr(inname, "_norm.")))
Q_strncatz(command, " -normal", sizeof(command)); //looks like a normalmap... tweak metrics to favour normalised results.
Q_strncatz(command, ">> /dev/null", sizeof(command)); Q_strncatz(command, ">> /dev/null", sizeof(command));
Image_BlockSizeForEncoding(mips->encoding, &bb, &bw, &bh); Image_BlockSizeForEncoding(mips->encoding, &bb, &bw, &bh);
@ -389,10 +402,13 @@ static void ImgTool_ConvertPixelFormat(struct opts_s *args, const char *inname,
{ {
tmp.mip[0] = mips->mip[m]; tmp.mip[0] = mips->mip[m];
tmp.mip[0].needfree = false; tmp.mip[0].needfree = false;
(void)tmp;
if (canktx) if (canktx)
{ {
#ifdef IMAGEFMT_KTX
if (!Image_WriteKTXFile(raw, FS_SYSTEM, &tmp)) if (!Image_WriteKTXFile(raw, FS_SYSTEM, &tmp))
#endif
break; break;
} }
else else
@ -426,11 +442,12 @@ static void ImgTool_ConvertPixelFormat(struct opts_s *args, const char *inname,
//do not warn for astc files, their block sizes are too weird. //do not warn for astc files, their block sizes are too weird.
Image_BlockSizeForEncoding(targfmt, &bb, &bw, &bh); Image_BlockSizeForEncoding(targfmt, &bb, &bw, &bh);
if (mips->mip[0].width%bw || mips->mip[0].height%bh) if (mips->mip[0].width%bw || mips->mip[0].height%bh)
Con_Printf("%s: d3d warning: %i*%i is not a multiple of %i*%i\n", inname, mips->mip[0].width, mips->mip[0].height, bw, bh); Con_Printf("%s: mip0 of %i*%i is not a multiple of %i*%i (d3d warning)\n", inname, mips->mip[0].width, mips->mip[0].height, bw, bh);
} }
Sys_remove(raw); FS_Remove(raw, FS_SYSTEM);
Sys_remove(comp); FS_Remove(comp, FS_SYSTEM);
return true;
} }
const char *COM_GetFileExtension (const char *in, const char *term) const char *COM_GetFileExtension (const char *in, const char *term)
@ -453,11 +470,15 @@ static void ImgTool_Convert(struct opts_s *args, const char *inname, const char
size_t fsize; size_t fsize;
struct pendingtextureinfo *in; struct pendingtextureinfo *in;
const char *outext = COM_GetFileExtension(outname, NULL); const char *outext = COM_GetFileExtension(outname, NULL);
qboolean allowcompressed = false;
if (!strcmp(outext, ".dds") || !strcmp(outext, ".ktx"))
allowcompressed = true;
indata = FS_LoadMallocFile(inname, &fsize); indata = FS_LoadMallocFile(inname, &fsize);
if (indata) if (indata)
{ {
in = Image_LoadMipsFromMemory(args->flags, inname, inname, indata, fsize); in = Image_LoadMipsFromMemory(args->flags|(allowcompressed?0:IF_NOMIPMAP), inname, inname, indata, fsize);
if (in) if (in)
{ {
printf("%s: %s, %i*%i, %i mips\n", inname, Image_FormatName(in->encoding), in->mip[0].width, in->mip[0].height, in->mipcount); printf("%s: %s, %i*%i, %i mips\n", inname, Image_FormatName(in->encoding), in->mip[0].width, in->mip[0].height, in->mipcount);
@ -468,8 +489,8 @@ static void ImgTool_Convert(struct opts_s *args, const char *inname, const char
if (!(args->flags & IF_NOMIPMAP) && in->mipcount == 1) if (!(args->flags & IF_NOMIPMAP) && in->mipcount == 1)
Image_GenerateMips(in, args->flags); Image_GenerateMips(in, args->flags);
if (args->newpixelformat != PTI_INVALID) if (args->newpixelformat != PTI_INVALID && allowcompressed && ImgTool_ConvertPixelFormat(args, inname, in))
ImgTool_ConvertPixelFormat(args, inname, in); printf("\t(Converted to %s)\n", Image_FormatName(in->encoding));
} }
if (!in->mipcount) if (!in->mipcount)
@ -478,28 +499,40 @@ static void ImgTool_Convert(struct opts_s *args, const char *inname, const char
return; return;
} }
if (!strcmp(outext, ".ktx")) if (0)
;
#ifdef IMAGEFMT_KTX
else if (!strcmp(outext, ".ktx"))
Image_WriteKTXFile(outname, FS_SYSTEM, in); Image_WriteKTXFile(outname, FS_SYSTEM, in);
#endif
#ifdef IMAGEFMT_DDS
else if (!strcmp(outext, ".dds")) else if (!strcmp(outext, ".dds"))
Image_WriteDDSFile(outname, FS_SYSTEM, in); Image_WriteDDSFile(outname, FS_SYSTEM, in);
#endif
else else
{ {
int bb,bw,bh; int bb,bw,bh;
Image_BlockSizeForEncoding(in->encoding, &bb, &bw,&bh); Image_BlockSizeForEncoding(in->encoding, &bb, &bw,&bh);
if (args->mipnum < in->mipcount) if (args->mipnum < in->mipcount)
{ {
if (!strcmp(outext, ".png")) if (0)
;
#ifdef IMAGEFMT_PNG
else if (!strcmp(outext, ".png"))
{ {
#ifdef AVAIL_PNGLIB #ifdef AVAIL_PNGLIB
if (!Image_WritePNG(outname, FS_SYSTEM, 0, &in->mip[args->mipnum].data, 1, in->mip[args->mipnum].width*bb, in->mip[args->mipnum].width, in->mip[args->mipnum].height, in->encoding, false)) if (!Image_WritePNG(outname, FS_SYSTEM, 0, &in->mip[args->mipnum].data, 1, in->mip[args->mipnum].width*bb, in->mip[args->mipnum].width, in->mip[args->mipnum].height, in->encoding, false))
#endif #endif
Con_Printf("%s(%s): Write failed\n", outname, Image_FormatName(in->encoding)); Con_Printf("%s(%s): Write failed\n", outname, Image_FormatName(in->encoding));
} }
#endif
#ifdef IMAGEFMT_TGA
else if (!strcmp(outext, ".tga")) else if (!strcmp(outext, ".tga"))
{ {
if (!WriteTGA(outname, FS_SYSTEM, in->mip[args->mipnum].data, in->mip[args->mipnum].width*bb, in->mip[args->mipnum].width, in->mip[args->mipnum].height, in->encoding)) if (!WriteTGA(outname, FS_SYSTEM, in->mip[args->mipnum].data, in->mip[args->mipnum].width*bb, in->mip[args->mipnum].width, in->mip[args->mipnum].height, in->encoding))
Con_Printf("%s(%s): Write failed\n", outname, Image_FormatName(in->encoding)); Con_Printf("%s(%s): Write failed\n", outname, Image_FormatName(in->encoding));
} }
#endif
else else
Con_Printf("%s: Unknown output file format\n", outname); Con_Printf("%s: Unknown output file format\n", outname);
} }
@ -543,25 +576,77 @@ static void ImgTool_Info(struct opts_s *args, const char *inname)
fflush(stdout); fflush(stdout);
} }
#ifdef _WIN32 struct filelist_s
static void ImgTool_TreeConvert(struct opts_s *args, const char *srcpath, const char *destpath)
{ {
Con_Printf("ImgTool_TreeConvert not implemented on windows.\n"); const char **exts;
size_t numfiles;
struct {
char *name;
size_t baselen; //length up to but not including the filename extension.
} *file;
size_t maxfiles; //to avoid reallocs
};
static void FileList_Release(struct filelist_s *list)
{
size_t i;
for (i = 0; i < list->numfiles; i++)
free(list->file[i].name);
free(list->file);
list->numfiles = 0;
list->maxfiles = 0;
}
static void FileList_Add(struct filelist_s *list, char *fname)
{
size_t i;
size_t baselen;
const char *ext = COM_GetFileExtension(fname, NULL);
for (i = 0; ; i++)
{
if (!list->exts[i])
return; //extension wasn't in the list.
if (!strcmp(list->exts[i], ext))
break; //one of the accepted extensions
}
baselen = ext?ext-fname:strlen(fname);
for (i = 0; i < list->numfiles; i++)
{
if (list->file[i].baselen == baselen && !strncasecmp(list->file[i].name, fname, baselen))
{
Con_Printf("Ignoring dupe file %s (using %s)\n", fname, list->file[i].name);
return; //file already listed, but maybe with a different extension
}
}
if (i == list->maxfiles)
{
list->maxfiles += 64;
list->file = realloc(list->file, sizeof(*list->file)*list->maxfiles);
}
list->file[i].name = strdup(fname);
list->file[i].baselen = baselen;
list->numfiles++;
}
#ifdef _WIN32
static void ImgTool_TreeScan(struct filelist_s *list, const char *basepath, const char *subpath)
{
Con_Printf("ImgTool_TreeScan not implemented on windows.\n");
} }
#else #else
#include <dirent.h> #include <dirent.h>
#include <fnmatch.h> #include <fnmatch.h>
static void ImgTool_TreeConvert(struct opts_s *args, const char *srcpath, const char *destpath) static void ImgTool_TreeScan(struct filelist_s *list, const char *basepath, const char *subpath)
{ {
DIR *dir; DIR *dir;
char file[MAX_OSPATH]; char file[MAX_OSPATH];
char dest[MAX_OSPATH];
struct dirent *ent; struct dirent *ent;
dir = opendir(srcpath); if (subpath && *subpath)
Q_snprintfz(file, sizeof(file), "%s/%s", basepath, subpath);
else
Q_snprintfz(file, sizeof(file), "%s", basepath);
dir = opendir(file);
if (!dir) if (!dir)
{ {
Con_Printf("Failed to open dir %s\n", srcpath); Con_Printf("Failed to open dir %s\n", file);
return; return;
} }
for (;;) for (;;)
@ -573,43 +658,200 @@ static void ImgTool_TreeConvert(struct opts_s *args, const char *srcpath, const
continue; continue;
else if (ent->d_type == DT_DIR) else if (ent->d_type == DT_DIR)
{ {
Q_snprintfz(file, sizeof(file), "%s/%s", srcpath, ent->d_name); if (!subpath)
Q_snprintfz(dest, sizeof(dest), "%s/%s", destpath, ent->d_name); continue;
Con_Printf("Recurse %s -> %s\n", file, dest); if (*subpath)
ImgTool_TreeConvert(args, file, dest); Q_snprintfz(file, sizeof(file), "%s/%s", subpath, ent->d_name);
else
Q_snprintfz(file, sizeof(file), "%s", ent->d_name);
ImgTool_TreeScan(list, basepath, file);
} }
else if (ent->d_type == DT_REG) else if (ent->d_type == DT_REG)
{ {
const char *ext = COM_GetFileExtension(ent->d_name, NULL); if (subpath && *subpath)
if (!strcmp(ext, ".png")||!strcmp(ext, ".bmp")||!strcmp(ext, ".tga")||!strcmp(ext, ".jpg")||!strcmp(ext, ".exr")||!strcmp(ext, ".hdr")) Q_snprintfz(file, sizeof(file), "%s/%s", subpath, ent->d_name);
{ else
struct stat statsrc, statdst; Q_snprintfz(file, sizeof(file), "%s", ent->d_name);
Q_snprintfz(file, sizeof(file), "%s/%s", srcpath, ent->d_name); FileList_Add(list, file);
Q_snprintfz(dest, sizeof(dest), "%s/%s", destpath, ent->d_name);
Q_snprintfz(dest+strlen(dest)-strlen(ext), sizeof(dest)-(strlen(dest)-strlen(ext)), ".ktx");
if (stat(file, &statsrc) < 0)
{
Con_Printf("stat(\"%s\") failed...\n", file);
continue;
}
if (stat(dest, &statdst) < 0)
statdst.st_mtim.tv_sec = INT_MIN; //make it look old
if (statdst.st_mtim.tv_sec <= statsrc.st_mtim.tv_sec)
{
Con_Printf("Image file %s -> %s\n", file, dest);
FS_CreatePath(dest, FS_SYSTEM);
ImgTool_Convert(args, file, dest);
}
else
Con_Printf("Unmodified image file %s -> %s\n", file, dest);
}
} }
} }
closedir(dir); closedir(dir);
return;
} }
#endif #endif
static void ImgTool_TreeConvert(struct opts_s *args, const char *srcpath, const char *destpath)
{
size_t newfiles=0, skippedfiles=0, processedfiles=0;
char file[MAX_OSPATH];
char dest[MAX_OSPATH];
const char *exts[] = {".png", ".bmp", ".tga", ".jpg", ".exr", ".hdr", NULL};
struct filelist_s list = {exts};
size_t i, destlen = strlen(destpath)+1;
ImgTool_TreeScan(&list, srcpath, "");
if (!list.numfiles)
Con_Printf("No suitable files found in directory: %s\n", srcpath);
for (i = 0; i < list.numfiles; i++)
{
struct stat statsrc, statdst;
Q_snprintfz(file, sizeof(file), "%s/%s", srcpath, list.file[i].name);
Q_snprintfz(dest, sizeof(dest), "%s/%s", destpath, list.file[i].name);
Q_snprintfz(dest+destlen+list.file[i].baselen, sizeof(dest)-destlen-list.file[i].baselen, ".dds");
if (stat(file, &statsrc) < 0)
{
Con_Printf("stat(\"%s\") failed...\n", file);
continue;
}
if (stat(dest, &statdst) < 0)
{
statdst.st_mtim.tv_sec = INT_MIN; //make it look old
newfiles++;
}
if (statdst.st_mtim.tv_sec <= statsrc.st_mtim.tv_sec)
{
processedfiles++;
// Con_Printf("Image file %s -> %s\n", file, dest);
FS_CreatePath(dest, FS_SYSTEM);
ImgTool_Convert(args, file, dest);
}
else
{
skippedfiles++;
// Con_Printf("Unmodified image file %s -> %s\n", file, dest);
}
}
Con_Printf("found: %u, processed: %u, skipped: %u, new: %u\n", (unsigned int)list.numfiles, (unsigned int)processedfiles, (unsigned int)skippedfiles, (unsigned int)newfiles);
FileList_Release(&list);
return;
}
/*
typedef struct
{
long offset; // Position of the entry in WAD
long dsize; // Size of the entry in WAD file
long size; // Size of the entry in memory
char type; // type of entry
char cmprs; // Compression. 0 if none.
short dummy; // Not used
char name[16]; // we use only first 8
} wad2entry_t;
typedef struct
{
char magic[4]; //should be WAD2
long num; //number of entries
long offset; //location of directory
} wad2_t;
static void ImgTool_WadConvert(struct opts_s *args, const char *srcpath, const char *destpath)
{
char file[MAX_OSPATH];
const char *exts[] = {".png", ".bmp", ".tga", ".jpg", ".exr", ".hdr", NULL};
struct filelist_s list = {exts};
size_t i, u;
vfsfile_t *f;
char *inname;
qbyte *indata;
size_t fsize;
wad2_t wad2;
wad2entry_t *wadentries = NULL, *entry;
size_t maxentries;
miptex_t mip;
ImgTool_TreeScan(&list, srcpath, NULL);
f = FS_OpenVFS(destpath, "wb", FS_SYSTEM);
wad2.magic[0] = 'W';
wad2.magic[1] = 'A';
wad2.magic[2] = 'D';
wad2.magic[3] = '3'; //wad3 instead of 2, so we can include a palette for tools to validate against
VFS_WRITE(f, &wad2, 12);
//try to decompress everything to a nice friendly palletizable range.
for (u = 1; u < countof(sh_config.texfmt); u++)
sh_config.texfmt[u] = (u==PTI_RGBA8)||(u==PTI_RGBX8)||(u==PTI_P8);
for (i = 0; i < list.numfiles; i++)
{
Q_snprintfz(file, sizeof(file), "%s/%s", srcpath, list.file[i].name);
inname = list.file[i].name;
if (list.file[i].baselen > 15)
{
Con_Printf("Path too long for wad - %s\n", inname);
continue;
}
indata = FS_LoadMallocFile(file, &fsize);
if (indata)
{
struct pendingtextureinfo *in = Image_LoadMipsFromMemory(args->flags|IF_PALETTIZE, inname, file, indata, fsize);
Image_GenerateMips(in, args->flags);
if (in)
{
if (in->mipcount == 1)
Image_GenerateMips(in, args->flags);
if (!in->mipcount)
{
printf("%s: unable to load any mips\n", inname);
continue;
}
}
if (args->mipnum >= in->mipcount)
{
printf("%s: not enough mips\n", inname);
continue;
}
if ((in->mip[args->mipnum].width|in->mip[args->mipnum].height) & 15)
printf("%s(%i): WARNING: not multiple of 16 - %i*%i\n", inname, args->mipnum, in->mip[args->mipnum].width, in->mip[args->mipnum].height);
if (wad2.num == maxentries)
{
maxentries += 64;
wadentries = realloc(wadentries, sizeof(*wadentries)*maxentries);
}
entry = &wadentries[wad2.num++];
Q_strncpyz(entry->name, inname, 16);
entry->name[list.file[i].baselen] = 0; //kill any .tga
entry->type = TYP_MIPTEX;
entry->cmprs = 0;
entry->dummy = 0;
entry->offset = VFS_TELL(f);
memcpy(mip.name, entry->name, sizeof(mip.name));
mip.width = in->mip[args->mipnum].width;
mip.height = in->mip[args->mipnum].height;
mip.offsets[0] = in->mip[args->mipnum+0].datasize?sizeof(mip):0;
mip.offsets[1] = in->mip[args->mipnum+1].datasize?mip.offsets[args->mipnum+0]+in->mip[args->mipnum+0].datasize:0;
mip.offsets[2] = in->mip[args->mipnum+2].datasize?mip.offsets[args->mipnum+1]+in->mip[args->mipnum+1].datasize:0;
mip.offsets[3] = in->mip[args->mipnum+3].datasize?mip.offsets[args->mipnum+2]+in->mip[args->mipnum+2].datasize:0;
VFS_WRITE(f, &mip, sizeof(mip));
VFS_WRITE(f, in->mip[args->mipnum+0].data, in->mip[args->mipnum+0].datasize);
VFS_WRITE(f, in->mip[args->mipnum+1].data, in->mip[args->mipnum+1].datasize);
VFS_WRITE(f, in->mip[args->mipnum+2].data, in->mip[args->mipnum+2].datasize);
VFS_WRITE(f, in->mip[args->mipnum+3].data, in->mip[args->mipnum+3].datasize);
if (wad2.magic[3] == '3')
{
VFS_WRITE(f, "\x00\x01", 2);
VFS_WRITE(f, host_basepal, 256*3);
}
entry->size = entry->dsize = VFS_TELL(f)-entry->offset;
}
}
wad2.offset = VFS_TELL(f);
VFS_WRITE(f, wadentries, sizeof(*wadentries)*wad2.num);
VFS_SEEK(f, 0);
VFS_WRITE(f, &wad2, sizeof(wad2));
VFS_CLOSE(f);
FileList_Release(&list);
}
*/
int main(int argc, const char **argv) int main(int argc, const char **argv)
{ {
@ -617,7 +859,8 @@ int main(int argc, const char **argv)
{ {
mode_info, mode_info,
mode_convert, mode_convert,
mode_autotree mode_autotree,
mode_genwad
} mode = mode_info; } mode = mode_info;
size_t u, f; size_t u, f;
struct opts_s args; struct opts_s args;
@ -652,9 +895,10 @@ int main(int argc, const char **argv)
showhelp: showhelp:
Con_Printf("show info : %s -i *.ktx\n", argv[0]); Con_Printf("show info : %s -i *.ktx\n", argv[0]);
Con_Printf("compress : %s --astc_6x6_ldr [--nomips] in.png out.ktx [in2.png out2.ktx]\n", argv[0]); Con_Printf("compress : %s --astc_6x6_ldr [--nomips] in.png out.ktx [in2.png out2.ktx]\n", argv[0]);
Con_Printf("compress : %s --bc3_rgba [--nomips] in.png out.dds\n", argv[0]); Con_Printf("compress : %s --bc3_rgba [--premul] [--nomips] in.png out.dds\n\tConvert pixel format (to bc3 aka dxt5) before writing to output file.\n", argv[0]);
Con_Printf("convert : %s -c in.exr out.dds\n", argv[0]); Con_Printf("convert : %s --convert in.exr out.dds\n\tConvert to different file format, while trying to preserve pixel formats.\n", argv[0]);
Con_Printf("decompress: %s -d [--exportmip 0] [--nomips] in.ktx out.png\n", argv[0]); Con_Printf("decompress: %s --decompress [--exportmip 0] [--nomips] in.ktx out.png\n\tDecompresses any block-compressed pixel data.\n", argv[0]);
// Con_Printf("gen wad : %s --genwad [--exportmip 2] srcdir out.wad\n", argv[0]);
// Con_Printf("auto : %s --astc_6x6_ldr -r _postfix.png srcdir destdir\n", argv[0]); // Con_Printf("auto : %s --astc_6x6_ldr -r _postfix.png srcdir destdir\n", argv[0]);
Image_PrintInputFormatVersions(); Image_PrintInputFormatVersions();
@ -667,13 +911,15 @@ showhelp:
Con_Printf(" --%-15s %.2fbpp (requires astcenc)\n", Image_FormatName(f), 8*(float)bb/(bw*bh)); Con_Printf(" --%-15s %.2fbpp (requires astcenc)\n", Image_FormatName(f), 8*(float)bb/(bw*bh));
else if (f==PTI_BC1_RGB||f==PTI_BC1_RGBA||f==PTI_BC2_RGBA||f==PTI_BC3_RGBA||f==PTI_BC4_R8||f==PTI_BC5_RG8) else if (f==PTI_BC1_RGB||f==PTI_BC1_RGBA||f==PTI_BC2_RGBA||f==PTI_BC3_RGBA||f==PTI_BC4_R8||f==PTI_BC5_RG8)
Con_Printf(" --%-15s %.2fbpp (requires nvcompress)\n", Image_FormatName(f), 8*(float)bb/(bw*bh)); Con_Printf(" --%-15s %.2fbpp (requires nvcompress)\n", Image_FormatName(f), 8*(float)bb/(bw*bh));
else if (f==PTI_BC6_RGB_UFLOAT || f==PTI_BC6_RGB_SFLOAT || f==PTI_BC7_RGBA)
Con_Printf(" --%-15s %.2fbpp (requires nvcompress 2.1+)\n", Image_FormatName(f), 8*(float)bb/(bw*bh));
} }
break; break;
} }
else if (!strcmp(argv[u], "-c") || !strcmp(argv[u], "--convert")) else if (!strcmp(argv[u], "-c") || !strcmp(argv[u], "--convert"))
mode = mode_convert; mode = mode_convert;
else if (!strcmp(argv[u], "-d") || !strcmp(argv[u], "--decompress")) else if (!strcmp(argv[u], "-d") || !strcmp(argv[u], "--decompress"))
{ { //remove any (weird) gpu formats
for (f = PTI_BC1_RGB; f < PTI_ASTC_LAST; f++) for (f = PTI_BC1_RGB; f < PTI_ASTC_LAST; f++)
sh_config.texfmt[f] = false; sh_config.texfmt[f] = false;
mode = mode_convert; mode = mode_convert;
@ -682,10 +928,16 @@ showhelp:
mode = mode_autotree; mode = mode_autotree;
else if (!strcmp(argv[u], "-i") || !strcmp(argv[u], "--info")) else if (!strcmp(argv[u], "-i") || !strcmp(argv[u], "--info"))
mode = mode_info; mode = mode_info;
else if (!strcmp(argv[u], "-w") || !strcmp(argv[u], "--genwad"))
mode = mode_genwad;
else if (!strcmp(argv[u], "--nomips") ) else if (!strcmp(argv[u], "--nomips") )
args.flags |= IF_NOMIPMAP; args.flags |= IF_NOMIPMAP;
else if (!strcmp(argv[u], "--mips")) else if (!strcmp(argv[u], "--mips"))
args.flags &= ~IF_NOMIPMAP; args.flags &= ~IF_NOMIPMAP;
else if (!strcmp(argv[u], "--premul") )
args.flags |= IF_PREMULTIPLYALPHA;
else if (!strcmp(argv[u], "--nopremul"))
args.flags &= ~IF_PREMULTIPLYALPHA;
else if (!strcmp(argv[u], "--exportmip")) else if (!strcmp(argv[u], "--exportmip"))
{ {
char *e = "erk"; char *e = "erk";
@ -737,6 +989,14 @@ showhelp:
u++; u++;
} }
} }
else if (mode == mode_genwad)
{
if (u+1 < argc)
{
//ImgTool_WadConvert(&args, argv[u], argv[u+1]);
u++;
}
}
} }
} }
return 0; return 0;

View File

@ -30,7 +30,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define Plug_Init Plug_Bullet_Init #define Plug_Init Plug_Bullet_Init
#pragma comment(lib,"../../plugins/bullet/libs/bullet_dbg.lib") #pragma comment(lib,"../../plugins/bullet/libs/bullet_dbg.lib")
#endif #endif
#include "quakedef.h"
#include "../plugin.h" #include "../plugin.h"
#include "../engine.h" #include "../engine.h"