diff options
-rw-r--r-- | design.tex | 908 | ||||
-rw-r--r-- | example.tex | 4 | ||||
-rw-r--r-- | figs.drawio | 2737 | ||||
-rw-r--r-- | glossary.bib | 8 | ||||
-rw-r--r-- | img/AssesManager.png | bin | 0 -> 571725 bytes | |||
-rw-r--r-- | img/Collision_system.png | bin | 0 -> 53554 bytes | |||
-rw-r--r-- | img/Collision_system_flowchart.png | bin | 0 -> 28876 bytes | |||
-rw-r--r-- | img/Fixed_update.png | bin | 0 -> 11636 bytes | |||
-rw-r--r-- | img/Particle_system.png | bin | 0 -> 50497 bytes | |||
-rw-r--r-- | img/Particle_system_flowchart.png | bin | 0 -> 21084 bytes | |||
-rw-r--r-- | img/Physics_system.png | bin | 0 -> 44621 bytes | |||
-rw-r--r-- | img/Physics_system_flowchart.png | bin | 0 -> 8055 bytes | |||
-rw-r--r-- | img/Rendering.png | bin | 0 -> 654711 bytes | |||
-rw-r--r-- | img/activity-scripts.puml | 21 | ||||
-rw-r--r-- | img/class-api-full.pdf | bin | 0 -> 73613 bytes | |||
-rw-r--r-- | img/class-config.puml | 14 | ||||
-rw-r--r-- | img/class-savemgr.puml | 13 | ||||
-rw-r--r-- | img/class-scripts.puml | 7 | ||||
-rw-r--r-- | img/custom-event-output.png | bin | 0 -> 2088 bytes | |||
-rw-r--r-- | img/event-sequence.puml | 16 | ||||
-rw-r--r-- | img/event-uml.drawio.png | bin | 0 -> 453179 bytes | |||
-rw-r--r-- | img/flowchart_rendering.png | bin | 0 -> 631423 bytes | |||
-rw-r--r-- | img/gameloop-class.puml | 37 | ||||
-rw-r--r-- | img/gameloop-console-10.png | bin | 0 -> 9313 bytes | |||
-rw-r--r-- | img/gameloop-console.png | bin | 0 -> 18235 bytes | |||
-rw-r--r-- | img/gameloop-flow.puml | 26 | ||||
-rw-r--r-- | img/gameloop-squares.png | bin | 0 -> 5034 bytes | |||
-rw-r--r-- | img/poc-button.png | bin | 0 -> 4395 bytes | |||
-rw-r--r-- | img/poc-camera.pdf | bin | 0 -> 169814 bytes | |||
-rw-r--r-- | img/poc-collision-1.png | bin | 0 -> 5316 bytes | |||
-rw-r--r-- | img/poc-collision-2.png | bin | 0 -> 4783 bytes | |||
-rw-r--r-- | img/poc-event-button.png | bin | 0 -> 4955 bytes | |||
-rw-r--r-- | img/poc-log.png | bin | 0 -> 12526 bytes | |||
-rw-r--r-- | img/poc-output-scripts.png | bin | 0 -> 31761 bytes | |||
-rw-r--r-- | img/poc-particles.png | bin | 0 -> 466 bytes | |||
-rw-r--r-- | img/texture.png | bin | 0 -> 593444 bytes | |||
-rw-r--r-- | img/theme.ipuml | 14 | ||||
-rw-r--r-- | projdoc.cls | 2 | ||||
-rw-r--r-- | reqs.toml | 65 | ||||
-rw-r--r-- | research.tex | 8 | ||||
-rw-r--r-- | time.txt | 67 |
41 files changed, 3624 insertions, 323 deletions
@@ -1,5 +1,7 @@ \documentclass{projdoc} +\usepackage{eso-pic} + \title{Software Design} \begin{document} @@ -15,7 +17,7 @@ similar to Jetpack Joyride. The cr\^epe engine is designed to ease the transition for developers familiar with Unity, ensuring minimal friction when switching platforms. Our aim is to preserve -many of Unity’s core features while introducing a lightweight and open-source +many of Unity's core features while introducing a lightweight and open-source alternative, licensed under the MIT License. The engine is primarily aimed at indie developers who have prior experience with @@ -64,7 +66,7 @@ side-scrolling endless runner action video game created by Halfbrick Studios. Th protagonist is called Barry Steakfries, who the player controls as he steals a bullet-powered jet pack from a top-secret laboratory \autocite{wikipedia:jetpack-joyride}. A screenshot from the game can be seen in -\cref{fig:jetpack-joyride} (pleae be aware that the goal of this project is not to +\cref{fig:jetpack-joyride} (please be aware that the goal of this project is not to create an exact replica of Jetpack Joyride, it is only used as a source of inspiration). @@ -114,11 +116,460 @@ the main part of the \gls{ecs}. The design of these eight systems in combination \gls{ecs}, will be briefly discussed in the next parts of this design document. \section{Design} +%TODO: lag uitleggen uit diagram +%TODO: process input +\subsection{Game Loop} + +\subsubsection{Problem statement} + +A game loop is essential for maintaining a continuous flow of game actions, ensuring +that updates to game logic, physics, and rendering occur in a synchronized manner. +Without a game loop, the game would lack consistent timing, leading to unpredictable +behavior. The game loop is primarily responsible for two main tasks:\noparbreak +\begin{itemize} + \item Updating all systems in the correct order + \item Ensuring the game loop timer remains accurate +\end{itemize} + +The game loop can be external where the user has the ability to update the systems +themselves or an intergrated game loop which is managed by the gameloop. Both of +these approaches have advantages and disadvantages when it comes to flexibility and +reliability. +\subsubsection{Architecture} + +This engine uses an integrated game loop for the following reasons:\noparbreak +\begin{description} + \item[Simplifies development] The user only needs to call \codeinline{startGame()}. + \item[Ensures uniform system calls] Systems are always updated in the same order, + reducing the likelihood of overwrites and undefined system behavior. + \item[Provides a reliable timer update] The game loop timer is updated with each + cycle, minimizing timing issues. +\end{description} + +As seen in \cref{fig:gameloop-flow}, the game loop consists of multiple +steps:\noparbreak +\begin{description} + \item[Update loop timer] The loop timer is updated, and the expected frame time is + calculated. + \item[Check events] Queued events are dispatched, and callback functions are + executed accordingly. + \item[Process input] The input system is called, and user inputs are processed. + \item[Fixed update] A fixed loop for timing-sensitive systems, such as physics. + \item[Update] A per-frame update for all necessary frame-dependent changes. + \item[Render] The render system is called to display the current frame. +\end{description} + +The game loop continues to call the fixed update function as long as there is +sufficient time. Delta time, calculated as the time between the last frame’s start +and the current frame, is used to measure the duration of each frame. This value is +converted into a time-based unit, enabling systems to create frame rate-independent +behavior. + +The fixed update has a specific order to update seperate systems as seen in +\cref{fig:fixed-update}. The scripts update is called first so a gamedevelop can use +the onupdate() in a script to move objects. after this movement the PhysicsSystem +will move objects as well. after all movement is done the collision system will use +the velocity and the current position to determine if something collided. Then the +collisions system will call all collision handelers. After all collisions are +handeled the particle system will update. + +This order can not be changed because the systems work in a specific way. Collisions +looks back in the past and the emitter can be moved so the particle update must be +the last in the fixed update. + +Rendering and animations are handled on a per-frame basis. A delay, combined with +delta time calculation, ensures consistent visuals even at varying frame rates. +\Cref{fig:gameloop-class} shows a \codeinline{TimerClass} using a singleton design +pattern, allowing access to \codeinline{deltaTime} throughout the system. The game +loop updates the timing and delta time in this class to keep it accurate. + +The two main functions of the game loop are \codeinline{setup()} and +\codeinline{loop()}. \codeinline{setup()} handles all startup procedures and is +called only once when the game begins. The \codeinline{loop()} function repeats as +long as the game is running. + +The code example below shows how to start the game engine/game:\noparbreak +\begin{blockcode} +Gameloop loop; +loop.start(); +\end{blockcode} + +% FIXME: not a technical reference +This code calls both \codeinline{setup()} and \codeinline{loop()}, starting the game +loop timer. The current frame’s delta time can be accessed using +\codeinline{LoopTimer::getInstance().getDeltaTime()}, which returns the expected +frame time. + +\begin{figure} + \centering + \includepumldiag{img/gameloop-flow.puml} + \caption{Game loop flowchart diagram} + \label{fig:gameloop-flow} +\end{figure} + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/Fixed_update.png}} + \caption{Fixed update} + \label{fig:fixed-update} +\end{figure} + +\begin{figure} + \centering + \includepumldiag{img/gameloop-class.puml} + \caption{Gameloop flowchart diagram} + \label{fig:gameloop-class} +\end{figure} +\subsection{Texture} +The textures in cr\^epe game engine are represented by the \codeinline{Texture} +class. It is implemented as an \gls{facade} around the \gls{sdl} library. + +\subsubsection{Architecture} + +\Cref{fig:class-texture} shows a class diagram of the texture \gls{facade}. It +contains the following classes:\noparbreak +\begin{description} + \item[SDLContext] This is a facade around the \codeinline{SDL2} library which is + used around different parts of the engine, and is therefore implemented as a + singleton. This class is friends with \codeinline{Texture}, + \codeinline{LoopManager}, \codeinline{RenderSystem} and + \codeinline{AnimatorSystem}. + \item[Texture] This is a wrapper around the \codeinline{SDL_Texture} class, and + uses cr\^epe's \codeinline{Asset} class to load an Texture instead. +\end{description} + +\begin{figure} + \centering + % TODO: export as vector format instead + \includegraphics[width=\textwidth]{img/texture.png} + \caption{User texture class diagram} + \label{fig:class-texture} +\end{figure} +%TODO: lijntjes verbeteren in de diagrammen +%TODO: verwijzen naar assets +\subsection{AssetManager} + +The AssetManager is a \gls{api} class that the user can use to make a +\codeinline{Asset} available from different scenes. + +\subsubsection{Architecture} + +\Cref{fig:class-assetmanager} shows a class diagram of the AssetManager. It contains +the following classes:\noparbreak +\begin{description} + \item[AssetManager] is a Singleton class, meaning only one instance of this class + exists throughout the application. This ensures a single point of access and + control over asset management, simplifying resource handling and avoiding + duplicated assets in memory. +\end{description} + +\begin{figure} + \centering + % TODO: export as vector format instead + \includegraphics[width=0.5\textwidth]{img/AssesManager.png} + \caption{User AssetManager class diagram} + \label{fig:class-assetmanager} +\end{figure} +%TODO geen 2 actien +%TODO: is er geen transform mag wel +%TODO: nog kijken wel of geen spirte keuze in het diagram +%TODO: in het diagram kijken of er een particle emiter \subsection{Rendering} +Every game engine has an rendering structure to present all the different enities and +components on the screen. + +\subsubsection{Architecture} + +% TODO: anyone read this?, fix disgram lines, add particle emitter and camera and reference other classes better +\Cref{fig:class-rendering} shows a class diagram of the RenderSystem. It contains the +following classes:\noparbreak +\begin{itemize} + \item The system architecture is centered around rendering and component + management, with the following key components:\noparbreak + \begin{description} + \item[\codeinline{System}] An interface class containing the virtual + \codeinline{update()} function. + \item[\codeinline{RenderSystem}] A derived class of \codeinline{System} + responsible for rendering operations. + \end{description} + \item The \codeinline{System::get_instance()} function provides a static, singleton + instance for managing system-wide operations. + \item The \codeinline{RenderSystem} class implements various rendering + functions:\noparbreak + \begin{description} + \item[\codeinline{sort_layers()}] Organizes the rendering layers. + \item[\codeinline{clear_screen()}] Clears the screen prior to rendering. + \item[\codeinline{update_sprites()}] Updates sprite positions and states. + \item[\codeinline{update_camera()}] Manages the camera view. + \item[\codeinline{present_screen()}] Presents the final rendered image to the + screen. + \end{description} + \item The \codeinline{SdlContext} class, another singleton, manages the \gls{sdl} + library + \item Components are organized as follows:\noparbreak + \begin{itemize} + \item The \codeinline{Component} base class allows for generic handling of + components. + \item Derived component classes include:\noparbreak + \begin{description} + \item[\codeinline{Sprite}] Represents visual elements with attributes like + \codeinline{sprite}, \codeinline{color}, \codeinline{flip}, + \codeinline{sortingLayer}, and \codeinline{orderInLayer}. + \item[\codeinline{Transform}] Manages positional attributes, including + \codeinline{position}, \codeinline{rotation}, and \codeinline{scale}. + \end{description} + \end{itemize} + \item Both \codeinline{Sprite} and \codeinline{Transform} components provide a + \codeinline{get_instances_max()} function to retrieve the maximum instance count. +\end{itemize} + +\begin{figure} + \centering + % TODO: export as vector format instead + \includegraphics[width=\textwidth]{img/Rendering.png} + \caption{System Rendering class diagram} + \label{fig:class-rendering} +\end{figure} + +\subsubsection{System} + +\begin{figure} + \centering + % TODO: export as vector format instead + \includegraphics[width=\textwidth]{img/flowchart_rendering.png} + \caption{System Rendering flowchart } + \label{fig:class-renderingflowchart} +\end{figure} + + +%TODO: blokken voor callback in sequence +\subsection{Event system} + +\subsubsection{Problem Statement} + +The game engine utilizes the \gls{ecs} architecture, where components store data, and +systems process that data to apply changes. Each system is responsible for managing a +specific domain, such as physics in the physics system and rendering in the rendering +system. To facilitate communication between systems without introducing direct +dependencies, a method of inter-system communication is required to maintain loose +coupling. Additionally, a mechanism that allows one object's trigger to manipulate +adn affect multiple other objects is beneficial for game developers, providing +greater flexibility in designing interactions within the game. + +\subsubsection{Architecture} + +The sollution to connect the various systems and BehaviorScripts together without +inducing high coupling is an event system that facilitates communication between +systems and BehaviorScripts using various types of events. The event system includes +several pre-defined events, all derived from a parent Event class, capable of +handling user input and application-level events, such as window resizing. +Furthermore, a specific event is designated for the collision handler within the +physics system, which can be triggered when two objects collide. The event system +also allows developers to create custom events, such as "onPlayerDeath," and assign +callback functions that execute when the event is triggered. + +\begin{figure} + \centering + % TODO: export as vector format instead + \includegraphics[width=\linewidth]{img/event-uml.drawio.png} + \caption{Event system class diagram} + \label{fig:event-uml} +\end{figure} + +The event system as seen in \cref{fig:event-uml} includes several parts such +as:\noparbreak +\begin{description} + \item[eventManager] The manager has the functions to + subscribe/trigger/queue/dispatch events. It also stores all callback functions + corresponding to specific event. The manager is a singleton and can therefor only + exist once so all events are stored in one place. + \item[IEventWrapper] This is a EventWrapper \emph{interface} which is used to store + all the different templated eventshandlers in one map in the event manager. this + wrapper contains the logic to convert the parent class \emph{event} to the + correct subclasses. It also contains a variable onSuccessDestroy which can be set + to destroy the callback call onces completed. This can be used to make a one time + only event. + \item[Event] This is the parent class where all specific event classes are derived + from. Each event contains a--- + \begin{itemize} + % TODO: the design document is not a technical reference, so implementation + % details shouldn't even be in here. Also, are getter functions used to set + % things nowadays? + \item \emph{\codeinline{static std::uint32_t getStaticEventType()}} to set type + during compiling. + \item \emph{\codeinline{virtual std::uint32_t getEventType() const override }} + function to manage the type conversion during runtime. + \end{itemize} + Other functions can be freely added when creating a custom function. When an + event is triggered a specific derived class must be used to indicate which event + is triggered. A reference to this event is then transfered to all callback + functions subscribed. + \item[IKeyListener] This is an interface designed to match the API. By deriving + from this interface the game developer can override the key event functions to + add their own functionality. The derived class will immediately be subscribed to + the EventManager and will Unsubscibe when deleted. + \item[IMouseListener] Like the IKeyListener this is also an interface to interact + with the eventManager. The derived classes from this interface handle various + mouse related events. These events are triggered when the mouse is + clicked/pressed/released or moved. +\end{description} + +The gamedeveloper can interact with the EventManager using the following +functions:\noparbreak +\begin{description} + \item[Subscribe] This subscribes a function pointer or lambda function to a given + event. The function can be subscribed either to all event triggers or a specifc + ID. + \item[Trigger] This triggers a given event and all callbacks correlating to this + event are executed immediately. + \item[Queue event] This queues an event to be executed at a fixed time during the + gameloop. + \item[Unsubscibe] This removes the callback function from the event and it will no + longer be executed. +\end{description} + +\Cref{fig:event-seq} shows that when a specific function is triggered or dispatched +using the callback(eventHandler) is executed. + +\begin{figure} + \centering + \includepumldiag{img/event-sequence.puml} + \caption{Sequence diagram for event calling} + \label{fig:event-seq} +\end{figure} + \subsection{Physics} +The Physics in the game engine are handled by the \emph{PhysicsSystem}. The physics +calculate the velocity and moves each component with a Rigidbody. This game engine +does not use any third party tools for calculating physics. + +\subsubsection{Architecture} + +The \emph{PhysicsSystem} is a system and therefor a singleton in this engine. Besides +the \codeinline{getinstance()} and \codeinline{update()} function it does not include +more functions. The \emph{PhysicsSystem} uses a couple components:\noparbreak +\begin {description} + \item[Transform] The \emph{PhysicsSystem} is the only system to change the values + in the transform. A user is able to change these values through a script. + \item[Rigidbody] The \emph{PhysicsSystem} uses this to know what the next velocity + should be and if it can move. What the physics system includes is shown in + \cref{fig:physics-system} +\end{description} + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/Physics_system.png}} + \caption{Physics system} + \label{fig:physics-system} +\end{figure} + +\subsubsection{Design} + +The physics system is not a complex system. It works in three steps. It will request +all physicsbodies. If there are no physicsbodies linked to a gameobject than that +object does not have physics. It will read the values within the rigidbody and update +the velocities. after this update it will move all objects. This is shown in the +\cref{fig:physics-system-flowchart}. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/Physics_system_flowchart.png}} + \caption{Physics system flowchart} + \label{fig:physics-system-flowchart} +\end{figure} +%TODO: andere lijn in het diagram +\subsection{Collisions} + +The Collisions in the game engine are handled by the \emph{CollisionSystem}. This +system check if a collider collided with another collider. + +\subsubsection{Architecture} + +The \emph{CollisionSystem} is a system and therefor a singleton in this engine. +Besides the \codeinline{getinstance()} and \codeinline{update()} function it does not +include more functions. The \emph{CollisionSystem} uses a couple +components:\noparbreak +\begin {description} + \item[Transform] The \emph{CollisionSystem} Read the location and rotation value to + know where all colliders are located. + \item[Rigidbody] The \emph{CollisionSystem} uses this to know if collision needs to + be check, how collisions should be checked and how they are handled. + \item[BoxCollider] The box collider is a square with a width and height used to + check for collisions. + \item[CircleCollider] The circle collider is a circle with a radius used to check + for collisions. +\end{description} +This is shown in \cref{fig:collision-system}. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/Collision_system.png}} + \caption{Collision system} + \label{fig:collision-system} +\end{figure} + +\subsubsection{Design} + +The collision system is complex compared to other systems. This is shown in +\cref{fig:collision-system-flowchart}. Because multiple colliders of different types +can be added to one gameobject this system is complex. For this game it is not needed +to check for more than one collider per gameobject but this functionality is added to +the design. If the engine needs to be able to do this it can be added without +changing the design. The same is for child and parent gameobjects. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/Collision_system_flowchart.png}} + \caption{Collision system flowchart} + \label{fig:collision-system-flowchart} +\end{figure} +%TODO: diagram particle +\subsection{Particles} + +The Particles in the game engine are handled by the \emph{ParticlesSystem}. This +system uses particleEmitters to create and move particles. + +\subsubsection{Architecture} + +The \emph{ParticlesSystem} is a system and therefor a singleton in this engine. +Besides the \codeinline{getinstance()} and \codeinline{update()} function it does not +include more functions. The \emph{ParticlesSystem} uses a couple +components:\noparbreak +\begin {description} + \item[Transform] The \emph{ParticlesSystem} Read the location and rotation value to + know where the emitter is located + \item[ParticleEmitter] The \emph{ParticlesSystem} uses the particle emitter to know + what the values and configuration of the emitter are. + \item[Particle] info for each particle. +\end{description} + +This is shown in \cref{fig:particle-system}. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/Particle_system.png}} + \caption{Particle system} + \label{fig:particle-system} +\end{figure} + +\subsubsection{Design} + +The particle system is a bit strange because it uses a component which has objects +(particles). How this system works is shown in the +\cref{fig:particle-system-flowchart}. Because each particle needs to be create +pooling is used to increase efficientcy in the calulcation time of all the particles. +Pooling decreases the calculation time by a factor of 10. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/Particle_system_flowchart.png}} + \caption{Particle system flowchart} + \label{fig:particle-system-flowchart} +\end{figure} + \subsection{Scripting} The scripting interface was designed around a `target' \gls{api} (described by @@ -154,6 +605,7 @@ architecture:\noparbreak \end{itemize} \subsubsection{Architecture} +\label{sec:scripts:architecture} The restrictions detailed at the start of this section are mitigated as follows:\noparbreak @@ -176,10 +628,11 @@ follows:\noparbreak contains the following classes:\noparbreak \begin{description} \item[Script] This is the script \emph{interface}, and is used by the game - programmer to create derived script classes. All methods in this class are - declared virtual and have an empty implementation. + programmer to create derived script classes. All virtual methods in this class + have an empty implementation by default, and are optionally implemented by the + game programmer. - This class' methods are protected by default, and a friend relation to + This class' virtual methods are protected by default, and a friend relation to \codeinline{ScriptSystem} is used to ensure only \codeinline{ScriptSystem} is able to call these methods. @@ -188,6 +641,10 @@ contains the following classes:\noparbreak function returns a reference to the \codeinline{BehaviorScript} instance it was called on so it can be chained after the call to \codeinline{GameObject::add_component}. + + \codeinline{Script} also has a reference to its parent + \codeinline{BehaviorScript} instance so components can easily be retrieved using + the component manager. \item[BehaviorScript] This is the script \emph{component}, and is given as the template parameter to \codeinline{GameObject::add_component}. @@ -195,7 +652,8 @@ contains the following classes:\noparbreak This class also uses a friend relation to \codeinline{ScriptSystem} to restrict access to its private reference member \codeinline{script}. \item[ScriptSystem] This is the system class that runs the methods implemented in - the derivative instances of \codeinline{Script}. + the derivative instances of \codeinline{Script}. Described further in + \cref{sec:scripts:sytem}. \end{description} \begin{figure} @@ -205,11 +663,37 @@ contains the following classes:\noparbreak \label{fig:class-scripts} \end{figure} +\subsubsection{System} +\label{sec:scripts:sytem} + +Because most of the complexity in the scripting interface comes from the containers +described in \cref{sec:scripts:architecture}, the script system class itself is +relatively simple. The script system provides a method +\codeinline{ScriptSystem::update} that calls all active script's update functions. + +Because of the limitation that types cannot be passed as parameters in C++, the +user-defined script class (derived from \codeinline{Script}) can not directly be +instantiated when adding the component to the component manager. To work around this +limitation, the method \codeinline{BehaviorScript::set_script} was created. This +results in the possibility that an instance of \codeinline{BehaviorScript} does not +reference an instance of \codeinline{Script}. In addition to the non-active script +components, the script system skips over these `invalid' instances. This is +illustrated in \cref{fig:activity-scripts}. + +\begin{figure} + \centering + \includepumldiag{img/activity-scripts.puml} + \caption{Script system update method} + \label{fig:activity-scripts} +\end{figure} + +A \gls{poc} for the script system is shown in \cref{poc:scripts}. + \subsection{Audio} Since writing a custom real-time audio mixing engine is outside the scope of this project\mref and C++ does not provide a built-in cross-platform audio \gls{api}, the -audio system inside the cr\^epe engine is implemented as a fa\c{c}ade around an +audio system inside the cr\^epe engine is implemented as a \gls{facade} around an existing audio library. \subsubsection{Libraries} @@ -220,15 +704,7 @@ searching for libraries (search terms: `dynamic/adaptive audio', `real-time audi `audio library', `game audio engine'), several libraries were found. These libraries were checked against the audio engine requirements \autocite{crepe:requirements} and then tested by writing the same benchmark-style \gls{poc} using the remaining -qualifying libraries:\noparbreak -\begin{enumerate} - \item Load a background track (Ogg Vorbis) - \item Load three short samples (WAV) - \item Start the background track - \item Play each sample sequentially while pausing and resuming the background track - \item Play all samples simultaniously - \item Stop all audio and exit -\end{enumerate} +qualifying libraries. These \glspl{poc} are detailed in \cref{poc:audio}. Of these libraries the following were determined to be unsuitable for use in this project:\noparbreak @@ -244,12 +720,12 @@ project:\noparbreak The only library that remained after these tests is SoLoud \autocite{lib:soloud}. It is Zlib/LibPng licensed and provides a high-level object-oriented C++ \gls{api}. -\Cref{sec:audio:architecture} describes the fa\c{c}ade written for this library. +\Cref{sec:audio:architecture} describes the \gls{facade} written for this library. \subsubsection{Architecture} \label{sec:audio:architecture} -\Cref{fig:class-audio-facade} shows a class diagram of the audio fa\c{c}ade. It +\Cref{fig:class-audio-facade} shows a class diagram of the audio \gls{facade}. It contains the following classes: \begin{description} \item[SoundContext] This is a wrapper around the \codeinline{SoLoud::soloud} @@ -265,17 +741,403 @@ contains the following classes: \begin{figure} \centering \includepumldiag{img/facade-audio.puml} - \caption{Audio fa\c{c}ade class diagram} + \caption{Audio \glsfmtshort{facade} class diagram} \label{fig:class-audio-facade} \end{figure} -\subsection{Input} +A \gls{poc} for the final Audio \gls{facade} is also showcased in \cref{poc:audio}. -\subsection{Physics} +% \subsection{Save manager} +% +% The save manager \gls{api} is designed to give the game programmer an easy to use +% interface for retrieving and storing game-specific data (\cref{req:savemgr}). +% +% Because the engine validation app only stores statistics and highscores, the save +% manager is not required to support loading different save files +% (\cref{req:savemgr:multi-file}), nor storing complicated data types +% (\cref{req:savemgr:types-custom}). The save manager only supports storing simple +% types (\cref{req:savemgr:types-scalar,req:savemgr:types-string}). +% +% In order to reduce complexity for the game programmer further, the following +% requirements were also set:\noparbreak +% +% \begin{itemize} +% \item Prevent data loss in the case of crashes (\cref{req:savemgr:journalling}) +% \item Handle opening/closing/flushing of the underlying file automatically +% (\cref{req:savemgr:file-manage}) +% \item Save file variables are uniquely identified (\cref{req:savemgr:var-key}) +% \end{itemize} +% +% \subsubsection{Architecture} +% \label{sec:savemgr:architecture} +% +% \begin{figure} +% \centering +% \includepumldiag{img/class-savemgr.puml} +% \caption{Save manager class diagram} +% \label{fig:class-savemgr} +% \end{figure} +% +% In order to realize \cref{req:savemgr:journalling,req:savemgr:var-key}, a third-party +% key-value database library is used. + +\subsection{Global configuration interface} + +Because the game programmer only has access to interfaces within the public \gls{api} +namespace (\codeinline{crepe::api}), they would not be able to configure aspects of +engine-internal components. To work around this access restriction, a global +interface was made that stores arbitrary data, which can be accessed both internally +and via the public \gls{api}. + +\subsubsection{Architecture} +\label{sec:config:architecture} + +The global configuration interface consists of a single singleton class that can be +accessed globally (see \cref{fig:class-config}). This class holds several anonymous +structs, which are used to organize options per system or engine component. + +\begin{figure} + \centering + \includepumldiag{img/class-config.puml} + \caption{Global configuration interface class diagram} + \label{fig:class-config} +\end{figure} + +% \subsection{Input} + +% \subsection{Physics} + +\appendix + +\section{Proof-of-concepts} + +The full (documented) source code of these \glspl{poc} is available on GitHub +\autocite{crepe:code-repo}. + +\subsection{Script system} +\label{poc:scripts} + +The script system \gls{poc} \autocite[script example]{crepe:code-repo} consists of +the following:\noparbreak +\begin{itemize} + \item A user-defined class (\codeinline{MyScript}) derived from + \codeinline{Script}, which only implements the \codeinline{update()} function. + \item A main function that--- + \begin{itemize} + \item Creates a game object with \codeinline{Transform} and + \codeinline{BehaviorScript} components. + \item A call to \codeinline{ScriptSystem::update}, which results in + \codeinline{MyScript::update} being called. + \end{itemize} +\end{itemize} + +Running the \gls{poc} results in the output shown in \cref{fig:poc-output-scripts}, +demonstrating that the system works as intended. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/poc-output-scripts.png}} + \caption{Script system \glsfmtshort{poc} output} + \label{fig:poc-output-scripts} +\end{figure} + +\subsection{Logging utilities} +\label{poc:log} + +A small \gls{poc} was written to test the engine's logging functions \autocite[log +example]{crepe:code-repo}. The following calls are used in this example: + +\begin{blockcode} +dbg_trace(); // the dbg_* macros automatically show +dbg_logf("test printf parameters: %d", 3); // where the message is coming from +logf(LogLevel::INFO, "info message"); +logf(LogLevel::WARNING, "warning"); +logf(LogLevel::ERROR, "error"); +\end{blockcode} + +The output of this test is shown in \cref{fig:poc-log}. + +\begin{figure} + \centering + \includegraphics[scale=0.7]{img/poc-log.png} + \caption{Logging function outputs} + \label{fig:poc-log} +\end{figure} + +\subsection{Audio} +\label{poc:audio} + +A test that consists of the following steps was written for each audio library +mentioned in \cref{sec:audio:libs}:\noparbreak +\begin{enumerate} + \item Load a background track (Ogg Vorbis) + \item Load three short samples (WAV) + \item Start the background track + \item Play each sample sequentially while pausing and resuming the background track + \item Play all samples simultaniously + \item Stop all audio and exit +\end{enumerate} + +The repository \autocite{crepe:code-repo} contains two finished \glspl{poc} under the +\codeinline{mwe/audio/} subdirectory for miniaudio and SoLoud. The SoLoud \gls{poc} +was later converted to a full audio \gls{facade}, which is currently part of the +cr\^epe engine. The \gls{poc} using the audio \gls{facade} is available from the same +repository, under the \codeinline{src/example/audio_internal.cpp} file. + +\subsection{Gameloop} +\label{poc:gameloop} -\section{Tools} +\begin{figure} + \centering + \includegraphics[scale=0.4]{img/gameloop-squares.png} + \caption{Gameloop running example} + \label{fig:poc-gameloop-squares} +\end{figure} + +This \gls{poc} shows the functionality of the different loops and the approaches to +decouple the updates from the framerate. \Cref{fig:poc-gameloop-squares} shows two +squares that keep moving at the same speed no matter how high or low the framerate +gets. This is done by updating the squares in the per frame update loop with the +delta time generated by the timer. By multipling deltaTime to the velocity of the +square the velocity is converted to a time instead of frames. this can be seen in de +following code example\noparbreak +\begin{blockcode} +float delta = timer.getDeltaTime(); // get delta time of current frame + if (obj->direction == 1) { + obj->setX(obj->getX() + 50 * delta); // multiply velocity by delta time for consistent behavior. + } else { + obj->setX(obj->getX() - 50 * delta); + } +\end{blockcode} + +The second functionality this \gls{poc} shows is how the fixed loop is executed. +Based on the framerate of the gameloop the fixed loop is executed multiple times per +frame or skips a certain amount of frames as seen in +\cref{fig:poc-gameloop-500fps,fig:poc-gameloop-10fps}. + +\begin{figure} + \centering + \begin{subfigure}[b]{0.45\textwidth} + \centering + \includegraphics[scale=0.5]{img/gameloop-console.png} + \caption{Fixed loop (50Hz) with 500 fps} + \label{fig:poc-gameloop-500fps} + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.45\textwidth} + \centering + \includegraphics[scale=0.5]{img/gameloop-console-10.png} + \caption{Fixed loop (50Hz) with 10 fps} + \label{fig:poc-gameloop-10fps} + \end{subfigure} + \caption{Comparison of game loop performance at different frame rates} + \label{fig:poc-gameloop-console-comparison} +\end{figure} + +\subsection{Events/input system} +\label{poc:event} + +\begin{figure} + \centering + \includegraphics[scale=0.4]{img/poc-button.png} + \caption{Gameloop running example} + \label{fig:poc-event} +\end{figure} + +The event/input system \gls{poc} shows the different ways the event system can be +used. It also serves as a basis on which the input system is developed. the first two +features show the workings of the two interfaces which are created so the game +developer doesnt need to subscribe each function individualy. The gamedeveloper only +needs to create a derived class from the parent IKeyListener or IMouseListener and +override the functions with their own implementation as shown below.\noparbreak +\begin{description} + \item[KeyListener] \codeinline{KeyListenerTest keyListener(testListenerId);} this + line creates a concrete KeyListener that has been created as follows. + \begin{blockcode} + class KeyListenerTest : public IKeyListener { + public: + KeyListenerTest(int listenerId); + ~KeyListenerTest(); + + void onKeyPressed(const KeyPressedEvent& event) override; + void onKeyReleased(const KeyReleasedEvent& event) override; + }; + \end{blockcode} + The functions have been overridden to add custom functionality, which is called + when a key is pressed or released. + \item[MouseListener] Like the KeyListener, \codeinline{MouseListenerTest + mouseListener(testListenerId);} is a concrete derived class of IMouseListener, + created as follows:\noparbreak + \begin{blockcode} + class MouseListenerTest : public IMouseListener { + public: + MouseListenerTest(int listenerId); + ~MouseListenerTest(); + + void onMouseClicked(const MouseClickEvent& event) override; + void onMousePressed(const MousePressedEvent& event) override; + void onMouseReleased(const MouseReleasedEvent& event) override; + void onMouseMoved(const MouseMovedEvent& event) override; + }; + \end{blockcode} +\end{description} + +Secondly the \gls{poc} shows how the gamedeveloper can create custom events by +creating a derived class from the parent class Event. This custom event can then be +used to subscribe callbacks to which can use the data within the derived class. Below +is an example of such a custom event.\noparbreak +\begin{blockcode} +class PlayerDamagedEvent : public Event { +public: + PlayerDamagedEvent(int damage, int playerID) + : Event("PlayerDamaged"), damage(damage), playerID(playerID) {} + + REGISTER_EVENT_TYPE(PlayerDamagedEvent); + + int getDamage() const { return damage; } + int getPlayerID() const { return playerID; } + +private: + int damage; + int playerID; +}; +\end{blockcode} + +An example of a callback function using the custom PlayerDamagedEvent:\noparbreak +\begin{blockcode} +void onPlayerDamaged(const PlayerDamagedEvent & e) { + std::cout << "Player " << e.getPlayerID() << " took " << e.getDamage() + << " damage." << std::endl; +} +\end{blockcode} + +Lastly the \gls{poc} shows how a button can be handled using a input sytem. The blue +square in \cref{poc:event} represents a button component which will call its +onClick() function when the mouse click event triggers within its boundary. The +result can be seen in \cref{fig:poc-event-button}. + +\begin{figure} + \centering + \includegraphics[scale=1]{img/poc-event-button.png} + \caption{gameloop running example} + \label{fig:poc-event-button} +\end{figure} + +\subsection{Camera} +\label{poc:camera} + +The camera \gls{poc} \autocite[camera example]{crepe:code-repo} consists of the +following:\noparbreak +\begin{itemize} + \item An \codeinline{on_key_pressed} function, which listens for key presses and + adjusts camera position and zoom based on key inputs. + \item A user-defined script class (\codeinline{MyCameraScript}) derived from + \codeinline{Script}, implementing only the \codeinline{update()} function. To + update the camera movements and zoom. + \item A main function that--- + \begin{itemize} + \item Subscribes the \codeinline{on_key_pressed} function to handle + \codeinline{KeyPressedEvent} events. + \item Creates a \codeinline{GameObject} for the camera and adds + \codeinline{Camera} and \codeinline{BehaviorScript} components, with + \codeinline{MyCameraScript} attached to manage the camera's transformation. + \item Instantiates a background \codeinline{GameObject} with + \codeinline{Transform} and \codeinline{Sprite} components, loading an + external texture as its background. + \end{itemize} +\end{itemize} + +Running this \gls{poc} allows for controlled camera movement and zoom in response to +key inputs. The \codeinline{MyCameraScript::update} function ensures that these +transformations are applied each frame, as demonstrated by the output in +\cref{fig:poc-output-camera}. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/poc-camera.pdf}} + \caption{Camera \glsfmtshort{poc} output} + \label{fig:poc-output-camera} +\end{figure} + + +\subsection{Particles} +\label{poc:particle} + +The particles \gls{poc} \autocite[particles example]{crepe:code-repo} consists of the +one particle emitter that is shown in \cref{fig:poc-particles}. This particle +emmitter is controlled by the particle system using ECS. I can generate particles in +a specified direction and velocity. With min and max values the system will determine +what the exact value of eacht particle will be. + +This \gls{poc} showed that pooling is a must, even with lower amounts of particles. +The calculation time of 100 particles was about 0.09\,ms and with pooling 0.009\,ms. +Decreasing calculation times of physics is important because everything needs to eb +calculated in 16.6\,ms (60\,hz). + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/poc-particles.png}} + \caption{Particles \glsfmtshort{poc} output} + \label{fig:poc-particles} +\end{figure} + +\subsection{Collision} +\label{poc:collision} + +The collision \gls{poc} \autocite[collision example]{crepe:code-repo} uses a couple +of systems. It uses ECS, Physics system, Collisions system and Render system. It uses +a lot of components like a gamedeveloper would use. This poc shows that multiple +systems can work together and shows physics described by the gamedeveloper. + +This \gls{poc} shows two boxes with some distance from each other +\cref{fig:poc-no-collision}, and collide \cref{fig:poc-collision}. The red box is +static and can not be moved be physics even if it has gravity. The green box is +dynamic and is moved by gravity. These movements are done to add the velocity to the +transform. the velocity is calculated by the physics and saved in the rigidbody. +before moving the collision system checks if there is collison, so it looks at the +future. if the green box wants to move through the red box it is pushed back by the +collision handler because the green box is static. + +This \gls{poc} showed that it is better to do the opposite. Move all object then look +back if the collided with anything. + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/poc-collision-1.png}} + \caption{No collision \glsfmtshort{poc} output} + \label{fig:poc-no-collision} +\end{figure} + +\begin{figure} + \centering + \fitimg{\includegraphics[scale=0.7]{img/poc-collision-2.png}} + \caption{Collision \glsfmtshort{poc} output} + \label{fig:poc-collision} +\end{figure} -\section{Conclusion} +\makeatletter% +\newbox\full@class@diag% +\newlength\full@class@diag@width% +\newlength\full@class@diag@height% +\savebox\full@class@diag{\includegraphics{img/class-api-full.pdf}}% +\settowidth\full@class@diag@width{\usebox\full@class@diag}% +\settoheight\full@class@diag@height{\usebox\full@class@diag}% +\begingroup% +\eject% +\thispagestyle{empty}% +\pdfpagewidth=\full@class@diag@width% +\pdfpageheight=\full@class@diag@height% +\AddToShipoutPictureBG*{% + \AtPageUpperLeft{% + \raisebox{-\full@class@diag@height}{% + \usebox\full@class@diag% + }% + }% +}% +\section{Full API class diagram}% +\newpage% +\endgroup% +\makeatother% \end{document} diff --git a/example.tex b/example.tex index 9f36f59..3c487bd 100644 --- a/example.tex +++ b/example.tex @@ -164,8 +164,8 @@ The bibliography is automatically printed after \codeinline{\end{document}}. \subsubsection{Glossary} Glossary entries can be inserted using the \codeinline{\gls} commands. Example: -``\Gls{sdl2} handles \glspl{hid} as well!''. In following occurrences of acronyms, -only their short form is printed: `\gls{sdl2}' and `\gls{hid}'. All of these link to +``\Gls{sdl} handles \glspl{hid} as well!''. In following occurrences of acronyms, +only their short form is printed: `\gls{sdl}' and `\gls{hid}'. All of these link to the glossary that is automatically printed after \codeinline{\end{document}}. \subsubsection{Requirements} diff --git a/figs.drawio b/figs.drawio index 3dec3aa..3e0d2f3 100644 --- a/figs.drawio +++ b/figs.drawio @@ -1,6 +1,6 @@ -<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17" pages="10"> +<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17" pages="19"> <diagram id="ehgrrEZq6aIl9GSG0JpL" name="Main"> - <mxGraphModel dx="1793" dy="883" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="3300" pageHeight="2339" math="0" shadow="0"> + <mxGraphModel dx="5346" dy="3345" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="3300" pageHeight="2339" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> @@ -259,57 +259,60 @@ <mxGeometry y="85" width="200" height="17" as="geometry" /> </mxCell> <mxCell id="5-8bWhzpOWirDYeo3-Cj-111" value="Rigidbody" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> - <mxGeometry x="1290" y="341" width="240" height="289" as="geometry"> + <mxGeometry x="1290" y="341" width="260" height="306" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> <mxCell id="5-8bWhzpOWirDYeo3-Cj-112" value="+mass : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="26" width="240" height="17" as="geometry" /> + <mxGeometry y="26" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="5-8bWhzpOWirDYeo3-Cj-113" value="+gravity_scale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="43" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="5-8bWhzpOWirDYeo3-Cj-113" value="+gravityScale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="43" width="240" height="17" as="geometry" /> + <mxCell id="5-8bWhzpOWirDYeo3-Cj-114" value="+bodyType : body_type" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="60" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="5-8bWhzpOWirDYeo3-Cj-114" value="+bodyType : BodyType" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="60" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-4" value="+angular_damping : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="77" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-4" value="+angularDamping : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="77" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-3" value="+angular_velocity : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="94" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-3" value="+angularVelocity : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="94" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-2" value="+collision_detection_mode : detection_mode" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="111" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-2" value="+collisionDetectionMode : DetectionMode" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="111" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-1" value="+constraints : physics_constraints" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="128" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-1" value="+constraints : PhysicsConstraints" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="128" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-9" value="+detect_collisions : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="145" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-9" value="+detectCollisions : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="145" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-8" value="+included_collision_layers : Vector<int>" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="162" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-8" value="+includedCollisionLayers : Vector<int>" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="162" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-6" value="+linear_damping : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="179" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-6" value="+linearDamping : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="179" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-5" value="+linear_Velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="196" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-5" value="+linearVelocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="196" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-12" value="+max_angular_velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="213" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-12" value="+maxAngularVelocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="213" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-11" value="+max_linear_velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="230" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-11" value="+maxLinearVelocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="230" width="240" height="17" as="geometry" /> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-13" value="+use_gravity : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> + <mxGeometry y="247" width="260" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-13" value="+useGravity : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="247" width="240" height="17" as="geometry" /> + <mxCell id="wDzscC7uqzlAT16Y9o6J-1" value="+bounce : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="5-8bWhzpOWirDYeo3-Cj-111"> + <mxGeometry y="264" width="260" height="17" as="geometry" /> </mxCell> <mxCell id="5-8bWhzpOWirDYeo3-Cj-115" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="264" width="240" height="8" as="geometry" /> + <mxGeometry y="281" width="260" height="8" as="geometry" /> </mxCell> <mxCell id="5-8bWhzpOWirDYeo3-Cj-116" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="5-8bWhzpOWirDYeo3-Cj-111" vertex="1"> - <mxGeometry y="272" width="240" height="17" as="geometry" /> + <mxGeometry y="289" width="260" height="17" as="geometry" /> </mxCell> <mxCell id="5-8bWhzpOWirDYeo3-Cj-117" value="BehaviorScript" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> <mxGeometry x="1520" y="663" width="160" height="85" as="geometry"> @@ -541,20 +544,6 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="5-8bWhzpOWirDYeo3-Cj-160" value="ParticleSystem" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> - <mxGeometry x="2210" y="1114.5" width="160" height="68" as="geometry"> - <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> - </mxGeometry> - </mxCell> - <mxCell id="5-8bWhzpOWirDYeo3-Cj-161" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="5-8bWhzpOWirDYeo3-Cj-160" vertex="1"> - <mxGeometry y="26" width="160" height="17" as="geometry" /> - </mxCell> - <mxCell id="5-8bWhzpOWirDYeo3-Cj-162" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="5-8bWhzpOWirDYeo3-Cj-160" vertex="1"> - <mxGeometry y="43" width="160" height="8" as="geometry" /> - </mxCell> - <mxCell id="5-8bWhzpOWirDYeo3-Cj-163" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="5-8bWhzpOWirDYeo3-Cj-160" vertex="1"> - <mxGeometry y="51" width="160" height="17" as="geometry" /> - </mxCell> <mxCell id="5-8bWhzpOWirDYeo3-Cj-168" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;fontColor=#FF0000;strokeColor=#fa0000;" parent="1" source="5-8bWhzpOWirDYeo3-Cj-56" target="5-8bWhzpOWirDYeo3-Cj-106" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="2000" y="645" as="sourcePoint" /> @@ -632,31 +621,31 @@ <mxCell id="V-ZVI1K5bxIVrfWjpJuH-13" value="+position : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="26" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-17" value="+maxParticles : uint32_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-17" value="+max_particles : uint32_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="43" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-16" value="+emissionRate : uint32_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-16" value="+emission_rate : uint32_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="60" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-15" value="+minSpeed : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-15" value="+min_speed : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="77" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-20" value="+maxSpeed : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-20" value="+max_speed : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="94" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-19" value="+minAngle : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-19" value="+min_angle : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="111" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-18" value="+maxAngle : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-18" value="+max_angle : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="128" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-22" value="+endLifespan : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-22" value="+end_lifespan : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="145" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="YKgVrhEJGfdfAljirImL-1" value="+forceOvertime : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> + <mxCell id="YKgVrhEJGfdfAljirImL-1" value="+force_overtime : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="162" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="iLlbnCJIxoT-n0g-ZMnA-8" value="+Boundary : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="V-ZVI1K5bxIVrfWjpJuH-1"> + <mxCell id="iLlbnCJIxoT-n0g-ZMnA-8" value="+boundary : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="179" width="390" height="17" as="geometry" /> </mxCell> <mxCell id="V-ZVI1K5bxIVrfWjpJuH-5" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;fontColor=#0000FF;strokeColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> @@ -665,7 +654,7 @@ <mxCell id="V-ZVI1K5bxIVrfWjpJuH-6" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#000000;" parent="V-ZVI1K5bxIVrfWjpJuH-1" vertex="1"> <mxGeometry y="204" width="390" height="17" as="geometry" /> </mxCell> - <mxCell id="V-ZVI1K5bxIVrfWjpJuH-7" value="Particles" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;strokeColor=#0000FF;fontColor=#0000FF;" parent="1" vertex="1"> + <mxCell id="V-ZVI1K5bxIVrfWjpJuH-7" value="Particle" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;strokeColor=#0000FF;fontColor=#0000FF;" parent="1" vertex="1"> <mxGeometry x="2420" y="290" width="330" height="153" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> @@ -676,7 +665,7 @@ <mxCell id="QpFLp5RZX1MbUHJJD-iN-25" value="+velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-7" vertex="1"> <mxGeometry y="43" width="330" height="17" as="geometry" /> </mxCell> - <mxCell id="QpFLp5RZX1MbUHJJD-iN-24" value="+endLifespan : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-7" vertex="1"> + <mxCell id="QpFLp5RZX1MbUHJJD-iN-24" value="+end_lifespan : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-7" vertex="1"> <mxGeometry y="60" width="330" height="17" as="geometry" /> </mxCell> <mxCell id="QpFLp5RZX1MbUHJJD-iN-23" value="+active : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="V-ZVI1K5bxIVrfWjpJuH-7" vertex="1"> @@ -743,13 +732,13 @@ <mxCell id="ZHgyX9xX1EySbdOx-EKd-3" value="+ aspect_width : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-1" vertex="1"> <mxGeometry y="43" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="xyZsm_uoETzsuu8GtZ24-1" value="+ aspect_height : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-1"> + <mxCell id="xyZsm_uoETzsuu8GtZ24-1" value="+ aspect_height : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-1" vertex="1"> <mxGeometry y="60" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="xyZsm_uoETzsuu8GtZ24-2" value="+ x,y : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-1"> + <mxCell id="xyZsm_uoETzsuu8GtZ24-2" value="+ x,y : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-1" vertex="1"> <mxGeometry y="77" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="xyZsm_uoETzsuu8GtZ24-3" value="+ zoom : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-1"> + <mxCell id="xyZsm_uoETzsuu8GtZ24-3" value="+ zoom : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-1" vertex="1"> <mxGeometry y="94" width="160" height="17" as="geometry" /> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-5" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="ZHgyX9xX1EySbdOx-EKd-1" vertex="1"> @@ -782,7 +771,7 @@ </mxGeometry> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-10" value="UIObject" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> - <mxGeometry x="330" y="530" width="160" height="85" as="geometry"> + <mxGeometry x="330" y="330" width="160" height="88" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> @@ -799,31 +788,43 @@ <mxGeometry y="68" width="160" height="17" as="geometry" /> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-15" value="Button" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> - <mxGeometry x="240" y="670" width="160" height="85" as="geometry"> + <mxGeometry x="240" y="577" width="160" height="224" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="ZHgyX9xX1EySbdOx-EKd-16" value="+interactable
" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-15" vertex="1"> - <mxGeometry y="26" width="160" height="17" as="geometry" /> + <mxCell id="b9PUVzKm1xv-XXmSICqI-30" value="+ interactable : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-15"> + <mxGeometry y="26" width="160" height="26" as="geometry" /> </mxCell> - <mxCell id="ZHgyX9xX1EySbdOx-EKd-17" value="+onClick" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-15" vertex="1"> - <mxGeometry y="43" width="160" height="17" as="geometry" /> + <mxCell id="b9PUVzKm1xv-XXmSICqI-31" value="+ isToggle : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-15"> + <mxGeometry y="52" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-32" value="+ isPressed : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-15"> + <mxGeometry y="78" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-35" value="+ onExit : EventHandler<MouseMoveEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-15"> + <mxGeometry y="104" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-34" value="+ onEnter : EventHandler<MouseMoveEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-15"> + <mxGeometry y="130" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-33" value="+ onClick : EventHandler<MouseClickEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="ZHgyX9xX1EySbdOx-EKd-15"> + <mxGeometry y="156" width="160" height="26" as="geometry" /> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-18" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="ZHgyX9xX1EySbdOx-EKd-15" vertex="1"> - <mxGeometry y="60" width="160" height="8" as="geometry" /> + <mxGeometry y="182" width="160" height="8" as="geometry" /> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-19" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="ZHgyX9xX1EySbdOx-EKd-15" vertex="1"> - <mxGeometry y="68" width="160" height="17" as="geometry" /> + <mxGeometry y="190" width="160" height="17" as="geometry" /> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-20" value="Text" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> - <mxGeometry x="424" y="670" width="160" height="136" as="geometry"> + <mxGeometry x="420" y="577" width="160" height="136" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-21" value="+text" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> <mxGeometry y="26" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="ZHgyX9xX1EySbdOx-EKd-22" value="+font : string" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> + <mxCell id="ZHgyX9xX1EySbdOx-EKd-22" value="+font : Resource" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> <mxGeometry y="43" width="160" height="17" as="geometry" /> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-23" value="+size : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> @@ -832,7 +833,7 @@ <mxCell id="ZHgyX9xX1EySbdOx-EKd-24" value="+allignment" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> <mxGeometry y="77" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="ZHgyX9xX1EySbdOx-EKd-25" value="+color" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> + <mxCell id="ZHgyX9xX1EySbdOx-EKd-25" value="+color : Color" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> <mxGeometry y="94" width="160" height="17" as="geometry" /> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-26" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> @@ -841,24 +842,16 @@ <mxCell id="ZHgyX9xX1EySbdOx-EKd-27" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="ZHgyX9xX1EySbdOx-EKd-20" vertex="1"> <mxGeometry y="119" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="ZHgyX9xX1EySbdOx-EKd-28" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;" parent="1" source="ZHgyX9xX1EySbdOx-EKd-20" target="ZHgyX9xX1EySbdOx-EKd-10" edge="1"> + <mxCell id="ZHgyX9xX1EySbdOx-EKd-28" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="ZHgyX9xX1EySbdOx-EKd-20" target="ZHgyX9xX1EySbdOx-EKd-10" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="1125.9999999999998" y="676" as="sourcePoint" /> <mxPoint x="1125.9999999999998" y="638.0000000000002" as="targetPoint" /> - <Array as="points"> - <mxPoint x="470" y="650" /> - <mxPoint x="470" y="650" /> - </Array> </mxGeometry> </mxCell> - <mxCell id="ZHgyX9xX1EySbdOx-EKd-29" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;" parent="1" source="ZHgyX9xX1EySbdOx-EKd-15" target="ZHgyX9xX1EySbdOx-EKd-10" edge="1"> + <mxCell id="ZHgyX9xX1EySbdOx-EKd-29" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="ZHgyX9xX1EySbdOx-EKd-15" target="ZHgyX9xX1EySbdOx-EKd-10" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="480" y="680" as="sourcePoint" /> - <mxPoint x="480" y="625" as="targetPoint" /> - <Array as="points"> - <mxPoint x="370" y="660" /> - <mxPoint x="370" y="660" /> - </Array> + <mxPoint x="370" y="600" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="ZHgyX9xX1EySbdOx-EKd-30" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;fontColor=#FF0000;strokeColor=#fa0000;" parent="1" source="ZHgyX9xX1EySbdOx-EKd-10" target="5-8bWhzpOWirDYeo3-Cj-106" edge="1"> @@ -1139,7 +1132,7 @@ <Array as="points" /> </mxGeometry> </mxCell> - <mxCell id="iLlbnCJIxoT-n0g-ZMnA-2" value="" style="endArrow=open;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;endSize=8;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1"> + <mxCell id="iLlbnCJIxoT-n0g-ZMnA-2" value="" style="endArrow=open;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;endSize=8;edgeStyle=orthogonalEdgeStyle;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="1950" y="653" as="sourcePoint" /> <mxPoint x="1870" y="577" as="targetPoint" /> @@ -1148,17 +1141,17 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="iLlbnCJIxoT-n0g-ZMnA-3" value="0..1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="iLlbnCJIxoT-n0g-ZMnA-2"> + <mxCell id="iLlbnCJIxoT-n0g-ZMnA-3" value="0..1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="iLlbnCJIxoT-n0g-ZMnA-2" vertex="1" connectable="0"> <mxGeometry x="-0.7119" y="-1" relative="1" as="geometry"> <mxPoint x="-21" y="14" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="iLlbnCJIxoT-n0g-ZMnA-4" value="1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#FF0000;" vertex="1" connectable="0" parent="iLlbnCJIxoT-n0g-ZMnA-2"> + <mxCell id="iLlbnCJIxoT-n0g-ZMnA-4" value="1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#FF0000;" parent="iLlbnCJIxoT-n0g-ZMnA-2" vertex="1" connectable="0"> <mxGeometry x="0.6214" y="-1" relative="1" as="geometry"> <mxPoint x="3" y="14" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="iLlbnCJIxoT-n0g-ZMnA-5" value="" style="endArrow=open;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;endSize=8;edgeStyle=orthogonalEdgeStyle;strokeColor=#0000FF;" edge="1" parent="1" source="V-ZVI1K5bxIVrfWjpJuH-1" target="5-8bWhzpOWirDYeo3-Cj-122"> + <mxCell id="iLlbnCJIxoT-n0g-ZMnA-5" value="" style="endArrow=open;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;endSize=8;edgeStyle=orthogonalEdgeStyle;strokeColor=#0000FF;" parent="1" source="V-ZVI1K5bxIVrfWjpJuH-1" target="5-8bWhzpOWirDYeo3-Cj-122" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="2004.97" y="606" as="sourcePoint" /> <mxPoint x="1924.97" y="530" as="targetPoint" /> @@ -1167,68 +1160,183 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="iLlbnCJIxoT-n0g-ZMnA-7" value="1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="iLlbnCJIxoT-n0g-ZMnA-5"> + <mxCell id="iLlbnCJIxoT-n0g-ZMnA-7" value="1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="iLlbnCJIxoT-n0g-ZMnA-5" vertex="1" connectable="0"> <mxGeometry x="0.6214" y="-1" relative="1" as="geometry"> <mxPoint x="3" y="14" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-1" value="<<enumeration>>
BodyType" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-1" value="<<enumeration>>
body_type" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> <mxGeometry x="320" y="1380" width="160" height="116" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-2" value="static" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-2" value="static" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-1" vertex="1"> <mxGeometry y="40" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-3" value="dynamic" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-3" value="dynamic" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-1" vertex="1"> <mxGeometry y="57" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-6" value="kinematic" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-6" value="kinematic" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-1" vertex="1"> <mxGeometry y="74" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-4" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-4" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="3FSnYpZvSTWzFvyN4hJx-1" vertex="1"> <mxGeometry y="91" width="160" height="8" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-5" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-5" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="3FSnYpZvSTWzFvyN4hJx-1" vertex="1"> <mxGeometry y="99" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-7" value="PhysicsConstraints" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-7" value="physics_constraints" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> <mxGeometry x="320" y="1510" width="160" height="106" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-8" value="+x: bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-7"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-8" value="+x: bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-7" vertex="1"> <mxGeometry y="30" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-9" value="+y: bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-7"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-9" value="+y: bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-7" vertex="1"> <mxGeometry y="47" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-10" value="+rotation: bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-7"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-10" value="+rotation: bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-7" vertex="1"> <mxGeometry y="64" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-11" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-7"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-11" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="3FSnYpZvSTWzFvyN4hJx-7" vertex="1"> <mxGeometry y="81" width="160" height="8" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-12" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-7"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-12" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="3FSnYpZvSTWzFvyN4hJx-7" vertex="1"> <mxGeometry y="89" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-13" value="<<enumeration>>
DetectionMode" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="1"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-13" value="<<enumeration>>
detection_mode" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" parent="1" vertex="1"> <mxGeometry x="320" y="1630" width="160" height="99" as="geometry"> <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-14" value="Discrete" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-13"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-14" value="Discrete" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-13" vertex="1"> <mxGeometry y="40" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-15" value="Continuous" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-13"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-15" value="Continuous" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" parent="3FSnYpZvSTWzFvyN4hJx-13" vertex="1"> <mxGeometry y="57" width="160" height="17" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-17" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-13"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-17" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" parent="3FSnYpZvSTWzFvyN4hJx-13" vertex="1"> <mxGeometry y="74" width="160" height="8" as="geometry" /> </mxCell> - <mxCell id="3FSnYpZvSTWzFvyN4hJx-18" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="3FSnYpZvSTWzFvyN4hJx-13"> + <mxCell id="3FSnYpZvSTWzFvyN4hJx-18" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="3FSnYpZvSTWzFvyN4hJx-13" vertex="1"> <mxGeometry y="82" width="160" height="17" as="geometry" /> </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-1" value="UIObject" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="340" y="-820" width="330" height="90" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-2" value="+ width : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-1"> + <mxGeometry y="26" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-3" value="+ width : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-1"> + <mxGeometry y="52" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-4" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-1"> + <mxGeometry y="78" width="330" height="8" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-5" value="Text" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="710" y="-678" width="330" height="112" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-6" value="+ text : std::string" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-5"> + <mxGeometry y="26" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-7" value="+ font : Font" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-5"> + <mxGeometry y="52" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-8" value="+ fontSize : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-5"> + <mxGeometry y="78" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-9" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-5"> + <mxGeometry y="104" width="330" height="8" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-10" value="TextInput" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-130" y="577" width="330" height="323" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-11" value="+ placeholderText : string" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="26" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-12" value="+ textComponent : Text" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="52" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-13" value="+ characterLimit : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="78" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-14" value="+ interactable : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="104" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-15" value="+ isFocused : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="130" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-16" value="+ onClick : EventHandler<MouseClickEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="156" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-17" value="+ onEnter : EventHandler<MouseMoveEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="182" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-18" value="+ onExit: EventHandler<MouseMoveEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="208" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-19" value="+ onSubmit : EventHandler<SubmitEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="234" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-20" value="+ onValueChange : EventHandler<ValueChangeEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="260" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-21" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="286" width="330" height="8" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-38" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry y="294" width="330" height="17" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-22" value="Button" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-60" y="-678" width="330" height="190" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-23" value="+ interactable : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-22"> + <mxGeometry y="26" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-24" value="+ isToggle : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-22"> + <mxGeometry y="52" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-25" value="+ isPressed : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-22"> + <mxGeometry y="78" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-26" value="+ onClick : EventHandler<MouseClickEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-22"> + <mxGeometry y="104" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-27" value="+ onEnter : EventHandler<MouseMoveEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-22"> + <mxGeometry y="130" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-28" value="+ onExit : EventHandler<MouseMoveEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-22"> + <mxGeometry y="156" width="330" height="26" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-29" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-22"> + <mxGeometry y="182" width="330" height="8" as="geometry" /> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-37" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="b9PUVzKm1xv-XXmSICqI-10" target="ZHgyX9xX1EySbdOx-EKd-10"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="150" y="647.5" as="sourcePoint" /> + <mxPoint x="150" y="592.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-39" value="" style="endArrow=none;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;endSize=8;startArrow=diamondThin;startFill=1;edgeStyle=orthogonalEdgeStyle;strokeColor=#FF0000;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="5-8bWhzpOWirDYeo3-Cj-173" target="b9PUVzKm1xv-XXmSICqI-10"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="250" y="1006" as="sourcePoint" /> + <mxPoint x="-20" y="930" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="b9PUVzKm1xv-XXmSICqI-40" value="0..1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#FF0000;" connectable="0" vertex="1" parent="b9PUVzKm1xv-XXmSICqI-39"> + <mxGeometry x="0.8037" y="-2" relative="1" as="geometry"> + <mxPoint x="-22" y="-89" as="offset" /> + </mxGeometry> + </mxCell> </root> </mxGraphModel> </diagram> @@ -1352,11 +1460,11 @@ </mxGraphModel> </diagram> <diagram id="hmS379YNZ-lkRr77CXku" name="Fixed loop"> - <mxGraphModel dx="1147" dy="565" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <mxGraphModel dx="1434" dy="839" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="LWzpuTTIhLKTzSPn8ECG-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="6kGKwBqryAZ-5GoWzS5M-2" target="LWzpuTTIhLKTzSPn8ECG-1"> + <mxCell id="LWzpuTTIhLKTzSPn8ECG-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="6kGKwBqryAZ-5GoWzS5M-2" target="LWzpuTTIhLKTzSPn8ECG-1" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="6kGKwBqryAZ-5GoWzS5M-2" value="ScriptSystem update" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> @@ -1371,31 +1479,31 @@ <mxCell id="rDM5npk4WMzzq9nIs2zg-1" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" parent="1" vertex="1"> <mxGeometry x="325" y="510" width="30" height="30" as="geometry" /> </mxCell> - <mxCell id="nhMEGUM_DJ7VpblrVjl8-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" target="rDM5npk4WMzzq9nIs2zg-1"> + <mxCell id="nhMEGUM_DJ7VpblrVjl8-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" target="rDM5npk4WMzzq9nIs2zg-1" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="340" y="390" as="sourcePoint" /> </mxGeometry> </mxCell> - <mxCell id="5sUKM7Mse2GN6mVekaT2-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="nhMEGUM_DJ7VpblrVjl8-1" target="5sUKM7Mse2GN6mVekaT2-1"> + <mxCell id="5sUKM7Mse2GN6mVekaT2-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="nhMEGUM_DJ7VpblrVjl8-1" target="5sUKM7Mse2GN6mVekaT2-1" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="nhMEGUM_DJ7VpblrVjl8-1" value="Collision system update" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="nhMEGUM_DJ7VpblrVjl8-1" value="Collision system update" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="330" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="LWzpuTTIhLKTzSPn8ECG-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="LWzpuTTIhLKTzSPn8ECG-1" target="nhMEGUM_DJ7VpblrVjl8-1"> + <mxCell id="LWzpuTTIhLKTzSPn8ECG-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="LWzpuTTIhLKTzSPn8ECG-1" target="nhMEGUM_DJ7VpblrVjl8-1" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="LWzpuTTIhLKTzSPn8ECG-1" value="Physics system update" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="LWzpuTTIhLKTzSPn8ECG-1" value="Physics system update" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="250" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="5sUKM7Mse2GN6mVekaT2-1" value="Particle system update" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="5sUKM7Mse2GN6mVekaT2-1" value="Particle system update" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="410" width="120" height="60" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> <diagram name="Collision System" id="NynOn4n1ygjSTJj9r24j"> - <mxGraphModel dx="1912" dy="941" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <mxGraphModel dx="2390" dy="1398" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="tfh_r5f0YTCt_Ms5cAZi-0" /> <mxCell id="tfh_r5f0YTCt_Ms5cAZi-1" parent="tfh_r5f0YTCt_Ms5cAZi-0" /> @@ -1408,13 +1516,13 @@ <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="13u7WWwgXKPRbZUCi-AO-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="L53kKr8ZecnGV9-t9ryX-2" target="zlh13i542BLaWYQDc_TT-5"> + <mxCell id="13u7WWwgXKPRbZUCi-AO-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="L53kKr8ZecnGV9-t9ryX-2" target="zlh13i542BLaWYQDc_TT-5" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="L53kKr8ZecnGV9-t9ryX-2" value="CheckCollision&lt;Type&gt;" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="250" y="540" width="380" height="845" as="geometry" /> </mxCell> - <mxCell id="HlupWqPSFh472k8GUjuW-0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="tfh_r5f0YTCt_Ms5cAZi-16" target="L53kKr8ZecnGV9-t9ryX-14"> + <mxCell id="HlupWqPSFh472k8GUjuW-0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="tfh_r5f0YTCt_Ms5cAZi-16" target="L53kKr8ZecnGV9-t9ryX-14" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="tfh_r5f0YTCt_Ms5cAZi-16" value="" style="ellipse;fillColor=strokeColor;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> @@ -1489,186 +1597,597 @@ <mxCell id="L53kKr8ZecnGV9-t9ryX-14" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="400" y="390" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-8" value="No collision" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-5" target="zlh13i542BLaWYQDc_TT-7"> + <mxCell id="zlh13i542BLaWYQDc_TT-8" value="No collision" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-5" target="zlh13i542BLaWYQDc_TT-7" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-5" target="zlh13i542BLaWYQDc_TT-9"> + <mxCell id="zlh13i542BLaWYQDc_TT-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-5" target="zlh13i542BLaWYQDc_TT-9" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="580" y="1470" /> </Array> </mxGeometry> </mxCell> - <mxCell id="13u7WWwgXKPRbZUCi-AO-4" value="Static collision" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="zlh13i542BLaWYQDc_TT-10"> + <mxCell id="13u7WWwgXKPRbZUCi-AO-4" value="Static collision" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="zlh13i542BLaWYQDc_TT-10" vertex="1" connectable="0"> <mxGeometry x="0.6829" y="1" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-5" target="zlh13i542BLaWYQDc_TT-13"> + <mxCell id="zlh13i542BLaWYQDc_TT-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-5" target="zlh13i542BLaWYQDc_TT-13" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="740" y="1470" /> </Array> </mxGeometry> </mxCell> - <mxCell id="13u7WWwgXKPRbZUCi-AO-5" value="Normal collision" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="zlh13i542BLaWYQDc_TT-14"> + <mxCell id="13u7WWwgXKPRbZUCi-AO-5" value="Normal collision" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="zlh13i542BLaWYQDc_TT-14" vertex="1" connectable="0"> <mxGeometry x="0.8065" y="-1" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-5" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxCell id="zlh13i542BLaWYQDc_TT-5" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="400" y="1430" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="13u7WWwgXKPRbZUCi-AO-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-7" target="13u7WWwgXKPRbZUCi-AO-2"> + <mxCell id="13u7WWwgXKPRbZUCi-AO-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-7" target="13u7WWwgXKPRbZUCi-AO-2" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-7" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxCell id="zlh13i542BLaWYQDc_TT-7" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="400" y="1560" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-9" target="zlh13i542BLaWYQDc_TT-7"> + <mxCell id="zlh13i542BLaWYQDc_TT-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-9" target="zlh13i542BLaWYQDc_TT-7" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="580" y="1600" /> </Array> </mxGeometry> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-9" value="Static collision handle" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxCell id="zlh13i542BLaWYQDc_TT-9" value="Static collision handle" style="rounded=1;whiteSpace=wrap;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="520" y="1512.5" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-13" target="zlh13i542BLaWYQDc_TT-7"> + <mxCell id="zlh13i542BLaWYQDc_TT-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-13" target="zlh13i542BLaWYQDc_TT-7" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="740" y="1600" /> </Array> </mxGeometry> </mxCell> - <mxCell id="zlh13i542BLaWYQDc_TT-13" value="normal collision handle" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxCell id="zlh13i542BLaWYQDc_TT-13" value="normal collision handle" style="rounded=1;whiteSpace=wrap;html=1;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="680" y="1512.5" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="13u7WWwgXKPRbZUCi-AO-0" value="<div><div>The static collision handle and normal collision handle are event handled by the system or user scripts</div></div>" style="shape=note;size=20;whiteSpace=wrap;html=1;align=left;verticalAlign=top;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxCell id="13u7WWwgXKPRbZUCi-AO-0" value="<div><div>The static collision handle and normal collision handle are event handled by the system or user scripts</div></div>" style="shape=note;size=20;whiteSpace=wrap;html=1;align=left;verticalAlign=top;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="870" y="1512.5" width="300" height="35" as="geometry" /> </mxCell> - <mxCell id="13u7WWwgXKPRbZUCi-AO-1" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-13" target="13u7WWwgXKPRbZUCi-AO-0"> + <mxCell id="13u7WWwgXKPRbZUCi-AO-1" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="zlh13i542BLaWYQDc_TT-13" target="13u7WWwgXKPRbZUCi-AO-0" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="710" y="1710" as="sourcePoint" /> <mxPoint x="760" y="1660" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="13u7WWwgXKPRbZUCi-AO-2" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxCell id="13u7WWwgXKPRbZUCi-AO-2" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="425" y="1700" width="30" height="30" as="geometry" /> </mxCell> - <mxCell id="1OGYIXaVx8-P0VZHAua7-0" value="<div><div>This loop is optimised using a broad collision detection methode. The check collision has this but is does not change functionality of the system.</div></div>" style="shape=note;size=20;whiteSpace=wrap;html=1;align=left;verticalAlign=top;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxCell id="1OGYIXaVx8-P0VZHAua7-0" value="<div><div>This loop is optimised using a broad collision detection methode. The check collision has this but is does not change functionality of the system.</div></div>" style="shape=note;size=20;whiteSpace=wrap;html=1;align=left;verticalAlign=top;" parent="tfh_r5f0YTCt_Ms5cAZi-1" vertex="1"> <mxGeometry x="710" y="940" width="300" height="50" as="geometry" /> </mxCell> - <mxCell id="1OGYIXaVx8-P0VZHAua7-1" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" target="1OGYIXaVx8-P0VZHAua7-0" source="L53kKr8ZecnGV9-t9ryX-2"> + <mxCell id="1OGYIXaVx8-P0VZHAua7-1" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="L53kKr8ZecnGV9-t9ryX-2" target="1OGYIXaVx8-P0VZHAua7-0" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="640" y="945" as="sourcePoint" /> <mxPoint x="600" y="1065" as="targetPoint" /> </mxGeometry> </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-0" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="1640" y="570" width="870" height="440" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-1" value="CollisionSystem" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=25;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="1330" y="825.5" width="240" height="113" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-2" value="- CollisionSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-1"> + <mxGeometry y="25" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-3" value="- ~ CollisionSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-1"> + <mxGeometry y="47" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-4" value="+ void update() override" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-1"> + <mxGeometry y="69" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-5" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-1"> + <mxGeometry y="95" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-6" value="<<interface>>
<<singleton>>
System" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=50;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="1380" y="570" width="240" height="162" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-7" value="+ static System & get_instance();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-6"> + <mxGeometry y="50" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-8" value="+ virtual void update() = 0;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-6"> + <mxGeometry y="76" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-9" value="# System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-6"> + <mxGeometry y="102" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-10" value="# virtual ~System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-6"> + <mxGeometry y="128" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-11" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-6"> + <mxGeometry y="154" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-12" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="JKQ8sKxxYfHBEtfav4C5-1" target="JKQ8sKxxYfHBEtfav4C5-6"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1150" y="770" as="sourcePoint" /> + <mxPoint x="1310" y="770" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-13" value="Component" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="1775" y="589.5" width="110" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-14" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-13"> + <mxGeometry y="20" width="110" height="8" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-15" value="ComponentManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="1210" y="570" width="150" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-16" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-15"> + <mxGeometry y="20" width="150" height="8" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-17" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="JKQ8sKxxYfHBEtfav4C5-1" target="JKQ8sKxxYfHBEtfav4C5-15"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1290" y="867.5" as="sourcePoint" /> + <mxPoint x="1670" y="852" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1285" y="878.5" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-18" value="Transform" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="1930" y="689.5" width="160" height="102" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-19" value="+position : Point" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-18"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-20" value="+rotation : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-18"> + <mxGeometry y="43" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-21" value="+scale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-18"> + <mxGeometry y="60" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-22" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-18"> + <mxGeometry y="77" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-23" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-18"> + <mxGeometry y="85" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-24" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="JKQ8sKxxYfHBEtfav4C5-26" target="JKQ8sKxxYfHBEtfav4C5-13"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1645" y="538.5" as="sourcePoint" /> + <mxPoint x="1515" y="528.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-25" value="" style="endArrow=block;endSize=16;endFill=0;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="JKQ8sKxxYfHBEtfav4C5-18" target="JKQ8sKxxYfHBEtfav4C5-13"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1655" y="548.5" as="sourcePoint" /> + <mxPoint x="1692" y="458.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-26" value="Rigidbody" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="1660" y="689.5" width="260" height="306" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-27" value="+mass : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="26" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-28" value="+gravity_scale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="43" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-29" value="+bodyType : body_type" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="60" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-30" value="+angular_damping : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="77" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-31" value="+angular_velocity : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="94" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-32" value="+collision_detection_mode : detection_mode" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="111" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-33" value="+constraints : physics_constraints" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="128" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-34" value="+detect_collisions : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="145" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-35" value="+included_collision_layers : Vector<int>" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="162" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-36" value="+linear_damping : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="179" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-37" value="+linear_Velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="196" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-38" value="+max_angular_velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="213" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-39" value="+max_linear_velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="230" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-40" value="+use_gravity : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="247" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="oEZkc7zm4_B_L93G9_NM-0" value="+bounce : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="264" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-41" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="281" width="260" height="8" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-42" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="JKQ8sKxxYfHBEtfav4C5-26"> + <mxGeometry y="289" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="JKQ8sKxxYfHBEtfav4C5-43" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="JKQ8sKxxYfHBEtfav4C5-1" target="JKQ8sKxxYfHBEtfav4C5-0"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1300" y="877.5" as="sourcePoint" /> + <mxPoint x="1205" y="818.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-0" value="Collider" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="2230" y="689" width="160" height="68" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-1" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-0"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-2" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-0"> + <mxGeometry y="43" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-3" value="+~Collider() : virtual" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-0"> + <mxGeometry y="51" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-4" value="CircleCollider" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="2140" y="795" width="160" height="85" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-5" value="+radius : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-4"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-6" value="+position : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-4"> + <mxGeometry y="43" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-7" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-4"> + <mxGeometry y="60" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-8" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-4"> + <mxGeometry y="68" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-9" value="BoxCollider" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="tfh_r5f0YTCt_Ms5cAZi-1"> + <mxGeometry x="2334" y="793" width="160" height="102" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-10" value="+width : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-9"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-11" value="+height : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-9"> + <mxGeometry y="43" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-12" value="+position : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-9"> + <mxGeometry y="60" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-13" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-9"> + <mxGeometry y="77" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-14" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="keZYvT56L1yoAh2DlZhy-9"> + <mxGeometry y="85" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-15" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" target="keZYvT56L1yoAh2DlZhy-0"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="2260" y="795" as="sourcePoint" /> + <mxPoint x="2260" y="757.0000000000002" as="targetPoint" /> + <Array as="points"> + <mxPoint x="2260" y="779" /> + <mxPoint x="2260" y="779" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-16" value="" style="endArrow=block;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;strokeWidth=1;endSize=14;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="keZYvT56L1yoAh2DlZhy-9" target="keZYvT56L1yoAh2DlZhy-0"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="2240" y="937" as="sourcePoint" /> + <mxPoint x="2367" y="849" as="targetPoint" /> + <Array as="points"> + <mxPoint x="2360" y="777" /> + <mxPoint x="2360" y="777" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="keZYvT56L1yoAh2DlZhy-17" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="tfh_r5f0YTCt_Ms5cAZi-1" source="keZYvT56L1yoAh2DlZhy-0" target="JKQ8sKxxYfHBEtfav4C5-13"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="2020" y="699" as="sourcePoint" /> + <mxPoint x="1840" y="639" as="targetPoint" /> + <Array as="points"> + <mxPoint x="2310" y="660" /> + <mxPoint x="1830" y="660" /> + </Array> + </mxGeometry> + </mxCell> </root> </mxGraphModel> </diagram> <diagram name="Physics System" id="NbgRLwdImGSmGWTAHdZd"> - <mxGraphModel dx="1434" dy="706" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <mxGraphModel dx="1687" dy="987" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="JB4RGL3kYZf54SDTDYf8-0" /> <mxCell id="JB4RGL3kYZf54SDTDYf8-1" parent="JB4RGL3kYZf54SDTDYf8-0" /> - <mxCell id="JB4RGL3kYZf54SDTDYf8-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="Y8EWepQ-n7Dwm9J7d-AM-0"> + <mxCell id="yUu4m_TsueM3Nqe13WbA-41" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxGeometry x="1140" y="51.5" width="455" height="428.5" as="geometry" /> + </mxCell> + <mxCell id="JB4RGL3kYZf54SDTDYf8-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" source="Y8EWepQ-n7Dwm9J7d-AM-0" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="440" y="220" as="sourcePoint" /> <mxPoint x="440" y="280" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="JB4RGL3kYZf54SDTDYf8-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="JB4RGL3kYZf54SDTDYf8-10" target="Y8EWepQ-n7Dwm9J7d-AM-0"> + <mxCell id="JB4RGL3kYZf54SDTDYf8-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" source="JB4RGL3kYZf54SDTDYf8-10" target="Y8EWepQ-n7Dwm9J7d-AM-0" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="440" y="140" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="JB4RGL3kYZf54SDTDYf8-10" value="" style="ellipse;fillColor=strokeColor;html=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxCell id="JB4RGL3kYZf54SDTDYf8-10" value="" style="ellipse;fillColor=strokeColor;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" vertex="1"> <mxGeometry x="425" y="30" width="30" height="30" as="geometry" /> </mxCell> - <mxCell id="PVg3gXopDeQnv1w6AJC1-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="JB4RGL3kYZf54SDTDYf8-46" target="PVg3gXopDeQnv1w6AJC1-0"> + <mxCell id="PVg3gXopDeQnv1w6AJC1-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" source="JB4RGL3kYZf54SDTDYf8-46" target="PVg3gXopDeQnv1w6AJC1-0" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="JB4RGL3kYZf54SDTDYf8-46" value="Update velocities" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxCell id="JB4RGL3kYZf54SDTDYf8-46" value="Update velocities" style="rounded=1;whiteSpace=wrap;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" vertex="1"> <mxGeometry x="380" y="280" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="PVg3gXopDeQnv1w6AJC1-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="PVg3gXopDeQnv1w6AJC1-0" target="PVg3gXopDeQnv1w6AJC1-2"> + <mxCell id="PVg3gXopDeQnv1w6AJC1-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" source="PVg3gXopDeQnv1w6AJC1-0" target="PVg3gXopDeQnv1w6AJC1-2" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="PVg3gXopDeQnv1w6AJC1-0" value="Move objects" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxCell id="PVg3gXopDeQnv1w6AJC1-0" value="Move objects" style="rounded=1;whiteSpace=wrap;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" vertex="1"> <mxGeometry x="380" y="400" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="PVg3gXopDeQnv1w6AJC1-2" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxCell id="PVg3gXopDeQnv1w6AJC1-2" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" parent="JB4RGL3kYZf54SDTDYf8-1" vertex="1"> <mxGeometry x="425" y="550" width="30" height="30" as="geometry" /> </mxCell> - <mxCell id="Y8EWepQ-n7Dwm9J7d-AM-0" value="Get rigidbodies" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxCell id="Y8EWepQ-n7Dwm9J7d-AM-0" value="Get rigidbodies" style="rounded=1;whiteSpace=wrap;html=1;" parent="JB4RGL3kYZf54SDTDYf8-1" vertex="1"> <mxGeometry x="380" y="150" width="120" height="60" as="geometry" /> </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-2" value="PhysicsSystem" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=25;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxGeometry x="830" y="307" width="240" height="113" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-3" value="- PhysicsSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-2"> + <mxGeometry y="25" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-4" value="- ~ PhysicsSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-2"> + <mxGeometry y="47" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-10" value="+ void update() override" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-2"> + <mxGeometry y="69" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-11" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-2"> + <mxGeometry y="95" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-12" value="<<interface>>
<<singleton>>
System" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=50;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxGeometry x="880" y="51.5" width="240" height="162" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-13" value="+ static System & get_instance();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-12"> + <mxGeometry y="50" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-14" value="+ virtual void update() = 0;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-12"> + <mxGeometry y="76" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-15" value="# System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-12"> + <mxGeometry y="102" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-16" value="# virtual ~System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-12"> + <mxGeometry y="128" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-17" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-12"> + <mxGeometry y="154" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-18" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="yUu4m_TsueM3Nqe13WbA-2" target="yUu4m_TsueM3Nqe13WbA-12"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="650" y="251.5" as="sourcePoint" /> + <mxPoint x="810" y="251.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-21" value="Component" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxGeometry x="1275" y="71" width="110" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-22" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-21"> + <mxGeometry y="20" width="110" height="8" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-23" value="ComponentManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxGeometry x="710" y="51.5" width="150" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-24" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-23"> + <mxGeometry y="20" width="150" height="8" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-25" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="yUu4m_TsueM3Nqe13WbA-2" target="yUu4m_TsueM3Nqe13WbA-23"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="790" y="349" as="sourcePoint" /> + <mxPoint x="1170" y="333.5" as="targetPoint" /> + <Array as="points"> + <mxPoint x="785" y="360" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-26" value="Transform" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxGeometry x="1430" y="171" width="160" height="102" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-27" value="+position : Point" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-26"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-28" value="+rotation : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-26"> + <mxGeometry y="43" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-29" value="+scale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-26"> + <mxGeometry y="60" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-30" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-26"> + <mxGeometry y="77" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-31" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="yUu4m_TsueM3Nqe13WbA-26"> + <mxGeometry y="85" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-40" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="Llsy49ynzETT-SpJj8KL-0" target="yUu4m_TsueM3Nqe13WbA-21"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1145" y="20" as="sourcePoint" /> + <mxPoint x="1015" y="10" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="yUu4m_TsueM3Nqe13WbA-42" value="" style="endArrow=block;endSize=16;endFill=0;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="yUu4m_TsueM3Nqe13WbA-26" target="yUu4m_TsueM3Nqe13WbA-21"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1155" y="30" as="sourcePoint" /> + <mxPoint x="1192" y="-60" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-0" value="Rigidbody" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="JB4RGL3kYZf54SDTDYf8-1"> + <mxGeometry x="1160" y="171" width="260" height="306" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-1" value="+mass : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="26" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-2" value="+gravity_scale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="43" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-3" value="+bodyType : body_type" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="60" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-4" value="+angular_damping : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="77" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-5" value="+angular_velocity : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="94" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-6" value="+collision_detection_mode : detection_mode" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="111" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-7" value="+constraints : physics_constraints" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="128" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-8" value="+detect_collisions : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="145" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-9" value="+included_collision_layers : Vector<int>" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="162" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-10" value="+linear_damping : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="179" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-11" value="+linear_Velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="196" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-12" value="+max_angular_velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="213" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-13" value="+max_linear_velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="230" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-14" value="+use_gravity : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="247" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="c-3Da4kUMWHPkyMXZbAO-0" value="+bounce : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000ff;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="264" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-15" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="281" width="260" height="8" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-16" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="Llsy49ynzETT-SpJj8KL-0"> + <mxGeometry y="289" width="260" height="17" as="geometry" /> + </mxCell> + <mxCell id="Llsy49ynzETT-SpJj8KL-18" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="JB4RGL3kYZf54SDTDYf8-1" source="yUu4m_TsueM3Nqe13WbA-2" target="yUu4m_TsueM3Nqe13WbA-41"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="800" y="359" as="sourcePoint" /> + <mxPoint x="705" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> </root> </mxGraphModel> </diagram> <diagram name="Particle System" id="lkCcBGn-XxemYJ_BanXI"> - <mxGraphModel dx="1434" dy="706" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <mxGraphModel dx="1434" dy="839" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="27hjxvRdXP5eaZgrt3Il-0" /> <mxCell id="27hjxvRdXP5eaZgrt3Il-1" parent="27hjxvRdXP5eaZgrt3Il-0" /> - <mxCell id="27hjxvRdXP5eaZgrt3Il-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="w_soAwOsWvxdXFNHcZJS-0" target="BX6RDOaBGkcvAdUTXRfd-0"> + <mxCell id="27hjxvRdXP5eaZgrt3Il-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" source="w_soAwOsWvxdXFNHcZJS-0" target="BX6RDOaBGkcvAdUTXRfd-0" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="440" y="220" as="sourcePoint" /> <mxPoint x="440" y="240" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="27hjxvRdXP5eaZgrt3Il-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="27hjxvRdXP5eaZgrt3Il-7" target="w_soAwOsWvxdXFNHcZJS-0"> + <mxCell id="27hjxvRdXP5eaZgrt3Il-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" source="27hjxvRdXP5eaZgrt3Il-7" target="w_soAwOsWvxdXFNHcZJS-0" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="440" y="140" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="27hjxvRdXP5eaZgrt3Il-7" value="" style="ellipse;fillColor=strokeColor;html=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="27hjxvRdXP5eaZgrt3Il-7" value="" style="ellipse;fillColor=strokeColor;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="425" y="30" width="30" height="30" as="geometry" /> </mxCell> - <mxCell id="27hjxvRdXP5eaZgrt3Il-10" value="All particles updated" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-3" target="27hjxvRdXP5eaZgrt3Il-12"> + <mxCell id="27hjxvRdXP5eaZgrt3Il-10" value="All particles updated" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-3" target="27hjxvRdXP5eaZgrt3Il-12" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="440" y="830" as="sourcePoint" /> </mxGeometry> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="27hjxvRdXP5eaZgrt3Il-11" target="BX6RDOaBGkcvAdUTXRfd-1"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" source="27hjxvRdXP5eaZgrt3Il-11" target="BX6RDOaBGkcvAdUTXRfd-1" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="27hjxvRdXP5eaZgrt3Il-11" value="reset particles" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="27hjxvRdXP5eaZgrt3Il-11" value="reset particles" style="rounded=1;whiteSpace=wrap;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="380" y="380" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="27hjxvRdXP5eaZgrt3Il-12" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="27hjxvRdXP5eaZgrt3Il-12" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="425" y="800" width="30" height="30" as="geometry" /> </mxCell> - <mxCell id="w_soAwOsWvxdXFNHcZJS-0" value="Get ParticleEmitters" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="w_soAwOsWvxdXFNHcZJS-0" value="Get ParticleEmitters" style="rounded=1;whiteSpace=wrap;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="380" y="150" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="Lwh_rbNl-4H-VlUMvsNu-4" value="Depends on configurations<br>(emission rate)" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-0" target="27hjxvRdXP5eaZgrt3Il-11"> + <mxCell id="Lwh_rbNl-4H-VlUMvsNu-4" value="Depends on configurations<br>(emission rate)" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-0" target="27hjxvRdXP5eaZgrt3Il-11" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="440" y="340" as="sourcePoint" /> </mxGeometry> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-0" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-0" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="400" y="250" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-1" target="BX6RDOaBGkcvAdUTXRfd-2"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-1" target="BX6RDOaBGkcvAdUTXRfd-2" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-1" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-1" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="400" y="470" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-2" target="BX6RDOaBGkcvAdUTXRfd-3"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-2" target="BX6RDOaBGkcvAdUTXRfd-3" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-2" value="Update Particles" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-2" value="Update Particles" style="rounded=1;whiteSpace=wrap;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="380" y="570" width="120" height="60" as="geometry" /> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-3" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-3" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="27hjxvRdXP5eaZgrt3Il-1" vertex="1"> <mxGeometry x="400" y="660" width="80" height="80" as="geometry" /> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-7" value="For all particle emitters loop" style="endArrow=classic;html=1;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-3" target="BX6RDOaBGkcvAdUTXRfd-0"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-7" value="For all particle emitters loop" style="endArrow=classic;html=1;rounded=0;edgeStyle=orthogonalEdgeStyle;" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-3" target="BX6RDOaBGkcvAdUTXRfd-0" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="560" y="680" as="sourcePoint" /> <mxPoint x="610" y="630" as="targetPoint" /> @@ -1678,7 +2197,7 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="BX6RDOaBGkcvAdUTXRfd-8" value="Not enough time has passed or<br>No particles available" style="endArrow=classic;html=1;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-0" target="BX6RDOaBGkcvAdUTXRfd-1"> + <mxCell id="BX6RDOaBGkcvAdUTXRfd-8" value="Not enough time has passed or<br>No particles available" style="endArrow=classic;html=1;rounded=0;edgeStyle=orthogonalEdgeStyle;" parent="27hjxvRdXP5eaZgrt3Il-1" source="BX6RDOaBGkcvAdUTXRfd-0" target="BX6RDOaBGkcvAdUTXRfd-1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="600" y="320" as="sourcePoint" /> <mxPoint x="650" y="270" as="targetPoint" /> @@ -1688,6 +2207,196 @@ </Array> </mxGeometry> </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-0" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="1200" y="260" width="600" height="420" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-1" value="ParticleSystem" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=25;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="890" y="515.5" width="240" height="113" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-2" value="- ParticleSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-1"> + <mxGeometry y="25" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-3" value="- ~ ParticleSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-1"> + <mxGeometry y="47" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-4" value="+ void update() override" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-1"> + <mxGeometry y="69" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-5" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-1"> + <mxGeometry y="95" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-6" value="<<interface>>
<<singleton>>
System" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=50;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="940" y="260" width="240" height="162" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-7" value="+ static System & get_instance();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-6"> + <mxGeometry y="50" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-8" value="+ virtual void update() = 0;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-6"> + <mxGeometry y="76" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-9" value="# System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-6"> + <mxGeometry y="102" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-10" value="# virtual ~System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-6"> + <mxGeometry y="128" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-11" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-6"> + <mxGeometry y="154" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-12" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="UQQm6BEokvIzjlSEPK60-1" target="UQQm6BEokvIzjlSEPK60-6"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="710" y="460" as="sourcePoint" /> + <mxPoint x="870" y="460" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-13" value="Component" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="1335" y="279.5" width="110" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-14" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-13"> + <mxGeometry y="20" width="110" height="8" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-15" value="ComponentManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="770" y="260" width="150" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-16" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-15"> + <mxGeometry y="20" width="150" height="8" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-17" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="UQQm6BEokvIzjlSEPK60-1" target="UQQm6BEokvIzjlSEPK60-15"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="850" y="557.5" as="sourcePoint" /> + <mxPoint x="1230" y="542" as="targetPoint" /> + <Array as="points"> + <mxPoint x="845" y="568.5" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-18" value="Transform" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="1500" y="279.5" width="160" height="102" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-19" value="+position : Point" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-18"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-20" value="+rotation : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-18"> + <mxGeometry y="43" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-21" value="+scale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-18"> + <mxGeometry y="60" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-22" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-18"> + <mxGeometry y="77" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-23" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="UQQm6BEokvIzjlSEPK60-18"> + <mxGeometry y="85" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-24" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="G4_9p8ovoKmUSQQdq9h0-0" target="UQQm6BEokvIzjlSEPK60-13"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1350" y="379.5" as="sourcePoint" /> + <mxPoint x="1075" y="218.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="UQQm6BEokvIzjlSEPK60-43" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="UQQm6BEokvIzjlSEPK60-1" target="UQQm6BEokvIzjlSEPK60-0"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="860" y="567.5" as="sourcePoint" /> + <mxPoint x="765" y="508.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-0" value="ParticleEmitter" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;strokeColor=#0000FF;fontColor=#0000FF;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="1260" y="380" width="170" height="221" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-1" value="+position : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="26" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-2" value="+max_particles : uint32_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="43" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-3" value="+emission_rate : uint32_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="60" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-4" value="+min_speed : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="77" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-5" value="+max_speed : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="94" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-6" value="+min_angle : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="111" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-7" value="+max_angle : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="128" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-8" value="+end_lifespan : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="145" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-9" value="+force_overtime : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="162" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-10" value="+boundary : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="179" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-11" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;fontColor=#0000FF;strokeColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="196" width="170" height="8" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-12" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#000000;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-0"> + <mxGeometry y="204" width="170" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-13" value="Particle" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;strokeColor=#0000FF;fontColor=#0000FF;" vertex="1" parent="27hjxvRdXP5eaZgrt3Il-1"> + <mxGeometry x="1470" y="414" width="320" height="153" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-14" value="+position : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="26" width="320" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-15" value="+velocity : Vector2" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="43" width="320" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-16" value="+end_lifespan : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="60" width="320" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-17" value="+active : bool" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="77" width="320" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-18" value="+lifespan : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="94" width="320" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-19" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;fontColor=#0000FF;strokeColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="111" width="320" height="8" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-20" value="+reset(lifespan, position, velocity, forceOverTime) : void" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="119" width="320" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-21" value="+update(deltaTime) : void" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry y="136" width="320" height="17" as="geometry" /> + </mxCell> + <mxCell id="G4_9p8ovoKmUSQQdq9h0-23" value="" style="endArrow=block;endSize=16;endFill=0;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="UQQm6BEokvIzjlSEPK60-18" target="UQQm6BEokvIzjlSEPK60-13"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1355" y="390" as="sourcePoint" /> + <mxPoint x="1400" y="330" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="F0ezQ47R6UzBw36VbnJT-0" value="" style="endArrow=open;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;endFill=0;endSize=8;fontColor=#0000ff;labelBackgroundColor=#0000ff;strokeColor=#0000FF;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="27hjxvRdXP5eaZgrt3Il-1" source="G4_9p8ovoKmUSQQdq9h0-0" target="G4_9p8ovoKmUSQQdq9h0-13"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="2040" y="550" as="sourcePoint" /> + <mxPoint x="2040" y="448" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="F0ezQ47R6UzBw36VbnJT-1" value="0..*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#000000;" connectable="0" vertex="1" parent="F0ezQ47R6UzBw36VbnJT-0"> + <mxGeometry x="0.6214" y="-1" relative="1" as="geometry"> + <mxPoint x="-17" y="8" as="offset" /> + </mxGeometry> + </mxCell> </root> </mxGraphModel> </diagram> @@ -2477,408 +3186,1890 @@ </mxGraphModel> </diagram> <diagram id="HwAwsUWtoMPbd-VC63Ug" name="Rendering/AssetManager"> - <mxGraphModel dx="3068" dy="1938" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <mxGraphModel dx="4740" dy="2962" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-1" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;fillColor=none;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-1" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="-1670" y="-610" width="2470" height="560" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-2" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;fillColor=none;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-2" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="-1673" y="-37" width="2470" height="1160" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-3" value="Texture" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-3" value="Texture" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-1250" y="234.32" width="240" height="164" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-4" value="+ Texture(path, reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-3"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-4" value="+ Texture(path, reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-3" vertex="1"> <mxGeometry y="26" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-5" value="+ Texture(unique_ptr<Resource>, reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-3"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-5" value="+ Texture(unique_ptr<Asset>, reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-3" vertex="1"> <mxGeometry y="52" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-6" value="~Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-3"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-6" value="~Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-3" vertex="1"> <mxGeometry y="78" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-7" value="- 	void load(std::unique_ptr<api::Resource> res);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-3"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-7" value="- 	void load(std::unique_ptr<Asset> res);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-3" vertex="1"> <mxGeometry y="104" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-8" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-3"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-8" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-3" vertex="1"> <mxGeometry y="130" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-9" value="- SDL_texture unique_ptr" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-3"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-9" value="- SDL_texture shared_ptr" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-3" vertex="1"> <mxGeometry y="138" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-10" value="<<singleton>>
AssetManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=38;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-10" value="<<singleton>>
AssetManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=38;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-1620" y="-440" width="380" height="247" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-11" value="- static AssetManager & get_instance();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-11" value="- static AssetManager & get_instance();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="38" width="380" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-12" value="- AssetManager();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-12" value="- AssetManager();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="64" width="380" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-13" value="- virtual ~AssetManager()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-13" value="- virtual ~AssetManager()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="90" width="380" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-14" value="template <typename resource>
std::shared_ptr<resource> cache(path, bool reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-14" value="template <typename resource>
std::shared_ptr<resource> cache(path, bool reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="116" width="380" height="35" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-15" value="- virtual ~AssetManager()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-15" value="- virtual ~AssetManager()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="151" width="380" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-16" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-16" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="177" width="380" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-17" value="template <typename resource>
- map<path, shared_ptr<resource>> cache" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-17" value="template <typename resource>
- map<path, shared_ptr<resource>> cache" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="185" width="380" height="35" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-18" value="- friend class Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-18" value="- friend class Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-10" vertex="1"> <mxGeometry y="220" width="380" height="27" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-19" value="Sprite" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-19" value="Sprite" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-534.06" y="220" width="240" height="190" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-20" value="+ 	Sprite(crepe::Texture& image, const Color& color, const flip_settings& flip ) : sprite_image(&image), color(color), flip(flip){}
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-20" value="+ 	Sprite(crepe::Texture& image, const Color& color, const flip_settings& flip ) : sprite_image(&image), color(color), flip(flip){}
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-19" vertex="1"> <mxGeometry y="26" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-21" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-21" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-19" vertex="1"> <mxGeometry y="52" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-22" value="shared_ptr<Texture> image" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-22" value="shared_ptr<Texture> image" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-19" vertex="1"> <mxGeometry y="60" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-23" value="+ Color color" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-23" value="+ Color color" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-19" vertex="1"> <mxGeometry y="86" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-24" value="+ flip_settings flip" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-24" value="+ flip_settings flip" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-19" vertex="1"> <mxGeometry y="112" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-25" value="+ uint8_t sortingLayer" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-25" value="+ uint8_t sortingLayer" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-19" vertex="1"> <mxGeometry y="138" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-26" value="+ uint8_t orderInLayer" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-26" value="+ uint8_t orderInLayer" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-19" vertex="1"> <mxGeometry y="164" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-27" value="<<singleton>>
SdlContext" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=37;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-27" value="<<singleton>>
SdlContext" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=37;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-1160" y="-440" width="450" height="361" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-28" value="- SdlContext();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-28" value="- SdlContext();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="37" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-29" value="virtual ~SdlContext();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-29" value="virtual ~SdlContext();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="63" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-30" value="- static SdlContext & get_instance();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-30" value="- static SdlContext & get_instance();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="89" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-31" value="- void draw(const api::Sprite&, const api::Transform&);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-31" value="- void draw(const api::Sprite&, const api::Transform&);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="115" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-32" value="- void presentScreen();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-32" value="- void presentScreen();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="141" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-33" value="- void clearScreen();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-33" value="- void clearScreen();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="167" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-34" value="- void draw(const api::Sprite&, const api::Transform&);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-34" value="- void draw(const api::Sprite&, const api::Transform&);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="193" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-35" value="- SDL_Texture* setTextureFromPath(const char*);" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-35" value="- SDL_Texture* setTextureFromPath(const char*);" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="219" width="450" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-36" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-36" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="245" width="450" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-37" value="- friend class Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-37" value="- friend class Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="253" width="450" height="27" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-38" value="- friend class RenderSystem" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-38" value="- friend class RenderSystem" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="280" width="450" height="27" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-39" value="- SDL_Window* window" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-39" value="- SDL_Window* window" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="307" width="450" height="27" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-40" value="- SDL_Renderer* renderer" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-40" value="- SDL_Renderer* renderer" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-27" vertex="1"> <mxGeometry y="334" width="450" height="27" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-41" value="RenderSystem" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=25;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-41" value="RenderSystem" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=25;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-520" y="-324.5" width="240" height="130" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-42" value="- RenderSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-41"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-42" value="- RenderSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-41" vertex="1"> <mxGeometry y="25" width="240" height="22" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-43" value="- ~ RenderSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-41"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-43" value="- ~ RenderSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-41" vertex="1"> <mxGeometry y="47" width="240" height="22" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-44" value="- void SortLayers()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-41"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-44" value="- void SortLayers()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-41" vertex="1"> <mxGeometry y="69" width="240" height="22" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-45" value="+ void update() override" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-41"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-45" value="+ void update() override" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-41" vertex="1"> <mxGeometry y="91" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-46" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-41"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-46" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-41" vertex="1"> <mxGeometry y="117" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-47" value="<<interface>>
<<singleton>>
System" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=50;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-47" value="<<interface>>
<<singleton>>
System" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=50;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-520" y="-580" width="240" height="162" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-48" value="+ static System & get_instance();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-47"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-48" value="+ static System & get_instance();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-47" vertex="1"> <mxGeometry y="50" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-49" value="+ virtual void update() = 0;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-47"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-49" value="+ virtual void update() = 0;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-47" vertex="1"> <mxGeometry y="76" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-50" value="# System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-47"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-50" value="# System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-47" vertex="1"> <mxGeometry y="102" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-51" value="# virtual ~System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-47"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-51" value="# virtual ~System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-47" vertex="1"> <mxGeometry y="128" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-52" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-47"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-52" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-47" vertex="1"> <mxGeometry y="154" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-53" value="Color" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-53" value="Color" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-610" y="480" width="400" height="580" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-54" value="+ Color(double red, double green, double blue, double alpha);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-54" value="+ Color(double red, double green, double blue, double alpha);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="26" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-55" value=" + static const Color & get_white();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-55" value=" + static const Color & get_white();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="52" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-56" value=" + static const Color & get_red();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-56" value=" + static const Color & get_red();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="78" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-57" value=" + static const Color & get_green();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-57" value=" + static const Color & get_green();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="104" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-58" value=" + static const Color & get_blue();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-58" value=" + static const Color & get_blue();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="130" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-59" value=" + static const Color & get_cyan();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-59" value=" + static const Color & get_cyan();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="156" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-60" value=" + static const Color & get_magenta();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-60" value=" + static const Color & get_magenta();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="182" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-61" value=" + static const Color & get_yellow();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-61" value=" + static const Color & get_yellow();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="208" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-62" value=" + static const Color & get_black();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-62" value=" + static const Color & get_black();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="234" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-63" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-63" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="260" width="400" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-64" value="- double r" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-64" value="- double r" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="268" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-65" value="- double g" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-65" value="- double g" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="294" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-66" value="- double b" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-66" value="- double b" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="320" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-67" value="- double a" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-67" value="- double a" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="346" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-68" value="- static Color white" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-68" value="- static Color white" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="372" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-69" value="- static Color red" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-69" value="- static Color red" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="398" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-70" value="- static Color green" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-70" value="- static Color green" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="424" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-71" value="- static Color blue" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-71" value="- static Color blue" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="450" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-72" value="- static Color cyan" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-72" value="- static Color cyan" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="476" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-73" value="- static Color magenta" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-73" value="- static Color magenta" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="502" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-74" value="- static Color yellow" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-74" value="- static Color yellow" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="528" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-75" value="- static Color black" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-53"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-75" value="- static Color black" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-53" vertex="1"> <mxGeometry y="554" width="400" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-76" value="Point" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-76" value="Point" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="139.9999999999999" y="154" width="240" height="90.71" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-77" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-76"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-77" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-76" vertex="1"> <mxGeometry y="26" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-78" value="+ double x" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-76"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-78" value="+ double x" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-76" vertex="1"> <mxGeometry y="34" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-79" value="+ double y" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-76"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-79" value="+ double y" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-76" vertex="1"> <mxGeometry y="60" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-80" value="Component" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-80" value="Component" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-534.06" width="240" height="90" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-81" value="+active: Boolean" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-80"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-81" value="+active: Boolean" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-80" vertex="1"> <mxGeometry y="26" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-82" value="+ gameId" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-80"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-82" value="+ gameId" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-80" vertex="1"> <mxGeometry y="52" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-83" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-80"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-83" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-80" vertex="1"> <mxGeometry y="78" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-84" value="Transform" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-84" value="Transform" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-220" y="140.64" width="240" height="112" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-85" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-84"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-85" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-84" vertex="1"> <mxGeometry y="26" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-86" value="+ Point position; // Translation (shift)

" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-84"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-86" value="+ Point position; // Translation (shift)

" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-84" vertex="1"> <mxGeometry y="34" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-87" value="+ double rotation; // Rotation, in radians
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-84"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-87" value="+ double rotation; // Rotation, in radians
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-84" vertex="1"> <mxGeometry y="60" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-88" value="+ double scale; // Multiplication factoh
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-84"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-88" value="+ double scale; // Multiplication factoh
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-84" vertex="1"> <mxGeometry y="86" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-89" value="Resource" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-89" value="Asset" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-1600" y="234.32" width="240" height="164" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-90" value="+ Resource(const std::string & src);" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-89"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-90" value="+ Asset(const std::string & src);" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-89" vertex="1"> <mxGeometry y="26" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-91" value="+ const std::istream & read();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-89"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-91" value="+ const std::istream & read();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-89" vertex="1"> <mxGeometry y="52" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-92" value="+ const char * canonical()
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-89"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-92" value="+ const char * canonical()
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" parent="HgKoQxlyUx1tn9zsXLrm-89" vertex="1"> <mxGeometry y="78" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-93" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-89"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-93" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-89" vertex="1"> <mxGeometry y="104" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-94" value="- 	std::string src;" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-89"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-94" value="- 	std::string src;" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-89" vertex="1"> <mxGeometry y="112" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-95" value="- 	std::ifstream file;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-89"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-95" value="- 	std::ifstream file;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-89" vertex="1"> <mxGeometry y="138" width="240" height="26" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-96" value="TODO:Animator" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-96" value="TODO:Animator" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="1" vertex="1"> <mxGeometry x="-940" y="234.32" width="240" height="49.36" as="geometry"> <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-97" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="HgKoQxlyUx1tn9zsXLrm-96"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-97" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="HgKoQxlyUx1tn9zsXLrm-96" vertex="1"> <mxGeometry y="26" width="240" height="8" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-98" value="" style="endArrow=block;endSize=16;endFill=0;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-96" target="HgKoQxlyUx1tn9zsXLrm-80"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-98" value="" style="endArrow=block;endSize=16;endFill=0;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-96" target="HgKoQxlyUx1tn9zsXLrm-80" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-740" y="440" as="sourcePoint" /> <mxPoint x="-570" y="439.99999999999994" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-99" value="" style="endArrow=block;endSize=16;endFill=0;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-84" target="HgKoQxlyUx1tn9zsXLrm-80"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-99" value="" style="endArrow=block;endSize=16;endFill=0;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-84" target="HgKoQxlyUx1tn9zsXLrm-80" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-720" y="450" as="sourcePoint" /> <mxPoint x="-560" y="450" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-100" value="" style="endArrow=block;endSize=16;endFill=0;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-19" target="HgKoQxlyUx1tn9zsXLrm-80"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-100" value="" style="endArrow=block;endSize=16;endFill=0;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-19" target="HgKoQxlyUx1tn9zsXLrm-80" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-710" y="460" as="sourcePoint" /> <mxPoint x="-550" y="460" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-101" value="" style="endArrow=diamondThin;endFill=1;endSize=24;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-53" target="HgKoQxlyUx1tn9zsXLrm-19"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-101" value="" style="endArrow=diamondThin;endFill=1;endSize=24;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-53" target="HgKoQxlyUx1tn9zsXLrm-19" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-827" y="550" as="sourcePoint" /> <mxPoint x="-667" y="550" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-102" value="" style="endArrow=diamondThin;endFill=1;endSize=24;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-76" target="HgKoQxlyUx1tn9zsXLrm-84"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-102" value="" style="endArrow=diamondThin;endFill=1;endSize=24;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-76" target="HgKoQxlyUx1tn9zsXLrm-84" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="110.62230769230791" y="360" as="sourcePoint" /> <mxPoint x="109.99769230769243" y="290" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-103" value="" style="endArrow=open;endFill=1;endSize=12;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-96" target="HgKoQxlyUx1tn9zsXLrm-20"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-103" value="" style="endArrow=open;endFill=1;endSize=12;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-96" target="HgKoQxlyUx1tn9zsXLrm-20" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-770" y="340" as="sourcePoint" /> <mxPoint x="-540" y="290" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-104" value="1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffffff;" vertex="1" connectable="0" parent="HgKoQxlyUx1tn9zsXLrm-103"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-104" value="1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffffff;" parent="HgKoQxlyUx1tn9zsXLrm-103" vertex="1" connectable="0"> <mxGeometry x="0.3336" y="-3" relative="1" as="geometry"> <mxPoint x="29.44" y="-12" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-105" value="0..1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffffff;" vertex="1" connectable="0" parent="HgKoQxlyUx1tn9zsXLrm-103"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-105" value="0..1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffffff;" parent="HgKoQxlyUx1tn9zsXLrm-103" vertex="1" connectable="0"> <mxGeometry x="-0.8674" y="1" relative="1" as="geometry"> <mxPoint y="-8" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-106" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-3" target="HgKoQxlyUx1tn9zsXLrm-89"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-106" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-3" target="HgKoQxlyUx1tn9zsXLrm-89" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-1600" y="1080" as="sourcePoint" /> <mxPoint x="-1440" y="1080" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-107" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-3" target="HgKoQxlyUx1tn9zsXLrm-10"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-107" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-3" target="HgKoQxlyUx1tn9zsXLrm-10" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-1240" y="326.32000000000016" as="sourcePoint" /> <mxPoint x="-1350" y="326.32000000000016" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-108" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-3" target="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-108" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-3" target="HgKoQxlyUx1tn9zsXLrm-27" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-1162.1648026738653" y="244.32000000000016" as="sourcePoint" /> <mxPoint x="-1371.0965419719755" y="-162" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-109" value="Extends" style="endArrow=block;endSize=16;endFill=0;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-41" target="HgKoQxlyUx1tn9zsXLrm-47"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-109" value="Extends" style="endArrow=block;endSize=16;endFill=0;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-41" target="HgKoQxlyUx1tn9zsXLrm-47" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-660" y="-320" as="sourcePoint" /> <mxPoint x="-500" y="-320" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-110" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" edge="1" parent="1" source="HgKoQxlyUx1tn9zsXLrm-41" target="HgKoQxlyUx1tn9zsXLrm-27"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-110" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" parent="1" source="HgKoQxlyUx1tn9zsXLrm-41" target="HgKoQxlyUx1tn9zsXLrm-27" edge="1"> <mxGeometry width="160" relative="1" as="geometry"> <mxPoint x="-1092.867033190796" y="244.32000000000016" as="sourcePoint" /> <mxPoint x="-980.2586031358178" y="-96" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-111" value="<b><font style="font-size: 50px">API</font></b>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-111" value="<b><font style="font-size: 50px">API</font></b>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;" parent="1" vertex="1"> <mxGeometry x="684" y="11" width="93" height="31" as="geometry" /> </mxCell> - <mxCell id="HgKoQxlyUx1tn9zsXLrm-112" value="<b><font style="font-size: 50px">Engine</font></b>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;" vertex="1" parent="1"> + <mxCell id="HgKoQxlyUx1tn9zsXLrm-112" value="<b><font style="font-size: 50px">Engine</font></b>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;" parent="1" vertex="1"> <mxGeometry x="612" y="-132" width="177" height="31" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> + <diagram id="PSe3G-EA4oLpEOqnfdku" name="Texture"> + <mxGraphModel dx="453" dy="1898" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="uLiKtnuvw4STLNpZsRI7-1" value="Texture" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1190" y="-771.5" width="240" height="164" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-2" value="+ Texture(path, reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-1"> + <mxGeometry y="26" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-3" value="+ Texture(unique_ptr<Asset>, reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-1"> + <mxGeometry y="52" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-4" value="~Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-1"> + <mxGeometry y="78" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-5" value="- 	void load(std::unique_ptr<Asset> res);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-1"> + <mxGeometry y="104" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-6" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-1"> + <mxGeometry y="130" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-7" value="- SDL_texture shared_ptr" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-1"> + <mxGeometry y="138" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-8" value="<<singleton>>
SdlContext" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=37;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1530" y="-870" width="450" height="361" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-9" value="- SdlContext();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="37" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-10" value="virtual ~SdlContext();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="63" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-11" value="- static SdlContext & get_instance();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="89" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-12" value="- void draw(const api::Sprite&, const api::Transform&);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="115" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-13" value="- void presentScreen();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="141" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-14" value="- void clearScreen();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="167" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-15" value="- void draw(const api::Sprite&, const api::Transform&);
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="193" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-16" value="- SDL_Texture* setTextureFromPath(const char*);" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="219" width="450" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-17" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="245" width="450" height="8" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-18" value="- friend class Texture" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="253" width="450" height="27" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-19" value="- friend class RenderSystem" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="280" width="450" height="27" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-20" value="- SDL_Window* window" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="307" width="450" height="27" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-21" value="- SDL_Renderer* renderer" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry y="334" width="450" height="27" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-22" value="Asset" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="870" y="-771.5" width="240" height="164" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-23" value="+ Asset(const std::string & src);" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-22"> + <mxGeometry y="26" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-24" value="+ const std::istream & read();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-22"> + <mxGeometry y="52" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-25" value="+ const char * canonical()
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-22"> + <mxGeometry y="78" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-26" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-22"> + <mxGeometry y="104" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-27" value="- 	std::string src;" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-22"> + <mxGeometry y="112" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-28" value="- 	std::ifstream file;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="uLiKtnuvw4STLNpZsRI7-22"> + <mxGeometry y="138" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-29" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" edge="1" parent="1" source="uLiKtnuvw4STLNpZsRI7-1" target="uLiKtnuvw4STLNpZsRI7-22"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1090" y="650" as="sourcePoint" /> + <mxPoint x="1250" y="650" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="KHBOkPQzprUpjYBXyaD9-1" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" vertex="1" parent="1"> + <mxGeometry x="860" y="-794.5" width="590" height="210" as="geometry" /> + </mxCell> + <mxCell id="uLiKtnuvw4STLNpZsRI7-30" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;" edge="1" parent="1" source="uLiKtnuvw4STLNpZsRI7-1" target="uLiKtnuvw4STLNpZsRI7-8"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1527.8351973261347" y="-185.67999999999984" as="sourcePoint" /> + <mxPoint x="1318.9034580280245" y="-592" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="KHBOkPQzprUpjYBXyaD9-2" value="api" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1"> + <mxGeometry x="1130" y="-824.5" width="40" height="30" as="geometry" /> + </mxCell> + <mxCell id="KHBOkPQzprUpjYBXyaD9-3" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" target="uLiKtnuvw4STLNpZsRI7-2"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="1530" y="-720" as="sourcePoint" /> + <mxPoint x="1430" y="-870" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="KHBOkPQzprUpjYBXyaD9-5" value="friend" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="KHBOkPQzprUpjYBXyaD9-3"> + <mxGeometry x="0.269" y="-4" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="23OjqhjSbyBXrvKH5rPI" name="AssetManager"> + <mxGraphModel dx="2713" dy="1721" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-1" value="<<singleton>>
AssetManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=38;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-1500" y="-690" width="380" height="210" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-2" value="- static AssetManager & get_instance();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="e3fB-zZ3n_cLuHSx0Qf0-1"> + <mxGeometry y="38" width="380" height="26" as="geometry" /> + </mxCell> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-3" value="- AssetManager();
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="e3fB-zZ3n_cLuHSx0Qf0-1"> + <mxGeometry y="64" width="380" height="26" as="geometry" /> + </mxCell> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-4" value="- virtual ~AssetManager()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="e3fB-zZ3n_cLuHSx0Qf0-1"> + <mxGeometry y="90" width="380" height="26" as="geometry" /> + </mxCell> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-5" value="template <typename asset>
std::shared_ptr<asset> cache(path, bool reload)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="e3fB-zZ3n_cLuHSx0Qf0-1"> + <mxGeometry y="116" width="380" height="35" as="geometry" /> + </mxCell> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-6" value="- virtual ~AssetManager()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="e3fB-zZ3n_cLuHSx0Qf0-1"> + <mxGeometry y="151" width="380" height="26" as="geometry" /> + </mxCell> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-7" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="e3fB-zZ3n_cLuHSx0Qf0-1"> + <mxGeometry y="177" width="380" height="8" as="geometry" /> + </mxCell> + <mxCell id="e3fB-zZ3n_cLuHSx0Qf0-8" value="- std::unordered_map<std::string, std::any> asset_cache" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="e3fB-zZ3n_cLuHSx0Qf0-1"> + <mxGeometry y="185" width="380" height="25" as="geometry" /> + </mxCell> + <mxCell id="8_LcbX6gMbjuHArqpFud-1" value="Texture" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-1590" y="-920" width="240" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="8_LcbX6gMbjuHArqpFud-6" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="8_LcbX6gMbjuHArqpFud-1"> + <mxGeometry y="26" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="oKbLYUMuTHWLhRLqUG_X-8" value="Sound" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-1275" y="-920" width="240" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oKbLYUMuTHWLhRLqUG_X-9" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oKbLYUMuTHWLhRLqUG_X-8"> + <mxGeometry y="26" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="oKbLYUMuTHWLhRLqUG_X-10" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="e3fB-zZ3n_cLuHSx0Qf0-1" target="8_LcbX6gMbjuHArqpFud-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-1400" y="-760" as="sourcePoint" /> + <mxPoint x="-1240" y="-760" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oKbLYUMuTHWLhRLqUG_X-11" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="e3fB-zZ3n_cLuHSx0Qf0-1" target="oKbLYUMuTHWLhRLqUG_X-8"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-1300" y="-680" as="sourcePoint" /> + <mxPoint x="-1460" y="-870" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="pnFl8-Rhr9uVGBpfHJs8" name="Rendering"> + <mxGraphModel dx="3003" dy="1898" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="7YKOBpZpmR3edmjy2obs-1" value="<<singleton>>
SdlContext" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=37;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-1260" y="-760" width="130" height="68.5" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-10" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-1"> + <mxGeometry y="37" width="130" height="8" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-15" value="RenderSystem" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=25;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-1120" y="-564.5" width="240" height="213" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-16" value="- RenderSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="25" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-17" value="- ~ RenderSystem()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="47" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-18" value="- void sort_layers()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="69" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-29" value="- void clear_screen()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="91" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-32" value="- void update_sprites()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="113" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-31" value="- void update_camera()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="135" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-30" value="- void present_screen()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="157" width="240" height="22" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-19" value="+ void update() override" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="179" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-20" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry y="205" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-21" value="<<interface>>
<<singleton>>
System" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=50;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-1120" y="-760" width="240" height="162" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-22" value="+ static System & get_instance();" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-21"> + <mxGeometry y="50" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-23" value="+ virtual void update() = 0;
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-21"> + <mxGeometry y="76" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-24" value="# System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-21"> + <mxGeometry y="102" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-25" value="# virtual ~System() {};
" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-21"> + <mxGeometry y="128" width="240" height="26" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-26" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="7YKOBpZpmR3edmjy2obs-21"> + <mxGeometry y="154" width="240" height="8" as="geometry" /> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-27" value="" style="endArrow=block;endSize=16;endFill=0;html=1;" edge="1" parent="1" source="7YKOBpZpmR3edmjy2obs-15" target="7YKOBpZpmR3edmjy2obs-21"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-1260" y="-560" as="sourcePoint" /> + <mxPoint x="-1100" y="-560" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-28" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="7YKOBpZpmR3edmjy2obs-15" target="7YKOBpZpmR3edmjy2obs-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-1632.867033190796" y="-5.679999999999836" as="sourcePoint" /> + <mxPoint x="-1520.2586031358178" y="-346" as="targetPoint" /> + <Array as="points"> + <mxPoint x="-1230" y="-500" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="7YKOBpZpmR3edmjy2obs-34" value="friend" style="html=1;verticalAlign=bottom;endArrow=block;rounded=0;edgeStyle=orthogonalEdgeStyle;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="7YKOBpZpmR3edmjy2obs-1" target="7YKOBpZpmR3edmjy2obs-15"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint x="-1230" y="-562.5" as="sourcePoint" /> + <mxPoint x="-1050" y="-590" as="targetPoint" /> + <Array as="points"> + <mxPoint x="-1203" y="-550" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="kZiYh-lleEugcNPE6Gh2-3" value="Component" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-730" y="-760" width="110" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="kZiYh-lleEugcNPE6Gh2-8" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="kZiYh-lleEugcNPE6Gh2-3"> + <mxGeometry y="20" width="110" height="8" as="geometry" /> + </mxCell> + <mxCell id="kZiYh-lleEugcNPE6Gh2-13" value="ComponentManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=20;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-1290" y="-391.5" width="150" height="40" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="kZiYh-lleEugcNPE6Gh2-14" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="kZiYh-lleEugcNPE6Gh2-13"> + <mxGeometry y="20" width="150" height="8" as="geometry" /> + </mxCell> + <mxCell id="kZiYh-lleEugcNPE6Gh2-19" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="7YKOBpZpmR3edmjy2obs-29" target="kZiYh-lleEugcNPE6Gh2-13"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-630" y="-354" as="sourcePoint" /> + <mxPoint x="-740" y="-478" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-1" value="Transform" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="1"> + <mxGeometry x="-660" y="-650" width="160" height="102" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-2" value="+position : Point" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-1"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-3" value="+rotation : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-1"> + <mxGeometry y="43" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-4" value="+scale : double" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-1"> + <mxGeometry y="60" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-5" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-1"> + <mxGeometry y="77" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-6" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-1"> + <mxGeometry y="85" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-7" value="Sprite" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;direction=east;" vertex="1" parent="1"> + <mxGeometry x="-840" y="-650" width="160" height="136" as="geometry"> + <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-8" value="+ shared_ptr<Texture> sprite_image" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#000000;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-7"> + <mxGeometry y="26" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-9" value="+ color : Color" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-7"> + <mxGeometry y="43" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-10" value="flip : FlipSettings" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-7"> + <mxGeometry y="60" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-11" value="+sortingLayer : uint8_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-7"> + <mxGeometry y="77" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-12" value="+orderInLayer : uint8_t" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-7"> + <mxGeometry y="94" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-13" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=1;labelPosition=right;points=[];portConstraint=eastwest;fontSize=12;perimeterSpacing=0;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;verticalLabelPosition=middle;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-7"> + <mxGeometry y="111" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-14" value="+get_instances_max() : int" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=1;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=1;resizable=1;deletable=1;editable=1;locked=0;connectable=1;fontColor=#0000FF;" vertex="1" parent="4oIQ1mYW8iifAQnirouZ-7"> + <mxGeometry y="119" width="160" height="17" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-15" value="" style="endArrow=block;endSize=16;endFill=0;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="4oIQ1mYW8iifAQnirouZ-7" target="kZiYh-lleEugcNPE6Gh2-3"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-890" y="-626" as="sourcePoint" /> + <mxPoint x="-890" y="-660" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-21" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" vertex="1" parent="1"> + <mxGeometry x="-865" y="-780" width="380" height="270" as="geometry" /> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-16" value="" style="endArrow=block;endSize=16;endFill=0;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="4oIQ1mYW8iifAQnirouZ-1" target="kZiYh-lleEugcNPE6Gh2-3"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-750" y="-640" as="sourcePoint" /> + <mxPoint x="-713" y="-730" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="4oIQ1mYW8iifAQnirouZ-22" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="7YKOBpZpmR3edmjy2obs-15" target="4oIQ1mYW8iifAQnirouZ-21"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="-535" y="-462.5" as="sourcePoint" /> + <mxPoint x="-630" y="-391.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="rq29EVyvDg6rC-_1Ovs3" name="Rendering flowchar"> + <mxGraphModel dx="1303" dy="798" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-3" value="" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1"> + <mxGeometry x="95" y="30" width="30" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-4" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;rounded=0;" edge="1" source="xgsAh7ClOioR0Sjh_gqH-3" parent="1" target="xgsAh7ClOioR0Sjh_gqH-5"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="110" y="110" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-8" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-5" target="xgsAh7ClOioR0Sjh_gqH-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-5" value="clear screen" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="58" y="90" width="105" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-11" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-7" target="xgsAh7ClOioR0Sjh_gqH-10"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-7" value="update camera positions and size" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="10.5" y="150" width="200" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-14" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-9" target="xgsAh7ClOioR0Sjh_gqH-13"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-9" value="present screen" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="58" y="270" width="105" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-12" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-10" target="xgsAh7ClOioR0Sjh_gqH-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-10" value="render sprites based on camera<div>render particles based on camera</div>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="10" y="210" width="200" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-13" value="" style="ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1"> + <mxGeometry x="95" y="330" width="30" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-15" value="" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1"> + <mxGeometry x="495" y="30" width="30" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-16" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;rounded=0;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-15" target="xgsAh7ClOioR0Sjh_gqH-18"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="510" y="110" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-17" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-18" target="xgsAh7ClOioR0Sjh_gqH-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-18" value="get list of sprites components from component manager&nbsp;" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="357.5" y="90" width="306" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-29" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-20" target="xgsAh7ClOioR0Sjh_gqH-28"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-20" value="get static instance SDLContext" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="410.5" y="150" width="200" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-25" value="" style="ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1"> + <mxGeometry x="327.5" y="220" width="30" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-31" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-28" target="xgsAh7ClOioR0Sjh_gqH-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-32" value="YES" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xgsAh7ClOioR0Sjh_gqH-31"> + <mxGeometry x="-0.1333" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-47" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-28" target="xgsAh7ClOioR0Sjh_gqH-25"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-48" value="NO" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xgsAh7ClOioR0Sjh_gqH-47"> + <mxGeometry x="-0.2994" y="3" relative="1" as="geometry"> + <mxPoint x="-1" y="-3" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-28" value="is there a sprite" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="455.75" y="200" width="109.5" height="70" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-38" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-30" target="xgsAh7ClOioR0Sjh_gqH-37"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-30" value="get list of transform componets from component manager by id of current sprite object" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="340.5" y="320" width="340" height="50" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-40" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-37" target="xgsAh7ClOioR0Sjh_gqH-39"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-41" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xgsAh7ClOioR0Sjh_gqH-40"> + <mxGeometry x="-0.4167" y="-1" relative="1" as="geometry"> + <mxPoint x="1" y="9" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-37" value="is there a transform" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="448.13" y="410" width="124.75" height="70" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-39" target="xgsAh7ClOioR0Sjh_gqH-28"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="700" y="535" /> + <mxPoint x="700" y="235" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-39" value="draw sprite with transform" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="425.76" y="520" width="169.5" height="30" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-50" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" vertex="1" parent="1"> + <mxGeometry x="320" width="411.87" height="580" as="geometry" /> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-37" target="xgsAh7ClOioR0Sjh_gqH-28"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="700" y="445" /> + <mxPoint x="700" y="235" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-46" value="NO" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xgsAh7ClOioR0Sjh_gqH-45"> + <mxGeometry x="-0.6632" y="-2" relative="1" as="geometry"> + <mxPoint x="-12" y="-2" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xgsAh7ClOioR0Sjh_gqH-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.004;entryY=0.388;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="xgsAh7ClOioR0Sjh_gqH-10" target="xgsAh7ClOioR0Sjh_gqH-50"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="2DtHBUif95Zjj0ECUYcE" name="InputSystem"> + <mxGraphModel dx="1307" dy="2103" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-1" value="InputSystem" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1130" y="-670" width="720" height="172" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-2" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="VQVDprHCbHa4Vfc1CoLH-1"> + <mxGeometry y="26" width="720" height="8" as="geometry" /> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-3" value="+ update() : void " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="VQVDprHCbHa4Vfc1CoLH-1"> + <mxGeometry y="34" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-4" value="- processKeys() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="VQVDprHCbHa4Vfc1CoLH-1"> + <mxGeometry y="60" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-5" value="- processMouse() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="VQVDprHCbHa4Vfc1CoLH-1"> + <mxGeometry y="86" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-6" value="- processButtons() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="VQVDprHCbHa4Vfc1CoLH-1"> + <mxGeometry y="112" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-7" value="- processTextInput() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="VQVDprHCbHa4Vfc1CoLH-1"> + <mxGeometry y="138" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-8" value="<div>The input system handles user inputs, including mouse and keyboard actions, as well as window and shutdown events. When an input is received, the system triggers the corresponding events through the event manager. It also checks all UIObjects to determine if any user input applies to them and activates the relevant events to handle their callback functions. The UIObjects can assign a EventHandler function to the object which will then be called when the corresponding event is called.</div><div>The adds the UI components to a game object the same way they add other components. To add a callback function to for example button they can use the alias EventHandler&lt;eventType&gt; to give either a function pointer or lambda function.<br></div>" style="shape=note;size=20;whiteSpace=wrap;html=1;align=left;verticalAlign=top;" vertex="1" parent="1"> + <mxGeometry x="1130" y="-960" width="360" height="218" as="geometry" /> + </mxCell> + <mxCell id="VQVDprHCbHa4Vfc1CoLH-9" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="VQVDprHCbHa4Vfc1CoLH-8" target="VQVDprHCbHa4Vfc1CoLH-1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="740" y="1210" as="sourcePoint" /> + <mxPoint x="740" y="1183" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="LqSS9MXQ1iEjVXvmAJmd" name="Gameloop"> + <mxGraphModel dx="-33" dy="1170" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="6eIl8OfSJXGQjumRXPCs-1" value="GameLoop" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="2690" y="80" width="720" height="268" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-2" value="- gameRunning : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="26" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-3" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="52" width="720" height="8" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-37" value="+ start() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="60" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-4" value="- setup() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="86" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-5" value="- loop() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="112" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-6" value="- processInput() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="138" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-7" value="- fixedUpdate() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="164" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-8" value="- update() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="190" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-9" value="- lateUpdate() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="216" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-10" value=" - render() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-1"> + <mxGeometry y="242" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-11" value="<<SingleTon>>
LoopTimer" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="2690" y="430" width="720" height="594" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-12" value="- FPS : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="40" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-13" value="- gameScale : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="66" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-14" value="- maxDeltaTime : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="92" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-15" value=" - frameRateTime : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="118" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-16" value="- fixedDeltaTime : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="144" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-17" value="- elapsedTime : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="170" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-18" value="- elapsedFixedTime : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="196" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-19" value=" - lastFrameTime : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="222" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-20" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="248" width="720" height="8" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-21" value="+ getGameScale() const : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="256" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-22" value="+ get_delta_time() const : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="282" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-23" value="+ set_FPS(int) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="308" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-24" value="+ set_game_scale(double) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="334" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-25" value="+ get_current_time() const : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="360" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-26" value="+ start() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="386" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-27" value="- enforce_framerate() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="412" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-28" value="+ get_FPS() const : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="438" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-29" value=" - update() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="464" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-30" value="- advance_fixed_time() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="490" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-31" value="- get_fixed_delta_time() const : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="516" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-32" value="- get_lag() const : double" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry y="542" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-33" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="6eIl8OfSJXGQjumRXPCs-1" target="6eIl8OfSJXGQjumRXPCs-11"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="2375" y="1105" as="sourcePoint" /> + <mxPoint x="2290" y="240" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-34" value="<div>The Gameloop is the backbone of the game engine. This class is responible for combining all systems and functionalities. This is done by first calling setup() which initiates the game engine and executes all code which is only called once. By calling the loop function the game engine enters the game loop which keeps running as long as the game is running. Each cycle the game loop checks for user input, dispatches events, calls fixed update(if there is enough time), updates all systems, calls the render system and calls late updates. The game loop also has several attributes which affect how the game runs such as FPS and gameScale which determines how fast or slow the game time updates.</div><div>By changing these attribute the user can create effects like slowing or speeding up the game.<br></div>" style="shape=note;size=20;whiteSpace=wrap;html=1;align=left;verticalAlign=top;" vertex="1" parent="1"> + <mxGeometry x="3480" y="100" width="380" height="258" as="geometry" /> + </mxCell> + <mxCell id="6eIl8OfSJXGQjumRXPCs-35" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.003;entryY=0.282;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="6eIl8OfSJXGQjumRXPCs-4" target="6eIl8OfSJXGQjumRXPCs-34"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="2220" y="-121" as="sourcePoint" /> + <mxPoint x="2280" y="-120" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="P4-P0tM5kNhF6n55xXwr" name="EventManager"> + <mxGraphModel dx="3870" dy="2504" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-1" value="Event" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="800" y="250" width="160" height="200" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-2" value="handled : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry y="26" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-3" value="priority : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry y="52" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-4" value="deliveryTime : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry y="78" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-5" value="int : EventType = 0" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry y="104" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-6" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry y="130" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-7" value="+ get_event_type() : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry y="138" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-8" value="+ to_string() : std::string" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry y="164" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-9" value="EventManager" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1490" y="-308" width="720" height="288" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-10" value="- subscribers : std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="26" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-11" value="- subscribersByEventId : std::unordered_map<int, std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>> " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="52" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-12" value=" - eventsQueue : std::vector<std::pair<std::unique_ptr<Event>, int>> ;" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="78" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-13" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="104" width="720" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-14" value="+ subscribe(int eventType, std::unique_ptr<IEventHandlerWrapper>&& handler, int eventId) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="112" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-15" value="+ unsubscribe(int eventType, const std::string& handlerName, int eventId) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="138" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-16" value="+ triggerEvent(const Event& event_, int eventId) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="164" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-17" value="+ queueEvent(std::unique_ptr<Event>&& event_, int eventId) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="190" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-18" value="+ dispatchEvents() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="216" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-19" value="+ shutdown() : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry y="242" width="720" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-20" value="KeyPressEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1290" y="240" width="160" height="164" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-21" value="- keyCode : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-20"> + <mxGeometry y="26" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-22" value="- repeat : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-20"> + <mxGeometry y="52" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-23" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-20"> + <mxGeometry y="78" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-24" value="+ KeyPressEvent(int)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-20"> + <mxGeometry y="86" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-25" value="+ get_keycode() : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-20"> + <mxGeometry y="112" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-26" value="+ get_repeat() : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-20"> + <mxGeometry y="138" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-27" value="KeyReleaseEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1290" y="413" width="160" height="112" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-28" value="- keyCode : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-27"> + <mxGeometry y="26" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-29" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-27"> + <mxGeometry y="52" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-30" value="+ KeyReleaseEvent(int)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-27"> + <mxGeometry y="60" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-31" value="+ get_keycode() : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-27"> + <mxGeometry y="86" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-32" value="WindowResizeEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="660" y="550" width="199" height="170" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-33" value="- width : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-32"> + <mxGeometry y="26" width="199" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-34" value="- height : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-32"> + <mxGeometry y="52" width="199" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-35" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-32"> + <mxGeometry y="78" width="199" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-36" value="+ WindowResizeEvent(int,int)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-32"> + <mxGeometry y="86" width="199" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-37" value="+ get_width() : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-32"> + <mxGeometry y="112" width="199" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-38" value="+ get_height() : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-32"> + <mxGeometry y="138" width="199" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-39" value="MousePressEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1290" y="835" width="220" height="112" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-40" value="mousePos : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-39"> + <mxGeometry y="26" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-41" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-39"> + <mxGeometry y="52" width="220" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-42" value="+ MousePressEvent(int x, int y)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-39"> + <mxGeometry y="60" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-43" value="+ get_mouse_pos() : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-39"> + <mxGeometry y="86" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-44" value="MouseReleaseEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1290" y="550" width="220" height="112" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-45" value="mousePos : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-44"> + <mxGeometry y="26" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-46" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-44"> + <mxGeometry y="52" width="220" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-47" value="+ MouseReleaseEvent(x,y)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-44"> + <mxGeometry y="60" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-48" value="+ get_mouse_pos() : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-44"> + <mxGeometry y="86" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-49" value="<<Template>>
IEventHandlerWrapper" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="945" y="-300" width="260" height="180" as="geometry"> + <mxRectangle x="1010" y="-120" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-50" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-49"> + <mxGeometry y="40" width="260" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-51" value="+ exec(const EventType&) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-49"> + <mxGeometry y="48" width="260" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-52" value="+ get_type() const = 0 : string" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-49"> + <mxGeometry y="74" width="260" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-53" value="+ is_destroy_on_succes() const = 0 : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-49"> + <mxGeometry y="100" width="260" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-54" value="- call(const event&) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-49"> + <mxGeometry y="126" width="260" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-55" value="EntityCollideEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="550" width="220" height="112" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-56" value="- collisionData : Collision" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-55"> + <mxGeometry y="26" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-57" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-55"> + <mxGeometry y="52" width="220" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-58" value="+ EntityCollideEvent(Collision)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-55"> + <mxGeometry y="60" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-59" value="+ get_Collision_data() const : Collision" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-55"> + <mxGeometry y="86" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-60" value="EventHandlerWrapper" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="880" y="-40" width="390" height="230" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-61" value="- handler : EventHandler<EventType>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="26" width="390" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-62" value="- destroy_on_success : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="52" width="390" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-63" value="- handlerType : string" style="text;whiteSpace=wrap;html=1;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="78" width="390" height="28" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-64" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="106" width="390" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-65" value="+ EventHandlerWrapper(const EventHandler<EventType>&, bool)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="114" width="390" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-66" value="+ get_type() const override : string" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="140" width="390" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-67" value="+ is_destroy_on_success() const override : bool" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="166" width="390" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-68" value="- call(const) override : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-60"> + <mxGeometry y="192" width="390" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-69" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-60" target="oHEOgL8LrzGqUcWN2xeX-2"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="990" y="310" as="sourcePoint" /> + <mxPoint x="1150" y="310" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1075" y="290" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-70" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-60" target="oHEOgL8LrzGqUcWN2xeX-49"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1470" y="40" as="sourcePoint" /> + <mxPoint x="1310" y="45" as="targetPoint" /> + <Array as="points" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-71" value="MouseMoveEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1290" y="965" width="220" height="115" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-72" value="mousePos : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-71"> + <mxGeometry y="26" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-73" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-71"> + <mxGeometry y="52" width="220" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-74" value="+ MouseMoveEvent(int x, int y)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-71"> + <mxGeometry y="60" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-75" value="+ get_mouse_pos() : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-71"> + <mxGeometry y="86" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-76" value="" style="endArrow=diamondThin;endFill=1;endSize=24;html=1;rounded=0;exitX=0.999;exitY=0.456;exitDx=0;exitDy=0;entryX=-0.001;entryY=0.628;entryDx=0;entryDy=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-51" target="oHEOgL8LrzGqUcWN2xeX-11"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1249.5" y="-280" as="sourcePoint" /> + <mxPoint x="1510" y="-269" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-77" value="MouseClickEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1290" y="695" width="220" height="112" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-78" value="mousePos : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-77"> + <mxGeometry y="26" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-79" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-77"> + <mxGeometry y="52" width="220" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-80" value="+ MouseClickEvent(int x, int y)" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-77"> + <mxGeometry y="60" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-81" value="+ get_mouse_pos() : std::pair<int,int>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-77"> + <mxGeometry y="86" width="220" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-82" value="ShutdownEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="190" y="550" width="160" height="86" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-83" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-82"> + <mxGeometry y="26" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-84" value="+ ShutdownEvent()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-82"> + <mxGeometry y="34" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-85" value="<<abstract>>
IMouseListener" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1720" y="680" width="395" height="318" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-86" value="- mouseReleaseHandler : EventHandler<MouseReleaseEvent> " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="40" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-87" value="- mouseClickHandler: EventHandler<MouseClickEvent> " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="66" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-88" value="- mousePressHandler : EventHandler<MousePressEvent> " style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="92" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-89" value="- mouseMoveHandler : EventHandler<MouseMoveEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="118" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-90" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="144" width="395" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-91" value="+ onMousePressed(const MousePressEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="152" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-92" value="+ onMouseClicked(const MouseClickEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="178" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-93" value="+ onMouseReleased(const MouseReleaseEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="204" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-94" value="+ onMouseMoved(const MouseMoveEvent& event): void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="230" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-95" value="- subscribeEvents(int listenerId = 0) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="256" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-96" value="- unsubscribeEvents(int listenerId = 0) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry y="282" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-97" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-82" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="520" y="450" as="sourcePoint" /> + <mxPoint x="520" y="370" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-98" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-55" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="300" y="560" as="sourcePoint" /> + <mxPoint x="890" y="460" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-99" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-32" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="310" y="570" as="sourcePoint" /> + <mxPoint x="900" y="470" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-100" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-22" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="320" y="580" as="sourcePoint" /> + <mxPoint x="910" y="480" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1120" y="305" /> + <mxPoint x="1120" y="500" /> + <mxPoint x="880" y="500" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-101" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-28" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="970" y="625" as="sourcePoint" /> + <mxPoint x="890" y="460" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1120" y="452" /> + <mxPoint x="1120" y="500" /> + <mxPoint x="880" y="500" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-102" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-45" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="980" y="635" as="sourcePoint" /> + <mxPoint x="900" y="470" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1120" y="589" /> + <mxPoint x="1120" y="500" /> + <mxPoint x="880" y="500" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-103" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-78" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1300" y="599" as="sourcePoint" /> + <mxPoint x="890" y="460" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1120" y="734" /> + <mxPoint x="1120" y="500" /> + <mxPoint x="880" y="500" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-104" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-40" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1310" y="609" as="sourcePoint" /> + <mxPoint x="900" y="470" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1120" y="874" /> + <mxPoint x="1120" y="500" /> + <mxPoint x="880" y="500" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-105" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-72" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1320" y="619" as="sourcePoint" /> + <mxPoint x="910" y="480" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1120" y="1004" /> + <mxPoint x="1120" y="500" /> + <mxPoint x="880" y="500" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-106" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-86" target="oHEOgL8LrzGqUcWN2xeX-44"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="2050" y="560" as="sourcePoint" /> + <mxPoint x="1600" y="560" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1615" y="733" /> + <mxPoint x="1615" y="578" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-107" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-87" target="oHEOgL8LrzGqUcWN2xeX-78"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1730" y="729" as="sourcePoint" /> + <mxPoint x="1520" y="588" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1580" y="759" /> + <mxPoint x="1580" y="734" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-108" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-88" target="oHEOgL8LrzGqUcWN2xeX-40"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1690" y="791" as="sourcePoint" /> + <mxPoint x="1480" y="780" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-109" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-89" target="oHEOgL8LrzGqUcWN2xeX-72"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1700" y="930" as="sourcePoint" /> + <mxPoint x="1490" y="1033" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1640" y="811" /> + <mxPoint x="1640" y="1004" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-110" value="<<abstract>>
IKeyListener" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1720" y="170" width="395" height="210" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-111" value=" - keyPressHandler : EventHandler<KeyPressEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry y="40" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-112" value="- keyReleaseHandler : EventHandler<KeyReleaseEvent>" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry y="66" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-113" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry y="92" width="395" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-114" value="+ onKeyPressed(const KeyPressedEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry y="100" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-115" value="+ onKeyReleased(const KeyReleasedEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry y="126" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-116" value="- subscribeEvents(int listenerId = 0) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry y="152" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-117" value="- unsubscribeEvents(int listenerId = 0) : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry y="178" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-118" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-91" target="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="2325" y="631" as="sourcePoint" /> + <mxPoint x="2220" as="targetPoint" /> + <Array as="points"> + <mxPoint x="2250" y="831" /> + <mxPoint x="2250" y="150" /> + <mxPoint x="2030" y="150" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-119" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-111" target="oHEOgL8LrzGqUcWN2xeX-21"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1700" y="370" as="sourcePoint" /> + <mxPoint x="1530" y="271.53" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-120" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-112" target="oHEOgL8LrzGqUcWN2xeX-28"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1730" y="371" as="sourcePoint" /> + <mxPoint x="1460" y="289" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1620" y="235" /> + <mxPoint x="1620" y="452" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-121" value="" style="endArrow=open;endSize=12;dashed=1;html=1;rounded=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-110" target="oHEOgL8LrzGqUcWN2xeX-9"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1900" y="172" as="sourcePoint" /> + <mxPoint x="1630" y="90" as="targetPoint" /> + <Array as="points"> + <mxPoint x="1819" y="75" /> + <mxPoint x="2030" y="75" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-122" value="ConcreteMouseListener" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1720" y="1090" width="395" height="140" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-123" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-122"> + <mxGeometry y="26" width="395" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-124" value="+ onMousePressed(const MousePressEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-122"> + <mxGeometry y="34" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-125" value="+ onMouseClicked(const MouseClickEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-122"> + <mxGeometry y="60" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-126" value="+ onMouseReleased(const MouseReleaseEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-122"> + <mxGeometry y="86" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-127" value="+ onMouseMoved(const MouseMoveEvent& event): void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-122"> + <mxGeometry y="112" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-128" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-122" target="oHEOgL8LrzGqUcWN2xeX-85"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="2620" y="1574" as="sourcePoint" /> + <mxPoint x="2210" y="1020" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-129" value="ConcreteKeyListener" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="1720" y="460" width="395" height="106" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-130" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-129"> + <mxGeometry y="26" width="395" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-131" value="+ onKeyPressed(const KeyPressedEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-129"> + <mxGeometry y="34" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-132" value="+ onKeyReleased(const KeyReleasedEvent& event) = 0 : void" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-129"> + <mxGeometry y="60" width="395" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-133" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-129" target="oHEOgL8LrzGqUcWN2xeX-110"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="1910" y="672" as="sourcePoint" /> + <mxPoint x="1910" y="580" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-134" value="SubmitEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="20" y="550" width="160" height="86" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-135" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-134"> + <mxGeometry y="26" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-136" value="+ ShutdownEvent()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-134"> + <mxGeometry y="34" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-137" value="ValueChangeEvent" style="swimlane;fontStyle=2;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" vertex="1" parent="1"> + <mxGeometry x="-180" y="550" width="160" height="86" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-138" value="- keyCode : int" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-137"> + <mxGeometry y="26" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-139" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-137"> + <mxGeometry y="52" width="160" height="8" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-140" value="+ ShutdownEvent()" style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="oHEOgL8LrzGqUcWN2xeX-137"> + <mxGeometry y="60" width="160" height="26" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-141" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-134"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="108" y="420" as="sourcePoint" /> + <mxPoint x="880" y="450" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-142" value="" style="endArrow=block;endSize=16;endFill=0;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-137" target="oHEOgL8LrzGqUcWN2xeX-1"> + <mxGeometry width="160" relative="1" as="geometry"> + <mxPoint x="110" y="560" as="sourcePoint" /> + <mxPoint x="890" y="460" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-143" value="These are the Build in events. these events can be used by both the engine and the user. The user can also choose to create a derived class from Event to create a custom event. " style="shape=note;size=20;whiteSpace=wrap;html=1;align=left;verticalAlign=top;" vertex="1" parent="1"> + <mxGeometry x="320" y="270" width="390" height="67" as="geometry" /> + </mxCell> + <mxCell id="oHEOgL8LrzGqUcWN2xeX-144" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=390;entryDy=43.5;entryPerimeter=0;" edge="1" parent="1" source="oHEOgL8LrzGqUcWN2xeX-3" target="oHEOgL8LrzGqUcWN2xeX-143"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="2220" y="-121" as="sourcePoint" /> + <mxPoint x="2280" y="-120" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="ALhdMBrRizYjD16H0p6L" name="gameloop-flow"> + <mxGraphModel dx="2100" dy="2340" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="2eFEffT6Pw-P22HoqLZp-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="2eFEffT6Pw-P22HoqLZp-3" target="2eFEffT6Pw-P22HoqLZp-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="440" y="140" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="2eFEffT6Pw-P22HoqLZp-3" value="" style="ellipse;fillColor=strokeColor;html=1;" vertex="1" parent="1"> + <mxGeometry x="425" y="30" width="30" height="30" as="geometry" /> + </mxCell> + <mxCell id="2eFEffT6Pw-P22HoqLZp-5" value="Start gameloop timer" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="210" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="2eFEffT6Pw-P22HoqLZp-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-32" target="2eFEffT6Pw-P22HoqLZp-8"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="440" y="1595" as="sourcePoint" /> + <Array as="points" /> + </mxGeometry> + </mxCell> + <mxCell id="2eFEffT6Pw-P22HoqLZp-8" value="" style="ellipse;html=1;shape=endState;fillColor=strokeColor;" vertex="1" parent="1"> + <mxGeometry x="425" y="1590" width="30" height="30" as="geometry" /> + </mxCell> + <mxCell id="2eFEffT6Pw-P22HoqLZp-10" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="2eFEffT6Pw-P22HoqLZp-9" target="2eFEffT6Pw-P22HoqLZp-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="2eFEffT6Pw-P22HoqLZp-9" value="Setup" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="110" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-5" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="2eFEffT6Pw-P22HoqLZp-11" target="uyXUlOiAoWS-a0s-0bG8-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="2eFEffT6Pw-P22HoqLZp-11" value="Update LoopTimer" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="460" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-1" target="2eFEffT6Pw-P22HoqLZp-11"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-1" value="" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="405" y="330" width="70" height="70" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="2eFEffT6Pw-P22HoqLZp-5" target="uyXUlOiAoWS-a0s-0bG8-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-7" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-4" target="uyXUlOiAoWS-a0s-0bG8-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-4" value="Dispatch queued events" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="560" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-6" value="Process inputs" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="660" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-23" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-8" target="uyXUlOiAoWS-a0s-0bG8-22"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-8" value="Perform normal update" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="1080" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-14" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-9" target="uyXUlOiAoWS-a0s-0bG8-16"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="440" y="915" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-9" target="uyXUlOiAoWS-a0s-0bG8-8"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="310" y="795" /> + <mxPoint x="310" y="1110" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-9" value="" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="405" y="760" width="70" height="70" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-6" target="uyXUlOiAoWS-a0s-0bG8-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-12" value="Lag &gt;= fixed delta time" style="text;align=center;fontStyle=1;verticalAlign=middle;spacingLeft=3;spacingRight=3;strokeColor=none;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;html=1;" vertex="1" parent="1"> + <mxGeometry x="490" y="804" width="80" height="26" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-15" value="yes" style="text;align=center;fontStyle=1;verticalAlign=middle;spacingLeft=3;spacingRight=3;strokeColor=none;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;html=1;" vertex="1" parent="1"> + <mxGeometry x="440" y="840" width="75" height="26" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-18" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-16" target="uyXUlOiAoWS-a0s-0bG8-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-16" value="execute fixed update" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="900" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-17" value="advance fixed update" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="990" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;elbow=vertical;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-17" target="uyXUlOiAoWS-a0s-0bG8-9"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="610" y="1020" /> + <mxPoint x="610" y="795" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-21" value="no" style="text;align=center;fontStyle=1;verticalAlign=middle;spacingLeft=3;spacingRight=3;strokeColor=none;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;html=1;" vertex="1" parent="1"> + <mxGeometry x="330" y="760" width="75" height="26" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-25" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-22" target="uyXUlOiAoWS-a0s-0bG8-24"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-22" value="execute update" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="1190" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-28" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-24" target="uyXUlOiAoWS-a0s-0bG8-27"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-24" value="update render system" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="1290" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-27" target="uyXUlOiAoWS-a0s-0bG8-32"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="440" y="1510" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-27" value="" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="405" y="1380" width="70" height="70" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-29" value="game running?" style="text;align=center;fontStyle=1;verticalAlign=middle;spacingLeft=3;spacingRight=3;strokeColor=none;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;html=1;" vertex="1" parent="1"> + <mxGeometry x="490" y="1430" width="80" height="26" as="geometry" /> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="uyXUlOiAoWS-a0s-0bG8-27" target="uyXUlOiAoWS-a0s-0bG8-1"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="700" y="1415" /> + <mxPoint x="700" y="365" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="uyXUlOiAoWS-a0s-0bG8-32" value="game exit logic" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="1500" width="120" height="60" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="ZKEAkKWqR3KYGF2XNvBz" name="event-sequence"> + <mxGraphModel dx="1480" dy="702" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-2" value="EventManager" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={"edgeStyle":"elbowEdgeStyle","elbow":"vertical","curved":0,"rounded":0};" vertex="1" parent="1"> + <mxGeometry x="200" y="50" width="100" height="300" as="geometry" /> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-3" value="eventHandler" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={"curved":0,"rounded":0};" vertex="1" parent="1"> + <mxGeometry x="-50" y="50" width="100" height="300" as="geometry" /> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-10" value="publisher" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={"curved":0,"rounded":0};" vertex="1" parent="1"> + <mxGeometry x="80" y="50" width="100" height="300" as="geometry" /> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-12" value="trigger" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;" edge="1" parent="1"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint x="129.66666666666674" y="160" as="sourcePoint" /> + <mxPoint x="249.50000000000023" y="160" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-13" value="subscribe" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;" edge="1" parent="1" target="1OdT30lkZ2hV5Btr5L5x-2"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint y="120" as="sourcePoint" /> + <mxPoint x="80" y="120" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-15" value="Callback" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;" edge="1" parent="1"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint x="249.83000000000024" y="190" as="sourcePoint" /> + <mxPoint x="-0.0033333333332575266" y="190" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-16" value="Queue" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;" edge="1" parent="1" target="1OdT30lkZ2hV5Btr5L5x-2"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint y="230" as="sourcePoint" /> + <mxPoint x="80" y="230" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-17" value="dispatch" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;" edge="1" parent="1"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint x="129.66666666666674" y="260" as="sourcePoint" /> + <mxPoint x="249.50000000000023" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-18" value="Callback" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;" edge="1" parent="1"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint x="249.83000000000024" y="290" as="sourcePoint" /> + <mxPoint x="-0.0033333333332575266" y="290" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="1OdT30lkZ2hV5Btr5L5x-19" value="unsubscribe" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;" edge="1" parent="1"> + <mxGeometry width="80" relative="1" as="geometry"> + <mxPoint x="-0.0033333333332575266" y="320" as="sourcePoint" /> + <mxPoint x="249.83000000000024" y="320" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> </mxfile> diff --git a/glossary.bib b/glossary.bib index fda634f..a846cb0 100644 --- a/glossary.bib +++ b/glossary.bib @@ -8,7 +8,7 @@ long = {Human Interface Device}, } -@abbreviation{sdl2, +@abbreviation{sdl, short = {SDL2}, long = {Simple DirectMedia Layer}, } @@ -51,4 +51,10 @@ long = {proof-of-concept}, } +@entry{facade, + name = {fa\c{c}ade}, + description = {Design pattern used to provide an abstraction from other software}, +} + +% TODO: delta time diff --git a/img/AssesManager.png b/img/AssesManager.png Binary files differnew file mode 100644 index 0000000..9dfb435 --- /dev/null +++ b/img/AssesManager.png diff --git a/img/Collision_system.png b/img/Collision_system.png Binary files differnew file mode 100644 index 0000000..24f83f4 --- /dev/null +++ b/img/Collision_system.png diff --git a/img/Collision_system_flowchart.png b/img/Collision_system_flowchart.png Binary files differnew file mode 100644 index 0000000..ee43ddf --- /dev/null +++ b/img/Collision_system_flowchart.png diff --git a/img/Fixed_update.png b/img/Fixed_update.png Binary files differnew file mode 100644 index 0000000..2cacd48 --- /dev/null +++ b/img/Fixed_update.png diff --git a/img/Particle_system.png b/img/Particle_system.png Binary files differnew file mode 100644 index 0000000..89f7363 --- /dev/null +++ b/img/Particle_system.png diff --git a/img/Particle_system_flowchart.png b/img/Particle_system_flowchart.png Binary files differnew file mode 100644 index 0000000..09a9fd9 --- /dev/null +++ b/img/Particle_system_flowchart.png diff --git a/img/Physics_system.png b/img/Physics_system.png Binary files differnew file mode 100644 index 0000000..0e98b9e --- /dev/null +++ b/img/Physics_system.png diff --git a/img/Physics_system_flowchart.png b/img/Physics_system_flowchart.png Binary files differnew file mode 100644 index 0000000..f6238c0 --- /dev/null +++ b/img/Physics_system_flowchart.png diff --git a/img/Rendering.png b/img/Rendering.png Binary files differnew file mode 100644 index 0000000..d3491ba --- /dev/null +++ b/img/Rendering.png diff --git a/img/activity-scripts.puml b/img/activity-scripts.puml new file mode 100644 index 0000000..b833bdf --- /dev/null +++ b/img/activity-scripts.puml @@ -0,0 +1,21 @@ +@startuml +!include theme.ipuml + +start + +label continue +:Get list of ""BehaviorScript"" components from ""ComponentManager""; + +while (for each ""BehaviorScript"" in list) + if (""BehaviorScript"" is active) then (yes) + if (""BehaviorScript"" has an instance of ""Script"") then (yes) + :Call update function of ""BehaviorScript""'s ""Script"" instance; + else (no) + endif + else (no) + endif +endwhile + +stop + +@enduml diff --git a/img/class-api-full.pdf b/img/class-api-full.pdf Binary files differnew file mode 100644 index 0000000..cd28b08 --- /dev/null +++ b/img/class-api-full.pdf diff --git a/img/class-config.puml b/img/class-config.puml new file mode 100644 index 0000000..72e5e6c --- /dev/null +++ b/img/class-config.puml @@ -0,0 +1,14 @@ +@startuml +!include theme.ipuml + +class Config <<singleton>> { + - Config() + + ~Config() + -- + + get_instance() : Config & <<static>> + -- + + log : struct ... + ... +} + +@enduml diff --git a/img/class-savemgr.puml b/img/class-savemgr.puml new file mode 100644 index 0000000..30bcd08 --- /dev/null +++ b/img/class-savemgr.puml @@ -0,0 +1,13 @@ +@startuml +!include theme.ipuml +skinparam Linetype ortho + +class SaveManager { + +} + +class ValueBroker { + +} + +@enduml diff --git a/img/class-scripts.puml b/img/class-scripts.puml index 8fc36c9..44cbe85 100644 --- a/img/class-scripts.puml +++ b/img/class-scripts.puml @@ -10,10 +10,12 @@ package api { class Component <<irrelevant>> class Script { + - Script() + -- # init() <<virtual>> # update() <<virtual>> -- - - Script() + - parent : BehaviorScript * } class BehaviorScript { @@ -26,7 +28,8 @@ package api { } BehaviorScript -u-|> Component - Script .u.> BehaviorScript + Script <.u. BehaviorScript : > friend + Script ..u> BehaviorScript } class System <<irrelevant>> diff --git a/img/custom-event-output.png b/img/custom-event-output.png Binary files differnew file mode 100644 index 0000000..f818293 --- /dev/null +++ b/img/custom-event-output.png diff --git a/img/event-sequence.puml b/img/event-sequence.puml new file mode 100644 index 0000000..2555f33 --- /dev/null +++ b/img/event-sequence.puml @@ -0,0 +1,16 @@ +@startuml +skinparam SequenceParticipantPadding 15 + + +participant EventHandler +participant Publisher +participant EventManager + +EventHandler -> EventManager : Subscribe event +Publisher -> EventManager : trigger event + +EventManager -> EventHandler : execute callback function +Publisher -> EventManager : Queue Event +EventManager -> EventHandler : dispatching queued events +EventHandler -> EventManager : unsubscribe event +@enduml diff --git a/img/event-uml.drawio.png b/img/event-uml.drawio.png Binary files differnew file mode 100644 index 0000000..008dd85 --- /dev/null +++ b/img/event-uml.drawio.png diff --git a/img/flowchart_rendering.png b/img/flowchart_rendering.png Binary files differnew file mode 100644 index 0000000..41306a1 --- /dev/null +++ b/img/flowchart_rendering.png diff --git a/img/gameloop-class.puml b/img/gameloop-class.puml new file mode 100644 index 0000000..e66b7d8 --- /dev/null +++ b/img/gameloop-class.puml @@ -0,0 +1,37 @@ +@startuml +!include theme.ipuml +class LoopManager { + +static LoopManager& getInstance() + + +void loop() + +void setup() + -void render() + -void processInput() + -void fixedUpdate() + -void update() + -bool gameRunning + -LoopManager() +} + +class LoopTimer { + +static LoopTimer& getInstance() + +void start() + +void update() + +float getLag() + +float getFixedDeltaTime() + +void advanceFixedUpdate() + +void enforceFrameRate() + +float getDeltaTime() + -float lag + -float fixedDeltaTime + -float deltaTime +} + +LoopManager --> LoopTimer : uses +LoopManager : loop() +LoopManager : |-- processInput() +LoopManager : |-- fixedUpdate() +LoopManager : |-- update() +LoopManager : |-- render() +' TODO: what is this supposed to be? +@enduml diff --git a/img/gameloop-console-10.png b/img/gameloop-console-10.png Binary files differnew file mode 100644 index 0000000..af0cd71 --- /dev/null +++ b/img/gameloop-console-10.png diff --git a/img/gameloop-console.png b/img/gameloop-console.png Binary files differnew file mode 100644 index 0000000..a675fae --- /dev/null +++ b/img/gameloop-console.png diff --git a/img/gameloop-flow.puml b/img/gameloop-flow.puml new file mode 100644 index 0000000..e75ea42 --- /dev/null +++ b/img/gameloop-flow.puml @@ -0,0 +1,26 @@ +@startuml +!include theme.ipuml +start + +:Initialize LoopManager; +:Start LoopTimer; + +repeat + :Update LoopTimer; + :Check for Events; + :Process Input; + + while (Lag >= Fixed Delta Time?) is (yes) + :Perform Fixed Update; + :Advance Fixed Update; + endwhile + + :Perform Normal Update; + :Render Frame; + +repeat while (Game Running?) + +:Game exit logic; + +stop +@enduml diff --git a/img/gameloop-squares.png b/img/gameloop-squares.png Binary files differnew file mode 100644 index 0000000..6481c7e --- /dev/null +++ b/img/gameloop-squares.png diff --git a/img/poc-button.png b/img/poc-button.png Binary files differnew file mode 100644 index 0000000..633ea99 --- /dev/null +++ b/img/poc-button.png diff --git a/img/poc-camera.pdf b/img/poc-camera.pdf Binary files differnew file mode 100644 index 0000000..c67c078 --- /dev/null +++ b/img/poc-camera.pdf diff --git a/img/poc-collision-1.png b/img/poc-collision-1.png Binary files differnew file mode 100644 index 0000000..550059b --- /dev/null +++ b/img/poc-collision-1.png diff --git a/img/poc-collision-2.png b/img/poc-collision-2.png Binary files differnew file mode 100644 index 0000000..1636bd2 --- /dev/null +++ b/img/poc-collision-2.png diff --git a/img/poc-event-button.png b/img/poc-event-button.png Binary files differnew file mode 100644 index 0000000..7d3b546 --- /dev/null +++ b/img/poc-event-button.png diff --git a/img/poc-log.png b/img/poc-log.png Binary files differnew file mode 100644 index 0000000..12e2c61 --- /dev/null +++ b/img/poc-log.png diff --git a/img/poc-output-scripts.png b/img/poc-output-scripts.png Binary files differnew file mode 100644 index 0000000..068f345 --- /dev/null +++ b/img/poc-output-scripts.png diff --git a/img/poc-particles.png b/img/poc-particles.png Binary files differnew file mode 100644 index 0000000..85229c4 --- /dev/null +++ b/img/poc-particles.png diff --git a/img/texture.png b/img/texture.png Binary files differnew file mode 100644 index 0000000..97b79fe --- /dev/null +++ b/img/texture.png diff --git a/img/theme.ipuml b/img/theme.ipuml index 81391e2..c44db05 100644 --- a/img/theme.ipuml +++ b/img/theme.ipuml @@ -1,18 +1,10 @@ ' vim:ft=plantuml - -<style> -root { - BackgroundColor white - FontColor black - LineThickness 1 - Margin 0 -} -</style> - +!theme plain skinparam ClassAttributeIconSize 0 skinparam ClassFontStyle bold skinparam DefaultFontName Inter skinparam DefaultFontSize 10 +skinparam DefaultMonospacedFontName "JetBrains Mono" skinparam MaxMessageSize 200 skinparam Nodesep 25 ' skinparam Padding 0 @@ -20,6 +12,8 @@ skinparam Ranksep 50 skinparam RoundCorner 0 skinparam PackageStyle rectangle skinparam PackageFontStyle italic +skinparam ActivityStartColor black +skinparam ActivityEndColor black hide class circle diff --git a/projdoc.cls b/projdoc.cls index b369b18..a0c8e10 100644 --- a/projdoc.cls +++ b/projdoc.cls @@ -330,7 +330,7 @@ % adjust scale for puml diagrams \newcommand{\includepumldiag}[1]{% \StrSubstitute{#1}{.puml}{.eps}[\filename]% - \fitimg{\includegraphics[scale=0.75]{\filename}}% + \fitimg{\includegraphics[scale=0.65]{\filename}}% } % prevent page break between two paragraphs @@ -117,3 +117,68 @@ Unless explicitly changed by the game programmer, methods on instances of must be called by the script system. ''' +[savemgr] +type = 'user' +priority = 'must' +description = ''' +The engine provides an \gls{api} for saving various kinds of game data +(e.g.~progress, levels, statistics, unlocked items, achievements). +''' + +[savemgr:journalling] +type = 'system' +priority = 'should' +description = ''' +The save manager uses a journal to store data, such that partial saves do not +cause data loss. +''' + +[savemgr:types-custom] +type = 'system' +priority = 'will not' +description = ''' +The save manager can be extended to store and retrieve game programmer-defined +types and data structures. +''' + +[savemgr:types-scalar] +type = 'system' +priority = 'must' +description = ''' +The save manager is able to store and retrieve scalar types. +''' + +[savemgr:types-string] +type = 'system' +priority = 'must' +description = ''' +The save manager is able to store and retrieve strings. +''' + +[savemgr:multi-file] +type = 'system' +priority = 'will not' +description = ''' +The save manager can load multiple different save files. +''' + +[savemgr:file-manage] +type = 'system' +priority = 'must' +description = ''' +The save manager manages opening/closing the underlying file, and flushing +in-memory data to the file. +''' +done = ''' +The game programmer is able to use the save manager without explicit +(de)initialization. +''' + +[savemgr:var-key] +type = 'system' +priority = 'must' +description = ''' +The save manager provides access to variables uniquely identified by a key +string. +''' + diff --git a/research.tex b/research.tex index 6853d5f..241dd8b 100644 --- a/research.tex +++ b/research.tex @@ -253,16 +253,16 @@ described. A game engine must have the ability to handle user input, render graphics, and process audio. Several large frameworks are available that provide these features and are already widely used by other game engines. The two most popular and -best-supported options are \gls{sdl2} and \gls{sfml}. +best-supported options are \gls{sdl} and \gls{sfml}. \paragraph{SDL2} % TODO: ref?sdl2 -According to its official website, \gls{sdl2} is \emph{``a cross-platform development +According to its official website, \gls{sdl} is \emph{``a cross-platform development library designed to provide low-level access to audio, keyboard, mouse, joystick, and graphics hardware via \gls{opengl} and \gls{d3d}. It is used by video playback software, emulators, and popular games, including Valve's award-winning catalog and -many Humble Bundle games.''} \gls{sdl2} is written in the C programming language, and +many Humble Bundle games.''} \gls{sdl} is written in the C programming language, and therefore, structs and functions are used instead of objects and methods. \begin{comparison} @@ -293,7 +293,7 @@ game development. applications.} \con{The 2D rendering engine may experience performance issues in large-scale games.} - \con{The community is smaller compared to \gls{sdl2}.} + \con{The community is smaller compared to \gls{sdl}.} \con{No native 3D support is provided.} \con{Not all image formats are supported.} \end{comparison} @@ -42,18 +42,18 @@ loek: 2024-09-19 15m tooling :: documentation (move to git commit versioning) loek: 2024-09-19 30m review :: PR review (+ style guide update) loek: 2024-09-22 2h15m docs :: research loek: 2024-09-24 1h45m project meeting -loek: 2024-09-25 3h implementation :: audio API +loek: 2024-09-25 3h implementation :: audio facade loek: 2024-09-26 2h project meeting -loek: 2024-09-25 1h20m implementation :: audio API +loek: 2024-09-25 1h20m implementation :: audio facade loek: 2024-09-27 20m review :: PR review (+ style guide update) loek: 2024-09-27 55m tooling :: build system (fix library import structure) -loek: 2024-09-28 2h20m implementation :: audio API +loek: 2024-09-28 2h20m implementation :: audio facade loek: 2024-09-29 1h55m implementation :: debug logging facilities -loek: 2024-09-29 20m implementation :: audio API -loek: 2024-09-29 45m docs :: design :: audio API +loek: 2024-09-29 20m implementation :: audio facade +loek: 2024-09-29 45m docs :: design :: audio facade loek: 2024-09-30 1h40m project meeting loek: 2024-10-01 2h20m review :: feedback & discussing software design -loek: 2024-10-01 30m implementation :: audio API +loek: 2024-10-01 30m implementation :: audio facade loek: 2024-10-03 1h30m project meeting loek: 2024-10-04 15m research :: read others' research loek: 2024-10-04 1h15m project meeting @@ -92,6 +92,28 @@ loek: 2024-10-30 30m project meeting (min/max component count constraints) loek: 2024-10-24 10m review :: PR review (#40, #41 and #42) loek: 2024-10-31 3h45m project meeting loek: 2024-10-31 2h50m docs :: design :: POCs +loek: 2024-11-01 1h05m docs :: design (log POC & Global configuration interface) +loek: 2024-11-02 35m review :: PR review (#48 and #49) +loek: 2024-11-03 55m docs :: design :: add full-size class diagram +loek: 2024-11-03 1h30m implementation :: save manager +loek: 2024-11-03 55m review :: PR review (#15, #50, #52) +loek: 2024-11-03 10m review :: PR review (#53) +loek: 2024-11-04 20m implementation :: save manager +loek: 2024-11-04 4h project meeting +loek: 2024-11-05 1h05m docs :: style guide +loek: 2024-11-05 1h20m implementation :: refactoring (code standard compliance) +loek: 2024-11-05 25m review :: PR review (#18) +loek: 2024-11-05 1h40m tech support (help Jaro w/ PR & various other issues) +loek: 2024-11-06 20m chores +loek: 2024-11-06 20m tech support (help Wouter w/ library/dependency build issues) +loek: 2024-11-06 25m review :: PR review (#19 and #21) +loek: 2024-11-07 15m implementation :: debugging (script manager segfault caused by 20bb682) +loek: 2024-11-07 10m review :: PR review (#23) +loek: 2024-11-07 2h05m review :: feedback (event manager design) +loek: 2024-11-07 1h review :: PR review (#16) +loek: 2024-11-07 20m review :: PR review (#25) +loek: 2024-11-07 1h15m implementation :: audio system +loek: 2024-11-07 25m implementation :: refactoring (big cleanup) max: 2024-09-02 1h project kickoff max: 2024-09-02 45m first project meeting @@ -157,6 +179,25 @@ max: 2024-10-30 2h added ReplaySystem design to class diagram max: 2024-10-31 30m discussing with Jaro max: 2024-10-31 3h45m fiftheent project meeting max: 2024-10-31 3h30m creating chapter two of design +max: 2024-11-04 1h25m sixteent project meeting +max: 2024-11-04 45m assessment (design) +max: 2024-11-04 2h sixteent project meeting +max: 2024-11-04 1h getting used to/testing new programming environment +max: 2024-11-05 30m installing/testing GTest framework +max: 2024-11-05 30m added examples to code style +max: 2024-11-05 1h20m reviewed componentManager +max: 2024-11-05 2h45m changed GameObject according to class diagram +max: 2024-11-05 1h30m added SceneManager to the engine +max: 2024-11-05 30m replaced crepe::api with crepe +max: 2024-11-06 1h30m refactored SceneManager according to new code style +max: 2024-11-06 4h big cleanup +max: 2024-11-06 1h added topics to code style +max: 2024-11-07 45m refactoring componentManager according to new code style +max: 2024-11-07 15m added new topics to code style +max: 2024-11-07 30m recieve Jaro's feedback +max: 2024-11-07 50m processed Jaro's feedback +max: 2024-11-07 30m quicly reviewed Wouter's GameLoop +max: 2024-11-07 1h20m reviewed Jaro's physics poc wouter: 2024-09-02 1h project meeting :: project kickoff wouter: 2024-09-02 45m project meeting @@ -266,6 +307,11 @@ niels: 2024-10-25 2h researching camera niels: 2024-10-26 2h merge wouter events branch to niels/rendering niels: 2024-10-26 1h fix my own git camera mistake niels: 2024-10-26 2h programming camera poc with movement and script +niels: 2024-10-29 2h30m Helping Jaro with events +niels: 2024-10-30 3h fixing camera SDL viewort bug +niels: 2024-10-31 3h45m meeting +niels: 2024-11-2 3h design document, diagrams and flowcharts +niels: 2024-11-3 1h design document, diagrams and flowcharts jaro: 2024-09-02 1h project meeting :: project kickoff jaro: 2024-09-02 45m project meeting @@ -330,7 +376,14 @@ jaro: 2024-10-24 1h20m project meeting jaro: 2024-10-24 3h30m physics and collision jaro: 2024-10-24 1h static collision handeling jaro: 2024-10-25 2h collision handeling and onderzoek collision event unity - +jaro: 2024-10-28 2h30m Mergen rendering + events +jaro: 2024-10-29 4h Physics,collision design + latex +jaro: 2024-10-30 2h diagrams design +jaro: 2024-10-31 30m discusing design questions +jaro: 2024-10-31 3h30m discusing design questions +jaro: 2024-10-31 1h changing diagrams +jaro: 2024-10-31 45m adding diagrams physics,collision,particles +jaro: 2024-11-1 15m weeklyupdate |