diff --git a/.gitignore b/.gitignore
index b23e403..d9bdc4e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,23 @@
-/src/resource_manager/resource_texture_factory.o
*.o
+bin/world_folder
+bin/Debug
+bin/Release
+*.depend
+*.layout
+*~
+*.log
+.vs
+bin/bin/
+doc/be.aux
+doc/be.log
+doc/be.out
+doc/be.synctex.gz
+doc/be.toc
+
*.toc
*.aux
*.log
*.out
-*.synctex.gz
+*.synctex.gz
+cell_*_*.xml
+
diff --git a/.vs/launch.vs.json b/.vs/launch.vs.json
new file mode 100644
index 0000000..576d50f
--- /dev/null
+++ b/.vs/launch.vs.json
@@ -0,0 +1,13 @@
+{
+ "version": "0.2.1",
+ "defaults": {},
+ "configurations": [
+ {
+ "type": "default",
+ "project": "CMakeLists.txt",
+ "projectTarget": "owman.exe (src\\Debug\\owman.exe)",
+ "name": "owman.exe (src\\Debug\\owman.exe)",
+ "currentDir": "${workspaceRoot}\\bin"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..288500c
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,49 @@
+#
+# Open World Manager
+#
+
+cmake_minimum_required(VERSION 3.2)
+
+#
+# Building in-tree is not allowed (we take care of your craziness).
+#
+
+if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
+ message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the source code and call cmake from there. Thank you.")
+endif()
+
+#
+# Project configuration
+#
+
+project(owman VERSION 0.0.1)
+
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Debug)
+endif()
+
+find_package(OpenGL REQUIRED)
+find_package(sdl2 REQUIRED)
+find_package(glm REQUIRED)
+find_package(unofficial-box2d REQUIRED)
+find_package(GLEW REQUIRED)
+#
+# Compiler stuff
+#
+set(CMAKE_CXX_EXTENSIONS OFF)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+
+include_directories(${owman_SOURCE_DIR}/src)
+
+add_subdirectory(src)
+
+#
+# AOB
+#
+
+add_custom_target(
+ owman_aob
+ SOURCES
+ LICENSE
+)
diff --git a/CMakeSettings.json b/CMakeSettings.json
new file mode 100644
index 0000000..2685da0
--- /dev/null
+++ b/CMakeSettings.json
@@ -0,0 +1,19 @@
+{
+ "configurations":
+ [
+ {
+ "name": "x86-Debug",
+ "generator": "Visual Studio 15 2017",
+ "configurationType": "Debug",
+ "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-m -v:minimal",
+ "variables": [
+ {
+ "name": "CMAKE_TOOLCHAIN_FILE",
+ "value": "C:/Users/Public/vcpkg/scripts/buildsystems/vcpkg.cmake"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index d233460..9ab57e4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
# OWMAN
Open world game streaming manager
+
+
diff --git a/bin/cell_templates/cell_0.xml b/bin/cell_templates/cell_0.xml
new file mode 100644
index 0000000..42b1310
--- /dev/null
+++ b/bin/cell_templates/cell_0.xml
@@ -0,0 +1,195 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 223.853
+ 111.635
+
+
+ pokemon_center
+ 64
+ 64
+ 3
+
+
+ box
+ 64
+ 64
+ 0
+
+
+
+
+ 38
+ 70
+
+
+ tree0
+ 38
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 88
+ 85
+
+
+ tree1
+ 42
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 40
+ 120
+
+
+ tree2
+ 38
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 140
+ 220
+
+
+ fence_16
+ 127
+ 13
+ 5
+
+
+ box
+ 127
+ 13
+ 0
+
+
+
+
+ 77
+ 192
+
+
+ fence_side
+ 3
+ 56
+ 6
+
+
+ box
+ 3
+ 56
+ 0
+
+
+
+
+ 205
+ 192
+
+
+ fence_side
+ 3
+ 56
+ 6
+
+
+ box
+ 3
+ 56
+ 0
+
+
+
+
+ 96
+ 166
+
+
+ fence_5
+ 39
+ 13
+ 7
+
+
+ box
+ 39
+ 13
+ 0
+
+
+
+
+ 170
+ 166
+
+
+ fence_9
+ 71
+ 13
+ 7
+
+
+ box
+ 71
+ 13
+ 0
+
+
+
+
+ 95
+ 190
+
+
+ ball
+ 10
+ 10
+ 4
+
+
+ circle
+ 5
+ 1
+
+
+
+
+
diff --git a/bin/cell_templates/cell_1.xml b/bin/cell_templates/cell_1.xml
new file mode 100644
index 0000000..a09b9a1
--- /dev/null
+++ b/bin/cell_templates/cell_1.xml
@@ -0,0 +1,106 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 125
+ 165
+
+
+ castle
+ 102
+ 180
+ 12
+
+
+ box
+ 98
+ 50
+ 0
+
+
+
+
+ 70
+ 100
+
+
+ tree6
+ 40
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 70
+ 54
+
+
+ tree6
+ 40
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 180
+ 100
+
+
+ tree6
+ 40
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 180
+ 54
+
+
+ tree6
+ 40
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_10.xml b/bin/cell_templates/cell_10.xml
new file mode 100644
index 0000000..07be574
--- /dev/null
+++ b/bin/cell_templates/cell_10.xml
@@ -0,0 +1,178 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 200
+ 112
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 207
+ 31
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 55
+ 88
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 88
+ 55
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 43
+ 200
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 144
+ 180
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 120
+ 140
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 30
+ 30
+
+
+ tree9
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 133
+ 49
+
+
+ tree2
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_11.xml b/bin/cell_templates/cell_11.xml
new file mode 100644
index 0000000..c53477c
--- /dev/null
+++ b/bin/cell_templates/cell_11.xml
@@ -0,0 +1,196 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 176
+ 56
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 66
+ 166
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 148
+ 200
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 169
+ 111
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 44
+ 88
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 111
+ 56
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 22
+ 55
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 66
+ 33
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 212
+ 184
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 35
+ 215
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_12.xml b/bin/cell_templates/cell_12.xml
new file mode 100644
index 0000000..b0454a6
--- /dev/null
+++ b/bin/cell_templates/cell_12.xml
@@ -0,0 +1,124 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 176
+ 76
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 222
+ 207
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 88
+ 23
+
+
+ tree9
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 144
+ 155
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 77
+ 135
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 55
+ 186
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_13.xml b/bin/cell_templates/cell_13.xml
new file mode 100644
index 0000000..d85c119
--- /dev/null
+++ b/bin/cell_templates/cell_13.xml
@@ -0,0 +1,178 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 176
+ 76
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 28
+ 33
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 100
+ 100
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 176
+ 150
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 50
+ 160
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 70
+ 211
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 205
+ 122
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 222
+ 211
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 155
+ 33
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_14.xml b/bin/cell_templates/cell_14.xml
new file mode 100644
index 0000000..b752ab3
--- /dev/null
+++ b/bin/cell_templates/cell_14.xml
@@ -0,0 +1,190 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 42
+ 78
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 158
+ 94
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 42
+ 78
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 177
+ 188
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 65
+ 200
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 100
+ 50
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 42
+ 25
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 180
+ 25
+
+
+ tree3
+ 36
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 111
+ 110
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 125
+ 125
+
+
+ bird
+ 250
+ 250
+ 30
+
+
+
+
+
diff --git a/bin/cell_templates/cell_15.xml b/bin/cell_templates/cell_15.xml
new file mode 100644
index 0000000..9d94d45
--- /dev/null
+++ b/bin/cell_templates/cell_15.xml
@@ -0,0 +1,130 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 42
+ 78
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 23
+ 100
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 111
+ 160
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 210
+ 140
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 126
+ 55
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 190
+ 70
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 40
+ 180
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 150
+ 200
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 125
+ 125
+
+
+ bird
+ 250
+ 250
+ 30
+
+
+
+
+
diff --git a/bin/cell_templates/cell_16.xml b/bin/cell_templates/cell_16.xml
new file mode 100644
index 0000000..7706edd
--- /dev/null
+++ b/bin/cell_templates/cell_16.xml
@@ -0,0 +1,136 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 42
+ 50
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 200
+ 180
+
+
+ tree3
+ 36
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 33
+ 177
+
+
+ tree3
+ 36
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 214
+ 66
+
+
+ tree1
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 90
+ 100
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 111
+ 88
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 140
+ 88
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 99
+ 166
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+
diff --git a/bin/cell_templates/cell_17.xml b/bin/cell_templates/cell_17.xml
new file mode 100644
index 0000000..ac89a5b
--- /dev/null
+++ b/bin/cell_templates/cell_17.xml
@@ -0,0 +1,196 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 42
+ 50
+
+
+ tree9
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 89
+ 44
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 223
+ 112
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 90
+ 160
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 115
+ 80
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 190
+ 36
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 140
+ 120
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 42
+ 122
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 188
+ 211
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 26
+ 177
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_18.xml b/bin/cell_templates/cell_18.xml
new file mode 100644
index 0000000..cbc6754
--- /dev/null
+++ b/bin/cell_templates/cell_18.xml
@@ -0,0 +1,142 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 144
+ 123
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 44
+ 56
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 222
+ 123
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 180
+ 66
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 111
+ 63
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 55
+ 207
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 77
+ 130
+
+
+ tree3
+ 36
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_19.xml b/bin/cell_templates/cell_19.xml
new file mode 100644
index 0000000..ad95a88
--- /dev/null
+++ b/bin/cell_templates/cell_19.xml
@@ -0,0 +1,70 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 50
+ 50
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 222
+ 88
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 38
+ 197
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_2.xml b/bin/cell_templates/cell_2.xml
new file mode 100644
index 0000000..1ecd2ee
--- /dev/null
+++ b/bin/cell_templates/cell_2.xml
@@ -0,0 +1,142 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 70
+ 100
+
+
+ tree6
+ 40
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 120
+ 90
+
+
+ sign
+ 16
+ 16
+ 11
+
+
+ box
+ 8
+ 12
+ 0
+
+
+
+
+ 190
+ 50
+
+
+ tree7
+ 50
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 170
+ 200
+
+
+ tree8
+ 47
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 160
+ 140
+
+
+ tree1
+ 47
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 60
+ 56
+
+
+ tree2
+ 38
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 40
+ 210
+
+
+ tree3
+ 36
+ 128
+ 11
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_3.xml b/bin/cell_templates/cell_3.xml
new file mode 100644
index 0000000..6897b74
--- /dev/null
+++ b/bin/cell_templates/cell_3.xml
@@ -0,0 +1,273 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 125
+ 125
+
+
+ fountain
+ 66
+ 104
+ 11
+
+
+ circle
+ 32
+ 0
+
+
+
+
+ 96
+ 32
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 160
+ 32
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 64
+ 64
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 128
+ 64
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 192
+ 64
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 32
+ 96
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 96
+ 96
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 160
+ 96
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 224
+ 96
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 64
+ 128
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 192
+ 128
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 32
+ 160
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 96
+ 160
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 160
+ 160
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 224
+ 160
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 64
+ 192
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 128
+ 192
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 192
+ 192
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 96
+ 224
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+ 160
+ 224
+
+
+ flower
+ 16
+ 16
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_4.xml b/bin/cell_templates/cell_4.xml
new file mode 100644
index 0000000..784ed1b
--- /dev/null
+++ b/bin/cell_templates/cell_4.xml
@@ -0,0 +1,46 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 125
+ 125
+
+
+ sand_dust
+ 128
+ 128
+ 0
+
+
+
+
+ 125
+ 125
+
+
+ rocket
+ 32
+ 162
+ 11
+
+
+ box
+ 28
+ 15
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_5.xml b/bin/cell_templates/cell_5.xml
new file mode 100644
index 0000000..17bc6e3
--- /dev/null
+++ b/bin/cell_templates/cell_5.xml
@@ -0,0 +1,190 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 125
+ 125
+
+
+ truck
+ 51
+ 42
+ 11
+
+
+ box
+ 45
+ 34
+ 0
+
+
+
+
+ 135
+ 135
+
+
+ mew
+ 17
+ 29
+ 12
+
+
+
+
+ 30
+ 60
+
+
+ tree2
+ 28
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 110
+ 80
+
+
+ tree9
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 222
+ 188
+
+
+ tree1
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 100
+ 166
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 200
+ 33
+
+
+ tree9
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 50
+ 144
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 44
+ 211
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 77
+ 44
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_6.xml b/bin/cell_templates/cell_6.xml
new file mode 100644
index 0000000..34ea26f
--- /dev/null
+++ b/bin/cell_templates/cell_6.xml
@@ -0,0 +1,214 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 23
+ 176
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 166
+ 55
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 111
+ 111
+
+
+ tree6
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 150
+ 200
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 177
+ 99
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 44
+ 77
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 22
+ 33
+
+
+ tree3
+ 36
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 88
+ 33
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 210
+ 150
+
+
+ tree2
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 22
+ 33
+
+
+ tree3
+ 36
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 88
+ 211
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_7.xml b/bin/cell_templates/cell_7.xml
new file mode 100644
index 0000000..30e2b24
--- /dev/null
+++ b/bin/cell_templates/cell_7.xml
@@ -0,0 +1,124 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 23
+ 176
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 51
+ 211
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 202
+ 205
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 38
+ 41
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 77
+ 26
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 215
+ 37
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/cell_templates/cell_8.xml b/bin/cell_templates/cell_8.xml
new file mode 100644
index 0000000..226e002
--- /dev/null
+++ b/bin/cell_templates/cell_8.xml
@@ -0,0 +1,208 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 23
+ 176
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 51
+ 211
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 202
+ 205
+
+
+ tree8
+ 47
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 38
+ 41
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 77
+ 26
+
+
+ tree5
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 215
+ 37
+
+
+ tree0
+ 38
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 125
+ 125
+
+
+ crater
+ 54
+ 47
+ 5
+
+
+
+
+ 155
+ 155
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 180
+ 191
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 97
+ 185
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 99
+ 88
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 77
+ 130
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+ 191
+ 110
+
+
+ flower
+ 16
+ 16
+ 5
+
+
+
+
+
diff --git a/bin/cell_templates/cell_9.xml b/bin/cell_templates/cell_9.xml
new file mode 100644
index 0000000..bcb7936
--- /dev/null
+++ b/bin/cell_templates/cell_9.xml
@@ -0,0 +1,124 @@
+
+
+
+ 125
+ 125
+
+
+ pixel_grass
+ 250
+ 250
+ -10
+
+
+
+
+ 123
+ 112
+
+
+ tree9
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 56
+ 98
+
+
+ tree1
+ 42
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 111
+ 183
+
+
+ tree3
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 223
+ 55
+
+
+ tree7
+ 50
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 55
+ 186
+
+
+ tree4
+ 34
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+ 123
+ 36
+
+
+ tree9
+ 44
+ 128
+ 12
+
+
+ box
+ 20
+ 18
+ 0
+
+
+
+
+
diff --git a/bin/img/ball.png b/bin/img/ball.png
new file mode 100644
index 0000000..d8953fd
Binary files /dev/null and b/bin/img/ball.png differ
diff --git a/bin/img/bird/bird_0.png b/bin/img/bird/bird_0.png
new file mode 100644
index 0000000..2ed5fd5
Binary files /dev/null and b/bin/img/bird/bird_0.png differ
diff --git a/bin/img/bird/bird_1.png b/bin/img/bird/bird_1.png
new file mode 100644
index 0000000..59fd102
Binary files /dev/null and b/bin/img/bird/bird_1.png differ
diff --git a/bin/img/bird/bird_10.png b/bin/img/bird/bird_10.png
new file mode 100644
index 0000000..34b0ec7
Binary files /dev/null and b/bin/img/bird/bird_10.png differ
diff --git a/bin/img/bird/bird_11.png b/bin/img/bird/bird_11.png
new file mode 100644
index 0000000..f21d462
Binary files /dev/null and b/bin/img/bird/bird_11.png differ
diff --git a/bin/img/bird/bird_12.png b/bin/img/bird/bird_12.png
new file mode 100644
index 0000000..924d5a6
Binary files /dev/null and b/bin/img/bird/bird_12.png differ
diff --git a/bin/img/bird/bird_13.png b/bin/img/bird/bird_13.png
new file mode 100644
index 0000000..6383584
Binary files /dev/null and b/bin/img/bird/bird_13.png differ
diff --git a/bin/img/bird/bird_14.png b/bin/img/bird/bird_14.png
new file mode 100644
index 0000000..00cd8f3
Binary files /dev/null and b/bin/img/bird/bird_14.png differ
diff --git a/bin/img/bird/bird_15.png b/bin/img/bird/bird_15.png
new file mode 100644
index 0000000..81655e0
Binary files /dev/null and b/bin/img/bird/bird_15.png differ
diff --git a/bin/img/bird/bird_16.png b/bin/img/bird/bird_16.png
new file mode 100644
index 0000000..2330580
Binary files /dev/null and b/bin/img/bird/bird_16.png differ
diff --git a/bin/img/bird/bird_17.png b/bin/img/bird/bird_17.png
new file mode 100644
index 0000000..f26fb4b
Binary files /dev/null and b/bin/img/bird/bird_17.png differ
diff --git a/bin/img/bird/bird_18.png b/bin/img/bird/bird_18.png
new file mode 100644
index 0000000..9d1b0b5
Binary files /dev/null and b/bin/img/bird/bird_18.png differ
diff --git a/bin/img/bird/bird_19.png b/bin/img/bird/bird_19.png
new file mode 100644
index 0000000..d0de733
Binary files /dev/null and b/bin/img/bird/bird_19.png differ
diff --git a/bin/img/bird/bird_2.png b/bin/img/bird/bird_2.png
new file mode 100644
index 0000000..7cab6aa
Binary files /dev/null and b/bin/img/bird/bird_2.png differ
diff --git a/bin/img/bird/bird_20.png b/bin/img/bird/bird_20.png
new file mode 100644
index 0000000..0724519
Binary files /dev/null and b/bin/img/bird/bird_20.png differ
diff --git a/bin/img/bird/bird_21.png b/bin/img/bird/bird_21.png
new file mode 100644
index 0000000..abb91e1
Binary files /dev/null and b/bin/img/bird/bird_21.png differ
diff --git a/bin/img/bird/bird_22.png b/bin/img/bird/bird_22.png
new file mode 100644
index 0000000..04f0fd6
Binary files /dev/null and b/bin/img/bird/bird_22.png differ
diff --git a/bin/img/bird/bird_23.png b/bin/img/bird/bird_23.png
new file mode 100644
index 0000000..669ac2d
Binary files /dev/null and b/bin/img/bird/bird_23.png differ
diff --git a/bin/img/bird/bird_24.png b/bin/img/bird/bird_24.png
new file mode 100644
index 0000000..62c8072
Binary files /dev/null and b/bin/img/bird/bird_24.png differ
diff --git a/bin/img/bird/bird_25.png b/bin/img/bird/bird_25.png
new file mode 100644
index 0000000..b912b43
Binary files /dev/null and b/bin/img/bird/bird_25.png differ
diff --git a/bin/img/bird/bird_26.png b/bin/img/bird/bird_26.png
new file mode 100644
index 0000000..05165bd
Binary files /dev/null and b/bin/img/bird/bird_26.png differ
diff --git a/bin/img/bird/bird_27.png b/bin/img/bird/bird_27.png
new file mode 100644
index 0000000..550de04
Binary files /dev/null and b/bin/img/bird/bird_27.png differ
diff --git a/bin/img/bird/bird_28.png b/bin/img/bird/bird_28.png
new file mode 100644
index 0000000..5b46a5a
Binary files /dev/null and b/bin/img/bird/bird_28.png differ
diff --git a/bin/img/bird/bird_29.png b/bin/img/bird/bird_29.png
new file mode 100644
index 0000000..61d2a34
Binary files /dev/null and b/bin/img/bird/bird_29.png differ
diff --git a/bin/img/bird/bird_3.png b/bin/img/bird/bird_3.png
new file mode 100644
index 0000000..e4cb45d
Binary files /dev/null and b/bin/img/bird/bird_3.png differ
diff --git a/bin/img/bird/bird_30.png b/bin/img/bird/bird_30.png
new file mode 100644
index 0000000..6bfffb6
Binary files /dev/null and b/bin/img/bird/bird_30.png differ
diff --git a/bin/img/bird/bird_31.png b/bin/img/bird/bird_31.png
new file mode 100644
index 0000000..f6a9a63
Binary files /dev/null and b/bin/img/bird/bird_31.png differ
diff --git a/bin/img/bird/bird_4.png b/bin/img/bird/bird_4.png
new file mode 100644
index 0000000..0b5a77a
Binary files /dev/null and b/bin/img/bird/bird_4.png differ
diff --git a/bin/img/bird/bird_5.png b/bin/img/bird/bird_5.png
new file mode 100644
index 0000000..08ae368
Binary files /dev/null and b/bin/img/bird/bird_5.png differ
diff --git a/bin/img/bird/bird_6.png b/bin/img/bird/bird_6.png
new file mode 100644
index 0000000..54de781
Binary files /dev/null and b/bin/img/bird/bird_6.png differ
diff --git a/bin/img/bird/bird_7.png b/bin/img/bird/bird_7.png
new file mode 100644
index 0000000..0e09ba6
Binary files /dev/null and b/bin/img/bird/bird_7.png differ
diff --git a/bin/img/bird/bird_8.png b/bin/img/bird/bird_8.png
new file mode 100644
index 0000000..db5c41a
Binary files /dev/null and b/bin/img/bird/bird_8.png differ
diff --git a/bin/img/bird/bird_9.png b/bin/img/bird/bird_9.png
new file mode 100644
index 0000000..66abf93
Binary files /dev/null and b/bin/img/bird/bird_9.png differ
diff --git a/bin/img/castle_0.png b/bin/img/castle_0.png
new file mode 100644
index 0000000..7535ad3
Binary files /dev/null and b/bin/img/castle_0.png differ
diff --git a/bin/img/castle_1.png b/bin/img/castle_1.png
new file mode 100644
index 0000000..21066e4
Binary files /dev/null and b/bin/img/castle_1.png differ
diff --git a/bin/img/castle_2.png b/bin/img/castle_2.png
new file mode 100644
index 0000000..328a8db
Binary files /dev/null and b/bin/img/castle_2.png differ
diff --git a/bin/img/castle_3.png b/bin/img/castle_3.png
new file mode 100644
index 0000000..56d8f56
Binary files /dev/null and b/bin/img/castle_3.png differ
diff --git a/bin/img/crater.png b/bin/img/crater.png
new file mode 100644
index 0000000..086cd01
Binary files /dev/null and b/bin/img/crater.png differ
diff --git a/bin/img/fence_16.png b/bin/img/fence_16.png
new file mode 100644
index 0000000..3f18b1e
Binary files /dev/null and b/bin/img/fence_16.png differ
diff --git a/bin/img/fence_5.png b/bin/img/fence_5.png
new file mode 100644
index 0000000..177d26c
Binary files /dev/null and b/bin/img/fence_5.png differ
diff --git a/bin/img/fence_9.png b/bin/img/fence_9.png
new file mode 100644
index 0000000..4bc893d
Binary files /dev/null and b/bin/img/fence_9.png differ
diff --git a/bin/img/fence_side.png b/bin/img/fence_side.png
new file mode 100644
index 0000000..6335500
Binary files /dev/null and b/bin/img/fence_side.png differ
diff --git a/bin/img/flower.png b/bin/img/flower.png
new file mode 100644
index 0000000..ad2944d
Binary files /dev/null and b/bin/img/flower.png differ
diff --git a/bin/img/fountain.png b/bin/img/fountain.png
new file mode 100644
index 0000000..7da9917
Binary files /dev/null and b/bin/img/fountain.png differ
diff --git a/bin/img/grass_2.png b/bin/img/grass_2.png
new file mode 100644
index 0000000..8318ea1
Binary files /dev/null and b/bin/img/grass_2.png differ
diff --git a/bin/img/grass_3.png b/bin/img/grass_3.png
new file mode 100644
index 0000000..aba5703
Binary files /dev/null and b/bin/img/grass_3.png differ
diff --git a/bin/img/mew.png b/bin/img/mew.png
new file mode 100644
index 0000000..6bc5c24
Binary files /dev/null and b/bin/img/mew.png differ
diff --git a/bin/img/mew_0.png b/bin/img/mew_0.png
new file mode 100644
index 0000000..9310428
Binary files /dev/null and b/bin/img/mew_0.png differ
diff --git a/bin/img/mew_1.png b/bin/img/mew_1.png
new file mode 100644
index 0000000..b2ad0b6
Binary files /dev/null and b/bin/img/mew_1.png differ
diff --git a/bin/img/mew_2.png b/bin/img/mew_2.png
new file mode 100644
index 0000000..e75c2af
Binary files /dev/null and b/bin/img/mew_2.png differ
diff --git a/bin/img/mew_3.png b/bin/img/mew_3.png
new file mode 100644
index 0000000..a259ae9
Binary files /dev/null and b/bin/img/mew_3.png differ
diff --git a/bin/img/mew_4.png b/bin/img/mew_4.png
new file mode 100644
index 0000000..6722e5e
Binary files /dev/null and b/bin/img/mew_4.png differ
diff --git a/bin/img/mew_5.png b/bin/img/mew_5.png
new file mode 100644
index 0000000..6d0e052
Binary files /dev/null and b/bin/img/mew_5.png differ
diff --git a/bin/img/pokemon_center.png b/bin/img/pokemon_center.png
new file mode 100644
index 0000000..05653f9
Binary files /dev/null and b/bin/img/pokemon_center.png differ
diff --git a/bin/img/pokemon_red_pj.png b/bin/img/pokemon_red_pj.png
new file mode 100644
index 0000000..70b0e37
Binary files /dev/null and b/bin/img/pokemon_red_pj.png differ
diff --git a/bin/img/rocket.png b/bin/img/rocket.png
new file mode 100644
index 0000000..c31f3dd
Binary files /dev/null and b/bin/img/rocket.png differ
diff --git a/bin/img/sand_dust.png b/bin/img/sand_dust.png
new file mode 100644
index 0000000..4436de2
Binary files /dev/null and b/bin/img/sand_dust.png differ
diff --git a/bin/img/sheet.png b/bin/img/sheet.png
new file mode 100644
index 0000000..5ee568d
Binary files /dev/null and b/bin/img/sheet.png differ
diff --git a/bin/img/sign.png b/bin/img/sign.png
new file mode 100644
index 0000000..e2813bc
Binary files /dev/null and b/bin/img/sign.png differ
diff --git a/bin/img/trees.png b/bin/img/trees.png
new file mode 100644
index 0000000..b1196e0
Binary files /dev/null and b/bin/img/trees.png differ
diff --git a/bin/img/truck.png b/bin/img/truck.png
new file mode 100644
index 0000000..69981c0
Binary files /dev/null and b/bin/img/truck.png differ
diff --git a/bin/init_file.xml b/bin/init_file.xml
index 5003050..13f4cc8 100644
--- a/bin/init_file.xml
+++ b/bin/init_file.xml
@@ -4,4 +4,4 @@
600250.0
-3
\ No newline at end of file
+2
diff --git a/bin/sprites/ball.xml b/bin/sprites/ball.xml
new file mode 100644
index 0000000..1d656a7
--- /dev/null
+++ b/bin/sprites/ball.xml
@@ -0,0 +1,23 @@
+
+
+
+ ball.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 2020
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/bird.xml b/bin/sprites/bird.xml
new file mode 100644
index 0000000..0c1b283
--- /dev/null
+++ b/bin/sprites/bird.xml
@@ -0,0 +1,294 @@
+
+
+
+ bird/bird_0.png
+ bird/bird_1.png
+ bird/bird_2.png
+ bird/bird_3.png
+ bird/bird_4.png
+ bird/bird_5.png
+ bird/bird_6.png
+ bird/bird_7.png
+ bird/bird_8.png
+ bird/bird_9.png
+ bird/bird_10.png
+ bird/bird_11.png
+ bird/bird_12.png
+ bird/bird_13.png
+ bird/bird_14.png
+ bird/bird_15.png
+ bird/bird_16.png
+ bird/bird_17.png
+ bird/bird_18.png
+ bird/bird_19.png
+ bird/bird_20.png
+ bird/bird_21.png
+ bird/bird_22.png
+ bird/bird_23.png
+ bird/bird_24.png
+ bird/bird_25.png
+ bird/bird_26.png
+ bird/bird_27.png
+ bird/bird_28.png
+ bird/bird_29.png
+ bird/bird_30.png
+ bird/bird_31.png
+
+
+
+
+
+ b0
+
+ 00
+ 250250
+
+
+
+
+ b2
+
+ 00
+ 250250
+
+
+
+
+ b3
+
+ 00
+ 250250
+
+
+
+
+ b4
+
+ 00
+ 250250
+
+
+
+
+ b5
+
+ 00
+ 250250
+
+
+
+
+ b6
+
+ 00
+ 250250
+
+
+
+
+ b7
+
+ 00
+ 250250
+
+
+
+
+ b8
+
+ 00
+ 250250
+
+
+
+
+ b9
+
+ 00
+ 250250
+
+
+
+
+ b10
+
+ 00
+ 250250
+
+
+
+
+ b11
+
+ 00
+ 250250
+
+
+
+
+ b12
+
+ 00
+ 250250
+
+
+
+
+ b13
+
+ 00
+ 250250
+
+
+
+
+ b14
+
+ 00
+ 250250
+
+
+
+
+ b15
+
+ 00
+ 250250
+
+
+
+
+ b16
+
+ 00
+ 250250
+
+
+
+
+ b17
+
+ 00
+ 250250
+
+
+
+
+ b18
+
+ 00
+ 250250
+
+
+
+
+ b19
+
+ 00
+ 250250
+
+
+
+
+ b20
+
+ 00
+ 250250
+
+
+
+
+ b21
+
+ 00
+ 250250
+
+
+
+
+ b22
+
+ 00
+ 250250
+
+
+
+
+ b23
+
+ 00
+ 250250
+
+
+
+
+ b24
+
+ 00
+ 250250
+
+
+
+
+ b25
+
+ 00
+ 250250
+
+
+
+
+ b26
+
+ 00
+ 250250
+
+
+
+
+ b27
+
+ 00
+ 250250
+
+
+
+
+ b28
+
+ 00
+ 250250
+
+
+
+
+ b29
+
+ 00
+ 250250
+
+
+
+
+ b30
+
+ 00
+ 250250
+
+
+
+
+ b31
+
+ 00
+ 250250
+
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/castle.xml b/bin/sprites/castle.xml
new file mode 100644
index 0000000..15146ad
--- /dev/null
+++ b/bin/sprites/castle.xml
@@ -0,0 +1,47 @@
+
+
+
+ castle_0.png
+ castle_1.png
+ castle_2.png
+ castle_3.png
+
+
+
+
+
+ c0
+
+ 00
+ 102180
+
+
+
+
+ c1
+
+ 00
+ 102180
+
+
+
+
+ c2
+
+ 00
+ 102180
+
+
+
+
+ c3
+
+ 00
+ 102180
+
+
+
+
+
+
+
diff --git a/bin/sprites/crater.xml b/bin/sprites/crater.xml
new file mode 100644
index 0000000..393d165
--- /dev/null
+++ b/bin/sprites/crater.xml
@@ -0,0 +1,22 @@
+
+
+
+ crater.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 5447
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/fence_16.xml b/bin/sprites/fence_16.xml
new file mode 100644
index 0000000..03d646b
--- /dev/null
+++ b/bin/sprites/fence_16.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ fence_16.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 25426
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/fence_5.xml b/bin/sprites/fence_5.xml
new file mode 100644
index 0000000..901bef8
--- /dev/null
+++ b/bin/sprites/fence_5.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ fence_5.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 7826
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/fence_9.xml b/bin/sprites/fence_9.xml
new file mode 100644
index 0000000..17dbfac
--- /dev/null
+++ b/bin/sprites/fence_9.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ fence_9.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 14226
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/fence_side.xml b/bin/sprites/fence_side.xml
new file mode 100644
index 0000000..e2cd369
--- /dev/null
+++ b/bin/sprites/fence_side.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ fence_side.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 6112
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/flower.xml b/bin/sprites/flower.xml
new file mode 100644
index 0000000..c5f4e75
--- /dev/null
+++ b/bin/sprites/flower.xml
@@ -0,0 +1,55 @@
+
+
+
+ flower.png
+
+
+
+
+
+ sp0
+
+ 00
+ 1616
+
+
+
+
+ sp0
+
+ 170
+ 1616
+
+
+
+
+ sp0
+
+ 340
+ 1616
+
+
+
+
+ sp0
+
+ 510
+ 1616
+
+
+
+
+ sp0
+
+ 680
+ 1616
+
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/fountain.xml b/bin/sprites/fountain.xml
new file mode 100644
index 0000000..80312cb
--- /dev/null
+++ b/bin/sprites/fountain.xml
@@ -0,0 +1,30 @@
+
+
+
+ fountain.png
+
+
+
+
+
+ sp0
+
+ 00
+ 66104
+
+
+
+
+ sp0
+
+ 750
+ 66104
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/grass.xml b/bin/sprites/grass.xml
new file mode 100644
index 0000000..6e9035c
--- /dev/null
+++ b/bin/sprites/grass.xml
@@ -0,0 +1,22 @@
+
+
+
+ grass_2.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 250250
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/gros.xml b/bin/sprites/gros.xml
new file mode 100644
index 0000000..220300c
--- /dev/null
+++ b/bin/sprites/gros.xml
@@ -0,0 +1,38 @@
+
+
+
+ sheet.png
+
+
+
+
+
+
+ sp1
+
+ 1440
+ 144144
+
+
+
+
+ sp1
+
+ 2880
+ 144144
+
+
+
+
+ sp1
+
+ 4320
+ 144144
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/mew.xml b/bin/sprites/mew.xml
new file mode 100644
index 0000000..b05c039
--- /dev/null
+++ b/bin/sprites/mew.xml
@@ -0,0 +1,67 @@
+
+
+
+ mew_0.png
+ mew_1.png
+ mew_2.png
+ mew_3.png
+ mew_4.png
+ mew_5.png
+
+
+
+
+
+
+ m0
+
+ 00
+ 1729
+
+
+
+
+ m1
+
+ 00
+ 1729
+
+
+
+
+ m2
+
+ 00
+ 1729
+
+
+
+
+ m3
+
+ 00
+ 1729
+
+
+
+
+ m4
+
+ 00
+ 1729
+
+
+
+
+ m5
+
+ 00
+ 1729
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/pixel_grass.xml b/bin/sprites/pixel_grass.xml
new file mode 100644
index 0000000..9b98ecf
--- /dev/null
+++ b/bin/sprites/pixel_grass.xml
@@ -0,0 +1,22 @@
+
+
+
+ grass_3.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 250250
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/pokemon_center.xml b/bin/sprites/pokemon_center.xml
new file mode 100644
index 0000000..164c069
--- /dev/null
+++ b/bin/sprites/pokemon_center.xml
@@ -0,0 +1,23 @@
+
+
+
+ pokemon_center.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 6464
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/real_grass.xml b/bin/sprites/real_grass.xml
new file mode 100644
index 0000000..b9c9ad1
--- /dev/null
+++ b/bin/sprites/real_grass.xml
@@ -0,0 +1,22 @@
+
+
+
+ grass.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 250250
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/red.xml b/bin/sprites/red.xml
new file mode 100644
index 0000000..9f74b29
--- /dev/null
+++ b/bin/sprites/red.xml
@@ -0,0 +1,148 @@
+
+
+
+ pokemon_red_pj.png
+
+
+
+
+
+
+ sp1
+
+ 320
+ 3232
+
+
+
+
+
+
+
+ sp1
+
+ 3232
+ 3232
+
+
+
+
+
+
+
+ sp1
+
+ 3264
+ 3232
+
+
+
+
+
+
+
+ sp1
+
+ 3296
+ 3232
+
+
+
+
+
+
+
+ sp1
+
+ 00
+ 3232
+
+
+
+
+ sp1
+
+ 320
+ 3232
+
+
+
+
+ sp1
+
+ 640
+ 3232
+
+
+
+
+
+
+
+ sp1
+
+ 032
+ 3232
+
+
+
+
+ sp1
+
+ 3232
+ 3232
+
+
+
+
+
+
+
+ sp1
+
+ 064
+ 3232
+
+
+
+
+ sp1
+
+ 3264
+ 3232
+
+
+
+
+
+
+
+ sp1
+
+ 096
+ 3232
+
+
+
+
+ sp1
+
+ 3296
+ 3232
+
+
+
+
+ sp1
+
+ 6496
+ 3232
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/rocket.xml b/bin/sprites/rocket.xml
new file mode 100644
index 0000000..9ecee2c
--- /dev/null
+++ b/bin/sprites/rocket.xml
@@ -0,0 +1,22 @@
+
+
+
+ rocket.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 32162
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/sand_dust.xml b/bin/sprites/sand_dust.xml
new file mode 100644
index 0000000..3514bd6
--- /dev/null
+++ b/bin/sprites/sand_dust.xml
@@ -0,0 +1,22 @@
+
+
+
+ sand_dust.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 128128
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/sign.xml b/bin/sprites/sign.xml
new file mode 100644
index 0000000..e7ab60b
--- /dev/null
+++ b/bin/sprites/sign.xml
@@ -0,0 +1,23 @@
+
+
+
+ sign.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 1616
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree0.xml b/bin/sprites/tree0.xml
new file mode 100644
index 0000000..9775410
--- /dev/null
+++ b/bin/sprites/tree0.xml
@@ -0,0 +1,22 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 50
+ 38128
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree1.xml b/bin/sprites/tree1.xml
new file mode 100644
index 0000000..1a13d59
--- /dev/null
+++ b/bin/sprites/tree1.xml
@@ -0,0 +1,23 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 450
+ 42128
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree2.xml b/bin/sprites/tree2.xml
new file mode 100644
index 0000000..b02774c
--- /dev/null
+++ b/bin/sprites/tree2.xml
@@ -0,0 +1,23 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 890
+ 38128
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree3.xml b/bin/sprites/tree3.xml
new file mode 100644
index 0000000..b077552
--- /dev/null
+++ b/bin/sprites/tree3.xml
@@ -0,0 +1,23 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 1290
+ 36128
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree4.xml b/bin/sprites/tree4.xml
new file mode 100644
index 0000000..fc8c547
--- /dev/null
+++ b/bin/sprites/tree4.xml
@@ -0,0 +1,23 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 1670
+ 34128
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree5.xml b/bin/sprites/tree5.xml
new file mode 100644
index 0000000..6507cfe
--- /dev/null
+++ b/bin/sprites/tree5.xml
@@ -0,0 +1,22 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 2030
+ 38128
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree6.xml b/bin/sprites/tree6.xml
new file mode 100644
index 0000000..bb94ec2
--- /dev/null
+++ b/bin/sprites/tree6.xml
@@ -0,0 +1,22 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 2430
+ 38128
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree7.xml b/bin/sprites/tree7.xml
new file mode 100644
index 0000000..65ac363
--- /dev/null
+++ b/bin/sprites/tree7.xml
@@ -0,0 +1,23 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 2830
+ 50128
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree8.xml b/bin/sprites/tree8.xml
new file mode 100644
index 0000000..989864b
--- /dev/null
+++ b/bin/sprites/tree8.xml
@@ -0,0 +1,23 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 3350
+ 47128
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/tree9.xml b/bin/sprites/tree9.xml
new file mode 100644
index 0000000..5e08512
--- /dev/null
+++ b/bin/sprites/tree9.xml
@@ -0,0 +1,23 @@
+
+
+
+ trees.png
+
+
+
+
+
+
+ sp1
+
+ 3830
+ 44128
+
+
+
+
+
+
+
+
+
diff --git a/bin/sprites/truck.xml b/bin/sprites/truck.xml
new file mode 100644
index 0000000..d6c0e76
--- /dev/null
+++ b/bin/sprites/truck.xml
@@ -0,0 +1,23 @@
+
+
+
+ truck.png
+
+
+
+
+
+
+ sp1
+
+ 00
+ 5142
+
+
+
+
+
+
+
+
+
diff --git a/bin/world_folder/much_rand.py b/bin/world_folder/much_rand.py
index e493ea6..7f307d3 100644
--- a/bin/world_folder/much_rand.py
+++ b/bin/world_folder/much_rand.py
@@ -79,8 +79,8 @@ def gen_rand_cell():
return res
-for x in xrange(10):
- for y in xrange(10):
+for x in xrange(1):
+ for y in xrange(1):
fileName = "cell_" + str(x) + "_" + str(y) + ".xml"
diff --git a/bin/world_gens/forest_world.py b/bin/world_gens/forest_world.py
new file mode 100644
index 0000000..d95f5b5
--- /dev/null
+++ b/bin/world_gens/forest_world.py
@@ -0,0 +1,39 @@
+dir_temp = "../cell_templates/"
+dir_world = "../world_folder/"
+world_file_name = dir_world + "world_file.txt"
+num_temps = 20
+import io
+from random import randint
+from shutil import copyfile
+
+temps = []
+for i in range(num_temps):
+ t = dir_temp + str(i)
+ temps.append(t)
+
+w = 200
+h = 200
+s = w * h
+o = int(s / 100)
+i = 0
+
+
+wfc = ""
+world_file = io.open(world_file_name, "w", newline='\n')
+
+for y in range(w):
+ for x in range(h):
+ rand_cell = randint(0, num_temps-1)
+
+ name_source = dir_temp + "cell_" + str(rand_cell) + ".xml"
+ name_dest = dir_world + "cell_" + str(x) + "_" + str(y) + ".xml"
+ copyfile(name_source, name_dest)
+
+ wfc += str(x) + " " + str(y) + "\n"
+
+ if i % o == 0:
+ print("{0:d}%".format(int(i / o) + 1))
+ i += 1
+
+world_file.write(wfc)
+world_file.close()
diff --git a/bin/world_gens/main_character.xml b/bin/world_gens/main_character.xml
new file mode 100644
index 0000000..e17a28c
--- /dev/null
+++ b/bin/world_gens/main_character.xml
@@ -0,0 +1,20 @@
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+ red
+ 16
+ 16
+ 10
+
+
+ box
+ 16
+ 16
+ 10
+
+
diff --git a/bin/world_gens/sprite.py b/bin/world_gens/sprite.py
new file mode 100644
index 0000000..221f097
--- /dev/null
+++ b/bin/world_gens/sprite.py
@@ -0,0 +1,26 @@
+s = """
+
+
+ 125
+ 125
+
+
+ grass
+ 250
+ 250
+ -10
+
+
+"""
+
+wf = open("world_file.txt", "w")
+
+for y in xrange(0, 200):
+ for x in xrange(0, 200):
+ name = "cell_" + str(x) + "_" + str(y) + ".xml"
+ f = open(name, "w")
+ f.write(s)
+ f.close()
+
+ line = str(x) + " " + str(y) + "\n"
+ wf.write(line)
diff --git a/bin/world_gens/world_gen.py b/bin/world_gens/world_gen.py
new file mode 100644
index 0000000..3e85f5b
--- /dev/null
+++ b/bin/world_gens/world_gen.py
@@ -0,0 +1,7 @@
+
+W = 200
+H = 200
+
+cell_templates = [
+
+]
diff --git a/build/.gitignore b/build/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/build/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/src/dependencies/Box2D_v2.3.0/Box2D/Box2D/CMakeFiles/TargetDirectories.txt b/doc/be.bbl
similarity index 100%
rename from src/dependencies/Box2D_v2.3.0/Box2D/Box2D/CMakeFiles/TargetDirectories.txt
rename to doc/be.bbl
diff --git a/doc/be.blg b/doc/be.blg
new file mode 100644
index 0000000..11cffe8
--- /dev/null
+++ b/doc/be.blg
@@ -0,0 +1,52 @@
+This is BibTeX, Version 0.99d (TeX Live 2015/dev/Debian)
+Capacity: max_strings=35307, hash_size=35307, hash_prime=30011
+The top-level auxiliary file: be.aux
+I couldn't open database file tfg.bib
+---line 173 of file be.aux
+ : \bibdata{tfg
+ : }
+I'm skipping whatever remains of this command
+I found no database files---while reading file be.aux
+I found no \bibstyle command---while reading file be.aux
+You've used 18 entries,
+ 0 wiz_defined-function locations,
+ 102 strings with 620 characters,
+and the built_in function-call counts, 0 in all, are:
+= -- 0
+> -- 0
+< -- 0
++ -- 0
+- -- 0
+* -- 0
+:= -- 0
+add.period$ -- 0
+call.type$ -- 0
+change.case$ -- 0
+chr.to.int$ -- 0
+cite$ -- 0
+duplicate$ -- 0
+empty$ -- 0
+format.name$ -- 0
+if$ -- 0
+int.to.chr$ -- 0
+int.to.str$ -- 0
+missing$ -- 0
+newline$ -- 0
+num.names$ -- 0
+pop$ -- 0
+preamble$ -- 0
+purify$ -- 0
+quote$ -- 0
+skip$ -- 0
+stack$ -- 0
+substring$ -- 0
+swap$ -- 0
+text.length$ -- 0
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 0
+warning$ -- 0
+while$ -- 0
+width$ -- 0
+write$ -- 0
+(There were 3 error messages)
diff --git a/doc/be.pdf b/doc/be.pdf
index a88a783..7627028 100644
Binary files a/doc/be.pdf and b/doc/be.pdf differ
diff --git a/doc/be.tex b/doc/be.tex
index 700e815..16837c7 100644
--- a/doc/be.tex
+++ b/doc/be.tex
@@ -12,16 +12,65 @@
\usepackage{verbatim}
\usepackage{minted}
\usepackage{pgfplots}
+\usepackage{fix-cm}
\graphicspath{ {img/} }
-\begin{document}
-
-\title{ Open World Streaming: \linebreak
-Automatic memory management in open world games without loading screens. }
-\author{Alejandro Juan Pérez \\ \href{mailto:tuketet@gmail.com}{tuketet@gmail.com}}
+\begin{document}
-\maketitle
+\begin{titlepage}
+ \centering
+ \vfill
+
+ \begin{figure}[!tbp]
+ \centering
+ \begin{minipage}[b]{0.4\textwidth}
+ \includegraphics[width=6cm]{upv_logo.png}
+ \end{minipage}
+ \hfill
+ \begin{minipage}[b]{0.4\textwidth}
+ \includegraphics[width=6cm]{etsinf_logo.png}
+ \end{minipage}
+ \end{figure}
+
+
+ \vskip1cm
+ {\Large
+ Escola Tècnica Superior d'Enginyeria Informàtica
+
+ Universitat Politècnica de València
+ }
+
+ \vskip2cm
+
+ {\fontsize{36}{30}\selectfont
+ Open World Streaming:
+ }
+
+ {\huge
+
+ Automatic memory management in open world games without loading screens.
+ }
+ \vskip2cm
+
+ {\Large
+ Trabajo Fin de Grado
+
+ Grado en Ingeniería Informática
+ }
+
+ \vskip2cm
+
+ \begin{flushright}
+ {\Large
+ Alejandro Juan Pérez \\ \href{mailto:tuketet@gmail.com}{tuketet@gmail.com}\\
+ \vskip1cm
+ Supervised by\\Ramón Pascual Mollá Vayá
+ \vskip1cm
+ 2015-2016
+ }
+ \end{flushright}
+\end{titlepage}
\newpage
@@ -34,19 +83,66 @@ \section{Introduction}
Open world games are among the most appreciated games by players. They provide users the chance to explore a big world and they are very immersive. Open world games grant players the freedom to take any decision and enjoy their high interaction.
-As you might already know, in open world games the player usually controls an avatar over a big virtual world. So the player that controls the avatar takes its skin and, ideally, gets immersed in the virtual world.
+In open world videogames the player, usually, controls an avatar over a big virtual world. So the player that controls the avatar takes its skin and, ideally, gets immersed in the virtual world.
+
+There is a good chance you know about some of the most famous open world games. Some of them are: \emph{Grad Theft Auto} series \footnote{\emph{Grand Theft Auto} is a series of games produced by \emph{Rockstar}}
+, \emph{The Elder Scrolls} series \footnote{\emph{The Elder Scrolls} is a series of games produced by \emph{Bethesda}} or
+\emph{Minecraft} \footnote{\emph{Minecraft} is a sandbox game produced by \emph{Mojang}}.
+These games, apart from being very famous, they have all been in the top of the best-selling videogames\cite{bestselling}.
-Sure you know about some of the most famous open world games. Some of them are: \emph{Grad Theft Auto} series (by \emph{Rockstar}), \emph{The Elder Of Scrolls} series (by \emph{Bethesda}), \emph{Minecraft} (by \emph{Mojang}). These games, apart from being very famous, have all been in the top of the best-selling videogames. Let's see some examples. \emph{Minecraft} has sold 19 million copies for the PC platform and it is the most sold PC game ever. Grand Theft Auto V has sold 19 millons copies for the \emph{PS3}, making it the most sold \emph{PS3} game ever. The \emph{Eder Scrolls: Skyrim} has sold 20 millon copies for \emph{PC}, \emph{XBOX} and \emph{PS3}\cite{bestselling}.
+\begin{itemize}
+\item \emph{Minecraft} has sold 19 million copies for the PC platform and it is the most sold PC game ever.
+\item \emph{Grand Theft Auto V} has sold 19 millons copies for the \emph{PS3}, making it the most sold \emph{PS3} game ever.
+
+\item \emph{The Eder Scrolls: Skyrim} has sold 20 millon copies for \emph{PC}, \emph{XBOX} and \emph{PS3}.
+\end{itemize}
+
Therefore, open world games are not only about fun, freedom and high interaction but also a promising business. And as we will see they are technologically challenging.
Despite open world games are well know, the techniques that are applied in their implementation are not. Game studios that are experienced in the implementation of open world games, like \emph{Rockstar}, keep well their secrets. The development of open world game engines requires a great investment.
-The purpose of this project is to develop a game engine that will support making open world videogames. Our engine should allow the creation of games with huge worlds and avoid loading screens.
+The purpose of this project is to develop a game engine that will support making open world videogames. Our engine should allow the creation of games with huge worlds and avoid loading screens. There is very few information about the topic (specially at the implementation level). My intention is to gather available information and extend it with my own thoughts and get them to be implemented. Hopefully, this article, and the open source code that comes along with it, will help other people to understand the main concerns they should take when developing open world games.
+
+\section{Open world videogames}
+
+Open world are some kind of videogames in which the player can move freely in a huge virtual world. The structure of the game is not linear in terms of gameplay. That means, the player has the choice on what to do next. There are some game genres that can benefit a lot from the open world approach. For example, role playing games (RPG)\footnote{\url{https://en.wikipedia.org/wiki/Role-playing\_video\_game}}, sandbox\footnote{\url{https://en.wikipedia.org/wiki/Glossary\_of\_video\_game\_terms\#Sandbox\_game}} and vehicle simulation\footnote{\url{https://en.wikipedia.org/wiki/Vehicle\_simulation\_game}} are enhanced when convined with a big open world.
+
+In some open world RPGs, the player can explore the world and complete missions. Some of these missions are not mandatory so the player is allowed to decide whether or not to take them. These is an example of the non-linearity we have been talking about.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.62]{farcry3.jpeg}
+ \caption{Far Cry 3 is a RPG featuring an open world}
+ \label{fig:farcry3}
+\end{figure}
+
+In an open world vehicle simulation videogame, the player would be free to drive around a big city or the long roads of the country side.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.48]{eurotruck.jpg}
+ \caption{Euro Truck Simulator is a driving simulator with a realistic open world}
+ \label{fig:eurotruck}
+\end{figure}
+
+\subsection{Content generation}
+\label{sec:contentgen}
+
+Since open world games have such a big universe, there must be a lot of content to fill up all that space. It is required to have a lot of people creating that content (programmers, designers, artists...). Sometimes, when there are not so many human resources available, it is a good choice to generate the world procedurally. Therefore, we can get help from the computers in order to fill the world with fun content. Most of the times, there is a mixture of procedurally generated content and artists content. But there are some games where the content generated by algorithms is predominant. Having the computers to do such a costly task is an advantage for indie game studios because they can not afford hiring so much people. \emph{No Man's Sky}\footnote{\emph{No Man's Sky} is a game produced by \emph{Hello Games}} is an example of a videogame with a procedurally generated world developed by a small team.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.52]{nomanssky.jpg}
+ \caption{\emph{No Man's Sky} is a videogame with a potentially unending open world (procedurally generated)}
+ \label{fig:nomanssky}
+\end{figure}
+
+Whether or not the content of open world games has been generated by a computer or a human, there is a common trend in the latest open world videogames: there are less and less loading screens. The videogame designers are trying to avoid loading screens when possible, so the player doesn't have to wait and has his immersion feeling increased. This is accomplished thanks to a techniche called world streaming. This is the main focus of this document.
\section{Requirements}
-So we are willing to make a game engine that supports the development of open world games. We are going to focus on the requirements that are more specific for open world games. And requirements that are common for most game engines will be left as secondary requirements.
+So we are willing to make a game engine that supports the development of open world games and avoids loading screens. We are going to focus on the requirements that are more specific for open world games. And requirements that are common for most game engines will be left as secondary requirements.
\subsection{Main requirements}
@@ -56,7 +152,7 @@ \subsection{Main requirements}
\item \textbf{Visualization:} We said that requirements that are common for any game engine will be treated as secondary requirements. But this is an exception. It is very important to have some kind of visual feedback. We need visualization to test our system. Also, it is important in order to prove that our engine is working properly. So we need to implement a graphical interface even if it is not very fancy. The graphics will be 2-dimensional.
-\item \textbf{Memory management:} If there is one thing that characterizes open world games is that they usually have very big worlds. These worlds have a huge amounts of data (entities, textures, meshes, sound, etc). Some of this games require several tens of gigabytes of compressed data in secondary disk. Obviously we can not expect our users to have that much RAM capacity. The main challenge will be to keep memory consumption to a minimum while not compromising playability or quality. The trick we are going to use is to load into main memory only the things that are closer to the player. Another thing that we will do is to avoid duplicated resources in RAM. For example, there are is a forest that has many trees that share the same set of textures, we must accomplish that each texture is in RAM at most once.
+\item \textbf{Memory management:} If there is one thing that characterizes open world games is that they usually have very big worlds. These worlds have a huge amounts of data (entities, textures, meshes, sound, etc). Some of this games require several tens of gigabytes of compressed data in secondary disk. Obviously, we can not expect our users to have that much RAM capacity. The main challenge will be to keep memory consumption to a minimum while not compromising playability or quality. The trick we are going to use is to load into main memory only the things that are closer to the player. Another thing that we will do is to avoid duplicated resources in RAM. For example, there are is a forest that has many trees that share the same set of textures, we must accomplish that each texture is in RAM at most once.
\item \textbf{Accurate physics simulation:} Again, this is a feature that most game engines incorporate. But it is important as a main requirement because accuracy in open world games carry challenges that must be solved. We will talk about this topic later because it is complex and requires its own space ~(\ref{sec:precission}).
@@ -102,7 +198,7 @@ \section{Level-based videogames}
It is well know that computers(and other gaming devices) usually have two types of memory.
The first memory is the one we usually call main memory. Main memory is fast and small.
-The second memory is the secondary storage memory. This one is slow and big. Changing of level requires loading all the resources of the next level from secondary memory and, therefore, it is slow. That's why in most level-based games changing of level will pop-up a loading screen.and the player has to wait for a while.
+The second memory is the secondary storage memory. This one is slow and big. Changing of level requires loading all the resources of the next level from secondary memory and, therefore, it is slow. That's why in most level-based games changing of level will pop-up a loading screen and the player has to wait for a while \cite{levelgame}.
\begin{figure}[H]
\centering
@@ -111,15 +207,15 @@ \section{Level-based videogames}
\label{fig:loading_sonic}
\end{figure}
-Some times the designers of the game use the loading screen to give tips to the player.
+Sometimes, the designers of the game use the loading screen as a mean to give tips to the player.
-The approach used by level-based games is not useful for open world games we need world streaming in order to avoid loading screens.
+The approach used by level-based games is not suitable for open world games, we need world streaming in order to avoid loading screens. That doesn't mean there are not open world games that use the level-based approach but, probably, the only reason to implement an open world videogame with loading screens is because it is easier.
\section{World streaming}
-World streaming consists on loading game resources on demand. The concept is very similar to video streaming. In video streaming the data is sent from disk or from the network as it is needed. So in world streaming the game contents are taken from the disk (or from the network) to main memory as they are needed.
+World streaming consists on loading game resources and entities on demand. The concept is very similar to video streaming. In video streaming the data is sent from disk or from the network as it is needed. So in world streaming the game contents are taken from the disk (or from the network) to main memory as they are needed.
In contrast to video streaming, world streaming is not as straightforward. In video streaming the data is sequential, that is, you know what comes after. World streaming is different because what comes next depends on what the user does. So we must have the data prepared for all the decisions the user can make.
-Imagine the case of platform game such as \emph{Terraria}. \emph{Terraria} is a 2D game that has an enormous map.
+Imagine the case of a platform game such as \emph{Terraria}\footnote{\emph{Terraria} is a sandbox game by \emph{Re-Logic}}. \emph{Terraria} is a 2D game that has an enormous map.
\begin{figure}[H]
\centering
@@ -137,6 +233,8 @@ \subsection{Examples of games using world streaming}
In this section we are going to show some of the most relevant games supported by the world streaming technology.
+It is pretty easy to find out whether a game is using some kind of world streaming or not. First of all, the game uses less RAM than the size it takes in secondary storage. This would mean that not all the content of the game is loaded at start up (which could be the case in small sized games like Retro City Rampage DX\cite{retrocitysmall}). The second characteristic that identifies games using streaming is the lack of loading screens when moving around (there can be still some loading screens like the first one and when taking portals).
+
\paragraph{\emph{Hunter} - Paul Holmes (1991)}
\emph{Hunter} is one of the main influences of GTA (\emph{Grand Theft Auto}). \emph{Hunter} is a 3D action-adventure game in which the player could travel around a pretty big world. The degree of freedom in this game was enormous. There were many vehicles (bicycles, cars, ships, tanks, airplanes), places, and weapons. It is certainly not the first open world game but from the information we have I could affirm it might be the first game that used some kind of world streaming.
@@ -178,7 +276,7 @@ \subsection{Examples of games using world streaming}
\label{fig:midnight1}
\end{figure}
-This first \emph{Midnight Club} was released in the same year that the \emph{PS2} (\emph{PlayStation 2}) was commercialised. The acceptance of the public was good but sells were less than expected. One year later they released the \emph{GBA} version which was rated poorly. Despite of its unfortunate sales this game is the one that started a successful saga.
+This first \emph{Midnight Club} was released in the same year that the \emph{PS2} (\emph{PlayStation 2}) was commercialised. The acceptance of the public was good but sells were less than expected. One year later, they released the \emph{GBA} version which was rated poorly. Despite of its unfortunate sales, this game is the one that started a successful saga.
\paragraph{\emph{Dungeon Siege} - \emph{Gas Powered Games} (2002)}
@@ -236,7 +334,7 @@ \subsection{Examples of games using world streaming}
\paragraph{\emph{Minecraft} - \emph{Mojang} (2011)}
-\emph{Minecraft} is the sandbox MMO that proved that games are not all about graphics.
+\emph{Minecraft} is the sandbox that proved that games are not all about graphics.
\begin{figure}[H]
\centering
@@ -281,7 +379,14 @@ \subsection{The strategy}
\subsection{Loading Resources is slow}
-Imagine that we have implemented our strategy and in a given moment the player has changed of node. We will have to load to main memory all the entities that are located in the new adjacent cell (or node). That implies: loading from disk the file that describes that cell, parsing that file in order to find the entities, loading all the resources that are required by the entities and finally creating the entities. So when the node had been loaded you would realize that you have spent 1 second (or much more) and in this time you haven't rendered a single frame!. This would be perceived by the user as a freeze. Therefore, we have to solve this in some way.
+Imagine that we have implemented our strategy and in a given moment the player has changed of node. We will have to load to main memory all the entities that are located in the new adjacent cells (or nodes). That implies: loading from disk the file that describes that cell, parsing that file in order to find the entities, loading all the resources that are required by the entities and finally creating the entities. So when the node had been loaded you would realize that you have spent 1 second (or much more) and in this time you haven't rendered a single frame!. This would be perceived by the user as a freeze. Therefore, we have to solve this in some way.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.6]{game_loop_disk.pdf}
+ \caption{Loading from disk in the main loop.}
+ \label{fig:mainloop}
+\end{figure}
The bottleneck here is the access to disk. Access to disk blocks the CPU and requires some time. So most of the time, when loading a new cell, the CPU would be idle while it could be doing important tasks (e.g. physics simulation or rendering). The solution that is suggested in the article of \emph{Scott Bilas} (and the one we have followed) is to use a separate thread for loading resources from disk. So if our main thread (the one that executes the main loop) needs to load a resource, instead of doing it itself, it asks the background thread to do it. This way, the main thread is never idle when there is job to be done and the secondary thread will be loading from disk at its own pace.
@@ -292,6 +397,13 @@ \subsection{Loading Resources is slow}
\label{fig:comic1}
\end{figure}
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.7]{game_loop_disk_2.pdf}
+ \caption{Loading from disk is performed by a secondary thread}
+ \label{fig:mainloop2}
+\end{figure}
+
\section{The architecture of the engine}
Our game engine will be composed by some subsystems.
@@ -332,10 +444,10 @@ \subsubsection{Architecture}
\label{fig:renderer}
\end{figure}
-The low-level renderer API is just a reduced set of functions that allows to draw things on the screen. On the other hand the high-level renderer provides a class-based mechanism to define the scene. That is, in the low-level renderer we would say: "draw texture A in position X" and it will be shown on the screen for just this frame. And in the -high-level renderer we would say: "there exists a sprite in X and it has priority P" and it would be drawn on the screen until it is removed.
+The low-level renderer API is just a reduced set of functions that allows to draw things on the screen. On the other hand the high-level renderer provides a class-based mechanism to define the scene. That is, in the low-level renderer we would say: "draw texture A in position X" and it will be shown on the screen for just this frame. And in the high-level renderer we would say: "there exists a sprite in X and it has priority P" and it would be drawn on the screen until it is removed.
\subsubsection{Features}
-The renderer I have implemented is not very sophisticated but works fine for our purpose. Animations are not yet supported. You can assign priorities to the sprites in order to define what is drawn on top. There is an abstraction of the camera too. The low-level renderer uses OpenGL ES (embedded systems), so it could be ported to mobile platforms.
+The renderer I have implemented is not very sophisticated but works fine for our purpose. Animations are not yet supported(Update: I have implemented a new animation system [\ref{"sec:animationsystem"}]). You can assign priorities to the sprites in order to define what is drawn on top. There is an abstraction of the camera too. The low-level renderer uses the subset of functions available in OpenGL ES (embedded systems), so it could be ported to mobile platforms.
\subsubsection{Why did I implement my own graphics engine?}
@@ -355,7 +467,7 @@ \subsubsection{Why did I implement my own graphics engine?}
\item \textbf{Allocate the resource in video card memory.} To render an object all its resources must be in the memory of the graphics card. To allocate, for instance, a texture in video memory we need to call OpenGL functions. That is the reason this step must be performed by the main thread (only the main thread is allowed to call OpenGL functions). Fortunately, the process copying a resource from RAM to VRAM is fast enough, so it does not block other tasks.
-\item \textbf{Delete the resource in MM.} Once the resource is en VRAM, we do not need it anymore in RAM. This task is not costly and could be performed by any thread. In our implementation it is deleted by the secondary thread because we think it makes more sense that the memory is released by the same thread it was allocated by. Also, in this way the code seems better encapsulated.
+\item \textbf{Delete the resource in MM.} Once the resource is in VRAM, we do not need it anymore in RAM. This task is not costly and could be performed by any thread. In our implementation it is deleted by the secondary thread because we think it makes more sense that the memory is released by the same thread it was allocated by. Also, in this way the code seems better encapsulated.
\end{itemize}
@@ -363,20 +475,20 @@ \subsubsection{Why did I implement my own graphics engine?}
\paragraph{I had personal interest in learning modern OpenGL.}
-Also, I wanted an excuse to learn modern OpenGL features like shaders. The version of OpenGL I used is OpenGL ES 2.0. This version of OpenGL is compatible with embedded systems like smartphones. In this version you are forced to use shaders because all the fixed pipeline functionality has been removed. I will dedicate a section to explain briefly how to use shaders in modern OpenGL.
+Also, I wanted an excuse to learn modern OpenGL features like shaders. The version of OpenGL I used is OpenGL ES 2.0. This version of OpenGL is compatible with embedded systems, smartphones and tablets. In this version you are forced to use shaders because all the fixed pipeline functionality has been removed. I will dedicate a section to explain briefly how to use shaders in modern OpenGL.
\subsubsection{Modern OpenGL programming}
I do not pretend to make a tutorial on modern OpenGL nor shaders but just to summarize what I have done.
I have used only the subset of API that is common to OpenGL 2.1 and OpenGL ES 2.0. In my testings, I used version 2.1, which is the one that runs on PC.
-Since OpenGL does not support fixed pipeline functions I had to use shaders. What are shaders? Basically , they are pieces of code that run in the graphics card. They are used to achieve custom visual effects\cite{shader}. In OpenGL shaders are written in a specific programming language called GLSL. GLSL is very similar to C\cite{glsl}].
+Since OpenGL ES does not support fixed pipeline functions I had to use shaders. What are shaders? Basically , they are pieces of code that run in the graphics card. They are used to achieve custom visual effects\cite{shader}. In OpenGL shaders are written in a specific programming language called GLSL. GLSL is very similar to C\cite{glsl}].
There are two types of shader.
\begin{itemize}
-\item \textbf{Vertex shader.} Vertex shaders take as input one vertex and gives as output the position (or other properties like normal) that vertex should take. It is used to achieve effects such as mesh deformation. One example where vertex shaders are used is the waves of the ocean. The vertex shader should change the position of vertices so it fakes the water moving. In our 2D render engine, we do not need the vertex shader to do anything special: it just forwards the position as it is.
+\item \textbf{Vertex shader.} Vertex shaders take as input one vertex and gives as output the position (or other properties like normal and UV coordinates) that vertex should take. It is used to achieve effects such as mesh deformation. One example where vertex shaders are used is the waves of the ocean. The vertex shader should change the position of vertices so it fakes the water moving. In our 2D render engine, we do not need the vertex shader to do anything special: it just forwards the position as it is.
\begin{minted}{c}
@@ -459,7 +571,7 @@ \subsubsection{Modern OpenGL programming}
\label{fig:shad}
\end{figure}
-Once you have built your shader program you can use it at any time. These are the tutorials I read \cite{shadtut} \cite{glmodtut} \cite{learngl}.
+Once you have built your shader program you can use it at any time. These are the tutorials that I have learned from: \cite{shadtut} \cite{glmodtut} \cite{learngl}.
Since in modern OpenGL ES matrix operations (such as \emph{glRotatef()}) have been removed I had to use one geometry library: GLM\cite{glm}. For window management I used SDL2\cite{glm}. And for texture loading I employed SOIL\cite{soil}.
@@ -477,7 +589,7 @@ \subsection{Physics System}
Our wrapper consists of two main classes: PhysicsComponent and PhysicsSystem. The first one is an abstract class that represents a rigid body. In our engine entities are composed of components and PhysicsComponent is one of them. An entity could have a PhysicsComponent or not.
-There is only one implementation of PhysicsComponent: PhysicsBox. It is just a rectangle shaped body. You can assign mass, dimensions and position to it. Also you can chose at creation time if it is dynamic or kinematic. Kinematic bodies will not be affected by forces.
+There are only two implementations of PhysicsComponent: PhysicsBox and PhysicsCircle. PhysicsBox is defined by some and width and height (axially aligned) and PhysicsCircle by the radius. You can assign mass, dimensions and position to it. Also you can chose at creation time if it is dynamic or kinematic. Kinematic bodies will not be affected by forces. Also, if mass 0 is assigned to a body it will be assumed to be static (can't be moved at all).
PhysicsComponent's are created by a request to the PhysicsSystem. When you are done with a PhysicsComponets request its deletion to the PhysicsSystem. The GraphicsSystem and the PhysicsSystem run at the same rate. So in the main loop you only have to call the update function of the two systems.
@@ -497,6 +609,31 @@ \subsubsection{The issue of the precission}
So how can we solve this? Well, if the problem raises because the entities are too far from the origin of coordinates, let us move the entities to where the origin of coordinates is (or move the origin of coordinates to where the entities are). We will retake this topic in the "World streamer" section (\ref{sec:worldstreamer}).
+\subsubsection{Alternative approaches}
+There are other approaches to overcome the precision issue.
+
+\begin{itemize}
+
+\item \textbf{Using \emph{double}:} Double precision floating point numbers have a broader range and better accuracy. It would be pretty straightforward to replace \emph{float}s by \emph{double}s. But this is not scalable. What if we need even more accuracy?. Also, some graphics cards might not support \emph{double}s. Therefore, animations and visual feedback would look poor.
+
+\item \textbf{Using fixed-point:} Fixed-point numbers (FPN) have constant precision in all ranges. The range might be too small but we can always use \emph{long} integers for a broader range and better accuracy. We could use libraries for even greater integers (BigInt), although this would decrease performance. There are drawbacks for this solution. The physics engine might not support FPNs, eventhough we could spend time modifying the source if it is available. The graphics card might not support them (specially with 64-bit). In genaral, since floating point numbers are so extended, it would be difficult to integrate with existing software.
+
+\end{itemize}
+
+\subsubsection{Our approach}
+
+The approach we have chosen has many benefits and the only drawback is that it is a bit diffucult to implement.
+
+Having the origin of coordinates close to the entities allows us to use the most precise range of floating point numbers. In that range, floating-point is even more accurate than fixed-point.
+
+Since we are using the floating-point numbers that most graphics cards are optimized for, we get the best possible performance. And the compatibility is also the best.
+
+We can use any existing software because floating-point is so extended.
+
+When storing entities for persistence, the positions will be relative to the cell they belong to. So any position in the world could be represented as a pair of cell (integer vector) and relative position (float vector). So as long as the cell size keeps small, the precision will be fine. And the integer representation is broad enough for most cases. If 32-bit integers were not enough, you could always use 64-bit or even libraries such as TTMath\cite{workqueue}. With our representation we have good accuracy and unlimited range scalability without droping performance.
+
+The representation that we have used is the same that Scott Bilas suggests\cite{worldbilas}.
+
\subsection{Resource Manager}
The resource manager is the system that takes care of accessing the secondary storage memory. It provides all the other system components an interface to get resources when they need them without having to wait.
@@ -524,21 +661,21 @@ \subsection{Resource Manager}
The resource handle is returned in all cases. The handle has an attribute that tells if the resource is loaded or not.
-So for instance, the renderer needs to draw a texture. Therefore, the graphics system requests to the resource manager that texture. Every frame, the graphics system will check if the resource has been loaded. And if it is, it will draw the texture.
+So for instance, the renderer needs to draw a texture. Therefore, the graphics system requests to the resource manager that texture. Every frame, the graphics system will check if the resource has been loaded. And if it is, the texture is drawn.
The resource manager needs to keep track of how many handles are pointing to each resource. When the number of handles for one resource becomes zero, the resource is released.
If one resource needs to be loaded, that request is enqueued in a special queue. What is so special about this queue is that it is prepared for being accessed by several threads (thread safe queue). This type of queue is usually called work queue.
-In our implementation there is the abstract class Resource. These are the classes that inherit from Resource:
+In our implementation there is the abstract class Resource. These are some of the classes that inherit from Resource:
\begin{itemize}
-\item{\emph{ResourceText.}} It represents a text file on disk. When loaded you will be able to read the file using "getText()".
+\item{\emph{\textbf{ResourceText}}}. It represents a text file on disk. When loaded you will be able to read the file using "\emph{getText()}".
-\item{\emph{ResourceTexture}} This is resource that will be required by the sprites. When loaded you can call "getTexture()" and you will be given a "LowLevelRenderer::Texture*".
+\item{\emph{\textbf{ResourceTexture}}}. This is the resource that will be required by the sprites. When loaded you can call "\emph{getTextureData()}" and you will be given a pointer to the raw texture data.
-\item{\emph{ResourceCell.}} This resource is quite special. When loaded, you will be able to get the data also. But this time you can modify the data. You are given a XML node and you can modify it. When there are no references to a ResourceCell it will be released and all changes made will be stored. This resource is used to represent a cell where entities can be placed. Therefore, you can add and remove entities from the cell and seamlessly all changes will be persistent.
+\item{\emph{\textbf{ResourceCell}}}. This resource is quite special. When loaded, you will be able to get the data also. But this time you can modify the data. You are given a XML node and you can modify it. When there are no references to a \emph{ResourceCell} it will be released and all changes made will be stored. This resource is used to represent a cell where entities can be placed. Therefore, you can add and remove entities from the cell and seamlessly all changes will be persistent.
\end{itemize}
@@ -648,20 +785,22 @@ \section{Result and testing}
The final application consists of a stable game engine. Yet not fully-featured.
+\textbf{Note:} There is section \ref{"sec:animationsystem"}, where we show a newer version of the engine.
+
\begin{figure}[H]
\centering
- \includegraphics[scale=0.38]{screenshot1.png}
+ \includegraphics[scale=0.36]{screenshot1.png}
\caption{Demo screenshot.}
\label{fig:screenshot1}
\end{figure}
\subsection{Demo}
-As you can see we have developed a demo using our game engine. After a lot of debugging, everything seems to work very well. Graphics are fine, physics are accurate and overall performance is petty good.
+As you can see, we have developed a demo using our game engine. After a lot of debugging, everything seems to work very well. Graphics are fine, physics are accurate and overall performance is petty good.
In order to test our system intensively, we have written an script that generates a random world. We have made our tests with a world of 1 million cells (which is about 4GB of XML files). The files must be located in the "\emph{world\_folder}" directory. In the same folder there is the main character file (\emph{main\_character.xml}). In this file you can configure the appearance, position and other stuff of the main character.
-Our application allows to zoom in and zoom out the camera using the mouse wheel. When you open the application you will see something like in figure 26.
+Our application allows to zoom in and zoom out the camera using the mouse wheel. When you open the application you will see something like in figure \ref{fig:screenshot1}.
If you zoom out the camera you will be able to see the boundaries of the visualization.
@@ -676,10 +815,13 @@ \subsection{Demo}
So if you zoom in enough, the player will not realize that the entities are being loaded a he walks.
You can watch this video of the demo \url{https://youtu.be/ymecWxF886U}.
+The previous video shows the demo at the time the first performance tests where made.
+
+There it is a video of the engine with the latest features (much better looking) \url{https://vimeo.com/159836286}.
\subsection{Performance}
-The memory consumption is very low. Running with one million of cells we get a RAM consumption of ~70MB.
+The memory consumption is very low. Running with one million of cells we get a RAM consumption of $\sim$70MB.
The world window is the space that will determine the set of entities that are loaded at any given time. We can configure the size of the world window in \emph{init\_file.xml}. The world window is always square shaped and the side is always odd. The number you have to put in the configuration file is not the side of the world window, it is $(side-1)/2$. This way, the introduced number is always valid.
@@ -726,7 +868,9 @@ \subsection{Performance}
\caption{Performance tests.}
\end{table}
-The CPU consumption is highly dependent on the window size. We have measured that most of the CPU consumption is drawn at the drawing stage. That might be because our tests have been made on a system without dedicated graphics card. The CPU consumption of the physics simulation is only a small part and the consumption of the other subsystems are negligible.
+The CPU consumption is highly dependent on the window size. We have measured that most of the CPU consumption is drawn at the drawing stage. The CPU consumption of the physics simulation is only a small part and the consumption of the other subsystems are negligible.
+
+A big part (around half of the total) of the time spent during the drawing stage relies in matrix operations. I think there might be a slight margin of improvement in these matrix operations but not much.
Speaking about RAM consumption, the amount of RAM used increases very slowly compared to CPU. That is indeed the prove that our resource manager is taking care of duplicates.
@@ -776,23 +920,150 @@ \section{Conclusion}
Physics simulation is accurate thanks to the, moving the origin of coordinates, strategy. We have wrapped a particular physics engine but all the concepts used are applicable to any other physics engine.
-We have implemented a small render engine. The reader of this article would learn how to implement a graphics system that has to cooperate with the resource manager to overcome the limitations of multithreading with OpenGL. Also, I have learned the basics of modern OpenGL programming and I have applied then.
+We have implemented a small render engine. The reader of this article would learn how to implement a graphics system that has to cooperate with the resource manager to overcome the limitations of multithreading with OpenGL. Also, I have learned the basics of modern OpenGL programming and I have applied them.
Also, we have implemented a resource manager that could be used in other types of applications, not only videogames. Our resource manager is easy to extend. Avoiding race conditions has been a difficulty and we have successfully dealt with it.
-The world streamer implementation works fine and our architecture would allow to create new implementations and swap between them easily. The world streamer if configurable, so it can be adapted to the hardware capabilities.
+The world streamer implementation works fine and our architecture would allow to create new implementations and swap between them easily. The world streamer is configurable, so it can be adapted to the hardware capabilities.
-I was not a main requirement but we also managed so the modifications of the world are persistent.
+It was not a main requirement but we also managed so the modifications of the world are persistent.
The code is well documented using doxygen syntax. Hopefully, any developer who is interested in learning or contributing could understand the code and extend the engine.
-In my opinion world streaming is an interesting topic in the field of videogames. I think open world videogames will keep being among the most popular videogames. Up to now, successful open world videogames have come from very important companies that can make great investments. From my point of view, open world games are a difficult target for small companies and indie developers. Not only because the implementation of an appropriate engine is a lot of work, but also because a lot of content and resources have to be produced. I said difficult, not impossible. I think in some years the number of available tools for making open world games will grow and they will be accessible for anybody. I hope to see some indie open world games in some years.
+In my opinion world streaming is an interesting topic in the field of videogames. I think open world videogames will keep being among the most popular videogames. Up to now, successful open world videogames have come from very important companies that can make great investments. From my point of view, open world games are a difficult target for small companies and indie developers. Not only because the implementation of an appropriate engine is a lot of work, but also because a lot of content and resources have to be produced. But if the proper tools become available to them, that target will get feasible. Also, procedural generation could help developers to fill the world with great content. I think in some years the number of available tools for making open world games will grow and they will be accessible for anybody. I hope to see some indie open world games in a few years.
+
+\section{Update: animation system}
+\label{"sec:animationsystem"}
+
+The new animation system I have implemented extends the engine and adds some complexity. Also, implementing this feature forced me to refactor the code. Now the engine is performing better (in terms of loading times), more stable and better organized.
+
+The animation system is implemented from scratch. The animations are based in frames.
+
+We have created a custom file format based in XML for representing sprites. Sprites can have multiple animations. The structure of these sprite files is represented in the following UML diagram.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.4]{sprite_uml.pdf}
+ \caption{UML diagram}
+ \label{fig:spriteuml}
+\end{figure}
+
+As you can see, one sprite has at least one animation and each animation has at least one frame. Frames have associated a duration and a rectangular region in a texture. Having the possibility to refer to a specific region of a texture allows us to use sprite sheets.
+
+There are a lot of sample sprites in the \emph{bin/sprites} directory. This is a fragment of the sprite that we use as our main character:
+
+\begin{minted}{xml}
+
+
+
+ pokemon_red_pj.png
+
+
+
+
+
+
+ sp1
+
+ 320
+ 3232
+
+
+
+
+
+ ...
+
+
+
+ sp1
+
+ 096
+ 3232
+
+
+
+
+ sp1
+
+ 3296
+ 3232
+
+
+
+
+ sp1
+
+ 6496
+ 3232
+
+
+
+
+
+
+
+
+
+
+\end{minted}
+
+It is useful to have an id for every animation, so it's straight forward to set an animation programmatically. If we wish to make an sprite which is not animated, we can make an animation with only one frame, since animations loop by default.
+
+In the following diagram we try to represent the mechanism we use in order to load and display sprites.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.8]{sprite_loading.pdf}
+ \caption{Flow chart of the sprite's loading process}
+ \label{fig:spriteloading}
+\end{figure}
+
+Now there are more steps than when we had just static images. We need to read the XML of each sprite and from that file obtain the textures that must be loaded.
+
+In the same way we made sure that no texture is twice in memory, we want to make sure no sprite is twice in memory. The class \emph{Sprite} contains the data which is common to all the entities using it. And the class \emph{SpriteStatus} only keeps track of the current status of the animation. That is, the current frame and the time spent in the current frame.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.7]{sprite_status_uml.pdf}
+ \caption{UML representation of the \emph{Sprite} and \emph{SpriteStatus} classes}
+ \label{fig:spritestatusuml}
+\end{figure}
+
+In order to test the animation system I have created a new automatic world generation script. You can find it in "\emph{bin/world\_gens}". This new generator makes better looking worlds. The world is made up of a big set of template cells (can be found at \emph{bin/cell\_templates}). Our generator takes as input a certain number of rows and columns and fills the world with randomly chosen cell templates. This is an example of what we have seen in \ref{sec:contentgen}. In this case we are making a mixture of manually generated content and automatically generated content.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[scale=0.5]{anim_screenshot.png}
+ \caption{Screenshot of one generated world}
+ \label{fig:animscreenshot}
+\end{figure}
+
+In terms of performance we have performed the same tests we did and it seems that the animation system has not affected at all. The bottleneck keeps being the rendering stage.
+
+\section{Future extensions}
+
+I have taken the development of this game engine as a hobby. I pretend to continue the development in my spare time.
+
+These are some of the features that I would like to get implemented.
+
+\begin{itemize}
+
+ \item \textbf{Scripting:} I have already started working on this feature. Right now, implementing game logic is really difficult. Since the beginning, the game logic was intended to be done by scripting. When this feature got implemented, I would consider the game engine usable to make some real games. I want to embed the Lua programming language.
+
+ \item \textbf{World editor tool:} Right now, everything has to be done by editing text files. It would be great to have a tool that allows to edit the world and manage the assets. That would make the engine friendlier to use.
+
+ \item \textbf{Sound:} No game is complete without sound.
+
+ \item \textbf{World description data compression:} If you generate a very big world the \emph{world\_folder} gets flooded of small cell files. Getting these files packed in a single compressed file would save a lot of space and would make the \emph{world\_folder} easier to manage.
+
+\end{itemize}
\section{License}
The developed software is open source. It is licensed under the MIT License.
-The project is hosted in a pulic repository:\newline \url{https://github.com/tuket/OWMAN}.
+The project is hosted in a public repository:\newline \url{https://github.com/tuket/OWMAN}.
\section{Tools and dependencies}
@@ -846,11 +1117,11 @@ \subsection{Dependencies}
\newline
\url{www.lonesock.net/soil.html}
-\item{\textbf{GLEW.}} Necessary if you want to use modern OpenGL.
+\item{\textbf{GLEW.}} A library that defines the OpenGL extensions.
\newline
\url{glew.sourceforge.net}
-\item{\textbf{GLM.}} A mathematic library for OpenGL.
+\item{\textbf{GLM.}} A mathematics library for OpenGL.
\newline
\url{http://glm.g-truc.net}
\end{itemize}
@@ -973,8 +1244,24 @@ \subsection{Dependencies}
Game Engine Architecture - Jason Gregory
\newline
\url{http://www.gameenginebook.com}
-
+\bibitem{ttmathlink}
+ \hypertarget{ttmathlink}
+ TTMath library
+ \newline
+ \url{http://www.ttmath.org/}
+
+\bibitem{levelgame}
+\hypertarget{levelgame}
+Level (video gaming) - Wikipedia
+\newline
+\url{https://en.wikipedia.org/wiki/Level_%28video_gaming%29}
+
+\bibitem{retrocitysmall}
+\hypertarget{retrocitysmall}
+Steam discussion about the small size of Retro City Rampage
+\newline
+\url{http://steamcommunity.com/app/204630/discussions/0/882962698536189638/}
\end{thebibliography}
diff --git a/doc/doxy/doxyfile b/doc/doxy/doxyfile
index 5a06f13..9b09956 100644
--- a/doc/doxy/doxyfile
+++ b/doc/doxy/doxyfile
@@ -91,88 +91,106 @@ WARN_IF_UNDOCUMENTED = NO
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = YES
WARN_FORMAT = "$file:$line: $text"
-WARN_LOGFILE = "/home/tuket/prog/owman/src/doc/doxy/doxygen.log"
+WARN_LOGFILE = "/home/tuket/prog/owman_anim/src/doc/doxygen.log"
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = \
- "../../physics/physics_system.cpp" \
- "../../resource_manager/resource_cell_factory.cpp" \
- "../../resource_manager/resource.cpp" \
- "../../test_world_streamer.cpp" \
- "../../resource_manager/resource_texture_factory.cpp" \
- "../../renderer/low_level_renderer_2d.cpp" \
- "../../main.cpp" \
- "../../i_world_streamer.cpp" \
- "../../engine.hpp" \
- "../../physics/physics_component.hpp" \
- "../../physics/physics_box_factory.cpp" \
- "../../math/vec2i.cpp" \
- "../../resource_manager/resource_factory.hpp" \
- "../../math/vec2i.hpp" \
- "../../renderer/sprite_factory.hpp" \
- "../../physics/physics_box.hpp" \
- "../../resource_manager/work_queue.cpp" \
- "../../renderer/sprite.cpp" \
- "../../resource_manager/resource_table.cpp" \
- "../../renderer/color.hpp" \
- "../../resource_manager/resource_table.hpp" \
- "../../entity_factory.hpp" \
- "../../resource_manager/resource_texture.hpp" \
- "../../resource_manager/resource.hpp" \
- "../../renderer/sprite_factory.cpp" \
- "../../resource_manager/resource_text.cpp" \
- "../../resource_manager/resource_factory.cpp" \
- "../../renderer/camera.hpp" \
- "../../resource_manager/resource_cell_factory.hpp" \
- "../../renderer/sprite.hpp" \
- "../../physics/physics_box.cpp" \
- "../../world_window.cpp" \
- "../../resource_manager/resource_text_factory.hpp" \
- "../../math/vec2f.hpp" \
- "../../main_character.hpp" \
- "../../resource_manager/resource_request.hpp" \
- "../../IO/event_handler.cpp" \
- "../../world_cell.cpp" \
- "../../physics/physics_component.cpp" \
- "../../entity_factory.cpp" \
- "../../engine.cpp" \
- "../../resource_manager/resource_request.cpp" \
- "../../resource_manager/resource_cell.cpp" \
- "../../resource_manager/resource_manager.cpp" \
- "../../main_character.cpp" \
- "../../i_world_streamer.hpp" \
- "../../demos/test_is_cell_file.cpp" \
- "../../resource_manager/resource_texture_factory.hpp" \
- "../../renderer/graphics_component.hpp" \
- "../../resource_manager/resource_table_entry.cpp" \
- "../../resource_manager/resource_texture.cpp" \
- "../../renderer/graphics_system.cpp" \
- "../../physics/physics_system.hpp" \
- "../../entity.cpp" \
- "../../util/file_to_string.hpp" \
- "../../renderer/graphics_system.hpp" \
- "../../renderer/low_level_renderer_2d.hpp" \
- "../../IO/event_handler.hpp" \
- "../../util/file_to_string.cpp" \
- "../../resource_manager/resource_text.hpp" \
- "../../physics/physics_box_factory.hpp" \
- "../../world_streamer.cpp" \
- "../../resource_manager/resource_table_entry.hpp" \
- "../../resource_manager/resource_text_factory.cpp" \
- "../../resource_manager/resource_manager.hpp" \
- "../../renderer/camera.cpp" \
- "../../resource_manager/resource_cell.hpp" \
- "../../entity.hpp" \
- "../../test_world_streamer.hpp" \
- "../../demos/test_regex.cpp" \
- "../../world_cell.hpp" \
- "../../demos/demo_box2d.cpp" \
- "../../math/vec2f.cpp" \
- "../../world_streamer.hpp" \
- "../../renderer/graphics_component.cpp" \
- "../../world_window.hpp" \
- "../../resource_manager/work_queue.hpp"
+ "../entity.hpp" \
+ "../util/xmlstr.cpp" \
+ "../renderer/sprite.cpp" \
+ "../physics/physics_box.cpp" \
+ "../main.cpp" \
+ "../renderer/color.hpp" \
+ "../demos/demo_box2d.cpp" \
+ "../util/xmlstr.hpp" \
+ "../math/functions.cpp" \
+ "../physics/physics_circle_factory.hpp" \
+ "../resource_manager/resource_manager.cpp" \
+ "../i_world_streamer.cpp" \
+ "../renderer/graphics_component.hpp" \
+ "../world_streamer.cpp" \
+ "../resource_manager/resource_cell.cpp" \
+ "../renderer/animation_frame.hpp" \
+ "../renderer/sprite_manager.cpp" \
+ "../renderer/camera.hpp" \
+ "../math/aarect.cpp" \
+ "../resource_manager/resource_table_entry.hpp" \
+ "../resource_manager/resource_text.cpp" \
+ "../resource_manager/resource_table.cpp" \
+ "../resource_manager/resource_sprite.cpp" \
+ "../entity_factory.cpp" \
+ "../physics/physics_component.hpp" \
+ "../resource_manager/resource.cpp" \
+ "../math/vec2f.cpp" \
+ "../engine.hpp" \
+ "../renderer/texture_manager.cpp" \
+ "../entity.cpp" \
+ "../resource_manager/resource_text.hpp" \
+ "../IO/event_handler.hpp" \
+ "../renderer/animation_frame.cpp" \
+ "../renderer/graphics_system.hpp" \
+ "../resource_manager/work_queue.cpp" \
+ "../world_cell.hpp" \
+ "../resource_manager/resource_cell.hpp" \
+ "../renderer/animation.cpp" \
+ "../math/functions.hpp" \
+ "../physics/physics_box_factory.cpp" \
+ "../math/vec2f.hpp" \
+ "../renderer/graphics_component.cpp" \
+ "../world_streamer.hpp" \
+ "../util/file_to_string.hpp" \
+ "../resource_manager/resource_texture.hpp" \
+ "../test_world_streamer.hpp" \
+ "../demos/test_regex.cpp" \
+ "../i_world_streamer.hpp" \
+ "../renderer/sprite_status.hpp" \
+ "../util/exception.hpp" \
+ "../util/file_to_string.cpp" \
+ "../demos/test_is_cell_file.cpp" \
+ "../renderer/camera.cpp" \
+ "../physics/physics_circle_factory.cpp" \
+ "../renderer/sprite_status.cpp" \
+ "../physics/physics_box.hpp" \
+ "../world_window.hpp" \
+ "../test_world_streamer.cpp" \
+ "../physics/physics_component.cpp" \
+ "../renderer/graphics_system.cpp" \
+ "../physics/physics_system.hpp" \
+ "../renderer/sprite_manager.hpp" \
+ "../renderer/sprite.hpp" \
+ "../world_window.cpp" \
+ "../math/aarect.hpp" \
+ "../util/time_conversions.hpp" \
+ "../physics/physics_system.cpp" \
+ "../resource_manager/resource_request.hpp" \
+ "../resource_manager/resource_manager_templates.hpp" \
+ "../renderer/low_level_renderer_2d.cpp" \
+ "../cell_size.hpp" \
+ "../math/vec2i.cpp" \
+ "../math/vec2i.hpp" \
+ "../world_cell.cpp" \
+ "../physics/physics_circle.hpp" \
+ "../main_character.hpp" \
+ "../engine.cpp" \
+ "../resource_manager/resource_table.hpp" \
+ "../entity_factory.hpp" \
+ "../IO/event_handler.cpp" \
+ "../physics/physics_box_factory.hpp" \
+ "../renderer/low_level_renderer_2d.hpp" \
+ "../renderer/animation.hpp" \
+ "../resource_manager/resource_manager.hpp" \
+ "../resource_manager/resource_request.cpp" \
+ "../physics/physics_circle.cpp" \
+ "../renderer/texture_manager.hpp" \
+ "../util/stack_trace.hpp" \
+ "../main_character.cpp" \
+ "../resource_manager/resource.hpp" \
+ "../resource_manager/work_queue.hpp" \
+ "../resource_manager/resource_texture.cpp" \
+ "../resource_manager/resource_table_entry.cpp" \
+ "../renderer/texture.hpp" \
+ "../renderer/texture.cpp"
INPUT_ENCODING = UTF-8
FILE_PATTERNS =
RECURSIVE = NO
diff --git a/doc/doxy/doxygen.log b/doc/doxy/doxygen.log
index 759ffe8..979cf93 100644
--- a/doc/doxy/doxygen.log
+++ b/doc/doxy/doxygen.log
@@ -1,39 +1,48 @@
-/home/tuket/prog/owman/src/renderer/low_level_renderer_2d.cpp:126: warning: no uniquely matching class member found for
+/home/tuket/prog/owman_anim/src/world_streamer.cpp:200: warning: no matching class member found for
+ WorldStreamer::WorldStreamer(string worldFolder, EntityFactory *entityFactory, float cellSize, unsigned int windowSize)
+Possible candidates:
+ WorldStreamer::WorldStreamer()
+ WorldStreamer::WorldStreamer(std::string worldFolder, EntityFactory *entityFactory, float cellSize=250.f, unsigned int windowSize=2)
+
+/home/tuket/prog/owman_anim/src/renderer/sprite_status.cpp:107: warning: no matching class member found for
+ void SpriteStatus::setAnimation(const string &animName)
+Possible candidates:
+ void SpriteStatus::setAnimation(const std::string &animName)
+ void SpriteStatus::setAnimation(unsigned animIndex)
+
+/home/tuket/prog/owman_anim/src/renderer/low_level_renderer_2d.cpp:193: warning: no uniquely matching class member found for
LowLevelRenderer2D::LowLevelRenderer2D(string windowTitle, unsigned int width, unsigned int height, bool fullScreen)
Possible candidates:
- LowLevelRenderer2D::LowLevelRenderer2D()' at line 88 of file /home/tuket/prog/owman/src/renderer/low_level_renderer_2d.hpp
- LowLevelRenderer2D::LowLevelRenderer2D(std::string windowTitle, unsigned int width, unsigned int height, bool fullScreen)' at line 90 of file /home/tuket/prog/owman/src/renderer/low_level_renderer_2d.hpp
+ LowLevelRenderer2D::LowLevelRenderer2D()' at line 126 of file /home/tuket/prog/owman_anim/src/renderer/low_level_renderer_2d.hpp
+ LowLevelRenderer2D::LowLevelRenderer2D(std::string windowTitle, unsigned int width, unsigned int height, bool fullScreen)' at line 128 of file /home/tuket/prog/owman_anim/src/renderer/low_level_renderer_2d.hpp
-/home/tuket/prog/owman/src/resource_manager/resource_request.cpp:5: warning: no matching class member found for
+/home/tuket/prog/owman_anim/src/resource_manager/resource_request.cpp:5: warning: no matching class member found for
ResourceRequest::ResourceRequest(ResourceRequest::Type type, string name)
Possible candidates:
ResourceRequest::ResourceRequest()
ResourceRequest::ResourceRequest(Type type, std::string name)
-/home/tuket/prog/owman/src/world_streamer.cpp:197: warning: no matching class member found for
- WorldStreamer::WorldStreamer(string worldFolder, EntityFactory *entityFactory, float cellSize, unsigned int windowSize)
-Possible candidates:
- WorldStreamer::WorldStreamer()
- WorldStreamer::WorldStreamer(std::string worldFolder, EntityFactory *entityFactory, float cellSize=250.f, unsigned int windowSize=2)
-
-/home/tuket/prog/owman/src/renderer/graphics_component.hpp:71: warning: argument 'The' of command @param is not found in the argument list of GraphicsComponent::createXmlNode(rapidxml::xml_document<> *doc)=0
-/home/tuket/prog/owman/src/renderer/graphics_component.hpp:71: warning: The following parameters of GraphicsComponent::createXmlNode(rapidxml::xml_document<> *doc)=0 are not documented:
+/home/tuket/prog/owman_anim/src/renderer/graphics_component.hpp:54: warning: argument 'The' of command @param is not found in the argument list of GraphicsComponent::createXmlNode(rapidxml::xml_document<> *doc)
+/home/tuket/prog/owman_anim/src/renderer/graphics_component.hpp:54: warning: The following parameters of GraphicsComponent::createXmlNode(rapidxml::xml_document<> *doc) are not documented:
parameter 'doc'
-/home/tuket/prog/owman/src/i_world_streamer.hpp:45: warning: argument 'offset' of command @param is not found in the argument list of IWorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)=0
-/home/tuket/prog/owman/src/i_world_streamer.hpp:45: warning: The following parameters of IWorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)=0 are not documented:
+/home/tuket/prog/owman_anim/src/i_world_streamer.hpp:45: warning: argument 'offset' of command @param is not found in the argument list of IWorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)=0
+/home/tuket/prog/owman_anim/src/i_world_streamer.hpp:45: warning: The following parameters of IWorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)=0 are not documented:
parameter 'position'
parameter 'mainCharacter'
-/home/tuket/prog/owman/src/physics/physics_box.hpp:32: warning: argument 'The' of command @param is not found in the argument list of PhysicsBox::createXmlNode(rapidxml::xml_document<> *doc)
-/home/tuket/prog/owman/src/physics/physics_box.hpp:32: warning: The following parameters of PhysicsBox::createXmlNode(rapidxml::xml_document<> *doc) are not documented:
+/home/tuket/prog/owman_anim/src/physics/physics_box.hpp:26: warning: argument 'The' of command @param is not found in the argument list of PhysicsBox::createXmlNode(rapidxml::xml_document<> *doc)
+/home/tuket/prog/owman_anim/src/physics/physics_box.hpp:26: warning: The following parameters of PhysicsBox::createXmlNode(rapidxml::xml_document<> *doc) are not documented:
+ parameter 'doc'
+/home/tuket/prog/owman_anim/src/physics/physics_circle.hpp:26: warning: argument 'The' of command @param is not found in the argument list of PhysicsCircle::createXmlNode(rapidxml::xml_document<> *doc)
+/home/tuket/prog/owman_anim/src/physics/physics_circle.hpp:26: warning: The following parameters of PhysicsCircle::createXmlNode(rapidxml::xml_document<> *doc) are not documented:
parameter 'doc'
-/home/tuket/prog/owman/src/physics/physics_component.hpp:25: warning: argument 'The' of command @param is not found in the argument list of PhysicsComponent::createXmlNode(rapidxml::xml_document<> *doc)=0
-/home/tuket/prog/owman/src/physics/physics_component.hpp:25: warning: The following parameters of PhysicsComponent::createXmlNode(rapidxml::xml_document<> *doc)=0 are not documented:
+/home/tuket/prog/owman_anim/src/physics/physics_component.hpp:29: warning: argument 'The' of command @param is not found in the argument list of PhysicsComponent::createXmlNode(rapidxml::xml_document<> *doc)=0
+/home/tuket/prog/owman_anim/src/physics/physics_component.hpp:29: warning: The following parameters of PhysicsComponent::createXmlNode(rapidxml::xml_document<> *doc)=0 are not documented:
parameter 'doc'
-/home/tuket/prog/owman/src/renderer/sprite.hpp:63: warning: argument 'The' of command @param is not found in the argument list of Sprite::createXmlNode(rapidxml::xml_document<> *doc)
-/home/tuket/prog/owman/src/renderer/sprite.hpp:63: warning: The following parameters of Sprite::createXmlNode(rapidxml::xml_document<> *doc) are not documented:
+/home/tuket/prog/owman_anim/src/renderer/sprite_status.hpp:38: warning: argument 'The' of command @param is not found in the argument list of SpriteStatus::createXmlNode(rapidxml::xml_document<> *doc) inherited from member createXmlNode at line 54 in file /home/tuket/prog/owman_anim/src/renderer/graphics_component.hpp
+/home/tuket/prog/owman_anim/src/renderer/sprite_status.hpp:38: warning: The following parameters of SpriteStatus::createXmlNode(rapidxml::xml_document<> *doc) are not documented:
parameter 'doc'
-/home/tuket/prog/owman/src/world_streamer.hpp:75: warning: argument 'cell' of command @param is not found in the argument list of WorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)
-/home/tuket/prog/owman/src/world_streamer.hpp:75: warning: argument 'offset' of command @param is not found in the argument list of WorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)
-/home/tuket/prog/owman/src/world_streamer.hpp:75: warning: The following parameters of WorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter) are not documented:
+/home/tuket/prog/owman_anim/src/world_streamer.hpp:75: warning: argument 'cell' of command @param is not found in the argument list of WorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)
+/home/tuket/prog/owman_anim/src/world_streamer.hpp:75: warning: argument 'offset' of command @param is not found in the argument list of WorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter)
+/home/tuket/prog/owman_anim/src/world_streamer.hpp:75: warning: The following parameters of WorldStreamer::update(const Vec2f &position, MainCharacter *mainCharacter) are not documented:
parameter 'position'
parameter 'mainCharacter'
diff --git a/doc/doxy/html/aarect_8hpp_source.html b/doc/doxy/html/aarect_8hpp_source.html
new file mode 100644
index 0000000..6b3ea8b
--- /dev/null
+++ b/doc/doxy/html/aarect_8hpp_source.html
@@ -0,0 +1,142 @@
+
+
+
Abstract resource data class This class hold the data for different types of resource. In order to create a new type of resource just extend from this class
This is the singleton you should use Requesting resources will deliver a resource pointer event if the resource data is not loaded. You can check if a resource has been loaded checking the status attribute
Represents a resource texture Since OpenGL does not allow to make any call from any other thread other than the main thread, the resource manager can not load anything to video memory. So for this resource, to be LOADED means to be loaded in main memory and to be READY means to be loaded in video memory
Abstract resource data class This class hold the data for different types of resource. In order to create a new type of resource just extend from this class
This is the singleton you should use Requesting resources will deliver a resource pointer event if the resource data is not loaded. You can check if a resource has been loaded checking the status attribute
Represents a resource texture Since OpenGL does not allow to make any call from any other thread other than the main thread, the resource manager can not load anything to video memory. So for this resource, to be LOADED means to be loaded in main memory and to be READY means to be loaded in video memory