mirror of
https://github.com/nzp-team/fteqw.git
synced 2025-02-21 11:10:51 +00:00
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:
parent
b1f6417d3a
commit
1c1f04370f
27 changed files with 1483 additions and 301 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
//
|
//
|
||||||
|
|
|
@ -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
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 == '*')
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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},
|
||||||
|
|
|
@ -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
366
imgtool.c
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue