diff --git a/.gitignore b/.gitignore index dd7f5d0ad..436c671c6 100644 --- a/.gitignore +++ b/.gitignore @@ -24,21 +24,8 @@ projects/android-project-ant/libs src/examples/strobe src/thirdparty/SDL2-2.0.10* *.dll -eees* -eeew* -eetest* -eesound* -eesprite* -eefonts* -eevbo-fbo-batch* -eephysics* -eestrobe* -eeiv* -eehttp-request* -eepp-TextureAtlasEditor* -eepp-UIEditor* -bin/eeui-hello-world* -bin/eepp-MapEditor* +bin/ee* +bin/eepp-* ee.tag log.log external_projects.lua diff --git a/bin/assets/atlases/bnb.eta b/bin/assets/atlases/bnb.eta index 5a3915aea..9ee60a388 100644 Binary files a/bin/assets/atlases/bnb.eta and b/bin/assets/atlases/bnb.eta differ diff --git a/bin/assets/atlases/tiles.eta b/bin/assets/atlases/tiles.eta index b644a0114..3ddda2f94 100644 Binary files a/bin/assets/atlases/tiles.eta and b/bin/assets/atlases/tiles.eta differ diff --git a/bin/assets/atlases/tiles.png b/bin/assets/atlases/tiles.png index 2c1ea2d26..9ddb78b67 100644 Binary files a/bin/assets/atlases/tiles.png and b/bin/assets/atlases/tiles.png differ diff --git a/bin/assets/ui/uitheme.eta b/bin/assets/ui/uitheme.eta index 652bc1687..f012f8540 100644 Binary files a/bin/assets/ui/uitheme.eta and b/bin/assets/ui/uitheme.eta differ diff --git a/bin/assets/ui/uitheme1.5x.eta b/bin/assets/ui/uitheme1.5x.eta index a96512e62..7fdef5779 100644 Binary files a/bin/assets/ui/uitheme1.5x.eta and b/bin/assets/ui/uitheme1.5x.eta differ diff --git a/bin/assets/ui/uitheme2x.eta b/bin/assets/ui/uitheme2x.eta index 52aba4dd4..14a331610 100644 Binary files a/bin/assets/ui/uitheme2x.eta and b/bin/assets/ui/uitheme2x.eta differ diff --git a/include/eepp/graphics/packerhelper.hpp b/include/eepp/graphics/packerhelper.hpp index 49b5c3e9c..2fbcc6931 100644 --- a/include/eepp/graphics/packerhelper.hpp +++ b/include/eepp/graphics/packerhelper.hpp @@ -7,7 +7,7 @@ namespace EE { namespace Graphics { namespace Private { #pragma pack( push, 1 ) -#define HDR_NAME_SIZE 64 +#define HDR_NAME_SIZE 128 struct sTextureRegionHdr { char Name[HDR_NAME_SIZE]; diff --git a/include/eepp/graphics/textureatlasloader.hpp b/include/eepp/graphics/textureatlasloader.hpp index e2310b4cb..bc8a4ca62 100644 --- a/include/eepp/graphics/textureatlasloader.hpp +++ b/include/eepp/graphics/textureatlasloader.hpp @@ -125,11 +125,17 @@ class EE_API TextureAtlasLoader { /** @return True if the texture atlas is loading. */ const bool& isLoading() const; - /** @brief The function will check if the texture atlas is updated. - Checks if all the images inside the images path are inside the texture atlas, and if they - have the same date and size, otherwise it will recreate or update the texture atlas. - */ - bool updateTextureAtlas( std::string TextureAtlasPath, std::string ImagesPath ); + /** The function will check if the texture atlas is updated. Checks if all the images inside the + * images path are inside the texture atlas, and if they have the same date and size, otherwise + * it will recreate or update the texture atlas. + * + * @param TextureAtlasPath The path to the texture atlas ( the ".eta" file ) + * @param ImagesPath The directory where the source images are located. + * @param maxImageSize Maximum texture size allowed for the new texture atlas created. Default + * value will use the current image size. + */ + bool updateTextureAtlas( std::string TextureAtlasPath, std::string ImagesPath, + Sizei maxImageSize = Sizei::Zero ); /** Rewrites the texture atlas file. Usefull if the TextureRegions where modified and need to be * updated inside the texture atlas. */ diff --git a/include/eepp/graphics/texturepacker.hpp b/include/eepp/graphics/texturepacker.hpp index 8f1022b97..77e129ff1 100644 --- a/include/eepp/graphics/texturepacker.hpp +++ b/include/eepp/graphics/texturepacker.hpp @@ -50,41 +50,65 @@ class EE_API TexturePacker { public: static TexturePacker* New(); + /** Creates a new instance of the texture packer indicating the maximum size of the texture + *atlas. + * @param maxWidth The maximum width that the texture atlas will use. + * @param maxHeight The maximum height that the texture atlas will use. + * @param pixelDensity Indicates the device pixel density that represents the resources that + *will the packer pack. + * @param textureFilter Indicates with texture filter should be used when the texture of the + *atlas is loaded. + * @param forcePowOfTwo Indicates that if the max with and height must be adjusted to fit a + *power of two texture. + * @param scalableSVG True if SVG images are scaled to the packer PixelDensity + * @param pixelBorder Indicates how many pixels will be added to separate one image to another + *in the texture atlas. Usefull to avoid artifacts when rendered scaled TextureRegions. Use at + *least 1 pixel to separate images if you will scale any TextureRegion. + * @param allowChilds When enabled if the atlas does not have enough space left in the image to + *put more resources it will create a new image atlas and add the rest of the images in that + *images, repeating this process recursivelly until using all source images. + * @param allowFlipping Indicates if the images can be flipped inside the texture atlas. This + *is not compatible with eepp ( since it can't flip the textures back to the original + *orientation ). So avoid it for eepp. + */ static TexturePacker* - New( const Uint32& MaxWidth, const Uint32& MaxHeight, - const PixelDensitySize& PixelDensity = PixelDensitySize::MDPI, - const bool& ForcePowOfTwo = true, const bool& scalableSVG = false, - const Uint32& PixelBorder = 0, + New( const Uint32& maxWidth, const Uint32& maxHeight, + const PixelDensitySize& pixelDensity = PixelDensitySize::MDPI, + const bool& forcePowOfTwo = true, const bool& scalableSVG = false, + const Uint32& pixelBorder = 2, const Texture::TextureFilter& textureFilter = Texture::TextureFilter::Linear, - const bool& AllowFlipping = false ); + const bool& allowChilds = false, const bool& allowFlipping = false ); /** Creates a new texture packer ( you will need to call SetOptions before adding any texture or * image ). */ TexturePacker(); - /** Creates a new texture packer indicating the size of the texture atlas. - * @param MaxWidth The maximum width that the texture atlas will use. - * @param MaxHeight The maximum height that the texture atlas will use. - * @param PixelDensity Indicates the device pixel density that represents the resources that + /** Creates a new texture packer indicating the maximum size of the texture atlas. + * @param maxWidth The maximum width that the texture atlas will use. + * @param maxHeight The maximum height that the texture atlas will use. + * @param pixelDensity Indicates the device pixel density that represents the resources that *will the packer pack. * @param textureFilter Indicates with texture filter should be used when the texture of the - *atlas is loaded - * @param ForcePowOfTwo Indicates that if the max with and height must be adjusted to fit a + *atlas is loaded. + * @param forcePowOfTwo Indicates that if the max with and height must be adjusted to fit a *power of two texture. * @param scalableSVG True if SVG images are scaled to the packer PixelDensity - * @param PixelBorder Indicates how many pixels will be added to separate one image to another + * @param pixelBorder Indicates how many pixels will be added to separate one image to another *in the texture atlas. Usefull to avoid artifacts when rendered scaled TextureRegions. Use at *least 1 pixel to separate images if you will scale any TextureRegion. - * @param AllowFlipping Indicates if the images can be flipped inside the texture atlas. This + * @param allowChilds When enabled if the atlas does not have enough space left in the image to + *put more resources it will create a new image atlas and add the rest of the images in that + *images, repeating this process recursivelly until using all source images. + * @param allowFlipping Indicates if the images can be flipped inside the texture atlas. This *is not compatible with eepp ( since it can't flip the textures back to the original *orientation ). So avoid it for eepp. */ - TexturePacker( const Uint32& MaxWidth, const Uint32& MaxHeight, - const PixelDensitySize& PixelDensity = PixelDensitySize::MDPI, - const bool& ForcePowOfTwo = true, const bool& scalableSVG = false, - const Uint32& PixelBorder = 0, + TexturePacker( const Uint32& maxWidth, const Uint32& maxHeight, + const PixelDensitySize& pixelDensity = PixelDensitySize::MDPI, + const bool& forcePowOfTwo = true, const bool& scalableSVG = false, + const Uint32& pixelBorder = 2, const Texture::TextureFilter& textureFilter = Texture::TextureFilter::Linear, - const bool& AllowFlipping = false ); + const bool& allowChilds = false, const bool& allowFlipping = false ); ~TexturePacker(); @@ -102,12 +126,14 @@ class EE_API TexturePacker { /** After adding all the images that will be used to create the texture atlas. Packing the * textures will generate the texture atlas information ( it will fit the images inside the - * texture atlas, etc ). */ + * texture atlas, etc ). + * @return The amount of pixels used for the new image or the total area used. 0 means it + * failed. + */ Int32 packTextures(); - /** @brief Save the texture atlas to a file, in the indicated format. - * If PackTexture() has not been called, it will be called automatically by the function ( so - *you don't need to call it ). + /** Save the texture atlas to a file, in the indicated format. If PackTexture() has not been + *called, it will be called automatically by the function ( so you don't need to call it ). * @param Filepath The path were it will be saved the new texture atlas. * @param Format The image format of the new texture atlas. * @param SaveExtensions Indicates if the extensions of the image files must be saved. Usually @@ -121,31 +147,34 @@ class EE_API TexturePacker { /** Clear all the textures added */ void close(); - /** First of all you need to set at least the max dimensions of the texture atlas. - * If the instance of the texture packer was created without indicating this data, this must be - *called before adding any texture or image. - * @param MaxWidth The maximum width that the texture atlas will use. - * @param MaxHeight The maximum height that the texture atlas will use. - * @param PixelDensity Indicates the device pixel density that represents the resources that + /** First of all you need to set at least the max dimensions of the texture atlas. If the + *instance of the texture packer was created without indicating this data, this must be called + *before adding any texture or image. + * @param maxWidth The maximum width that the texture atlas will use. + * @param maxHeight The maximum height that the texture atlas will use. + * @param pixelDensity Indicates the device pixel density that represents the resources that *will the packer pack. - * @param scalableSVG True if SVG images are scaled to the packer PixelDensity * @param textureFilter Indicates with texture filter should be used when the texture of the - *atlas is loaded - * @param PixelBorder Indicates how many pixels will be added to separate one image to another + *atlas is loaded. + * @param forcePowOfTwo Indicates that if the max with and height must be adjusted to fit a + *power of two texture. + * @param scalableSVG True if SVG images are scaled to the packer PixelDensity + * @param pixelBorder Indicates how many pixels will be added to separate one image to another *in the texture atlas. Usefull to avoid artifacts when rendered scaled TextureRegions. Use at *least 1 pixel to separate images if you will scale any TextureRegion. - * @param ForcePowOfTwo Indicates that if the max with and height must be adjusted to fit a - *power of two texture. - * @param AllowFlipping Indicates if the images can be flipped inside the texture atlas. This + * @param allowChilds When enabled if the atlas does not have enough space left in the image to + *put more resources it will create a new image atlas and add the rest of the images in that + *images, repeating this process recursivelly until using all source images. + * @param allowFlipping Indicates if the images can be flipped inside the texture atlas. This *is not compatible with eepp ( since it can't flip the textures back to the original *orientation ). So avoid it for eepp. */ - void setOptions( const Uint32& MaxWidth, const Uint32& MaxHeight, - const PixelDensitySize& PixelDensity = PixelDensitySize::MDPI, - const bool& ForcePowOfTwo = true, const bool& scalableSVG = false, - const Uint32& PixelBorder = 0, + void setOptions( const Uint32& maxWidth, const Uint32& maxHeight, + const PixelDensitySize& pixelDensity = PixelDensitySize::MDPI, + const bool& forcePowOfTwo = true, const bool& scalableSVG = false, + const Uint32& pixelBorder = 2, const Texture::TextureFilter& textureFilter = Texture::TextureFilter::Linear, - const bool& AllowFlipping = false ); + const bool& allowChilds = false, const bool& allowFlipping = false ); /** @return The texture atlas to generate width. */ const Int32& getWidth() const; @@ -169,6 +198,7 @@ class EE_API TexturePacker { Sizei mMaxSize; bool mPacked; bool mAllowFlipping; + bool mAllowChilds; TexturePacker* mChild; Int32 mStrategy; Int32 mCount; diff --git a/include/eepp/ui/css/mediaquery.hpp b/include/eepp/ui/css/mediaquery.hpp index ce509e23b..d9d0a5860 100644 --- a/include/eepp/ui/css/mediaquery.hpp +++ b/include/eepp/ui/css/mediaquery.hpp @@ -9,21 +9,12 @@ namespace EE { namespace UI { namespace CSS { /** Media Queries support is based on the litehtml implementation: * https://github.com/litehtml/litehtml licensed under the New BSD License. */ -#define media_orientation_strings "portrait;landscape" enum MediaOrientation { media_orientation_portrait, media_orientation_landscape, }; -#define media_feature_strings \ - "none;width;min-width;max-width;height;min-height;max-height;device-width;min-device-" \ - "width;max-device-width;device-height;min-device-height;max-device-height;orientation;" \ - "aspect-ratio;min-aspect-ratio;max-aspect-ratio;device-aspect-ratio;min-device-aspect-" \ - "ratio;max-device-aspect-ratio;color;min-color;max-color;color-index;min-color-index;max-" \ - "color-index;monochrome;min-monochrome;max-monochrome;resolution;min-resolution;max-" \ - "resolution" - enum MediaFeature { media_feature_none, @@ -70,9 +61,6 @@ enum MediaFeature { media_feature_max_resolution, }; -#define media_type_strings \ - "none;all;screen;print;braille;embossed;handheld;projection;speech;tty;tv" - enum MediaType { media_type_none, media_type_all, diff --git a/premake4.lua b/premake4.lua index 99324bfda..d5b1af742 100644 --- a/premake4.lua +++ b/premake4.lua @@ -299,7 +299,7 @@ function build_base_configuration( package_name ) set_ios_config() set_xcode_config() - + configuration "debug" defines { "DEBUG" } flags { "Symbols" } @@ -417,7 +417,7 @@ function build_link_configuration( package_name, use_ee_icon ) if _OPTIONS.platform == "ios-cross-x86" then extension = ".x86.ios" end - + if _OPTIONS.platform == "ios-cross-x86_64" then extension = ".x86_64.ios" end @@ -455,7 +455,7 @@ function build_link_configuration( package_name, use_ee_icon ) add_cross_config_links() configuration "emscripten" - linkoptions{ "-O2 -s TOTAL_MEMORY=67108864 -s ASM_JS=1 -s VERBOSE=1 -s DISABLE_EXCEPTION_CATCHING=0 -s USE_SDL=2 -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s ERROR_ON_MISSING_LIBRARIES=0 -s FULL_ES3=1 -s \"BINARYEN_TRAP_MODE='clamp'\"" } + linkoptions{ "-O2 -s TOTAL_MEMORY=67108864 -s ASM_JS=1 -s VERBOSE=1 -s DISABLE_EXCEPTION_CATCHING=0 -s USE_SDL=2 -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s FULL_ES3=1 -s \"BINARYEN_TRAP_MODE='clamp'\"" } buildoptions { "-fno-strict-aliasing -O2 -s USE_SDL=2 -s PRECISE_F32=1 -s ENVIRONMENT=web" } if _OPTIONS["with-gles1"] and ( not _OPTIONS["with-gles2"] or _OPTIONS["force-gles1"] ) then @@ -567,7 +567,9 @@ function add_sdl2() defines { "EE_BACKEND_SDL_ACTIVE", "EE_SDL_VERSION_2" } if not can_add_static_backend("SDL2") then - table.insert( link_list, get_backend_link_name( "SDL2" ) ) + if not os.is_real("emscripten") then + table.insert( link_list, get_backend_link_name( "SDL2" ) ) + end else insert_static_backend( "SDL2" ) end @@ -923,17 +925,44 @@ solution "eepp" files { "src/thirdparty/efsw/src/efsw/*.cpp", osfiles } if os.is("windows") then - excludes { "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", + "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" + } elseif os.is("linux") then - excludes { "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", + "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" + } elseif os.is("macosx") then - excludes { "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp" + } elseif os.is("freebsd") then - excludes { "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" + } end build_base_cpp_configuration( "efsw" ) + -- Library project "eepp-main" kind "StaticLib" language "C++" @@ -957,63 +986,63 @@ solution "eepp" set_kind() language "C++" files { "src/test/*.cpp" } - build_link_configuration( "eetest", true ) + build_link_configuration( "eepp-test", true ) - project "eepp-es" + project "eepp-external-shader" set_kind() language "C++" files { "src/examples/external_shader/*.cpp" } - build_link_configuration( "eees", true ) + build_link_configuration( "eepp-external-shader", true ) - project "eepp-ew" + project "eepp-empty-window" set_kind() language "C++" files { "src/examples/empty_window/*.cpp" } - build_link_configuration( "eeew", true ) + build_link_configuration( "eepp-empty-window", true ) project "eepp-sound" kind "ConsoleApp" language "C++" files { "src/examples/sound/*.cpp" } - build_link_configuration( "eesound", true ) + build_link_configuration( "eepp-sound", true ) project "eepp-sprites" set_kind() language "C++" files { "src/examples/sprites/*.cpp" } - build_link_configuration( "eesprites", true ) + build_link_configuration( "eepp-sprites", true ) project "eepp-fonts" set_kind() language "C++" files { "src/examples/fonts/*.cpp" } - build_link_configuration( "eefonts", true ) + build_link_configuration( "eepp-fonts", true ) project "eepp-vbo-fbo-batch" set_kind() language "C++" files { "src/examples/vbo_fbo_batch/*.cpp" } - build_link_configuration( "eevbo-fbo-batch", true ) + build_link_configuration( "eepp-vbo-fbo-batch", true ) project "eepp-physics" set_kind() language "C++" files { "src/examples/physics/*.cpp" } - build_link_configuration( "eephysics", true ) + build_link_configuration( "eepp-physics", true ) project "eepp-http-request" kind "ConsoleApp" language "C++" files { "src/examples/http_request/*.cpp" } includedirs { "src/thirdparty" } - build_link_configuration( "eehttp-request", true ) + build_link_configuration( "eepp-http-request", true ) project "eepp-ui-hello-world" set_kind() language "C++" files { "src/examples/ui_hello_world/*.cpp" } includedirs { "src/thirdparty" } - build_link_configuration( "eeui-hello-world", true ) + build_link_configuration( "eepp-ui-hello-world", true ) -- Tools project "eepp-textureatlaseditor" @@ -1041,6 +1070,13 @@ solution "eepp" files { "src/tools/uieditor/*.cpp" } build_link_configuration( "eepp-UIEditor", true ) + project "eepp-texturepacker" + kind "ConsoleApp" + language "C++" + includedirs { "src/thirdparty" } + files { "src/tools/texturepacker/*.cpp" } + build_link_configuration( "eepp-TexturePacker", true ) + if os.isfile("external_projects.lua") then dofile("external_projects.lua") end diff --git a/premake5.lua b/premake5.lua index c68c8f394..9798828a3 100644 --- a/premake5.lua +++ b/premake5.lua @@ -35,11 +35,6 @@ function multiple_insert( parent_table, insert_table ) end end -function get_ios_arch() - local archs = string.explode( os.target(), "-" ) - return archs[ table_length( archs ) ] -end - function os_findlib( name ) if os.istarget("macosx") and ( is_xcode() or _OPTIONS["use-frameworks"] ) then local path = "/Library/Frameworks/" .. name .. ".framework" @@ -137,7 +132,7 @@ function build_base_configuration( package_name ) filter "action:not vs*" cdialect "gnu99" - buildoptions{ "-Wall" } + buildoptions { "-Wall" } filter "action:vs*" incdirs { "src/thirdparty/libzip/vs" } @@ -151,37 +146,21 @@ function build_base_cpp_configuration( package_name ) set_ios_config() set_xcode_config() + filter "action:not vs*" + buildoptions { "-Wall" } + filter "configurations:debug" defines { "DEBUG" } symbols "On" - if not is_vs() then - buildoptions{ "-Wall" } - end targetname ( package_name .. "-debug" ) filter "configurations:release" optimize "Speed" - if not is_vs() then - buildoptions{ "-Wall" } - end targetname ( package_name ) end -function add_cross_config_links() - if not is_vs() then - if os.istarget("mingw32") or os.istarget("windows") or os.istarget("ios") then -- if is crosscompiling from *nix - linkoptions { "-static-libgcc", "-static-libstdc++" } - end - - if os.istarget("mingw32") then - linkoptions { "-Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic" } - end - end -end - function build_link_configuration( package_name, use_ee_icon ) incdirs { "include" } - local extension = ""; if package_name == "eepp" then @@ -190,10 +169,6 @@ function build_link_configuration( package_name, use_ee_icon ) defines { "EE_STATIC" } end - if not is_vs() then - buildoptions{ "-std=c++14" } - end - if package_name ~= "eepp" and package_name ~= "eepp-static" then if not _OPTIONS["with-static-eepp"] then links { "eepp-shared" } @@ -203,64 +178,47 @@ function build_link_configuration( package_name, use_ee_icon ) add_static_links() links { link_list } end - - if os.istarget("windows") and not is_vs() then - if ( true == use_ee_icon ) then - linkoptions { "../../bin/assets/icon/ee.res" } - end - end - - if os.istarget("emscripten") then - extension = ".html" - - if ( package_name ~= "eeew" and - package_name ~= "eees" and - package_name ~= "eehttp-request" and - package_name ~= "eephysics" and - package_name ~= "eevbo-fbo-batch" - ) then - linkoptions { "--preload-file assets/" } - end - end end set_ios_config() set_xcode_config() - filter "configurations:debug" - defines { "DEBUG", "EE_DEBUG", "EE_MEMORY_MANAGER" } - symbols "On" - - if not is_vs() and not os.istarget("emscripten") then - buildoptions{ "-Wall -Wno-long-long" } + filter { "system:windows", "action:not vs*" } + if ( true == use_ee_icon ) then + linkoptions { "../../bin/assets/icon/ee.res" } end + filter "action:not vs*" + cppdialect "C++14" + buildoptions { "-Wall" } + + filter { "configurations:debug", "action:not vs*" } + buildoptions{ "-Wno-long-long" } + + filter { "configurations:release", "action:not vs*" } + buildoptions { "-fno-strict-aliasing -ffast-math" } + + filter { "configurations:release", "action:not vs*", "system:not macosx" } + buildoptions { "-s" } + + filter "configurations:debug" + defines { "DEBUG", "EE_DEBUG", "EE_MEMORY_MANAGER" } targetname ( package_name .. "-debug" .. extension ) filter "configurations:release" - optimize "Speed" - - if not is_vs() and not os.istarget("emscripten") then - buildoptions { "-fno-strict-aliasing -ffast-math" } - end - - if not is_vs() and not os.istarget("emscripten") and not os.istarget("macosx") then - buildoptions { "-s" } - end - targetname ( package_name .. extension ) - filter "system:windows" - add_cross_config_links() + filter { "system:windows or system:ios", "action:not vs*" } + linkoptions { "-static-libgcc", "-static-libstdc++" } - if _OPTIONS["windows-vc-build"] then - syslibdirs { "src/thirdparty/" .. remote_sdl2_version .."/lib/x86" } - end - - if is_vs() and table.contains( backends, "SDL2" ) then + filter { "system:windows", "action:vs*" } + if table.contains( backends, "SDL2" ) then links { "SDL2", "SDL2main" } end + filter { "options:windows-vc-build", "system:windows" } + syslibdirs { "src/thirdparty/" .. remote_sdl2_version .."/lib/x86" } + filter "system:emscripten" linkoptions{ "-O2 -s TOTAL_MEMORY=67108864 -s ASM_JS=1 -s VERBOSE=1 -s DISABLE_EXCEPTION_CATCHING=0 -s USE_SDL=2 -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s ERROR_ON_MISSING_LIBRARIES=0 -s FULL_ES3=1 -s \"BINARYEN_TRAP_MODE='clamp'\"" } buildoptions { "-fno-strict-aliasing -O2 -s USE_SDL=2 -s PRECISE_F32=1 -s ENVIRONMENT=web" } @@ -390,7 +348,7 @@ function set_xcode_config() end function set_ios_config() - if _OPTIONS.platform == "ios-arm7" or _OPTIONS.platform == "ios-x86" then + if os.istarget("ios") then local err = false if nil == os.getenv("TOOLCHAINPATH") then @@ -495,50 +453,7 @@ function check_ssl_support() defines { "EE_SSL_SUPPORT" } end -function set_macos_and_ios_config() - if os.istarget("macosx") and ( is_xcode() or _OPTIONS["use-frameworks"] ) then - libdirs { "/System/Library/Frameworks", "/Library/Frameworks" } - end - - if _OPTIONS["use-frameworks"] then - defines { "EE_USE_FRAMEWORKS" } - end -end - function build_eepp( build_name ) - incdirs { "include", "src", "src/thirdparty", "include/eepp/thirdparty", "src/thirdparty/freetype2/include", "src/thirdparty/zlib", "src/thirdparty/libogg/include", "src/thirdparty/libvorbis/include", "src/thirdparty/mbedtls/include" } - - if _OPTIONS["with-mojoal"] then - defines( "AL_LIBTYPE_STATIC" ) - incdirs { "src/thirdparty/mojoAL" } - end - - if _OPTIONS["windows-vc-build"] then - incdirs { "src/thirdparty/" .. remote_sdl2_version .. "/include" } - end - - set_macos_and_ios_config() - set_ios_config() - set_xcode_config() - - add_static_links() - - if is_vs() then - incdirs { "src/thirdparty/libzip/vs" } - end - - if not is_vs() then - buildoptions{ "-std=c++14" } - end - - if os.istarget("windows") then - files { "src/eepp/system/platform/win/*.cpp" } - files { "src/eepp/network/platform/win/*.cpp" } - else - files { "src/eepp/system/platform/posix/*.cpp" } - files { "src/eepp/network/platform/unix/*.cpp" } - end - files { "src/eepp/core/*.cpp", "src/eepp/math/*.cpp", "src/eepp/system/*.cpp", @@ -561,57 +476,74 @@ function build_eepp( build_name ) "src/eepp/maps/mapeditor/*.cpp" } + incdirs { "include", + "src", + "src/thirdparty", + "include/eepp/thirdparty", + "src/thirdparty/freetype2/include", + "src/thirdparty/zlib", + "src/thirdparty/libogg/include", + "src/thirdparty/libvorbis/include", + "src/thirdparty/mbedtls/include" + } + + add_static_links() check_ssl_support() - select_backend() - if _OPTIONS["with-dynamic-freetype"] and os_findlib("freetype") then - table.insert( link_list, get_backend_link_name( "freetype" ) ) - end - multiple_insert( link_list, os_links ) links { link_list } build_link_configuration( build_name ) - configuration "emscripten" - if _OPTIONS["force-gles1"] then - defines{ "EE_GLES1_DEFAULT" } - end -end + filter "options:use-frameworks" + defines { "EE_USE_FRAMEWORKS" } -function set_targetdir( dir ) - if os.istarget("ios") then - targetdir(dir .. get_ios_arch() .. "/" ) - else - targetdir(dir) - end + filter { "system:macosx", "action:xcode* or options:use-frameworks" } + libdirs { "/System/Library/Frameworks", "/Library/Frameworks" } + + filter "with-dynamic-freetype" + if os_findlib("freetype") then + table.insert( link_list, get_backend_link_name( "freetype" ) ) + end + + filter "system:windows" + files { "src/eepp/system/platform/win/*.cpp" } + files { "src/eepp/network/platform/win/*.cpp" } + + filter "system:not windows" + files { "src/eepp/system/platform/posix/*.cpp" } + files { "src/eepp/network/platform/unix/*.cpp" } + + filter "with-mojoal" + defines( "AL_LIBTYPE_STATIC" ) + incdirs { "src/thirdparty/mojoAL" } + + filter "options:windows-vc-build" + incdirs { "src/thirdparty/" .. remote_sdl2_version .. "/include" } + + filter "action:vs*" + incdirs { "src/thirdparty/libzip/vs" } + + filter "action:not vs*" + cppdialect "C++14" end workspace "eepp" targetdir("./bin/") configurations { "debug", "release" } rtti "On" - download_and_extract_dependencies() + generate_os_links() + parse_args() + location("./make/" .. os.target() .. "/") + objdir("obj/" .. os.target() .. "/") - if os.istarget("android") then + filter "system:android" ndkabi "arm64-v8a" ndkplatform "android-28" ndkstl "c++_static" - end - - if os.istarget("ios") then - location("./make/" .. os.target() .. "/" ) - objdir("obj/" .. os.target() .. "/" .. get_ios_arch() .. "/" ) - else - location("./make/" .. os.target() .. "/") - objdir("obj/" .. os.target() .. "/") - end - - generate_os_links() - parse_args() filter "configurations:debug" defines { "DEBUG" } @@ -621,7 +553,7 @@ workspace "eepp" project "SOIL2-static" kind "StaticLib" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/SOIL2/src/SOIL2/*.c" } incdirs { "src/thirdparty/SOIL2" } build_base_configuration( "SOIL2" ) @@ -635,7 +567,7 @@ workspace "eepp" kind "StaticLib" language "C" defines { "GLEW_NO_GLU", "GLEW_STATIC" } - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/glew/*.c" } incdirs { "include/thirdparty/glew" } build_base_configuration( "glew" ) @@ -643,7 +575,7 @@ workspace "eepp" project "mbedtls-static" kind "StaticLib" language "C" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") incdirs { "src/thirdparty/mbedtls/include/" } files { "src/thirdparty/mbedtls/library/*.c" } build_base_cpp_configuration( "mbedtls" ) @@ -651,7 +583,7 @@ workspace "eepp" project "vorbis-static" kind "StaticLib" language "C" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") incdirs { "src/thirdparty/libvorbis/lib/", "src/thirdparty/libogg/include", "src/thirdparty/libvorbis/include" } files { "src/thirdparty/libogg/**.c", "src/thirdparty/libvorbis/**.c" } build_base_cpp_configuration( "vorbis" ) @@ -659,21 +591,21 @@ workspace "eepp" project "pugixml-static" kind "StaticLib" language "C++" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/pugixml/*.cpp" } build_base_cpp_configuration( "pugixml" ) project "zlib-static" kind "StaticLib" language "C" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/zlib/*.c" } build_base_configuration( "zlib" ) project "libzip-static" kind "StaticLib" language "C" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/libzip/*.c" } incdirs { "src/thirdparty/zlib" } build_base_configuration( "libzip" ) @@ -681,7 +613,7 @@ workspace "eepp" project "freetype-static" kind "StaticLib" language "C" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") defines { "FT2_BUILD_LIBRARY" } files { "src/thirdparty/freetype2/src/**.c" } incdirs { "src/thirdparty/freetype2/include" } @@ -689,7 +621,7 @@ workspace "eepp" project "chipmunk-static" kind "StaticLib" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/chipmunk/*.c", "src/thirdparty/chipmunk/constraints/*.c" } incdirs { "include/eepp/thirdparty/chipmunk" } build_base_configuration( "chipmunk" ) @@ -702,21 +634,21 @@ workspace "eepp" project "jpeg-compressor-static" kind "StaticLib" language "C++" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/jpeg-compressor/*.cpp" } build_base_cpp_configuration( "jpeg-compressor" ) project "imageresampler-static" kind "StaticLib" language "C++" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") files { "src/thirdparty/imageresampler/*.cpp" } build_base_cpp_configuration( "imageresampler" ) project "mojoal-static" kind "StaticLib" language "C" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") incdirs { "include/eepp/thirdparty/mojoAL" } defines( "AL_LIBTYPE_STATIC" ) files { "src/thirdparty/mojoAL/*.c" } @@ -727,38 +659,65 @@ workspace "eepp" project "efsw-static" kind "StaticLib" language "C++" - set_targetdir("libs/" .. os.target() .. "/thirdparty/") + targetdir("libs/" .. os.target() .. "/thirdparty/") incdirs { "src/thirdparty/efsw/include", "src/thirdparty/efsw/src" } files { "src/thirdparty/efsw/src/efsw/*.cpp" } build_base_cpp_configuration( "efsw" ) filter "system:windows" files { "src/thirdparty/efsw/src/efsw/platform/win/*.cpp" } - excludes { "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", + "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" + } filter "system:linux" - excludes { "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", + "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherKqueue.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" + } filter "system:macosx" - excludes { "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp" + } filter "system:bsd" - excludes { "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" } + excludes { + "src/thirdparty/efsw/src/efsw/WatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/WatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/WatcherFSEvents.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherInotify.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherWin32.cpp", + "src/thirdparty/efsw/src/efsw/FileWatcherFSEvents.cpp" + } filter "system:not windows" files { "src/thirdparty/efsw/src/efsw/platform/posix/*.cpp" } + -- Library project "eepp-main" kind "StaticLib" language "C++" - set_targetdir("libs/" .. os.target() .. "/") + targetdir("libs/" .. os.target() .. "/") files { "src/eepp/main/eepp_main.cpp" } project "eepp-static" kind "StaticLib" language "C++" - set_targetdir("libs/" .. os.target() .. "/") + targetdir("libs/" .. os.target() .. "/") build_eepp( "eepp-static" ) project "eepp-shared" kind "SharedLib" language "C++" - set_targetdir("libs/" .. os.target() .. "/") + targetdir("libs/" .. os.target() .. "/") build_eepp( "eepp" ) -- Examples @@ -766,63 +725,63 @@ workspace "eepp" set_kind() language "C++" files { "src/test/*.cpp" } - build_link_configuration( "eetest", true ) + build_link_configuration( "eepp-test", true ) - project "eepp-es" + project "eepp-external-shader" set_kind() language "C++" files { "src/examples/external_shader/*.cpp" } - build_link_configuration( "eees", true ) + build_link_configuration( "eepp-external-shader", true ) - project "eepp-ew" + project "eepp-empty-window" set_kind() language "C++" files { "src/examples/empty_window/*.cpp" } - build_link_configuration( "eeew", true ) + build_link_configuration( "eepp-empty-window", true ) project "eepp-sound" kind "ConsoleApp" language "C++" files { "src/examples/sound/*.cpp" } - build_link_configuration( "eesound", true ) + build_link_configuration( "eepp-sound", true ) project "eepp-sprites" set_kind() language "C++" files { "src/examples/sprites/*.cpp" } - build_link_configuration( "eesprites", true ) + build_link_configuration( "eepp-sprites", true ) project "eepp-fonts" set_kind() language "C++" files { "src/examples/fonts/*.cpp" } - build_link_configuration( "eefonts", true ) + build_link_configuration( "eepp-fonts", true ) project "eepp-vbo-fbo-batch" set_kind() language "C++" files { "src/examples/vbo_fbo_batch/*.cpp" } - build_link_configuration( "eevbo-fbo-batch", true ) + build_link_configuration( "eepp-vbo-fbo-batch", true ) project "eepp-physics" set_kind() language "C++" files { "src/examples/physics/*.cpp" } - build_link_configuration( "eephysics", true ) + build_link_configuration( "eepp-physics", true ) project "eepp-http-request" kind "ConsoleApp" language "C++" files { "src/examples/http_request/*.cpp" } incdirs { "src/thirdparty" } - build_link_configuration( "eehttp-request", true ) + build_link_configuration( "eepp-http-request", true ) project "eepp-ui-hello-world" set_kind() language "C++" files { "src/examples/ui_hello_world/*.cpp" } incdirs { "src/thirdparty" } - build_link_configuration( "eeui-hello-world", true ) + build_link_configuration( "eepp-ui-hello-world", true ) -- Tools project "eepp-textureatlaseditor" @@ -849,6 +808,13 @@ workspace "eepp" filter { "system:not windows", "system:not haiku" } links { "pthread" } + project "eepp-texturepacker" + kind "ConsoleApp" + language "C++" + incdirs { "src/thirdparty" } + files { "src/tools/texturepacker/*.cpp" } + build_link_configuration( "eepp-TexturePacker", true ) + if os.isfile("external_projects.lua") then dofile("external_projects.lua") end diff --git a/projects/emscripten/make.sh b/projects/emscripten/make.sh index b80aa3743..a960165f3 100755 --- a/projects/emscripten/make.sh +++ b/projects/emscripten/make.sh @@ -1,5 +1,7 @@ #!/bin/sh -# Currently latest emsdk tested and working version: 1.38.33 +# Currently latest emsdk tested and working version: latest-fastcomp +# remember to first set the environment +# source /path/to/emsdk/emsdk_env.sh cd $(dirname "$0") premake4 --file=../../premake4.lua --with-gles1 --with-gles2 --with-static-eepp --platform=emscripten --with-backend=SDL2 gmake cd ../../make/emscripten/ @@ -7,4 +9,4 @@ ln -sf ../../bin/assets/ ./ sed -i 's/-rcs/rcs/g' *.make emmake make -j`nproc` $@ # Fix a bug in emscripten, see my patch: https://github.com/emscripten-core/emscripten/pull/10208 -sed 's/function _alGetSource3f(source,/function _alGetSource3f(sourceId,/' ../../bin/*.js +sed -i 's/function _alGetSource3f(source,/function _alGetSource3f(sourceId,/' ../../bin/*.js diff --git a/projects/linux/ee.creator.user b/projects/linux/ee.creator.user index bd469a6a8..ee20be591 100644 --- a/projects/linux/ee.creator.user +++ b/projects/linux/ee.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -77,9 +77,9 @@ Desktop Desktop {6d057187-158a-4883-8d5b-d470a6b6b025} - 12 + 10 0 - 15 + 17 ../../make/linux @@ -995,8 +995,8 @@ 2 - %{buildDir}../../../bin/eetest-debug - eetest-debug + %{buildDir}../../../bin/eepp-test-debug + eepp-test-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -1071,8 +1071,8 @@ 2 - %{buildDir}../../../bin/eetest - eetest-release + %{buildDir}../../../bin/eepp-test + eepp-test-release ProjectExplorer.CustomExecutableRunConfiguration @@ -1147,8 +1147,8 @@ 2 - %{buildDir}../../../bin/eephysics-debug - eephysics-debug + %{buildDir}../../../bin/eepp-physics-debug + eepp-physics-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -1223,8 +1223,8 @@ 2 - %{buildDir}../../../bin/eehttp-request-debug - eehttp-request-debug + %{buildDir}../../../bin/eepp-http-request-debug + eepp-http-request-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -1603,8 +1603,8 @@ 2 - %{buildDir}../../../bin/eeui-hello-world-debug - eeui-hello-world-debug + %{buildDir}../../../bin/eepp-ui-hello-world-debug + eepp-ui-hello-world-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -1619,6 +1619,82 @@ %{buildDir}../../../bin/ + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 0 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + %{buildDir}../../../bin/eepp-TexturePacker-debug + eepp-TexturePacker-debug + ProjectExplorer.CustomExecutableRunConfiguration + + -p assets/ui/uitheme/ -o textureatlas.eta -u --allow-childs + false + + true + false + false + false + false + false + %{buildDir}../../../bin/ + + dwarf @@ -1679,8 +1755,8 @@ 2 - %{buildDir}../../../bin/eeew-debug - eeew-debug + %{buildDir}../../../bin/eepp-empty-window-debug + eepp-empty-window-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -1755,8 +1831,8 @@ 2 - %{buildDir}../../../bin/eeew - eeew-release + %{buildDir}../../../bin/eepp-empty-window + eepp-empty-window-release ProjectExplorer.CustomExecutableRunConfiguration @@ -1831,8 +1907,8 @@ 2 - %{buildDir}../../../bin/eees-debug - eees-debug + %{buildDir}../../../bin/eepp-external-shader-debug + eepp-external-shader-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -1907,8 +1983,8 @@ 2 - %{buildDir}../../../bin/eees - eees-release + %{buildDir}../../../bin/eepp-external-shader + eepp-external-shader-release ProjectExplorer.CustomExecutableRunConfiguration @@ -1983,8 +2059,8 @@ 2 - %{buildDir}../../../bin/eesound-debug - eesound-debug + %{buildDir}../../../bin/eepp-sound-debug + eepp-sound-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -2059,8 +2135,8 @@ 2 - %{buildDir}../../../bin/eesprites-debug - eesprites-debug + %{buildDir}../../../bin/eepp-sprites-debug + eepp-sprites-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -2135,8 +2211,8 @@ 2 - %{buildDir}../../../bin/eefonts-debug - eefonts-debug + %{buildDir}../../../bin/eepp-fonts-debug + eepp-fonts-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -2211,8 +2287,8 @@ 2 - %{buildDir}../../../bin/eevbo-fbo-batch-debug - eevbo-fbo-batch-debug + %{buildDir}../../../bin/eepp-vbo-fbo-batch-debug + eepp-vbo-fbo-batch-debug ProjectExplorer.CustomExecutableRunConfiguration @@ -2227,7 +2303,7 @@ %{buildDir}../../../bin/ - 17 + 18 diff --git a/projects/linux/ee.files b/projects/linux/ee.files index dd0e4e397..b1000cf23 100644 --- a/projects/linux/ee.files +++ b/projects/linux/ee.files @@ -911,4 +911,5 @@ ../../src/thirdparty/SOIL2/src/SOIL2/stbi_pvr.h ../../src/tools/mapeditor/mapeditor.cpp ../../src/tools/textureatlaseditor/textureatlaseditor.cpp +../../src/tools/texturepacker/texturepacker.cpp ../../src/tools/uieditor/uieditor.cpp diff --git a/src/eepp/graphics/fonttruetype.cpp b/src/eepp/graphics/fonttruetype.cpp index fc59924b4..88a28f575 100644 --- a/src/eepp/graphics/fonttruetype.cpp +++ b/src/eepp/graphics/fonttruetype.cpp @@ -28,7 +28,22 @@ unsigned long read( FT_Stream rec, unsigned long offset, unsigned char* buffer, } else return count > 0 ? 0 : 1; // error code is 0 if we're reading, or nonzero if we're seeking } + void close( FT_Stream ) {} + +// Helper to intepret memory as a specific type +template inline T reinterpret( const U& input ) { + T output; + std::memcpy( &output, &input, sizeof( U ) ); + return output; +} + +// Combine outline thickness, boldness and font glyph index into a single 64-bit key +EE::Uint64 combine( float outlineThickness, bool bold, EE::Uint32 index ) { + return ( static_cast( reinterpret( outlineThickness ) ) << 32 ) | + ( static_cast( bold ) << 31 ) | index; +} + } // namespace namespace EE { namespace Graphics { @@ -273,8 +288,8 @@ const Glyph& FontTrueType::getGlyph( Uint32 codePoint, unsigned int characterSiz GlyphTable& glyphs = mPages[characterSize].glyphs; // Build the key by combining the code point, bold flag, and outline thickness - Uint64 key = ( static_cast( *reinterpret_cast( &outlineThickness ) ) << 32 ) | - ( static_cast( bold ? 1 : 0 ) << 31 ) | static_cast( codePoint ); + Uint64 key = combine( outlineThickness, bold, + FT_Get_Char_Index( static_cast( mFace ), codePoint ) ); // Search the glyph into the cache GlyphTable::const_iterator it = glyphs.find( key ); diff --git a/src/eepp/graphics/textureatlasloader.cpp b/src/eepp/graphics/textureatlasloader.cpp index 85f3b399e..da90763c0 100644 --- a/src/eepp/graphics/textureatlasloader.cpp +++ b/src/eepp/graphics/textureatlasloader.cpp @@ -233,9 +233,6 @@ void TextureAtlasLoader::createTextureRegions() { // Create the Texture Atlas with the name of the real texture, not the Childs ( example // load 1.png and not 1_ch1.png ) if ( 0 == z ) { - if ( mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_REMOVE_EXTENSION ) - name = FileSystem::fileRemoveExtension( name ); - std::string etapath = FileSystem::fileRemoveExtension( path ) + EE_TEXTURE_ATLAS_EXTENSION; @@ -260,10 +257,6 @@ void TextureAtlasLoader::createTextureRegions() { sTextureRegionHdr* tSh = &tTexAtlas->TextureRegions[i]; std::string TextureRegionName( &tSh->Name[0] ); - - if ( mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_REMOVE_EXTENSION ) - TextureRegionName = FileSystem::fileRemoveExtension( TextureRegionName ); - Rect tRect( tSh->X, tSh->Y, tSh->X + tSh->Width, tSh->Y + tSh->Height ); TextureRegion* tTextureRegion = TextureRegion::New( @@ -372,8 +365,8 @@ bool TextureAtlasLoader::updateTextureAtlas() { return false; } -bool TextureAtlasLoader::updateTextureAtlas( std::string TextureAtlasPath, - std::string ImagesPath ) { +bool TextureAtlasLoader::updateTextureAtlas( std::string TextureAtlasPath, std::string ImagesPath, + Sizei maxImageSize ) { if ( !TextureAtlasPath.size() || !ImagesPath.size() || !FileSystem::fileExists( TextureAtlasPath ) || !FileSystem::isDirectory( ImagesPath ) ) return false; @@ -464,16 +457,19 @@ bool TextureAtlasLoader::updateTextureAtlas( std::string TextureAtlasPath, Image::saveTypeToExtension( mTexGrHdr.Format ) ); if ( 2 == NeedUpdate ) { - TexturePacker tp( mTexGrHdr.Width, mTexGrHdr.Height, pixelDensity, - 0 != ( mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_POW_OF_TWO ), - 0 != ( mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_SCALABLE_SVG ), - mTexGrHdr.PixelBorder, - (Texture::TextureFilter)mTexGrHdr.TextureFilter, - mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_ALLOW_FLIPPING ); + TexturePacker tp( + maxImageSize.getWidth() == 0 ? mTexGrHdr.Width : maxImageSize.getWidth(), + maxImageSize.getHeight() == 0 ? mTexGrHdr.Height : maxImageSize.getHeight(), + pixelDensity, 0 != ( mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_POW_OF_TWO ), + 0 != ( mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_SCALABLE_SVG ), mTexGrHdr.PixelBorder, + (Texture::TextureFilter)mTexGrHdr.TextureFilter, + mTexGrHdr.Flags & HDR_TEXTURE_ATLAS_ALLOW_FLIPPING ); tp.addTexturesPath( ImagesPath ); - tp.packTextures(); + if ( tp.packTextures() <= 0 ) { + return false; + } tp.save( tapath, (Image::SaveType)mTexGrHdr.Format ); } else if ( 1 == NeedUpdate ) { diff --git a/src/eepp/graphics/texturepacker.cpp b/src/eepp/graphics/texturepacker.cpp index 266507487..9eb73b66d 100644 --- a/src/eepp/graphics/texturepacker.cpp +++ b/src/eepp/graphics/texturepacker.cpp @@ -12,26 +12,27 @@ TexturePacker* TexturePacker::New() { return eeNew( TexturePacker, () ); } -TexturePacker* TexturePacker::New( const Uint32& MaxWidth, const Uint32& MaxHeight, - const PixelDensitySize& PixelDensity, const bool& ForcePowOfTwo, - const bool& scalableSVG, const Uint32& PixelBorder, +TexturePacker* TexturePacker::New( const Uint32& maxWidth, const Uint32& maxHeight, + const PixelDensitySize& pixelDensity, const bool& forcePowOfTwo, + const bool& scalableSVG, const Uint32& pixelBorder, const Texture::TextureFilter& textureFilter, - const bool& AllowFlipping ) { - return eeNew( TexturePacker, ( MaxWidth, MaxHeight, PixelDensity, ForcePowOfTwo, scalableSVG, - PixelBorder, textureFilter, AllowFlipping ) ); + const bool& allowChilds, const bool& allowFlipping ) { + return eeNew( TexturePacker, ( maxWidth, maxHeight, pixelDensity, forcePowOfTwo, scalableSVG, + pixelBorder, textureFilter, allowChilds, allowFlipping ) ); } -TexturePacker::TexturePacker( const Uint32& MaxWidth, const Uint32& MaxHeight, - const PixelDensitySize& PixelDensity, const bool& ForcePowOfTwo, - const bool& scalableSVG, const Uint32& PixelBorder, - const Texture::TextureFilter& textureFilter, - const bool& AllowFlipping ) : +TexturePacker::TexturePacker( const Uint32& maxWidth, const Uint32& maxHeight, + const PixelDensitySize& pixelDensity, const bool& forcePowOfTwo, + const bool& scalableSVG, const Uint32& pixelBorder, + const Texture::TextureFilter& textureFilter, const bool& allowChilds, + const bool& allowFlipping ) : mTotalArea( 0 ), mFreeList( NULL ), mWidth( 128 ), mHeight( 128 ), mPacked( false ), - mAllowFlipping( false ), + mAllowFlipping( allowFlipping ), + mAllowChilds( allowChilds ), mChild( NULL ), mStrategy( PackBig ), mCount( 0 ), @@ -39,13 +40,13 @@ TexturePacker::TexturePacker( const Uint32& MaxWidth, const Uint32& MaxHeight, mPlacedCount( 0 ), mForcePowOfTwo( true ), mPixelBorder( 0 ), - mPixelDensity( PixelDensity ), + mPixelDensity( pixelDensity ), mTextureFilter( textureFilter ), mSaveExtensions( false ), mScalableSVG( scalableSVG ), mFormat( Image::SaveType::SAVE_TYPE_PNG ) { - setOptions( MaxWidth, MaxHeight, PixelDensity, ForcePowOfTwo, scalableSVG, PixelBorder, - textureFilter, AllowFlipping ); + setOptions( maxWidth, maxHeight, pixelDensity, forcePowOfTwo, scalableSVG, pixelBorder, + textureFilter, allowChilds, allowFlipping ); } TexturePacker::TexturePacker() : @@ -131,25 +132,26 @@ Uint32 TexturePacker::getAtlasNumChannels() { return maxChannels; } -void TexturePacker::setOptions( const Uint32& MaxWidth, const Uint32& MaxHeight, - const PixelDensitySize& PixelDensity, const bool& ForcePowOfTwo, - const bool& scalableSVG, const Uint32& PixelBorder, +void TexturePacker::setOptions( const Uint32& maxWidth, const Uint32& maxHeight, + const PixelDensitySize& pixelDensity, const bool& forcePowOfTwo, + const bool& scalableSVG, const Uint32& pixelBorder, const Texture::TextureFilter& textureFilter, - const bool& AllowFlipping ) { + const bool& allowChilds, const bool& allowFlipping ) { if ( !mTextures.size() ) { // only can change the dimensions before adding any texture - mMaxSize.x = MaxWidth; - mMaxSize.y = MaxHeight; + mMaxSize.x = maxWidth; + mMaxSize.y = maxHeight; - if ( ForcePowOfTwo && !Math::isPow2( mMaxSize.x ) ) + if ( forcePowOfTwo && !Math::isPow2( mMaxSize.x ) ) mMaxSize.x = Math::nextPowOfTwo( mMaxSize.x ); - if ( ForcePowOfTwo && !Math::isPow2( mMaxSize.y ) ) + if ( forcePowOfTwo && !Math::isPow2( mMaxSize.y ) ) mMaxSize.y = Math::nextPowOfTwo( mMaxSize.y ); - mForcePowOfTwo = ForcePowOfTwo; - mAllowFlipping = AllowFlipping; - mPixelBorder = PixelBorder; - mPixelDensity = PixelDensity; + mForcePowOfTwo = forcePowOfTwo; + mAllowFlipping = allowFlipping; + mAllowChilds = allowChilds; + mPixelBorder = pixelBorder; + mPixelDensity = pixelDensity; mTextureFilter = textureFilter; mScalableSVG = scalableSVG; } @@ -397,8 +399,8 @@ void TexturePacker::insertTexture( TexturePackerTex* t, TexturePackerNode* bestF } void TexturePacker::createChild() { - mChild = eeNew( TexturePacker, ( mWidth, mHeight, mPixelDensity, mForcePowOfTwo, mScalableSVG, - mPixelBorder, mTextureFilter, mAllowFlipping ) ); + mChild = TexturePacker::New( mWidth, mHeight, mPixelDensity, mForcePowOfTwo, mScalableSVG, + mPixelBorder, mTextureFilter, mAllowFlipping ); std::list::iterator it; std::list::iterator> remove; @@ -504,8 +506,7 @@ bool TexturePacker::addTexture( const std::string& TexturePath ) { return false; } -Int32 TexturePacker::packTextures() { // pack the textures, the return code is the amount of - // wasted/unused area. +Int32 TexturePacker::packTextures() { TexturePackerTex* t = NULL; addBorderToTextures( (Int32)mPixelBorder ); @@ -569,8 +570,9 @@ Int32 TexturePacker::packTextures() { // pack the textures, the return code is t return packTextures(); } else { - eePRINTL( "Creating a new image as a child." ); - createChild(); + if ( !mAllowChilds ) { + return 0; + } } break; @@ -578,8 +580,13 @@ Int32 TexturePacker::packTextures() { // pack the textures, the return code is t } if ( mCount > 0 ) { - eePRINTL( "Creating a new image as a child. Some textures couldn't get it: %d", mCount ); - createChild(); + if ( mAllowChilds ) { + eePRINTL( "Creating a new image as a child. Some textures couldn't get it: %d", + mCount ); + createChild(); + } else { + return 0; + } } addBorderToTextures( -( (Int32)mPixelBorder ) ); @@ -594,7 +601,7 @@ Int32 TexturePacker::packTextures() { // pack the textures, the return code is t eePRINTL( "Total Area Used: %d. This represents the %4.3f percent", mTotalArea, ( (double)mTotalArea / (double)( mWidth * mHeight ) ) * 100.0 ); - return ( mWidth * mHeight ) - mTotalArea; + return mTotalArea; } void TexturePacker::save( const std::string& Filepath, const Image::SaveType& Format, @@ -671,15 +678,12 @@ Int32 TexturePacker::getChildCount() { } void TexturePacker::saveTextureRegions() { - if ( NULL != mParent ) - return; - sTextureAtlasHdr TexGrHdr; TexGrHdr.Magic = EE_TEXTURE_ATLAS_MAGIC; - TexGrHdr.Version = 1000; + TexGrHdr.Version = 2000; TexGrHdr.Date = static_cast( Sys::getSystemTime() ); - TexGrHdr.TextureCount = 1 + getChildCount(); + TexGrHdr.TextureCount = 1; TexGrHdr.Format = mFormat; TexGrHdr.Width = mWidth; TexGrHdr.Height = mHeight; @@ -706,15 +710,6 @@ void TexturePacker::saveTextureRegions() { TexHdr[0] = createTextureHdr( this ); - Int32 HdrPos = 1; - TexturePacker* Child = mChild; - - while ( NULL != Child ) { - TexHdr[HdrPos] = createTextureHdr( Child ); - Child = Child->getChild(); - HdrPos++; - } - std::vector tTextureRegionsHdr; std::string path = FileSystem::fileRemoveExtension( mFilepath ) + EE_TEXTURE_ATLAS_EXTENSION; @@ -730,24 +725,6 @@ void TexturePacker::saveTextureRegions() { if ( tTextureRegionsHdr.size() ) fs.write( reinterpret_cast( &tTextureRegionsHdr[0] ), sizeof( sTextureRegionHdr ) * (std::streamsize)tTextureRegionsHdr.size() ); - - Int32 HdrPos = 1; - TexturePacker* Child = mChild; - - while ( NULL != Child ) { - fs.write( reinterpret_cast( &TexHdr[HdrPos] ), sizeof( sTextureHdr ) ); - - createTextureRegionsHdr( Child, tTextureRegionsHdr ); - - if ( tTextureRegionsHdr.size() ) - fs.write( reinterpret_cast( &tTextureRegionsHdr[0] ), - sizeof( sTextureRegionHdr ) * - (std::streamsize)tTextureRegionsHdr.size() ); - - Child = Child->getChild(); - - HdrPos++; - } } } @@ -770,13 +747,16 @@ void TexturePacker::createTextureRegionsHdr( TexturePacker* Packer, if ( tTex->placed() ) { std::string name = FileSystem::fileNameFromPath( tTex->name() ); + if ( !mSaveExtensions ) + name = FileSystem::fileRemoveExtension( name ); + + if ( name.size() > HDR_NAME_SIZE ) + name.resize( HDR_NAME_SIZE ); + memset( tTextureRegionHdr.Name, 0, HDR_NAME_SIZE ); String::strCopy( tTextureRegionHdr.Name, name.c_str(), HDR_NAME_SIZE ); - if ( !mSaveExtensions ) - name = FileSystem::fileRemoveExtension( name ); - tTextureRegionHdr.ResourceID = String::hash( name ); tTextureRegionHdr.Width = tTex->width(); tTextureRegionHdr.Height = tTex->height(); @@ -833,7 +813,7 @@ void TexturePacker::childSave( const Image::SaveType& Format ) { if ( NULL != LastParent ) { std::string fFpath = FileSystem::fileRemoveExtension( LastParent->getFilepath() ); std::string fExt = FileSystem::fileExtension( LastParent->getFilepath() ); - std::string fName = fFpath + "_ch" + String::toStr( ParentCount ) + "." + fExt; + std::string fName = fFpath + "-ch" + String::toStr( ParentCount ) + "." + fExt; mChild->save( fName, Format, mSaveExtensions ); } diff --git a/src/eepp/system/time.cpp b/src/eepp/system/time.cpp index 617962b89..6f50b234a 100644 --- a/src/eepp/system/time.cpp +++ b/src/eepp/system/time.cpp @@ -27,7 +27,7 @@ std::string Time::toString() { if ( asSeconds() < 1 ) { return String::format( "%4.2fms", asMilliseconds() ); } else if ( totalSeconds < 60 ) { - return String::format( "%llus", totalSeconds ); + return String::format( "%lus", static_cast( totalSeconds ) ); } long minutesLeft = totalSeconds / 60; diff --git a/src/eepp/ui/css/mediaquery.cpp b/src/eepp/ui/css/mediaquery.cpp index a7e27951f..fb1b43d26 100644 --- a/src/eepp/ui/css/mediaquery.cpp +++ b/src/eepp/ui/css/mediaquery.cpp @@ -8,6 +8,19 @@ using namespace EE::Window; namespace EE { namespace UI { namespace CSS { +#define MediaOrientationStrings "portrait;landscape" + +#define MediaFeatureStrings \ + "none;width;min-width;max-width;height;min-height;max-height;device-width;min-device-" \ + "width;max-device-width;device-height;min-device-height;max-device-height;orientation;" \ + "aspect-ratio;min-aspect-ratio;max-aspect-ratio;device-aspect-ratio;min-device-aspect-" \ + "ratio;max-device-aspect-ratio;color;min-color;max-color;color-index;min-color-index;max-" \ + "color-index;monochrome;min-monochrome;max-monochrome;resolution;min-resolution;max-" \ + "resolution" + +#define MediaTypeStrings \ + "none;all;screen;print;braille;embossed;handheld;projection;speech;tty;tv" + MediaQuery::MediaQuery() { mMediaType = media_type_all; mNot = false; @@ -44,7 +57,7 @@ MediaQuery::ptr MediaQuery::parse( const std::string& str ) { String::trimInPlace( exprTokens[0] ); expr.feature = (MediaFeature)String::valueIndex( - exprTokens[0], media_feature_strings, media_feature_none ); + exprTokens[0], MediaFeatureStrings, media_feature_none ); if ( expr.feature != media_feature_none ) { if ( exprTokens.size() == 1 ) { @@ -54,7 +67,7 @@ MediaQuery::ptr MediaQuery::parse( const std::string& str ) { expr.checkAsBool = false; if ( expr.feature == media_feature_orientation ) { - expr.val = String::valueIndex( exprTokens[1], media_orientation_strings, + expr.val = String::valueIndex( exprTokens[1], MediaOrientationStrings, media_orientation_landscape ); } else { std::string::size_type slash_pos = exprTokens[1].find( '/' ); @@ -89,7 +102,7 @@ MediaQuery::ptr MediaQuery::parse( const std::string& str ) { } } else { query->mMediaType = - (MediaType)String::valueIndex( tok, media_type_strings, media_type_all ); + (MediaType)String::valueIndex( tok, MediaTypeStrings, media_type_all ); } } diff --git a/src/eepp/ui/css/stylesheetpropertytransition.cpp b/src/eepp/ui/css/stylesheetpropertytransition.cpp index a34269eb0..f92a74b28 100644 --- a/src/eepp/ui/css/stylesheetpropertytransition.cpp +++ b/src/eepp/ui/css/stylesheetpropertytransition.cpp @@ -95,10 +95,10 @@ void StyleSheetPropertyTransition::onUpdate( const Time& ) { mDuration.asMilliseconds() ); if ( mProperty->getType() == PropertyType::NumberFloat ) { node->applyProperty( - StyleSheetProperty( mProperty, String::fromFloat( value, "px" ) ) ); + StyleSheetProperty( mProperty, String::fromFloat( value ) ) ); } else { node->applyProperty( StyleSheetProperty( - mProperty, String::format( "%dpx", static_cast( value ) ) ) ); + mProperty, String::format( "%d", static_cast( value ) ) ) ); } break; } diff --git a/src/eepp/ui/css/stylesheetspecification.cpp b/src/eepp/ui/css/stylesheetspecification.cpp index a5921eb2f..f7f53435f 100644 --- a/src/eepp/ui/css/stylesheetspecification.cpp +++ b/src/eepp/ui/css/stylesheetspecification.cpp @@ -50,8 +50,8 @@ bool StyleSheetSpecification::isShorthand( const std::string& name ) const { void StyleSheetSpecification::registerDefaultProperties() { registerProperty( "id", "", false ).setType( PropertyType::String ); registerProperty( "class", "", false ).setType( PropertyType::String ); - registerProperty( "x", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "y", "", false ).setType( PropertyType::NumberFloat ); + registerProperty( "x", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "y", "", false ).setType( PropertyType::NumberLength ); registerProperty( "width", "", false ) .setType( PropertyType::NumberLength ) .setRelativeTarget( PropertyRelativeTarget::ContainingBlockWidth ); @@ -78,10 +78,10 @@ void StyleSheetSpecification::registerDefaultProperties() { .setType( PropertyType::NumberLength ); registerProperty( "foreground-repeat", "no-repeat", false ); registerProperty( "foreground-size", "", false ).setType( PropertyType::ForegroundSize ); - registerProperty( "foreground-radius", "0px", false ).setType( PropertyType::NumberInt ); + registerProperty( "foreground-radius", "0px", false ).setType( PropertyType::NumberLength ); registerProperty( "border-color", "", false ).setType( PropertyType::Color ); - registerProperty( "border-width", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "border-radius", "0px", false ).setType( PropertyType::NumberInt ); + registerProperty( "border-width", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "border-radius", "0px", false ).setType( PropertyType::NumberLength ); registerProperty( "visible", "true", false ).setType( PropertyType::Bool ); registerProperty( "enabled", "true", false ).setType( PropertyType::Bool ); registerProperty( "theme", "", false ); @@ -166,14 +166,14 @@ void StyleSheetSpecification::registerDefaultProperties() { .addAlias( "font-name" ) .setType( PropertyType::String ); registerProperty( "font-size", "", false ) - .setType( PropertyType::NumberFloat ) + .setType( PropertyType::NumberLength ) .addAlias( "text-size" ) .addAlias( "textsize" ); registerProperty( "font-style", "", false ) .addAlias( "text-style" ) .addAlias( "text-decoration" ); registerProperty( "text-stroke-width", "", false ) - .setType( PropertyType::NumberFloat ) + .setType( PropertyType::NumberLength ) .addAlias( "fontoutlinethickness" ); registerProperty( "text-stroke-color", "", false ) .setType( PropertyType::Color ) @@ -182,8 +182,8 @@ void StyleSheetSpecification::registerDefaultProperties() { registerProperty( "text-align", "", false ); registerProperty( "icon", "", false ); registerProperty( "min-icon-size", "", false ).setType( PropertyType::Vector2 ); - registerProperty( "icon-horizontal-margin", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "icon-auto-margin", "", false ).setType( PropertyType::NumberFloat ); + registerProperty( "icon-horizontal-margin", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "icon-auto-margin", "", false ).setType( PropertyType::NumberLength ); registerProperty( "src", "", false ).setType( PropertyType::String ); registerProperty( "scale-type", "", false ); registerProperty( "tint", "", false ).setType( PropertyType::Color ); @@ -195,15 +195,15 @@ void StyleSheetSpecification::registerDefaultProperties() { registerProperty( "special-border-tabs", "", false ).setType( PropertyType::Bool ); registerProperty( "line-below-tabs", "", false ).setType( PropertyType::Bool ); registerProperty( "line-below-tabs-color", "", false ).setType( PropertyType::Color ); - registerProperty( "line-below-tabs-y-offset", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "tab-separation", "", false ).setType( PropertyType::NumberInt ); + registerProperty( "line-below-tabs-y-offset", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "tab-separation", "", false ).setType( PropertyType::NumberLength ); registerProperty( "selected", "", false ).setType( PropertyType::Bool ).addAlias( "active" ); registerProperty( "popup-to-main-control", "", false ).setType( PropertyType::Bool ); registerProperty( "max-visible-items", "", false ).setType( PropertyType::NumberInt ); registerProperty( "selected-index", "", false ); registerProperty( "selected-text", "", false ); registerProperty( "scrollbar-type", "", false ); - registerProperty( "row-height", "", false ).setType( PropertyType::NumberInt ); + registerProperty( "row-height", "", false ).setType( PropertyType::NumberLength ); registerProperty( "vscroll-mode", "", false ); registerProperty( "hscroll-mode", "", false ); @@ -222,21 +222,21 @@ void StyleSheetSpecification::registerDefaultProperties() { registerProperty( "max-progress", "", false ).setType( PropertyType::NumberFloat ); registerProperty( "progress", "", false ).setType( PropertyType::NumberFloat ); registerProperty( "fill-color", "", false ).setType( PropertyType::Color ); - registerProperty( "radius", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "outline-thickness", "", false ).setType( PropertyType::NumberFloat ); + registerProperty( "radius", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "outline-thickness", "", false ).setType( PropertyType::NumberLength ); registerProperty( "animation-speed", "", false ).setType( PropertyType::Vector2 ); registerProperty( "arc-start-angle", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "min-width", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "min-margin-right", "", false ).setType( PropertyType::NumberInt ); - registerProperty( "min-icon-space", "", false ).setType( PropertyType::NumberInt ); + registerProperty( "min-width", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "min-margin-right", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "min-icon-space", "", false ).setType( PropertyType::NumberLength ); registerProperty( "total-steps", "", false ).setType( PropertyType::NumberInt ); registerProperty( "vertical-expand", "", false ).setType( PropertyType::Bool ); registerProperty( "display-percent", "", false ).setType( PropertyType::Bool ); - registerProperty( "filler-padding-left", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "filler-padding-top", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "filler-padding-right", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "filler-padding-bottom", "", false ).setType( PropertyType::NumberFloat ); + registerProperty( "filler-padding-left", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "filler-padding-top", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "filler-padding-right", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "filler-padding-bottom", "", false ).setType( PropertyType::NumberLength ); registerProperty( "movement-speed", "", false ).setType( PropertyType::Vector2 ); registerProperty( "min-value", "", false ).setType( PropertyType::NumberFloat ); registerProperty( "max-value", "", false ).setType( PropertyType::NumberFloat ); @@ -257,20 +257,20 @@ void StyleSheetSpecification::registerDefaultProperties() { registerProperty( "touch-drag-deceleration", "", false ).setType( PropertyType::NumberFloat ); registerProperty( "base-alpha", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "buttons-position-offset", "", false ).setType( PropertyType::NumberInt ); + registerProperty( "buttons-position-offset", "", false ).setType( PropertyType::NumberLength ); registerProperty( "window-flags", "", false ).addAlias( "winflags" ); registerProperty( "decoration-size", "", false ).setType( PropertyType::Vector2 ); registerProperty( "border-size", "", false ).setType( PropertyType::Vector2 ); registerProperty( "min-window-size", "", false ).setType( PropertyType::Vector2 ); - registerProperty( "buttons-separation", "", false ).setType( PropertyType::NumberInt ); + registerProperty( "buttons-separation", "", false ).setType( PropertyType::NumberLength ); registerProperty( "min-corner-distance", "", false ); registerProperty( "decoration-auto-size", "", false ).setType( PropertyType::Bool ); registerProperty( "border-auto-size", "", false ).setType( PropertyType::Bool ); - registerProperty( "margin-between-buttons", "", false ).setType( PropertyType::NumberInt ); - registerProperty( "button-margin", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "menu-height", "", false ).setType( PropertyType::NumberFloat ); - registerProperty( "first-button-margin-left", "", false ).setType( PropertyType::NumberInt ); + registerProperty( "margin-between-buttons", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "button-margin", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "menu-height", "", false ).setType( PropertyType::NumberLength ); + registerProperty( "first-button-margin-left", "", false ).setType( PropertyType::NumberLength ); registerProperty( "scale-origin-point", "", false ).setType( PropertyType::Vector2 ); @@ -279,10 +279,10 @@ void StyleSheetSpecification::registerDefaultProperties() { registerProperty( "hint", "", false ).setType( PropertyType::String ); registerProperty( "hint-color", "", false ).setType( PropertyType::Color ); registerProperty( "hint-shadow-color", "", false ).setType( PropertyType::Color ); - registerProperty( "hint-font-size", "", false ).setType( PropertyType::NumberFloat ); + registerProperty( "hint-font-size", "", false ).setType( PropertyType::NumberLength ); registerProperty( "hint-font-style", "", false ).setType( PropertyType::String ); registerProperty( "hint-stroke-width", "", false ) - .setType( PropertyType::NumberFloat ) + .setType( PropertyType::NumberLength ) .addAlias( "hintoutlinethickness" ); registerProperty( "hint-stroke-color", "", false ).setType( PropertyType::Color ); registerProperty( "hint-font-family", "", false ).addAlias( "hint-font-name" ); diff --git a/src/eepp/ui/uiscenenode.cpp b/src/eepp/ui/uiscenenode.cpp index a26863343..1a3aaf91a 100644 --- a/src/eepp/ui/uiscenenode.cpp +++ b/src/eepp/ui/uiscenenode.cpp @@ -404,13 +404,13 @@ void UISceneNode::loadFontFaces( const StyleSheetStyleVector& styles ) { mFontFaces.push_back( font ); } else if ( String::startsWith( path, "http://" ) || String::startsWith( path, "https://" ) ) { - - FontTrueType* font = - FontTrueType::New( String::trim( familyProp.getValue(), '"' ) ); - #if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN + std::string familyName = familyProp.getValue(); Http::getAsync( - [&, font]( const Http&, Http::Request&, Http::Response& response ) { + [&, familyName]( const Http&, Http::Request&, Http::Response& response ) { + FontTrueType* font = + FontTrueType::New( String::trim( familyName , '"' ) ); + if ( !response.getBody().empty() ) { font->loadFromMemory( &response.getBody()[0], response.getBody().size() ); diff --git a/src/eepp/ui/uiwidget.cpp b/src/eepp/ui/uiwidget.cpp index 2312c6b10..300837c1b 100644 --- a/src/eepp/ui/uiwidget.cpp +++ b/src/eepp/ui/uiwidget.cpp @@ -989,7 +989,7 @@ std::string UIWidget::getPropertyString( const PropertyDefinition* propertyDef ) case PropertyId::Scale: return String::fromFloat( getScale().x ) + " " + String::fromFloat( getScale().y ); case PropertyId::Opacity: - return String::fromFloat( getAlpha() ); + return String::fromFloat( getAlpha() / 255.f ); case PropertyId::Cursor: return "arrow"; case PropertyId::Visible: diff --git a/src/eepp/window/backend/SDL2/displaymanagersdl2.cpp b/src/eepp/window/backend/SDL2/displaymanagersdl2.cpp index 7218c6eed..47f2a348f 100644 --- a/src/eepp/window/backend/SDL2/displaymanagersdl2.cpp +++ b/src/eepp/window/backend/SDL2/displaymanagersdl2.cpp @@ -1,6 +1,10 @@ #include #include +#if EE_PLATFORM == EE_PLATFORM_EMSCRIPTEN +#include +#endif + namespace EE { namespace Window { namespace Backend { namespace SDL2 { DisplaySDL2::DisplaySDL2( int index ) : Display( index ) {} @@ -17,12 +21,16 @@ Rect DisplaySDL2::getBounds() { } Float DisplaySDL2::getDPI() { +#if EE_PLATFORM == EE_PLATFORM_EMSCRIPTEN + return 96.f * emscripten_get_device_pixel_ratio(); +#else #if SDL_VERSION_ATLEAST( 2, 0, 4 ) float ddpi, hdpi, vdpi; if ( 0 == SDL_GetDisplayDPI( 0, &ddpi, &hdpi, &vdpi ) ) return ddpi; #endif - return 92.f; + return 96.f; +#endif } const int& DisplaySDL2::getIndex() const { diff --git a/src/eepp/window/backend/SDL2/windowsdl2.cpp b/src/eepp/window/backend/SDL2/windowsdl2.cpp index b8d4b3e1d..8c37f6530 100644 --- a/src/eepp/window/backend/SDL2/windowsdl2.cpp +++ b/src/eepp/window/backend/SDL2/windowsdl2.cpp @@ -23,8 +23,8 @@ #endif #if EE_PLATFORM == EE_PLATFORM_WIN -#include #include +#include #include #include @@ -266,7 +266,8 @@ bool WindowSDL::create( WindowSettings Settings, ContextSettings Context ) { SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, mWindow.ContextConfig.Multisamples ); } -#if EE_PLATFORM != EE_PLATFORM_MACOSX && EE_PLATFORM != EE_PLATFORM_IOS +#if EE_PLATFORM != EE_PLATFORM_MACOSX && EE_PLATFORM != EE_PLATFORM_IOS && \ + EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN mWindow.WindowConfig.Width *= mWindow.WindowConfig.PixelDensity; mWindow.WindowConfig.Height *= mWindow.WindowConfig.PixelDensity; #endif diff --git a/src/tools/mapeditor/mapeditor.cpp b/src/tools/mapeditor/mapeditor.cpp index 4e95b80c2..031ef351d 100644 --- a/src/tools/mapeditor/mapeditor.cpp +++ b/src/tools/mapeditor/mapeditor.cpp @@ -1,4 +1,20 @@ -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace EE; +using namespace EE::Graphics; +using namespace EE::Maps; +using namespace EE::Scene; +using namespace EE::Window; +using namespace EE::UI; +using namespace EE::UI::Tools; EE::Window::Window* win = NULL; UIMessageBox* MsgBox = NULL; diff --git a/src/tools/textureatlaseditor/textureatlaseditor.cpp b/src/tools/textureatlaseditor/textureatlaseditor.cpp index cc79b8834..20238facd 100644 --- a/src/tools/textureatlaseditor/textureatlaseditor.cpp +++ b/src/tools/textureatlaseditor/textureatlaseditor.cpp @@ -1,4 +1,19 @@ -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace EE; +using namespace EE::Graphics; +using namespace EE::Scene; +using namespace EE::Window; +using namespace EE::UI; +using namespace EE::UI::Tools; EE::Window::Window* win = NULL; UIMessageBox* MsgBox = NULL; diff --git a/src/tools/texturepacker/texturepacker.cpp b/src/tools/texturepacker/texturepacker.cpp new file mode 100644 index 000000000..cd8871cb6 --- /dev/null +++ b/src/tools/texturepacker/texturepacker.cpp @@ -0,0 +1,173 @@ +#include +#include +#include +#include +#include +#include + +using namespace EE; +using namespace EE::System; +using namespace EE::Graphics; + +int main( int argc, char* argv[] ) { + args::ArgumentParser parser( "Texture Packer - eepp texture atlas creator." ); + args::HelpFlag help( parser, "help", "Display this help menu", {'h', "help"} ); + args::ValueFlag texturesPath( parser, "textures-path", "Textures directory path.", + {'p', "textures-path"} ); + args::ValueFlagList images( parser, "image-path", "Input image path.", + {'i', "image-path"} ); + args::ValueFlag outputFile( + parser, "output-file", "Texture atlas file output path. Extension must be: \".eta\"", + {'o', "output-file"}, "", args::Options::Required | args::Options::Single ); + std::unordered_map saveTypeFormat{ + {"PNG", Image::SaveType::SAVE_TYPE_PNG}, + {"DDS", Image::SaveType::SAVE_TYPE_DDS}, + {"TGA", Image::SaveType::SAVE_TYPE_TGA}, + {"BMP", Image::SaveType::SAVE_TYPE_BMP}, + {"JPG", Image::SaveType::SAVE_TYPE_JPG}}; + args::MapFlag saveType( + parser, "image-format", "Output image format.", {'f', "image-format"}, saveTypeFormat, + Image::SaveType::SAVE_TYPE_PNG, args::Options::Single ); + std::unordered_map pixelDensityMap{ + {"MDPI", PixelDensitySize::MDPI}, + {"HDPI", PixelDensitySize::HDPI}, + {"XHDPI", PixelDensitySize::XHDPI}, + {"XXHDPI", PixelDensitySize::XXHDPI}, + {"XXXHDPI", PixelDensitySize::XXXHDPI}}; + args::MapFlag pixelDensity( + parser, "pixel-density", + "Source images pixel density size. Valid values are: MDPI (1dp = 1px), HDPI (1dp = 1.5px), " + "XHDPI (1dp = 2px), XXHDPI (1dp = 3px) and XXXHDPI (1dp = 4px).", + {'d', "pixel-density"}, pixelDensityMap, PixelDensitySize::MDPI, args::Options::Single ); + args::Flag forcePow2( parser, "force-power-of-two-texture", "Force power of two texture.", + {"force-power-of-two"}, args::Options::Single ); + args::Flag scalableSVG( parser, "scalable-svg", + "Scale SVG source files using the pixel-density provided.", + {"scalable-svg"}, args::Options::Single ); + args::Flag saveExtensions( parser, "save-extensions", + "Save the file extensions as part of the texture regions names.", + {"save-extensions"} ); + args::Flag allowChilds( + parser, "allow-childs", + "When enabled in the case of an atlas not having enough space in the image to fit all the " + "source input images it will create new child atlas images to save them.", + {"allow-childs"} ); + args::ValueFlag height( parser, "max-width", "Texture Atlas maximum allowed height.", + {'h', "max-height"}, 4096, args::Options::Single ); + args::ValueFlag width( parser, "max-width", "Texture Atlas maximum allowed width.", + {'w', "max-width"}, 4096, args::Options::Single ); + args::ValueFlag pixelsBorder( + parser, "pixels-border", + "Number of pixels used as border of each image. The border is the separator between images " + "and it's recommended that at least there's a 2 pixel border (default value) to avoid " + "rendering problems.", + {'b', "pixels-border"}, 2, args::Options::Single ); + args::Flag update( parser, "update", "Update texture atlas if output file already exists.", + {'u', "update"}, args::Options::Single ); + std::unordered_map textureFilterMap{ + {"linear", Texture::TextureFilter::Linear}, {"nearest", Texture::TextureFilter::Nearest}}; + args::MapFlag textureFilter( + parser, "texture-filter", + "Texture filter to use with the texture atlas. Available filters: \"linear\" or " + "\"nearest\".", + {"texture-filter"}, textureFilterMap, Texture::TextureFilter::Linear, + args::Options::Single ); + + try { + parser.ParseCLI( argc, argv ); + } catch ( const args::Help& ) { + std::cout << parser; + return EXIT_SUCCESS; + } catch ( const args::ParseError& e ) { + std::cerr << e.what() << std::endl; + std::cerr << parser; + return EXIT_FAILURE; + } catch ( args::ValidationError& e ) { + std::cerr << e.what() << std::endl; + std::cerr << parser; + return EXIT_FAILURE; + } + + bool hasImages = false; + auto imagesPaths = args::get( images ); + std::map> imagesList; + if ( !imagesPaths.empty() ) { + for ( auto image : images ) { + if ( !Image::isImage( image ) ) { + std::cout << "Image: \"" << image << "\" is invalid." << std::endl + << "Operation cancelled." << std::endl; + return EXIT_FAILURE; + } + + if ( imagesList.find( image ) == imagesList.end() ) { + imagesList[image] = std::make_unique( image ); + } + } + hasImages = true; + } + + std::string texturesPathSafe( texturesPath.Get() ); + FileSystem::dirPathAddSlashAtEnd( texturesPathSafe ); + if ( !FileSystem::isDirectory( texturesPathSafe ) && !hasImages ) { + std::cout << "textures-path is invalid."; + return EXIT_FAILURE; + } + + auto filesInPath = FileSystem::filesGetInPath( texturesPathSafe ); + if ( !hasImages ) { + for ( auto& file : filesInPath ) { + if ( Image::isImage( texturesPathSafe + file ) ) { + hasImages = true; + break; + } + } + if ( !hasImages ) { + std::cout << "textures-path must contain at least one image."; + return EXIT_FAILURE; + } + } + + if ( pixelsBorder.Get() > 32 ) { + std::cout << "pixels-border value invalid, try a smaller number." << std::endl; + return EXIT_FAILURE; + } + + if ( FileSystem::fileExtension( outputFile.Get() ).empty() || + FileSystem::fileExtension( outputFile.Get() ) != "eta" ) { + std::cout << "output-file must have an extension."; + return EXIT_FAILURE; + } + + if ( !FileSystem::fileExists( outputFile.Get() ) ) { + TexturePacker tp( width.Get(), height.Get(), pixelDensity.Get(), forcePow2.Get(), + scalableSVG.Get(), pixelsBorder.Get(), textureFilter.Get(), + allowChilds.Get() ); + std::cout << "Packing directory: " << texturesPathSafe << std::endl; + tp.addTexturesPath( texturesPathSafe ); + for ( auto& image : imagesList ) { + tp.addImage( image.second.get(), image.first ); + } + if ( tp.packTextures() <= 0 ) { + goto exit_error; + } + std::string outputTexturePath( FileSystem::fileRemoveExtension( outputFile.Get() ) + "." + + Image::saveTypeToExtension( saveType.Get() ) ); + tp.save( outputTexturePath, saveType.Get(), saveExtensions.Get() ); + std::cout << "Texture Atlas created." << std::endl; + } else if ( update.Get() ) { + TextureAtlasLoader tgl; + std::cout << "Texture Atlas is already present, updating it." << std::endl; + if ( !tgl.updateTextureAtlas( outputFile.Get(), texturesPathSafe, + Sizei( width, height ) ) ) { + goto exit_error; + } + std::cout << "Texture Atlas updated." << std::endl; + } + return EXIT_SUCCESS; +exit_error: + std::cout << "Texture Atlas creation failed.\nTry allowing bigger images modifying the " + "max-width and max-height, or try removing some images from the images " + "directory." + << std::endl; + return EXIT_FAILURE; +}