diff --git a/android/build.bat b/android/build.bat
new file mode 100644
index 00000000..473cf549
--- /dev/null
+++ b/android/build.bat
@@ -0,0 +1 @@
+_build %1 %2
\ No newline at end of file
diff --git a/android/gears/.gitignore b/android/gears/.gitignore
new file mode 100644
index 00000000..7a5d249c
--- /dev/null
+++ b/android/gears/.gitignore
@@ -0,0 +1,10 @@
+/assets/
+/res/
+/bin/
+/libs/
+/obj/
+/build.xml
+/local.properties
+/project.properties
+/proguard-project.txt
+*.apk
\ No newline at end of file
diff --git a/android/gears/AndroidManifest.xml b/android/gears/AndroidManifest.xml
new file mode 100644
index 00000000..deaaf3c3
--- /dev/null
+++ b/android/gears/AndroidManifest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/gears/build.bat b/android/gears/build.bat
new file mode 100644
index 00000000..dbbba643
--- /dev/null
+++ b/android/gears/build.bat
@@ -0,0 +1,18 @@
+cd jni
+call ndk-build
+if %ERRORLEVEL% EQU 0 (
+ echo ndk-build has failed, build cancelled
+ cd..
+
+ mkdir "assets\shaders"
+ xcopy "..\..\data\shaders\gears.vert.spv" "assets\shaders" /Y
+ xcopy "..\..\data\shaders\gears.frag.spv" "assets\shaders" /Y
+
+ mkdir "res\drawable"
+ xcopy "..\..\android\images\icon.png" "res\drawable" /Y
+
+ call ant debug -Dout.final.file=vulkanGears.apk
+) ELSE (
+ echo error : ndk-build failed with errors!
+ cd..
+)
diff --git a/android/gears/jni/Android.mk b/android/gears/jni/Android.mk
new file mode 100644
index 00000000..c3591b3f
--- /dev/null
+++ b/android/gears/jni/Android.mk
@@ -0,0 +1,47 @@
+LOCAL_PATH := $(call my-dir)/../../gears
+
+# assimp
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := assimp
+LOCAL_SRC_FILES := $(LOCAL_PATH)/../../libs/assimp/$(TARGET_ARCH_ABI)/libassimp.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+# vulkan example
+
+DATADIR := $(LOCAL_PATH)/../../data
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := vulkanGears
+
+PROJECT_FILES := $(wildcard $(LOCAL_PATH)/../../gears/*.cpp)
+PROJECT_FILES += $(wildcard $(LOCAL_PATH)/../../base/*.cpp)
+
+LOCAL_CPPFLAGS := -std=c++11
+LOCAL_CPPFLAGS += -D__STDC_LIMIT_MACROS
+LOCAL_CPPFLAGS += -DVK_NO_PROTOTYPES
+LOCAL_CPPFLAGS += -DVK_USE_PLATFORM_ANDROID_KHR
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../external/
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/glm
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/gli
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/assimp
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/
+#LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/android
+
+LOCAL_SRC_FILES := $(PROJECT_FILES)
+
+LOCAL_LDLIBS := -landroid -llog -lz
+
+LOCAL_DISABLE_FORMAT_STRING_CHECKS := true
+
+LOCAL_STATIC_LIBRARIES += android_native_app_glue
+LOCAL_STATIC_LIBRARIES += cpufeatures
+LOCAL_STATIC_LIBRARIES += libassimp
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module, android/native_app_glue)
+$(call import-module, android/cpufeatures)
diff --git a/android/gears/jni/Application.mk b/android/gears/jni/Application.mk
new file mode 100644
index 00000000..62020feb
--- /dev/null
+++ b/android/gears/jni/Application.mk
@@ -0,0 +1,5 @@
+APP_PLATFORM := android-19
+APP_ABI := armeabi-v7a
+APP_STL := c++_static
+APP_CPPFLAGS := -std=c++11
+NDK_TOOLCHAIN_VERSION := clang
diff --git a/android/geometryshader/.gitignore b/android/geometryshader/.gitignore
new file mode 100644
index 00000000..7a5d249c
--- /dev/null
+++ b/android/geometryshader/.gitignore
@@ -0,0 +1,10 @@
+/assets/
+/res/
+/bin/
+/libs/
+/obj/
+/build.xml
+/local.properties
+/project.properties
+/proguard-project.txt
+*.apk
\ No newline at end of file
diff --git a/android/geometryshader/AndroidManifest.xml b/android/geometryshader/AndroidManifest.xml
new file mode 100644
index 00000000..234bcc21
--- /dev/null
+++ b/android/geometryshader/AndroidManifest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/geometryshader/build.bat b/android/geometryshader/build.bat
new file mode 100644
index 00000000..73fa63c4
--- /dev/null
+++ b/android/geometryshader/build.bat
@@ -0,0 +1,20 @@
+cd jni
+call ndk-build
+if %ERRORLEVEL% EQU 0 (
+ echo ndk-build has failed, build cancelled
+ cd..
+
+ mkdir "assets\shaders\geometryshader"
+ xcopy "..\..\data\shaders\geometryshader\*.spv" "assets\shaders\geometryshader" /Y
+
+ mkdir "assets\models"
+ xcopy "..\..\data\models\suzanne.obj" "assets\models" /Y
+
+ mkdir "res\drawable"
+ xcopy "..\..\android\images\icon.png" "res\drawable" /Y
+
+ call ant debug -Dout.final.file=vulkanGeometryshader.apk
+) ELSE (
+ echo error : ndk-build failed with errors!
+ cd..
+)
diff --git a/android/geometryshader/jni/Android.mk b/android/geometryshader/jni/Android.mk
new file mode 100644
index 00000000..f5449211
--- /dev/null
+++ b/android/geometryshader/jni/Android.mk
@@ -0,0 +1,47 @@
+LOCAL_PATH := $(call my-dir)/../../geometryshader
+
+# assimp
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := assimp
+LOCAL_SRC_FILES := $(LOCAL_PATH)/../../libs/assimp/$(TARGET_ARCH_ABI)/libassimp.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+# vulkan example
+
+DATADIR := $(LOCAL_PATH)/../../data
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := vulkanGeometryshader
+
+PROJECT_FILES := $(wildcard $(LOCAL_PATH)/../../geometryshader/*.cpp)
+PROJECT_FILES += $(wildcard $(LOCAL_PATH)/../../base/*.cpp)
+
+LOCAL_CPPFLAGS := -std=c++11
+LOCAL_CPPFLAGS += -D__STDC_LIMIT_MACROS
+LOCAL_CPPFLAGS += -DVK_NO_PROTOTYPES
+LOCAL_CPPFLAGS += -DVK_USE_PLATFORM_ANDROID_KHR
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../external/
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/glm
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/gli
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/assimp
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/
+#LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/android
+
+LOCAL_SRC_FILES := $(PROJECT_FILES)
+
+LOCAL_LDLIBS := -landroid -llog -lz
+
+LOCAL_DISABLE_FORMAT_STRING_CHECKS := true
+
+LOCAL_STATIC_LIBRARIES += android_native_app_glue
+LOCAL_STATIC_LIBRARIES += cpufeatures
+LOCAL_STATIC_LIBRARIES += libassimp
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module, android/native_app_glue)
+$(call import-module, android/cpufeatures)
diff --git a/android/geometryshader/jni/Application.mk b/android/geometryshader/jni/Application.mk
new file mode 100644
index 00000000..62020feb
--- /dev/null
+++ b/android/geometryshader/jni/Application.mk
@@ -0,0 +1,5 @@
+APP_PLATFORM := android-19
+APP_ABI := armeabi-v7a
+APP_STL := c++_static
+APP_CPPFLAGS := -std=c++11
+NDK_TOOLCHAIN_VERSION := clang
diff --git a/android/instancing/.gitignore b/android/instancing/.gitignore
new file mode 100644
index 00000000..7a5d249c
--- /dev/null
+++ b/android/instancing/.gitignore
@@ -0,0 +1,10 @@
+/assets/
+/res/
+/bin/
+/libs/
+/obj/
+/build.xml
+/local.properties
+/project.properties
+/proguard-project.txt
+*.apk
\ No newline at end of file
diff --git a/android/instancing/AndroidManifest.xml b/android/instancing/AndroidManifest.xml
new file mode 100644
index 00000000..e4832677
--- /dev/null
+++ b/android/instancing/AndroidManifest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/instancing/build.bat b/android/instancing/build.bat
new file mode 100644
index 00000000..c8e48872
--- /dev/null
+++ b/android/instancing/build.bat
@@ -0,0 +1,20 @@
+cd jni
+call ndk-build
+if %ERRORLEVEL% EQU 0 (
+ echo ndk-build has failed, build cancelled
+ cd..
+
+ mkdir "assets\shaders\instancing"
+ xcopy "..\..\data\shaders\instancing\*.spv" "assets\shaders\instancing" /Y
+
+ mkdir "assets\models"
+ xcopy "..\..\data\models\angryteapot.3ds" "assets\models" /Y
+
+ mkdir "res\drawable"
+ xcopy "..\..\android\images\icon.png" "res\drawable" /Y
+
+ call ant debug -Dout.final.file=vulkanInstancing.apk
+) ELSE (
+ echo error : ndk-build failed with errors!
+ cd..
+)
diff --git a/android/instancing/jni/Android.mk b/android/instancing/jni/Android.mk
new file mode 100644
index 00000000..ead2b4fb
--- /dev/null
+++ b/android/instancing/jni/Android.mk
@@ -0,0 +1,47 @@
+LOCAL_PATH := $(call my-dir)/../../instancing
+
+# assimp
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := assimp
+LOCAL_SRC_FILES := $(LOCAL_PATH)/../../libs/assimp/$(TARGET_ARCH_ABI)/libassimp.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+# vulkan example
+
+DATADIR := $(LOCAL_PATH)/../../data
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := vulkanInstancing
+
+PROJECT_FILES := $(wildcard $(LOCAL_PATH)/../../instancing/*.cpp)
+PROJECT_FILES += $(wildcard $(LOCAL_PATH)/../../base/*.cpp)
+
+LOCAL_CPPFLAGS := -std=c++11
+LOCAL_CPPFLAGS += -D__STDC_LIMIT_MACROS
+LOCAL_CPPFLAGS += -DVK_NO_PROTOTYPES
+LOCAL_CPPFLAGS += -DVK_USE_PLATFORM_ANDROID_KHR
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../external/
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/glm
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/gli
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/assimp
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/
+#LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/android
+
+LOCAL_SRC_FILES := $(PROJECT_FILES)
+
+LOCAL_LDLIBS := -landroid -llog -lz
+
+LOCAL_DISABLE_FORMAT_STRING_CHECKS := true
+
+LOCAL_STATIC_LIBRARIES += android_native_app_glue
+LOCAL_STATIC_LIBRARIES += cpufeatures
+LOCAL_STATIC_LIBRARIES += libassimp
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module, android/native_app_glue)
+$(call import-module, android/cpufeatures)
diff --git a/android/instancing/jni/Application.mk b/android/instancing/jni/Application.mk
new file mode 100644
index 00000000..62020feb
--- /dev/null
+++ b/android/instancing/jni/Application.mk
@@ -0,0 +1,5 @@
+APP_PLATFORM := android-19
+APP_ABI := armeabi-v7a
+APP_STL := c++_static
+APP_CPPFLAGS := -std=c++11
+NDK_TOOLCHAIN_VERSION := clang
diff --git a/android/occlusionquery/.gitignore b/android/occlusionquery/.gitignore
new file mode 100644
index 00000000..7a5d249c
--- /dev/null
+++ b/android/occlusionquery/.gitignore
@@ -0,0 +1,10 @@
+/assets/
+/res/
+/bin/
+/libs/
+/obj/
+/build.xml
+/local.properties
+/project.properties
+/proguard-project.txt
+*.apk
\ No newline at end of file
diff --git a/android/occlusionquery/AndroidManifest.xml b/android/occlusionquery/AndroidManifest.xml
new file mode 100644
index 00000000..8541bf9d
--- /dev/null
+++ b/android/occlusionquery/AndroidManifest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/occlusionquery/build.bat b/android/occlusionquery/build.bat
new file mode 100644
index 00000000..b4f651b1
--- /dev/null
+++ b/android/occlusionquery/build.bat
@@ -0,0 +1,22 @@
+cd jni
+call ndk-build
+if %ERRORLEVEL% EQU 0 (
+ echo ndk-build has failed, build cancelled
+ cd..
+
+ mkdir "assets\shaders\occlusionquery"
+ xcopy "..\..\data\shaders\occlusionquery\*.spv" "assets\shaders\occlusionquery" /Y
+
+ mkdir "assets\models"
+ xcopy "..\..\data\models\plane_z.3ds" "assets\models" /Y
+ xcopy "..\..\data\models\teapot.3ds" "assets\models" /Y
+ xcopy "..\..\data\models\sphere.3ds" "assets\models" /Y
+
+ mkdir "res\drawable"
+ xcopy "..\..\android\images\icon.png" "res\drawable" /Y
+
+ call ant debug -Dout.final.file=vulkanOcclusionquery.apk
+) ELSE (
+ echo error : ndk-build failed with errors!
+ cd..
+)
diff --git a/android/occlusionquery/jni/Android.mk b/android/occlusionquery/jni/Android.mk
new file mode 100644
index 00000000..f45ea520
--- /dev/null
+++ b/android/occlusionquery/jni/Android.mk
@@ -0,0 +1,47 @@
+LOCAL_PATH := $(call my-dir)/../../occlusionquery
+
+# assimp
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := assimp
+LOCAL_SRC_FILES := $(LOCAL_PATH)/../../libs/assimp/$(TARGET_ARCH_ABI)/libassimp.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+# vulkan example
+
+DATADIR := $(LOCAL_PATH)/../../data
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := vulkanOcclusionquery
+
+PROJECT_FILES := $(wildcard $(LOCAL_PATH)/../../occlusionquery/*.cpp)
+PROJECT_FILES += $(wildcard $(LOCAL_PATH)/../../base/*.cpp)
+
+LOCAL_CPPFLAGS := -std=c++11
+LOCAL_CPPFLAGS += -D__STDC_LIMIT_MACROS
+LOCAL_CPPFLAGS += -DVK_NO_PROTOTYPES
+LOCAL_CPPFLAGS += -DVK_USE_PLATFORM_ANDROID_KHR
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../external/
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/glm
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/gli
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/assimp
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/
+#LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../base/android
+
+LOCAL_SRC_FILES := $(PROJECT_FILES)
+
+LOCAL_LDLIBS := -landroid -llog -lz
+
+LOCAL_DISABLE_FORMAT_STRING_CHECKS := true
+
+LOCAL_STATIC_LIBRARIES += android_native_app_glue
+LOCAL_STATIC_LIBRARIES += cpufeatures
+LOCAL_STATIC_LIBRARIES += libassimp
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module, android/native_app_glue)
+$(call import-module, android/cpufeatures)
diff --git a/android/occlusionquery/jni/Application.mk b/android/occlusionquery/jni/Application.mk
new file mode 100644
index 00000000..62020feb
--- /dev/null
+++ b/android/occlusionquery/jni/Application.mk
@@ -0,0 +1,5 @@
+APP_PLATFORM := android-19
+APP_ABI := armeabi-v7a
+APP_STL := c++_static
+APP_CPPFLAGS := -std=c++11
+NDK_TOOLCHAIN_VERSION := clang
diff --git a/data/models/angryteapot.3ds b/data/models/angryteapot.3ds
new file mode 100644
index 00000000..609205f6
Binary files /dev/null and b/data/models/angryteapot.3ds differ
diff --git a/data/models/angryteapot.X b/data/models/angryteapot.X
deleted file mode 100644
index 9bdb2864..00000000
Binary files a/data/models/angryteapot.X and /dev/null differ
diff --git a/gears/gears.cpp b/gears/gears.cpp
index ba320aa5..07d88ed4 100644
--- a/gears/gears.cpp
+++ b/gears/gears.cpp
@@ -334,8 +334,8 @@ public:
// Load shaders
std::array shaderStages;
- shaderStages[0] = loadShader("./../data/shaders/gears.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
- shaderStages[1] = loadShader("./../data/shaders/gears.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
+ shaderStages[0] = loadShader(getAssetPath() + "shaders/gears.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
+ shaderStages[1] = loadShader(getAssetPath() + "shaders/gears.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
vkTools::initializers::pipelineCreateInfo(
@@ -401,8 +401,7 @@ public:
VulkanExample *vulkanExample;
-#ifdef _WIN32
-
+#if defined(_WIN32)
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (vulkanExample != NULL)
@@ -411,9 +410,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
-
-#else
-
+#elif defined(__linux__) && !defined(__ANDROID__)
static void handleEvent(const xcb_generic_event_t *event)
{
if (vulkanExample != NULL)
@@ -423,21 +420,42 @@ static void handleEvent(const xcb_generic_event_t *event)
}
#endif
-#ifdef _WIN32
+// Main entry point
+#if defined(_WIN32)
+// Windows entry point
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
-#else
+#elif defined(__ANDROID__)
+// Android entry point
+void android_main(android_app* state)
+#elif defined(__linux__)
+// Linux entry point
int main(const int argc, const char *argv[])
#endif
{
+#if defined(__ANDROID__)
+ // Removing this may cause the compiler to omit the main entry point
+ // which would make the application crash at start
+ app_dummy();
+#endif
vulkanExample = new VulkanExample();
-#ifdef _WIN32
+#if defined(_WIN32)
vulkanExample->setupWindow(hInstance, WndProc);
-#else
+#elif defined(__ANDROID__)
+ // Attach vulkan example to global android application state
+ state->userData = vulkanExample;
+ state->onAppCmd = VulkanExample::handleAppCommand;
+ state->onInputEvent = VulkanExample::handleAppInput;
+ vulkanExample->androidApp = state;
+#elif defined(__linux__)
vulkanExample->setupWindow();
#endif
+#if !defined(__ANDROID__)
vulkanExample->initSwapchain();
vulkanExample->prepare();
+#endif
vulkanExample->renderLoop();
+#if !defined(__ANDROID__)
delete(vulkanExample);
return 0;
-}
+#endif
+}
\ No newline at end of file
diff --git a/geometryshader/geometryshader.cpp b/geometryshader/geometryshader.cpp
index 3dfd7269..a8722750 100644
--- a/geometryshader/geometryshader.cpp
+++ b/geometryshader/geometryshader.cpp
@@ -188,7 +188,7 @@ public:
void loadMeshes()
{
- loadMesh("./../data/models/suzanne.obj", &meshes.object, vertexLayout, 0.25f);
+ loadMesh(getAssetPath() + "models/suzanne.obj", &meshes.object, vertexLayout, 0.25f);
}
void setupVertexDescriptions()
@@ -375,9 +375,9 @@ public:
// Load shaders
std::array shaderStages;
- shaderStages[0] = loadShader("./../data/shaders/geometryshader/base.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
- shaderStages[1] = loadShader("./../data/shaders/geometryshader/base.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
- shaderStages[2] = loadShader("./../data/shaders/geometryshader/normaldebug.geom.spv", VK_SHADER_STAGE_GEOMETRY_BIT);
+ shaderStages[0] = loadShader(getAssetPath() + "shaders/geometryshader/base.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
+ shaderStages[1] = loadShader(getAssetPath() + "shaders/geometryshader/base.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
+ shaderStages[2] = loadShader(getAssetPath() + "shaders/geometryshader/normaldebug.geom.spv", VK_SHADER_STAGE_GEOMETRY_BIT);
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
vkTools::initializers::pipelineCreateInfo(
@@ -403,8 +403,8 @@ public:
// Solid rendering pipeline
// Shader
- shaderStages[0] = loadShader("./../data/shaders/geometryshader/mesh.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
- shaderStages[1] = loadShader("./../data/shaders/geometryshader/mesh.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
+ shaderStages[0] = loadShader(getAssetPath() + "shaders/geometryshader/mesh.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
+ shaderStages[1] = loadShader(getAssetPath() + "shaders/geometryshader/mesh.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
pipelineCreateInfo.stageCount = 2;
err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.solid);
assert(!err);
@@ -496,8 +496,7 @@ public:
VulkanExample *vulkanExample;
-#ifdef _WIN32
-
+#if defined(_WIN32)
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (vulkanExample != NULL)
@@ -506,9 +505,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
-
-#else
-
+#elif defined(__linux__) && !defined(__ANDROID__)
static void handleEvent(const xcb_generic_event_t *event)
{
if (vulkanExample != NULL)
@@ -518,21 +515,42 @@ static void handleEvent(const xcb_generic_event_t *event)
}
#endif
-#ifdef _WIN32
+// Main entry point
+#if defined(_WIN32)
+// Windows entry point
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
-#else
+#elif defined(__ANDROID__)
+// Android entry point
+void android_main(android_app* state)
+#elif defined(__linux__)
+// Linux entry point
int main(const int argc, const char *argv[])
#endif
{
+#if defined(__ANDROID__)
+ // Removing this may cause the compiler to omit the main entry point
+ // which would make the application crash at start
+ app_dummy();
+#endif
vulkanExample = new VulkanExample();
-#ifdef _WIN32
+#if defined(_WIN32)
vulkanExample->setupWindow(hInstance, WndProc);
-#else
+#elif defined(__ANDROID__)
+ // Attach vulkan example to global android application state
+ state->userData = vulkanExample;
+ state->onAppCmd = VulkanExample::handleAppCommand;
+ state->onInputEvent = VulkanExample::handleAppInput;
+ vulkanExample->androidApp = state;
+#elif defined(__linux__)
vulkanExample->setupWindow();
#endif
+#if !defined(__ANDROID__)
vulkanExample->initSwapchain();
vulkanExample->prepare();
+#endif
vulkanExample->renderLoop();
+#if !defined(__ANDROID__)
delete(vulkanExample);
return 0;
-}
+#endif
+}
\ No newline at end of file
diff --git a/instancing/instancing.cpp b/instancing/instancing.cpp
index 88ef88f4..0451cac9 100644
--- a/instancing/instancing.cpp
+++ b/instancing/instancing.cpp
@@ -197,7 +197,7 @@ public:
void loadMeshes()
{
- loadMesh("./../data/models/angryteapot.X", &meshes.example, vertexLayout, 0.05f);
+ loadMesh(getAssetPath() + "models/angryteapot.3ds", &meshes.example, vertexLayout, 0.05f);
}
void setupVertexDescriptions()
@@ -370,8 +370,8 @@ public:
// Load shaders
std::array shaderStages;
- shaderStages[0] = loadShader("./../data/shaders/instancing/instancing.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
- shaderStages[1] = loadShader("./../data/shaders/instancing/instancing.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
+ shaderStages[0] = loadShader(getAssetPath() + "shaders/instancing/instancing.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
+ shaderStages[1] = loadShader(getAssetPath() + "shaders/instancing/instancing.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
vkTools::initializers::pipelineCreateInfo(
@@ -499,8 +499,7 @@ public:
VulkanExample *vulkanExample;
-#ifdef _WIN32
-
+#if defined(_WIN32)
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (vulkanExample != NULL)
@@ -509,9 +508,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
-
-#else
-
+#elif defined(__linux__) && !defined(__ANDROID__)
static void handleEvent(const xcb_generic_event_t *event)
{
if (vulkanExample != NULL)
@@ -521,21 +518,42 @@ static void handleEvent(const xcb_generic_event_t *event)
}
#endif
-#ifdef _WIN32
+// Main entry point
+#if defined(_WIN32)
+// Windows entry point
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
-#else
+#elif defined(__ANDROID__)
+// Android entry point
+void android_main(android_app* state)
+#elif defined(__linux__)
+// Linux entry point
int main(const int argc, const char *argv[])
#endif
{
+#if defined(__ANDROID__)
+ // Removing this may cause the compiler to omit the main entry point
+ // which would make the application crash at start
+ app_dummy();
+#endif
vulkanExample = new VulkanExample();
-#ifdef _WIN32
+#if defined(_WIN32)
vulkanExample->setupWindow(hInstance, WndProc);
-#else
+#elif defined(__ANDROID__)
+ // Attach vulkan example to global android application state
+ state->userData = vulkanExample;
+ state->onAppCmd = VulkanExample::handleAppCommand;
+ state->onInputEvent = VulkanExample::handleAppInput;
+ vulkanExample->androidApp = state;
+#elif defined(__linux__)
vulkanExample->setupWindow();
#endif
+#if !defined(__ANDROID__)
vulkanExample->initSwapchain();
vulkanExample->prepare();
+#endif
vulkanExample->renderLoop();
+#if !defined(__ANDROID__)
delete(vulkanExample);
return 0;
+#endif
}
diff --git a/occlusionquery/occlusionquery.cpp b/occlusionquery/occlusionquery.cpp
index 87c87a99..feed9eca 100644
--- a/occlusionquery/occlusionquery.cpp
+++ b/occlusionquery/occlusionquery.cpp
@@ -354,9 +354,9 @@ public:
void loadMeshes()
{
- loadMesh("./../data/models/plane_z.3ds", &meshes.plane, vertexLayout, 0.4f);
- loadMesh("./../data/models/teapot.3ds", &meshes.teapot, vertexLayout, 0.3f);
- loadMesh("./../data/models/sphere.3ds", &meshes.sphere, vertexLayout, 0.3f);
+ loadMesh(getAssetPath() + "models/plane_z.3ds", &meshes.plane, vertexLayout, 0.4f);
+ loadMesh(getAssetPath() + "models/teapot.3ds", &meshes.teapot, vertexLayout, 0.3f);
+ loadMesh(getAssetPath() + "models/sphere.3ds", &meshes.sphere, vertexLayout, 0.3f);
}
void setupVertexDescriptions()
@@ -538,8 +538,8 @@ public:
// Load shaders
std::array shaderStages;
- shaderStages[0] = loadShader("./../data/shaders/occlusionquery/mesh.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
- shaderStages[1] = loadShader("./../data/shaders/occlusionquery/mesh.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
+ shaderStages[0] = loadShader(getAssetPath() + "shaders/occlusionquery/mesh.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
+ shaderStages[1] = loadShader(getAssetPath() + "shaders/occlusionquery/mesh.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
vkTools::initializers::pipelineCreateInfo(
@@ -562,16 +562,16 @@ public:
assert(!err);
// Simple pipeline
- shaderStages[0] = loadShader("./../data/shaders/occlusionquery/simple.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
- shaderStages[1] = loadShader("./../data/shaders/occlusionquery/simple.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
+ shaderStages[0] = loadShader(getAssetPath() + "shaders/occlusionquery/simple.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
+ shaderStages[1] = loadShader(getAssetPath() + "shaders/occlusionquery/simple.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
rasterizationState.cullMode = VK_CULL_MODE_NONE;
err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.simple);
assert(!err);
// Visual pipeline for the occluder
- shaderStages[0] = loadShader("./../data/shaders/occlusionquery/occluder.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
- shaderStages[1] = loadShader("./../data/shaders/occlusionquery/occluder.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
+ shaderStages[0] = loadShader(getAssetPath() + "shaders/occlusionquery/occluder.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
+ shaderStages[1] = loadShader(getAssetPath() + "shaders/occlusionquery/occluder.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
// Enable blending
blendAttachmentState.blendEnable = VK_TRUE;
@@ -691,8 +691,7 @@ public:
VulkanExample *vulkanExample;
-#ifdef _WIN32
-
+#if defined(_WIN32)
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (vulkanExample != NULL)
@@ -701,9 +700,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
-
-#else
-
+#elif defined(__linux__) && !defined(__ANDROID__)
static void handleEvent(const xcb_generic_event_t *event)
{
if (vulkanExample != NULL)
@@ -713,21 +710,42 @@ static void handleEvent(const xcb_generic_event_t *event)
}
#endif
-#ifdef _WIN32
+// Main entry point
+#if defined(_WIN32)
+// Windows entry point
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
-#else
+#elif defined(__ANDROID__)
+// Android entry point
+void android_main(android_app* state)
+#elif defined(__linux__)
+// Linux entry point
int main(const int argc, const char *argv[])
#endif
{
+#if defined(__ANDROID__)
+ // Removing this may cause the compiler to omit the main entry point
+ // which would make the application crash at start
+ app_dummy();
+#endif
vulkanExample = new VulkanExample();
-#ifdef _WIN32
+#if defined(_WIN32)
vulkanExample->setupWindow(hInstance, WndProc);
-#else
+#elif defined(__ANDROID__)
+ // Attach vulkan example to global android application state
+ state->userData = vulkanExample;
+ state->onAppCmd = VulkanExample::handleAppCommand;
+ state->onInputEvent = VulkanExample::handleAppInput;
+ vulkanExample->androidApp = state;
+#elif defined(__linux__)
vulkanExample->setupWindow();
#endif
+#if !defined(__ANDROID__)
vulkanExample->initSwapchain();
vulkanExample->prepare();
+#endif
vulkanExample->renderLoop();
+#if !defined(__ANDROID__)
delete(vulkanExample);
return 0;
-}
+#endif
+}
\ No newline at end of file