Added StringUtil functions inc/txt-preprocessing

Added multiple functions to the StringUtil class w/tests

 * StringUtil::suffix and StringUtil::prefix accepts negative lengths,
   so new valid operations are e.g.:
       suffix("abcdef012345", -2) == "cdef012345"
       prefix("abcdef012345", -2) == "abccdef0123"

 * Prepending two strings simplified w/StringUtil::prepend

 * A preprocessing macro filtering system. This allows adding
   flat #if X, #else, and #endif blocks, that can be used for
   keeping multiple versions/variants in the same file.
   This is the StringUtil::processIfEndif() function

    src/util/StringUtil.cpp
    src/util/StringUtil.h
    src/util/TestStringUtil.h
Added shader GL/ES header injection w/preprocessing

Added shader GL/ES header injection w/preprocessing

If compiling for OpenGL ES 3.0, shaders are now prepended "#version 300 es", and
"#version 430 core" for OpenGL 4.3.

Additionally, it allows preprocessing macros in the shaders, in the form of
  #if GL
  // .. code include in OpenGL 4.3
  #else
  // .. code include in OpenGL ES 3.0
  #endif

And
  #if ES
  // .. code include in OpenGL ES 3.0
  #else
  // .. code include in OpenGL 4.3
  #endif

    assets/shaders/render2dimage.frag
    assets/shaders/render2dimage.vert
    src/graphics/ShaderProgram.cpp
Added a commandline utility for txt-preprocessing

Added a commandline utility for txt-preprocessing
This mirrors the shader preprocessing done within the application
It handles the following macros: #if X, #else, #endif

Can be built using `./devtools.sh bu`, or `./compile.sh utils`
    compile.sh
    devtools.sh
    utils/simpletextpreprocess/SConstruct               (+)
    utils/simpletextpreprocess/simpletextpreprocess.cpp (+)
Added shader validation scripts w/preprocessing

Added shader validation scripts w/preprocessing

This uses the same GL/ES header injection and macro preprocessing
as the engine, using the utils/impletextpreprocess utility.

The validation is done with the GLSL reference compiler called
glslangValidator (searching for it will take you to it).

The shader validation is simplified with devtools.sh. Just call
`./devtools.sh validate-shaders` and it produces a output such as:

--------------------------------------------
Validating shaders [ #version 430 core ]
 [ OK  ]  ./assets/shaders/deferredobjrender.frag
 [ OK  ]  ./assets/shaders/deferredobjrender.vert
 [ OK  ]  ./assets/shaders/deferredquad.frag
 [ OK  ]  ./assets/shaders/deferredquad.vert
 [ OK  ]  ./assets/shaders/render2dimage.frag
 [ OK  ]  ./assets/shaders/render2dimage.vert

Validating shaders [ #version 300 es ]
 [ OK  ]  ./assets/shaders/deferredobjrender.frag
 [ OK  ]  ./assets/shaders/deferredobjrender.vert
 [ OK  ]  ./assets/shaders/deferredquad.frag
 [ OK  ]  ./assets/shaders/deferredquad.vert
 [ OK  ]  ./assets/shaders/render2dimage.frag
 [ OK  ]  ./assets/shaders/render2dimage.vert
--------------------------------------------

    devtools.sh
    validateshaders.sh   (+)
Minor Render2dImage logger cleanup

Minor Render2dImage logger cleanup
    src/graphics/Renderer2dImage.cpp