aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax-001 <80035972+Max-001@users.noreply.github.com>2024-09-26 16:17:21 +0200
committerMax-001 <80035972+Max-001@users.noreply.github.com>2024-09-26 16:17:21 +0200
commit9e900b072fe40789f7b7d9fb69e0b0326bc7238c (patch)
treee146b1ff277d95658f6555a9af733e4281405bf0
parent4865777f7e98ab10c3381a0a36680415bc123113 (diff)
parent6329755a372d90985bda1cd164fae8d91d4a60c6 (diff)
Merge remote-tracking branch 'origin/master' into max/time
-rw-r--r--contributing.md2
-rw-r--r--example.tex1
-rw-r--r--figs.drawio761
-rw-r--r--glossary.bib6
-rw-r--r--img/ECSBlockDiagram.pngbin0 -> 64822 bytes
-rw-r--r--img/ECSComponentManager.pngbin0 -> 247012 bytes
-rw-r--r--img/ExtensionObjects.jpgbin0 -> 48639 bytes
-rw-r--r--meta.tex9
-rw-r--r--plan.tex119
-rw-r--r--projdoc.cls18
-rw-r--r--reqs.toml16
-rw-r--r--requirements.tex1
-rw-r--r--research.tex254
-rwxr-xr-xscripts/reqs2tex.py2
-rw-r--r--sources.bib101
-rw-r--r--style.md61
-rw-r--r--time.txt6
-rw-r--r--timerep.tex1
18 files changed, 1147 insertions, 211 deletions
diff --git a/contributing.md b/contributing.md
index db58388..46cfeca 100644
--- a/contributing.md
+++ b/contributing.md
@@ -17,6 +17,8 @@ other document.
- Only environments indent the LaTeX source code
- Insert a non-breaking space (`~`) after (Latin) abbreviations such as "i.e."
or "e.g.". Never place a comma after either of these.
+- Multiple references (both `\cref` and `\autocite`) should be done in a single
+ command (i.e. `\cref{fig:a,fig:b}` and `\autocite{source1,source2}`)
# Banned practices
diff --git a/example.tex b/example.tex
index 24c525b..9f36f59 100644
--- a/example.tex
+++ b/example.tex
@@ -1,7 +1,6 @@
\documentclass{projdoc}
% if the document compiles too slow (likely due to many/large images), try compiling
% with the [draft] option. this replaces all images with placeholders.
-\input{meta.tex}
\title{Example Document}
diff --git a/figs.drawio b/figs.drawio
new file mode 100644
index 0000000..7c961d1
--- /dev/null
+++ b/figs.drawio
@@ -0,0 +1,761 @@
+<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.8 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.8" pages="2">
+ <diagram id="C5RBs43oDa-KdzZeNtuy" name="Main diagram">
+ <mxGraphModel dx="2577" dy="1035" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
+ <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
+ <mxCell id="zkfFHV4jXpPFQw0GAbJ--6" value="GameObject" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="320" y="540" width="160" height="153" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="zkfFHV4jXpPFQw0GAbJ--7" value="+name" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="zkfFHV4jXpPFQw0GAbJ--8" value="+tag" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-1" value="+active" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;strokeWidth=1;horizontal=1;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="60" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-2" value="+layer" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;html=0;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="77" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="zkfFHV4jXpPFQw0GAbJ--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;fontSize=12;perimeterSpacing=0;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="94" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="zkfFHV4jXpPFQw0GAbJ--11" value="+AddComponent()" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="102" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-3" value="+IsActiveInWorld()" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="119" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-4" value="+IsActiveSelf()" style="text;align=left;verticalAlign=bottom;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;movable=0;resizable=0;deletable=0;editable=0;locked=1;connectable=0;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1">
+ <mxGeometry y="136" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-9" value="Scene" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="40" y="590" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-82" 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="PVU13nk45NJB4w4DQgDw-9" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-14" 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="PVU13nk45NJB4w4DQgDw-9" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-81" 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="PVU13nk45NJB4w4DQgDw-9" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-28" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-9" target="zkfFHV4jXpPFQw0GAbJ--6" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="260" y="580" as="sourcePoint" />
+ <mxPoint x="290" y="590" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="320" y="625" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-39" value="+contents" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-28" vertex="1" connectable="0">
+ <mxGeometry x="-0.1405" y="-1" relative="1" as="geometry">
+ <mxPoint y="-17" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-40" value="1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-28" vertex="1" connectable="0">
+ <mxGeometry x="-0.7119" y="-1" relative="1" as="geometry">
+ <mxPoint y="14" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-41" value="*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-28" 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="PVU13nk45NJB4w4DQgDw-34" value="Camera" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="40" y="760" width="160" height="102" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-78" value="+backgroundColor" 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="PVU13nk45NJB4w4DQgDw-34" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-77" value="+ascpectWidth" 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="PVU13nk45NJB4w4DQgDw-34" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-35" value="+ascpectHeight" 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="PVU13nk45NJB4w4DQgDw-34" vertex="1">
+ <mxGeometry y="60" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-36" 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="PVU13nk45NJB4w4DQgDw-34" vertex="1">
+ <mxGeometry y="77" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-37" value="-" 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="PVU13nk45NJB4w4DQgDw-34" vertex="1">
+ <mxGeometry y="85" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-46" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-34" target="PVU13nk45NJB4w4DQgDw-9" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="210" y="635" as="sourcePoint" />
+ <mxPoint x="140" y="660" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-47" value="+renderScene" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-46" vertex="1" connectable="0">
+ <mxGeometry x="-0.1405" y="-1" relative="1" as="geometry">
+ <mxPoint x="-41" y="-6" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-48" value="1..*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-46" vertex="1" connectable="0">
+ <mxGeometry x="-0.7119" y="-1" relative="1" as="geometry">
+ <mxPoint x="-21" y="4" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-49" value="1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-46" vertex="1" connectable="0">
+ <mxGeometry x="0.6214" y="-1" relative="1" as="geometry">
+ <mxPoint x="9" y="-9" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-50" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-34" target="zkfFHV4jXpPFQw0GAbJ--6" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="130" y="770" as="sourcePoint" />
+ <mxPoint x="290" y="670" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-54" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="320" y="740" width="160" height="85" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-86" value="+width" 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="PVU13nk45NJB4w4DQgDw-54" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-55" value="+height" 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="PVU13nk45NJB4w4DQgDw-54" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-56" 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="PVU13nk45NJB4w4DQgDw-54" vertex="1">
+ <mxGeometry y="60" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-85" 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="PVU13nk45NJB4w4DQgDw-54" vertex="1">
+ <mxGeometry y="68" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-58" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="230" y="880" width="160" height="85" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-87" value="+interactable&#xa;" 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="PVU13nk45NJB4w4DQgDw-58" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-59" 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="PVU13nk45NJB4w4DQgDw-58" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-60" 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="PVU13nk45NJB4w4DQgDw-58" vertex="1">
+ <mxGeometry y="60" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-83" 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="PVU13nk45NJB4w4DQgDw-58" vertex="1">
+ <mxGeometry y="68" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-62" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="414" y="880" width="160" height="136" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-93" 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="PVU13nk45NJB4w4DQgDw-62" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-92" 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="PVU13nk45NJB4w4DQgDw-62" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-91" 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="PVU13nk45NJB4w4DQgDw-62" vertex="1">
+ <mxGeometry y="60" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-90" 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="PVU13nk45NJB4w4DQgDw-62" vertex="1">
+ <mxGeometry y="77" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-89" 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="PVU13nk45NJB4w4DQgDw-62" vertex="1">
+ <mxGeometry y="94" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-64" 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="PVU13nk45NJB4w4DQgDw-62" vertex="1">
+ <mxGeometry y="111" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-84" 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="PVU13nk45NJB4w4DQgDw-62" vertex="1">
+ <mxGeometry y="119" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-66" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-54" target="zkfFHV4jXpPFQw0GAbJ--6" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="210" y="770" as="sourcePoint" />
+ <mxPoint x="330" y="678" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-67" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-58" target="PVU13nk45NJB4w4DQgDw-54" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="195" y="780" as="sourcePoint" />
+ <mxPoint x="384" y="810" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-68" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-62" target="PVU13nk45NJB4w4DQgDw-54" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="205" y="790" as="sourcePoint" />
+ <mxPoint x="350" y="698" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-102" value="" style="endArrow=open;html=1;rounded=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;resizable=1;endFill=0;endSize=8;" parent="WIyWlLk6GJQsqaUBKTNV-1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="480" y="640" as="sourcePoint" />
+ <mxPoint x="480" y="680" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="520" y="640" />
+ <mxPoint x="520" y="680" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-103" value="+parent &amp;gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-102" vertex="1" connectable="0">
+ <mxGeometry x="-0.719" y="3" relative="1" as="geometry">
+ <mxPoint x="13" y="-4" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-104" value="*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-102" vertex="1" connectable="0">
+ <mxGeometry x="-0.0905" y="1" relative="1" as="geometry">
+ <mxPoint x="-31" y="-5" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-105" value="0..1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="PVU13nk45NJB4w4DQgDw-102" vertex="1" connectable="0">
+ <mxGeometry y="1" relative="1" as="geometry">
+ <mxPoint x="-21" y="30" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-106" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="560" y="565.5" width="160" height="102" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-111" value="+position" 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="PVU13nk45NJB4w4DQgDw-106" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-110" value="+rotation" 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="PVU13nk45NJB4w4DQgDw-106" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-107" value="+scale" 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="PVU13nk45NJB4w4DQgDw-106" vertex="1">
+ <mxGeometry y="60" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-108" 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="PVU13nk45NJB4w4DQgDw-106" vertex="1">
+ <mxGeometry y="77" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-109" 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="PVU13nk45NJB4w4DQgDw-106" vertex="1">
+ <mxGeometry y="85" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-112" value="" style="endArrow=none;html=1;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-106" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="510" y="610" as="sourcePoint" />
+ <mxPoint x="560" y="560" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-113" value="iMouseListener" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="640" y="880" width="160" height="119" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-114" 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="PVU13nk45NJB4w4DQgDw-113" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-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="PVU13nk45NJB4w4DQgDw-113" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-116" value="+OnMouseMoved()" 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="PVU13nk45NJB4w4DQgDw-113" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-121" value="+OnMouseClicked()" 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="PVU13nk45NJB4w4DQgDw-113" vertex="1">
+ <mxGeometry y="68" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-122" value="+OnMousePressed()" 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="PVU13nk45NJB4w4DQgDw-113" vertex="1">
+ <mxGeometry y="85" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-123" value="+OnMouseReleased()" 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="PVU13nk45NJB4w4DQgDw-113" vertex="1">
+ <mxGeometry y="102" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-117" value="iKeyListener" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="840" y="880" width="160" height="85" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-118" 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="PVU13nk45NJB4w4DQgDw-117" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-119" 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="PVU13nk45NJB4w4DQgDw-117" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-120" value="+OnKeyPressed()" 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="PVU13nk45NJB4w4DQgDw-117" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-124" value="+OnKeyReleased()" 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="PVU13nk45NJB4w4DQgDw-117" vertex="1">
+ <mxGeometry y="68" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-125" value="Color" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="-200" y="760" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-126" 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="PVU13nk45NJB4w4DQgDw-125" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-127" 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="PVU13nk45NJB4w4DQgDw-125" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-128" 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="PVU13nk45NJB4w4DQgDw-125" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-129" value="Point" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="-200" y="650" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-130" 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="PVU13nk45NJB4w4DQgDw-129" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-131" 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="PVU13nk45NJB4w4DQgDw-129" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-132" 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="PVU13nk45NJB4w4DQgDw-129" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-133" value="Debug" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="-200" y="560" width="70" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-135" value="Time" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="-200" y="490" width="70" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-136" value="Input" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="-200" y="420" width="70" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-138" value="AudioSource" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="30" y="212" width="160" height="136" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-142" value="+audioClip: Resource* (was 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;fontColor=#ff0000;" parent="PVU13nk45NJB4w4DQgDw-138" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-143" value="+playOnAwake: Boolean" 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="PVU13nk45NJB4w4DQgDw-138" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-144" value="+loop: Boolean" 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="PVU13nk45NJB4w4DQgDw-138" vertex="1">
+ <mxGeometry y="60" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-145" value="+volume" 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="PVU13nk45NJB4w4DQgDw-138" vertex="1">
+ <mxGeometry y="77" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-140" 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="PVU13nk45NJB4w4DQgDw-138" vertex="1">
+ <mxGeometry y="94" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-141" value="+Play(looping)" 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="PVU13nk45NJB4w4DQgDw-138" vertex="1">
+ <mxGeometry y="102" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-150" value="+Stop()" 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="PVU13nk45NJB4w4DQgDw-138" vertex="1">
+ <mxGeometry y="119" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-152" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="310" y="212" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-153" 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="PVU13nk45NJB4w4DQgDw-152" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-154" 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="PVU13nk45NJB4w4DQgDw-152" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-155" 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="PVU13nk45NJB4w4DQgDw-152" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-156" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="220" y="318" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-157" value="+radius" 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="PVU13nk45NJB4w4DQgDw-156" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-158" 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="PVU13nk45NJB4w4DQgDw-156" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-159" 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="PVU13nk45NJB4w4DQgDw-156" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-160" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="414" y="316" width="160" height="85" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-164" value="+width" 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="PVU13nk45NJB4w4DQgDw-160" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-161" value="+height" 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="PVU13nk45NJB4w4DQgDw-160" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-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="PVU13nk45NJB4w4DQgDw-160" vertex="1">
+ <mxGeometry y="60" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-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="PVU13nk45NJB4w4DQgDw-160" vertex="1">
+ <mxGeometry y="68" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-165" value="Component" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="410" y="82" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-166" value="+active: Boolean" 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="PVU13nk45NJB4w4DQgDw-165" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-167" 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="PVU13nk45NJB4w4DQgDw-165" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-168" 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="PVU13nk45NJB4w4DQgDw-165" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-169" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="550" y="195" width="160" height="102" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-174" value="+mass" 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="PVU13nk45NJB4w4DQgDw-169" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-173" value="+gravityScale" 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="PVU13nk45NJB4w4DQgDw-169" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-170" value="+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="PVU13nk45NJB4w4DQgDw-169" vertex="1">
+ <mxGeometry y="60" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-171" 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="PVU13nk45NJB4w4DQgDw-169" vertex="1">
+ <mxGeometry y="77" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-172" 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="PVU13nk45NJB4w4DQgDw-169" vertex="1">
+ <mxGeometry y="85" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-175" value="BehaviourScript" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="690" y="316" width="160" height="85" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-176" 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="PVU13nk45NJB4w4DQgDw-175" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-177" 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="PVU13nk45NJB4w4DQgDw-175" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-178" value="+OnStart()" 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="PVU13nk45NJB4w4DQgDw-175" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-179" value="+OnUpdate()" 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="PVU13nk45NJB4w4DQgDw-175" vertex="1">
+ <mxGeometry y="68" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-180" 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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="880" y="165" width="160" height="153" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-199" value="+sprite:Resource* (WasString)" 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=#ff0000;" parent="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-198" 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="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="43" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-197" value="+flipX" 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="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="60" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-196" value="+flipY" 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="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="77" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-195" value="+sortingLayer" 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="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="94" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-181" value="+orderInLayer" 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="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="111" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-182" 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="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="128" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-183" value="+Render()" 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="PVU13nk45NJB4w4DQgDw-180" vertex="1">
+ <mxGeometry y="136" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-185" value="Animator" 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="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
+ <mxGeometry x="1050" y="318" width="160" height="85" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-186" value="+fps" 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="PVU13nk45NJB4w4DQgDw-185" vertex="1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-187" 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="PVU13nk45NJB4w4DQgDw-185" vertex="1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-188" value="+Play(looping)" 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="PVU13nk45NJB4w4DQgDw-185" vertex="1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="PVU13nk45NJB4w4DQgDw-189" value="+Stop()" 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="PVU13nk45NJB4w4DQgDw-185" vertex="1">
+ <mxGeometry y="68" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-4" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-138">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="320" y="510" as="sourcePoint" />
+ <mxPoint x="160" y="400" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="320" y="520" />
+ <mxPoint x="110" y="520" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-9" value="*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-4">
+ <mxGeometry x="0.8037" y="-2" relative="1" as="geometry">
+ <mxPoint x="-16" y="-4" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-10" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-156">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="344" y="550" as="sourcePoint" />
+ <mxPoint x="179" y="358" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="330" y="490" />
+ <mxPoint x="300" y="490" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-11" value="*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-10">
+ <mxGeometry x="0.8037" y="-2" relative="1" as="geometry">
+ <mxPoint x="-16" y="-4" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-12" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-160">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="354" y="560" as="sourcePoint" />
+ <mxPoint x="189" y="368" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="470" y="440" />
+ <mxPoint x="494" y="440" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-13" value="*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-12">
+ <mxGeometry x="0.8037" y="-2" relative="1" as="geometry">
+ <mxPoint x="-16" y="-4" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-14" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-169">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="364" y="570" as="sourcePoint" />
+ <mxPoint x="199" y="378" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="500" y="460" />
+ <mxPoint x="630" y="460" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-15" value="*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-14">
+ <mxGeometry x="0.8037" y="-2" relative="1" as="geometry">
+ <mxPoint x="-16" y="-26" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-16" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-175">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="374" y="580" as="sourcePoint" />
+ <mxPoint x="209" y="388" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="520" y="480" />
+ <mxPoint x="770" y="480" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-17" value="*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-16">
+ <mxGeometry x="0.8037" y="-2" relative="1" as="geometry">
+ <mxPoint x="-12" y="-21" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-18" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-180">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="384" y="590" as="sourcePoint" />
+ <mxPoint x="219" y="398" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="540" y="500" />
+ <mxPoint x="960" y="500" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-19" value="0..1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-18">
+ <mxGeometry x="0.8037" y="-2" relative="1" as="geometry">
+ <mxPoint x="-16" y="-45" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-20" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--6" target="PVU13nk45NJB4w4DQgDw-185">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="394" y="600" as="sourcePoint" />
+ <mxPoint x="229" y="408" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="560" y="520" />
+ <mxPoint x="1130" y="520" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-21" value="0..*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-20">
+ <mxGeometry x="0.8037" y="-2" relative="1" as="geometry">
+ <mxPoint x="-16" y="-50" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-24" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-185" target="PVU13nk45NJB4w4DQgDw-180">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="960" y="439.38" as="sourcePoint" />
+ <mxPoint x="1220" y="440" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="1130" y="240" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-26" value="0..1" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-24">
+ <mxGeometry x="-0.7119" y="-1" relative="1" as="geometry">
+ <mxPoint x="-21" y="14" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-27" value="1..*" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="GgpaCZaR6PRI7i0rwrCe-24">
+ <mxGeometry x="0.6214" y="-1" relative="1" as="geometry">
+ <mxPoint x="3" y="14" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-138" target="PVU13nk45NJB4w4DQgDw-165">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="203" y="770" as="sourcePoint" />
+ <mxPoint x="330" y="682" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="110" y="160" />
+ <mxPoint x="380" y="160" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-152" target="PVU13nk45NJB4w4DQgDw-165">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="380" y="358" as="sourcePoint" />
+ <mxPoint x="507" y="270" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-31" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-156" target="PVU13nk45NJB4w4DQgDw-152">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="250" y="358" as="sourcePoint" />
+ <mxPoint x="377" y="270" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-32" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-160" target="PVU13nk45NJB4w4DQgDw-152">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="320" y="460" as="sourcePoint" />
+ <mxPoint x="447" y="372" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-33" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-169" target="PVU13nk45NJB4w4DQgDw-165">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="510" y="348" as="sourcePoint" />
+ <mxPoint x="637" y="260" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-34" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-175" target="PVU13nk45NJB4w4DQgDw-165">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="600" y="436" as="sourcePoint" />
+ <mxPoint x="727" y="348" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="770" y="160" />
+ <mxPoint x="590" y="160" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-36" 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;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="PVU13nk45NJB4w4DQgDw-180" target="PVU13nk45NJB4w4DQgDw-165">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="920" y="140" as="sourcePoint" />
+ <mxPoint x="570" y="124" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="960" y="116" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-37" value="ParticelSystem" 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="WIyWlLk6GJQsqaUBKTNV-1">
+ <mxGeometry x="950" y="620" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-38" 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="GgpaCZaR6PRI7i0rwrCe-37">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-39" 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="GgpaCZaR6PRI7i0rwrCe-37">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-40" 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="GgpaCZaR6PRI7i0rwrCe-37">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-45" value="PolygonCollider" 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="WIyWlLk6GJQsqaUBKTNV-1">
+ <mxGeometry x="950" y="718" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-46" 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="GgpaCZaR6PRI7i0rwrCe-45">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-47" 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="GgpaCZaR6PRI7i0rwrCe-45">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="GgpaCZaR6PRI7i0rwrCe-48" 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="GgpaCZaR6PRI7i0rwrCe-45">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+ <diagram id="YIiIl2IRF6RgPQzV_9jG" name="Example">
+ <mxGraphModel dx="1050" dy="621" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="rDWCdEblCpn9XmIhacVI-1" value="example&#xa;" 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="160" y="70" width="160" height="68" as="geometry">
+ <mxRectangle x="330" y="540" width="160" height="26" as="alternateBounds" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="rDWCdEblCpn9XmIhacVI-2" 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="rDWCdEblCpn9XmIhacVI-1">
+ <mxGeometry y="26" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="rDWCdEblCpn9XmIhacVI-3" 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="rDWCdEblCpn9XmIhacVI-1">
+ <mxGeometry y="43" width="160" height="8" as="geometry" />
+ </mxCell>
+ <mxCell id="rDWCdEblCpn9XmIhacVI-4" 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="rDWCdEblCpn9XmIhacVI-1">
+ <mxGeometry y="51" width="160" height="17" as="geometry" />
+ </mxCell>
+ <mxCell id="INcigVm9b0TAH9v99pnO-1" 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;" edge="1" parent="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="200" y="200" as="sourcePoint" />
+ <mxPoint x="160" y="160" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="BdnN9X1UdPwwrvRyySie-1" 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;" edge="1" parent="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="280" y="200" as="sourcePoint" />
+ <mxPoint x="240" y="160" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="wr2JkJuTEkJ5C-UpQk8J-1" 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;" edge="1" parent="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="360" y="200" as="sourcePoint" />
+ <mxPoint x="320" y="160" as="targetPoint" />
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="oRUFz-RLu-avQMRJHf4n-1" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="440" y="200" as="sourcePoint" />
+ <mxPoint x="400" y="160" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/glossary.bib b/glossary.bib
index 8bf48ac..fda634f 100644
--- a/glossary.bib
+++ b/glossary.bib
@@ -46,3 +46,9 @@
long = {definition of done},
}
+@abbreviation{poc,
+ short = {POC},
+ long = {proof-of-concept},
+}
+
+
diff --git a/img/ECSBlockDiagram.png b/img/ECSBlockDiagram.png
new file mode 100644
index 0000000..4d36afa
--- /dev/null
+++ b/img/ECSBlockDiagram.png
Binary files differ
diff --git a/img/ECSComponentManager.png b/img/ECSComponentManager.png
new file mode 100644
index 0000000..6602cd6
--- /dev/null
+++ b/img/ECSComponentManager.png
Binary files differ
diff --git a/img/ExtensionObjects.jpg b/img/ExtensionObjects.jpg
new file mode 100644
index 0000000..4807ff7
--- /dev/null
+++ b/img/ExtensionObjects.jpg
Binary files differ
diff --git a/meta.tex b/meta.tex
deleted file mode 100644
index db7c7b1..0000000
--- a/meta.tex
+++ /dev/null
@@ -1,9 +0,0 @@
-\organization{Avans University of Applied Sciences}
-\project{Project cr\^epe}
-\author{%
- Loek Le Blansch\and%
- Wouter Boerenkamps\and%
- Jaro Rutjes\and%
- Max Smits\and%
- Niels Stunnebrink%
-}
diff --git a/plan.tex b/plan.tex
index 6ebd73a..a67598e 100644
--- a/plan.tex
+++ b/plan.tex
@@ -1,5 +1,4 @@
\documentclass{projdoc}
-\input{meta.tex}
\title{Project Plan}
@@ -10,23 +9,16 @@
\section{Background}
This project is part of the fourth-year minor `Systems Programming in C++'. The minor
-consists of several courses troughout 20 weeks, which create the basis for this
-project. The project is focussed on building a game engine using the programming
-language C++. This document describes our plan of attack for the project.
+consists of several courses throughout 20 weeks, which create the basis for this
+project. The project focus is on building a game engine using the programming
+language C++. This document describes the plan of attack for the project.
\section{Problem Definition}
-% The assignments will be discussed with the project supervisor on specifics for this
-% project. This will give the team the ability to direct the project.
-
-% @Jaro: Ik snap niet wat je met deze zinnen wil zeggen. Het lijkt een soort van
-% background information, maar toch niet helemaal ofzo. Hoe dan ook heb ik het er nu
-% even uit gehaald en een nieuw kopje background toegevoegd.
-
\subsection{Problem Analysis}
CodedFun Games is a small, single-person game company looking to scale up. The owner,
-who is also a game programmer, and graphical artist, has received government funding,
+who is a game programmer, and graphical artist, has received government funding,
which he wants to invest in a custom-built game engine. The owner has no interest in
developing or maintaining a game engine himself, so he has hired a part-time engine
programmer. This programmer does not have time to create an entire engine but is
@@ -37,33 +29,30 @@ user-friendly. Additionally, the engine should be well-documented, which is
considered an essential aspect of being user-friendly.
So far, the client has made all his games in Unity and is very fond of the structure.
-Therefore, he wants the new engine to adhere to a similar structure. A simple
+Therefore, the client wants the new engine to adhere to a similar structure. A simple
requirements document is defined to specify how strictly this structure should be
followed.
-Finally, because the client does not want to dive deeply into the engine himself, he
-wants a secondary application (preferably a game) that can be used to test the
-engine's features. This is referred to as the \emph{validation application}.
+Finally, because the client does not want to dive deeply into the engine himself, he wants a secondary application (preferably a game) that can be used to test the engine's features. This is referred to as the \emph{validation application}.
\subsection{Goal}
-The goal is to develop a custom game engine that meets the client's requirements for
-maintainability, extensibility, user-friendliness, and adherence to a Unity-like
-structure. In addition, a validation application should be created to show and test
-the engine's features.
+The goal is to develop a custom game engine that meets the client's requirements for maintainability, extensibility, user-friendliness, and adherence to a Unity-like structure. The engine may integrate third-party software (as agreed with the client) to support specific features, such as audio, physics, and rendering. In addition, a \emph{validation application} is created to show and test the engine's features.
+
+\subsection{Scope}
+The requirements document \autocite{crepe:requirements} has several requirements with a MoSCoW `must', `should', `could' or `won't' priority to indicate the project's scope.
\subsection{Result}
-The expected result is a well-documented, custom game engine that follows a structure
-similar to Unity. Additionally, a validation application should be provided to test
-and showcase the engine's capabilities.
+The expected result is a well-documented, custom game engine that follows a structure similar to Unity. Additionally, a \emph{validation application} should be provided to test and showcase the engine's capabilities.
+
+\subsection{Validation Application}
+
+The \emph{validation application} \autocite{crepe:validation-application} is explained in a document where the features of the \emph{validation application} are linked to the user stories.
\section{Planning}
-The customer specified multiple deliverables troughout the 20 weeks of this project.
-Despite the fact that 20 weeks have been reserved for this project, the intention is
-that the game will be delivered in week 17. Any delay/resit will take place between
-weeks 17 and 20. A rough planning can be found in \cref{tab:planning}.
+The customer specified multiple deliverables throughout the 20 weeks of this project. Despite the fact that 20 weeks have been reserved for this project, the game will be delivered in week 17. Any delay/resit will take place between weeks 17 and 20. A rough planning can be found in \cref{tab:planning}.
\begin{table}
\begin{tabularx}{\linewidth}{lX}
@@ -71,10 +60,9 @@ weeks 17 and 20. A rough planning can be found in \cref{tab:planning}.
\textbf{Week\#} & \textbf{Deliverable}\\
\midrule
4 & Project Plan\\
- 7 & Requirements document\\
+ 7 & Some POCs\\
10 & POCs and Design document\\
- 17 & Game engine, Validation application, Research document, and Qualification
- document\\
+ 17 & Game engine, \emph{validation application}\\
\bottomrule
\end{tabularx}
\caption{Planning}
@@ -83,10 +71,10 @@ weeks 17 and 20. A rough planning can be found in \cref{tab:planning}.
\section{Risks}
-\subsection{Techincal Risks}
+\subsection{Technical Risks}
\begin{description}
- \item[Multiplatform] The team works in both linux and windows, which poses a risk
+ \item[Multiplatform] The team works in both Linux and windows, which poses a risk
for the development if there is a platform dependency.
\item[Integration] Users can make a wrong integration causing for delay or risk of
losing code.
@@ -98,21 +86,22 @@ weeks 17 and 20. A rough planning can be found in \cref{tab:planning}.
\item[Scope Expansion] There is a risk of creating a scope that is bigger than the
requirements. Lack of Team Collaboration: Insufficient collaboration among team
members may hinder progress.
+ \item[Lack of Team Collaboration] Within the team a lack of collaboration can result in miscommunication or delay in work.
+ \item[Falling out of specific team member] Within the team the scrum master and integrator have additional roles. If one or both members can not continue it can hinder progress of the project.
\end{description}
\subsection{Measures}
\begin{description}
\item[Multiplatform] The team can switch any time to a single platform, so this
- risk is metigated.
+ risk is mitigated.
\item[Integration] By following standards and having an integrator, which checks
- every pull request, this risk is minimilised.
+ every pull request, this risk is minimized.
\item[Scope Expansion] By writing detailed requirements and having weekly team
meetings, to check if the progress is within the scope, should be sufficient to
decrease the risk.
- \item[Lack of Team Collaboration] Weekly team meetings will result in collaboration
- among team members and discussing what each other tasks is, will decease this
- risk.
+ \item[Lack of Team Collaboration] Weekly team meetings will result in collaboration among team members and discussing what each other tasks is, will decease this risk.
+ \item[Falling out of specific team member] The scrum master can be taken over by any other team member. All tools (e.g. scrum board) are open to all members. The tasks of the integrator can be taken over by the team. Within GitHub the team as a whole has the same rights as the integrator.
\end{description}
\section{Documentation}
@@ -128,11 +117,8 @@ This project consists of seven main documents:\noparbreak
project, including timelines, milestones, roles, and responsibilities.
\item[Requirements] Details the requirements and user stories, including both
functional and non-functional requirements.
- \item[Research] Consists of all research related to this project.
\item[Design] Describes the design choices, including architecture, user interface,
and system components.
- \item[Qualification] Includes test cases, test plans, and quality measures to
- ensure the project meets its requirements and standards.
\item[Working hours] A table which includes all working hours of each team member.
\item[API Reference] Details the available endpoints, request and response formats,
authentication methods, error codes, and examples for interacting with the
@@ -152,28 +138,28 @@ protocols for handling absences or delays, guidelines for addressing inconsisten
participation, and procedures for weekly updates and meetings. All team members
reviewed and agreed to these terms.
-\subsection{Project roles}
+\subsection{Project Roles}
\begin{description}
\item[Loek Le Blansch] Integrator
\item[Wouter Boerenkamps] Project Member
\item[Jaro Rutjes] Team Leader / Scrum Master
- \item[Max Smits] Project Member
+ \item[Max Smits] Project Member / Product Owner
\item[Niels Stunnebrink] Project Member
\end{description}
-\subsection{Work hours}
+\subsection{Work Hours}
Each project member will keep track of their own working hours and add them to the
`file'.
-\subsection{Absence or delay}
+\subsection{Absence or Delay}
-If a project member is going to be absent or delayed, they are required to
-notify the team through either WhatsApp or Outlook. Additionally, the teacher
+If a project member is going to be absent or delayed, they are required to
+notify the team through either WhatsApp or Outlook. Additionally, the teacher
should be informed of the absence as well.
-\subsection{Inconsistent participation}
+\subsection{Inconsistent Participation}
Inconsistent participation will be addressed in a structured manner:
@@ -192,9 +178,9 @@ will be necessary in such cases. However, if the inconsistency is due to other
factors, potential repercussions may include additional assignments or actions as
determined by the project supervisor.
-A team member is considered to have inconsistent participation if their hours
-are significantly behind the team’s average or if tasks are not completed
-without valid reasons. It is essential that any concerns regarding a team
+A team member is considered to have inconsistent participation if their hours
+are significantly behind the team’s average or if tasks are not completed
+without valid reasons. It is essential that any concerns regarding a team
member's performance, should be resolved through unanimous agreement within the team.
\subsection{Weekly Update}
@@ -204,9 +190,9 @@ before 12:00 on Friday. Personal updates may also be included and will be
confidential between the team member, the Team Leader, and/or the teacher, if
requested.
-Jaro Rutjes will compile and send a team update to the project supervisor, Bob
-van der Putten, also by Friday. This update will include technical information
-on what has been accomplished, plans for upcoming work, and an overview of the
+Jaro Rutjes will compile and send a team update to the project supervisor, Bob
+van der Putten, also by Friday. This update will include technical information
+on what has been accomplished, plans for upcoming work, and an overview of the
team's overall progress.
\subsection{Weekly Meetings}
@@ -222,8 +208,7 @@ project needs.
% Information about how and when Scrum will be used in this project (using Miro).
\section{Scrum (Miro)}
-The team will start using scrum after the initial phase, of structering the project,
-is finished. This phase is over when proof of concepts are being made.
+The team starts using scrum after the initial phase, of structuring the project, is finished. This phase is finished after a initial design of the product is made.
\subsection{Scrum Board}
@@ -249,43 +234,31 @@ To manage tasks effectively:
\begin{itemize}
\item A task from the \emph{Current Sprint} tab should be selected and moved to the
- \emph{In Progress} tab when work begins.
+ \emph{In Progress} tab when work begins.
\item The status of the task should be updated to \emph{In Progress} as soon as
work starts.
\item Once the task is completed and reviewed, it should be moved to the
\emph{Done} tab, and its status should be updated to \emph{Done}.
\end{itemize}
-Each task or user story will be assigned user points, which indicate the relative
-size or complexity of the task compared to these examples.
-% TODO: add examples
+Each task or user story will be assigned user points, which indicate the relative size or complexity of the task. Examples of certain tasks will be available in the scrumboard.
\subsection{Burn Down Chart}
The Burn Down Chart will be generated using Excel from the Scrum board data every
week. Each user story or task marked as done, will burn the chart downwards. This
-Burn Down Chart is shared in the weekly updates with the team and the project
-supervisor.
+Burn Down Chart is shared in the weekly updates with the team.
% Information regarding the git workflow of this project.
-% TODO: Diagram explaining the workflow
\section{Git Workflow}
GitHub is used for version management of both code \autocite{crepe:code-repo} and
documentation \autocite{crepe:docs-repo}, each in its own respective repository. This
-keeps the documentation and code seperate, resulting in ordened and manageable
+keeps the documentation and code separate, resulting in ordered and manageable
repositories.
-\subsection{Git New Branch}
-
-% TODO: add here details from contributing.md?
-
-\subsection{Git Merge To Master}
-
-% TODO: add here diagram on what actions are taken before merge.
-
-\subsection{Code Standard}
+\subsection{Code Standard and Git Workflow}
-The code standard can be found in the contributing.md \autocite{crepe:code-standard}.
+The code standard and the git workflow can be found in the contributing.md \autocite{crepe:code-standard}.
\end{document}
diff --git a/projdoc.cls b/projdoc.cls
index ee94835..8a2c05d 100644
--- a/projdoc.cls
+++ b/projdoc.cls
@@ -1,6 +1,19 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{projdoc}[2024-09-03 class projdoc]
+% project defaults
+\makeatletter
+\def\@project{Project cr\^epe}
+\def\@organization{Avans University of Applied Sciences}
+\def\@author{%
+ Loek Le Blansch\and%
+ Wouter Boerenkamps\and%
+ Jaro Rutjes\and%
+ Max Smits\and%
+ Niels Stunnebrink%
+}
+\makeatother
+
% based on article
\LoadClass{article}
@@ -160,9 +173,7 @@
% \maketitle format
\makeatletter
-\let\@project\relax
\def\project#1{\def\@project{#1}}
-\let\@organization\relax
\def\organization#1{\def\@organization{#1}}
\def\@maketitle{%
\centering%
@@ -397,3 +408,6 @@
}
\makeatother
+% missing reference marker
+\def\mref{\textsuperscript{\textit{\,ref?}}}
+
diff --git a/reqs.toml b/reqs.toml
index 35c7a96..ed0b451 100644
--- a/reqs.toml
+++ b/reqs.toml
@@ -62,7 +62,9 @@ The public audio \gls{api} allows the game programmer to control the volume of
audio samples.
'''
-[aux:license]
+# TODO: audio encoding support?
+
+[lib:license]
type = 'system'
priority = 'must'
description = '''
@@ -70,3 +72,15 @@ External libraries must have a license that is MIT-compatible, or one that
allows linking against MIT code.
'''
+[lib:platform]
+type = 'system'
+priority = 'must'
+description = '''
+External libraries must have cross-platform support for at least Linux and
+Windows.
+'''
+
+# TODO: library popularity as quality factor?
+# TODO: library documentation as quality factor?
+# TODO: modularity over less libraries? (i.e. why don't we just SDL2 everything?)
+
diff --git a/requirements.tex b/requirements.tex
index be0e103..6b4a87a 100644
--- a/requirements.tex
+++ b/requirements.tex
@@ -1,5 +1,4 @@
\documentclass{projdoc}
-\input{meta.tex}
\makeatletter
\projdoc@description@leftmargin=2ex
diff --git a/research.tex b/research.tex
index 5340bf5..5aa7c4f 100644
--- a/research.tex
+++ b/research.tex
@@ -1,5 +1,4 @@
\documentclass{projdoc}
-\input{meta.tex}
\title{Research document}
@@ -24,7 +23,7 @@ A game engine is not the game itself but a platform with which games are built.
should provide the functionalities with which the game is constructed. The purpose of
a game engine is not to create data out of nothing. Instead, data is read, and the
correlating features and effects are generated. However, the engine is also used to
-create these files, referred to as ``assets.'' The game engine must be able to accept
+create these files, referred to as ``assets''. The game engine must be able to accept
a certain format of these assets---whether levels, sprites, or textures---and convert
them into usable data.
@@ -72,28 +71,98 @@ such Decorator design pattern, is that the interface of all components should be
same (they should share the same methods), because the client (which is the scene in
our case) can only call/reach the components through the interface. This would
require very general methods (at the interface), which might make the programming
-harder \autocite{man:DecoratorDesignPattern,man:Decorator}.
+harder \autocite{man:DecoratorDesignPattern}.
\begin{figure}
\centering
- \includepumldiag{img/decorator-design-pattern.puml}
+ \includegraphics[width=0.5\textwidth]{img/DecoratorDesignPattern.png}
\caption{Decorator design pattern}
Source: \autocite{img:Decorator}
\label{fig:decorator}
\end{figure}
-TODO: Add Extension Objects design pattern (if this is applicable)!
+The Extension Objects design pattern (as shown in \cref{fig:extension objects}) could
+also be used to structure the game engine. The Extension Objects design pattern
+allows to modify an object's propperties/behavior by adding one (or more) Extensions.
+The object that is modified, could be the gameObject and the components could be the
+Extensions. This is quite the same as the required API. An advantage is, that the
+client (which is the scene in our case) can call all kind of different Extension's
+methods (depending on the kind of Externsion, e.g.~the method \codeinline{render()}
+for the sprite Extension and the method \codeinline{update()} for the script
+Extension). In other words, the interfaces of the different Extensions should not be
+the same. This is way more flexible than the Decorator design pattern. A disadvantage
+is that the data and functionality are in the same class (namely inside the Extion's
+methods), so it's not sepperated. Another disadvantage is that the Extension Objects
+design pattern can be quite slow, because objects are scattered in memory (and it is
+very hard to quickly get their memory address)
+\autocite{man:ExtensionObjectDesignPattern, man:extionsionObjectsStackOverflow}.
+
+\begin{figure}
+ \centering
+ \includegraphics[width=0.5\textwidth]{img/ExtensionObjects.jpg}
+ \caption{Extension Objects design pattern}
+ Source: \autocite{img:extionsionObjects}
+ \label{fig:extension objects}
+\end{figure}
Another (very popular) design pattern to structure the game engine, is the Entity
-Component System (\gls{ecs}). The \gls{ecs} is made out of three main subsystems,
-namely entities, components and systems. Entities are just IDs. An entity is made out
-of a gameObject and one (or more) components. Components are the classes that hold
-the data. The components determine what kind of entity it is (e.g. a sprite, audio,
-and so on). Systems take care of the behavior of the entities. Systems mainly read
-and write the enity's components data. The \gls{ecs} clearly distinguishes the data
-(components) from the functionality (systems).
+Component System (\gls{ecs}) (as shown in \cref{fig:ECS Block Diagram}). The
+\gls{ecs} is made out of three main subsystems, namely entities, components and
+systems. Entities are just IDs. An entity is made out of a gameObject and one (or
+more) components. Components are the classes that hold the data. The components
+determine what kind of entity it is (e.g.~a sprite, audio, and so on). Systems take
+care of the behavior of the entities. Systems mainly read and write the enity's
+components data. The \gls{ecs} clearly distinguishes the data (components) from the
+functionality (systems), which is an advantage.
+
+\begin{figure}
+ \centering
+ \includegraphics[width=0.5\textwidth]{img/ECSBlockDiagram.png}
+ \caption{ECS design pattern}
+ Source: \autocite{img:ECSBlockDiagram}
+ \label{fig:ECS Block Diagram}
+\end{figure}
-% TODO: Continue this explanation (also add some diagrams to make the ECS more clear)!
+The \gls{ecs} is normally equipped with a component manager (as shown in
+\cref{fig:ECS Component manager}). The component manager keeps track of the entities
+(Alien, Player, Target, etc in \cref{fig:ECS Component manager}) and the connected
+components (Position, Movement, Render, etc in \cref{fig:ECS Component manager}). The
+component manager stores two lists (key value pairs). The key of the first list is
+the ID of an entity, and the value of this list are the connected components. The key
+of the second list is the component, and the value of this list are the entities that
+have this component. These two lists make it possible to very quickly gather
+components or entities. This makes the \gls{ecs} very fast, which is of course an
+advantage \autocite{man:ECSComponentManager}.
+
+\begin{figure}
+ \centering
+ \includegraphics[width=0.5\textwidth]{img/ECSComponentManager.png}
+ \caption{ECS Component manager}
+ Source: \autocite{img:ECSComponentSystem}
+ \label{fig:ECS Component manager}
+\end{figure}
+
+Another aspect that makes the \gls{ecs} very fast, is that a system can handle all
+components (of the same type) together at once. This is possible because all entities
+are independent of each other.
+
+There are many ways of implementing the systems. Some say that each component type
+has their own system. This interpretation of the systems does not take the interplay
+of different component types, into account. A less restrictive approach is to let
+different systems deal with all components they should be concerned with. For
+instance a Physics Systems should be aware of Collision Components and Rigidbody
+Components, as both probably contain necessary information regarding physics
+simulation. It's best to see systems as ``closed environments''. That is, they do not
+take ownership of entities nor components. They do access them through independent
+manager objects, which in turn will take care of the entities and components
+life-cycle \autocite{man:ECSExplanation}.
+
+Sometimes systems, entities and even components need to cummincate with each other.
+This might be very hard because systems, entities and components are more or less
+independent. One option is to use an event systems. A system, entity and component
+can raise an event and other systems, entities and components can react to that
+event. This is what makes the \gls{ecs} a complicated system (disadvantage)
+\autocite{man:ECSExplanation}.
There are many C/C++ libraries available, completely dedicated to \gls{ecs}. The most
popular libraries are shown in \cref{tab:popularECSLibraries}. The popularity is
@@ -115,12 +184,56 @@ based on the amount of stars on GitHub.
\label{tab:popularECSLibraries}
\end{table}
+TODO: Add library benchmark to find the best library.
+
It is, of course, not necessary to use a library to implement an \gls{ecs}
architecture. However, it seems very hard to achieve the same performance as a
library \autocite{github:ecsfaq}.
\subsection{Conclusion}
+\section{Gameobjects/components}
+\label{sec:Gameobjects/components}
+
+\subsection{Introduction}
+
+One of the requirements of our customer, is that the game engine's structure is
+similar to Unity. The customer has created a class diagram of the game engine's API,
+which is (of course) very similar to Unity. One of the most important parts of the
+class diagram is a so-called gameObject (with several components). It's needed to
+understand the exact meaning/function of these gameObjects, that's why this research
+question arose.
+
+\subsection{Findings}
+
+A gameObject is the most important concept in Unity. Every object in a game is a
+GameObject, from characters and collectible items to the lights, cameras and special
+effects. However, a gameObject itself can't do anything on its own. A gameObject
+needs to be given properties before it can become a character, an envirnment, or a
+special effect. \autocite{man:unityGameobjects}
+
+A gameObject can be seen as a container for components. Components are the properties
+of the gameObject. A few examples of components are sprites, animators, audioSources,
+and so on. Multiple (different) components can be assigned to a single gameObject
+(e.g.~a sprite and an audioSource).
+
+Since we now know that a gameObject needs components to do something, it's obvious
+that there should be a way to add components to a gameObject. Some components
+(e.g.~the behaviorScript component) should also be able to reference to its
+gameObject.
+
+Each gameObject always has one transform class. The transform class describes the
+position, rotation, and scale within the scene. Some component use this information
+to e.g.~scale a sprite. Other components eddit this information to e.g.~model
+gravity. \autocite{man:unityTransformClass}
+
+A gameObject can have one (or multiple) children gameObject(s). All children
+gameObjects, of course, also have one transform class. However, the position,
+rotation, and scale of this class, is always the same as the child's parent. A child
+can not have more than one parent. \autocite{man:unityTransformClass}
+
+\subsection{Conclusion}
+
\section{Third-party Tools}
\subsection{Introduction}
@@ -240,45 +353,50 @@ for audio some options could be: FMOD, Wwise, or iirKlang
\subsection{Conclusion}
-% TODO: this entire section
\section{Audio}
-% should audio research be scoped down to SDL2 (if that's what we're going with) or
-% standalone libraries only (for modularity?).
-
-The game engine is required to have an audio system with support for playing multiple
-audio streams (i.e.~tracks or samples) simultaniously. Since writing a custom live
-audio mixing engine is outside the scope of this project, this section compares
-various standalone audio engines that could be used in the engine.
+The game engine is required to have an audio system
+\autocite[\ref{req:audio}]{crepe:requirements}. Since writing a custom real-time
+audio mixing engine is outside the scope of this project\mref, this section compares
+various standalone audio libraries for suitability in the engine.
+
+\subsection{Libraries}
+\label{sec:audio:libs}
+
+After searching for libraries (search terms: `dynamic/adaptive audio', `real-time
+audio', `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}
+
+Of these libraries the following were determined to be unsuitable for use in this
+project due to various reasons:\noparbreak
+\begin{description}
+ \item[FMOD \autocite{lib:fmod}] Is proprietary (violates \cref{req:lib:license})
+ \item[PortAudio \autocite{lib:portaudio}] Does not handle mixing
+ \item[miniaudio \autocite{lib:miniaudio}] With finished \gls{poc}, but dropped due
+ to very limited codec support (WAV, MP3 and FLAC only); Also does not have an
+ \gls{api} reference (only programming manual)
+ \item[YSE \autocite{lib:yse}] Attempted to write \gls{poc}, but CMake configuration
+ in repository is broken; This project seems to have been abandoned
+\end{description}
-% TODO: requirements first!
+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}.
-% REQ ~ is cross-platform
-% REQ ~ supports multiple audio formats (TODO: which)
-% REQ ~ supports simultanious playback / mixing
-% REQ ~ has an open-source license
-\begin{table}
- \centering
- \begin{tabular}{llc}
- \toprule
- \textbf{Library} & \textbf{License} & \textbf{API}\\
- \midrule
- miniaudio & MIT-0 & C\\
- YSE & EPL & C++\\
- SoLoud & Zlip/LibPng & C++\\
- \bottomrule
- \end{tabular}
- \caption{Audio engine library comparison}
- \label{tab:audio-engines}
-\end{table}
-% TODO: ref https://miniaud.io/
-% TODO: ref https://www.attr-x.net/yse/
+\subsection{Conclusion}
+\label{sec:audio:conclusion}
-Not considered further:
-\begin{description}
- \item[FMOD] is proprietary
- \item[PortAudio] requires manual mixing
-\end{description}
+Due to a severe shortage of libraries that fit our requirements, SoLoud appears to be
+the most suitable (and only) audio library for use in this project.
\section{Physics}
@@ -304,48 +422,6 @@ Not considered further:
\subsection{Conclusion}
-\section{Gameobjects/components}
-\label{sec:Gameobjects/components}
-
-\subsection{Introduction}
-
-One of the requirements of our customer, is that the game engine's structure is
-similar to Unity. The customer has created a class diagram of the game engine's API,
-which is (of course) very similar to Unity. One of the most important parts of the
-class diagram is a so-called gameObject (with several components). It's needed to
-understand the exact meaning/function of these gameObjects, that's why this research
-question arose.
-
-\subsection{Findings}
-
-A gameObject is the most important concept in Unity. Every object in a game is a
-GameObject, from characters and collectible items to the lights, cameras and special
-effects. However, a gameObject itself can't do anything on its own. A gameObject
-needs to be given properties before it can become a character, an envirnment, or a
-special effect. \autocite{man:unityGameobjects}
-
-A gameObject can be seen as a container for components. Components are the properties
-of the gameObject. A few examples of components are sprites, animators, audioSources,
-and so on. Multiple (different) components can be assigned to a single gameObject
-(e.g.~a sprite and an audioSource).
-
-Since we now know that a gameObject needs components to do something, it's obvious
-that there should be a way to add components to a gameObject. Some components
-(e.g.~the behaviorScript component) should also be able to reference to its
-gameObject.
-
-Each gameObject always has one transform class. The transform class describes the
-position, rotation, and scale within the scene. Some component use this information
-to e.g. scale a sprite. Other components eddit this information to e.g.~model
-gravity. \autocite{man:unityTransformClass}
-
-A gameObject can have one (or multiple) children gameObject(s). All children
-gameObjects, of course, also have one transform class. However, the position,
-rotation, and scale of this class, is always the same as the child's parent. A child
-can not have more than one parent. \autocite{man:unityTransformClass}
-
-\subsection{Conclusion}
-
\section{AI}
\subsection{Introduction}
diff --git a/scripts/reqs2tex.py b/scripts/reqs2tex.py
index 31303ff..2bab558 100755
--- a/scripts/reqs2tex.py
+++ b/scripts/reqs2tex.py
@@ -75,7 +75,7 @@ def convert(reqs):
reqs = [item for item in reqs if item[KEY.DELETED] == False]
# sort by label
- reqs = sorted(reqs, key=lambda req: req[KEY.LABEL])
+ reqs = sorted(reqs, key=lambda item: item[KEY.LABEL])
return reqs
diff --git a/sources.bib b/sources.bib
index bf04165..a34f739 100644
--- a/sources.bib
+++ b/sources.bib
@@ -29,7 +29,7 @@
@misc{crepe:docs-repo,
author = {Loek Le Blansch and Wouter Boerenkamps and Jaro Rutjes and Max Smits and Niels Stunnebrink},
title = {Crepe Documentation Repository},
- url = {https://github.com/lonkaars},
+ url = {https://github.com/lonkaars/crepe-docs},
date = {2024-09-10},
}
@@ -47,6 +47,56 @@
date = {2024-09-10},
}
+@online{lib:miniaudio,
+ title = {miniaudio - A single file audio playback and capture library.},
+ % author = {David Reid},
+ url = {https://miniaud.io/docs/manual/index.html},
+ urldate = {2024-09-22},
+}
+
+@online{lib:yse,
+ title = {YSE - cross-platform sound engine},
+ url = {https://www.attr-x.net/yse},
+ urldate = {2024-09-18},
+}
+
+@online{lib:soloud,
+ title = {SoLoud},
+ % author = {Jari Komppa},
+ url = {https://solhsa.com/soloud},
+ urldate = {2024-09-18},
+}
+
+@online{lib:fmod,
+ title = {FMOD},
+ url = {https://www.fmod.com},
+ urldate = {2024-09-18},
+}
+
+@online{lib:portaudio,
+ title = {PortAudio - an Open-Source Cross-Platform Audio API},
+ url = {https://www.portaudio.com},
+ urldate = {2024-09-18},
+}
+
+@online{tool:perf,
+ title = {\texttt{perf:} Linux profiling with performance counters},
+ url = {https://perf.wiki.kernel.org/index.php/Main_Page},
+ urldate = {2024-09-18},
+}
+
+@report{crepe:requirements,
+ author = {Loek Le Blansch and Wouter Boerenkamps and Jaro Rutjes and Max Smits and Niels Stunnebrink},
+ title = {Requirements},
+ date = {2024-09-18},
+}
+
+@misc{crepe:validation-application,
+ author = {Loek Le Blansch and Wouter Boerenkamps and Jaro Rutjes and Max Smits and Niels Stunnebrink},
+ title = {Validation Application},
+ date = {2024-09-10},
+}
+
@misc{github:awesome-ecs,
author = {Sangjun Lee},
title = {Awesome Entity Component System},
@@ -84,7 +134,7 @@
date = {2024}
}
-@manual{man:DecoratorDesignPattern,
+@manual{man:ExtensionObjectDesignPattern,
title = {Extension Object Design Pattern},
author = {James Fawcett},
organization = {Syracuse University},
@@ -92,7 +142,7 @@
date = {2024}
}
-@manual{man:Decorator,
+@manual{man:DecoratorDesignPattern,
title = {Decorator Design Pattern},
author = {Refactoring Guru},
organization = {Refactoring Guru},
@@ -100,3 +150,48 @@
date = {2024}
}
+@misc{img:extionsionObjects,
+ title = {Extension Objects Diagram},
+ author = {stackoverflow},
+ url = {https://i.sstatic.net/GoIQ6.jpg},
+ date = {2024}
+}
+
+@manual{man:extionsionObjectsStackOverflow,
+ title = {Extension Object Design Pattern},
+ author = {Supun Wijerathne},
+ organization = {stackoverflow},
+ url = {https://stackoverflow.com/questions/39331752/what-is-the-difference-between-extension-objects-pattern-and-adapter-pattern},
+ date = {2016}
+}
+
+@misc{img:ECSBlockDiagram,
+ title = {ECS Diagram},
+ author = {Unity},
+ url = {https://docs.unity3d.com/Packages/com.unity.entities@0.1/manual/images/ECSBlockDiagram.png},
+ date = {2024}
+}
+
+@misc{img:ECSComponentSystem,
+ title = {ECS Component System},
+ author = {Joel van der Werf},
+ url = {https://i.imgur.com/VMQFIjW.png},
+ date = {2024}
+}
+
+@manual{man:ECSExplanation,
+ title = {The Entity Component System C++ Game Design Pattern - Part 1},
+ author = {GameDev.net},
+ organization = {GameDev.net},
+ url = {https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/the-entity-component-system-c-game-design-pattern-part-1-r4803/},
+ date = {2024}
+}
+
+@manual{man:ECSComponentManager,
+ title = {ECS Core API},
+ author = {Unity Technologies},
+ organization = {Unity},
+ url = {https://docs.unity3d.com/Packages/com.unity.entities@0.1/manual/ecs_core.html},
+ date = {2024}
+}
+
diff --git a/style.md b/style.md
index c518e7c..8dca81b 100644
--- a/style.md
+++ b/style.md
@@ -4,6 +4,28 @@ LaTeX commands and LaTeX source style requirements are detailed in
a number of frequently used snippets that may be used as a cheat-sheet style
reference.
+# General rules
+
+- All documentation is written in U.S. English
+- Section headers are in sentence case (i.e. only the first word and proper
+ nouns are capitalized)
+- Section headers should not contain punctuation (e.g. no question marks, "or"
+ instead of a slash, etc.)
+- Quotes are closed before punctuation marks.
+- Do not use contractions, modal adverbs or rhetorical questions.
+
+# References
+
+- Citations are inserted before the full stop at the end of a sentence.
+- When a library or piece of software is introduced in a document, reference
+ the project homepage using the bibliography.
+- Direct quotations or paraphased text must be cited.
+- Acronyms, abbreviations and jargon reference the glossary.
+- All figures and tables must be referenced in the body text. Don't write
+ paragraphs that 'lead up' to figures, as this forces LaTeX to not break the
+ page between the paragraph and figure.
+- Figures from third-party sources must be cited.
+
# Fonts
The documents use the following fonts. All of these are free and open source,
@@ -27,15 +49,18 @@ workshop and VimTeX.
[texgyreschola-math]: https://www.gust.org.pl/projects/e-foundry/tg-math/download/index_html#Schola_Math
[jetbrains-mono]: https://www.jetbrains.com/lp/mono
-# Spelling
+# Figures
-- All documentation is written in U.S. English
-- Section headers are in sentence case (i.e. only the first word and proper
- nouns are capitalized)
+Non-raster figures are preferred over rasterized figures (where applicable).
+Please note that LaTeX does not support SVG images, and these need to be
+converted to PDF (e.g. using `svg2pdf` on linux).
+
+Raster images should only be used when the source is already in a raster format
+(e.g. for photos) or when otherwise impractical.
-# Grammar
+# Specific rules
-## Comma And
+## Comma and
**In lists**, the last element is mentioned using the word 'and', *without* a
comma.
@@ -50,27 +75,3 @@ consistency.
>
> Action X was performed, and this had Y impact.
-# Figures
-
-Non-raster figures are preferred over rasterized figures (where applicable).
-Please note that LaTeX does not support SVG images, and these need to be
-converted to PDF (e.g. using `svg2pdf` on linux).
-
-Raster images should only be used when the source is already in a raster format
-(e.g. for photos) or when otherwise impractical.
-
-# References
-
-- When a library or piece of software is introduced in a document, reference
- the project homepage using the bibliography.
-- Direct quotations or paraphased text must be cited.
-- Acronyms, abbreviations and jargon reference the glossary.
-- All figures and tables must be referenced in the body text. Don't write
- paragraphs that 'lead up' to figures, as this forces LaTeX to not break the
- page between the paragraph and figure.
-
-# Document structure
-
-- Use `\section`, `\subsection`, `\subsubsection` and `\paragraph` to insert
- headings.
-
diff --git a/time.txt b/time.txt
index 020c578..47b02e3 100644
--- a/time.txt
+++ b/time.txt
@@ -39,6 +39,11 @@ loek: 2024-09-19 15m project meeting
loek: 2024-09-19 1h30m project meeting
loek: 2024-09-19 45m project meeting
loek: 2024-09-19 15m docs :: remove versioning
+loek: 2024-09-19 30m PR merge and style guide update
+loek: 2024-09-22 2h15m docs :: research
+loek: 2024-09-24 1h45m project meeting
+loek: 2024-09-25 3h implementation :: audio facade and API
+loek: 2024-09-26 2h project meeting
max: 2024-09-02 1h project kickoff
max: 2024-09-02 45m first project meeting
@@ -119,6 +124,7 @@ niels: 2024-09-19 15m project meeting
niels: 2024-09-19 1h30m project meeting
niels: 2024-09-19 45m project meeting
niels: 2024-09-19 15m PvA reviewing
+niels: 2024-09-22 2h30m Adding spritesheet functionalities
jaro: 2024-09-02 1h project meeting :: project kickoff
jaro: 2024-09-02 45m project meeting
diff --git a/timerep.tex b/timerep.tex
index 7590217..34a30ea 100644
--- a/timerep.tex
+++ b/timerep.tex
@@ -1,5 +1,4 @@
\documentclass{projdoc}
-\input{meta.tex}
\title{Time Report}