Kaynağa Gözat

Integrate the Lottie plugin into Core, only built when setting the 'ENABLE_LOTTIE_PLUGIN' option in CMake.

Michael Ragazzon 5 yıl önce
ebeveyn
işleme
5df52283f9

+ 13 - 0
CMake/FileList.cmake

@@ -566,3 +566,16 @@ set(Lua_SRC_FILES
     ${PROJECT_SOURCE_DIR}/Source/Lua/Vector2i.cpp
 )
 
+set(Lottie_HDR_FILES
+    ${PROJECT_SOURCE_DIR}/Source/Lottie/LottiePlugin.h
+)
+
+set(Lottie_PUB_HDR_FILES
+    ${PROJECT_SOURCE_DIR}/Include/RmlUi/Lottie/ElementLottie.h
+)
+
+set(Lottie_SRC_FILES
+    ${PROJECT_SOURCE_DIR}/Source/Lottie/ElementLottie.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Lottie/LottiePlugin.cpp
+)
+

+ 0 - 4
CMake/SampleFileList.cmake

@@ -102,13 +102,9 @@ set(transform_SRC_FILES
 )
 
 set(lottie_HDR_FILES
-    ${PROJECT_SOURCE_DIR}/Samples/basic/lottie/src/ElementLottie.h
-    ${PROJECT_SOURCE_DIR}/Samples/basic/lottie/src/LottiePlugin.h
 )
 
 set(lottie_SRC_FILES
-    ${PROJECT_SOURCE_DIR}/Samples/basic/lottie/src/ElementLottie.cpp
-    ${PROJECT_SOURCE_DIR}/Samples/basic/lottie/src/LottiePlugin.cpp
     ${PROJECT_SOURCE_DIR}/Samples/basic/lottie/src/main.cpp
 )
 

+ 13 - 12
CMake/gen_filelists.sh

@@ -11,13 +11,12 @@ fontdefaultbegin='if(NOT NO_FONT_INTERFACE_DEFAULT)'
 fontdefaultend='endif()'
 srcpath=Source
 hdrpath=Include/RmlUi
-luapath=Lua
 fontdefaultpath=FontEngineDefault
 
 printfiles() {
     # Print headers
     echo ${hdr/lib/$1} >>$file
-    find  $srcpath/$1 -maxdepth 3 -path */$luapath -prune -o -path */$fontdefaultpath -prune -o \( -iname "*.h" -o -iname "*.hpp" \) -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
+    find  $srcpath/$1 -maxdepth 3 -path */$fontdefaultpath -prune -o \( -iname "*.h" -o -iname "*.hpp" \) -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
     echo -e ')\n' >>$file
     # Print master header for library
     echo ${masterpubhdr/lib/$1} >>$file
@@ -26,11 +25,11 @@ printfiles() {
     # Print public headers sub directory
     echo ${pubhdr/lib/$1} >>$file
 	if [[ "$1" == "Core" ]]; then echo '    '$srcdir/Include/RmlUi/Config/Config.h >>$file; fi
-    find  $hdrpath/$1 -maxdepth 3 -path */$luapath -prune -o -path */$fontdefaultpath -prune -o \( -iname "*.h" -o -iname "*.inl" -o -iname "*.hpp" \) -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
+    find  $hdrpath/$1 -maxdepth 3 -path */$fontdefaultpath -prune -o \( -iname "*.h" -o -iname "*.inl" -o -iname "*.hpp" \) -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
     echo -e ')\n' >>$file
     # Print source files
     echo ${src/lib/$1} >>$file
-    find  $srcpath/$1 -maxdepth 3 -path */$luapath -prune -o -path */$fontdefaultpath -prune -o -iname "*.cpp" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
+    find  $srcpath/$1 -maxdepth 3 -path */$fontdefaultpath -prune -o -iname "*.cpp" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
     echo -e ')\n' >>$file
 }
 
@@ -49,18 +48,18 @@ printfontdefaultfiles() {
 	echo -e $fontdefaultend'\n' >>$file
 }
 
-printluafiles() {
+printpluginfiles() {
     # Print headers
-    echo ${hdr/lib/Lua} >>$file
-    find  $srcpath/$luapath$1 -iname "*.h" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
+    echo ${hdr/lib/$1} >>$file
+    find  $srcpath/$1 -iname "*.h" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
     echo -e ')\n' >>$file
     # Print public headers
-    echo ${pubhdr/lib/Lua} >>$file
-    find  $hdrpath/$luapath$1 -iname "*.h" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file 2>/dev/null
+    echo ${pubhdr/lib/$1} >>$file
+    find  $hdrpath/$1 -iname "*.h" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file 2>/dev/null
     echo -e ')\n' >>$file
     # Print source files
-    echo ${src/lib/Lua} >>$file
-    find  $srcpath/$luapath$1 -iname "*.cpp" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
+    echo ${src/lib/$1} >>$file
+    find  $srcpath/$1 -iname "*.cpp" -exec echo '    '$srcdir/{} \; 2>/dev/null | sort -f >>$file
     echo -e ')\n' >>$file
 }
 
@@ -72,6 +71,8 @@ done
 
 printfontdefaultfiles "Core"
 
-printluafiles
+printpluginfiles "Lua"
+
+printpluginfiles "Lottie"
 
 popd

+ 54 - 35
CMakeLists.txt

@@ -65,6 +65,8 @@ endif()
 
 set(RMLUI_VERSION_SHORT ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}${RMLUI_VERSION_SUFFIX})
 
+list(APPEND CORE_PRIVATE_DEFS RMLUI_VERSION="${RMLUI_VERSION_SHORT}")
+
 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
 	option(BUILD_TESTING "" OFF)
     include(CTest)
@@ -182,7 +184,7 @@ endif(APPLE)
 
 option(NO_FONT_INTERFACE_DEFAULT "Do not include the default font engine in the build. Allows building without the FreeType dependency, but a custom font engine must be created and set." OFF)
 if(NO_FONT_INTERFACE_DEFAULT)
-	add_definitions(-DRMLUI_NO_FONT_INTERFACE_DEFAULT)
+	list(APPEND CORE_PRIVATE_DEFS RMLUI_NO_FONT_INTERFACE_DEFAULT)
 endif()
 
 if(NOT BUILD_SHARED_LIBS)
@@ -246,6 +248,8 @@ elseif( CMAKE_CONFIGURATION_TYPES )
 	list(REMOVE_ITEM CMAKE_CONFIGURATION_TYPES Tracy)
 endif()
 
+option(ENABLE_LOTTIE_PLUGIN "Enable plugin for Lottie animations. Requires the rlottie library." OFF)
+
 option(DISABLE_RTTI_AND_EXCEPTIONS "Build with rtti and exceptions disabled." OFF)
 if(DISABLE_RTTI_AND_EXCEPTIONS)
 	add_definitions(-DRMLUI_USE_CUSTOM_RTTI)
@@ -291,6 +295,17 @@ macro(add_common_target_options NAME)
 	endif()
 endmacro()
 
+#===================================
+# Setup paths ======================
+#===================================
+
+include_directories(
+	${PROJECT_SOURCE_DIR}/Include
+)
+
+# Include list of source files
+include(FileList)
+
 #===================================
 # Find dependencies ================
 #===================================
@@ -306,7 +321,7 @@ if(NOT NO_FONT_INTERFACE_DEFAULT)
 	endif()
 endif()
 
-#Lua
+# Lua
 if(BUILD_LUA_BINDINGS)
 	find_package(Lua REQUIRED)
 	if(LUA_FOUND)
@@ -315,17 +330,37 @@ if(BUILD_LUA_BINDINGS)
 	endif()
 endif()
 
+# rlottie
+if( ENABLE_LOTTIE_PLUGIN )
+	# Try to find the rlottie library.
+	if(NOT DEFINED rlottie_DIR)
+		set(rlottie_DIR $ENV{RLOTTIE_DIR})
+	endif()
 
-#===================================
-# Setup paths ======================
-#===================================
-
-include_directories(
-	${PROJECT_SOURCE_DIR}/Include
-)
-
-# Include list of source files
-include(FileList)
+	list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/rlottie/build)
+	find_package(rlottie CONFIG)
+	find_path(rlottie_INCLUDE_DIR rlottie.h HINTS ${rlottie_DIR} $ENV{rlottie_DIR} PATH_SUFFIXES inc rlottie/inc )
+	
+	if(rlottie_FOUND AND rlottie_INCLUDE_DIR)
+		message("-- Can Lottie plugin be added to RmlCore - yes - rlottie library found")
+		
+		list(APPEND CORE_LINK_LIBS rlottie::rlottie)
+		list(APPEND CORE_INCLUDE_DIRS ${rlottie_INCLUDE_DIR})
+		list(APPEND CORE_PRIVATE_DEFS RMLUI_ENABLE_LOTTIE_PLUGIN)
+		
+		list(APPEND Core_HDR_FILES ${Lottie_HDR_FILES})
+		list(APPEND Core_PUB_HDR_FILES ${Lottie_PUB_HDR_FILES})
+		list(APPEND Core_SRC_FILES ${Lottie_SRC_FILES})
+	else()
+		if(rlottie_FOUND)
+			message(FATAL_ERROR "-- Can Lottie plugin be added to RmlCore - no - rlottie library found - rlottie include directory not found")
+		elseif(rlottie_INCLUDE_DIR)
+			message(FATAL_ERROR "-- Can Lottie plugin be added to RmlCore - no - rlottie library not found - rlottie include directory found at ${rlottie_INCLUDE_DIR}")
+		else()
+			message(FATAL_ERROR "-- Can Lottie plugin be added to RmlCore - no - rlottie not found")
+		endif()
+	endif()
+endif()
 
 if(NOT BUILD_FRAMEWORK)
 #===================================
@@ -373,7 +408,8 @@ if( CUSTOM_CONFIGURATION )
 	endforeach(library ${CUSTOM_LINK_LIBRARIES})
 endif()
 
-target_compile_definitions(RmlCore PRIVATE RMLUI_VERSION="${RMLUI_VERSION_SHORT}")
+
+target_compile_definitions(RmlCore PRIVATE ${CORE_PRIVATE_DEFS})
 
 if( MATRIX_ROW_MAJOR )
 	target_compile_definitions(RmlCore PUBLIC -DRMLUI_MATRIX_ROW_MAJOR)
@@ -445,6 +481,9 @@ else(NOT BUILD_FRAMEWORK)
 	set(RMLUI_EXPORTED_TARGETS ${RMLUI_EXPORTED_TARGETS} ${NAME})
 endif(NOT BUILD_FRAMEWORK)
 
+# Add additional Core include directories
+target_include_directories(RmlCore PRIVATE ${CORE_INCLUDE_DIRS})
+
 # Build Lua bindings
 if(BUILD_LUA_BINDINGS)
 	set(NAME RmlLua)
@@ -471,7 +510,6 @@ if(BUILD_LUA_BINDINGS)
 	set(RMLUI_EXPORTED_TARGETS ${RMLUI_EXPORTED_TARGETS} ${NAME})
 endif()
 
-
 if(DISABLE_RTTI_AND_EXCEPTIONS)
     if( CMAKE_COMPILER_IS_GNUCXX )
 		add_definitions( -fno-rtti -fno-exceptions )
@@ -679,19 +717,8 @@ endif(NOT BUILD_FRAMEWORK)
 				BUNDLE DESTINATION ${SAMPLES_DIR})
 	endif()
 	
-	# Try to find rlottie for the lottie sample.
-	if(NOT DEFINED rlottie_DIR)
-		set(rlottie_DIR $ENV{RLOTTIE_DIR})
-	endif()
-
-	list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/rlottie/build)
-	find_package(rlottie CONFIG)
-	find_path(rlottie_INCLUDE_DIR rlottie.h HINTS ${rlottie_DIR} $ENV{rlottie_DIR} PATH_SUFFIXES inc rlottie/inc )
-	
-	if(rlottie_FOUND AND rlottie_INCLUDE_DIR)
-		message("-- Can lottie sample be built - yes")
-		bl_sample(lottie ${sample_LIBRARIES} rlottie::rlottie)
-		target_include_directories(lottie PRIVATE ${rlottie_INCLUDE_DIR})
+	if( ENABLE_LOTTIE_PLUGIN )
+		bl_sample(lottie ${sample_LIBRARIES})
 		
 		# The samples always set this as their current working directory
 		install(DIRECTORY DESTINATION ${SAMPLES_DIR}/basic/lottie)
@@ -699,14 +726,6 @@ endif(NOT BUILD_FRAMEWORK)
 			RUNTIME DESTINATION ${SAMPLES_DIR}/lottie
 			BUNDLE DESTINATION ${SAMPLES_DIR}
 		)
-	else()
-		if(rlottie_FOUND)
-			message("-- Can lottie sample be built - no - rlottie library found - rlotty include directory not found")
-		elseif(rlottie_INCLUDE_DIR)
-			message("-- Can lottie sample be built - no - rlottie library not found - rlotty include directory found at ${rlottie_INCLUDE_DIR}")
-		else()
-			message("-- Can lottie sample be built - no - rlottie not found")
-		endif()
 	endif()
 
 	# Build and install the tutorials

+ 10 - 10
Samples/basic/lottie/src/ElementLottie.h → Include/RmlUi/Lottie/ElementLottie.h

@@ -26,21 +26,20 @@
  *
  */
 
-#ifndef RMLUI_ELEMENT_LOTTIE_H
-#define RMLUI_ELEMENT_LOTTIE_H
+#ifndef RMLUI_LOTTIE_ELEMENT_LOTTIE_H
+#define RMLUI_LOTTIE_ELEMENT_LOTTIE_H
 
-#include <RmlUi/Core/Header.h>
-#include <RmlUi/Core/Element.h>
-#include <RmlUi/Core/Geometry.h>
-#include <RmlUi/Core/Texture.h>
+#include "../Core/Header.h"
+#include "../Core/Element.h"
+#include "../Core/Geometry.h"
+#include "../Core/Texture.h"
 #include <memory>
 
 namespace rlottie { class Animation; }
 
 namespace Rml {
 
-
-class ElementLottie : public Element
+class RMLUICORE_API ElementLottie : public Element
 {
 public:
 	RMLUI_RTTI_DefineWithParent(ElementLottie, Element)
@@ -76,6 +75,7 @@ private:
 
 	bool animation_dirty = false;
 	bool geometry_dirty = false;
+	bool texture_size_dirty = false;
 
 	// The texture this element is rendering from.
 	Texture texture;
@@ -93,9 +93,9 @@ private:
 	// The previous animation frame displayed.
 	size_t prev_animation_frame = size_t(-1);
 
-	std::unique_ptr<rlottie::Animation> animation;
+	UniquePtr<rlottie::Animation> animation;
 };
 
-}
+} // namespace Rml
 
 #endif

+ 0 - 2
Samples/basic/lottie/src/main.cpp

@@ -31,7 +31,6 @@
 #include <Input.h>
 #include <Shell.h>
 #include <ShellRenderInterfaceOpenGL.h>
-#include "LottiePlugin.h"
 
 Rml::Context* context = nullptr;
 
@@ -95,7 +94,6 @@ int main(int RMLUI_UNUSED_PARAMETER(argc), char** RMLUI_UNUSED_PARAMETER(argv))
 		return -1;
 	}
 
-	Rml::Lottie::Initialise();
 	Rml::Debugger::Initialise(context);
 	Input::SetContext(context);
 	shell_renderer->SetContext(context);

+ 1 - 0
Samples/readme.md

@@ -20,6 +20,7 @@ This directory contains basic applications that demonstrate initialisation, usag
 -  `demo` demonstrates a variety of features in RmlUi and includes a sandbox for playing with RML/RCSS
 -  `drag` dragging elements between containers
 -  `loaddocument` loading your first document
+-  `lottie` playing Lottie animations, only enabled with the Lottie plugin
 -  `sdl2` integrating with SDL2
 -  `sfml2` integrating with SFML2
 -  `transform` demonstration of transforms

+ 9 - 0
Source/Core/Core.cpp

@@ -51,6 +51,10 @@
 #include "FontEngineDefault/FontEngineInterfaceDefault.h"
 #endif
 
+#ifdef RMLUI_ENABLE_LOTTIE_PLUGIN
+#include "../Lottie/LottiePlugin.h"
+#endif
+
 
 namespace Rml {
 
@@ -124,6 +128,11 @@ bool Initialise()
 
 	Factory::Initialise();
 
+	// Initialise plugins integrated with Core.
+#ifdef RMLUI_ENABLE_LOTTIE_PLUGIN
+	Lottie::Initialise();
+#endif
+
 	// Notify all plugins we're starting up.
 	PluginRegistry::NotifyInitialise();
 

+ 17 - 10
Samples/basic/lottie/src/ElementLottie.cpp → Source/Lottie/ElementLottie.cpp

@@ -26,23 +26,24 @@
  *
  */
 
-#include "ElementLottie.h"
-#include <RmlUi/Core/Core.h>
-#include <RmlUi/Core/PropertyIdSet.h>
-#include <RmlUi/Core/GeometryUtilities.h>
-#include <RmlUi/Core/ElementDocument.h>
-#include <RmlUi/Core/SystemInterface.h>
-#include <RmlUi/Core/FileInterface.h>
+#include "../../Include/RmlUi/Lottie/ElementLottie.h"
+#include "../../Include/RmlUi/Core/Core.h"
+#include "../../Include/RmlUi/Core/PropertyIdSet.h"
+#include "../../Include/RmlUi/Core/GeometryUtilities.h"
+#include "../../Include/RmlUi/Core/ElementDocument.h"
+#include "../../Include/RmlUi/Core/SystemInterface.h"
+#include "../../Include/RmlUi/Core/FileInterface.h"
 #include <cmath>
 #include <rlottie.h>
 
 namespace Rml {
 
+
 ElementLottie::ElementLottie(const String& tag) : Element(tag), geometry(this)
 {
 }
 
-ElementLottie::~ElementLottie(void)
+ElementLottie::~ElementLottie()
 {
 }
 
@@ -73,6 +74,7 @@ void ElementLottie::OnRender()
 void ElementLottie::OnResize()
 {
 	geometry_dirty = true;
+	texture_size_dirty = true;
 }
 
 void ElementLottie::OnAttributeChange(const ElementAttributes& changed_attributes)
@@ -191,8 +193,11 @@ void ElementLottie::UpdateTexture()
 	const double pos = std::modf((t - time_animation_start) / animation->duration(), &_unused);
 
 	const size_t next_frame = animation->frameAtPos(pos);
-	if (next_frame == prev_animation_frame)
+	if (!texture_size_dirty && next_frame == prev_animation_frame)
+	{
+		// No need to update the texture if we are drawing the same frame at the same size.
 		return;
+	}
 
 	// Callback for generating texture.
 	auto p_callback = [this, next_frame](const String& /*name*/, UniquePtr<const byte[]>& data, Vector2i& dimensions) -> bool {
@@ -232,5 +237,7 @@ void ElementLottie::UpdateTexture()
 	texture.Set("lottie", p_callback);
 	geometry.SetTexture(&texture);
 	prev_animation_frame = next_frame;
+	texture_size_dirty = false;
 }
-}
+
+} // namespace Rml

+ 22 - 17
Samples/basic/lottie/src/LottiePlugin.cpp → Source/Lottie/LottiePlugin.cpp

@@ -27,22 +27,30 @@
  */
 
 
-#include "ElementLottie.h"
-#include <RmlUi/Core/ElementInstancer.h>
-#include <RmlUi/Core/Factory.h>
-#include <RmlUi/Core/Plugin.h>
-#include <RmlUi/Core/Core.h>
+#include "../../Include/RmlUi/Lottie/ElementLottie.h"
+#include "../../Include/RmlUi/Core/Core.h"
+#include "../../Include/RmlUi/Core/ElementInstancer.h"
+#include "../../Include/RmlUi/Core/Factory.h"
+#include "../../Include/RmlUi/Core/Log.h"
+#include "../../Include/RmlUi/Core/Plugin.h"
 
 namespace Rml {
 namespace Lottie {
 
-static UniquePtr<ElementInstancerGeneric<ElementLottie>> instancer;
 
 class LottiePlugin : public Plugin {
 public:
+	void OnInitialise() override
+	{
+		instancer = MakeUnique<ElementInstancerGeneric<ElementLottie> >();
+		
+		Factory::RegisterElementInstancer("lottie", instancer.get());
+
+		Log::Message(Log::LT_INFO, "Lottie plugin initialised.");
+	}
+
 	void OnShutdown() override
 	{
-		instancer.reset();
 		delete this;
 	}
 
@@ -50,19 +58,16 @@ public:
 	{
 		return Plugin::EVT_BASIC;
 	}
+
+private:
+	UniquePtr<ElementInstancerGeneric<ElementLottie>> instancer;
 };
 
+
 void Initialise()
 {
-	if (!instancer)
-	{
-		instancer = MakeUnique<ElementInstancerGeneric<ElementLottie> >();
-
-		Factory::RegisterElementInstancer("lottie", instancer.get());
-
-		RegisterPlugin(new LottiePlugin());
-	}
+	RegisterPlugin(new LottiePlugin);
 }
 
-}
-}
+} // namespace Lottie
+} // namespace Rml

+ 2 - 2
Samples/basic/lottie/src/LottiePlugin.h → Source/Lottie/LottiePlugin.h

@@ -26,8 +26,8 @@
  *
  */
 
-#ifndef RMLUI_LOTTIE_PLUGIN_H
-#define RMLUI_LOTTIE_PLUGIN_H
+#ifndef RMLUI_LOTTIE_LOTTIE_PLUGIN_H
+#define RMLUI_LOTTIE_LOTTIE_PLUGIN_H
 
 
 namespace Rml {

+ 1 - 0
changelog.md

@@ -139,6 +139,7 @@ Improved Lua plugin in several aspects.
 ### Samples
 
 - New `databinding` sample for demonstrating data bindings.
+- New `lottie` sample for demonstrating Lottie animations with the Lottie plugin.
 - The use of `datagrid` in sample projects has now been replaced with data bindings. This includes the `treeview` sample and the high scores document in the `invader` sample. Tutorials have not been updated.
 - The options document in the `luainvader` sample now demonstrate data bindings combined with Lua scripts.
 

+ 2 - 2
readme.md

@@ -10,7 +10,7 @@ RmlUi - now with added boosters taking control of the rocket, targeting *your* g
 
 RmlUi is the C++ user interface package based on the HTML and CSS standards, designed as a complete solution for any project's interface needs. It is a fork of the [libRocket](https://github.com/libRocket/libRocket) project, introducing new features, bug fixes, and performance improvements. 
 
-RmlUi uses the time-tested open standards XHTML1.0 and CSS2.0 while borrowing features from HTML5 and CSS3, and extends them with features suited towards real-time applications. Because of this, you don't have to learn a whole new proprietary technology like other libraries in this space. Please have a look at the supported [RCSS properties](https://mikke89.github.io/RmlUiDoc/pages/rcss/property_index.html) and [RML elements](https://mikke89.github.io/RmlUiDoc/pages/rml/element_index.html).
+RmlUi uses the time-tested open standards XHTML1 and CSS2 while borrowing features from HTML5 and CSS3, and extends them with features suited towards real-time applications. Because of this, you don't have to learn a whole new proprietary technology like other libraries in this space. Please have a look at the supported [RCSS properties](https://mikke89.github.io/RmlUiDoc/pages/rcss/property_index.html) and [RML elements](https://mikke89.github.io/RmlUiDoc/pages/rml/element_index.html).
 
 Documentation is located at https://mikke89.github.io/RmlUiDoc/
 
@@ -164,7 +164,7 @@ body
 ![Lottie animation](https://github.com/mikke89/RmlUiDoc/blob/086385e119f0fc6e196229b785e91ee0252fe4b4/assets/gallery/lottie.gif)  
 **Vector animations with the [Lottie plugin](https://mikke89.github.io/RmlUiDoc/pages/cpp_manual/lottie.html)**
 
-To see more screenshots and videos of the library in action, have a look at the [full gallery](https://mikke89.github.io/RmlUiDoc/pages/gallery.html) in the documentation.
+See the **[full gallery](https://mikke89.github.io/RmlUiDoc/pages/gallery.html)** for more screenshots and videos of the library in action.