diff --git a/config/lib/vma/vma.cpp b/config/lib/vma/vma.cpp
index 0928b552c10e23914054c44b8de43df722aa2cf0..307c27f096bd1bae2b1deb2ca5994f132adc92cc 100644
--- a/config/lib/vma/vma.cpp
+++ b/config/lib/vma/vma.cpp
@@ -3,5 +3,56 @@
 #define _DEBUG
 #endif
 
+#ifndef _MSVC_LANG
+#ifdef __MINGW32__
+#include <stdint.h>
+#include <stdlib.h>
+
+class VmaMutex {
+public:
+	VmaMutex() : m_locked(false) {}
+	
+	void Lock() {
+		while (m_locked);
+		m_locked = true;
+	}
+	
+	void Unlock() {
+		m_locked = false;
+	}
+private:
+	bool m_locked;
+};
+
+#define VMA_MUTEX VmaMutex
+
+template <typename T>
+T* custom_overestimate_malloc(size_t size) {
+	return new T[size + (sizeof(T) - 1) / sizeof(T)];
+}
+
+void* custom_aligned_malloc(size_t alignment, size_t size) {
+	if (alignment > 4) {
+		return custom_overestimate_malloc<uint64_t>(size);
+	} else
+	if (alignment > 2) {
+		return custom_overestimate_malloc<uint32_t>(size);
+	} else
+	if (alignment > 1) {
+		return custom_overestimate_malloc<uint16_t>(size);
+	} else {
+		return custom_overestimate_malloc<uint8_t>(size);
+	}
+}
+
+void custom_free(void *ptr) {
+	delete[] reinterpret_cast<uint8_t*>(ptr);
+}
+
+#define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment) (custom_aligned_malloc(alignment, size))
+#define VMA_SYSTEM_FREE(ptr) (custom_free(ptr))
+#endif
+#endif
+
 #define VMA_IMPLEMENTATION
 #include "vk_mem_alloc.hpp"
diff --git a/include/vkcv/Event.hpp b/include/vkcv/Event.hpp
index da5cbc72fbb3eee3a71a35c1da6fe32dff06b057..4117d8d35c7541672c54f3053c3fbe2fdde38a40 100644
--- a/include/vkcv/Event.hpp
+++ b/include/vkcv/Event.hpp
@@ -1,7 +1,10 @@
 #pragma once
 
 #include <functional>
+
+#ifndef __MINGW32__
 #include <mutex>
+#endif
 
 namespace vkcv {
 	
@@ -27,7 +30,10 @@ namespace vkcv {
     private:
         std::vector< event_function<T...> > m_functions;
         uint32_t m_id_counter;
+	
+#ifndef __MINGW32__
 		std::mutex m_mutex;
+#endif
 
     public:
 
@@ -75,14 +81,18 @@ namespace vkcv {
          * locks the event so its function handles won't be called
          */
         void lock() {
+#ifndef __MINGW32__
 			m_mutex.lock();
+#endif
         }
 	
 		/**
 		* unlocks the event so its function handles can be called after locking
 		*/
         void unlock() {
+#ifndef __MINGW32__
 			m_mutex.unlock();
+#endif
         }
 
         explicit event(bool locked = false) {
diff --git a/lib/VulkanMemoryAllocator-Hpp b/lib/VulkanMemoryAllocator-Hpp
index eae6e8d3bd4593e0d7071c85fba2a8f33fbe5dab..3a61240a5354ce56c222969a69825aabb6ba0a21 160000
--- a/lib/VulkanMemoryAllocator-Hpp
+++ b/lib/VulkanMemoryAllocator-Hpp
@@ -1 +1 @@
-Subproject commit eae6e8d3bd4593e0d7071c85fba2a8f33fbe5dab
+Subproject commit 3a61240a5354ce56c222969a69825aabb6ba0a21
diff --git a/modules/camera/config/GLM.cmake b/modules/camera/config/GLM.cmake
index efd6444451100b912aa0b5b4a532dc8f448b0b40..f256ccade8c4f44a89744bb7875371324cf2369d 100644
--- a/modules/camera/config/GLM.cmake
+++ b/modules/camera/config/GLM.cmake
@@ -4,18 +4,20 @@ find_package(glm QUIET)
 if (glm_FOUND)
     list(APPEND vkcv_camera_includes ${GLM_INCLUDE_DIRS})
     list(APPEND vkcv_camera_libraries glm)
-
-    list(APPEND vkcv_camera_definitions GLM_DEPTH_ZERO_TO_ONE)
-    list(APPEND vkcv_camera_definitions GLM_FORCE_LEFT_HANDED)
 else()
     if (EXISTS "${vkcv_camera_lib_path}/glm")
         add_subdirectory(${vkcv_camera_lib}/glm)
-        
+
+        list(APPEND vkcv_camera_includes ${vkcv_camera_lib_path}/glm)
         list(APPEND vkcv_camera_libraries glm)
-        
-        list(APPEND vkcv_camera_definitions GLM_DEPTH_ZERO_TO_ONE)
-        list(APPEND vkcv_camera_definitions GLM_FORCE_LEFT_HANDED)
     else()
         message(WARNING "GLM is required..! Update the submodules!")
     endif ()
 endif ()
+
+list(APPEND vkcv_camera_definitions GLM_DEPTH_ZERO_TO_ONE)
+list(APPEND vkcv_camera_definitions GLM_FORCE_LEFT_HANDED)
+
+if ((WIN32) AND (${CMAKE_SIZEOF_VOID_P} MATCHES 4))
+    list(APPEND vkcv_camera_definitions GLM_ENABLE_EXPERIMENTAL)
+endif()