summaryrefslogtreecommitdiffstats
path: root/Common
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2015-10-21 03:46:28 +0000
committerEgor Yusov <egor.yusov@gmail.com>2015-10-21 03:46:28 +0000
commit9ccee73baca0fd7ecb95c90cb983133b737c6c55 (patch)
tree66fea1e6521df31727431520fe3c1ead1896bc5d /Common
downloadDiligentCore-9ccee73baca0fd7ecb95c90cb983133b737c6c55.tar.gz
DiligentCore-9ccee73baca0fd7ecb95c90cb983133b737c6c55.zip
Release v1.0.0
Diffstat (limited to 'Common')
-rw-r--r--Common/Android/gcc_Debug.h199
-rw-r--r--Common/Android/gcc_Release.h380
-rw-r--r--Common/build/Windows/Android/gcc_Debug.h199
-rw-r--r--Common/build/Windows/Android/gcc_Release.h380
-rw-r--r--Common/build/Windows/Common-Debug.vgdbsettings76
-rw-r--r--Common/build/Windows/Common-Release.vgdbsettings76
-rw-r--r--Common/build/Windows/Common.props10
-rw-r--r--Common/build/Windows/Common.vcxproj200
-rw-r--r--Common/build/Windows/Common.vcxproj.filters34
-rw-r--r--Common/build/Windows/EngineRoot.props14
-rw-r--r--Common/build/Windows/jni/Android.mk27
-rw-r--r--Common/build/Windows/jni/Application.mk7
-rw-r--r--Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems54
-rw-r--r--Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems.filters105
-rw-r--r--Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj205
-rw-r--r--Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj.filters5
-rw-r--r--Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj144
-rw-r--r--Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj.filters5
-rw-r--r--Common/build/WindowsStore/EngineRoot.props14
-rw-r--r--Common/include/BasicFileStream.h66
-rw-r--r--Common/include/BasicTypes.h52
-rw-r--r--Common/include/DataBlobImpl.h58
-rw-r--r--Common/include/DebugUtilities.h66
-rw-r--r--Common/include/Errors.h67
-rw-r--r--Common/include/FileWrapper.h91
-rw-r--r--Common/include/FormatMessage.h44
-rw-r--r--Common/include/HashUtils.h195
-rw-r--r--Common/include/InterfaceID.h50
-rw-r--r--Common/include/LockHelper.h133
-rw-r--r--Common/include/ObjectBase.h83
-rw-r--r--Common/include/RefCntAutoPtr.h391
-rw-r--r--Common/include/RefCountedObjectImpl.h332
-rw-r--r--Common/include/StringTools.h75
-rw-r--r--Common/include/Timer.h41
-rw-r--r--Common/include/UniqueIdentifier.h79
-rw-r--r--Common/include/ValidatedCast.h33
-rw-r--r--Common/include/pch.h35
-rw-r--r--Common/interface/AdvancedMath.h127
-rw-r--r--Common/interface/BasicMath.h1344
-rw-r--r--Common/interface/ComPtr.h43
-rw-r--r--Common/interface/DataBlob.h53
-rw-r--r--Common/interface/FileStream.h58
-rw-r--r--Common/interface/Object.h79
-rw-r--r--Common/interface/ReferenceCounters.h115
-rw-r--r--Common/make/AppCommon.mk11
-rw-r--r--Common/src/BasicFileStream.cpp61
-rw-r--r--Common/src/DataBlobImpl.cpp52
-rw-r--r--Common/src/Timer.cpp58
-rw-r--r--Common/src/pch.cpp31
49 files changed, 6057 insertions, 0 deletions
diff --git a/Common/Android/gcc_Debug.h b/Common/Android/gcc_Debug.h
new file mode 100644
index 00000000..b46f53e0
--- /dev/null
+++ b/Common/Android/gcc_Debug.h
@@ -0,0 +1,199 @@
+/*
+ This file is only used by IntelliSense (VisualStudio code suggestion system)
+ DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES.
+ This file lists the preprocessor macros extracted from your GCC.
+ It is needed for IntelliSense to parse other header files correctly.
+*/
+#ifdef _MSC_VER
+#define _GNU_SOURCE 1
+#define __ANDROID__ 1
+#define __APCS_32__ 1
+#define __ARMEL__ 1
+#define __ARM_ARCH 7
+#define __ARM_ARCH_7A__ 1
+#define __ARM_ARCH_PROFILE A
+#define __ARM_EABI__ 1
+#define __ARM_PCS 1
+#define __ARM_VFPV3__ 1
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_SEQ_CST 5
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __CHAR16_TYPE__ unsigned short
+#define __CHAR32_TYPE__ unsigned int
+#define __CHAR_BIT__ 8
+#define __CHAR_UNSIGNED__ 1
+#define __CONSTANT_CFSTRINGS__ 1
+#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
+#define __DBL_DIG__ 15
+#define __DBL_EPSILON__ 2.2204460492503131e-16
+#define __DBL_HAS_DENORM__ 1
+#define __DBL_HAS_INFINITY__ 1
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __DBL_MANT_DIG__ 53
+#define __DBL_MAX_10_EXP__ 308
+#define __DBL_MAX_EXP__ 1024
+#define __DBL_MAX__ 1.7976931348623157e+308
+#define __DBL_MIN_10_EXP__ (-307)
+#define __DBL_MIN_EXP__ (-1021)
+#define __DBL_MIN__ 2.2250738585072014e-308
+#define __DECIMAL_DIG__ 17
+#define __DEPRECATED 1
+#define __ELF__ 1
+#define __EXCEPTIONS 1
+#define __FINITE_MATH_ONLY__ 0
+#define __FLT_DENORM_MIN__ 1.40129846e-45F
+#define __FLT_DIG__ 6
+#define __FLT_EPSILON__ 1.19209290e-7F
+#define __FLT_EVAL_METHOD__ 0
+#define __FLT_HAS_DENORM__ 1
+#define __FLT_HAS_INFINITY__ 1
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MANT_DIG__ 24
+#define __FLT_MAX_10_EXP__ 38
+#define __FLT_MAX_EXP__ 128
+#define __FLT_MAX__ 3.40282347e+38F
+#define __FLT_MIN_10_EXP__ (-37)
+#define __FLT_MIN_EXP__ (-125)
+#define __FLT_MIN__ 1.17549435e-38F
+#define __FLT_RADIX__ 2
+#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
+#define __GCC_ATOMIC_INT_LOCK_FREE 2
+#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
+#define __GCC_ATOMIC_LONG_LOCK_FREE 2
+#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
+#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+#define __GNUC_GNU_INLINE__ 1
+#define __GNUC_MINOR__ 2
+#define __GNUC_PATCHLEVEL__ 1
+#define __GNUC__ 4
+#define __GNUG__ 4
+#define __GXX_ABI_VERSION 1002
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
+#define __GXX_RTTI 1
+#define __GXX_WEAK__ 1
+#define __INT16_TYPE__ short
+#define __INT32_TYPE__ int
+#define __INT64_C_SUFFIX__ LL
+#define __INT64_TYPE__ long long int
+#define __INT8_TYPE__ char
+#define __INTMAX_MAX__ 9223372036854775807LL
+#define __INTMAX_TYPE__ long long int
+#define __INTMAX_WIDTH__ 64
+#define __INTPTR_TYPE__ long int
+#define __INTPTR_WIDTH__ 32
+#define __INT_MAX__ 2147483647
+#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L
+#define __LDBL_DIG__ 15
+#define __LDBL_EPSILON__ 2.2204460492503131e-16L
+#define __LDBL_HAS_DENORM__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __LDBL_MANT_DIG__ 53
+#define __LDBL_MAX_10_EXP__ 308
+#define __LDBL_MAX_EXP__ 1024
+#define __LDBL_MAX__ 1.7976931348623157e+308L
+#define __LDBL_MIN_10_EXP__ (-307)
+#define __LDBL_MIN_EXP__ (-1021)
+#define __LDBL_MIN__ 2.2250738585072014e-308L
+#define __LITTLE_ENDIAN__ 1
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#define __LONG_MAX__ 2147483647L
+#define __NO_INLINE__ 1
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __PIC__ 1
+#define __POINTER_WIDTH__ 32
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __PTRDIFF_TYPE__ int
+#define __PTRDIFF_WIDTH__ 32
+#define __REGISTER_PREFIX__
+#define __SCHAR_MAX__ 127
+#define __SHRT_MAX__ 32767
+#define __SIG_ATOMIC_WIDTH__ 32
+#define __SIZEOF_DOUBLE__ 8
+#define __SIZEOF_FLOAT__ 4
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_LONG_DOUBLE__ 8
+#define __SIZEOF_LONG_LONG__ 8
+#define __SIZEOF_LONG__ 4
+#define __SIZEOF_POINTER__ 4
+#define __SIZEOF_PTRDIFF_T__ 4
+#define __SIZEOF_SHORT__ 2
+#define __SIZEOF_SIZE_T__ 4
+#define __SIZEOF_WCHAR_T__ 4
+#define __SIZEOF_WINT_T__ 4
+#define __SIZE_MAX__ 4294967295U
+#define __SIZE_TYPE__ unsigned int
+#define __SIZE_WIDTH__ 32
+#define __SSP__ 1
+#define __STDC_HOSTED__ 1
+#define __STDC_UTF_16__ 1
+#define __STDC_UTF_32__ 1
+#define __STDC__ 1
+#define __STRICT_ANSI__ 1
+#define __THUMB_INTERWORK__ 1
+#define __UINTMAX_TYPE__ long long unsigned int
+#define __USER_LABEL_PREFIX__
+#define __VERSION__ "4.2.1 Compatible Clang 3.4 (https://bitbucket.org/loganchien/clang c34bb12af3af42f671296cdb978b34b931062d2a) (https://bitbucket.org/loganchien/llvm d09f2eff406d17c86d51db7660bd374cf092e6ed)"
+#define __VFP_FP__ 1
+#define __WCHAR_MAX__ 4294967295U
+#define __WCHAR_TYPE__ unsigned int
+#define __WCHAR_UNSIGNED__ 1
+#define __WCHAR_WIDTH__ 32
+#define __WINT_TYPE__ unsigned int
+#define __WINT_UNSIGNED__ 1
+#define __WINT_WIDTH__ 32
+#define __arm 1
+#define __arm__ 1
+#define __clang__ 1
+#define __clang_major__ 3
+#define __clang_minor__ 4
+#define __clang_patchlevel__ 0
+#define __clang_version__ "3.4 (https://bitbucket.org/loganchien/clang c34bb12af3af42f671296cdb978b34b931062d2a) (https://bitbucket.org/loganchien/llvm d09f2eff406d17c86d51db7660bd374cf092e6ed)"
+#define __cplusplus 201103L
+#define __cpp_attributes 200809
+#define __cpp_constexpr 200704
+#define __cpp_decltype 200707
+#define __cpp_lambdas 200907
+#define __cpp_raw_strings 200710
+#define __cpp_rvalue_references 200610
+#define __cpp_static_assert 200410
+#define __cpp_unicode_characters 200704
+#define __cpp_unicode_literals 200710
+#define __cpp_user_defined_literals 200809
+#define __cpp_variadic_templates 200704
+#define __gnu_linux__ 1
+#define __linux 1
+#define __linux__ 1
+#define __llvm__ 1
+#define __pic__ 1
+#define __private_extern__ extern
+#define __unix 1
+#define __unix__ 1
+#define ANDROID
+#endif
+
+// --- Include directories begin --- //
+//C:/Android/ndk/platforms/android-3/arch-arm/usr/include
+//C:/Users/eayusov/Documents/Sandbox/Common/Android/jni/../../include
+//C:\Android\ndk\toolchains\llvm-3.4\prebuilt\windows\bin\..\lib\clang\3.4\include
+// --- Library directories end --- //
+
+
+// --- Library directories begin --- //
+// --- Library directories begin --- //
+
diff --git a/Common/Android/gcc_Release.h b/Common/Android/gcc_Release.h
new file mode 100644
index 00000000..6ca2abab
--- /dev/null
+++ b/Common/Android/gcc_Release.h
@@ -0,0 +1,380 @@
+/*
+ This file is only used by IntelliSense (VisualStudio code suggestion system)
+ DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES.
+ This file lists the preprocessor macros extracted from your GCC.
+ It is needed for IntelliSense to parse other header files correctly.
+*/
+#ifdef _MSC_VER
+#define __DBL_MIN_EXP__ (-1021)
+#define __HQ_FBIT__ 15
+#define __UINT_LEAST16_MAX__ 65535
+#define __ARM_SIZEOF_WCHAR_T 32
+#define __ATOMIC_ACQUIRE 2
+#define __SFRACT_IBIT__ 0
+#define __FLT_MIN__ 1.1754943508222875e-38F
+#define __UFRACT_MAX__ 0XFFFFP-16UR
+#define __UINT_LEAST8_TYPE__ unsigned char
+#define __DQ_FBIT__ 63
+#define __ARM_FEATURE_SAT 1
+#define __ULFRACT_FBIT__ 32
+#define __SACCUM_EPSILON__ 0x1P-7HK
+#define __CHAR_BIT__ 8
+#define __USQ_IBIT__ 0
+#define __UINT8_MAX__ 255
+#define __ACCUM_FBIT__ 15
+#define __ANDROID__ 1
+#define __WINT_MAX__ 4294967295U
+#define __USFRACT_FBIT__ 8
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __SIZE_MAX__ 4294967295U
+#define __ARM_ARCH_ISA_ARM 1
+#define __WCHAR_MAX__ 4294967295U
+#define __LACCUM_IBIT__ 32
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+#define __DBL_DENORM_MIN__ double(4.9406564584124654e-324L)
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
+#define __FLT_EVAL_METHOD__ 0
+#define __unix__ 1
+#define __LLACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LLK
+#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __FRACT_FBIT__ 15
+#define __UINT_FAST64_MAX__ 18446744073709551615ULL
+#define __SIG_ATOMIC_TYPE__ int
+#define __UACCUM_FBIT__ 16
+#define __DBL_MIN_10_EXP__ (-307)
+#define __FINITE_MATH_ONLY__ 0
+#define __ARMEL__ 1
+#define __ARM_FEATURE_UNALIGNED 1
+#define __LFRACT_IBIT__ 0
+#define __GNUC_PATCHLEVEL__ 0
+#define __LFRACT_MAX__ 0X7FFFFFFFP-31LR
+#define __UINT_FAST8_MAX__ 255
+#define __DEC64_MAX_EXP__ 385
+#define __UINT_LEAST64_MAX__ 18446744073709551615ULL
+#define __SA_FBIT__ 15
+#define __SHRT_MAX__ 32767
+#define __LDBL_MAX__ 1.7976931348623157e+308L
+#define __FRACT_MAX__ 0X7FFFP-15R
+#define __UFRACT_FBIT__ 16
+#define __ARM_FP 12
+#define __UFRACT_MIN__ 0.0UR
+#define __UINT_LEAST8_MAX__ 255
+#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
+#define __UINTMAX_TYPE__ long long unsigned int
+#define __LLFRACT_EPSILON__ 0x1P-63LLR
+#define __linux 1
+#define __DEC32_EPSILON__ 1E-6DF
+#define __CHAR_UNSIGNED__ 1
+#define __UINT32_MAX__ 4294967295U
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
+#define __ULFRACT_MAX__ 0XFFFFFFFFP-32ULR
+#define __TA_IBIT__ 64
+#define __LDBL_MAX_EXP__ 1024
+#define __WINT_MIN__ 0U
+#define __linux__ 1
+#define __ULLFRACT_MIN__ 0.0ULLR
+#define __SCHAR_MAX__ 127
+#define __WCHAR_MIN__ 0U
+#define __DBL_DIG__ 15
+#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
+#define __LLACCUM_MIN__ (-0X1P31LLK-0X1P31LLK)
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_POINTER__ 4
+#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __USACCUM_IBIT__ 8
+#define __USER_LABEL_PREFIX__
+#define __STDC_HOSTED__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LFRACT_MIN__ (-0.5LR-0.5LR)
+#define __HA_IBIT__ 8
+#define __ARM_NEON_FP 4
+#define __TQ_IBIT__ 0
+#define __FLT_EPSILON__ 1.1920928955078125e-7F
+#define __APCS_32__ 1
+#define __GXX_WEAK__ 1
+#define __USFRACT_IBIT__ 0
+#define __LDBL_MIN__ 2.2250738585072014e-308L
+#define __FRACT_MIN__ (-0.5R-0.5R)
+#define __DEC32_MAX__ 9.999999E96DF
+#define __DA_IBIT__ 32
+#define __ARM_SIZEOF_MINIMAL_ENUM 4
+#define __INT32_MAX__ 2147483647
+#define __UQQ_FBIT__ 8
+#define __SIZEOF_LONG__ 4
+#define __UACCUM_MAX__ 0XFFFFFFFFP-16UK
+#define __DECIMAL_DIG__ 17
+#define __LFRACT_EPSILON__ 0x1P-31LR
+#define __ULFRACT_MIN__ 0.0ULR
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __ULACCUM_IBIT__ 32
+#define __UACCUM_EPSILON__ 0x1P-16UK
+#define __GNUC__ 4
+#define __ULLACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULLK
+#define __GXX_RTTI 1
+#define __HQ_IBIT__ 0
+#define __FLT_HAS_DENORM__ 1
+#define __SIZEOF_LONG_DOUBLE__ 8
+#define __BIGGEST_ALIGNMENT__ 8
+#define __GNUC_STDC_INLINE__ 1
+#define __DQ_IBIT__ 0
+#define __DBL_MAX__ double(1.7976931348623157e+308L)
+#define __ULFRACT_IBIT__ 0
+#define __INT_FAST32_MAX__ 2147483647
+#define __DBL_HAS_INFINITY__ 1
+#define __INT64_MAX__ 9223372036854775807LL
+#define __ACCUM_IBIT__ 16
+#define __DEC32_MIN_EXP__ (-94)
+#define __THUMB_INTERWORK__ 1
+#define __LACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LK
+#define __INT_FAST16_TYPE__ int
+#define __STRICT_ANSI__ 1
+#define __LDBL_HAS_DENORM__ 1
+#define __ARM_FEATURE_LDREX 15
+#define __cplusplus 201103L
+#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
+#define __INT_LEAST32_MAX__ 2147483647
+#define __ARM_PCS 1
+#define __DEC32_MIN__ 1E-95DF
+#define __ACCUM_MAX__ 0X7FFFFFFFP-15K
+#define __DEPRECATED 1
+#define __DBL_MAX_EXP__ 1024
+#define __USACCUM_EPSILON__ 0x1P-8UHK
+#define __DEC128_EPSILON__ 1E-33DL
+#define __SFRACT_MAX__ 0X7FP-7HR
+#define __FRACT_IBIT__ 0
+#define __PTRDIFF_MAX__ 2147483647
+#define __UACCUM_MIN__ 0.0UK
+#define __UACCUM_IBIT__ 16
+#define __GNUG__ 4
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#define __SIZEOF_SIZE_T__ 4
+#define __ULACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULK
+#define __SIZEOF_WINT_T__ 4
+#define __SA_IBIT__ 16
+#define __ULLACCUM_MIN__ 0.0ULLK
+#define __GXX_ABI_VERSION 1002
+#define __UTA_FBIT__ 64
+#define __FLT_MIN_EXP__ (-125)
+#define __USFRACT_MAX__ 0XFFP-8UHR
+#define __UFRACT_IBIT__ 0
+#define __ARM_FEATURE_QBIT 1
+#define __INT_FAST64_TYPE__ long long int
+#define __DBL_MIN__ double(2.2250738585072014e-308L)
+#define __FLT_MIN_10_EXP__ (-37)
+#define __LACCUM_MIN__ (-0X1P31LK-0X1P31LK)
+#define __ULLACCUM_FBIT__ 32
+#define __GXX_TYPEINFO_EQUALITY_INLINE 0
+#define __ULLFRACT_EPSILON__ 0x1P-64ULLR
+#define __DEC128_MIN__ 1E-6143DL
+#define __REGISTER_PREFIX__
+#define __UINT16_MAX__ 65535
+#define __DBL_HAS_DENORM__ 1
+#define __ACCUM_MIN__ (-0X1P15K-0X1P15K)
+#define __SQ_IBIT__ 0
+#define __UINT8_TYPE__ unsigned char
+#define __UHA_FBIT__ 8
+#define __NO_INLINE__ 1
+#define __SFRACT_MIN__ (-0.5HR-0.5HR)
+#define __UTQ_FBIT__ 128
+#define __FLT_MANT_DIG__ 24
+#define __VERSION__ "4.8"
+#define __ULLFRACT_FBIT__ 64
+#define __FRACT_EPSILON__ 0x1P-15R
+#define __ULACCUM_MIN__ 0.0ULK
+#define __UDA_FBIT__ 32
+#define __LLACCUM_EPSILON__ 0x1P-31LLK
+#define __GCC_ATOMIC_INT_LOCK_FREE 2
+#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __USFRACT_MIN__ 0.0UHR
+#define __ULLACCUM_IBIT__ 32
+#define __UQQ_IBIT__ 0
+#define __DEC64_EPSILON__ 1E-15DD
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __DEC128_MIN_EXP__ (-6142)
+#define __UHQ_FBIT__ 16
+#define __LLACCUM_FBIT__ 31
+#define __INT_FAST32_TYPE__ int
+#define __UINT_LEAST16_TYPE__ short unsigned int
+#define __INT16_MAX__ 32767
+#define __SIZE_TYPE__ unsigned int
+#define __UINT64_MAX__ 18446744073709551615ULL
+#define __UDQ_FBIT__ 64
+#define __INT8_TYPE__ signed char
+#define __ELF__ 1
+#define __ULFRACT_EPSILON__ 0x1P-32ULR
+#define __LLFRACT_FBIT__ 63
+#define __FLT_RADIX__ 2
+#define __INT_LEAST16_TYPE__ short int
+#define __ARM_ARCH_PROFILE 65
+#define __LDBL_EPSILON__ 2.2204460492503131e-16L
+#define __SACCUM_MAX__ 0X7FFFP-7HK
+#define __SIG_ATOMIC_MAX__ 2147483647
+#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __VFP_FP__ 1
+#define __SIZEOF_PTRDIFF_T__ 4
+#define __LACCUM_EPSILON__ 0x1P-31LK
+#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
+#define __INT_FAST16_MAX__ 2147483647
+#define __UINT_FAST32_MAX__ 4294967295U
+#define __UINT_LEAST64_TYPE__ long long unsigned int
+#define __USACCUM_MAX__ 0XFFFFP-8UHK
+#define __SFRACT_EPSILON__ 0x1P-7HR
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MAX_10_EXP__ 38
+#define __LONG_MAX__ 2147483647L
+#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
+#define __FLT_HAS_INFINITY__ 1
+#define __unix 1
+#define __USA_FBIT__ 16
+#define __UINT_FAST16_TYPE__ unsigned int
+#define __DEC64_MAX__ 9.999999999999999E384DD
+#define __CHAR16_TYPE__ short unsigned int
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __INT_LEAST16_MAX__ 32767
+#define __DEC64_MANT_DIG__ 16
+#define __UINT_LEAST32_MAX__ 4294967295U
+#define __SACCUM_FBIT__ 7
+#define __GCC_ATOMIC_LONG_LOCK_FREE 2
+#define __INT_LEAST64_TYPE__ long long int
+#define __ARM_FEATURE_CLZ 1
+#define __INT16_TYPE__ short int
+#define __INT_LEAST8_TYPE__ signed char
+#define __SQ_FBIT__ 31
+#define __DEC32_MAX_EXP__ 97
+#define __ARM_ARCH_ISA_THUMB 2
+#define __INT_FAST8_MAX__ 127
+#define __ARM_ARCH 7
+#define __INTPTR_MAX__ 2147483647
+#define __QQ_FBIT__ 7
+#define __UTA_IBIT__ 64
+#define __EXCEPTIONS 1
+#define __LDBL_MANT_DIG__ 53
+#define __SFRACT_FBIT__ 7
+#define __SACCUM_MIN__ (-0X1P7HK-0X1P7HK)
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
+#define __INTPTR_TYPE__ int
+#define __UINT16_TYPE__ short unsigned int
+#define __WCHAR_TYPE__ unsigned int
+#define __SIZEOF_FLOAT__ 4
+#define __USQ_FBIT__ 32
+#define __pic__ 1
+#define __UINTPTR_MAX__ 4294967295U
+#define __DEC64_MIN_EXP__ (-382)
+#define __INT_FAST64_MAX__ 9223372036854775807LL
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __FLT_DIG__ 6
+#define __UINT_FAST64_TYPE__ long long unsigned int
+#define __INT_MAX__ 2147483647
+#define __LACCUM_FBIT__ 31
+#define __USACCUM_MIN__ 0.0UHK
+#define __UHA_IBIT__ 8
+#define __INT64_TYPE__ long long int
+#define __FLT_MAX_EXP__ 128
+#define __UTQ_IBIT__ 0
+#define __DBL_MANT_DIG__ 53
+#define __INT_LEAST64_MAX__ 9223372036854775807LL
+#define __DEC64_MIN__ 1E-383DD
+#define __WINT_TYPE__ unsigned int
+#define __UINT_LEAST32_TYPE__ unsigned int
+#define __SIZEOF_SHORT__ 2
+#define __ULLFRACT_IBIT__ 0
+#define __LDBL_MIN_EXP__ (-1021)
+#define __arm__ 1
+#define __UDA_IBIT__ 32
+#define __INT_LEAST8_MAX__ 127
+#define __SSP__ 1
+#define __LFRACT_FBIT__ 31
+#define __WCHAR_UNSIGNED__ 1
+#define __ARM_ARCH_7A__ 1
+#define __LDBL_MAX_10_EXP__ 308
+#define __ATOMIC_RELAXED 0
+#define __DBL_EPSILON__ double(2.2204460492503131e-16L)
+#define __ARM_FEATURE_SIMD32 1
+#define __INT_LEAST32_TYPE__ int
+#define __SIZEOF_WCHAR_T__ 4
+#define __UINT64_TYPE__ long long unsigned int
+#define __LLFRACT_MAX__ 0X7FFFFFFFFFFFFFFFP-63LLR
+#define __TQ_FBIT__ 127
+#define __INT_FAST8_TYPE__ signed char
+#define __ULLACCUM_EPSILON__ 0x1P-32ULLK
+#define __UHQ_IBIT__ 0
+#define __LLACCUM_IBIT__ 32
+#define __DBL_DECIMAL_DIG__ 17
+#define __DEC_EVAL_METHOD__ 2
+#define __TA_FBIT__ 63
+#define __UDQ_IBIT__ 0
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __ACCUM_EPSILON__ 0x1P-15K
+#define __INTMAX_MAX__ 9223372036854775807LL
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F
+#define __LLFRACT_IBIT__ 0
+#define __INT8_MAX__ 127
+#define __PIC__ 1
+#define __UINT_FAST32_TYPE__ unsigned int
+#define __CHAR32_TYPE__ unsigned int
+#define __FLT_MAX__ 3.4028234663852886e+38F
+#define __USACCUM_FBIT__ 8
+#define __INT32_TYPE__ int
+#define __SIZEOF_DOUBLE__ 8
+#define __UFRACT_EPSILON__ 0x1P-16UR
+#define __INTMAX_TYPE__ long long int
+#define __DEC128_MAX_EXP__ 6145
+#define __ATOMIC_CONSUME 1
+#define __GNUC_MINOR__ 8
+#define __UINTMAX_MAX__ 18446744073709551615ULL
+#define __DEC32_MANT_DIG__ 7
+#define __HA_FBIT__ 7
+#define __DBL_MAX_10_EXP__ 308
+#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L
+#define __STDC__ 1
+#define __PTRDIFF_TYPE__ int
+#define __LLFRACT_MIN__ (-0.5LLR-0.5LLR)
+#define __ATOMIC_SEQ_CST 5
+#define __DA_FBIT__ 31
+#define __UINT32_TYPE__ unsigned int
+#define __UINTPTR_TYPE__ unsigned int
+#define __USA_IBIT__ 16
+#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
+#define __ARM_EABI__ 1
+#define __DEC128_MANT_DIG__ 34
+#define __LDBL_MIN_10_EXP__ (-307)
+#define __SIZEOF_LONG_LONG__ 8
+#define __ULACCUM_EPSILON__ 0x1P-32ULK
+#define __SACCUM_IBIT__ 8
+#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
+#define __LDBL_DIG__ 15
+#define __FLT_DECIMAL_DIG__ 9
+#define __UINT_FAST16_MAX__ 4294967295U
+#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
+#define __ULLFRACT_MAX__ 0XFFFFFFFFFFFFFFFFP-64ULLR
+#define __UINT_FAST8_TYPE__ unsigned char
+#define _GNU_SOURCE 1
+#define __USFRACT_EPSILON__ 0x1P-8UHR
+#define __ULACCUM_FBIT__ 32
+#define __ARM_FEATURE_DSP 1
+#define __QQ_IBIT__ 0
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_RELEASE 3
+#define ANDROID
+#endif
+
+// --- Include directories begin --- //
+//C:/Android/ndk/platforms/android-3/arch-arm/usr/include
+//C:\Android\ndk\toolchains\arm-linux-androideabi-4.8\prebuilt\windows\bin\../lib/gcc/arm-linux-androideabi/4.8/include
+//C:\Android\ndk\toolchains\arm-linux-androideabi-4.8\prebuilt\windows\bin\../lib/gcc/arm-linux-androideabi/4.8/include-fixed
+// --- Library directories end --- //
+
+
+// --- Library directories begin --- //
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/armv7-a/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/lib/armv7-a/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/lib/
+// --- Library directories begin --- //
+
diff --git a/Common/build/Windows/Android/gcc_Debug.h b/Common/build/Windows/Android/gcc_Debug.h
new file mode 100644
index 00000000..b46f53e0
--- /dev/null
+++ b/Common/build/Windows/Android/gcc_Debug.h
@@ -0,0 +1,199 @@
+/*
+ This file is only used by IntelliSense (VisualStudio code suggestion system)
+ DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES.
+ This file lists the preprocessor macros extracted from your GCC.
+ It is needed for IntelliSense to parse other header files correctly.
+*/
+#ifdef _MSC_VER
+#define _GNU_SOURCE 1
+#define __ANDROID__ 1
+#define __APCS_32__ 1
+#define __ARMEL__ 1
+#define __ARM_ARCH 7
+#define __ARM_ARCH_7A__ 1
+#define __ARM_ARCH_PROFILE A
+#define __ARM_EABI__ 1
+#define __ARM_PCS 1
+#define __ARM_VFPV3__ 1
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_SEQ_CST 5
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __CHAR16_TYPE__ unsigned short
+#define __CHAR32_TYPE__ unsigned int
+#define __CHAR_BIT__ 8
+#define __CHAR_UNSIGNED__ 1
+#define __CONSTANT_CFSTRINGS__ 1
+#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
+#define __DBL_DIG__ 15
+#define __DBL_EPSILON__ 2.2204460492503131e-16
+#define __DBL_HAS_DENORM__ 1
+#define __DBL_HAS_INFINITY__ 1
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __DBL_MANT_DIG__ 53
+#define __DBL_MAX_10_EXP__ 308
+#define __DBL_MAX_EXP__ 1024
+#define __DBL_MAX__ 1.7976931348623157e+308
+#define __DBL_MIN_10_EXP__ (-307)
+#define __DBL_MIN_EXP__ (-1021)
+#define __DBL_MIN__ 2.2250738585072014e-308
+#define __DECIMAL_DIG__ 17
+#define __DEPRECATED 1
+#define __ELF__ 1
+#define __EXCEPTIONS 1
+#define __FINITE_MATH_ONLY__ 0
+#define __FLT_DENORM_MIN__ 1.40129846e-45F
+#define __FLT_DIG__ 6
+#define __FLT_EPSILON__ 1.19209290e-7F
+#define __FLT_EVAL_METHOD__ 0
+#define __FLT_HAS_DENORM__ 1
+#define __FLT_HAS_INFINITY__ 1
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MANT_DIG__ 24
+#define __FLT_MAX_10_EXP__ 38
+#define __FLT_MAX_EXP__ 128
+#define __FLT_MAX__ 3.40282347e+38F
+#define __FLT_MIN_10_EXP__ (-37)
+#define __FLT_MIN_EXP__ (-125)
+#define __FLT_MIN__ 1.17549435e-38F
+#define __FLT_RADIX__ 2
+#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
+#define __GCC_ATOMIC_INT_LOCK_FREE 2
+#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
+#define __GCC_ATOMIC_LONG_LOCK_FREE 2
+#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
+#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+#define __GNUC_GNU_INLINE__ 1
+#define __GNUC_MINOR__ 2
+#define __GNUC_PATCHLEVEL__ 1
+#define __GNUC__ 4
+#define __GNUG__ 4
+#define __GXX_ABI_VERSION 1002
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
+#define __GXX_RTTI 1
+#define __GXX_WEAK__ 1
+#define __INT16_TYPE__ short
+#define __INT32_TYPE__ int
+#define __INT64_C_SUFFIX__ LL
+#define __INT64_TYPE__ long long int
+#define __INT8_TYPE__ char
+#define __INTMAX_MAX__ 9223372036854775807LL
+#define __INTMAX_TYPE__ long long int
+#define __INTMAX_WIDTH__ 64
+#define __INTPTR_TYPE__ long int
+#define __INTPTR_WIDTH__ 32
+#define __INT_MAX__ 2147483647
+#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L
+#define __LDBL_DIG__ 15
+#define __LDBL_EPSILON__ 2.2204460492503131e-16L
+#define __LDBL_HAS_DENORM__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __LDBL_MANT_DIG__ 53
+#define __LDBL_MAX_10_EXP__ 308
+#define __LDBL_MAX_EXP__ 1024
+#define __LDBL_MAX__ 1.7976931348623157e+308L
+#define __LDBL_MIN_10_EXP__ (-307)
+#define __LDBL_MIN_EXP__ (-1021)
+#define __LDBL_MIN__ 2.2250738585072014e-308L
+#define __LITTLE_ENDIAN__ 1
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#define __LONG_MAX__ 2147483647L
+#define __NO_INLINE__ 1
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __PIC__ 1
+#define __POINTER_WIDTH__ 32
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __PTRDIFF_TYPE__ int
+#define __PTRDIFF_WIDTH__ 32
+#define __REGISTER_PREFIX__
+#define __SCHAR_MAX__ 127
+#define __SHRT_MAX__ 32767
+#define __SIG_ATOMIC_WIDTH__ 32
+#define __SIZEOF_DOUBLE__ 8
+#define __SIZEOF_FLOAT__ 4
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_LONG_DOUBLE__ 8
+#define __SIZEOF_LONG_LONG__ 8
+#define __SIZEOF_LONG__ 4
+#define __SIZEOF_POINTER__ 4
+#define __SIZEOF_PTRDIFF_T__ 4
+#define __SIZEOF_SHORT__ 2
+#define __SIZEOF_SIZE_T__ 4
+#define __SIZEOF_WCHAR_T__ 4
+#define __SIZEOF_WINT_T__ 4
+#define __SIZE_MAX__ 4294967295U
+#define __SIZE_TYPE__ unsigned int
+#define __SIZE_WIDTH__ 32
+#define __SSP__ 1
+#define __STDC_HOSTED__ 1
+#define __STDC_UTF_16__ 1
+#define __STDC_UTF_32__ 1
+#define __STDC__ 1
+#define __STRICT_ANSI__ 1
+#define __THUMB_INTERWORK__ 1
+#define __UINTMAX_TYPE__ long long unsigned int
+#define __USER_LABEL_PREFIX__
+#define __VERSION__ "4.2.1 Compatible Clang 3.4 (https://bitbucket.org/loganchien/clang c34bb12af3af42f671296cdb978b34b931062d2a) (https://bitbucket.org/loganchien/llvm d09f2eff406d17c86d51db7660bd374cf092e6ed)"
+#define __VFP_FP__ 1
+#define __WCHAR_MAX__ 4294967295U
+#define __WCHAR_TYPE__ unsigned int
+#define __WCHAR_UNSIGNED__ 1
+#define __WCHAR_WIDTH__ 32
+#define __WINT_TYPE__ unsigned int
+#define __WINT_UNSIGNED__ 1
+#define __WINT_WIDTH__ 32
+#define __arm 1
+#define __arm__ 1
+#define __clang__ 1
+#define __clang_major__ 3
+#define __clang_minor__ 4
+#define __clang_patchlevel__ 0
+#define __clang_version__ "3.4 (https://bitbucket.org/loganchien/clang c34bb12af3af42f671296cdb978b34b931062d2a) (https://bitbucket.org/loganchien/llvm d09f2eff406d17c86d51db7660bd374cf092e6ed)"
+#define __cplusplus 201103L
+#define __cpp_attributes 200809
+#define __cpp_constexpr 200704
+#define __cpp_decltype 200707
+#define __cpp_lambdas 200907
+#define __cpp_raw_strings 200710
+#define __cpp_rvalue_references 200610
+#define __cpp_static_assert 200410
+#define __cpp_unicode_characters 200704
+#define __cpp_unicode_literals 200710
+#define __cpp_user_defined_literals 200809
+#define __cpp_variadic_templates 200704
+#define __gnu_linux__ 1
+#define __linux 1
+#define __linux__ 1
+#define __llvm__ 1
+#define __pic__ 1
+#define __private_extern__ extern
+#define __unix 1
+#define __unix__ 1
+#define ANDROID
+#endif
+
+// --- Include directories begin --- //
+//C:/Android/ndk/platforms/android-3/arch-arm/usr/include
+//C:/Users/eayusov/Documents/Sandbox/Common/Android/jni/../../include
+//C:\Android\ndk\toolchains\llvm-3.4\prebuilt\windows\bin\..\lib\clang\3.4\include
+// --- Library directories end --- //
+
+
+// --- Library directories begin --- //
+// --- Library directories begin --- //
+
diff --git a/Common/build/Windows/Android/gcc_Release.h b/Common/build/Windows/Android/gcc_Release.h
new file mode 100644
index 00000000..6ca2abab
--- /dev/null
+++ b/Common/build/Windows/Android/gcc_Release.h
@@ -0,0 +1,380 @@
+/*
+ This file is only used by IntelliSense (VisualStudio code suggestion system)
+ DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES.
+ This file lists the preprocessor macros extracted from your GCC.
+ It is needed for IntelliSense to parse other header files correctly.
+*/
+#ifdef _MSC_VER
+#define __DBL_MIN_EXP__ (-1021)
+#define __HQ_FBIT__ 15
+#define __UINT_LEAST16_MAX__ 65535
+#define __ARM_SIZEOF_WCHAR_T 32
+#define __ATOMIC_ACQUIRE 2
+#define __SFRACT_IBIT__ 0
+#define __FLT_MIN__ 1.1754943508222875e-38F
+#define __UFRACT_MAX__ 0XFFFFP-16UR
+#define __UINT_LEAST8_TYPE__ unsigned char
+#define __DQ_FBIT__ 63
+#define __ARM_FEATURE_SAT 1
+#define __ULFRACT_FBIT__ 32
+#define __SACCUM_EPSILON__ 0x1P-7HK
+#define __CHAR_BIT__ 8
+#define __USQ_IBIT__ 0
+#define __UINT8_MAX__ 255
+#define __ACCUM_FBIT__ 15
+#define __ANDROID__ 1
+#define __WINT_MAX__ 4294967295U
+#define __USFRACT_FBIT__ 8
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __SIZE_MAX__ 4294967295U
+#define __ARM_ARCH_ISA_ARM 1
+#define __WCHAR_MAX__ 4294967295U
+#define __LACCUM_IBIT__ 32
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+#define __DBL_DENORM_MIN__ double(4.9406564584124654e-324L)
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
+#define __FLT_EVAL_METHOD__ 0
+#define __unix__ 1
+#define __LLACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LLK
+#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __FRACT_FBIT__ 15
+#define __UINT_FAST64_MAX__ 18446744073709551615ULL
+#define __SIG_ATOMIC_TYPE__ int
+#define __UACCUM_FBIT__ 16
+#define __DBL_MIN_10_EXP__ (-307)
+#define __FINITE_MATH_ONLY__ 0
+#define __ARMEL__ 1
+#define __ARM_FEATURE_UNALIGNED 1
+#define __LFRACT_IBIT__ 0
+#define __GNUC_PATCHLEVEL__ 0
+#define __LFRACT_MAX__ 0X7FFFFFFFP-31LR
+#define __UINT_FAST8_MAX__ 255
+#define __DEC64_MAX_EXP__ 385
+#define __UINT_LEAST64_MAX__ 18446744073709551615ULL
+#define __SA_FBIT__ 15
+#define __SHRT_MAX__ 32767
+#define __LDBL_MAX__ 1.7976931348623157e+308L
+#define __FRACT_MAX__ 0X7FFFP-15R
+#define __UFRACT_FBIT__ 16
+#define __ARM_FP 12
+#define __UFRACT_MIN__ 0.0UR
+#define __UINT_LEAST8_MAX__ 255
+#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
+#define __UINTMAX_TYPE__ long long unsigned int
+#define __LLFRACT_EPSILON__ 0x1P-63LLR
+#define __linux 1
+#define __DEC32_EPSILON__ 1E-6DF
+#define __CHAR_UNSIGNED__ 1
+#define __UINT32_MAX__ 4294967295U
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
+#define __ULFRACT_MAX__ 0XFFFFFFFFP-32ULR
+#define __TA_IBIT__ 64
+#define __LDBL_MAX_EXP__ 1024
+#define __WINT_MIN__ 0U
+#define __linux__ 1
+#define __ULLFRACT_MIN__ 0.0ULLR
+#define __SCHAR_MAX__ 127
+#define __WCHAR_MIN__ 0U
+#define __DBL_DIG__ 15
+#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
+#define __LLACCUM_MIN__ (-0X1P31LLK-0X1P31LLK)
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_POINTER__ 4
+#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __USACCUM_IBIT__ 8
+#define __USER_LABEL_PREFIX__
+#define __STDC_HOSTED__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LFRACT_MIN__ (-0.5LR-0.5LR)
+#define __HA_IBIT__ 8
+#define __ARM_NEON_FP 4
+#define __TQ_IBIT__ 0
+#define __FLT_EPSILON__ 1.1920928955078125e-7F
+#define __APCS_32__ 1
+#define __GXX_WEAK__ 1
+#define __USFRACT_IBIT__ 0
+#define __LDBL_MIN__ 2.2250738585072014e-308L
+#define __FRACT_MIN__ (-0.5R-0.5R)
+#define __DEC32_MAX__ 9.999999E96DF
+#define __DA_IBIT__ 32
+#define __ARM_SIZEOF_MINIMAL_ENUM 4
+#define __INT32_MAX__ 2147483647
+#define __UQQ_FBIT__ 8
+#define __SIZEOF_LONG__ 4
+#define __UACCUM_MAX__ 0XFFFFFFFFP-16UK
+#define __DECIMAL_DIG__ 17
+#define __LFRACT_EPSILON__ 0x1P-31LR
+#define __ULFRACT_MIN__ 0.0ULR
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __ULACCUM_IBIT__ 32
+#define __UACCUM_EPSILON__ 0x1P-16UK
+#define __GNUC__ 4
+#define __ULLACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULLK
+#define __GXX_RTTI 1
+#define __HQ_IBIT__ 0
+#define __FLT_HAS_DENORM__ 1
+#define __SIZEOF_LONG_DOUBLE__ 8
+#define __BIGGEST_ALIGNMENT__ 8
+#define __GNUC_STDC_INLINE__ 1
+#define __DQ_IBIT__ 0
+#define __DBL_MAX__ double(1.7976931348623157e+308L)
+#define __ULFRACT_IBIT__ 0
+#define __INT_FAST32_MAX__ 2147483647
+#define __DBL_HAS_INFINITY__ 1
+#define __INT64_MAX__ 9223372036854775807LL
+#define __ACCUM_IBIT__ 16
+#define __DEC32_MIN_EXP__ (-94)
+#define __THUMB_INTERWORK__ 1
+#define __LACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LK
+#define __INT_FAST16_TYPE__ int
+#define __STRICT_ANSI__ 1
+#define __LDBL_HAS_DENORM__ 1
+#define __ARM_FEATURE_LDREX 15
+#define __cplusplus 201103L
+#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
+#define __INT_LEAST32_MAX__ 2147483647
+#define __ARM_PCS 1
+#define __DEC32_MIN__ 1E-95DF
+#define __ACCUM_MAX__ 0X7FFFFFFFP-15K
+#define __DEPRECATED 1
+#define __DBL_MAX_EXP__ 1024
+#define __USACCUM_EPSILON__ 0x1P-8UHK
+#define __DEC128_EPSILON__ 1E-33DL
+#define __SFRACT_MAX__ 0X7FP-7HR
+#define __FRACT_IBIT__ 0
+#define __PTRDIFF_MAX__ 2147483647
+#define __UACCUM_MIN__ 0.0UK
+#define __UACCUM_IBIT__ 16
+#define __GNUG__ 4
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#define __SIZEOF_SIZE_T__ 4
+#define __ULACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULK
+#define __SIZEOF_WINT_T__ 4
+#define __SA_IBIT__ 16
+#define __ULLACCUM_MIN__ 0.0ULLK
+#define __GXX_ABI_VERSION 1002
+#define __UTA_FBIT__ 64
+#define __FLT_MIN_EXP__ (-125)
+#define __USFRACT_MAX__ 0XFFP-8UHR
+#define __UFRACT_IBIT__ 0
+#define __ARM_FEATURE_QBIT 1
+#define __INT_FAST64_TYPE__ long long int
+#define __DBL_MIN__ double(2.2250738585072014e-308L)
+#define __FLT_MIN_10_EXP__ (-37)
+#define __LACCUM_MIN__ (-0X1P31LK-0X1P31LK)
+#define __ULLACCUM_FBIT__ 32
+#define __GXX_TYPEINFO_EQUALITY_INLINE 0
+#define __ULLFRACT_EPSILON__ 0x1P-64ULLR
+#define __DEC128_MIN__ 1E-6143DL
+#define __REGISTER_PREFIX__
+#define __UINT16_MAX__ 65535
+#define __DBL_HAS_DENORM__ 1
+#define __ACCUM_MIN__ (-0X1P15K-0X1P15K)
+#define __SQ_IBIT__ 0
+#define __UINT8_TYPE__ unsigned char
+#define __UHA_FBIT__ 8
+#define __NO_INLINE__ 1
+#define __SFRACT_MIN__ (-0.5HR-0.5HR)
+#define __UTQ_FBIT__ 128
+#define __FLT_MANT_DIG__ 24
+#define __VERSION__ "4.8"
+#define __ULLFRACT_FBIT__ 64
+#define __FRACT_EPSILON__ 0x1P-15R
+#define __ULACCUM_MIN__ 0.0ULK
+#define __UDA_FBIT__ 32
+#define __LLACCUM_EPSILON__ 0x1P-31LLK
+#define __GCC_ATOMIC_INT_LOCK_FREE 2
+#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __USFRACT_MIN__ 0.0UHR
+#define __ULLACCUM_IBIT__ 32
+#define __UQQ_IBIT__ 0
+#define __DEC64_EPSILON__ 1E-15DD
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __DEC128_MIN_EXP__ (-6142)
+#define __UHQ_FBIT__ 16
+#define __LLACCUM_FBIT__ 31
+#define __INT_FAST32_TYPE__ int
+#define __UINT_LEAST16_TYPE__ short unsigned int
+#define __INT16_MAX__ 32767
+#define __SIZE_TYPE__ unsigned int
+#define __UINT64_MAX__ 18446744073709551615ULL
+#define __UDQ_FBIT__ 64
+#define __INT8_TYPE__ signed char
+#define __ELF__ 1
+#define __ULFRACT_EPSILON__ 0x1P-32ULR
+#define __LLFRACT_FBIT__ 63
+#define __FLT_RADIX__ 2
+#define __INT_LEAST16_TYPE__ short int
+#define __ARM_ARCH_PROFILE 65
+#define __LDBL_EPSILON__ 2.2204460492503131e-16L
+#define __SACCUM_MAX__ 0X7FFFP-7HK
+#define __SIG_ATOMIC_MAX__ 2147483647
+#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __VFP_FP__ 1
+#define __SIZEOF_PTRDIFF_T__ 4
+#define __LACCUM_EPSILON__ 0x1P-31LK
+#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
+#define __INT_FAST16_MAX__ 2147483647
+#define __UINT_FAST32_MAX__ 4294967295U
+#define __UINT_LEAST64_TYPE__ long long unsigned int
+#define __USACCUM_MAX__ 0XFFFFP-8UHK
+#define __SFRACT_EPSILON__ 0x1P-7HR
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MAX_10_EXP__ 38
+#define __LONG_MAX__ 2147483647L
+#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
+#define __FLT_HAS_INFINITY__ 1
+#define __unix 1
+#define __USA_FBIT__ 16
+#define __UINT_FAST16_TYPE__ unsigned int
+#define __DEC64_MAX__ 9.999999999999999E384DD
+#define __CHAR16_TYPE__ short unsigned int
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __INT_LEAST16_MAX__ 32767
+#define __DEC64_MANT_DIG__ 16
+#define __UINT_LEAST32_MAX__ 4294967295U
+#define __SACCUM_FBIT__ 7
+#define __GCC_ATOMIC_LONG_LOCK_FREE 2
+#define __INT_LEAST64_TYPE__ long long int
+#define __ARM_FEATURE_CLZ 1
+#define __INT16_TYPE__ short int
+#define __INT_LEAST8_TYPE__ signed char
+#define __SQ_FBIT__ 31
+#define __DEC32_MAX_EXP__ 97
+#define __ARM_ARCH_ISA_THUMB 2
+#define __INT_FAST8_MAX__ 127
+#define __ARM_ARCH 7
+#define __INTPTR_MAX__ 2147483647
+#define __QQ_FBIT__ 7
+#define __UTA_IBIT__ 64
+#define __EXCEPTIONS 1
+#define __LDBL_MANT_DIG__ 53
+#define __SFRACT_FBIT__ 7
+#define __SACCUM_MIN__ (-0X1P7HK-0X1P7HK)
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
+#define __INTPTR_TYPE__ int
+#define __UINT16_TYPE__ short unsigned int
+#define __WCHAR_TYPE__ unsigned int
+#define __SIZEOF_FLOAT__ 4
+#define __USQ_FBIT__ 32
+#define __pic__ 1
+#define __UINTPTR_MAX__ 4294967295U
+#define __DEC64_MIN_EXP__ (-382)
+#define __INT_FAST64_MAX__ 9223372036854775807LL
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __FLT_DIG__ 6
+#define __UINT_FAST64_TYPE__ long long unsigned int
+#define __INT_MAX__ 2147483647
+#define __LACCUM_FBIT__ 31
+#define __USACCUM_MIN__ 0.0UHK
+#define __UHA_IBIT__ 8
+#define __INT64_TYPE__ long long int
+#define __FLT_MAX_EXP__ 128
+#define __UTQ_IBIT__ 0
+#define __DBL_MANT_DIG__ 53
+#define __INT_LEAST64_MAX__ 9223372036854775807LL
+#define __DEC64_MIN__ 1E-383DD
+#define __WINT_TYPE__ unsigned int
+#define __UINT_LEAST32_TYPE__ unsigned int
+#define __SIZEOF_SHORT__ 2
+#define __ULLFRACT_IBIT__ 0
+#define __LDBL_MIN_EXP__ (-1021)
+#define __arm__ 1
+#define __UDA_IBIT__ 32
+#define __INT_LEAST8_MAX__ 127
+#define __SSP__ 1
+#define __LFRACT_FBIT__ 31
+#define __WCHAR_UNSIGNED__ 1
+#define __ARM_ARCH_7A__ 1
+#define __LDBL_MAX_10_EXP__ 308
+#define __ATOMIC_RELAXED 0
+#define __DBL_EPSILON__ double(2.2204460492503131e-16L)
+#define __ARM_FEATURE_SIMD32 1
+#define __INT_LEAST32_TYPE__ int
+#define __SIZEOF_WCHAR_T__ 4
+#define __UINT64_TYPE__ long long unsigned int
+#define __LLFRACT_MAX__ 0X7FFFFFFFFFFFFFFFP-63LLR
+#define __TQ_FBIT__ 127
+#define __INT_FAST8_TYPE__ signed char
+#define __ULLACCUM_EPSILON__ 0x1P-32ULLK
+#define __UHQ_IBIT__ 0
+#define __LLACCUM_IBIT__ 32
+#define __DBL_DECIMAL_DIG__ 17
+#define __DEC_EVAL_METHOD__ 2
+#define __TA_FBIT__ 63
+#define __UDQ_IBIT__ 0
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __ACCUM_EPSILON__ 0x1P-15K
+#define __INTMAX_MAX__ 9223372036854775807LL
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F
+#define __LLFRACT_IBIT__ 0
+#define __INT8_MAX__ 127
+#define __PIC__ 1
+#define __UINT_FAST32_TYPE__ unsigned int
+#define __CHAR32_TYPE__ unsigned int
+#define __FLT_MAX__ 3.4028234663852886e+38F
+#define __USACCUM_FBIT__ 8
+#define __INT32_TYPE__ int
+#define __SIZEOF_DOUBLE__ 8
+#define __UFRACT_EPSILON__ 0x1P-16UR
+#define __INTMAX_TYPE__ long long int
+#define __DEC128_MAX_EXP__ 6145
+#define __ATOMIC_CONSUME 1
+#define __GNUC_MINOR__ 8
+#define __UINTMAX_MAX__ 18446744073709551615ULL
+#define __DEC32_MANT_DIG__ 7
+#define __HA_FBIT__ 7
+#define __DBL_MAX_10_EXP__ 308
+#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L
+#define __STDC__ 1
+#define __PTRDIFF_TYPE__ int
+#define __LLFRACT_MIN__ (-0.5LLR-0.5LLR)
+#define __ATOMIC_SEQ_CST 5
+#define __DA_FBIT__ 31
+#define __UINT32_TYPE__ unsigned int
+#define __UINTPTR_TYPE__ unsigned int
+#define __USA_IBIT__ 16
+#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
+#define __ARM_EABI__ 1
+#define __DEC128_MANT_DIG__ 34
+#define __LDBL_MIN_10_EXP__ (-307)
+#define __SIZEOF_LONG_LONG__ 8
+#define __ULACCUM_EPSILON__ 0x1P-32ULK
+#define __SACCUM_IBIT__ 8
+#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
+#define __LDBL_DIG__ 15
+#define __FLT_DECIMAL_DIG__ 9
+#define __UINT_FAST16_MAX__ 4294967295U
+#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
+#define __ULLFRACT_MAX__ 0XFFFFFFFFFFFFFFFFP-64ULLR
+#define __UINT_FAST8_TYPE__ unsigned char
+#define _GNU_SOURCE 1
+#define __USFRACT_EPSILON__ 0x1P-8UHR
+#define __ULACCUM_FBIT__ 32
+#define __ARM_FEATURE_DSP 1
+#define __QQ_IBIT__ 0
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_RELEASE 3
+#define ANDROID
+#endif
+
+// --- Include directories begin --- //
+//C:/Android/ndk/platforms/android-3/arch-arm/usr/include
+//C:\Android\ndk\toolchains\arm-linux-androideabi-4.8\prebuilt\windows\bin\../lib/gcc/arm-linux-androideabi/4.8/include
+//C:\Android\ndk\toolchains\arm-linux-androideabi-4.8\prebuilt\windows\bin\../lib/gcc/arm-linux-androideabi/4.8/include-fixed
+// --- Library directories end --- //
+
+
+// --- Library directories begin --- //
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/armv7-a/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/lib/armv7-a/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/
+//C:/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/lib/
+// --- Library directories begin --- //
+
diff --git a/Common/build/Windows/Common-Debug.vgdbsettings b/Common/build/Windows/Common-Debug.vgdbsettings
new file mode 100644
index 00000000..3f5b24b1
--- /dev/null
+++ b/Common/build/Windows/Common-Debug.vgdbsettings
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+<VisualGDBProjectSettings2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <ConfigurationName>Debug</ConfigurationName>
+ <Project xsi:type="com.visualgdb.project.android">
+ <CustomSourceDirectories>
+ <Directories />
+ <PathStyle>MinGWWindowsSlash</PathStyle>
+ </CustomSourceDirectories>
+ <AndroidProjectPath>$(ProjectDir)</AndroidProjectPath>
+ </Project>
+ <Build xsi:type="com.visualgdb.build.android">
+ <AndroidPlatform>android-19</AndroidPlatform>
+ <IsDebugConfiguration>true</IsDebugConfiguration>
+ <JNIOnlyBuild>true</JNIOnlyBuild>
+ <AdditionalDirectoriesToDeleteOnClean>bin;obj</AdditionalDirectoriesToDeleteOnClean>
+ <DeleteANTFilesOnClean>false</DeleteANTFilesOnClean>
+ <DoNotEditAndroidManifest>false</DoNotEditAndroidManifest>
+ <CustomActions />
+ </Build>
+ <Debug xsi:type="com.visualgdb.debug.android">
+ <AdditionalStartupCommands />
+ <AdditionalGDBSettings>
+ <FilterSpuriousStoppedNotifications>false</FilterSpuriousStoppedNotifications>
+ <ForceSingleThreadedMode>false</ForceSingleThreadedMode>
+ <PendingBreakpointsSupported>true</PendingBreakpointsSupported>
+ <DisableChildRanges>false</DisableChildRanges>
+ <UseAppleExtensions>false</UseAppleExtensions>
+ <CanAcceptCommandsWhileRunning>false</CanAcceptCommandsWhileRunning>
+ <MakeLogFile>false</MakeLogFile>
+ <IgnoreModuleEventsWhileStepping>true</IgnoreModuleEventsWhileStepping>
+ <UseRelativePathsOnly>false</UseRelativePathsOnly>
+ <ExitAction>KillApp</ExitAction>
+ <Features>
+ <DisableAutoDetection>false</DisableAutoDetection>
+ <UseFrameParameter>false</UseFrameParameter>
+ <SimpleValuesFlagSupported>false</SimpleValuesFlagSupported>
+ <ListLocalsSupported>false</ListLocalsSupported>
+ <ByteLevelMemoryCommandsAvailable>false</ByteLevelMemoryCommandsAvailable>
+ <ThreadInfoSupported>false</ThreadInfoSupported>
+ <PendingBreakpointsSupported>false</PendingBreakpointsSupported>
+ <SupportTargetCommand>false</SupportTargetCommand>
+ </Features>
+ <DisableDisassembly>false</DisableDisassembly>
+ <ExamineMemoryWithXCommand>false</ExamineMemoryWithXCommand>
+ <StepIntoNewInstanceEntry>main</StepIntoNewInstanceEntry>
+ <ExamineRegistersInRawFormat>true</ExamineRegistersInRawFormat>
+ </AdditionalGDBSettings>
+ <LaunchGDBSettings xsi:type="GDBLaunchParametersAndroid" />
+ <GenerateCtrlBreakInsteadOfCtrlC>false</GenerateCtrlBreakInsteadOfCtrlC>
+ <UseDefaultInstallDir>false</UseDefaultInstallDir>
+ <RemotePort>5039</RemotePort>
+ <LocalPort>5039</LocalPort>
+ <GDBServerStartupTimeout>10000</GDBServerStartupTimeout>
+ <AdditionalGDBServerStartupDelay>0</AdditionalGDBServerStartupDelay>
+ <DoubleSlashWorkaround>false</DoubleSlashWorkaround>
+ <AlreadyRunningDecision>Ask</AlreadyRunningDecision>
+ <ShowLogCat>true</ShowLogCat>
+ <EnableThreadNameWatcher>true</EnableThreadNameWatcher>
+ </Debug>
+ <CustomBuild>
+ <PreBuildActions />
+ <PostBuildActions />
+ <PreCleanActions />
+ <PostCleanActions />
+ </CustomBuild>
+ <CustomDebug>
+ <PreDebugActions />
+ <PostDebugActions />
+ <BreakMode>Default</BreakMode>
+ </CustomDebug>
+ <CustomShortcuts>
+ <Shortcuts />
+ <ShowMessageAfterExecuting>true</ShowMessageAfterExecuting>
+ </CustomShortcuts>
+ <UserDefinedVariables />
+</VisualGDBProjectSettings2> \ No newline at end of file
diff --git a/Common/build/Windows/Common-Release.vgdbsettings b/Common/build/Windows/Common-Release.vgdbsettings
new file mode 100644
index 00000000..669691f2
--- /dev/null
+++ b/Common/build/Windows/Common-Release.vgdbsettings
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+<VisualGDBProjectSettings2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <ConfigurationName>Release</ConfigurationName>
+ <Project xsi:type="com.visualgdb.project.android">
+ <CustomSourceDirectories>
+ <Directories />
+ <PathStyle>MinGWWindowsSlash</PathStyle>
+ </CustomSourceDirectories>
+ <AndroidProjectPath>$(ProjectDir)</AndroidProjectPath>
+ </Project>
+ <Build xsi:type="com.visualgdb.build.android">
+ <AndroidPlatform>android-19</AndroidPlatform>
+ <IsDebugConfiguration>false</IsDebugConfiguration>
+ <JNIOnlyBuild>true</JNIOnlyBuild>
+ <AdditionalDirectoriesToDeleteOnClean>bin;obj</AdditionalDirectoriesToDeleteOnClean>
+ <DeleteANTFilesOnClean>false</DeleteANTFilesOnClean>
+ <DoNotEditAndroidManifest>false</DoNotEditAndroidManifest>
+ <CustomActions />
+ </Build>
+ <Debug xsi:type="com.visualgdb.debug.android">
+ <AdditionalStartupCommands />
+ <AdditionalGDBSettings>
+ <FilterSpuriousStoppedNotifications>false</FilterSpuriousStoppedNotifications>
+ <ForceSingleThreadedMode>false</ForceSingleThreadedMode>
+ <PendingBreakpointsSupported>true</PendingBreakpointsSupported>
+ <DisableChildRanges>false</DisableChildRanges>
+ <UseAppleExtensions>false</UseAppleExtensions>
+ <CanAcceptCommandsWhileRunning>false</CanAcceptCommandsWhileRunning>
+ <MakeLogFile>false</MakeLogFile>
+ <IgnoreModuleEventsWhileStepping>true</IgnoreModuleEventsWhileStepping>
+ <UseRelativePathsOnly>false</UseRelativePathsOnly>
+ <ExitAction>KillApp</ExitAction>
+ <Features>
+ <DisableAutoDetection>false</DisableAutoDetection>
+ <UseFrameParameter>false</UseFrameParameter>
+ <SimpleValuesFlagSupported>false</SimpleValuesFlagSupported>
+ <ListLocalsSupported>false</ListLocalsSupported>
+ <ByteLevelMemoryCommandsAvailable>false</ByteLevelMemoryCommandsAvailable>
+ <ThreadInfoSupported>false</ThreadInfoSupported>
+ <PendingBreakpointsSupported>false</PendingBreakpointsSupported>
+ <SupportTargetCommand>false</SupportTargetCommand>
+ </Features>
+ <DisableDisassembly>false</DisableDisassembly>
+ <ExamineMemoryWithXCommand>false</ExamineMemoryWithXCommand>
+ <StepIntoNewInstanceEntry>main</StepIntoNewInstanceEntry>
+ <ExamineRegistersInRawFormat>true</ExamineRegistersInRawFormat>
+ </AdditionalGDBSettings>
+ <LaunchGDBSettings xsi:type="GDBLaunchParametersAndroid" />
+ <GenerateCtrlBreakInsteadOfCtrlC>false</GenerateCtrlBreakInsteadOfCtrlC>
+ <UseDefaultInstallDir>false</UseDefaultInstallDir>
+ <RemotePort>5039</RemotePort>
+ <LocalPort>5039</LocalPort>
+ <GDBServerStartupTimeout>10000</GDBServerStartupTimeout>
+ <AdditionalGDBServerStartupDelay>0</AdditionalGDBServerStartupDelay>
+ <DoubleSlashWorkaround>false</DoubleSlashWorkaround>
+ <AlreadyRunningDecision>Ask</AlreadyRunningDecision>
+ <ShowLogCat>true</ShowLogCat>
+ <EnableThreadNameWatcher>true</EnableThreadNameWatcher>
+ </Debug>
+ <CustomBuild>
+ <PreBuildActions />
+ <PostBuildActions />
+ <PreCleanActions />
+ <PostCleanActions />
+ </CustomBuild>
+ <CustomDebug>
+ <PreDebugActions />
+ <PostDebugActions />
+ <BreakMode>Default</BreakMode>
+ </CustomDebug>
+ <CustomShortcuts>
+ <Shortcuts />
+ <ShowMessageAfterExecuting>true</ShowMessageAfterExecuting>
+ </CustomShortcuts>
+ <UserDefinedVariables />
+</VisualGDBProjectSettings2> \ No newline at end of file
diff --git a/Common/build/Windows/Common.props b/Common/build/Windows/Common.props
new file mode 100644
index 00000000..ad29ccfc
--- /dev/null
+++ b/Common/build/Windows/Common.props
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets" />
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <IncludePath>$(EngineRoot)\Common\include;$(EngineRoot)\Platforms\interface;$(EngineRoot)\Common\interface;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
+ </PropertyGroup>
+ <ItemDefinitionGroup />
+ <ItemGroup />
+</Project> \ No newline at end of file
diff --git a/Common/build/Windows/Common.vcxproj b/Common/build/Windows/Common.vcxproj
new file mode 100644
index 00000000..2d71da17
--- /dev/null
+++ b/Common/build/Windows/Common.vcxproj
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{7380F7E6-315F-4B4E-92EB-E6AEEE865298}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>Common</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <PlatformToolset>v120</PlatformToolset>
+ <ConfigurationType>Makefile</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <PlatformToolset>v120</PlatformToolset>
+ <ConfigurationType>Makefile</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ <Import Project="..\WindowsStore\Common.Shared\Common.Shared.vcxitems" Label="Shared" Condition="Exists('..\WindowsStore\Common.Shared\Common.Shared.vcxitems')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\Shared\build\Windows\Win32d.props" />
+ <Import Project="EngineRoot.props" />
+ <Import Project="Common.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\Shared\build\Windows\Win64d.props" />
+ <Import Project="EngineRoot.props" />
+ <Import Project="Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\Shared\build\Windows\Win32r.props" />
+ <Import Project="EngineRoot.props" />
+ <Import Project="Common.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\Shared\build\Windows\Win64r.props" />
+ <Import Project="EngineRoot.props" />
+ <Import Project="Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Import Project="..\..\..\Shared\build\Windows\Android32d.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Import Project="..\..\..\Shared\build\Windows\Android32r.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <NMakeForcedIncludes>$(ProjectDir)\Android\gcc_Debug.h;$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <NMakeForcedIncludes>$(ProjectDir)\Android\gcc_Release.h;$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ <Lib>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ <Lib>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\src\BasicFileStream.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\src\DataBlobImpl.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\src\Timer.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\make\AppCommon.mk" />
+ <None Include="jni\Android.mk" />
+ <None Include="jni\Application.mk" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Common/build/Windows/Common.vcxproj.filters b/Common/build/Windows/Common.vcxproj.filters
new file mode 100644
index 00000000..f8faf086
--- /dev/null
+++ b/Common/build/Windows/Common.vcxproj.filters
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="jni">
+ <UniqueIdentifier>{4866efaf-48ac-439f-9a2c-8b8ec11cace8}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="android_src">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\src\Timer.cpp">
+ <Filter>android_src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\BasicFileStream.cpp">
+ <Filter>android_src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\DataBlobImpl.cpp">
+ <Filter>android_src</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="jni\Android.mk">
+ <Filter>jni</Filter>
+ </None>
+ <None Include="jni\Application.mk">
+ <Filter>jni</Filter>
+ </None>
+ <None Include="..\..\make\AppCommon.mk">
+ <Filter>jni</Filter>
+ </None>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Common/build/Windows/EngineRoot.props b/Common/build/Windows/EngineRoot.props
new file mode 100644
index 00000000..afee36ca
--- /dev/null
+++ b/Common/build/Windows/EngineRoot.props
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets" />
+ <PropertyGroup Label="UserMacros">
+ <EngineRoot>..\..\..</EngineRoot>
+ </PropertyGroup>
+ <PropertyGroup />
+ <ItemDefinitionGroup />
+ <ItemGroup>
+ <BuildMacro Include="EngineRoot">
+ <Value>$(EngineRoot)</Value>
+ </BuildMacro>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Common/build/Windows/jni/Android.mk b/Common/build/Windows/jni/Android.mk
new file mode 100644
index 00000000..1699a5c3
--- /dev/null
+++ b/Common/build/Windows/jni/Android.mk
@@ -0,0 +1,27 @@
+# Android NDK project makefile autogenerated by Premake
+
+# Preamble
+DEPENDENCY_PATH := $(call my-dir)
+LOCAL_PATH := $(abspath $(DEPENDENCY_PATH))
+include $(CLEAR_VARS)
+
+
+# Project configuration
+LOCAL_MODULE := Common
+LOCAL_CFLAGS := -std=c++11
+LOCAL_CPP_FEATURES := exceptions
+LOCAL_STATIC_LIBRARIES += ndk_helper native_app_glue
+
+# Include paths
+PROJECT_ROOT := $(LOCAL_PATH)/../../..
+SOLUTION_ROOT := $(PROJECT_ROOT)/..
+LOCAL_C_INCLUDES := $(PROJECT_ROOT)/include $(PROJECT_ROOT)/interface $(SOLUTION_ROOT)/Platforms/interface
+
+# Source files
+#VisualGDBAndroid: AutoUpdateSourcesInNextLine
+LOCAL_SRC_FILES := ../../../src/BasicFileStream.cpp ../../../src/DataBlobImpl.cpp ../../../src/Timer.cpp
+
+include $(BUILD_STATIC_LIBRARY)
+
+$(call import-module,android/ndk_helper)
+$(call import-module,android/native_app_glue)
diff --git a/Common/build/Windows/jni/Application.mk b/Common/build/Windows/jni/Application.mk
new file mode 100644
index 00000000..65194f02
--- /dev/null
+++ b/Common/build/Windows/jni/Application.mk
@@ -0,0 +1,7 @@
+# Generated by VisualGDB
+
+DEPENDENCY_PATH := $(call my-dir)
+LOCAL_PATH := $(abspath $(DEPENDENCY_PATH))
+include $(LOCAL_PATH)/../../../make/AppCommon.mk
+
+APP_MODULES := Common \ No newline at end of file
diff --git a/Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems b/Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems
new file mode 100644
index 00000000..625b3fab
--- /dev/null
+++ b/Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Label="Globals">
+ <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+ <HasSharedItems>true</HasSharedItems>
+ <ItemsProjectGuid>{d716bf4d-094b-47d7-9137-a01c690c3616}</ItemsProjectGuid>
+ <ItemsRootNamespace>Common</ItemsRootNamespace>
+ <ItemsProjectName>Common.Shared</ItemsProjectName>
+ <CodeSharingProject>248F659F-DAC5-46E8-AC09-60EC9FC95053</CodeSharingProject>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)</AdditionalIncludeDirectories>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ProjectCapability Include="SourceItemsFromImports" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\BasicFileStream.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\BasicTypes.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\DataBlobImpl.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\DebugUtilities.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\Errors.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\FileWrapper.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\FormatMessage.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\InterfaceID.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\HashUtils.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\LockHelper.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\ObjectBase.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\pch.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\RefCntAutoPtr.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\RefCountedObjectImpl.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\StringTools.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\Timer.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\UniqueIdentifier.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\ValidatedCast.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\AdvancedMath.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\BasicMath.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\ComPtr.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\DataBlob.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\FileStream.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\Object.h" />
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\ReferenceCounters.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\BasicFileStream.cpp" />
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\DataBlobImpl.cpp" />
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\pch.cpp">
+ <PrecompiledHeader>Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\Timer.cpp" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems.filters b/Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems.filters
new file mode 100644
index 00000000..fd2552f3
--- /dev/null
+++ b/Common/build/WindowsStore/Common.Shared/Common.Shared.vcxitems.filters
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="include">
+ <UniqueIdentifier>{ead2d246-9a64-4464-b0aa-593b59ef6c6c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src">
+ <UniqueIdentifier>{c24fd6ae-babf-4fe7-a0af-93c5ef12ba32}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="interface">
+ <UniqueIdentifier>{bf40c456-a95e-4513-9842-fef2d752825a}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\FileWrapper.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\HashUtils.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\LockHelper.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\pch.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\RefCntAutoPtr.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\StringTools.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\Timer.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\UniqueIdentifier.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\ValidatedCast.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\BasicTypes.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\Errors.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\DebugUtilities.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\FormatMessage.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\ReferenceCounters.h">
+ <Filter>interface</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\Object.h">
+ <Filter>interface</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\RefCountedObjectImpl.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\FileStream.h">
+ <Filter>interface</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\ObjectBase.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\BasicFileStream.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\DataBlob.h">
+ <Filter>interface</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\DataBlobImpl.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\BasicMath.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\AdvancedMath.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\interface\ComPtr.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="$(MSBuildThisFileDirectory)..\..\..\include\InterfaceID.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\Timer.cpp">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\pch.cpp">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\BasicFileStream.cpp">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="$(MSBuildThisFileDirectory)..\..\..\src\DataBlobImpl.cpp">
+ <Filter>src</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj b/Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj
new file mode 100644
index 00000000..e0326fe8
--- /dev/null
+++ b/Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{4f9e9c58-6840-4f2f-a456-dd039fc790a4}</ProjectGuid>
+ <RootNamespace>Common</RootNamespace>
+ <DefaultLanguage>en-US</DefaultLanguage>
+ <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+ <AppContainerApplication>true</AppContainerApplication>
+ <ApplicationType>Windows Store</ApplicationType>
+ <ApplicationTypeRevision>8.1</ApplicationTypeRevision>
+ <ConvergedProjectType>CodeSharingStaticLibrary</ConvergedProjectType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <Import Project="..\Common.Shared\Common.Shared.vcxitems" Label="Shared" />
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStore32Dbg.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStore32Rel.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStoreArmDbg.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStoreArmRel.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStore64Dbg.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStore64Rel.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|arm'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|arm'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj.filters b/Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj.filters
new file mode 100644
index 00000000..a7761ab0
--- /dev/null
+++ b/Common/build/WindowsStore/Common.Windows/Common.Windows.vcxproj.filters
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ </ItemGroup>
+</Project>
diff --git a/Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj b/Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj
new file mode 100644
index 00000000..c1456120
--- /dev/null
+++ b/Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8b4477c9-e00b-48ce-bd60-ed694593cd85}</ProjectGuid>
+ <RootNamespace>Common</RootNamespace>
+ <DefaultLanguage>en-US</DefaultLanguage>
+ <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+ <AppContainerApplication>true</AppContainerApplication>
+ <ApplicationType>Windows Phone</ApplicationType>
+ <ApplicationTypeRevision>8.1</ApplicationTypeRevision>
+ <ConvergedProjectType>CodeSharingStaticLibrary</ConvergedProjectType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120_wp81</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120_wp81</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120_wp81</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120_wp81</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <Import Project="..\Common.Shared\Common.Shared.vcxitems" Label="Shared" />
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStore32Dbg.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStore32Rel.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStoreArmDbg.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="..\..\..\..\Shared\build\WindowsStore\WinStoreArmRel.props" />
+ <Import Project="..\EngineRoot.props" />
+ <Import Project="..\..\Windows\Common.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|arm'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|arm'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <CompileAsWinRT>false</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj.filters b/Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj.filters
new file mode 100644
index 00000000..a7761ab0
--- /dev/null
+++ b/Common/build/WindowsStore/Common.WindowsPhone/Common.WindowsPhone.vcxproj.filters
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ </ItemGroup>
+</Project>
diff --git a/Common/build/WindowsStore/EngineRoot.props b/Common/build/WindowsStore/EngineRoot.props
new file mode 100644
index 00000000..c2337431
--- /dev/null
+++ b/Common/build/WindowsStore/EngineRoot.props
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets" />
+ <PropertyGroup Label="UserMacros">
+ <EngineRoot>..\..\..\..</EngineRoot>
+ </PropertyGroup>
+ <PropertyGroup />
+ <ItemDefinitionGroup />
+ <ItemGroup>
+ <BuildMacro Include="EngineRoot">
+ <Value>$(EngineRoot)</Value>
+ </BuildMacro>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Common/include/BasicFileStream.h b/Common/include/BasicFileStream.h
new file mode 100644
index 00000000..85f685a5
--- /dev/null
+++ b/Common/include/BasicFileStream.h
@@ -0,0 +1,66 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Implementation of the Diligent::BasicFileStream class
+
+#include "FileStream.h"
+#include "ObjectBase.h"
+#include "RefCountedObjectImpl.h"
+#include "FileWrapper.h"
+#include "DataBlob.h"
+
+namespace Diligent
+{
+
+/// Basic file stream implementation
+class BasicFileStream : public ObjectBase<IFileStream>
+{
+public:
+ typedef ObjectBase<IFileStream> TBase;
+
+ BasicFileStream(const Diligent::Char *Path,
+ EFileAccessMode Access = EFileAccessMode::Read);
+
+ virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface )override;
+
+ /// Reads data from the stream
+ virtual void Read( Diligent::IDataBlob *pData )override;
+
+ /// Reads data from the stream
+ virtual bool Read( void *Data, size_t BufferSize )override;
+
+ /// Writes data to the stream
+ virtual bool Write( const void *Data, size_t Size )override;
+
+ virtual size_t GetSize()override;
+
+ virtual bool IsValid()override;
+
+private:
+ Diligent::FileWrapper m_FileWrpr;
+};
+
+}
diff --git a/Common/include/BasicTypes.h b/Common/include/BasicTypes.h
new file mode 100644
index 00000000..7d3bea3d
--- /dev/null
+++ b/Common/include/BasicTypes.h
@@ -0,0 +1,52 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include <cstdint>
+#include <string>
+
+namespace Diligent
+{
+ typedef float Float32;
+
+ typedef int64_t Int64;
+ typedef int32_t Int32;
+ typedef int16_t Int16;
+ typedef int8_t Int8;
+
+ typedef uint64_t Uint64;
+ typedef uint32_t Uint32;
+ typedef uint16_t Uint16;
+ typedef uint8_t Uint8;
+
+ typedef size_t SizeType;
+ typedef void* PVoid;
+
+ typedef bool Bool;
+ static const Bool False = false;
+ static const Bool True = true;
+
+ typedef char Char;
+ typedef std::basic_string<Char> String;
+}
diff --git a/Common/include/DataBlobImpl.h b/Common/include/DataBlobImpl.h
new file mode 100644
index 00000000..d9441588
--- /dev/null
+++ b/Common/include/DataBlobImpl.h
@@ -0,0 +1,58 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Implementation for the IDataBlob interface
+
+#include "DataBlob.h"
+#include "BasicTypes.h"
+#include "ObjectBase.h"
+#include <vector>
+
+namespace Diligent
+{
+
+/// Base interface for a file stream
+class DataBlobImpl : public Diligent::ObjectBase<IDataBlob>
+{
+public:
+ typedef Diligent::ObjectBase<IDataBlob> TBase;
+
+ virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface )override;
+
+ /// Sets the size of the internal data buffer
+ virtual void Resize( size_t NewSize )override;
+
+ /// Returns the size of the internal data buffer
+ virtual size_t GetSize()override;
+
+ /// Returns the pointer to the internal data buffer
+ virtual void* GetDataPtr()override;
+
+private:
+ std::vector<Diligent::Uint8> m_DataBuff;
+};
+
+}
diff --git a/Common/include/DebugUtilities.h b/Common/include/DebugUtilities.h
new file mode 100644
index 00000000..d57fd06b
--- /dev/null
+++ b/Common/include/DebugUtilities.h
@@ -0,0 +1,66 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "FormatMessage.h"
+#include "PlatformDebug.h"
+
+#ifdef _DEBUG
+
+// This function is only requried to ensure that Message argument passed to the macro
+// is actually string and not something else
+inline void EnsureStr( const char* ){}
+# define VERIFY(Expr, Message, ...)\
+ { \
+ if( !(Expr) ) \
+ { \
+ Diligent::MsgStream ms; \
+ Diligent::FormatMsg( ms, Message, ##__VA_ARGS__);\
+ PlatformDebug::AssertionFailed( ms.str().c_str(), __FUNCTION__, __FILE__, __LINE__); \
+ } \
+ EnsureStr(Message); \
+ }
+# define UNEXPECTED(Message, ...) { VERIFY(false, Message, ##__VA_ARGS__); }
+# define UNSUPPORTED(Message, ...) { VERIFY(false, Message, ##__VA_ARGS__); }
+
+# define VERIFY_EXPR(Expr) VERIFY(Expr, "Debug exression failed:\n", #Expr)
+
+
+template<typename DstType, typename SrcType>
+void CheckDynamicType( SrcType *pSrcPtr )
+{
+ VERIFY( pSrcPtr == nullptr || dynamic_cast<DstType*> (pSrcPtr) != nullptr, "Dynamic type cast failed!" );
+}
+# define CHECK_DYNAMIC_TYPE(DstType, pSrcPtr) CheckDynamicType<DstType>(pSrcPtr)
+
+
+#else
+
+# define CHECK_DYNAMIC_TYPE(...){}
+# define VERIFY(...){}
+# define UNEXPECTED(...){}
+# define UNSUPPORTED(...){}
+# define VERIFY_EXPR(...){}
+
+#endif
diff --git a/Common/include/Errors.h b/Common/include/Errors.h
new file mode 100644
index 00000000..658adb0e
--- /dev/null
+++ b/Common/include/Errors.h
@@ -0,0 +1,67 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include <stdexcept>
+
+#include "PlatformDebug.h"
+#include "FormatMessage.h"
+#include "FileSystem.h"
+
+template<bool bThrowException, typename FirstArgType, typename... RestArgsType>
+void LogError( const char *strFunctionName, const char *strFullFilePath, int Line, const FirstArgType& first, const RestArgsType&... RestArgs )
+{
+ std::string FileName;
+ FileSystem::SplitFilePath( strFullFilePath, nullptr, &FileName );
+ Diligent::MsgStream ss;
+ ss << "The following error occured in the " << strFunctionName << "() function (" << FileName << ", line " << Line << "):\n";
+ Diligent::FormatMsg( ss, first, RestArgs... );
+ auto strFullMessage = ss.str();
+ PlatformDebug::OutputDebugMessage( bThrowException ? PlatformDebug::DebugMessageSeverity::FatalError : PlatformDebug::DebugMessageSeverity::Error, strFullMessage.c_str() );
+ if( bThrowException )
+ {
+ throw std::runtime_error( strFullMessage );
+ }
+}
+
+#define LOG_ERROR(...)\
+{ \
+ LogError<false>(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); \
+}
+
+#define LOG_ERROR_AND_THROW(...) \
+{ \
+ LogError<true>(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); \
+}
+
+#define LOG_DEBUG_MESSAGE(Severity, ...) \
+{ \
+ Diligent::MsgStream ss; \
+ Diligent::FormatMsg( ss, ##__VA_ARGS__ ); \
+ PlatformDebug::OutputDebugMessage( Severity, ss.str().c_str() ); \
+}
+
+#define LOG_ERROR_MESSAGE(...) LOG_DEBUG_MESSAGE(PlatformDebug::DebugMessageSeverity::Error, ##__VA_ARGS__)
+#define LOG_WARNING_MESSAGE(...) LOG_DEBUG_MESSAGE(PlatformDebug::DebugMessageSeverity::Warning, ##__VA_ARGS__)
+#define LOG_INFO_MESSAGE(...) LOG_DEBUG_MESSAGE(PlatformDebug::DebugMessageSeverity::Info, ##__VA_ARGS__)
diff --git a/Common/include/FileWrapper.h b/Common/include/FileWrapper.h
new file mode 100644
index 00000000..85851d89
--- /dev/null
+++ b/Common/include/FileWrapper.h
@@ -0,0 +1,91 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "FileSystem.h"
+#include "Errors.h"
+#include "DebugUtilities.h"
+
+namespace Diligent
+{
+
+class FileWrapper
+{
+public:
+ FileWrapper( ) :
+ m_pFile(nullptr)
+ {}
+
+ FileWrapper( const Diligent::Char *Path,
+ EFileAccessMode Access = EFileAccessMode::Read) :
+ m_pFile( nullptr )
+ {
+ FileOpenAttribs OpenAttribs(Path, Access);
+ Open(OpenAttribs);
+ }
+
+ ~FileWrapper()
+ {
+ Close();
+ }
+
+ void Open(const FileOpenAttribs& OpenAttribs)
+ {
+ VERIFY( !m_pFile, "Another file already attached" );
+ Close();
+ m_pFile = FileSystem::OpenFile( OpenAttribs );
+ }
+
+ CFile *Detach()
+ {
+ CFile *pFile = m_pFile;
+ m_pFile = NULL;
+ return pFile;
+ }
+
+ void Attach(CFile *pFile)
+ {
+ VERIFY(!m_pFile, "Another file already attached");
+ Close();
+ m_pFile = pFile;
+ }
+
+ void Close()
+ {
+ if( m_pFile )
+ FileSystem::ReleaseFile(m_pFile);
+ m_pFile = nullptr;
+ }
+
+ operator CFile*(){return m_pFile;}
+ CFile* operator->(){return m_pFile;}
+
+private:
+ FileWrapper(const FileWrapper&);
+ const FileWrapper& operator=(const FileWrapper&);
+
+ CFile *m_pFile;
+};
+
+}
diff --git a/Common/include/FormatMessage.h b/Common/include/FormatMessage.h
new file mode 100644
index 00000000..a20435ae
--- /dev/null
+++ b/Common/include/FormatMessage.h
@@ -0,0 +1,44 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include <sstream>
+
+namespace Diligent
+{
+ typedef std::stringstream MsgStream;
+
+ template<typename SSType, typename ArgType>
+ void FormatMsg( SSType &ss, const ArgType& Arg )
+ {
+ ss << Arg;
+ }
+
+ template<typename SSType, typename FirstArgType, typename... RestArgsType>
+ void FormatMsg( SSType &ss, const FirstArgType& FirstArg, const RestArgsType&... RestArgs )
+ {
+ FormatMsg( ss, FirstArg );
+ FormatMsg( ss, RestArgs... ); // recursive call using pack expansion syntax
+ }
+} \ No newline at end of file
diff --git a/Common/include/HashUtils.h b/Common/include/HashUtils.h
new file mode 100644
index 00000000..03cf54b6
--- /dev/null
+++ b/Common/include/HashUtils.h
@@ -0,0 +1,195 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include <functional>
+#include <memory>
+
+#define LOG_HASH_CONFLICTS 1
+
+namespace Diligent
+{
+ // http://www.boost.org/doc/libs/1_35_0/doc/html/hash/combine.html
+ template<typename T>
+ void HashCombine(std::size_t &Seed, const T& Val)
+ {
+ Seed ^= std::hash<T>()(Val) + 0x9e3779b9 + (Seed << 6) + (Seed >> 2);
+ }
+
+ template<typename FirstArgType, typename... RestArgsType>
+ void HashCombine( std::size_t &Seed, const FirstArgType& FirstArg, const RestArgsType&... RestArgs )
+ {
+ HashCombine( Seed, FirstArg );
+ HashCombine( Seed, RestArgs... ); // recursive call using pack expansion syntax
+ }
+
+ template<typename... ArgsType>
+ std::size_t ComputeHash( const ArgsType&... Args )
+ {
+ std::size_t Seed = 0;
+ HashCombine( Seed, Args... );
+ return Seed;
+ }
+
+ template<typename CharType>
+ struct CStringHash
+ {
+ size_t operator()( const CharType *str ) const
+ {
+ // http://www.cse.yorku.ca/~oz/hash.html
+ std::size_t Seed = 0;
+ while( size_t Ch = *(str++) )
+ Seed = Seed * 65599 + Ch;
+ return Seed;
+ }
+ };
+
+ template<typename CharType>
+ struct CStringCompare
+ {
+ bool operator()( const Char *str1, const Char *str2 )const
+ {
+ UNSUPPORTED( "Template specialization is not implemented" )
+ return false;
+ }
+ };
+
+ template<>
+ struct CStringCompare<Char>
+ {
+ bool operator()( const Char *str1, const Char *str2 )const
+ {
+ return strcmp( str1, str2 ) == 0;
+ }
+ };
+
+ /// This helper structure is intended to facilitate using strings as a
+ /// hash table key. It provides constructors that can make a copy of the
+ /// source string or just keep pointer to it, which enables searching in
+ /// the hash using raw const Char* pointers.
+ struct HashMapStringKey
+ {
+ public:
+ // This constructor can perform implicit const Char* -> HashMapStringKey
+ // conversion without copying the string
+ HashMapStringKey(const Char* Str, bool bMakeCopy = false) :
+ StrPtr(nullptr),
+ Hash(0)
+ {
+ VERIFY( Str, "String pointer cannot be null" );
+ if( bMakeCopy )
+ {
+ MakeCopy( Str );
+ }
+ else
+ {
+ StrPtr = Str;
+ }
+ }
+
+ explicit // Make this constructor explicit to avoid unintentional string copies
+ HashMapStringKey(const String &Str) :
+ StrPtr( nullptr ),
+ Hash(0)
+ {
+ MakeCopy( Str.c_str() );
+ }
+
+ HashMapStringKey(HashMapStringKey &&Key) :
+ StringBuff( std::move(Key.StringBuff) ),
+ StrPtr( std::move(Key.StrPtr) ),
+ Hash(0)
+ {
+ Key.StrPtr = nullptr;
+ Key.Hash = 0;
+ }
+
+ // Disable copy constuctor and assignments. The struct is designed
+ // to be initialized at creation time only
+ HashMapStringKey( const HashMapStringKey& ) = delete;
+ HashMapStringKey& operator = ( const HashMapStringKey& ) = delete;
+ HashMapStringKey& operator = ( HashMapStringKey&& ) = delete;
+
+ // Comparison operator
+ bool operator == (const HashMapStringKey& RHS)const
+ {
+ if( StrPtr == RHS.StrPtr )
+ return true;
+
+ // Hash member might not have been initialized
+ if( (Hash != 0 && RHS.Hash !=0 && Hash != RHS.Hash) || StrPtr == nullptr || RHS.StrPtr == nullptr )
+ return false;
+
+ bool IsEqual = strcmp( StrPtr, RHS.StrPtr ) == 0;
+
+#if LOG_HASH_CONFLICTS
+ if( Hash != 0 && RHS.Hash !=0 && Hash == RHS.Hash && !IsEqual )
+ {
+ LOG_WARNING_MESSAGE("Unequal strings \"", StrPtr, "\" and \"", RHS.StrPtr, "\" hashed to the same bucket. "
+ "You may want to use better hash function. You may disable this warning by defining LOG_HASH_CONFLICTS to 0");
+ }
+#endif
+ return IsEqual;
+ }
+
+ size_t GetHash()const
+ {
+ if( Hash == 0 )
+ Hash = CStringHash<Char>()(StrPtr);
+
+ return Hash;
+ }
+
+ const Char* GetStr()const{ return StrPtr; }
+
+ private:
+ void MakeCopy( const Char* Str )
+ {
+ auto LenWithZeroTerm = strlen( Str ) + 1;
+ StringBuff.reset( new char[ LenWithZeroTerm ] );
+ memcpy( StringBuff.get(), Str, LenWithZeroTerm );
+ StrPtr = StringBuff.get();
+ }
+
+ // !!! WARNING !!!
+ // We can't use String to store the buffer, because String default
+ // constructor always allocates memory even when the string is empty,
+ // nor can we use vector for the same reason
+ std::unique_ptr< Char[] > StringBuff; // Must be declared first
+ const Char* StrPtr;// Must be declared after StringBuff
+ mutable size_t Hash;
+ };
+}
+
+namespace std
+{
+ template<>
+ struct hash<Diligent::HashMapStringKey>
+ {
+ size_t operator()( const Diligent::HashMapStringKey &Key ) const
+ {
+ return Key.GetHash();
+ }
+ };
+}
diff --git a/Common/include/InterfaceID.h b/Common/include/InterfaceID.h
new file mode 100644
index 00000000..ce426b5e
--- /dev/null
+++ b/Common/include/InterfaceID.h
@@ -0,0 +1,50 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "BasicTypes.h"
+
+/// Unique identification structures
+namespace Diligent
+{
+ /// Describes unique identifier
+ struct INTERFACE_ID
+ {
+ Diligent::Uint32 Data1;
+ Diligent::Uint16 Data2;
+ Diligent::Uint16 Data3;
+ Diligent::Uint8 Data4[8];
+
+ bool operator == (const INTERFACE_ID& rhs)const
+ {
+ return Data1 == rhs.Data1 &&
+ Data2 == rhs.Data2 &&
+ Data3 == rhs.Data3 &&
+ memcmp(Data4, rhs.Data4, sizeof(Data4)) == 0;
+ }
+ };
+
+ /// Unknown interface
+ static const INTERFACE_ID IID_Unknown = { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 } };
+}
diff --git a/Common/include/LockHelper.h b/Common/include/LockHelper.h
new file mode 100644
index 00000000..5f27aad3
--- /dev/null
+++ b/Common/include/LockHelper.h
@@ -0,0 +1,133 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "Atomics.h"
+
+namespace ThreadingTools
+{
+
+class LockFlag
+{
+public:
+ enum {LOCK_FLAG_UNLOCKED = 0, LOCK_FLAG_LOCKED = 1};
+ LockFlag(Atomics::Long InitFlag = LOCK_FLAG_UNLOCKED)
+ {
+ m_Flag.store(InitFlag);
+ }
+
+ operator Atomics::Long()const{return m_Flag;}
+
+private:
+ friend class LockHelper;
+ Atomics::AtomicLong m_Flag;
+};
+
+class LockHelper
+{
+public:
+
+ LockHelper() :
+ m_pLockFlag(nullptr)
+ {
+ }
+ LockHelper(LockFlag &LockFlag) :
+ m_pLockFlag(nullptr)
+ {
+ Lock(LockFlag);
+ }
+
+ LockHelper( LockHelper &&LockHelper ) :
+ m_pLockFlag( std::move(LockHelper.m_pLockFlag) )
+ {
+ LockHelper.m_pLockFlag = nullptr;
+ }
+
+ const LockHelper& operator = (LockHelper &&LockHelper)
+ {
+ m_pLockFlag = std::move( LockHelper.m_pLockFlag );
+ LockHelper.m_pLockFlag = nullptr;
+ return *this;
+ }
+
+ ~LockHelper()
+ {
+ Unlock();
+ }
+
+ static bool UnsafeTryLock(LockFlag &LockFlag)
+ {
+ return Atomics::AtomicCompareExchange( LockFlag.m_Flag,
+ static_cast<Atomics::Long>( LockFlag::LOCK_FLAG_LOCKED ),
+ static_cast<Atomics::Long>( LockFlag::LOCK_FLAG_UNLOCKED) ) == LockFlag::LOCK_FLAG_UNLOCKED;
+ }
+
+ bool TryLock(LockFlag &LockFlag)
+ {
+ if( UnsafeTryLock( LockFlag) )
+ {
+ m_pLockFlag = &LockFlag;
+ return true;
+ }
+ else
+ return false;
+ }
+
+ static void UnsafeLock(LockFlag &LockFlag)
+ {
+ while( !UnsafeTryLock( LockFlag ) )
+ /*Sleep(5)*/
+ // TODO
+ ;
+ }
+
+ void Lock(LockFlag &LockFlag)
+ {
+ VERIFY( m_pLockFlag == NULL, "Object already locked" );
+ // Wait for the flag to become unlocked and lock it
+ while( !TryLock( LockFlag ) )
+ /*Sleep(5)*/
+ // TODO
+ ;
+ }
+
+ static void UnsafeUnlock(LockFlag &LockFlag)
+ {
+ LockFlag.m_Flag = LockFlag::LOCK_FLAG_UNLOCKED;
+ }
+
+ void Unlock()
+ {
+ if( m_pLockFlag )
+ UnsafeUnlock(*m_pLockFlag);
+ m_pLockFlag = NULL;
+ }
+
+private:
+ LockFlag *m_pLockFlag;
+ LockHelper( const LockHelper &LockHelper );
+ const LockHelper& operator = ( const LockHelper &LockHelper );
+};
+
+}
diff --git a/Common/include/ObjectBase.h b/Common/include/ObjectBase.h
new file mode 100644
index 00000000..c7de28c8
--- /dev/null
+++ b/Common/include/ObjectBase.h
@@ -0,0 +1,83 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Implementation of the Diligent::ObjectBase template class
+
+#include "Object.h"
+#include "RefCountedObjectImpl.h"
+
+namespace Diligent
+{
+
+
+#define IMPLEMENT_QUERY_INTERFACE_BODY(InterfaceID, ParentClassName) \
+{ \
+ if( ppInterface == nullptr ) \
+ return; \
+ if( IID == InterfaceID ) \
+ { \
+ *ppInterface = this; \
+ (*ppInterface)->AddRef(); \
+ } \
+ else \
+ { \
+ ParentClassName::QueryInterface( IID, ppInterface ); \
+ } \
+}
+
+#define IMPLEMENT_QUERY_INTERFACE(ClassName, InterfaceID, ParentClassName) \
+ void ClassName :: QueryInterface(const Diligent::INTERFACE_ID &IID, IObject **ppInterface) \
+ IMPLEMENT_QUERY_INTERFACE_BODY(InterfaceID, ParentClassName)
+
+#define IMPLEMENT_QUERY_INTERFACE_IN_PLACE(InterfaceID, ParentClassName) \
+ virtual void QueryInterface(const Diligent::INTERFACE_ID &IID, IObject **ppInterface) \
+ IMPLEMENT_QUERY_INTERFACE_BODY(InterfaceID, ParentClassName)
+
+
+/// Template class implementing base functionality for an object
+template<typename BaseInterface>
+class ObjectBase : public RefCountedObject<BaseInterface>
+{
+public:
+ ObjectBase(IObject *pOwner = nullptr) :
+ RefCountedObject<BaseInterface>( pOwner )
+ {}
+
+ virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface )
+ {
+ if( ppInterface == nullptr )
+ return;
+
+ *ppInterface = nullptr;
+ if( IID == Diligent::IID_Unknown )
+ {
+ *ppInterface = this;
+ (*ppInterface)->AddRef();
+ }
+ }
+};
+
+}
diff --git a/Common/include/RefCntAutoPtr.h b/Common/include/RefCntAutoPtr.h
new file mode 100644
index 00000000..7df6f246
--- /dev/null
+++ b/Common/include/RefCntAutoPtr.h
@@ -0,0 +1,391 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "DebugUtilities.h"
+#include "LockHelper.h"
+#include "Atomics.h"
+#include "ValidatedCast.h"
+#include "ReferenceCounters.h"
+#include "Object.h"
+
+namespace Diligent
+{
+
+
+template <typename T>
+class RefCntWeakPtr;
+
+// The main advantage of RefCntAutoPtr over the std::shared_ptr is that you can
+// attach the same raw pointer to different smart pointers.
+//
+// For instance, the following code will crash since p will be released twice:
+//
+// auto *p = new char;
+// std::shared_ptr<char> pTmp1(p);
+// std::shared_ptr<char> pTmp2(p);
+// ...
+
+// This code, in contrast, works perfectly fine:
+//
+// ObjectBase *pRawPtr(new ObjectBase);
+// RefCntAutoPtr<ObjectBase> pSmartPtr1(pRawPtr);
+// RefCntAutoPtr<ObjectBase> pSmartPtr2(pRawPtr);
+// ...
+
+// Other advantage is that weak pointers remain valid until the
+// object is alive, even if all smart pointers were destroyed:
+//
+// RefCntWeakPtr<ObjectBase> pWeakPtr(pSmartPtr1);
+// pSmartPtr1.Release();
+// auto pSmartPtr3 = pWeakPtr.Lock();
+// ..
+
+// Weak pointers can also be attached directly to the object:
+// RefCntWeakPtr<ObjectBase> pWeakPtr(pRawPtr);
+//
+
+template<typename T>
+class DefaultBlockAddRefRelease : public T
+{
+private:
+ // Note that the null pointer constant nullptr or any other value of type std::nullptr_t
+ // cannot be converted to a pointer with reinterpret_cast: implicit conversion or
+ // static_cast should be used for this purpose.
+ virtual decltype( static_cast<T*>(nullptr)->AddRef() ) AddRef()override = 0;
+ virtual decltype( static_cast<T*>(nullptr)->Release() ) Release()override = 0;
+};
+
+template <typename T, template<typename> class BlockAddRefRelease = DefaultBlockAddRefRelease>
+class RefCntAutoPtr
+{
+public:
+ explicit RefCntAutoPtr(T *pObj = nullptr) :
+ m_pObject(pObj)
+ {
+ if( m_pObject )
+ m_pObject->AddRef();
+ }
+
+ RefCntAutoPtr(const RefCntAutoPtr &AutoPtr) :
+ m_pObject(AutoPtr.m_pObject)
+ {
+ if(m_pObject)
+ m_pObject->AddRef();
+ }
+
+ RefCntAutoPtr(RefCntAutoPtr &&AutoPtr) :
+ m_pObject(std::move(AutoPtr.m_pObject))
+ {
+ //Make sure original pointer has no references to the object
+ AutoPtr.m_pObject = nullptr;
+ }
+
+ ~RefCntAutoPtr()
+ {
+ Release();
+ }
+
+ void swap(RefCntAutoPtr &AutoPtr)
+ {
+ std::swap(m_pObject, AutoPtr.m_pObject);
+ }
+
+ void Attach(T *pObj)
+ {
+ Release();
+ m_pObject = pObj;
+ }
+
+ T* Detach()
+ {
+ T* pObj = m_pObject;
+ m_pObject = nullptr;
+ return pObj;
+ }
+
+ void Release()
+ {
+ if( m_pObject )
+ {
+ m_pObject->Release();
+ m_pObject = nullptr;
+ }
+ }
+
+ RefCntAutoPtr& operator = (T *pObj)
+ {
+ if( static_cast<T*>(*this) == pObj )
+ return *this;
+
+ return operator= (RefCntAutoPtr(pObj));
+ }
+
+ RefCntAutoPtr& operator = (const RefCntAutoPtr &AutoPtr)
+ {
+ if( *this == AutoPtr )
+ return *this;
+
+ Release();
+ m_pObject = AutoPtr.m_pObject;
+ if(m_pObject)
+ m_pObject->AddRef();
+
+ return *this;
+ }
+
+ RefCntAutoPtr& operator = (RefCntAutoPtr &&AutoPtr)
+ {
+ if( *this == AutoPtr )
+ return *this;
+
+ Release();
+ m_pObject = std::move( AutoPtr.m_pObject );
+ //Make sure original pointer has no references to the object
+ AutoPtr.m_pObject = nullptr;
+ return *this;
+ }
+
+ // All the access functions do not require locking reference counters pointer because if it is valid,
+ // the smart pointer holds strong reference to the object and it thus cannot be released by
+ // ohter thread
+ bool operator ! () const{return m_pObject == nullptr;}
+ operator bool () const{return m_pObject != nullptr;}
+ bool operator == (const RefCntAutoPtr& Ptr)const{return m_pObject == Ptr.m_pObject;}
+ bool operator != (const RefCntAutoPtr& Ptr)const{return m_pObject != Ptr.m_pObject;}
+ bool operator < (const RefCntAutoPtr& Ptr)const{return static_cast<const T*>(*this) < static_cast<const T*>(Ptr);}
+
+ T& operator * () { return *m_pObject; }
+ const T& operator * ()const { return *m_pObject; }
+
+ T* RawPtr() { return m_pObject; }
+ const T* RawPtr()const{ return m_pObject; }
+
+ operator T* () { return RawPtr(); }
+ operator const T* ()const { return RawPtr(); }
+
+
+ BlockAddRefRelease<T>* operator -> () { return static_cast<BlockAddRefRelease<T>*> (m_pObject); }
+ const BlockAddRefRelease<T>* operator -> ()const{ return static_cast<BlockAddRefRelease<T>*> (m_pObject); }
+
+private:
+ // Note that the DoublePtrHelper is a private class, and can be created only by RefCntWeakPtr
+ // Thus if no special effort is made, the lifetime of the instances of this class cannot be
+ // longer than the lifetime of the creating object
+ class DoublePtrHelper
+ {
+ public:
+ DoublePtrHelper(RefCntAutoPtr &AutoPtr) :
+ NewRawPtr( static_cast<T*>(AutoPtr) ),
+ m_pAutoPtr( std::addressof(AutoPtr) )
+ {
+ }
+
+ DoublePtrHelper(DoublePtrHelper&& Helper) :
+ NewRawPtr(Helper.NewRawPtr),
+ m_pAutoPtr(Helper.m_pAutoPtr)
+ {
+ Helper.m_pAutoPtr = nullptr;
+ Helper.NewRawPtr = nullptr;
+ }
+
+ ~DoublePtrHelper()
+ {
+ if( m_pAutoPtr && static_cast<T*>(*m_pAutoPtr) != NewRawPtr )
+ {
+ m_pAutoPtr->Attach(NewRawPtr);
+ }
+ }
+
+ T*& operator*(){return NewRawPtr;}
+ const T* operator*()const{return NewRawPtr;}
+
+ operator T**(){return &NewRawPtr;}
+ operator const T**()const{return &NewRawPtr;}
+ private:
+ T *NewRawPtr;
+ RefCntAutoPtr *m_pAutoPtr;
+ DoublePtrHelper(const DoublePtrHelper&);
+ DoublePtrHelper& operator = (const DoublePtrHelper&);
+ DoublePtrHelper& operator = (DoublePtrHelper&&);
+ };
+
+public:
+ DoublePtrHelper operator& ()
+ {
+ return DoublePtrHelper(*this);
+ }
+
+ const DoublePtrHelper operator& ()const
+ {
+ return DoublePtrHelper(*this);
+ }
+
+private:
+ T *m_pObject;
+};
+
+/// Implementation of weak pointers
+template <typename T>
+class RefCntWeakPtr
+{
+public:
+ explicit RefCntWeakPtr(T *pObj = nullptr) :
+ m_pObject(pObj),
+ m_pRefCounters(nullptr)
+ {
+ if( m_pObject )
+ {
+ m_pRefCounters = m_pObject->GetReferenceCounters();
+ m_pRefCounters->AddWeakRef();
+ }
+ }
+
+ ~RefCntWeakPtr()
+ {
+ Release();
+ }
+
+ RefCntWeakPtr(const RefCntWeakPtr& WeakPtr) :
+ m_pObject(WeakPtr.m_pObject),
+ m_pRefCounters(WeakPtr.m_pRefCounters)
+ {
+ if( m_pRefCounters )
+ m_pRefCounters->AddWeakRef();
+ }
+
+ RefCntWeakPtr(RefCntWeakPtr&& WeakPtr) :
+ m_pObject(std::move(WeakPtr.m_pObject)),
+ m_pRefCounters(std::move(WeakPtr.m_pRefCounters))
+ {
+ WeakPtr.m_pRefCounters = nullptr;
+ WeakPtr.m_pObject = nullptr;
+ }
+
+ explicit RefCntWeakPtr(RefCntAutoPtr<T>& AutoPtr) :
+ m_pObject( static_cast<T*>(AutoPtr) ),
+ m_pRefCounters(AutoPtr ? AutoPtr->GetReferenceCounters() : nullptr)
+ {
+ if( m_pRefCounters )
+ m_pRefCounters->AddWeakRef();
+ }
+
+ RefCntWeakPtr& operator = (const RefCntWeakPtr& WeakPtr)
+ {
+ if( *this == WeakPtr )
+ return *this;
+
+ Release();
+ m_pObject = WeakPtr.m_pObject;
+ m_pRefCounters = WeakPtr.m_pRefCounters;
+ if( m_pRefCounters )
+ m_pRefCounters->AddWeakRef();
+ return *this;
+ }
+
+ RefCntWeakPtr& operator = (T *pObj)
+ {
+ return operator= (RefCntWeakPtr(pObj));
+ }
+
+ RefCntWeakPtr& operator = (RefCntWeakPtr&& WeakPtr)
+ {
+ if( *this == WeakPtr )
+ return *this;
+
+ Release();
+ m_pObject = std::move(WeakPtr.m_pObject);
+ m_pRefCounters = std::move(WeakPtr.m_pRefCounters);
+ WeakPtr.m_pRefCounters = nullptr;
+ WeakPtr.m_pObject = nullptr;
+ return *this;
+ }
+
+ RefCntWeakPtr& operator = (RefCntAutoPtr<T>& AutoPtr)
+ {
+ Release();
+ m_pObject = static_cast<T*>( AutoPtr );
+ m_pRefCounters = m_pObject ? m_pObject->GetReferenceCounters() : nullptr;
+ if( m_pRefCounters )
+ m_pRefCounters->AddWeakRef();
+ return *this;
+ }
+
+ void Release()
+ {
+ if( m_pRefCounters )
+ m_pRefCounters->ReleaseWeakRef();
+ m_pRefCounters = nullptr;
+ m_pObject = nullptr;
+ }
+
+ /// \note This method may not be reliable in a multithreaded environment.
+ /// However, when false is returned, the strong pointer created from
+ /// this weak pointer will reliably be empty.
+ bool IsValid()
+ {
+ return m_pObject != nullptr && m_pRefCounters != nullptr && m_pRefCounters->GetNumStrongRefs() > 0;
+ }
+
+ /// Obtains a strong reference to the object
+ RefCntAutoPtr<T> Lock()
+ {
+ RefCntAutoPtr<T> spObj;
+ if( m_pRefCounters )
+ {
+ // Try to obtain pointer to the owner object.
+ // spOwner is only used to keep the object
+ // alive while obtaining strong reference from
+ // the raw pointer m_pObject
+ RefCntAutoPtr<Diligent::IObject> spOwner;
+ m_pRefCounters->GetObject( &spOwner );
+ if( spOwner )
+ {
+ // If owner is alive, we can use our RAW pointer to
+ // create strong reference
+ spObj = m_pObject;
+ }
+ else
+ {
+ // Owner object has been destroyed. There is no reason
+ // to keep this weak reference anymore
+ Release();
+ }
+ }
+ return spObj;
+ }
+
+ bool operator == (const RefCntWeakPtr& Ptr)const{return m_pRefCounters == Ptr.m_pRefCounters;}
+ bool operator != (const RefCntWeakPtr& Ptr)const{return m_pRefCounters != Ptr.m_pRefCounters;}
+
+protected:
+ Diligent::IReferenceCounters *m_pRefCounters;
+ // We need to store raw pointer to object itself,
+ // because if the object is owned by another object,
+ // m_pRefCounters->GetObject( &pObj ) will return
+ // pointer to owner, which is not what we need.
+ T *m_pObject;
+};
+
+}
diff --git a/Common/include/RefCountedObjectImpl.h b/Common/include/RefCountedObjectImpl.h
new file mode 100644
index 00000000..dc5f7233
--- /dev/null
+++ b/Common/include/RefCountedObjectImpl.h
@@ -0,0 +1,332 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Implementation of the template base class for reference counting objects
+
+#include "Object.h"
+#include "Atomics.h"
+#include "DebugUtilities.h"
+#include "LockHelper.h"
+#include "ValidatedCast.h"
+
+namespace Diligent
+{
+
+/// Base class for reference counting objects
+template<typename Base>
+class RefCountedObject : public Base
+{
+public:
+ RefCountedObject(IObject *pOwner = nullptr) :
+ m_pRefCounters(nullptr)
+ {
+ if( pOwner )
+ {
+ auto *pRefCounters = pOwner->GetReferenceCounters();
+ VERIFY(pRefCounters, "Reference counters are not initialized in the owner object");
+ m_pRefCounters = ValidatedCast<IReferenceCounters>( pRefCounters );
+ }
+ else
+ {
+ m_pRefCounters = RefCountersImpl::Create(this);
+ }
+ };
+
+ virtual ~RefCountedObject()
+ {
+ // WARNING! m_pRefCounters pointer might be expired in scenarios like this:
+ //
+ // A ==sp==> B ---wp---> A
+ //
+ // RefCounters_A.ReleaseStrongRef(){ // NumStrongRef == 0, NumWeakRef == 1
+ // delete A{
+ // A.~dtor(){
+ // B.~dtor(){
+ // wpA.ReleaseWeakRef(){ // NumStrongRef == 0, NumWeakRef == 0
+ // delete RefCounters_A;
+ // ...
+ // VERIFY( m_pRefCounters->GetNumStrongRefs() == 0 // Access violation!
+
+ // This also may happen if one thread is executing ReleaseStrongRef(), while
+ // another one is simultaneously running ReleaseWeakRef().
+
+ //VERIFY( m_pRefCounters->GetNumStrongRefs() == 0,
+ // "There remain strong references to the object being destroyed" );
+ };
+
+ virtual IReferenceCounters* GetReferenceCounters()const override
+ {
+ return m_pRefCounters;
+ }
+
+ virtual Atomics::Long AddRef()override
+ {
+ return m_pRefCounters->AddStrongRef();
+ }
+
+ virtual Atomics::Long Release()override
+ {
+ return m_pRefCounters->ReleaseStrongRef();
+ }
+
+
+private:
+
+ class RefCountersImpl : public IReferenceCounters
+ {
+ public:
+ static RefCountersImpl* Create( RefCountedObject *pOwner )
+ {
+ return new RefCountersImpl( pOwner );
+ }
+
+ virtual Atomics::Long AddStrongRef()override
+ {
+ VERIFY( m_pObject, "Attempting to increment strong reference counter for a destroyed object!" );
+ return Atomics::AtomicIncrement(m_lNumStrongReferences);
+ }
+
+ virtual Atomics::Long ReleaseStrongRef()override
+ {
+ // If the object is about to be destroyed, we must assure that no other
+ // thread is accessing the ENTIRE REFERENCE COUNTERS OBJECT at the same time.
+ // (Protecting only the pointer is not sufficient!)
+ // The problem may arise if a weak pointer in some other thread is trying to
+ // obtain access to the object.
+ // The safest way is to always protect the entire function:
+ ThreadingTools::LockHelper Lock(m_LockFlag);
+
+ // It is unsafe to not always lock.
+ // For instance, locking if there is only one strong reference left
+ // if( m_lNumStrongReferences == 1 )
+ // Lock.Lock( m_LockFlag );
+ // may fail. Suppose the following scenario:
+ //
+ // This thread | Another thread
+ // | 1. Start releasing another strong
+ // | reference to this object
+ // 1. Read m_lNumStrongReferences==2 | 2. Read m_lNumStrongReferences==2
+ // No lock acquired | 3. Decrement the counter,
+ // | m_lNumStrongReferences==1
+ // 2. Decrement the counter, |
+ // m_lNumStrongReferences==0, |
+ // and the object will be |
+ // destroyed without locking |
+
+
+ // Likewise locking if there is at least one weak reference
+ // if( m_lNumWeakReferences > 0 )
+ // Lock.Lock( m_LockFlag );
+ // may also fail. Suppose the following scenario:
+ //
+ // This thread | Another thread
+ // |
+ // 1. Read m_lNumWeakReferences==0 | 1. Start creating weak reference
+ // No lock acquired | from another strong reference object
+ // | 2. Call AddWeakRef(),
+ // | m_lNumWeakReferences==1
+ // | 3. Call Release() on the original strong
+ // | referenceo bject, m_lNumStrongReferences==1
+ // | 4. Start creating another strong reference
+ // | from the weak pointer, acquired lock and
+ // | read m_pObject
+ // 2. Destroy the object |
+ // | 5. Attempt to create strong reference from
+ // | invalidated pointer
+
+ // Both situations are unlikely to happen. However, they show that
+ // conditional locking is not safe. There might be other more probable
+ // situations
+ auto RefCount = Atomics::AtomicDecrement(m_lNumStrongReferences);
+ VERIFY( RefCount >= 0, "Inconsistent call to ReleaseStrongRef()" );
+ if( RefCount == 0 )
+ {
+ // Locking the object here is also not safe as antoher thread
+ // may be running GetObject(). If it obtains the lock first, it will
+ // get the pointer to the object which will then be destroyed by this
+ // thread
+
+ VERIFY(m_pObject, "Object pointer is null, which means it has already been destroyed");
+ // There are no more STRONG references to the object and it is about to be
+ // destroyed. There could be weak references, so reference counters
+ // can remain alive after the object itself is destroyed.
+
+ // Note that since reference counters are locked, no weak pointers can access
+ // m_pObject while the object is being deleted.
+
+ // We cannot destroy the object while reference counters are locked as this will
+ // cause a deadlock in cases like this:
+ //
+ // A ==sp==> B ---wp---> A
+ //
+ // RefCounters_A.Lock();
+ // delete A{
+ // A.~dtor(){
+ // B.~dtor(){
+ // wpA.ReleaseWeakRef(){
+ // RefCounters_A.Lock(); // Deadlock
+ //
+
+ // So we store the pointer to the object and destory it after unlocking the
+ // reference counters
+ auto *pObj = m_pObject;
+
+ // In a multithreaded environment, reference counters object may
+ // be destroyed at any time while m_pObject->~dtor() is running.
+ // NOTE: m_pObject may not be the only object referencing m_pRefCounters.
+ // All objects that are owned by m_pObject will point to the same
+ // reference counters object.
+ m_pObject->m_pRefCounters = nullptr;
+
+ // Note that this is the only place where m_pObject member can be modified
+ // after the reference counters object has been created
+ m_pObject = nullptr;
+ // The object is now detached from the reference counters and it is if
+ // it was destroyed since no one can obtain access to it.
+
+ // It is essentially important to check the number of weak references
+ // while the object is locked. Otherwise reference counters object
+ // may be destroyed twice if ReleaseWeakRef() is executed by other thread:
+ //
+ // This thread | Another thread - ReleaseWeakRef()
+ // |
+ // 1. Decrement m_lNumStrongReferences,| 1. Decrement m_lNumWeakReferences,
+ // m_lNumStrongReferences==0 | m_lNumWeakReferences == 0
+ // |
+ // 2. Destroy the object | 2. Destroy the object
+ //
+ bool bDestroyThis = m_lNumWeakReferences == 0;
+
+ // We must explicitly unlock the object now to avoid deadlocks. Also,
+ // if this is deleted, this->m_LockFlag will expire, which will cause
+ // Lock.~LockHelper() to crash
+ Lock.Unlock();
+
+ // Destroy referenced object
+ delete pObj;
+
+ // Note that this may be destroyed here already,
+ // see comments in ~RefCountedObject()
+ if( bDestroyThis )
+ delete this;
+ }
+
+ return RefCount;
+ }
+
+ virtual Atomics::Long AddWeakRef()override
+ {
+ return Atomics::AtomicIncrement(m_lNumWeakReferences);
+ }
+
+ virtual Atomics::Long ReleaseWeakRef()override
+ {
+ ThreadingTools::LockHelper Lock(m_LockFlag);
+ // It is essentially important to check the number of references
+ // while the object is locked. Otherwise reference counters object
+ // may be destroyed twice if ReleaseStrongRef() is executed by other
+ // thread.
+ auto NumWeakReferences = Atomics::AtomicDecrement(m_lNumWeakReferences);
+ VERIFY( NumWeakReferences >= 0, "Inconsistent call to ReleaseWeakRef()" );
+ if( NumWeakReferences == 0 && m_lNumStrongReferences == 0 )
+ {
+ // There are no more references to the ref counters object.
+ // We can safely unlock it and destroy.
+ // If we do not unlock it, this->m_LockFlag will expire,
+ // which will cause Lock.~LockHelper() to crash.
+ Lock.Unlock();
+ delete this;
+ }
+ return NumWeakReferences;
+ }
+
+ virtual void GetObject( class IObject **ppObject )override
+ {
+ // We need to lock the object before accessing it to prevent
+ // deletion of the referenced object in another thread.
+ // The thread which is about to delete the object locks it and
+ // decrements the reference counter only after it gets exclusive access.
+ // So if we obtain mutex first, we will increase the reference counter
+ // before the other thread decrements it. Thus the object will not
+ // be deleted.
+ ThreadingTools::LockHelper Lock(m_LockFlag);
+ if( m_pObject )
+ {
+ // QueryInterface() must not lock the object, or a deadlock happens.
+ // The only other two methods that lock the object are ReleaseStrongRef()
+ // and ReleaseWeakRef(), which are never called by QueryInterface()
+ m_pObject->QueryInterface(Diligent::IID_Unknown, ppObject);
+ }
+ }
+
+ virtual Atomics::Long GetNumStrongRefs()const override
+ {
+ return m_lNumStrongReferences;
+ }
+
+ virtual Atomics::Long GetNumWeakRefs()const override
+ {
+ return m_lNumWeakReferences;
+ }
+
+ private:
+ RefCountersImpl(RefCountedObject *pOwner) :
+ m_pObject(pOwner)
+ {
+ VERIFY(m_pObject, "Owner must not be null");
+ m_lNumStrongReferences = 0;
+ m_lNumWeakReferences = 0;
+ }
+
+ ~RefCountersImpl()
+ {
+ VERIFY( m_lNumStrongReferences == 0 && m_lNumWeakReferences == 0,
+ "There exist outstanding references to the object being destroyed" );
+ }
+
+ // No copies/moves
+ RefCountersImpl(const RefCountersImpl&);
+ RefCountersImpl(RefCountersImpl&&);
+ RefCountersImpl& operator = (const RefCountersImpl&);
+ RefCountersImpl& operator = (RefCountersImpl&&);
+
+ // It is crucially important that the type of the pointer
+ // is RefCountedObject and not IObject, since the latter
+ // does not have virtual dtor.
+ RefCountedObject *m_pObject;
+ Atomics::AtomicLong m_lNumStrongReferences;
+ Atomics::AtomicLong m_lNumWeakReferences;
+ ThreadingTools::LockFlag m_LockFlag;
+ };
+
+ // Reference counters pointer cannot be of type RefCountersImpl*,
+ // because when an owner pointer is provided to RefCountedObject(),
+ // the type of pOwner->GetReferenceCounters() may not be convertible
+ // to RefCountedObject<Base>::RefCountersImpl*.
+ IReferenceCounters *m_pRefCounters;
+};
+
+}
diff --git a/Common/include/StringTools.h b/Common/include/StringTools.h
new file mode 100644
index 00000000..687eeef8
--- /dev/null
+++ b/Common/include/StringTools.h
@@ -0,0 +1,75 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include <string>
+#include <sstream>
+#include <locale>
+
+namespace Diligent
+{
+
+inline std::string NarrowString(const std::wstring &WideStr)
+{
+ std::string NarrowStr;
+ const std::ctype<wchar_t>& ctfacet = std::use_facet< std::ctype<wchar_t> >( std::wstringstream().getloc() ) ;
+ for( std::wstring::const_iterator CurrWChar = WideStr.begin();
+ CurrWChar != WideStr.end();
+ CurrWChar++ )
+ NarrowStr.push_back( ctfacet.narrow( *CurrWChar, 0 ) );
+
+ return NarrowStr;
+}
+
+inline std::wstring WidenString(const std::string &Str)
+{
+ std::wstring WideStr;
+ const std::ctype<wchar_t>& ctfacet = std::use_facet< std::ctype<wchar_t> >( std::wstringstream().getloc() ) ;
+ for( std::string::const_iterator CurrChar = Str.begin();
+ CurrChar != Str.end();
+ CurrChar++ )
+ WideStr.push_back( ctfacet.widen( *CurrChar ) );
+
+ return WideStr;
+}
+
+inline int StrCmpNoCase(const char* Str1, const char* Str2, size_t NumChars)
+{
+#ifdef PLATFORM_ANDROID
+# define _strnicmp strncasecmp
+#endif
+
+ return _strnicmp( Str1, Str2, NumChars );
+}
+
+inline int StrCmpNoCase(const char* Str1, const char* Str2)
+{
+#ifdef PLATFORM_ANDROID
+# define _stricmp strcasecmp
+#endif
+
+ return _stricmp( Str1, Str2 );
+}
+
+}
diff --git a/Common/include/Timer.h b/Common/include/Timer.h
new file mode 100644
index 00000000..5e3dfe54
--- /dev/null
+++ b/Common/include/Timer.h
@@ -0,0 +1,41 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include <chrono>
+
+namespace Diligent
+{
+ class Timer
+ {
+ public:
+ Timer();
+ void Restart();
+ double GetElapsedTime()const;
+ float GetElapsedTimef()const;
+
+ private:
+ std::chrono::high_resolution_clock::time_point m_StartTime;
+ };
+}
diff --git a/Common/include/UniqueIdentifier.h b/Common/include/UniqueIdentifier.h
new file mode 100644
index 00000000..e4fd7159
--- /dev/null
+++ b/Common/include/UniqueIdentifier.h
@@ -0,0 +1,79 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "Atomics.h"
+
+namespace Diligent
+{
+ typedef Atomics::Long UniqueIdentifier;
+
+ // Template switch is used to have distinct counters
+ // for unrelated groups of objects
+ template<typename ObjectsClass>
+ class UniqueIdHelper
+ {
+ public:
+ UniqueIdHelper() :
+ m_ID(0),
+ m_bIsInitialized( false )
+ {}
+
+ UniqueIdHelper( UniqueIdHelper&& RHS) :
+ m_ID( RHS.m_ID ),
+ m_bIsInitialized( RHS.m_bIsInitialized )
+ {
+ RHS.m_ID = 0;
+ RHS.m_bIsInitialized = false;
+ }
+
+ const UniqueIdHelper& operator = (UniqueIdHelper&& RHS)
+ {
+ m_ID = RHS.m_ID;
+ m_bIsInitialized = RHS.m_bIsInitialized;
+ RHS.m_ID = 0;
+ RHS.m_bIsInitialized = false;
+
+ return *this;
+ }
+
+ UniqueIdentifier GetID()const
+ {
+ if( !m_bIsInitialized )
+ {
+ static Atomics::AtomicLong sm_GlobalCounter;
+ m_ID = Atomics::AtomicIncrement(sm_GlobalCounter);
+ m_bIsInitialized = true;
+ }
+ return m_ID;
+ }
+
+ private:
+ UniqueIdHelper( const UniqueIdHelper& );
+ const UniqueIdHelper& operator = ( const UniqueIdHelper& );
+
+ mutable UniqueIdentifier m_ID;
+ mutable bool m_bIsInitialized;
+ };
+}
diff --git a/Common/include/ValidatedCast.h b/Common/include/ValidatedCast.h
new file mode 100644
index 00000000..916148c4
--- /dev/null
+++ b/Common/include/ValidatedCast.h
@@ -0,0 +1,33 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "DebugUtilities.h"
+
+template<typename DstType, typename SrcType>
+DstType* ValidatedCast( SrcType *Ptr )
+{
+ CHECK_DYNAMIC_TYPE( DstType, Ptr );
+ return static_cast<DstType*>( Ptr );
+}
diff --git a/Common/include/pch.h b/Common/include/pch.h
new file mode 100644
index 00000000..8b5e042b
--- /dev/null
+++ b/Common/include/pch.h
@@ -0,0 +1,35 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include "PlatformDefinitions.h"
+#include "BasicTypes.h"
+#include "Errors.h"
+#include "FileWrapper.h"
+#include "RefCntAutoPtr.h" \ No newline at end of file
diff --git a/Common/interface/AdvancedMath.h b/Common/interface/AdvancedMath.h
new file mode 100644
index 00000000..c4af54ad
--- /dev/null
+++ b/Common/interface/AdvancedMath.h
@@ -0,0 +1,127 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+#include "BasicMath.h"
+
+// Structure describing a plane
+struct Plane3D
+{
+ float3 Normal;
+ float Distance; //Distance from the coordinate system origin to the plane along the normal direction
+};
+
+struct ViewFrustum
+{
+ Plane3D LeftPlane, RightPlane, BottomPlane, TopPlane, NearPlane, FarPlane;
+};
+
+// For OpenGL, matrix is still considered row-major. The only difference is that
+// near clip plane is at -1, not 0.
+inline void ExtractViewFrustumPlanesFromMatrix(const float4x4 &Matrix, ViewFrustum &ViewFrustum, bool bIsDirectX)
+{
+ // For more details, see Gribb G., Hartmann K., "Fast Extraction of Viewing Frustum Planes from the
+ // World-View-Projection Matrix" (the paper is available at
+ // http://gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf)
+
+ // Left clipping plane
+ ViewFrustum.LeftPlane.Normal.x = Matrix._14 + Matrix._11;
+ ViewFrustum.LeftPlane.Normal.y = Matrix._24 + Matrix._21;
+ ViewFrustum.LeftPlane.Normal.z = Matrix._34 + Matrix._31;
+ ViewFrustum.LeftPlane.Distance = Matrix._44 + Matrix._41;
+
+ // Right clipping plane
+ ViewFrustum.RightPlane.Normal.x = Matrix._14 - Matrix._11;
+ ViewFrustum.RightPlane.Normal.y = Matrix._24 - Matrix._21;
+ ViewFrustum.RightPlane.Normal.z = Matrix._34 - Matrix._31;
+ ViewFrustum.RightPlane.Distance = Matrix._44 - Matrix._41;
+
+ // Top clipping plane
+ ViewFrustum.TopPlane.Normal.x = Matrix._14 - Matrix._12;
+ ViewFrustum.TopPlane.Normal.y = Matrix._24 - Matrix._22;
+ ViewFrustum.TopPlane.Normal.z = Matrix._34 - Matrix._32;
+ ViewFrustum.TopPlane.Distance = Matrix._44 - Matrix._42;
+
+ // Bottom clipping plane
+ ViewFrustum.BottomPlane.Normal.x = Matrix._14 + Matrix._12;
+ ViewFrustum.BottomPlane.Normal.y = Matrix._24 + Matrix._22;
+ ViewFrustum.BottomPlane.Normal.z = Matrix._34 + Matrix._32;
+ ViewFrustum.BottomPlane.Distance = Matrix._44 + Matrix._42;
+
+ // Near clipping plane
+ if( bIsDirectX )
+ {
+ // 0 <= z <= w
+ ViewFrustum.NearPlane.Normal.x = Matrix._13;
+ ViewFrustum.NearPlane.Normal.y = Matrix._23;
+ ViewFrustum.NearPlane.Normal.z = Matrix._33;
+ ViewFrustum.NearPlane.Distance = Matrix._43;
+ }
+ else
+ {
+ // -w <= z <= w
+ ViewFrustum.NearPlane.Normal.x = Matrix._14 + Matrix._13;
+ ViewFrustum.NearPlane.Normal.y = Matrix._24 + Matrix._23;
+ ViewFrustum.NearPlane.Normal.z = Matrix._34 + Matrix._33;
+ ViewFrustum.NearPlane.Distance = Matrix._44 + Matrix._43;
+ }
+
+ // Far clipping plane
+ ViewFrustum.FarPlane.Normal.x = Matrix._14 - Matrix._13;
+ ViewFrustum.FarPlane.Normal.y = Matrix._24 - Matrix._23;
+ ViewFrustum.FarPlane.Normal.z = Matrix._34 - Matrix._33;
+ ViewFrustum.FarPlane.Distance = Matrix._44 - Matrix._43;
+}
+
+
+
+struct BoundBox
+{
+ float fMinX, fMaxX, fMinY, fMaxY, fMinZ, fMaxZ;
+};
+
+// Tests if bounding box is visible by the camera
+inline bool IBoxVisible(const ViewFrustum &ViewFrustum, const BoundBox &Box)
+{
+ Plane3D *pPlanes = (Plane3D *)&ViewFrustum;
+ // If bounding box is "behind" some plane, then it is invisible
+ // Otherwise it is treated as visible
+ for(int iViewFrustumPlane = 0; iViewFrustumPlane < 6; iViewFrustumPlane++)
+ {
+ Plane3D *pCurrPlane = pPlanes + iViewFrustumPlane;
+ float3 *pCurrNormal = &pCurrPlane->Normal;
+ float3 MaxPoint;
+
+ MaxPoint.x = (pCurrNormal->x > 0) ? Box.fMaxX : Box.fMinX;
+ MaxPoint.y = (pCurrNormal->y > 0) ? Box.fMaxY : Box.fMinY;
+ MaxPoint.z = (pCurrNormal->z > 0) ? Box.fMaxZ : Box.fMinZ;
+
+ float DMax = dot( MaxPoint, *pCurrNormal ) + pCurrPlane->Distance;
+
+ if( DMax < 0 )
+ return false;
+ }
+
+ return true;
+}
diff --git a/Common/interface/BasicMath.h b/Common/interface/BasicMath.h
new file mode 100644
index 00000000..95b35974
--- /dev/null
+++ b/Common/interface/BasicMath.h
@@ -0,0 +1,1344 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+//// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+//// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+//// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+//// PARTICULAR PURPOSE.
+////
+//// Copyright (c) Microsoft Corporation. All rights reserved
+
+#pragma once
+
+#include "DebugUtilities.h"
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+
+// This header defines math and matrix helper functions and structures used
+// by DirectX SDK samples.
+
+// Common Constants
+
+#define PI_F 3.1415927f
+
+// Template Vector & Matrix Classes
+template <class T> struct Matrix4x4;
+template <class T> struct Vector4;
+
+template <class T> struct Vector2
+{
+ union
+ {
+ struct
+ {
+ T x;
+ T y;
+ };
+ struct
+ {
+ T r;
+ T g;
+ };
+ struct
+ {
+ T u;
+ T v;
+ };
+ };
+
+
+ Vector2 operator-(const Vector2<T> &right)const
+ {
+ return Vector2(x - right.x, y - right.y);
+ }
+
+ Vector2& operator-=(const Vector2<T> &right)
+ {
+ x -= right.x;
+ y -= right.y;
+ return *this;
+ }
+
+ Vector2 operator-()const
+ {
+ return Vector2(-x, -y);
+ }
+
+ Vector2 operator+(const Vector2<T> &right)const
+ {
+ return Vector2(x + right.x, y + right.y);
+ }
+
+ Vector2& operator+=(const Vector2<T> &right)
+ {
+ x += right.x;
+ y += right.y;
+ return *this;
+ }
+
+ Vector2 operator*(T s)const
+ {
+ return Vector2(x * s, y * s);
+ }
+
+ Vector2 operator*(const Vector2 &right)const
+ {
+ return Vector2(x * right.x, y * right.y);
+ }
+
+ Vector2& operator*=( const Vector2 &right)
+ {
+ x *= right.x;
+ y *= right.y;
+ return *this;
+ }
+
+ Vector2& operator*=( T s)
+ {
+ x *= s;
+ y *= s;
+ return *this;
+ }
+
+ Vector2 operator/(const Vector2 &right)const
+ {
+ return Vector2(x / right.x, y / right.y);
+ }
+
+ Vector2& operator/=( const Vector2 &right)
+ {
+ x /= right.x;
+ y /= right.y;
+ return *this;
+ }
+
+ Vector2 operator/(T s)const
+ {
+ return Vector2(x / s, y / s);
+ }
+
+ Vector2& operator/=( T s)
+ {
+ x /= s;
+ y /= s;
+ return *this;
+ }
+
+ bool operator == (const Vector2 &right)const
+ {
+ return x == right.x && y == right.y;
+ }
+
+ bool operator != (const Vector2 &right)const
+ {
+ return !(*this == right);
+ }
+
+ Vector2 operator < ( const Vector2 &right )const
+ {
+ return Vector2(x < right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y < right.y ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector2 operator > ( const Vector2 &right )const
+ {
+ return Vector2(x > right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y > right.y ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector2 operator <= ( const Vector2 &right )const
+ {
+ return Vector2(x <= right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y <= right.y ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector2 operator >= ( const Vector2 &right )const
+ {
+ return Vector2(x >= right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y >= right.y ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ T& operator[](size_t index)
+ {
+ return reinterpret_cast<T*>(this)[index];
+ }
+
+ const T& operator[](size_t index)const
+ {
+ return reinterpret_cast<const T*>(this)[index];
+ }
+
+ explicit
+ Vector2(T _x = 0, T _y = 0) : x(_x), y(_y) { }
+};
+
+template <class T>
+Vector2<T> operator*(T s, const Vector2<T> &a)
+{
+ return a * s;
+}
+
+
+template <class T> struct Vector3
+{
+ union
+ {
+ struct
+ {
+ T x;
+ T y;
+ T z;
+ };
+ struct
+ {
+ T r;
+ T g;
+ T b;
+ };
+ struct
+ {
+ T u;
+ T v;
+ T w;
+ };
+ };
+
+
+ Vector3 operator-( const Vector3 &right )const
+ {
+ return Vector3(x - right.x, y - right.y, z - right.z);
+ }
+
+ Vector3 operator-()const
+ {
+ return Vector3(-x, -y, -z);
+ }
+
+ Vector3& operator-=(const Vector3<T> &right)
+ {
+ x -= right.x;
+ y -= right.y;
+ z -= right.z;
+ return *this;
+ }
+
+ Vector3 operator+( const Vector3 &right )const
+ {
+ return Vector3(x + right.x, y + right.y, z + right.z);
+ }
+
+ Vector3& operator+=(const Vector3<T> &right)
+ {
+ x += right.x;
+ y += right.y;
+ z += right.z;
+ return *this;
+ }
+
+ Vector3 operator*( T s )const
+ {
+ return Vector3(x * s, y * s, z * s);
+ }
+
+ Vector3& operator*=( T s)
+ {
+ x *= s;
+ y *= s;
+ z *= s;
+ return *this;
+ }
+
+ Vector3 operator*( const Vector3 &right )const
+ {
+ return Vector3(x * right.x, y * right.y, z * right.z);
+ }
+
+ Vector3 operator* (const Matrix4x4<T>& m)const
+ {
+ Vector4<T> out4 = Vector4<T>(x, y, z, 1) * m;
+ return Vector3(out4.x / out4.w, out4.y / out4.w, out4.z / out4.w) ;
+ }
+
+ Vector3& operator*=( const Vector3 &right)
+ {
+ x *= right.x;
+ y *= right.y;
+ z *= right.z;
+ return *this;
+ }
+
+ Vector3 operator/ ( T s)const
+ {
+ return Vector3(x / s, y / s, z / s);
+ }
+
+ Vector3& operator/=( T s)
+ {
+ x /= s;
+ y /= s;
+ z /= s;
+ return *this;
+ }
+
+ Vector3 operator/( const Vector3 &right )const
+ {
+ return Vector3(x / right.x, y / right.y, z / right.z);
+ }
+
+ Vector3& operator/=( const Vector3 &right)
+ {
+ x /= right.x;
+ y /= right.y;
+ z /= right.z;
+ return *this;
+ }
+
+ bool operator == (const Vector3 &right)const
+ {
+ return x == right.x && y == right.y && z == right.z;
+ }
+
+ bool operator != (const Vector3 &right)const
+ {
+ return !(*this == right);
+ }
+
+ Vector3 operator < ( const Vector3 &right )const
+ {
+ return Vector3(x < right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y < right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z < right.z ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector3 operator > ( const Vector3 &right )const
+ {
+ return Vector3(x > right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y > right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z > right.z ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector3 operator <= ( const Vector3 &right )const
+ {
+ return Vector3(x <= right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y <= right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z <= right.z ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector3 operator >= ( const Vector3 &right )const
+ {
+ return Vector3(x >= right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y >= right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z >= right.z ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ T& operator[](size_t index)
+ {
+ return reinterpret_cast<T*>(this)[index];
+ }
+
+ const T& operator[](size_t index)const
+ {
+ return reinterpret_cast<const T*>(this)[index];
+ }
+
+ explicit
+ Vector3(T _x = 0, T _y = 0, T _z = 0) : x(_x), y(_y), z(_z) { }
+
+ operator Vector2<T>()const{return Vector2<T>(x,y);}
+};
+
+template <class T>
+Vector3<T> operator*(T s, const Vector3<T> &a)
+{
+ return a * s;
+}
+
+
+template <class T> struct Vector4
+{
+ union
+ {
+ struct
+ {
+ T x;
+ T y;
+ T z;
+ T w;
+ };
+ struct
+ {
+ T r;
+ T g;
+ T b;
+ T a;
+ };
+ };
+
+ Vector4 operator-( const Vector4 &right)const
+ {
+ return Vector4(x - right.x, y - right.y, z - right.z, w - right.w);
+ }
+
+ Vector4 operator-()const
+ {
+ return Vector4(-x, -y, -z, -w);
+ }
+
+ Vector4& operator-=(const Vector4<T> &right)
+ {
+ x -= right.x;
+ y -= right.y;
+ z -= right.z;
+ w -= right.w;
+ return *this;
+ }
+
+ Vector4 operator+( const Vector4 &right)const
+ {
+ return Vector4(x + right.x, y + right.y, z + right.z, w + right.w);
+ }
+
+ Vector4& operator+=(const Vector4<T> &right)
+ {
+ x += right.x;
+ y += right.y;
+ z += right.z;
+ w += right.w;
+ return *this;
+ }
+
+ Vector4 operator*( T s)const
+ {
+ return Vector4(x * s, y * s, z * s, w * s);
+ }
+
+ Vector4& operator*=( T s)
+ {
+ x *= s;
+ y *= s;
+ z *= s;
+ w *= s;
+ return *this;
+ }
+
+ Vector4 operator*( const Vector4 &right)const
+ {
+ return Vector4(x * right.x, y * right.y, z * right.z, w * right.w);
+ }
+
+ Vector4& operator*=( const Vector4 &right)
+ {
+ x *= right.x;
+ y *= right.y;
+ z *= right.z;
+ w *= right.w;
+ return *this;
+ }
+
+ Vector4 operator/( T s)const
+ {
+ return Vector4(x / s, y / s, z / s, w / s);
+ }
+
+ Vector4& operator/=( T s)
+ {
+ x /= s;
+ y /= s;
+ z /= s;
+ w /= s;
+ return *this;
+ }
+
+ Vector4 operator/( const Vector4 &right)const
+ {
+ return Vector4(x / right.x, y / right.y, z / right.z, w / right.w);
+ }
+
+ Vector4& operator/=( const Vector4 &right)
+ {
+ x /= right.x;
+ y /= right.y;
+ z /= right.z;
+ w /= right.w;
+ return *this;
+ }
+
+ bool operator == (const Vector4 &right)const
+ {
+ return x == right.x && y == right.y && z == right.z && w == right.w;
+ }
+
+ bool operator != (const Vector4 &right)const
+ {
+ return !(*this == right);
+ }
+
+ Vector4 operator*(const Matrix4x4<T>& m)const
+ {
+ Vector4 out;
+ out[0] = x * m[0][0] + y * m[1][0] + z * m[2][0] + w * m[3][0];
+ out[1] = x * m[0][1] + y * m[1][1] + z * m[2][1] + w * m[3][1];
+ out[2] = x * m[0][2] + y * m[1][2] + z * m[2][2] + w * m[3][2];
+ out[3] = x * m[0][3] + y * m[1][3] + z * m[2][3] + w * m[3][3];
+ return out;
+ }
+
+ Vector4& operator = (const Vector3<T> &v3)
+ {
+ x = v3.x;
+ y = v3.y;
+ z = v3.z;
+ w = 1;
+ return *this;
+ }
+ Vector4& operator = (const Vector4 &) = default;
+
+ Vector4 operator < ( const Vector4 &right )const
+ {
+ return Vector4(x < right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y < right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z < right.z ? static_cast<T>(1) : static_cast<T>(0),
+ w < right.w ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector4 operator > ( const Vector4 &right )const
+ {
+ return Vector4(x > right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y > right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z > right.z ? static_cast<T>(1) : static_cast<T>(0),
+ w > right.w ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector4 operator <= ( const Vector4 &right )const
+ {
+ return Vector4(x <= right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y <= right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z <= right.z ? static_cast<T>(1) : static_cast<T>(0),
+ w <= right.w ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ Vector4 operator >= ( const Vector4 &right )const
+ {
+ return Vector4(x >= right.x ? static_cast<T>(1) : static_cast<T>(0),
+ y >= right.y ? static_cast<T>(1) : static_cast<T>(0),
+ z >= right.z ? static_cast<T>(1) : static_cast<T>(0),
+ w >= right.w ? static_cast<T>(1) : static_cast<T>(0));
+ }
+
+ T& operator[](size_t index)
+ {
+ return reinterpret_cast<T*>(this)[index];
+ }
+
+ const T& operator[](size_t index)const
+ {
+ return reinterpret_cast<const T*>(this)[index];
+ }
+
+ explicit
+ Vector4(T _x = 0, T _y = 0, T _z = 0, T _w = 0) : x(_x), y(_y), z(_z), w(_w) { }
+};
+
+
+template <class T>
+Vector4<T> operator*(T s, const Vector4<T> &a)
+{
+ return a * s;
+}
+
+template <class T> struct Matrix3x3
+{
+ union
+ {
+ struct
+ {
+ T _11; T _12; T _13;
+ T _21; T _22; T _23;
+ T _31; T _32; T _33;
+ };
+ struct
+ {
+ T _m00; T _m01; T _m02;
+ T _m10; T _m11; T _m12;
+ T _m20; T _m21; T _m22;
+ };
+ };
+
+ explicit
+ Matrix3x3(T value = 0)
+ {
+ _11 = _12 = _13 =value;
+ _21 = _22 = _23 =value;
+ _31 = _32 = _33 =value;
+ }
+
+ explicit
+ Matrix3x3(
+ T i11, T i12, T i13,
+ T i21, T i22, T i23,
+ T i31, T i32, T i33 )
+ {
+ _11 = i11; _12 = i12; _13 = i13;
+ _21 = i21; _22 = i22; _23 = i23;
+ _31 = i31; _32 = i32; _33 = i33;
+ }
+
+ bool operator == (const Matrix3x3 &r)const
+ {
+ for( int i = 0; i < 3; ++i )
+ for( int j = 0; i < 3; ++i )
+ if( (*this)[i][j] != r[i][j] )
+ return false;
+
+ return true;
+ }
+
+ bool operator != (const Matrix3x3 &r)const
+ {
+ return !(*this == r);
+ }
+
+ T* operator[](size_t index)
+ {
+ return &(reinterpret_cast<T*>(this)[index*3]);
+ }
+
+ const T* operator[](size_t index)const
+ {
+ return &(reinterpret_cast<const T*>(this)[index*3]);
+ }
+
+ Matrix3x3& operator *=(T s)
+ {
+ for( int i = 0; i < 9; ++i )
+ (reinterpret_cast<T*>(this))[i] *= s;
+
+ return *this;
+ }
+};
+
+template <class T> struct Matrix4x4
+{
+ union
+ {
+ struct
+ {
+ T _11; T _12; T _13; T _14;
+ T _21; T _22; T _23; T _24;
+ T _31; T _32; T _33; T _34;
+ T _41; T _42; T _43; T _44;
+ };
+ struct
+ {
+ T _m00; T _m01; T _m02; T _m03;
+ T _m10; T _m11; T _m12; T _m13;
+ T _m20; T _m21; T _m22; T _m23;
+ T _m30; T _m31; T _m32; T _m33;
+ };
+ };
+
+ explicit
+ Matrix4x4(T value = 0)
+ {
+ _11 = _12 = _13 = _14 = value;
+ _21 = _22 = _23 = _24 = value;
+ _31 = _32 = _33 = _34 = value;
+ _41 = _42 = _43 = _44 = value;
+ }
+
+ explicit
+ Matrix4x4(
+ T i11, T i12, T i13, T i14,
+ T i21, T i22, T i23, T i24,
+ T i31, T i32, T i33, T i34,
+ T i41, T i42, T i43, T i44
+ )
+ {
+ _11 = i11; _12 = i12; _13 = i13; _14 = i14;
+ _21 = i21; _22 = i22; _23 = i23; _24 = i24;
+ _31 = i31; _32 = i32; _33 = i33; _34 = i34;
+ _41 = i41; _42 = i42; _43 = i43; _44 = i44;
+ }
+
+ bool operator == (const Matrix4x4 &r)const
+ {
+ for( int i = 0; i < 4; ++i )
+ for( int j = 0; i < 4; ++i )
+ if( (*this)[i][j] != r[i][j] )
+ return false;
+
+ return true;
+ }
+
+ bool operator != (const Matrix4x4 &r)const
+ {
+ return !(*this == r);
+ }
+
+ T* operator[](size_t index)
+ {
+ return &(reinterpret_cast<T*>(this)[index*4]);
+ }
+
+ const T* operator[](size_t index)const
+ {
+ return &(reinterpret_cast<const T*>(this)[index*4]);
+ }
+
+ Matrix4x4& operator *=(T s)
+ {
+ for( int i = 0; i < 16; ++i )
+ (reinterpret_cast<T*>(this))[i] *= s;
+
+ return *this;
+ }
+};
+
+// Template Vector Operations
+
+
+template <class T>
+T dot(const Vector2<T> &a, const Vector2<T> &b)
+{
+ return a.x * b.x + a.y * b.y;
+}
+
+template <class T>
+T dot(const Vector3<T> &a, const Vector3<T> &b)
+{
+ return a.x * b.x + a.y * b.y + a.z * b.z;
+}
+
+template <class T>
+T dot(const Vector4<T> &a, const Vector4<T> &b)
+{
+ return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
+}
+
+template <class VectorType>
+auto length(const VectorType &a)->decltype(dot(a,a))
+{
+ return sqrt( dot(a,a) );
+}
+
+
+template <class T>
+Vector3<T> min(const Vector3<T> &a, const Vector3<T> &b)
+{
+ return Vector3<T>( std::min(a.x, b.x), std::min(a.y, b.y), std::min(a.z, b.z) );
+}
+
+template <class T>
+Vector4<T> min(const Vector4<T> &a, const Vector4<T> &b)
+{
+ return Vector4<T>( std::min(a.x, b.x), std::min(a.y, b.y), std::min(a.z, b.z), std::min(a.w, b.w) );
+}
+
+template <class T>
+Vector3<T> max(const Vector3<T> &a, const Vector3<T> &b)
+{
+ return Vector3<T>( std::max(a.x, b.x), std::max(a.y, b.y), std::max(a.z, b.z) );
+}
+
+template <class T>
+Vector4<T> max(const Vector4<T> &a, const Vector4<T> &b)
+{
+ return Vector4<T>( std::max(a.x, b.x), std::max(a.y, b.y), std::max(a.z, b.z), std::max(a.w, b.w) );
+}
+
+template <class T>
+Vector2<T> abs(const Vector2<T> &a)
+{
+ // WARNING: abs() on gcc is for integers only!
+ return Vector2<T>( a.x < 0 ? -a.x : a.x,
+ a.y < 0 ? -a.y : a.y);
+}
+
+template <class T>
+Vector3<T> abs(const Vector3<T> &a)
+{
+ // WARNING: abs() on gcc is for integers only!
+ return Vector3<T>( a.x < 0 ? -a.x : a.x,
+ a.y < 0 ? -a.y : a.y,
+ a.z < 0 ? -a.z : a.z);
+}
+
+template <class T>
+Vector4<T> abs(const Vector4<T> &a)
+{
+ // WARNING: abs() on gcc is for integers only!
+ return Vector4<T>( a.x < 0 ? -a.x : a.x,
+ a.y < 0 ? -a.y : a.y,
+ a.z < 0 ? -a.z : a.z,
+ a.w < 0 ? -a.w : a.w);
+}
+
+
+template <class T>
+Vector3<T> cross(const Vector3<T> &a, const Vector3<T> &b)
+{
+ // | i j k |
+ // | a.x a.y a.z |
+ // | b.x b.y b.z |
+ return Vector3<T>((a.y*b.z)-(a.z*b.y), (a.z*b.x)-(a.x*b.z), (a.x*b.y)-(a.y*b.x));
+}
+
+template <class VectorType>
+VectorType normalize(const VectorType &a)
+{
+ auto len = length(a);
+ return a / len;
+}
+
+
+// Template Matrix Operations
+
+template <class T>
+Matrix4x4<T> transposeMatrix(const Matrix4x4<T> &m)
+{
+ return Matrix4x4<T>(
+ m._11, m._21, m._31, m._41,
+ m._12, m._22, m._32, m._42,
+ m._13, m._23, m._33, m._43,
+ m._14, m._24, m._34, m._44
+ );
+}
+
+template <class T>
+Matrix4x4<T> mul(const Matrix4x4<T> &m1, const Matrix4x4<T> &m2)
+{
+ Matrix4x4<T> mOut;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for (int j = 0; j < 4; j++)
+ {
+ for (int k = 0; k < 4; k++)
+ {
+ mOut[i][j] += m1[i][k] * m2[k][j];
+ }
+ }
+ }
+
+ return mOut;
+}
+
+template <class T>
+Matrix4x4<T> operator* (const Matrix4x4<T> &m1, const Matrix4x4<T> &m2)
+{
+ return mul( m1, m2 );
+}
+
+
+
+template <class T>
+Matrix3x3<T> transposeMatrix(const Matrix3x3<T> &m)
+{
+ return Matrix3x3<T>(
+ m._11, m._21, m._31,
+ m._12, m._22, m._32,
+ m._13, m._23, m._33
+ );
+}
+
+template <class T>
+Matrix3x3<T> mul(const Matrix3x3<T> &m1, const Matrix3x3<T> &m2)
+{
+ Matrix3x3<T> mOut;
+
+ for (int i = 0; i < 3; i++)
+ {
+ for (int j = 0; j < 3; j++)
+ {
+ for (int k = 0; k < 3; k++)
+ {
+ mOut[i][j] += m1[i][k] * m2[k][j];
+ }
+ }
+ }
+
+ return mOut;
+}
+
+template <class T>
+Matrix3x3<T> operator* (const Matrix3x3<T> &m1, const Matrix3x3<T> &m2)
+{
+ return mul( m1, m2 );
+}
+
+// Common HLSL-compatible vector typedefs
+
+typedef unsigned int uint;
+
+typedef Vector2<float> float2;
+typedef Vector3<float> float3;
+typedef Vector4<float> float4;
+
+typedef Matrix4x4<float> float4x4;
+typedef Matrix3x3<float> float3x3;
+
+// Standard Matrix Intializers
+
+inline float4x4 identityMatrix()
+{
+ return float4x4(1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1);
+}
+
+inline float4x4 translationMatrix(float x, float y, float z)
+{
+ return float4x4 (1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ x, y, z, 1);
+}
+
+inline float4x4 translationMatrix( const float3 &v )
+{
+ return translationMatrix( v.x, v.y, v.z );
+}
+
+
+inline float4x4 scaleMatrix(float x, float y, float z)
+{
+ return float4x4(x, 0, 0, 0,
+ 0, y, 0, 0,
+ 0, 0, z, 0,
+ 0, 0, 0, 1);
+}
+
+inline float4x4 rotationX(float degreeX)
+{
+ float angleInRadians = degreeX * (PI_F / 180.0f);
+
+ float sinAngle = sinf(angleInRadians);
+ float cosAngle = cosf(angleInRadians);
+
+ float4x4 mOut;
+
+ UNSUPPORTED("This function is not tested, it might be incorrect.")
+ mOut._11 = 1.0f; mOut._12 = 0.0f; mOut._13 = 0.0f; mOut._14 = 0.0f;
+ mOut._21 = 0.0f; mOut._22 = cosAngle; mOut._23 = -sinAngle; mOut._24 = 0.0f;
+ mOut._31 = 0.0f; mOut._32 = sinAngle; mOut._33 = cosAngle; mOut._34 = 0.0f;
+ mOut._41 = 0.0f; mOut._42 = 0.0f; mOut._43 = 0.0f; mOut._44 = 1.0f;
+
+ return mOut;
+}
+
+inline float4x4 rotationY(float degreeY)
+{
+ float angleInRadians = degreeY * (PI_F / 180.0f);
+
+ float sinAngle = sinf(angleInRadians);
+ float cosAngle = cosf(angleInRadians);
+
+ float4x4 mOut;
+
+ UNSUPPORTED("This function is not tested, it might be incorrect.")
+ mOut._11 = cosAngle; mOut._12 = 0.0f; mOut._13 = sinAngle; mOut._14 = 0.0f;
+ mOut._21 = 0.0f; mOut._22 = 1.0f; mOut._23 = 0.0f; mOut._24 = 0.0f;
+ mOut._31 = -sinAngle; mOut._32 = 0.0f; mOut._33 = cosAngle; mOut._34 = 0.0f;
+ mOut._41 = 0.0f; mOut._42 = 0.0f; mOut._43 = 0.0f; mOut._44 = 1.0f;
+
+ return mOut;
+}
+
+inline float4x4 rotationZ(float degreeZ)
+{
+ float angleInRadians = degreeZ * (PI_F / 180.0f);
+
+ float sinAngle = sinf(angleInRadians);
+ float cosAngle = cosf(angleInRadians);
+
+ float4x4 mOut;
+
+ UNSUPPORTED("This function is not tested, it might be incorrect.")
+ mOut._11 = cosAngle; mOut._12 = -sinAngle; mOut._13 = 0.0f; mOut._14 = 0.0f;
+ mOut._21 = sinAngle; mOut._22 = cosAngle; mOut._23 = 0.0f; mOut._24 = 0.0f;
+ mOut._31 = 0.0f; mOut._32 = 0.0f; mOut._33 = 1.0f; mOut._34 = 0.0f;
+ mOut._41 = 0.0f; mOut._42 = 0.0f; mOut._43 = 0.0f; mOut._44 = 1.0f;
+
+ return mOut;
+}
+
+// 3D Rotation matrix for an arbitrary axis specified by x, y and z
+inline float4x4 rotationArbitrary(float3 axis, float degree)
+{
+ UNSUPPORTED("This function is not tested, it might be incorrect")
+
+ axis = normalize(axis);
+
+ float angleInRadians = degree * (PI_F / 180.0f);
+
+ float sinAngle = sinf(angleInRadians);
+ float cosAngle = cosf(angleInRadians);
+ float oneMinusCosAngle = 1 - cosAngle;
+
+ float4x4 mOut;
+
+ mOut._11 = 1.0f + oneMinusCosAngle * (axis.x * axis.x - 1.0f);
+ mOut._12 = axis.z * sinAngle + oneMinusCosAngle * axis.x * axis.y;
+ mOut._13 = -axis.y * sinAngle + oneMinusCosAngle * axis.x * axis.z;
+ mOut._41 = 0.0f;
+
+ mOut._21 = -axis.z * sinAngle + oneMinusCosAngle * axis.y * axis.x;
+ mOut._22 = 1.0f + oneMinusCosAngle * (axis.y * axis.y - 1.0f);
+ mOut._23 = axis.x * sinAngle + oneMinusCosAngle * axis.y * axis.z;
+ mOut._24 = 0.0f;
+
+ mOut._31 = axis.y * sinAngle + oneMinusCosAngle * axis.z * axis.x;
+ mOut._32 = -axis.x * sinAngle + oneMinusCosAngle * axis.z * axis.y;
+ mOut._33 = 1.0f + oneMinusCosAngle * (axis.z * axis.z - 1.0f);
+ mOut._34 = 0.0f;
+
+ mOut._41 = 0.0f;
+ mOut._42 = 0.0f;
+ mOut._43 = 0.0f;
+ mOut._44 = 1.0f;
+
+ return mOut;
+}
+
+inline float4x4 ViewMatrixFromBasis( const float3 &f3X, const float3 &f3Y, const float3 &f3Z )
+{
+ return float4x4( f3X.x, f3Y.x, f3Z.x, 0,
+ f3X.y, f3Y.y, f3Z.y, 0,
+ f3X.z, f3Y.z, f3Z.z, 0,
+ 0, 0, 0, 1);
+}
+
+inline void SetNearFarClipPlanes( float4x4 &ProjMatrix, float zNear, float zFar, bool bIsDirectX )
+{
+ if( bIsDirectX )
+ {
+ ProjMatrix._33 = zFar / (zFar - zNear);
+ ProjMatrix._43 = -zNear * zFar / (zFar - zNear);
+ ProjMatrix._34 = 1;
+ }
+ else
+ {
+ // https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml
+ // http://www.terathon.com/gdc07_lengyel.pdf
+ // Note that OpenGL uses right-handed coordinate system, where
+ // camera is looking in negative z direction:
+ // OO
+ // |__|<--------------------
+ // -z +z
+ // Consequently, OpenGL projection matrix given by these two
+ // references inverts z axis.
+
+ // We do not need to do this, because we use DX coordinate
+ // system for the camera space. Thus we need to invert the
+ // sign of the values in the third column in the matrix
+ // from the references:
+
+ ProjMatrix._33 = -(-(zFar + zNear) / (zFar - zNear));
+ ProjMatrix._43 = -2.0f * zNear * zFar / (zFar - zNear);
+ ProjMatrix._34 = -(-1);
+ }
+}
+
+inline void GetNearFarPlaneFromProjMatrix( const float4x4 &ProjMatrix, float &zNear, float &zFar, bool bIsDirectX )
+{
+ if( bIsDirectX )
+ {
+ zNear = -ProjMatrix._43 / ProjMatrix._33;
+ zFar = ProjMatrix._33 / (ProjMatrix._33 - 1) * zNear;
+ }
+ else
+ {
+ zNear = ProjMatrix._43 / (-1.f - ProjMatrix._33);
+ zFar = ProjMatrix._43 / (+1.f - ProjMatrix._33);
+ }
+}
+
+inline float4x4 Projection(float fov, float aspectRatio, float zNear, float zFar, bool bIsDirectX) // Left-handed projection
+{
+ float4x4 mOut;
+ float yScale = 1.0f / tan(fov / 2.0f);
+ float xScale = yScale / aspectRatio;
+ mOut._11 = xScale;
+ mOut._22 = yScale;
+
+ SetNearFarClipPlanes( mOut, zNear, zFar, bIsDirectX );
+
+ return mOut;
+}
+
+
+struct Quaternion
+{
+ float q[4];
+};
+
+inline Quaternion RotationFromAxisAngle(const float3& axis, float angle)
+{
+ Quaternion out;
+ float norm = length(axis);
+ float sina2 = sin(0.5f * angle);
+ out.q[0] = sina2 * axis[0] / norm;
+ out.q[1] = sina2 * axis[1] / norm;
+ out.q[2] = sina2 * axis[2] / norm;
+ out.q[3] = cos(0.5f * angle);
+ return out;
+}
+
+inline void AxisAngleFromRotation(float3& outAxis, float& outAngle, const Quaternion& quat)
+{
+ float sina2 = sqrt(quat.q[0]*quat.q[0] + quat.q[1]*quat.q[1] + quat.q[2]*quat.q[2]);
+ outAngle = 2.0f * atan2(sina2, quat.q[3]);
+ float r = (sina2 > 0) ? (1.0f / sina2) : 0;
+ outAxis[0] = r * quat.q[0];
+ outAxis[1] = r * quat.q[1];
+ outAxis[2] = r * quat.q[2];
+}
+
+inline float4x4 QuaternionToMatrix(const Quaternion& quat)
+{
+ float4x4 out;
+ float yy2 = 2.0f * quat.q[1] * quat.q[1];
+ float xy2 = 2.0f * quat.q[0] * quat.q[1];
+ float xz2 = 2.0f * quat.q[0] * quat.q[2];
+ float yz2 = 2.0f * quat.q[1] * quat.q[2];
+ float zz2 = 2.0f * quat.q[2] * quat.q[2];
+ float wz2 = 2.0f * quat.q[3] * quat.q[2];
+ float wy2 = 2.0f * quat.q[3] * quat.q[1];
+ float wx2 = 2.0f * quat.q[3] * quat.q[0];
+ float xx2 = 2.0f * quat.q[0] * quat.q[0];
+ out[0][0] = - yy2 - zz2 + 1.0f;
+ out[0][1] = xy2 + wz2;
+ out[0][2] = xz2 - wy2;
+ out[0][3] = 0;
+ out[1][0] = xy2 - wz2;
+ out[1][1] = - xx2 - zz2 + 1.0f;
+ out[1][2] = yz2 + wx2;
+ out[1][3] = 0;
+ out[2][0] = xz2 + wy2;
+ out[2][1] = yz2 - wx2;
+ out[2][2] = - xx2 - yy2 + 1.0f;
+ out[2][3] = 0;
+ out[3][0] = out[3][1] = out[3][2] = 0;
+ out[3][3] = 1;
+ return out;
+}
+
+inline float determinant( const float3x3& m )
+{
+ float det = 0.f;
+ det += m._11 * (m._22*m._33 - m._32*m._23);
+ det -= m._12 * (m._21*m._33 - m._31*m._23);
+ det += m._13 * (m._21*m._32 - m._31*m._22);
+ return det;
+}
+
+
+inline float determinant( const float4x4& m )
+{
+ float det = 0.f;
+
+ det += m._11 * determinant(
+ float3x3 ( m._22,m._23,m._24,
+ m._32,m._33,m._34,
+ m._42,m._43,m._44) );
+
+ det -= m._12 * determinant(
+ float3x3( m._21,m._23,m._24,
+ m._31,m._33,m._34,
+ m._41,m._43,m._44) );
+
+ det += m._13 * determinant(
+ float3x3( m._21,m._22,m._24,
+ m._31,m._32,m._34,
+ m._41,m._42,m._44) );
+
+ det -= m._14 * determinant(
+ float3x3( m._21,m._22,m._23,
+ m._31,m._32,m._33,
+ m._41,m._42,m._43) );
+
+ return det;
+}
+
+inline float4x4 inverseMatrix(const float4x4& m)
+{
+ float4x4 inv;
+
+ // row 1
+ inv._11 = determinant(
+ float3x3( m._22, m._23, m._24,
+ m._32, m._33, m._34,
+ m._42, m._43, m._44 ) );
+
+ inv._12 = -determinant(
+ float3x3( m._21, m._23, m._24,
+ m._31, m._33, m._34,
+ m._41, m._43, m._44) );
+
+ inv._13 = determinant(
+ float3x3 ( m._21, m._22, m._24,
+ m._31, m._32, m._34,
+ m._41, m._42, m._44) );
+
+ inv._14 = -determinant(
+ float3x3 ( m._21, m._22, m._23,
+ m._31, m._32, m._33,
+ m._41, m._42, m._43) );
+
+
+ // row 2
+ inv._21 = -determinant(
+ float3x3( m._12, m._13, m._14,
+ m._32, m._33, m._34,
+ m._42, m._43, m._44) );
+
+ inv._22 = determinant(
+ float3x3( m._11, m._13, m._14,
+ m._31, m._33, m._34,
+ m._41, m._43, m._44) );
+
+ inv._23 = -determinant(
+ float3x3( m._11, m._12, m._14,
+ m._31, m._32, m._34,
+ m._41, m._42, m._44) );
+
+ inv._24 = determinant(
+ float3x3( m._11, m._12, m._13,
+ m._31, m._32, m._33,
+ m._41, m._42, m._43) );
+
+
+ // row 3
+ inv._31 = determinant(
+ float3x3( m._12,m._13,m._14,
+ m._22,m._23,m._24,
+ m._42,m._43,m._44) );
+
+ inv._32 = -determinant(
+ float3x3( m._11,m._13,m._14,
+ m._21,m._23,m._24,
+ m._41,m._43,m._44) );
+
+ inv._33 = determinant(
+ float3x3( m._11,m._12,m._14,
+ m._21,m._22,m._24,
+ m._41,m._42,m._44) );
+
+ inv._34 = -determinant(
+ float3x3( m._11,m._12,m._13,
+ m._21,m._22,m._23,
+ m._41,m._42,m._43) );
+
+ // row 4
+ inv._41 = -determinant(
+ float3x3( m._12, m._13, m._14,
+ m._22, m._23, m._24,
+ m._32, m._33, m._34) );
+
+ inv._42 = determinant(
+ float3x3( m._11, m._13, m._14,
+ m._21, m._23, m._24,
+ m._31, m._33, m._34) );
+
+ inv._43 = -determinant(
+ float3x3( m._11, m._12, m._14,
+ m._21, m._22, m._24,
+ m._31, m._32, m._34) );
+
+ inv._44 = determinant(
+ float3x3( m._11, m._12, m._13,
+ m._21, m._22, m._23,
+ m._31, m._32, m._33) );
+
+ auto det = m._11 * inv._11 + m._12 * inv._12 + m._13 * inv._13 + m._14 * inv._14;
+ inv = transposeMatrix(inv);
+ inv *= 1.0f/det;
+
+ return inv;
+}
+
+namespace std
+{
+ template<typename T>
+ Vector2<T> max( const Vector2<T> &Left, const Vector2<T> &Right )
+ {
+ return Vector2<T>(
+ std::max( Left.x, Right.x ),
+ std::max( Left.y, Right.y )
+ );
+ }
+
+ template<typename T>
+ Vector3<T> max( const Vector3<T> &Left, const Vector3<T> &Right )
+ {
+ return Vector3<T>(
+ std::max( Left.x, Right.x ),
+ std::max( Left.y, Right.y ),
+ std::max( Left.z, Right.z )
+ );
+ }
+
+ template<typename T>
+ Vector4<T> max( const Vector4<T> &Left, const Vector4<T> &Right )
+ {
+ return Vector4<T>(
+ std::max( Left.x, Right.x ),
+ std::max( Left.y, Right.y ),
+ std::max( Left.z, Right.z ),
+ std::max( Left.w, Right.w )
+ );
+ }
+
+
+ template<typename T>
+ Vector2<T> min( const Vector2<T> &Left, const Vector2<T> &Right )
+ {
+ return Vector2<T>(
+ std::min( Left.x, Right.x ),
+ std::min( Left.y, Right.y )
+ );
+ }
+
+ template<typename T>
+ Vector3<T> min( const Vector3<T> &Left, const Vector3<T> &Right )
+ {
+ return Vector3<T>(
+ std::min( Left.x, Right.x ),
+ std::min( Left.y, Right.y ),
+ std::min( Left.z, Right.z )
+ );
+ }
+
+ template<typename T>
+ Vector4<T> min( const Vector4<T> &Left, const Vector4<T> &Right )
+ {
+ return Vector4<T>(
+ std::min( Left.x, Right.x ),
+ std::min( Left.y, Right.y ),
+ std::min( Left.z, Right.z ),
+ std::min( Left.w, Right.w )
+ );
+ }
+} \ No newline at end of file
diff --git a/Common/interface/ComPtr.h b/Common/interface/ComPtr.h
new file mode 100644
index 00000000..94e4b1f2
--- /dev/null
+++ b/Common/interface/ComPtr.h
@@ -0,0 +1,43 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Defines Diligent::CComPtr
+
+#include "RefCntAutoPtr.h"
+
+namespace Diligent
+{
+ template<typename T>
+ class BlockAddRefReleaseCOM : public T
+ {
+ private:
+ virtual decltype( reinterpret_cast<T*>(nullptr)->AddRef() ) STDMETHODCALLTYPE AddRef()override = 0;
+ virtual decltype( reinterpret_cast<T*>(nullptr)->Release() ) STDMETHODCALLTYPE Release()override = 0;
+ };
+
+ template<typename T>
+ using CComPtr = Diligent::RefCntAutoPtr<T, BlockAddRefReleaseCOM>;
+}
diff --git a/Common/interface/DataBlob.h b/Common/interface/DataBlob.h
new file mode 100644
index 00000000..2940f1d3
--- /dev/null
+++ b/Common/interface/DataBlob.h
@@ -0,0 +1,53 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Defines Diligent::IDataBlob interface
+
+#include "Object.h"
+
+namespace Diligent
+{
+
+// {F578FF0D-ABD2-4514-9D32-7CB454D4A73B}
+static const Diligent::INTERFACE_ID IID_DataBlob =
+{ 0xf578ff0d, 0xabd2, 0x4514, { 0x9d, 0x32, 0x7c, 0xb4, 0x54, 0xd4, 0xa7, 0x3b } };
+
+/// Base interface for a file stream
+class IDataBlob : public Diligent::IObject
+{
+public:
+
+ /// Sets the size of the internal data buffer
+ virtual void Resize( size_t NewSize ) = 0;
+
+ /// Returns the size of the internal data buffer
+ virtual size_t GetSize() = 0;
+
+ /// Returns the pointer to the internal data buffer
+ virtual void* GetDataPtr() = 0;
+};
+
+}
diff --git a/Common/interface/FileStream.h b/Common/interface/FileStream.h
new file mode 100644
index 00000000..1263ef42
--- /dev/null
+++ b/Common/interface/FileStream.h
@@ -0,0 +1,58 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Defines Diligent::IFileStream interface
+
+#include "Object.h"
+#include "FileSystem.h"
+#include "DataBlob.h"
+
+namespace Diligent
+{
+
+/// IFileStream interface unique identifier
+// {E67F386C-6A5A-4A24-A0CE-C66435465D41}
+static const Diligent::INTERFACE_ID IID_FileStream =
+{ 0xe67f386c, 0x6a5a, 0x4a24, { 0xa0, 0xce, 0xc6, 0x64, 0x35, 0x46, 0x5d, 0x41 } };
+
+/// Base interface for a file stream
+class IFileStream : public IObject
+{
+public:
+ /// Reads data from the stream
+ virtual bool Read( void *Data, size_t BufferSize ) = 0;
+
+ virtual void Read( Diligent::IDataBlob *pData ) = 0;
+
+ /// Writes data to the stream
+ virtual bool Write( const void *Data, size_t Size ) = 0;
+
+ virtual size_t GetSize() = 0;
+
+ virtual bool IsValid() = 0;
+};
+
+}
diff --git a/Common/interface/Object.h b/Common/interface/Object.h
new file mode 100644
index 00000000..b404889e
--- /dev/null
+++ b/Common/interface/Object.h
@@ -0,0 +1,79 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Defines Diligent::IObject interface
+
+#include "InterfaceID.h"
+#include "Atomics.h"
+#include "ReferenceCounters.h"
+
+namespace Diligent
+{
+
+/// Base interface for all dynamic objects in the engine
+class IObject
+{
+public:
+ /// Queries the specific interface.
+
+ /// \param [in] IID - Unique identifier of the requested interface.
+ /// \param [out] ppInterface - Memory address where the pointer to the requested interface will be written.
+ /// If the interface is not supported, null pointer will be returned.
+ /// \remark The method increments the number of strong references by 1. The interface must be
+ /// released by a call to Release() method when it is no longer needed.
+ virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0;
+
+
+ /// Increments the number of strong references by 1.
+
+ /// \remark This method is equivalent to GetReferenceCounters()->AddStrongRef().\n
+ /// The method is thread-safe and does not require explicit synchronization.
+ /// \return The number of strong references after incrementing the counter.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ virtual Atomics::Long AddRef() = 0;
+
+
+ /// Decrements the number of strong references by 1 and destroys the object when the
+ /// counter reaches zero.
+
+ /// \remark This method is equivalent to GetReferenceCounters()->ReleaseStrongRef().\n
+ /// The method is thread-safe and does not require explicit synchronization.
+ /// \return The number of strong references after decrementing the counter.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ /// The only reliable value is 0 as the object is destroyed when the last
+ /// strong reference is released.
+ virtual Atomics::Long Release() = 0;
+
+
+ /// Returns the pointer to IReferenceCounters interface of the associated
+ /// reference counters object. The metod does *NOT* increment
+ /// the number of strong references to the returned object.
+ virtual IReferenceCounters* GetReferenceCounters()const = 0;
+};
+
+}
diff --git a/Common/interface/ReferenceCounters.h b/Common/interface/ReferenceCounters.h
new file mode 100644
index 00000000..ffef91d5
--- /dev/null
+++ b/Common/interface/ReferenceCounters.h
@@ -0,0 +1,115 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#pragma once
+
+/// \file
+/// Defines Diligent::IReferenceCounters interface
+
+#include "InterfaceID.h"
+#include "Atomics.h"
+
+namespace Diligent
+{
+
+/// Base interface for a reference counter object that stores the number of strong and
+/// weak references and the pointer to the object. It is necessary to separate reference
+/// counters from the object to support weak pointers.
+class IReferenceCounters
+{
+public:
+ /// Increments the number of strong references by 1.
+
+ /// \return The number of strong references after incrementing the counter.
+ /// \remark The method is thread-safe and does not require explicit synchronization.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ virtual Atomics::Long AddStrongRef() = 0;
+
+
+ /// Decrements the number of strong references by 1 and destroys the referenced object
+ /// when the counter reaches zero. If there are no more weak references, destroys the
+ /// reference counters object itself.
+
+ /// \return The number of strong references after decrementing the counter.
+ /// \remark The referenced object is destroyed when the last strong reference is released.\n
+ /// If there are no more weak references, the reference counters object itself is
+ /// also destroyed.\n
+ /// The method is thread-safe and does not require explicit synchronization.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ /// The only reliable value is 0 as the object is destroyed when the last
+ /// strong reference is released.
+ virtual Atomics::Long ReleaseStrongRef() = 0;
+
+
+ /// Increments the number of weak references by 1.
+
+ /// \return The number of weak references after incrementing the counter.
+ /// \remark The method is thread-safe and does not require explicit synchronization.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ virtual Atomics::Long AddWeakRef() = 0;
+
+
+ /// Decrements the number of weak references by 1. If there are no more strong and weak
+ /// references, destroys the reference counters object itself.
+
+ /// \return The number of weak references after decrementing the counter.
+ /// \remark The method is thread-safe and does not require explicit synchronization.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ virtual Atomics::Long ReleaseWeakRef() = 0;
+
+
+ /// Gets the pointer to the IUnknown interface of the referenced object.
+
+ /// \param [out] ppObject - Memory address where the pointer to the object
+ /// will be stored.
+ /// \remark If the object was destroyed, nullptr will be written to *ppObject.
+ /// If the object was not released, the pointer to the object's IUnknown interface
+ /// will be stored. In this case, the number of strong references to the object
+ /// will be incremented by 1.\n
+ /// The method is thread-safe and does not require explicit synchronization.
+ virtual void GetObject(class IObject **ppObject) = 0;
+
+
+ /// Returns the number of outstanding strong references.
+
+ /// \return The number of strong references.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ /// The only reliable value is 0 as the object is destroyed when the last
+ /// strong reference is released.
+ virtual Atomics::Long GetNumStrongRefs()const = 0;
+
+
+ /// Returns the number of outstanding weak references.
+
+ /// \return The number of weak references.
+ /// \note In a multithreaded environment, the returned number may not be reliable
+ /// as other threads may simultaneously change the actual value of the counter.
+ virtual Atomics::Long GetNumWeakRefs()const = 0;
+};
+
+}
diff --git a/Common/make/AppCommon.mk b/Common/make/AppCommon.mk
new file mode 100644
index 00000000..454fcf19
--- /dev/null
+++ b/Common/make/AppCommon.mk
@@ -0,0 +1,11 @@
+
+APP_PLATFORM := android-19
+APP_ABI := x86 armeabi-v7a
+NDK_TOOLCHAIN_VERSION := 4.9
+APP_STL := gnustl_static
+
+ifeq ($(APP_OPTIM),release)
+ APP_CFLAGS := -O2 -DNDEBUG -g $(APP_CFLAGS)
+else
+ APP_CFLAGS := -O0 -g -D_DEBUG $(APP_CFLAGS)
+endif \ No newline at end of file
diff --git a/Common/src/BasicFileStream.cpp b/Common/src/BasicFileStream.cpp
new file mode 100644
index 00000000..09719821
--- /dev/null
+++ b/Common/src/BasicFileStream.cpp
@@ -0,0 +1,61 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#include "pch.h"
+#include "BasicFileStream.h"
+
+namespace Diligent
+{
+ BasicFileStream::BasicFileStream(const Diligent::Char *Path,
+ EFileAccessMode Access/* = EFileAccessMode::Read*/) :
+ m_FileWrpr(Path, Access)
+ {
+ }
+
+ IMPLEMENT_QUERY_INTERFACE(BasicFileStream, IID_FileStream, TBase)
+
+ bool BasicFileStream::Read(void *Data, size_t BufferSize)
+ {
+ return m_FileWrpr->Read( Data, BufferSize );
+ }
+
+ void BasicFileStream::Read( Diligent::IDataBlob *pData )
+ {
+ return m_FileWrpr->Read( pData );
+ }
+
+ bool BasicFileStream::Write(const void *Data, size_t Size)
+ {
+ return m_FileWrpr->Write( Data, Size );
+ }
+
+ bool BasicFileStream::IsValid()
+ {
+ return !!m_FileWrpr;
+ }
+
+ size_t BasicFileStream::GetSize()
+ {
+ return m_FileWrpr->GetSize();
+ }
+}
diff --git a/Common/src/DataBlobImpl.cpp b/Common/src/DataBlobImpl.cpp
new file mode 100644
index 00000000..9255f2e3
--- /dev/null
+++ b/Common/src/DataBlobImpl.cpp
@@ -0,0 +1,52 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#include "pch.h"
+
+
+#include "DataBlobImpl.h"
+
+namespace Diligent
+{
+
+/// Sets the size of the internal data buffer
+void DataBlobImpl::Resize( size_t NewSize )
+{
+ m_DataBuff.resize( NewSize );
+}
+
+/// Returns the size of the internal data buffer
+size_t DataBlobImpl::GetSize()
+{
+ return m_DataBuff.size();
+}
+
+ /// Returns the pointer to the internal data buffer
+void* DataBlobImpl::GetDataPtr()
+{
+ return m_DataBuff.data();
+}
+
+IMPLEMENT_QUERY_INTERFACE(DataBlobImpl, IID_DataBlob, TBase)
+
+}
diff --git a/Common/src/Timer.cpp b/Common/src/Timer.cpp
new file mode 100644
index 00000000..caf6ffdb
--- /dev/null
+++ b/Common/src/Timer.cpp
@@ -0,0 +1,58 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+#include "pch.h"
+#include "Timer.h"
+
+using namespace std::chrono;
+namespace Diligent
+{
+ Timer::Timer()
+ {
+ Restart();
+ }
+
+ void Timer::Restart()
+ {
+ m_StartTime = high_resolution_clock().now();
+ }
+
+ template<typename T>
+ T GetElapsedTime( high_resolution_clock::time_point StartTime )
+ {
+ auto CurrTime = high_resolution_clock::now();
+ auto time_span = duration_cast<duration<T>>(CurrTime - StartTime);
+ return time_span.count();
+ }
+
+ double Timer::GetElapsedTime()const
+ {
+ return Diligent::GetElapsedTime<double>( m_StartTime );
+ }
+
+ float Timer::GetElapsedTimef()const
+ {
+
+ return Diligent::GetElapsedTime<float>( m_StartTime );
+ }
+}
diff --git a/Common/src/pch.cpp b/Common/src/pch.cpp
new file mode 100644
index 00000000..1a94193e
--- /dev/null
+++ b/Common/src/pch.cpp
@@ -0,0 +1,31 @@
+/* Copyright 2015 Egor Yusov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
+ *
+ * In no event and under no legal theory, whether in tort (including negligence),
+ * contract, or otherwise, unless required by applicable law (such as deliberate
+ * and grossly negligent acts) or agreed to in writing, shall any Contributor be
+ * liable for any damages, including any direct, indirect, special, incidental,
+ * or consequential damages of any character arising as a result of this License or
+ * out of the use or inability to use the software (including but not limited to damages
+ * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
+ * all other commercial damages or losses), even if such Contributor has been advised
+ * of the possibility of such damages.
+ */
+
+// stdafx.cpp : source file that includes just the standard includes
+// Common.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "pch.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file