It is not fun when things break backward compatibility, but it would be even less fun if the whole library became a bloated mess that nobody uses after a few decades.
While every new feature may create naming conflicts from using the dsr namespace implicitly and every bugfix can make workarounds relying on incorrect behavior stop working, some things require extra attention to make porting to a new version easier.

There are plans to create an automatic refactoring tool built into the Builder build system that could potentially do this automatically for you, but one must be very careful with overwriting people's code in case that someone does not use version control.

Changes from version 0.1.0 to version 0.2.0 (Bug fixes)
	* simdExtra.h was removed, because such a low depth of abstraction would risk making the code slower from not fitting well with future SIMD extensions.
		The more features you add to the badly defined extra feature set, the less systems it will work on, until it is just a slower version of specific instruction sets.
		On missing header when including simdExtra.h:
			Replace 'simdExtra.h' with 'simd.h' to make it compile.
			Remove any duplicate includes of simd.h to clean up your code.
			Remove all code within '#ifdef USE_SIMD_EXTRA' or '#if defined USE_SIMD_EXTRA' to clean up your code.
	* Left and right sides of control, shift and alt keys were merged.
		Because MS-Windows allow using control, shift and alt of undefined side.
			This caused copying and pasting of text to fail when I tested on a different keyboard,
			  because it was neither left nor right control, just control.
			Adding a third case would not solve the bug in applications using this library,
			  because checks for left or right would still fail.
			Forcing unknown sides to one side would cause new bugs when someone connects different actions to left and right sides.
			The only resaonable bugfix was to merge left and right sides into the same keys.
		On missing DsrKey:
			Replace 'DsrKey_LeftControl' with 'DsrKey_Control'
			Replace 'DsrKey_RightControl' with 'DsrKey_Control'
			Replace 'DsrKey_LeftShift' with 'DsrKey_Shift'
			Replace 'DsrKey_RightShift' with 'DsrKey_Shift'
			Replace 'DsrKey_LeftAlt' with 'DsrKey_Alt'
			Replace 'DsrKey_RightAlt' with 'DsrKey_Alt'
			Merge any uplicated checks for left or right versions to clean up your code.
			Rethink the design if you relied on distinguishing between left and right control, shift or alt.
	* If you used a custom theme before the system was finished, you will now have to add the assignment "filter = 1" for components where rounded edges became black from adding the filter setting.
		Because one can not let default values depend on which component is used when theme classes are shared freely between components.

Changes from version 0.2.0 to version 0.3.0 (Performance, safety and template improvements)
	* To make SafePointer fully typesafe so that one can't accidentally give write access to write protected data, the recursive constness had to be removed.
		Replace 'const SafePointer<' with 'SafePointer<const '
		Replace 'const dsr::SafePointer<' with 'dsr::SafePointer<const '
	* The function given to image_dangerous_replaceDestructor no longer frees the allocation itself, only external resources associated with the data.
		Because heap_free is called automatically after the destructor in the new memory allocator.
	* simd.h has moved into the dsr namespace because it was getting too big for the global namespace.
		* gather has been renamed into gather_U32, gather_I32 and gather_F32.
			This avoids potential ambiguity.
		* The 'a == b' and 'a != b' operators have been replaced with 'allLanesEqual(a, b)' and '!allLanesEqual(a, b)'.
			This reserves the comparison operators for future use with multiple boolean results.
		* Immediate bit shifting now use the bitShiftLeftImmediate and bitShiftRightImmediate functions with a template argument for the number of bits to shift.
			Because it was very easy to forget that the offset had to be constant with some SIMD instructions.
			Replace any << or >> operator that takes a constant offset with the new functions to prevent slowing down.
				Replace a << 3 with bitShiftLeftImmediate<3>(a).
				Replace a >> 5 with bitShiftRightImmediate<5>(a).
		* clamp, clampLower and clampUpper are global methods instead of member methods, to work the same for scalar operations in template functions.
			Replace myVector.clamp(min, max) with clamp(VectorType(min), myVector, VectorType(max)).
			Replace myVector.clampLower(min) with clampLower(VectorType(min), myVector).
			Replace myVector.clampUpper(max) with clampUpper(myVector, VectorType(max)).
		* reciprocal, reciprocalSquareRoot and squareRoot are now global functions, to work the same for scalar operations in template functions.
			Replace myVector.reciprocal() with reciprocal(myVector).
			Replace myVector.reciprocalSquareRoot() with reciprocalSquareRoot(myVector).
			Replace myVector.squareRoot() with squareRoot(myVector).
	* Textures have been separated from images to allow using them as separate value types.
		Because it was very difficult to re-use internal texture sampling methods for custom rendering pipelines.
		  Now images and textures have immutable value allocated heads and all side-effects are in the pixel buffers.		  
		ImageRgbaU8 has been replaced by TextureRgbaU8 for the diffuse and lightmap textures in modelAPI.h.
		  Then you must create a texture from an image ahead of time and then give the texture to the model or drawn polygon.
		Replace 'image_generatePyramid' with 'texture_generatePyramid'.
		Create a texture from the image using texture_create_RgbaU8 with the image and the number of resolutions.
		  Then assign the texture instead of the image.
	* PackOrder.h has a new packOrder_ prefix for global functions to prevent naming conflicts.
		Replace 'getRed' with 'packOrder_getRed'.
		Replace 'getGreen' with 'packOrder_getGreen'.
		Replace 'getBlue' with 'packOrder_getBlue'.
		Replace 'getAlpha' with 'packOrder_getAlpha'.
		Replace 'packBytes' with 'packOrder_packBytes'.
		Replace 'floatToSaturatedByte' with 'packOrder_floatToSaturatedByte'.
	* Because the new string printing uses exact matching for basic types, bool is now printed as true or false instead of 1 or 0.
		Cast to uint32_t if you want bool interpreted as an integer as before.
		Does not affect PersistentBoolean.
	* Folders have been reorganized to be less confusing for beginners.
		Replace 'tools/build.sh' with 'tools/buildScripts/build.sh'.
		Replace 'tools/buildAndRun.sh' with 'tools/buildScripts/buildAndRun.sh'.
		Replace 'tools/buildLibrary.sh' with 'tools/buildScripts/buildLibrary.sh'.
		Replace 'tools/clean.sh' with 'tools/buildScripts/clean.sh'.
