aboutsummaryrefslogtreecommitdiff
path: root/src/unittest/test_collision.cpp
blob: e505de450016fbd551a18cf8fd523cb9c0163860 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include "test.h"

#include "collision.h"

class TestCollision : public TestBase {
public:
	TestCollision() { TestManager::registerTestModule(this); }
	const char *getName() { return "TestCollision"; }

	void runTests(IGameDef *gamedef);

	void testAxisAlignedCollision();
};

static TestCollision g_test_instance;

void TestCollision::runTests(IGameDef *gamedef)
{
	TEST(testAxisAlignedCollision);
}

////////////////////////////////////////////////////////////////////////////////

void TestCollision::testAxisAlignedCollision()
{
	for (s16 bx = -3; bx <= 3; bx++)
	for (s16 by = -3; by <= 3; by++)
	for (s16 bz = -3; bz <= 3; bz++) {
		// X-
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
			v3f v(1, 0, 0);
			f32 dtime = 0;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
			UASSERT(fabs(dtime - 1.000) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
			v3f v(-1, 0, 0);
			f32 dtime = 0;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx-2, by+1.5, bz, bx-1, by+2.5, bz-1);
			v3f v(1, 0, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
			v3f v(0.5, 0.1, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
			UASSERT(fabs(dtime - 3.000) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
			v3f v(0.5, 0.1, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
			UASSERT(fabs(dtime - 3.000) < 0.001);
		}

		// X+
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
			v3f v(-1, 0, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
			UASSERT(fabs(dtime - 1.000) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
			v3f v(1, 0, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx+2, by, bz+1.5, bx+3, by+1, bz+3.5);
			v3f v(-1, 0, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
			v3f v(-0.5, 0.2, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);  // Y, not X!
			UASSERT(fabs(dtime - 2.500) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
			aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
			v3f v(-0.5, 0.3, 0);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
			UASSERT(fabs(dtime - 2.000) < 0.001);
		}

		// TODO: Y-, Y+, Z-, Z+

		// misc
		{
			aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
			aabb3f m(bx+2.3, by+2.29, bz+2.29, bx+4.2, by+4.2, bz+4.2);
			v3f v(-1./3, -1./3, -1./3);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
			UASSERT(fabs(dtime - 0.9) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
			aabb3f m(bx+2.29, by+2.3, bz+2.29, bx+4.2, by+4.2, bz+4.2);
			v3f v(-1./3, -1./3, -1./3);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
			UASSERT(fabs(dtime - 0.9) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
			aabb3f m(bx+2.29, by+2.29, bz+2.3, bx+4.2, by+4.2, bz+4.2);
			v3f v(-1./3, -1./3, -1./3);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
			UASSERT(fabs(dtime - 0.9) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
			aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.3, by-2.29, bz-2.29);
			v3f v(1./7, 1./7, 1./7);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
			UASSERT(fabs(dtime - 16.1) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
			aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.3, bz-2.29);
			v3f v(1./7, 1./7, 1./7);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
			UASSERT(fabs(dtime - 16.1) < 0.001);
		}
		{
			aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
			aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.29, bz-2.3);
			v3f v(1./7, 1./7, 1./7);
			f32 dtime;
			UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
			UASSERT(fabs(dtime - 16.1) < 0.001);
		}
	}
}
type \ apk clean_apk \ clean_all clean prep_srcdir \ install_debug install_release envpaths all \ $(ASSETS_TIMESTAMP) $(LEVELDB_TIMESTAMP) \ $(OPENAL_TIMESTAMP) $(OGG_TIMESTAMP) \ $(IRRLICHT_TIMESTAMP) $(CURL_TIMESTAMP) \ $(OPENSSL_TIMESTAMP) \ $(ANDR_ROOT)/jni/src/android_version.h \ $(ANDR_ROOT)/jni/src/android_version_githash.h debug : local.properties export NDEBUG=; \ export BUILD_TYPE=debug; \ $(MAKE) apk all : debug release release : local.properties @export NDEBUG=1; \ export BUILD_TYPE=release; \ $(MAKE) apk reconfig: delconfig @$(MAKE) local.properties delconfig: $(RM) local.properties local.properties: @echo "Please specify path of ANDROID NDK"; \ echo "e.g. $$HOME/Android/Sdk/ndk-bundle/"; \ read ANDROID_NDK ; \ if [ ! -d $$ANDROID_NDK ] ; then \ echo "$$ANDROID_NDK is not a valid folder"; \ exit 1; \ fi; \ echo "ndk.dir = $$ANDROID_NDK" > local.properties; \ echo "Please specify path of ANDROID SDK"; \ echo "e.g. $$HOME/Android/Sdk/"; \ read SDKFLDR ; \ if [ ! -d $$SDKFLDR ] ; then \ echo "$$SDKFLDR is not a valid folder"; \ exit 1; \ fi; \ echo "sdk.dir = $$SDKFLDR" >> local.properties; $(OPENAL_TIMESTAMP) : openal_download @LAST_MODIF=$$(find ${OPENAL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${OPENAL_TIMESTAMP}; \ fi openal_download : @if [ ! -d ${OPENAL_DIR} ] ; then \ echo "openal sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd ${ANDR_ROOT}/deps ; \ git clone ${OPENAL_URL_GIT} || exit 1; \ fi openal : $(OPENAL_LIB) $(OPENAL_LIB): $(OPENAL_TIMESTAMP) + @REFRESH=0; \ if [ ! -e ${OPENAL_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ ${OPENAL_TIMESTAMP} -nt ${OPENAL_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ echo "changed timestamp for openal detected building..."; \ cd ${OPENAL_DIR}; \ export APP_PLATFORM=${APP_PLATFORM}; \ export TARGET_ABI=${TARGET_ABI}; \ export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \ export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \ export COMPILER_VERSION=${COMPILER_VERSION}; \ ${ANDROID_NDK}/ndk-build \ NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \ touch ${OPENAL_TIMESTAMP}; \ touch ${OPENAL_TIMESTAMP_INT}; \ else \ echo "nothing to be done for openal"; \ fi clean_openal : $(RM) -rf ${OPENAL_DIR} $(OGG_TIMESTAMP) : ogg_download @LAST_MODIF=$$(find ${OGG_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${OGG_TIMESTAMP}; \ fi ogg_download : @if [ ! -d ${OGG_DIR} ] ; then \ echo "ogg sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd ${ANDR_ROOT}/deps ; \ git clone ${OGG_URL_GIT}|| exit 1; \ cd libvorbis-libogg-android ; \ patch -p1 < ${ANDR_ROOT}/patches/libvorbis-libogg-fpu.patch || exit 1; \ fi ogg : $(OGG_LIB) $(OGG_LIB): $(OGG_TIMESTAMP) + @REFRESH=0; \ if [ ! -e ${OGG_TIMESTAMP_INT} ] ; then \ echo "${OGG_TIMESTAMP_INT} doesn't exist"; \ REFRESH=1; \ fi; \ if [ ${OGG_TIMESTAMP} -nt ${OGG_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ echo "changed timestamp for ogg detected building..."; \ cd ${OGG_DIR}; \ export APP_PLATFORM=${APP_PLATFORM}; \ export TARGET_ABI=${TARGET_ABI}; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ --platform=${APP_PLATFORM} \ --install-dir=$${TOOLCHAIN}; \ touch ${OGG_TIMESTAMP}; \ touch ${OGG_TIMESTAMP_INT}; \ else \ echo "nothing to be done for libogg/libvorbis"; \ fi clean_ogg : $(RM) -rf ${OGG_DIR} $(OPENSSL_TIMESTAMP) : openssl_download @LAST_MODIF=$$(find ${OPENSSL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${OPENSSL_TIMESTAMP}; \ fi openssl_download : @if [ ! -d ${OPENSSL_DIR} ] ; then \ echo "openssl sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd ${ANDR_ROOT}/deps ; \ wget ${OPENSSL_URL} || exit 1; \ tar -xzf ${OPENSSL_BASEDIR}.tar.gz; \ cd ${OPENSSL_BASEDIR}; \ patch -p1 < ${ANDR_ROOT}/patches/openssl_arch.patch; \ sed -i 's/-mandroid //g' Configure; \ fi openssl : $(OPENSSL_LIB) $(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB) @REFRESH=0; \ if [ ! -e ${OPENSSL_TIMESTAMP_INT} ] ; then \ echo "${OPENSSL_TIMESTAMP_INT} doesn't exist"; \ REFRESH=1; \ fi; \ if [ ${OPENSSL_TIMESTAMP} -nt ${OPENSSL_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ echo "changed timestamp for openssl detected building..."; \ cd ${OPENSSL_DIR}; \ ln -s ${OPENSSL_DIR} ../openssl; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openssl; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ --platform=${APP_PLATFORM} \ --stl=libc++ \ --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \ CC=${CROSS_CC} ./Configure enable-gmp no-asm -DL_ENDIAN -I${GMP_DIR} \ -L${GMP_DIR}/usr/lib android-${TARGET_ARCH} -D__ANDROID_API__=$(API); \ CC=${CROSS_CC} ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make depend; \ CC=${CROSS_CC} ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make build_libs; \ touch ${OPENSSL_TIMESTAMP}; \ touch ${OPENSSL_TIMESTAMP_INT}; \ $(RM) -rf $${TOOLCHAIN}; \ else \ echo "nothing to be done for openssl"; \ fi clean_openssl : $(RM) -rf ${OPENSSL_DIR}; \ $(RM) -rf $(ANDR_ROOT)/deps/${OPENSSL_BASEDIR}.tar.gz; \ $(RM) -rf $(ANDR_ROOT)/deps/openssl $(LEVELDB_TIMESTAMP) : leveldb_download @LAST_MODIF=$$(find ${LEVELDB_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${LEVELDB_TIMESTAMP}; \ fi leveldb_download : @if [ ! -d ${LEVELDB_DIR} ] ; then \ echo "leveldb sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd ${ANDR_ROOT}/deps ; \ git clone ${LEVELDB_URL_GIT} || exit 1; \ cd ${LEVELDB_DIR} || exit 1; \ git checkout ${LEVELDB_COMMIT} || exit 1; \ fi leveldb : $(LEVELDB_LIB) ifeq ($(HAVE_LEVELDB),1) $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP) @REFRESH=0; \ if [ ! -e ${LEVELDB_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ ${LEVELDB_TIMESTAMP} -nt ${LEVELDB_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ echo "changed timestamp for leveldb detected building..."; \ cd deps/leveldb; \ export CROSS_PREFIX=${TARGET_TOOLCHAIN}; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ --platform=${APP_PLATFORM} \ --stl=libc++ \ --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CC=${CROSS_CC}; \ export CXX=${CROSS_CXX}; \ export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}"; \ export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \ export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ $(MAKE) || exit 1; \ touch ${LEVELDB_TIMESTAMP}; \ touch ${LEVELDB_TIMESTAMP_INT}; \ $(RM) -rf $${TOOLCHAIN}; \ else \ echo "nothing to be done for leveldb"; \ fi endif clean_leveldb : ./gradlew cleanLevelDB $(FREETYPE_TIMESTAMP) : freetype_download @LAST_MODIF=$$(find ${FREETYPE_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${FREETYPE_TIMESTAMP}; \ fi freetype_download : @if [ ! -d ${FREETYPE_DIR} ] ; then \ echo "freetype sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ git clone ${FREETYPE_URL_GIT} || exit 1; \ fi freetype : $(FREETYPE_LIB) $(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP) + @REFRESH=0; \ if [ ! -e ${FREETYPE_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ ! -e ${FREETYPE_LIB} ] ; then \ REFRESH=1; \ fi; \ if [ ${FREETYPE_TIMESTAMP} -nt ${FREETYPE_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${FREETYPE_DIR}; \ echo "changed timestamp for freetype detected building..."; \ cd ${FREETYPE_DIR}/Android/jni; \ export APP_PLATFORM=${APP_PLATFORM}; \ export TARGET_ABI=${TARGET_ABI}; \ export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \ export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \ export COMPILER_VERSION=${COMPILER_VERSION}; \ ${ANDROID_NDK}/ndk-build \ NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \ touch ${FREETYPE_TIMESTAMP}; \ touch ${FREETYPE_TIMESTAMP_INT}; \ else \ echo "nothing to be done for freetype"; \ fi clean_freetype : ./gradlew cleanFreetype $(ICONV_TIMESTAMP) : iconv_download @LAST_MODIF=$$(find ${ICONV_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${ICONV_TIMESTAMP}; \ fi iconv_download : @if [ ! -d ${ICONV_DIR} ] ; then \ echo "iconv sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd ${ANDR_ROOT}/deps; \ wget ${ICONV_URL_HTTP} || exit 1; \ tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1; \ rm libiconv-${ICONV_VERSION}.tar.gz; \ ln -s libiconv-${ICONV_VERSION} libiconv; \ cd ${ICONV_DIR}; \ patch -p1 < ${ANDR_ROOT}/patches/libiconv_android.patch; \ patch -p1 < ${ANDR_ROOT}/patches/libiconv_stdio.patch; \ fi iconv : $(ICONV_LIB) $(ICONV_LIB) : $(ICONV_TIMESTAMP) @REFRESH=0; \ if [ ! -e ${ICONV_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ ! -e ${ICONV_LIB} ] ; then \ REFRESH=1; \ fi; \ if [ ${ICONV_TIMESTAMP} -nt ${ICONV_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${ICONV_DIR}; \ echo "changed timestamp for iconv detected building..."; \ cd ${ICONV_DIR}; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ --platform=${APP_PLATFORM} \ --stl=libc++ \ --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON} -lstdc++"; \ export CC=${CROSS_CC}; \ export CXX=${CROSS_CXX}; \ export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ ./configure --host=${TARGET_HOST} || exit 1; \ sed -i 's/LIBICONV_VERSION_INFO) /LIBICONV_VERSION_INFO) -avoid-version /g' lib/Makefile; \ grep "iconv_LDFLAGS" src/Makefile; \ $(MAKE) -s || exit 1; \ touch ${ICONV_TIMESTAMP}; \ touch ${ICONV_TIMESTAMP_INT}; \ rm -rf ${TOOLCHAIN}; \ else \ echo "nothing to be done for iconv"; \ fi clean_iconv : ./gradlew cleanIconv #Note: Texturehack patch is required for gpu's not supporting color format # correctly. Known bad GPU: # -geforce on emulator # -Vivante Corporation GC1000 core (e.g. Galaxy Tab 3) irrlicht_download : @if [ ! -d "deps/irrlicht" ] ; then \ echo "irrlicht sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ svn co ${IRRLICHT_URL_SVN} irrlicht || exit 1; \ cd irrlicht; \ patch -p1 < ${ANDR_ROOT}/patches/irrlicht-touchcount.patch || exit 1; \ patch -p1 < ${ANDR_ROOT}/patches/irrlicht-back_button.patch || exit 1; \ patch -p1 < ${ANDR_ROOT}/patches/irrlicht-texturehack.patch || exit 1; \ patch -p1 < ${ANDR_ROOT}/patches/irrlicht-native_activity.patch || exit 1; \ fi $(IRRLICHT_TIMESTAMP) : irrlicht_download @LAST_MODIF=$$(find ${IRRLICHT_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${IRRLICHT_TIMESTAMP}; \ fi irrlicht : $(IRRLICHT_LIB) $(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB) + @REFRESH=0; \ if [ ! -e ${IRRLICHT_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ ! -e ${IRRLICHT_LIB} ] ; then \ REFRESH=1; \ fi; \ if [ ${IRRLICHT_TIMESTAMP} -nt ${IRRLICHT_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${IRRLICHT_DIR}; \ echo "changed timestamp for irrlicht detected building..."; \ cd deps/irrlicht/source/Irrlicht/Android; \ export APP_PLATFORM=${APP_PLATFORM}; \ export TARGET_ABI=${TARGET_ABI}; \ export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \ export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \ export COMPILER_VERSION=${COMPILER_VERSION}; \ ${ANDROID_NDK}/ndk-build \ NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \ touch ${IRRLICHT_TIMESTAMP}; \ touch ${IRRLICHT_TIMESTAMP_INT}; \ else \ echo "nothing to be done for irrlicht"; \ fi clean_irrlicht : ./gradlew cleanIrrlicht $(CURL_TIMESTAMP) : curl_download @LAST_MODIF=$$(find ${CURL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${CURL_TIMESTAMP}; \ fi curl_download : @if [ ! -d "deps/curl-${CURL_VERSION}" ] ; then \ echo "curl sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ wget ${CURL_URL_HTTP} || exit 1; \ tar -xjf curl-${CURL_VERSION}.tar.bz2 || exit 1; \ rm curl-${CURL_VERSION}.tar.bz2; \ ln -s curl-${CURL_VERSION} curl; \ fi curl : $(CURL_LIB) $(CURL_LIB): $(CURL_TIMESTAMP) $(OPENSSL_LIB) @REFRESH=0; \ if [ ! -e ${CURL_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ ! -e ${CURL_LIB} ] ; then \ REFRESH=1; \ fi; \ if [ ${CURL_TIMESTAMP} -nt ${CURL_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${CURL_DIR}; \ echo "changed timestamp for curl detected building..."; \ cd deps/curl-${CURL_VERSION}; \ export CROSS_PREFIX=${TARGET_TOOLCHAIN}; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ --platform=${APP_PLATFORM} \ --stl=libc++ \ --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CC=${CROSS_CC}; \ export CXX=${CROSS_CXX}; \ export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ export CPPFLAGS="$${CPPFLAGS} -I${OPENSSL_DIR}/include ${TARGET_CFLAGS_ADDON}"; \ export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ export LDFLAGS="$${LDFLAGS} -L${OPENSSL_DIR} ${TARGET_LDFLAGS_ADDON}"; \ ./configure --host=${TARGET_HOST} --disable-shared --enable-static --with-ssl; \ $(MAKE) -s || exit 1; \ touch ${CURL_TIMESTAMP}; \ touch ${CURL_TIMESTAMP_INT}; \ $(RM) -rf $${TOOLCHAIN}; \ else \ echo "nothing to be done for curl"; \ fi clean_curl : ./gradlew cleanCURL $(GMP_TIMESTAMP) : gmp_download @LAST_MODIF=$$(find ${GMP_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${GMP_TIMESTAMP}; \ fi gmp_download : @if [ ! -d "${GMP_DIR}" ] ; then \ echo "gmp sources missing, downloading..."; \ mkdir -p ${ANDR_ROOT}/deps; \ cd deps; \ wget ${GMP_URL_HTTP} || exit 1; \ tar -xjf gmp-${GMP_VERSION}.tar.bz2 || exit 1; \ rm gmp-${GMP_VERSION}.tar.bz2; \ ln -s gmp-${GMP_VERSION} gmp; \ fi gmp : $(GMP_LIB) $(GMP_LIB): $(GMP_TIMESTAMP) @REFRESH=0; \ if [ ! -e ${GMP_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ ! -e ${GMP_LIB} ] ; then \ REFRESH=1; \ fi; \ if [ ${GMP_TIMESTAMP} -nt ${GMP_TIMESTAMP_INT} ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ mkdir -p ${GMP_DIR}; \ echo "changed timestamp for gmp detected building..."; \ cd deps/gmp-${GMP_VERSION}; \ export CROSS_PREFIX=${TARGET_TOOLCHAIN}; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-gmp; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \ --platform=${APP_PLATFORM} \ --stl=libc++ \ --install-dir=$${TOOLCHAIN}; \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ export CC=${CROSS_CC}; \ export CXX=${CROSS_CXX}; \ export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \ export LIBGMP_LDFLAGS="-avoid-version"; \ export LIBGMPXX_LDFLAGS="-avoid-version"; \ ./configure --disable-static --host=${TARGET_HOST} --prefix=/usr; \ $(MAKE) install DESTDIR=/${GMP_DIR} || exit 1; \ touch ${GMP_TIMESTAMP}; \ touch ${GMP_TIMESTAMP_INT}; \ $(RM) -rf $${TOOLCHAIN}; \ else \ echo "nothing to be done for gmp"; \ fi clean_gmp: ./gradlew cleanGMP sqlite3_download: deps/${SQLITE3_FOLDER}/sqlite3.c deps/${SQLITE3_FOLDER}/sqlite3.c : cd deps; \ wget ${SQLITE3_URL}; \ unzip ${SQLITE3_FOLDER}.zip; \ ln -s ${SQLITE3_FOLDER} sqlite; \ cd ${SQLITE3_FOLDER}; clean_sqlite3: ./gradlew cleanSQLite3 $(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB) @mkdir -p ${ANDR_ROOT}/deps; \ for DIRNAME in {builtin,client,doc,fonts,games,mods,po,textures}; do \ LAST_MODIF=$$(find ${PROJ_ROOT}/${DIRNAME} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ]; then \ touch ${PROJ_ROOT}/${DIRNAME}/timestamp; \ touch ${ASSETS_TIMESTAMP}; \ echo ${DIRNAME} changed $$LAST_MODIF; \ fi; \ done; \ LAST_MODIF=$$(find ${IRRLICHT_DIR}/media -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ touch ${IRRLICHT_DIR}/media/timestamp; \ touch ${ASSETS_TIMESTAMP}; \ fi; \ if [ ${PROJ_ROOT}/minetest.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then \ echo "conf changed"; \ touch ${ASSETS_TIMESTAMP}; \ fi; \ if [ ${PROJ_ROOT}/README.txt -nt ${ASSETS_TIMESTAMP} ] ; then \ touch ${ASSETS_TIMESTAMP}; \ fi; \ if [ ! -e $(ASSETS_TIMESTAMP) ] ; then \ touch $(ASSETS_TIMESTAMP); \ fi assets : $(ASSETS_TIMESTAMP) @REFRESH=0; \ if [ ! -e ${ASSETS_TIMESTAMP}.old ] ; then \ REFRESH=1; \ fi; \ if [ ${ASSETS_TIMESTAMP} -nt ${ASSETS_TIMESTAMP}.old ] ; then \ REFRESH=1; \ fi; \ if [ ! -d ${APP_ROOT}/assets ] ; then \ REFRESH=1; \ fi; \ if [ $$REFRESH -ne 0 ] ; then \ echo "assets changed, refreshing..."; \ $(MAKE) clean_assets; \ mkdir -p ${APP_ROOT}/assets/Minetest; \ cp ${PROJ_ROOT}/minetest.conf.example ${APP_ROOT}/assets/Minetest; \ cp ${PROJ_ROOT}/README.md ${APP_ROOT}/assets/Minetest; \ cp -r ${PROJ_ROOT}/builtin ${APP_ROOT}/assets/Minetest; \ mkdir -p ${APP_ROOT}/assets/Minetest/client; \ cp -r ${PROJ_ROOT}/client/shaders ${APP_ROOT}/assets/Minetest/client; \ cp ${PROJ_ROOT}/doc/lgpl-2.1.txt ${APP_ROOT}/assets/Minetest/LICENSE.txt; \ mkdir -p ${APP_ROOT}/assets/Minetest/fonts; \ cp -r ${PROJ_ROOT}/fonts/*.ttf ${APP_ROOT}/assets/Minetest/fonts/; \ mkdir -p ${APP_ROOT}/assets/Minetest/games; \ for game in ${GAMES_TO_COPY}; do \ cp -r ${PROJ_ROOT}/games/$$game ${APP_ROOT}/assets/Minetest/games/; \ done; \ mkdir -p ${APP_ROOT}/assets/Minetest/mods; \ for mod in ${MODS_TO_COPY}; do \ cp -r ${PROJ_ROOT}/mods/$$mod ${APP_ROOT}/assets/Minetest/mods/; \ done; \ cp -r ${PROJ_ROOT}/po ${APP_ROOT}/assets/Minetest; \ cp -r ${PROJ_ROOT}/textures ${APP_ROOT}/assets/Minetest; \ mkdir -p ${APP_ROOT}/assets/Minetest/media; \ cp -r ${IRRLICHT_DIR}/media/Shaders ${APP_ROOT}/assets/Minetest/media; \ cd ${APP_ROOT}/assets || exit 1; \ find . -name "timestamp" -exec rm {} \; ; \ find . -name "*.blend" -exec rm {} \; ; \ find . -name "*~" -exec rm {} \; ; \ find . -type d -path "*.git" -exec rm -rf {} \; ; \ find . -type d -path "*.svn" -exec rm -rf {} \; ; \ find . -type f -path "*.gitignore" -exec rm -rf {} \; ; \ ls -R | grep ":$$" | sed -e 's/:$$//' -e 's/\.//' -e 's/^\///' > "index.txt"; \ find -L Minetest > filelist.txt; \ cp ${ANDR_ROOT}/${ASSETS_TIMESTAMP} ${ANDR_ROOT}/${ASSETS_TIMESTAMP}.old; \ else \ echo "nothing to be done for assets"; \ fi clean_assets : ./gradlew cleanAssets apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) $(LEVELDB_TARGET) \ $(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ANDR_ROOT)/jni/src/android_version.h \ $(ANDR_ROOT)/jni/src/android_version_githash.h sqlite3_download + @export TARGET_LIBDIR=${TARGET_LIBDIR}; \ export HAVE_LEVELDB=${HAVE_LEVELDB}; \ export APP_PLATFORM=${APP_PLATFORM}; \ export TARGET_ABI=${TARGET_ABI}; \ export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \ export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \ export COMPILER_VERSION=${COMPILER_VERSION}; \ export GPROF=${GPROF}; \ ${ANDROID_NDK}/ndk-build || exit 1; \ if [ ! -e ${APP_ROOT}/jniLibs ]; then \ ln -s ${ANDR_ROOT}/libs ${APP_ROOT}/jniLibs || exit 1; \ fi; \ export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" && \ export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') && \ ./gradlew assemble$$BUILD_TYPE_C && \ echo "APK stored at: build/outputs/apk/$$BUILD_TYPE/Minetest-$$BUILD_TYPE.apk" && \ echo "You can install it with \`make install_$$BUILD_TYPE\`" # These Intentionally doesn't depend on their respective build steps, # because it takes a while to verify that everything's up-to-date. install_debug: ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/debug/Minetest-debug.apk install_release: ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/release/Minetest-release.apk prep_srcdir : @if [ ! -e ${ANDR_ROOT}/jni/src ]; then \ ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src; \ fi; \ if [ ! -e ${ANDR_ROOT}/jni/lib ]; then \ ln -s ${PROJ_ROOT}/lib ${ANDR_ROOT}/jni/lib; \ fi clean_apk : ./gradlew clean clean_all : ./gradlew cleanAll $(ANDR_ROOT)/jni/src/android_version_githash.h : prep_srcdir @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version_githash.h; \ export VERSION_FILE_NEW=$${VERSION_FILE}.new; \ { \ echo "#ifndef ANDROID_MT_VERSION_GITHASH_H"; \ echo "#define ANDROID_MT_VERSION_GITHASH_H"; \ export GITHASH=$$(git rev-parse --short=8 HEAD); \ export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"; \ echo "#define VERSION_GITHASH \"$$VERSION_STR-$$GITHASH-Android\""; \ echo "#endif"; \ } > "$${VERSION_FILE_NEW}"; \ if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then \ echo "android_version_githash.h changed, updating..."; \ mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}"; \ else \ rm "$${VERSION_FILE_NEW}"; \ fi $(ANDR_ROOT)/jni/src/android_version.h : prep_srcdir @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version.h; \ export VERSION_FILE_NEW=$${VERSION_FILE}.new; \ { \ echo "#ifndef ANDROID_MT_VERSION_H"; \ echo "#define ANDROID_MT_VERSION_H"; \ echo "#define VERSION_MAJOR ${VERSION_MAJOR}"; \ echo "#define VERSION_MINOR ${VERSION_MINOR}"; \ echo "#define VERSION_PATCH ${VERSION_PATCH}"; \ echo "#define VERSION_STRING STR(VERSION_MAJOR) \".\" STR(VERSION_MINOR) \ \".\" STR(VERSION_PATCH)"; \ echo "#endif"; \ } > $${VERSION_FILE_NEW}; \ if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then \ echo "android_version.h changed, updating..."; \ mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}"; \ else \ rm "$${VERSION_FILE_NEW}"; \ fi clean : clean_apk clean_assets