diff --git a/Assets/Maps/cube_q1.map b/Assets/Maps/cube_q1.map
new file mode 100644
index 0000000..32f3197
--- /dev/null
+++ b/Assets/Maps/cube_q1.map
@@ -0,0 +1,34 @@
+// Game: Goake
+// Format: Standard
+// entity 0
+{
+"classname" "worldspawn"
+"_tb_textures" "textures/common"
+// brush 0
+{
+( 0 0 -16 ) ( 0 1 -16 ) ( 0 0 -15 ) common/slick2 0 0 0 4 4
+( 0 0 -16 ) ( 0 0 -15 ) ( 1 0 -16 ) common/slick2 0 0 0 4 4
+( 0 0 -512 ) ( 1 0 -512 ) ( 0 1 -512 ) common/slick2 0 0 0 4 4
+( 80 64 0 ) ( 80 65 0 ) ( 81 64 0 ) common/slick2 0 0 0 4 4
+( 80 512 0 ) ( 81 512 0 ) ( 80 512 1 ) common/slick2 0 0 0 4 4
+( 512 64 0 ) ( 512 64 1 ) ( 512 65 0 ) common/slick2 0 0 0 4 4
+}
+// brush 1
+{
+( 128 384 128 ) ( 128 385 128 ) ( 128 384 129 ) common/slick2 0 0 0 1 1
+( 128 384 128 ) ( 128 384 129 ) ( 129 384 128 ) common/slick2 0 0 0 1 1
+( 128 384 128 ) ( 129 384 128 ) ( 128 385 128 ) common/slick2 0 0 0 1 1
+( 192 448 192 ) ( 192 449 192 ) ( 193 448 192 ) common/slick2 0 0 0 1 1
+( 192 448 192 ) ( 193 448 192 ) ( 192 448 193 ) common/slick2 0 0 0 1 1
+( 192 448 192 ) ( 192 448 193 ) ( 192 449 192 ) common/slick2 0 0 0 1 1
+}
+// brush 2
+{
+( 256 384 128 ) ( 256 385 128 ) ( 256 384 129 ) common/slick2 0 0 90 1 1
+( 256 384 128 ) ( 256 384 129 ) ( 257 384 128 ) common/slick2 0 0 90 1 1
+( 256 384 128 ) ( 257 384 128 ) ( 256 385 128 ) common/slick2 0 0 90 1 1
+( 320 448 192 ) ( 320 449 192 ) ( 321 448 192 ) common/slick2 0 0 90 1 1
+( 320 448 192 ) ( 321 448 192 ) ( 320 448 193 ) common/slick2 0 0 90 1 1
+( 320 448 192 ) ( 320 448 193 ) ( 320 449 192 ) common/slick2 0 0 90 1 1
+}
+}
diff --git a/Assets/Maps/cube.map b/Assets/Maps/cube_q3.map
similarity index 83%
rename from Assets/Maps/cube.map
rename to Assets/Maps/cube_q3.map
index 1995d03..76ef812 100644
--- a/Assets/Maps/cube.map
+++ b/Assets/Maps/cube_q3.map
@@ -216,4 +216,63 @@
( 624 576.78980575614889 114.7520585344753 ) ( 625 576.78980575614889 114.7520585344753 ) ( 624 577.48446479013558 115.47139835693415 ) common/slick 0 0 180 1 1 0 0 0
( 704 626.60775672407669 177.85651027935376 ) ( 704 625.88841691338689 178.5511686390937 ) ( 704 627.30241508381675 178.57585009004364 ) common/slick -32 0 0 1 1 0 0 0
}
+// brush 24
+{
+( -128 352 32 ) ( -128 353 32 ) ( -128 352 33 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -32 352 32 ) ( -32 352 33 ) ( -31 352 32 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -32 352 32 ) ( -31 352 32 ) ( -32 353 32 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( 32 416 160 ) ( 32 417 160 ) ( 33 416 160 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( 32 416 48 ) ( 33 416 48 ) ( 32 416 49 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( 32 416 48 ) ( 32 416 49 ) ( 32 417 48 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+}
+// brush 25
+{
+( -784 432 48 ) ( -784 433 48 ) ( -784 432 49 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -336 432 48 ) ( -336 432 49 ) ( -335 432 48 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -336 432 48 ) ( -335 432 48 ) ( -336 433 48 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -224 560 64 ) ( -224 561 64 ) ( -223 560 64 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -224 720 64 ) ( -223 720 64 ) ( -224 720 65 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -304 560 64 ) ( -304 560 65 ) ( -304 561 64 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+}
+// brush 26
+{
+( -608 720 48 ) ( -608 721 48 ) ( -608 720 49 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -576 720 48 ) ( -576 720 49 ) ( -575 720 48 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -576 720 16 ) ( -575 720 16 ) ( -576 721 16 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -176 832 64 ) ( -176 833 64 ) ( -175 832 64 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -176 864 64 ) ( -175 864 64 ) ( -176 864 65 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -144 832 64 ) ( -144 832 65 ) ( -144 833 64 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+}
+// brush 27
+{
+( -576 720 64 ) ( -576 721 64 ) ( -576 720 65 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -576 720 64 ) ( -576 720 65 ) ( -575 720 64 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -576 720 64 ) ( -575 720 64 ) ( -576 721 64 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -176 832 128 ) ( -176 833 128 ) ( -175 832 128 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -176 832 80 ) ( -175 832 80 ) ( -176 832 81 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -304 832 80 ) ( -304 832 81 ) ( -304 833 80 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+}
+// brush 28
+{
+( -576 720 128 ) ( -576 721 128 ) ( -576 720 129 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
+( -576 720 128 ) ( -576 720 129 ) ( -575 720 128 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
+( -576 720 128 ) ( -575 720 128 ) ( -576 721 128 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
+( -464 832 224 ) ( -464 833 224 ) ( -463 832 224 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
+( -464 832 144 ) ( -463 832 144 ) ( -464 832 145 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
+( -464 832 144 ) ( -464 832 145 ) ( -464 833 144 ) dev/dev_128_red 0 0 0 0.0625 0.0625 0 0 0
+}
+// brush 29
+{
+( -464 720 128 ) ( -464 721 128 ) ( -464 720 129 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -464 720 128 ) ( -464 720 129 ) ( -463 720 128 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -464 720 128 ) ( -463 720 128 ) ( -464 721 128 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -304 832 224 ) ( -304 833 224 ) ( -303 832 224 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -304 832 144 ) ( -303 832 144 ) ( -304 832 145 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+( -304 832 144 ) ( -304 832 145 ) ( -304 833 144 ) dev/dev_128_gray 0 0 0 0.0625 0.0625 0 0 0
+}
+}
+// entity 1
+{
+"classname" "info_player_deathmatch"
+"origin" "-368 544 120"
}
diff --git a/Assets/Maps/cube_valve.map b/Assets/Maps/cube_valve.map
new file mode 100644
index 0000000..eb86281
--- /dev/null
+++ b/Assets/Maps/cube_valve.map
@@ -0,0 +1,35 @@
+// Game: Goake
+// Format: Valve
+// entity 0
+{
+"classname" "worldspawn"
+"mapversion" "220"
+"_tb_textures" "textures/common"
+// brush 0
+{
+( 0 0 -32 ) ( 0 1 -32 ) ( 0 0 -31 ) common/slick2 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 4 4
+( 0 0 -32 ) ( 0 0 -31 ) ( 1 0 -32 ) common/slick2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 4 4
+( 0 0 -512 ) ( 1 0 -512 ) ( 0 1 -512 ) common/slick2 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 4 4
+( 128 128 0 ) ( 128 129 0 ) ( 129 128 0 ) common/slick2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 4 4
+( 128 512 0 ) ( 129 512 0 ) ( 128 512 1 ) common/slick2 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 4 4
+( 512 128 0 ) ( 512 128 1 ) ( 512 129 0 ) common/slick2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 4 4
+}
+// brush 1
+{
+( 128 320 128 ) ( 128 321 128 ) ( 128 320 129 ) common/slick2 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
+( 128 320 128 ) ( 128 320 129 ) ( 129 320 128 ) common/slick2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
+( 128 320 128 ) ( 129 320 128 ) ( 128 321 128 ) common/slick2 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
+( 192 384 192 ) ( 192 385 192 ) ( 193 384 192 ) common/slick2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
+( 192 384 192 ) ( 193 384 192 ) ( 192 384 193 ) common/slick2 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
+( 192 384 192 ) ( 192 384 193 ) ( 192 385 192 ) common/slick2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
+}
+// brush 2
+{
+( 256 320 128 ) ( 256 321 128 ) ( 256 320 129 ) common/slick2 [ 0 4.37114e-08 -1 0 ] [ 0 1 4.37114e-08 0 ] 90 1 1
+( 256 320 128 ) ( 256 320 129 ) ( 257 320 128 ) common/slick2 [ -4.37114e-08 0 -1 0 ] [ -1 0 4.37114e-08 0 ] 90 1 1
+( 256 320 128 ) ( 257 320 128 ) ( 256 321 128 ) common/slick2 [ 4.37114e-08 -1 0 0 ] [ 1 4.37114e-08 0 0 ] 90 1 1
+( 320 384 192 ) ( 320 385 192 ) ( 321 384 192 ) common/slick2 [ -4.37114e-08 -1 0 0 ] [ -1 4.37114e-08 0 0 ] 90 1 1
+( 320 384 192 ) ( 321 384 192 ) ( 320 384 193 ) common/slick2 [ 4.37114e-08 0 -1 0 ] [ 1 0 4.37114e-08 0 ] 90 1 1
+( 320 384 192 ) ( 320 384 193 ) ( 320 385 192 ) common/slick2 [ 0 -4.37114e-08 -1 0 ] [ 0 -1 4.37114e-08 0 ] 90 1 1
+}
+}
diff --git a/Assets/Textures/common/slick.png b/Assets/Textures/common/slick.png
new file mode 100644
index 0000000..6a36b74
Binary files /dev/null and b/Assets/Textures/common/slick.png differ
diff --git a/Assets/Textures/dev/dev_128_black.png b/Assets/Textures/dev/dev_128_black.png
new file mode 100644
index 0000000..6717062
Binary files /dev/null and b/Assets/Textures/dev/dev_128_black.png differ
diff --git a/Assets/Textures/dev/dev_128_blue.png b/Assets/Textures/dev/dev_128_blue.png
new file mode 100644
index 0000000..599617d
Binary files /dev/null and b/Assets/Textures/dev/dev_128_blue.png differ
diff --git a/Assets/Textures/dev/dev_128_darkgray.png b/Assets/Textures/dev/dev_128_darkgray.png
new file mode 100644
index 0000000..1d30e8e
Binary files /dev/null and b/Assets/Textures/dev/dev_128_darkgray.png differ
diff --git a/Assets/Textures/dev/dev_128_gray.png b/Assets/Textures/dev/dev_128_gray.png
new file mode 100644
index 0000000..caf07c4
Binary files /dev/null and b/Assets/Textures/dev/dev_128_gray.png differ
diff --git a/Assets/Textures/dev/dev_128_green.png b/Assets/Textures/dev/dev_128_green.png
new file mode 100644
index 0000000..97dab39
Binary files /dev/null and b/Assets/Textures/dev/dev_128_green.png differ
diff --git a/Assets/Textures/dev/dev_128_lightgray.png b/Assets/Textures/dev/dev_128_lightgray.png
new file mode 100644
index 0000000..35b69ea
Binary files /dev/null and b/Assets/Textures/dev/dev_128_lightgray.png differ
diff --git a/Assets/Textures/dev/dev_128_mat_norm.png b/Assets/Textures/dev/dev_128_mat_norm.png
new file mode 100644
index 0000000..86ae1cb
Binary files /dev/null and b/Assets/Textures/dev/dev_128_mat_norm.png differ
diff --git a/Assets/Textures/dev/dev_128_mat_orm.png b/Assets/Textures/dev/dev_128_mat_orm.png
new file mode 100644
index 0000000..5969d78
Binary files /dev/null and b/Assets/Textures/dev/dev_128_mat_orm.png differ
diff --git a/Assets/Textures/dev/dev_128_red.png b/Assets/Textures/dev/dev_128_red.png
new file mode 100644
index 0000000..fc6436d
Binary files /dev/null and b/Assets/Textures/dev/dev_128_red.png differ
diff --git a/Assets/Textures/dev/dev_128_white.png b/Assets/Textures/dev/dev_128_white.png
new file mode 100644
index 0000000..402fa56
Binary files /dev/null and b/Assets/Textures/dev/dev_128_white.png differ
diff --git a/Assets/Textures/dev/dev_128_yellow.png b/Assets/Textures/dev/dev_128_yellow.png
new file mode 100644
index 0000000..bbbd1ef
Binary files /dev/null and b/Assets/Textures/dev/dev_128_yellow.png differ
diff --git a/Assets/Textures/dev/dev_flat_gray.png b/Assets/Textures/dev/dev_flat_gray.png
new file mode 100644
index 0000000..ccdf2ec
Binary files /dev/null and b/Assets/Textures/dev/dev_flat_gray.png differ
diff --git a/Assets/Textures/dev/dev_flat_mat_norm.png b/Assets/Textures/dev/dev_flat_mat_norm.png
new file mode 100644
index 0000000..246a01e
Binary files /dev/null and b/Assets/Textures/dev/dev_flat_mat_norm.png differ
diff --git a/Assets/Textures/dev/dev_flat_mat_orm.png b/Assets/Textures/dev/dev_flat_mat_orm.png
new file mode 100644
index 0000000..543a0d0
Binary files /dev/null and b/Assets/Textures/dev/dev_flat_mat_orm.png differ
diff --git a/Content/Audio/player_jumpland.flax b/Content/Audio/player_jumpland.flax
index e8736d9..e5d3828 100644
Binary files a/Content/Audio/player_jumpland.flax and b/Content/Audio/player_jumpland.flax differ
diff --git a/Content/Common/PlayerPrefab.prefab b/Content/Common/PlayerPrefab.prefab
new file mode 100644
index 0000000..a69a0cb
--- /dev/null
+++ b/Content/Common/PlayerPrefab.prefab
@@ -0,0 +1,98 @@
+{
+ "ID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "TypeName": "FlaxEngine.Prefab",
+ "EngineBuild": 6224,
+ "Data": [
+ {
+ "ID": "999a202c47de967d2bdfd09abcc6df4e",
+ "TypeName": "FlaxEngine.RigidBody",
+ "Name": "PlayerPrefab",
+ "OverrideMass": true,
+ "Mass": 10.0,
+ "LinearDamping": 0.0,
+ "AngularDamping": 0.0,
+ "Constraints": 56,
+ "IsKinematic": true,
+ "EnableGravity": false
+ },
+ {
+ "ID": "b29a58f545071ca393afaab21faa83ad",
+ "TypeName": "Game.PlayerMovement",
+ "ParentID": "999a202c47de967d2bdfd09abcc6df4e",
+ "V": {}
+ },
+ {
+ "ID": "a67383834fc3f6f1106e8099e5557e32",
+ "TypeName": "FlaxEngine.EmptyActor",
+ "ParentID": "999a202c47de967d2bdfd09abcc6df4e",
+ "Name": "RootActor"
+ },
+ {
+ "ID": "b8fc420f4efe96fa2b4042bd98fd3e74",
+ "TypeName": "FlaxEngine.Camera",
+ "ParentID": "a67383834fc3f6f1106e8099e5557e32",
+ "Name": "Camera",
+ "Transform": {
+ "Translation": {
+ "X": 0.0,
+ "Y": 28.7337646484375,
+ "Z": 0.0
+ }
+ },
+ "Near": 1.0
+ },
+ {
+ "ID": "226bdb004e72848777178a9d1f207cbf",
+ "TypeName": "FlaxEngine.AudioListener",
+ "ParentID": "b8fc420f4efe96fa2b4042bd98fd3e74",
+ "Name": "AudioListener"
+ },
+ {
+ "ID": "8bd80bca49ac35da66aabaa2e473851d",
+ "TypeName": "FlaxEngine.CapsuleCollider",
+ "ParentID": "999a202c47de967d2bdfd09abcc6df4e",
+ "IsActive": false,
+ "Name": "CapsuleCollider",
+ "Transform": {
+ "Orientation": {
+ "X": 0.0,
+ "Y": 0.0,
+ "Z": 0.7071068286895752,
+ "W": 0.7071068286895752
+ }
+ },
+ "ContactOffset": 0.0,
+ "Material": "d99b8b6f40198beea4703dadd642150e",
+ "Radius": 16.0,
+ "Height": 52.0
+ },
+ {
+ "ID": "d9d61d314ad79d49ba08059cef50f802",
+ "TypeName": "FlaxEngine.BoxCollider",
+ "ParentID": "999a202c47de967d2bdfd09abcc6df4e",
+ "Name": "BoxCollider",
+ "ContactOffset": 0.0,
+ "Material": "ffe0e84c49607480f67a3994a7fe11a8",
+ "Size": {
+ "X": 32.0,
+ "Y": 84.0,
+ "Z": 32.0
+ }
+ },
+ {
+ "ID": "b377cc03418270d87e8a5b92cb5374ea",
+ "TypeName": "FlaxEngine.MeshCollider",
+ "ParentID": "999a202c47de967d2bdfd09abcc6df4e",
+ "IsActive": false,
+ "Name": "CylinderCollider",
+ "Transform": {
+ "Scale": {
+ "X": 0.3199999928474426,
+ "Y": 0.8399999737739563,
+ "Z": 0.3199999928474426
+ }
+ },
+ "CollisionData": "593d92914c4bd54679ddec9e539bba80"
+ }
+]
+}
\ No newline at end of file
diff --git a/Content/Common/PlayerSpectatorPrefab.prefab b/Content/Common/PlayerSpectatorPrefab.prefab
new file mode 100644
index 0000000..981ec8e
--- /dev/null
+++ b/Content/Common/PlayerSpectatorPrefab.prefab
@@ -0,0 +1,99 @@
+{
+ "ID": "29864325492125902977e192357b5147",
+ "TypeName": "FlaxEngine.Prefab",
+ "EngineBuild": 6224,
+ "Data": [
+ {
+ "ID": "b72b57504e7963aecdfeae91018803f3",
+ "TypeName": "FlaxEngine.RigidBody",
+ "ParentID": "00000000000000000000000000000000",
+ "Name": "PlayerSpectatorPrefab",
+ "OverrideMass": true,
+ "Mass": 10.0,
+ "LinearDamping": 0.0,
+ "AngularDamping": 0.0,
+ "Constraints": 56,
+ "IsKinematic": true,
+ "EnableGravity": false
+ },
+ {
+ "ID": "c698b95d4fe85d18dc803589428c3d14",
+ "TypeName": "Game.CameraMovement",
+ "ParentID": "b72b57504e7963aecdfeae91018803f3",
+ "V": {}
+ },
+ {
+ "ID": "4e86d9d4498838d4871975bc1e555668",
+ "TypeName": "FlaxEngine.EmptyActor",
+ "ParentID": "b72b57504e7963aecdfeae91018803f3",
+ "Name": "RootActor"
+ },
+ {
+ "ID": "c5161c384c4dcdd49465c7883a21fc22",
+ "TypeName": "FlaxEngine.Camera",
+ "ParentID": "4e86d9d4498838d4871975bc1e555668",
+ "Name": "Camera",
+ "Transform": {
+ "Translation": {
+ "X": 0.0,
+ "Y": 28.7337646484375,
+ "Z": 0.0
+ }
+ },
+ "Near": 1.0
+ },
+ {
+ "ID": "c49f64704eebfe5dd33b11a3a2c819db",
+ "TypeName": "FlaxEngine.AudioListener",
+ "ParentID": "c5161c384c4dcdd49465c7883a21fc22",
+ "Name": "AudioListener"
+ },
+ {
+ "ID": "e05594b04c26050c67c89d83ccb8895d",
+ "TypeName": "FlaxEngine.CapsuleCollider",
+ "ParentID": "b72b57504e7963aecdfeae91018803f3",
+ "IsActive": false,
+ "Name": "CapsuleCollider",
+ "Transform": {
+ "Orientation": {
+ "X": 0.0,
+ "Y": 0.0,
+ "Z": 0.7071068286895752,
+ "W": 0.7071068286895752
+ }
+ },
+ "ContactOffset": 0.0,
+ "Material": "d99b8b6f40198beea4703dadd642150e",
+ "Radius": 16.0,
+ "Height": 52.0
+ },
+ {
+ "ID": "38f5b9ac4b96ccecc6cf629bca69faf0",
+ "TypeName": "FlaxEngine.BoxCollider",
+ "ParentID": "b72b57504e7963aecdfeae91018803f3",
+ "Name": "BoxCollider",
+ "ContactOffset": 0.0,
+ "Material": "ffe0e84c49607480f67a3994a7fe11a8",
+ "Size": {
+ "X": 32.0,
+ "Y": 84.0,
+ "Z": 32.0
+ }
+ },
+ {
+ "ID": "45aa3b4241acfa70733735b0c7e387ca",
+ "TypeName": "FlaxEngine.MeshCollider",
+ "ParentID": "b72b57504e7963aecdfeae91018803f3",
+ "IsActive": false,
+ "Name": "CylinderCollider",
+ "Transform": {
+ "Scale": {
+ "X": 0.3199999928474426,
+ "Y": 0.8399999737739563,
+ "Z": 0.3199999928474426
+ }
+ },
+ "CollisionData": "593d92914c4bd54679ddec9e539bba80"
+ }
+]
+}
\ No newline at end of file
diff --git a/Content/Common/FreeCameraPrefab.prefab b/Content/Common/old/FreeCameraPrefab.prefab
similarity index 100%
rename from Content/Common/FreeCameraPrefab.prefab
rename to Content/Common/old/FreeCameraPrefab.prefab
diff --git a/Content/Common/OldPlayerPrefab.prefab b/Content/Common/old/OldPlayerPrefab.prefab
similarity index 100%
rename from Content/Common/OldPlayerPrefab.prefab
rename to Content/Common/old/OldPlayerPrefab.prefab
diff --git a/Content/GameSettings.json b/Content/GameSettings.json
index 5c28e07..00f834f 100644
--- a/Content/GameSettings.json
+++ b/Content/GameSettings.json
@@ -1,7 +1,7 @@
{
"ID": "3c7bc3854d42f9b1b0fea9ba0d7fa8e9",
"TypeName": "FlaxEditor.Content.Settings.GameSettings",
- "EngineBuild": 6222,
+ "EngineBuild": 6224,
"Data": {
"ProductName": "Goake",
"CompanyName": "GoaLitiuM",
@@ -15,6 +15,9 @@
"Graphics": "f94d5aae457aeba67033a8a4ca753214",
"GameCooking": "af2e52554f7faed7b4937181dd22d166",
"Streaming": "3a6ffc3a43e684f77cfed1a1f8f6bd0e",
+ "CustomSettings": {
+ "BrushMaterials": "29a0b0c54b40eb3e6857ffb4c9cab71e"
+ },
"WindowsPlatform": "4a5eec97484253fed72934860ae62c40"
}
}
\ No newline at end of file
diff --git a/Content/Materials/SimpleMapMaterial.flax b/Content/Materials/SimpleMapMaterial.flax
new file mode 100644
index 0000000..74a8aba
Binary files /dev/null and b/Content/Materials/SimpleMapMaterial.flax differ
diff --git a/Content/Materials/dev/dev_128_gray.flax b/Content/Materials/dev/dev_128_gray.flax
new file mode 100644
index 0000000..9e8898d
Binary files /dev/null and b/Content/Materials/dev/dev_128_gray.flax differ
diff --git a/Content/Materials/dev/dev_128_red.flax b/Content/Materials/dev/dev_128_red.flax
new file mode 100644
index 0000000..38dc6b7
Binary files /dev/null and b/Content/Materials/dev/dev_128_red.flax differ
diff --git a/Content/Materials/dev/slick.flax b/Content/Materials/dev/slick.flax
index c16344c..201958d 100644
Binary files a/Content/Materials/dev/slick.flax and b/Content/Materials/dev/slick.flax differ
diff --git a/Content/Materials/dev/dev_128.flax b/Content/Materials/dev_128.flax
similarity index 100%
rename from Content/Materials/dev/dev_128.flax
rename to Content/Materials/dev_128.flax
diff --git a/Content/Materials/dev/dev_128_lit.flax b/Content/Materials/dev_128_lit.flax
similarity index 100%
rename from Content/Materials/dev/dev_128_lit.flax
rename to Content/Materials/dev_128_lit.flax
diff --git a/Content/Materials/sky.flax b/Content/Materials/sky.flax
index 8c3787c..f5a31f6 100644
Binary files a/Content/Materials/sky.flax and b/Content/Materials/sky.flax differ
diff --git a/Content/Scenes/MainScene.scene b/Content/Scenes/MainScene.scene
index 2e695a0..d1cd9cf 100644
--- a/Content/Scenes/MainScene.scene
+++ b/Content/Scenes/MainScene.scene
@@ -1,7 +1,7 @@
{
"ID": "0733cc9b40d3d05366be64bbd9b59e21",
"TypeName": "FlaxEngine.SceneAsset",
- "EngineBuild": 6223,
+ "EngineBuild": 6224,
"Data": [
{
"ID": "0733cc9b40d3d05366be64bbd9b59e21",
@@ -25,117 +25,61 @@
}
},
{
- "ID": "4ef1f38b4569142b55b0ff935525d47a",
- "TypeName": "FlaxEngine.RigidBody",
- "ParentID": "0733cc9b40d3d05366be64bbd9b59e21",
- "Name": "PlayerPrefab",
- "Transform": {
- "Translation": {
- "X": -354.623291015625,
- "Y": 176.5519256591797,
- "Z": 61.111427307128909
- }
- },
- "OverrideMass": true,
- "Mass": 10.0,
- "LinearDamping": 0.0,
- "AngularDamping": 0.0,
- "Constraints": 56,
- "IsKinematic": true,
- "EnableGravity": false
+ "ID": "d9110dd14d9950a23388b894f38cfb87",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "999a202c47de967d2bdfd09abcc6df4e",
+ "ParentID": "0733cc9b40d3d05366be64bbd9b59e21"
},
{
- "ID": "e3bab01a4912873fc2e9ff855a214bf7",
- "TypeName": "Game.PlayerMovement",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "V": {}
+ "ID": "81cc91774240802618913ba28e68051e",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b29a58f545071ca393afaab21faa83ad",
+ "ParentID": "d9110dd14d9950a23388b894f38cfb87",
+ "V": {
+ "JumpLandSound": "a9ae0bbf438b4e841277f39c3d7c7c8b"
+}
},
{
- "ID": "08ed03be4d537814ba01edb88f6801e1",
- "TypeName": "FlaxEngine.EmptyActor",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "Name": "RootActor"
+ "ID": "5c30e8d943f94a215a567bb44cc56c3b",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "a67383834fc3f6f1106e8099e5557e32",
+ "ParentID": "d9110dd14d9950a23388b894f38cfb87"
},
{
- "ID": "499cfa784579b58bba713daa0983d705",
- "TypeName": "FlaxEngine.Camera",
- "ParentID": "08ed03be4d537814ba01edb88f6801e1",
- "Name": "Camera",
- "Transform": {
- "Translation": {
- "X": 0.0,
- "Y": 28.7337646484375,
- "Z": 0.0
- }
- },
- "Near": 1.0
+ "ID": "b2ab19b6483303eb876d44b8e0f0eb17",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b8fc420f4efe96fa2b4042bd98fd3e74",
+ "ParentID": "5c30e8d943f94a215a567bb44cc56c3b"
},
{
- "ID": "b59df4764594c5ee84a759b5e65bfc5a",
- "TypeName": "FlaxEngine.AudioListener",
- "ParentID": "08ed03be4d537814ba01edb88f6801e1",
- "Name": "AudioListener"
+ "ID": "b6578a6342f1f971c3c08aa349ecf755",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "226bdb004e72848777178a9d1f207cbf",
+ "ParentID": "b2ab19b6483303eb876d44b8e0f0eb17"
},
{
- "ID": "fbaa6db24f0a2a9db36bc6a043fc2572",
- "TypeName": "FlaxEngine.CapsuleCollider",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "IsActive": false,
- "Name": "CapsuleCollider",
- "Transform": {
- "Orientation": {
- "X": 0.0,
- "Y": 0.0,
- "Z": 0.7071068286895752,
- "W": 0.7071068286895752
- }
- },
- "ContactOffset": 0.0,
- "Material": "d99b8b6f40198beea4703dadd642150e",
- "Radius": 16.0,
- "Height": 52.0
+ "ID": "b453cdbd448b73911fea54814bbff4e7",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "8bd80bca49ac35da66aabaa2e473851d",
+ "ParentID": "d9110dd14d9950a23388b894f38cfb87"
},
{
- "ID": "9677298d46e5d5d7021f7cb607bd3023",
- "TypeName": "FlaxEngine.BoxCollider",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "Name": "BoxCollider",
- "ContactOffset": 0.0,
- "Material": "ffe0e84c49607480f67a3994a7fe11a8",
- "Size": {
- "X": 32.0,
- "Y": 84.0,
- "Z": 32.0
- }
+ "ID": "e842261543e7a48435f75ab83b3f9b9d",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "d9d61d314ad79d49ba08059cef50f802",
+ "ParentID": "d9110dd14d9950a23388b894f38cfb87"
},
{
- "ID": "f472490345bbfe282aefa2aa027e0138",
- "TypeName": "FlaxEngine.MeshCollider",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "IsActive": false,
- "Name": "CylinderCollider",
- "Transform": {
- "Scale": {
- "X": 0.3199999928474426,
- "Y": 0.8399999737739563,
- "Z": 0.3199999928474426
- }
- },
- "CollisionData": "593d92914c4bd54679ddec9e539bba80"
+ "ID": "e1bd1f734f59807b618a47813903805c",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b377cc03418270d87e8a5b92cb5374ea",
+ "ParentID": "d9110dd14d9950a23388b894f38cfb87"
},
{
"ID": "b5d566374477944e69bdc2b86249883b",
"TypeName": "FlaxEngine.UICanvas",
"ParentID": "0733cc9b40d3d05366be64bbd9b59e21",
"Name": "DefaultHudPrefab",
- "Transform": {
- "Orientation": {
- "X": 1.0,
- "Y": 4.371138828673793e-8,
- "Z": 4.371138828673793e-8,
- "W": 1.910685465164705e-15
- }
- },
"V": {}
},
{
@@ -174,7 +118,7 @@
},
"Control": "FlaxEngine.GUI.Label",
"Data": {
- "Text": "eFPS: 120\nuFPS: -2147483648\nrFPS: -2147483648\npFPS: -2147483648\nCon: 0ms\nDirectX11\nGC memory: 11.2093MB",
+ "Text": "eFPS: 121\nuFPS: 120\nrFPS: 120\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 8.089344MB",
"TextColor": {
"R": 1.0,
"G": 1.0,
@@ -194,6 +138,7 @@
"Font": "4508d98f4aa1f0bd59362b81d47e38f4",
"Size": 10
},
+ "Material": null,
"Margin": {
"Left": 0.0,
"Right": 0.0,
@@ -220,7 +165,7 @@
},
"Offsets": {
"Left": 0.0,
- "Right": 136.0,
+ "Right": 143.0,
"Top": -80.0,
"Bottom": 112.0
},
@@ -260,7 +205,7 @@
"Name": "ContainerControl 0",
"Transform": {
"Translation": {
- "X": 44855.0,
+ "X": 45644.0,
"Y": 1.5,
"Z": 0.0
}
diff --git a/Content/Scenes/MainSceneLit.scene b/Content/Scenes/MainSceneLit.scene
index 5353d4f..16a1227 100644
--- a/Content/Scenes/MainSceneLit.scene
+++ b/Content/Scenes/MainSceneLit.scene
@@ -1,7 +1,7 @@
{
"ID": "a0165b834429c74b9d547c88fb3a0de0",
"TypeName": "FlaxEngine.SceneAsset",
- "EngineBuild": 6220,
+ "EngineBuild": 6224,
"Data": [
{
"ID": "a0165b834429c74b9d547c88fb3a0de0",
@@ -25,103 +25,53 @@
}
},
{
- "ID": "4ef1f38b4569142b55b0ff935525d47a",
- "TypeName": "FlaxEngine.RigidBody",
- "ParentID": "a0165b834429c74b9d547c88fb3a0de0",
- "Name": "PlayerPrefab",
- "Transform": {
- "Translation": {
- "X": -354.623291015625,
- "Y": 176.5519256591797,
- "Z": 61.111427307128909
- }
- },
- "OverrideMass": true,
- "Mass": 10.0,
- "LinearDamping": 0.0,
- "AngularDamping": 0.0,
- "Constraints": 56,
- "IsKinematic": true,
- "EnableGravity": false
+ "ID": "f17c6b3346a31cdc5478efa795107612",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "999a202c47de967d2bdfd09abcc6df4e",
+ "ParentID": "a0165b834429c74b9d547c88fb3a0de0"
},
{
- "ID": "e3bab01a4912873fc2e9ff855a214bf7",
- "TypeName": "Game.PlayerMovement",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
+ "ID": "3cabff454d2e5cedc7b7f888960e1a30",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b29a58f545071ca393afaab21faa83ad",
+ "ParentID": "f17c6b3346a31cdc5478efa795107612",
"V": {}
},
{
- "ID": "08ed03be4d537814ba01edb88f6801e1",
- "TypeName": "FlaxEngine.EmptyActor",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "Name": "RootActor"
+ "ID": "42423d104402e24fdc73c7a47181c52f",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "a67383834fc3f6f1106e8099e5557e32",
+ "ParentID": "f17c6b3346a31cdc5478efa795107612"
},
{
- "ID": "499cfa784579b58bba713daa0983d705",
- "TypeName": "FlaxEngine.Camera",
- "ParentID": "08ed03be4d537814ba01edb88f6801e1",
- "Name": "Camera",
- "Transform": {
- "Translation": {
- "X": 0.0,
- "Y": 28.7337646484375,
- "Z": 0.0
- }
- },
- "Near": 1.0
+ "ID": "4f7d34994c8c1593092319a632b19631",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b8fc420f4efe96fa2b4042bd98fd3e74",
+ "ParentID": "42423d104402e24fdc73c7a47181c52f"
},
{
- "ID": "b59df4764594c5ee84a759b5e65bfc5a",
- "TypeName": "FlaxEngine.AudioListener",
- "ParentID": "08ed03be4d537814ba01edb88f6801e1",
- "Name": "AudioListener"
+ "ID": "5e49e47141160db3a0fd6694fe83b82d",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "226bdb004e72848777178a9d1f207cbf",
+ "ParentID": "4f7d34994c8c1593092319a632b19631"
},
{
- "ID": "fbaa6db24f0a2a9db36bc6a043fc2572",
- "TypeName": "FlaxEngine.CapsuleCollider",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "IsActive": false,
- "Name": "CapsuleCollider",
- "Transform": {
- "Orientation": {
- "X": 0.0,
- "Y": 0.0,
- "Z": 0.7071068286895752,
- "W": 0.7071068286895752
- }
- },
- "ContactOffset": 0.0,
- "Material": "d99b8b6f40198beea4703dadd642150e",
- "Radius": 16.0,
- "Height": 52.0
+ "ID": "85f68702418a995f023ec98ac83db597",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "8bd80bca49ac35da66aabaa2e473851d",
+ "ParentID": "f17c6b3346a31cdc5478efa795107612"
},
{
- "ID": "9677298d46e5d5d7021f7cb607bd3023",
- "TypeName": "FlaxEngine.BoxCollider",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "Name": "BoxCollider",
- "ContactOffset": 0.0,
- "Material": "ffe0e84c49607480f67a3994a7fe11a8",
- "Size": {
- "X": 32.0,
- "Y": 84.0,
- "Z": 32.0
- }
+ "ID": "30607a844f2b90ad59d033942e31de0e",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "d9d61d314ad79d49ba08059cef50f802",
+ "ParentID": "f17c6b3346a31cdc5478efa795107612"
},
{
- "ID": "f472490345bbfe282aefa2aa027e0138",
- "TypeName": "FlaxEngine.MeshCollider",
- "ParentID": "4ef1f38b4569142b55b0ff935525d47a",
- "IsActive": false,
- "Name": "CylinderCollider",
- "Transform": {
- "Scale": {
- "X": 0.3199999928474426,
- "Y": 0.8399999737739563,
- "Z": 0.3199999928474426
- }
- },
- "CollisionData": "593d92914c4bd54679ddec9e539bba80"
+ "ID": "1886c43f47484f2c2a4608866781bc76",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b377cc03418270d87e8a5b92cb5374ea",
+ "ParentID": "f17c6b3346a31cdc5478efa795107612"
},
{
"ID": "b5d566374477944e69bdc2b86249883b",
@@ -168,13 +118,13 @@
"Transform": {
"Translation": {
"X": 0.0,
- "Y": 733.0,
+ "Y": 735.0,
"Z": 0.0
}
},
"Control": "FlaxEngine.GUI.Label",
"Data": {
- "Text": "eFPS: 16\nuFPS: 15\nrFPS: 15\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 8.130952MB",
+ "Text": "eFPS: 238\nuFPS: 238\nrFPS: 238\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 13.95565MB",
"TextColor": {
"R": 1.0,
"G": 1.0,
@@ -194,6 +144,7 @@
"Font": "4508d98f4aa1f0bd59362b81d47e38f4",
"Size": 10
},
+ "Material": null,
"Margin": {
"Left": 0.0,
"Right": 0.0,
@@ -260,8 +211,8 @@
"Name": "ContainerControl 0",
"Transform": {
"Translation": {
- "X": 45644.0,
- "Y": 0.5,
+ "X": 44550.0,
+ "Y": 1.5,
"Z": 0.0
}
},
diff --git a/Content/Scenes/TestImportScene.scene b/Content/Scenes/TestImportScene.scene
index b908339..cdc4670 100644
--- a/Content/Scenes/TestImportScene.scene
+++ b/Content/Scenes/TestImportScene.scene
@@ -1,7 +1,7 @@
{
"ID": "194e05f445ece24ec5448d886e1334df",
"TypeName": "FlaxEngine.SceneAsset",
- "EngineBuild": 6223,
+ "EngineBuild": 6224,
"Data": [
{
"ID": "194e05f445ece24ec5448d886e1334df",
@@ -26,110 +26,62 @@
}
},
{
- "ID": "19bf0c4f41c16717c90e05a0bdc62e44",
- "TypeName": "FlaxEngine.RigidBody",
+ "ID": "6c66fa4a4a5de8998eb84388d1648317",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "999a202c47de967d2bdfd09abcc6df4e",
"ParentID": "194e05f445ece24ec5448d886e1334df",
- "Name": "PlayerPrefab 0",
"Transform": {
"Translation": {
- "X": -32.320621490478519,
- "Y": 203.23764038085938,
- "Z": -187.24435424804688
+ "X": -571.0,
+ "Y": 141.0,
+ "Z": 587.0
}
- },
- "OverrideMass": true,
- "Mass": 10.0,
- "LinearDamping": 0.0,
- "AngularDamping": 0.0,
- "Constraints": 56,
- "IsKinematic": true,
- "EnableGravity": false
- },
- {
- "ID": "cd7b08774b33983314862eae1a7e6567",
- "TypeName": "Game.CameraMovement",
- "ParentID": "19bf0c4f41c16717c90e05a0bdc62e44",
- "V": {}
- },
- {
- "ID": "d9d420ce476865e395a966913b5b32bd",
- "TypeName": "Game.PlayerMovement",
- "ParentID": "19bf0c4f41c16717c90e05a0bdc62e44",
- "V": {},
- "Enabled": false
- },
- {
- "ID": "39992ccc4fac12dab97aa4bfb52f0041",
- "TypeName": "FlaxEngine.EmptyActor",
- "ParentID": "19bf0c4f41c16717c90e05a0bdc62e44",
- "Name": "RootActor"
- },
- {
- "ID": "f54fa132472299e63c8f1aa4f587c179",
- "TypeName": "FlaxEngine.Camera",
- "ParentID": "39992ccc4fac12dab97aa4bfb52f0041",
- "Name": "Camera",
- "Transform": {
- "Translation": {
- "X": 0.0,
- "Y": 28.7337646484375,
- "Z": 0.0
- }
- },
- "Near": 1.0
- },
- {
- "ID": "a42bade1470cd988c7c76685802b0156",
- "TypeName": "FlaxEngine.AudioListener",
- "ParentID": "39992ccc4fac12dab97aa4bfb52f0041",
- "Name": "AudioListener"
- },
- {
- "ID": "89ff5a9540fdffc5f3ef52b3f38bf491",
- "TypeName": "FlaxEngine.CapsuleCollider",
- "ParentID": "19bf0c4f41c16717c90e05a0bdc62e44",
- "IsActive": false,
- "Name": "CapsuleCollider",
- "Transform": {
- "Orientation": {
- "X": 0.0,
- "Y": 0.0,
- "Z": 0.7071068286895752,
- "W": 0.7071068286895752
- }
- },
- "ContactOffset": 0.0,
- "Material": "d99b8b6f40198beea4703dadd642150e",
- "Radius": 16.0,
- "Height": 52.0
- },
- {
- "ID": "5a747ea94050dc31c24017a01556aecd",
- "TypeName": "FlaxEngine.BoxCollider",
- "ParentID": "19bf0c4f41c16717c90e05a0bdc62e44",
- "Name": "BoxCollider",
- "ContactOffset": 0.0,
- "Material": "ffe0e84c49607480f67a3994a7fe11a8",
- "Size": {
- "X": 32.0,
- "Y": 84.0,
- "Z": 32.0
}
},
{
- "ID": "bfc9d0ee45a71ce96838aea25a540f9c",
- "TypeName": "FlaxEngine.MeshCollider",
- "ParentID": "19bf0c4f41c16717c90e05a0bdc62e44",
- "IsActive": false,
- "Name": "CylinderCollider",
- "Transform": {
- "Scale": {
- "X": 0.3199999928474426,
- "Y": 0.8399999737739563,
- "Z": 0.3199999928474426
- }
- },
- "CollisionData": "593d92914c4bd54679ddec9e539bba80"
+ "ID": "d5c84d67417ddf09908c76b6f0582b43",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b29a58f545071ca393afaab21faa83ad",
+ "ParentID": "6c66fa4a4a5de8998eb84388d1648317",
+ "V": {
+ "JumpLandSound": "a9ae0bbf438b4e841277f39c3d7c7c8b"
+}
+ },
+ {
+ "ID": "d1a76c334a514c99f8f5b2bd81abae2c",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "a67383834fc3f6f1106e8099e5557e32",
+ "ParentID": "6c66fa4a4a5de8998eb84388d1648317"
+ },
+ {
+ "ID": "357077e9405b2a7ba50198bbed8bd5f9",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b8fc420f4efe96fa2b4042bd98fd3e74",
+ "ParentID": "d1a76c334a514c99f8f5b2bd81abae2c"
+ },
+ {
+ "ID": "905d23324e7f98c9f8287e8e49a83981",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "226bdb004e72848777178a9d1f207cbf",
+ "ParentID": "357077e9405b2a7ba50198bbed8bd5f9"
+ },
+ {
+ "ID": "89c02cd64b640185d9947ab451453c4c",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "8bd80bca49ac35da66aabaa2e473851d",
+ "ParentID": "6c66fa4a4a5de8998eb84388d1648317"
+ },
+ {
+ "ID": "eebdb91647732ad3dfc7528c978cd19c",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "d9d61d314ad79d49ba08059cef50f802",
+ "ParentID": "6c66fa4a4a5de8998eb84388d1648317"
+ },
+ {
+ "ID": "3e0f83fe407b2d9ed7c734a62fad0826",
+ "PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
+ "PrefabObjectID": "b377cc03418270d87e8a5b92cb5374ea",
+ "ParentID": "6c66fa4a4a5de8998eb84388d1648317"
},
{
"ID": "ff6b6db54b5aa08e7286ef86246149ef",
@@ -182,7 +134,7 @@
},
"Control": "FlaxEngine.GUI.Label",
"Data": {
- "Text": "eFPS: 344\nuFPS: 346\nrFPS: 346\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 62.44806MB",
+ "Text": "eFPS: 524\nuFPS: -2147483648\nrFPS: -2147483648\npFPS: -2147483648\nCon: 0ms\nDirectX11\nGC memory: 19.59182MB",
"TextColor": {
"R": 1.0,
"G": 1.0,
@@ -202,6 +154,7 @@
"Font": "4508d98f4aa1f0bd59362b81d47e38f4",
"Size": 10
},
+ "Material": null,
"Margin": {
"Left": 0.0,
"Right": 0.0,
@@ -268,7 +221,7 @@
"Name": "ContainerControl 0",
"Transform": {
"Translation": {
- "X": 44550.0,
+ "X": 44861.0,
"Y": 1.5,
"Z": 0.0
}
diff --git a/Content/Settings/AudioSettings.json b/Content/Settings/EngineSettings/AudioSettings.json
similarity index 100%
rename from Content/Settings/AudioSettings.json
rename to Content/Settings/EngineSettings/AudioSettings.json
diff --git a/Content/Settings/BuildSettings.json b/Content/Settings/EngineSettings/BuildSettings.json
similarity index 100%
rename from Content/Settings/BuildSettings.json
rename to Content/Settings/EngineSettings/BuildSettings.json
diff --git a/Content/Settings/GraphicsSettings.json b/Content/Settings/EngineSettings/GraphicsSettings.json
similarity index 100%
rename from Content/Settings/GraphicsSettings.json
rename to Content/Settings/EngineSettings/GraphicsSettings.json
diff --git a/Content/Settings/InputSettings.json b/Content/Settings/EngineSettings/InputSettings.json
similarity index 100%
rename from Content/Settings/InputSettings.json
rename to Content/Settings/EngineSettings/InputSettings.json
diff --git a/Content/Settings/LayersAndTagsSettings.json b/Content/Settings/EngineSettings/LayersAndTagsSettings.json
similarity index 100%
rename from Content/Settings/LayersAndTagsSettings.json
rename to Content/Settings/EngineSettings/LayersAndTagsSettings.json
diff --git a/Content/Settings/PhysicsSettings.json b/Content/Settings/EngineSettings/PhysicsSettings.json
similarity index 100%
rename from Content/Settings/PhysicsSettings.json
rename to Content/Settings/EngineSettings/PhysicsSettings.json
diff --git a/Content/Settings/StreamingSettings.json b/Content/Settings/EngineSettings/StreamingSettings.json
similarity index 100%
rename from Content/Settings/StreamingSettings.json
rename to Content/Settings/EngineSettings/StreamingSettings.json
diff --git a/Content/Settings/TimeSettings.json b/Content/Settings/EngineSettings/TimeSettings.json
similarity index 100%
rename from Content/Settings/TimeSettings.json
rename to Content/Settings/EngineSettings/TimeSettings.json
diff --git a/Content/Settings/WindowsPlatformSettings.json b/Content/Settings/EngineSettings/WindowsPlatformSettings.json
similarity index 100%
rename from Content/Settings/WindowsPlatformSettings.json
rename to Content/Settings/EngineSettings/WindowsPlatformSettings.json
diff --git a/Content/Settings/GameSettings/BrushMaterialAssets.json b/Content/Settings/GameSettings/BrushMaterialAssets.json
new file mode 100644
index 0000000..21f8ea9
--- /dev/null
+++ b/Content/Settings/GameSettings/BrushMaterialAssets.json
@@ -0,0 +1,21 @@
+{
+ "ID": "29a0b0c54b40eb3e6857ffb4c9cab71e",
+ "TypeName": "Game.BrushMaterialList",
+ "EngineBuild": 6224,
+ "Data": {
+ "materialAssets": [
+ {
+ "name": "common/slick",
+ "asset": "c27c22ec429a17e827421e9a82ac79e4"
+ },
+ {
+ "name": "dev/dev_128_gray",
+ "asset": "cfe2d8d64700dc00dc2c5088ee028477"
+ },
+ {
+ "name": "dev/dev_128_red",
+ "asset": "a75d425f40ef7ba5df0fdb8d470e8a78"
+ }
+ ]
+}
+}
\ No newline at end of file
diff --git a/Content/Textures/dev/dev_128_gray.flax b/Content/Textures/dev/dev_128_gray.flax
index 5d8b086..db8e0cd 100644
Binary files a/Content/Textures/dev/dev_128_gray.flax and b/Content/Textures/dev/dev_128_gray.flax differ
diff --git a/Content/Textures/dev/dev_128_lightgray.flax b/Content/Textures/dev/dev_128_lightgray.flax
index b666e1c..75748ae 100644
Binary files a/Content/Textures/dev/dev_128_lightgray.flax and b/Content/Textures/dev/dev_128_lightgray.flax differ
diff --git a/Content/Textures/dev/dev_128_mat_norm.flax b/Content/Textures/dev/dev_128_mat_norm.flax
index f6fc642..1e20b6a 100644
Binary files a/Content/Textures/dev/dev_128_mat_norm.flax and b/Content/Textures/dev/dev_128_mat_norm.flax differ
diff --git a/Content/Textures/dev/dev_128_mat_orm.flax b/Content/Textures/dev/dev_128_mat_orm.flax
index 54d54b9..949adda 100644
Binary files a/Content/Textures/dev/dev_128_mat_orm.flax and b/Content/Textures/dev/dev_128_mat_orm.flax differ
diff --git a/Content/Textures/dev/dev_128_red.flax b/Content/Textures/dev/dev_128_red.flax
new file mode 100644
index 0000000..7f320f0
Binary files /dev/null and b/Content/Textures/dev/dev_128_red.flax differ
diff --git a/Content/Textures/dev/slick.flax b/Content/Textures/dev/slick.flax
index 9ec27d8..da55345 100644
Binary files a/Content/Textures/dev/slick.flax and b/Content/Textures/dev/slick.flax differ
diff --git a/Content/aerowalk/common clip.flax b/Content/aerowalk/common clip.flax
index ffd11ce..9cba26a 100644
Binary files a/Content/aerowalk/common clip.flax and b/Content/aerowalk/common clip.flax differ
diff --git a/Source/Game/BrushMaterialList.cs b/Source/Game/BrushMaterialList.cs
new file mode 100644
index 0000000..2c47b72
--- /dev/null
+++ b/Source/Game/BrushMaterialList.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using FlaxEngine;
+
+namespace Game
+{
+ ///
+ /// List of supported materials for loaded levels.
+ /// Maps the given texture/shader name to Flax Material/MaterialInstance.
+ ///
+ public class BrushMaterialList
+ {
+ [EditorDisplay(name: "Material Assets")]
+ public BrushMaterialListEntry[] materialAssets;
+ }
+
+ public struct BrushMaterialListEntry
+ {
+ [EditorOrder(1)]
+ [EditorDisplay(name: "Name")]
+ public string name;
+
+ [EditorOrder(2)]
+ [EditorDisplay(name: "Material")]
+ public MaterialBase asset;
+ }
+}
diff --git a/Source/Game/MapParser/MapParser.cs b/Source/Game/MapParser/MapParser.cs
index 9ffb2ae..7a3fce2 100644
--- a/Source/Game/MapParser/MapParser.cs
+++ b/Source/Game/MapParser/MapParser.cs
@@ -320,8 +320,14 @@ namespace Game
case '\n':
break;
- // brush face
+ // brush face (quake format):
+ // ( ) ( ) ( )
+
+ // brush face (quake3 format):
// ( ) ( ) ( )
+
+ // brush face (valve format):
+ // ( ) ( ) ( ) [ ] [ ]
case '(':
{
MapFacePlane plane = new MapFacePlane();
@@ -329,13 +335,36 @@ namespace Game
plane.v2 = ParsePlaneVector3(data, ref index);
plane.v3 = ParsePlaneVector3(data, ref index);
plane.texture = ParseString(data, ref index);
- plane.offset = ParseVector2(data, ref index);
- plane.rotation = ParseFloat(data, ref index);
- plane.scale = ParseVector2(data, ref index);
- plane.contentFlags = ParseInt(data, ref index);
- plane.surfaceFlags = ParseInt(data, ref index);
- plane.surfaceValue = ParseInt(data, ref index);
+ if (true) // quake or quake3 format
+ {
+ plane.offset = ParseVector2(data, ref index);
+ plane.rotation = ParseFloat(data, ref index);
+ plane.scale = ParseVector2(data, ref index);
+
+ if (true) // quake3 format
+ {
+ plane.contentFlags = ParseInt(data, ref index);
+ plane.surfaceFlags = ParseInt(data, ref index);
+ plane.surfaceValue = ParseInt(data, ref index);
+ }
+ }
+ else // valve format
+ {
+ /*
+ // " [ "
+ plane.textureRight = ParseVector3(data, ref index);
+ plane.offset.X = ParseFloat(data, ref index);
+ // " ] [ "
+ plane.textureUp = ParseVector3(data, ref index);
+ plane.offset.Y = ParseFloat(data, ref index);
+ // " ] "
+ plane.rotation = ParseFloat(data, ref index);
+ plane.scale = ParseVector2(data, ref index);
+ */
+ }
+
+ // Flip Y and Z
plane.v1 = new Vector3(plane.v1.X, plane.v1.Z, plane.v1.Y);
plane.v2 = new Vector3(plane.v2.X, plane.v2.Z, plane.v2.Y);
plane.v3 = new Vector3(plane.v3.X, plane.v3.Z, plane.v3.Y);
diff --git a/Source/Game/PlayerMovement.cs b/Source/Game/PlayerMovement.cs
index ac7ab5c..373f379 100644
--- a/Source/Game/PlayerMovement.cs
+++ b/Source/Game/PlayerMovement.cs
@@ -31,6 +31,8 @@ namespace Game
[Limit(0, 9000), Tooltip("Base Movement speed")]
public float MoveSpeed { get; set; } = 320;
+ public AudioClip JumpLandSound;
+
private float viewPitch;
private float viewYaw;
private float viewRoll;
@@ -40,7 +42,7 @@ namespace Game
private const float collisionMargin = 0.031f * 1.666f;
private const float slopeNormal = 0.7f;
- Actor rootActor;
+ private Actor rootActor;
private RigidBody rigidBody;
public override void OnAwake()
@@ -584,22 +586,17 @@ namespace Game
velocity += Vector3.Up * jumpVelocity;
onGround = false;
- Guid jumpguid;
- FlaxEngine.Json.JsonSerializer.ParseID("1ef4565844a4b36cdfda54b51f338c77", out jumpguid);
- AudioClip jumpAsset = AudioClip.Find(ref jumpguid);
- if (jumpAsset != null && jumpAsset.IsLoaded)
+ if (JumpLandSound != null && JumpLandSound.IsLoaded)
{
var audioSource = new AudioSource();
- audioSource.Clip = jumpAsset;
+ audioSource.Clip = JumpLandSound;
audioSource.Position = rootActor.Position; //new Vector3(-350, 176, 61);//rootActor.Position;
audioSource.Parent = Actor.Parent;
-
audioSource.Play();
- Destroy(audioSource, jumpAsset.Length);
- Console.Print("jumping sound!");
+ Destroy(audioSource, JumpLandSound.Length);
}
- else if (jumpAsset == null)
+ else if (JumpLandSound == null)
Console.Print("jumpAsset not found");
else
Console.Print("jumpAsset not loaded");
diff --git a/Source/Game/Q3MapImporter.cs b/Source/Game/Q3MapImporter.cs
index 8cfd85e..8b355a5 100644
--- a/Source/Game/Q3MapImporter.cs
+++ b/Source/Game/Q3MapImporter.cs
@@ -81,7 +81,7 @@ namespace Game
/// exceptionally close to each other, this value might need to be
/// adjusted.
///
- const float EPSILON = 0.0001f;
+ const float EPSILON = 0.001f;
///
/// Struct representing a single face.
@@ -1086,7 +1086,10 @@ namespace Game
public class Q3MapImporter : Script
{
- private string mapPath = @"C:\dev\GoakeFlax\Assets\Maps\cube.map";
+ //private string mapPath = @"C:\dev\GoakeFlax\Assets\Maps\cube_q1.map";
+ private string mapPath = @"C:\dev\GoakeFlax\Assets\Maps\cube_q3.map";
+ //private string mapPath = @"C:\dev\GoakeFlax\Assets\Maps\cube_valve.map";
+
//private string mapPath = @"C:\dev\Goake\maps\aerowalk\aerowalk.map";
//private string mapPath = @"C:\dev\GoakeFlax\Assets\Maps\problematic.map";
@@ -1672,27 +1675,59 @@ namespace Game
byte[] mapChars = File.ReadAllBytes(mapPath);
root = MapParser.Parse(mapChars);
- List vertices = new List();
- List uvs = new List();
- List normals = new List();
- if (true)
+ bool oneMesh = false;
+ bool convexMesh = true;
+
+ if (!oneMesh)
{
+ Dictionary materials = null;
+ var mapRootActor = Actor.AddChild();
+ mapRootActor.Name = "MapRootActor";
+
int brushIndex = 0;
foreach (var brush in root.entities[0].brushes)
{
try
{
- Vector3[] brushVertices;
- TriangulateBrush3(brush, out brushVertices);
+ List vertices = new List();
+ List uvs = new List();
+ List normals = new List();
+ TriangulateBrush3(brush, out Vector3[] brushVertices);
Vector2[] brushUvs = new Vector2[brushVertices.Length];
Vector3[] brushNormals = new Vector3[brushVertices.Length];
- for (int i=0; i();
+ if (brushMaterialList != null)
+ {
+ materials = brushMaterialList.materialAssets.ToDictionary(x => x.name, y => y.asset);
+ Console.Print("materials dictionary with " + materials.Count + " entries");
+ }
+ else
+ {
+ materials = new Dictionary();
+ Console.Print("no materials dictionary found");
+ }
+ }
+
+ if (!materials.TryGetValue(textureName, out brushMaterial))
+ {
+ Console.Print("Material '" + textureName + "' not found for brush");
+ materials.Add(textureName, material);
+ }
+
+ for (int i = 0; i < brushVertices.Length; i += 3)
+ {
+ Vector3 v1 = brushVertices[i + 0];
+ Vector3 v2 = brushVertices[i + 1];
+ Vector3 v3 = brushVertices[i + 2];
Vector3 normal = -Vector3.Cross(v3 - v1, v2 - v1).Normalized;
@@ -1701,19 +1736,19 @@ namespace Game
float uvRotation = 0f;
Vector2 uvOffset = new Vector2(0f);
bool found = false;
- Vector2 textureSize = new Vector2(64f); // TODO: figure out the correct size for the material
foreach (var brushPlane in brush.planes)
{
if ((brushPlane.plane.Normal - normal).Length < 0.01f)
{
normal = brushPlane.plane.Normal; // for consistency
- uvScale = 1f / brushPlane.scale / textureSize; // texture size?
+ uvScale = 1f / brushPlane.scale;
uvRotation = brushPlane.rotation;
uvOffset = brushPlane.offset * brushPlane.scale;
found = true;
break;
}
}
+
if (!found)
Console.Print("no matching plane found, bad geometry?");
@@ -1751,9 +1786,163 @@ namespace Game
Quaternion rot = Quaternion.Identity;
rot = rot * Quaternion.LookRotation(axis, axisForward);
- rot = rot * Quaternion.RotationAxis(-Vector3.Forward, 180f * Mathf.DegreesToRadians);
+ rot = rot * Quaternion.RotationAxis(-Vector3.Forward,
+ 180f * Mathf.DegreesToRadians);
rot = rot * Quaternion.RotationAxis(
- Mathf.Abs(Vector3.Dot(axis, Vector3.Right)) > 0.01f ? Vector3.Right : axisForward2,
+ Mathf.Abs(Vector3.Dot(axis, Vector3.Right)) > 0.01f
+ ? Vector3.Right
+ : axisForward2,
+ uvRotation * Mathf.DegreesToRadians);
+
+ uv1 = ((Vector2)(v1 * rot) + uvOffset) * uvScale;
+ uv2 = ((Vector2)(v2 * rot) + uvOffset) * uvScale;
+ uv3 = ((Vector2)(v3 * rot) + uvOffset) * uvScale;
+ }
+
+ brushUvs[i + 0] = uv1;
+ brushUvs[i + 1] = uv2;
+ brushUvs[i + 2] = uv3;
+
+ brushNormals[i + 0] = normal;
+ brushNormals[i + 1] = normal;
+ brushNormals[i + 2] = normal;
+ }
+
+ vertices.AddRange(brushVertices);
+ uvs.AddRange(brushUvs);
+ normals.AddRange(brushNormals);
+
+ if (vertices.Count > 0)
+ {
+ uint[] triangles = new uint[vertices.Count];
+ for (uint i = 0; i < vertices.Count; i++)
+ triangles[i] = i;
+
+ Model model = Content.CreateVirtualAsset();
+ model.SetupLODs(new int[] { 1 });
+ model.LODs[0].Meshes[0].UpdateMesh(vertices.ToArray(), (int[])(object)triangles, normals.ToArray(),
+ null, uvs.ToArray());
+
+ StaticModel childModel = Actor.AddChild();
+ childModel.Name = "Brush_" + brushIndex;
+ childModel.Model = model;
+ childModel.SetMaterial(0, brushMaterial);
+ childModel.Parent = mapRootActor;
+
+ CollisionData collisionData = Content.CreateVirtualAsset();
+ if (collisionData.CookCollision(convexMesh ? CollisionDataType.ConvexMesh : CollisionDataType.TriangleMesh, vertices.ToArray(),
+ triangles.ToArray()))
+ {
+ bool failed = true;
+ if (convexMesh)
+ {
+ // fallback to triangle mesh
+ failed = collisionData.CookCollision(CollisionDataType.TriangleMesh,
+ vertices.ToArray(),
+ triangles.ToArray());
+ if (!failed)
+ Console.PrintWarning("Hull brush " + brushIndex.ToString() + " is not convex");
+ }
+ if (failed)
+ throw new Exception("failed to cook final collision");
+ }
+
+ var meshCollider = childModel.AddChild();
+ meshCollider.CollisionData = collisionData;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.Print("Failed to hull brush " + brushIndex.ToString() + ": " + e.Message);
+ }
+
+ brushIndex++;
+ }
+ }
+ else
+ {
+ List vertices = new List();
+ List uvs = new List();
+ List normals = new List();
+
+ int brushIndex = 0;
+ foreach (var brush in root.entities[0].brushes)
+ {
+ try
+ {
+ TriangulateBrush3(brush, out Vector3[] brushVertices);
+ Vector2[] brushUvs = new Vector2[brushVertices.Length];
+ Vector3[] brushNormals = new Vector3[brushVertices.Length];
+
+ for (int i = 0; i < brushVertices.Length; i += 3)
+ {
+ Vector3 v1 = brushVertices[i + 0];
+ Vector3 v2 = brushVertices[i + 1];
+ Vector3 v3 = brushVertices[i + 2];
+
+ Vector3 normal = -Vector3.Cross(v3 - v1, v2 - v1).Normalized;
+
+ // fetch the texture parameters from the plane with matching normal
+ Vector2 uvScale = new Vector2(0f);
+ float uvRotation = 0f;
+ Vector2 uvOffset = new Vector2(0f);
+ bool found = false;
+ foreach (var brushPlane in brush.planes)
+ {
+ if ((brushPlane.plane.Normal - normal).Length < 0.01f)
+ {
+ normal = brushPlane.plane.Normal; // for consistency
+ uvScale = 1f / brushPlane.scale;
+ uvRotation = brushPlane.rotation;
+ uvOffset = brushPlane.offset * brushPlane.scale;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ Console.Print("no matching plane found, bad geometry?");
+
+ Vector2 uv1, uv2, uv3;
+ // if quake format
+ {
+ // The texture is projected to the surface from three angles, the axis with least
+ // distortion is chosen here.
+
+ // Attempt to workaround most rounding errors at 45-degree angles which causes bias towards one axis.
+ // This behaviour is seemingly random in different engines and editors, so let's not bother.
+ Vector3 textureNormal = new Vector3((float)Math.Round(normal.X, 4),
+ (float)Math.Round(normal.Y, 4), (float)Math.Round(normal.Z, 4));
+
+ var dotX = Math.Abs(Vector3.Dot(textureNormal, Vector3.Right));
+ var dotY = Math.Abs(Vector3.Dot(textureNormal, Vector3.Up));
+ var dotZ = Math.Abs(Vector3.Dot(textureNormal, Vector3.Forward));
+
+ Vector3 axis;
+ if (dotY >= dotX && dotY >= dotZ)
+ axis = -Vector3.Up;
+ else if (dotX >= dotY && dotX >= dotZ)
+ axis = Vector3.Right;
+ else if (dotZ >= dotX && dotZ >= dotY)
+ axis = -Vector3.Forward;
+ else
+ axis = Vector3.Right;
+
+ var axisForward = Mathf.Abs(Vector3.Dot(axis, Vector3.Up)) > 0.01f
+ ? -Vector3.Forward
+ : Vector3.Up;
+ var axisForward2 = Mathf.Abs(Vector3.Dot(axis, Vector3.Up)) > 0.01f
+ ? Vector3.Up
+ : -Vector3.Forward;
+
+ Quaternion rot = Quaternion.Identity;
+ rot = rot * Quaternion.LookRotation(axis, axisForward);
+ rot = rot * Quaternion.RotationAxis(-Vector3.Forward,
+ 180f * Mathf.DegreesToRadians);
+ rot = rot * Quaternion.RotationAxis(
+ Mathf.Abs(Vector3.Dot(axis, Vector3.Right)) > 0.01f
+ ? Vector3.Right
+ : axisForward2,
uvRotation * Mathf.DegreesToRadians);
uv1 = ((Vector2)(v1 * rot) + uvOffset) * uvScale;
@@ -1778,34 +1967,33 @@ namespace Game
{
Console.Print("Failed to hull brush " + brushIndex.ToString() + ": " + e.Message);
}
+
brushIndex++;
}
- }
- if (vertices.Count > 0)
- {
- uint[] triangles = new uint[vertices.Count];
- for (uint i = 0; i < vertices.Count; i++)
- triangles[i] = i;
+ if (vertices.Count > 0)
+ {
+ uint[] triangles = new uint[vertices.Count];
+ for (uint i = 0; i < vertices.Count; i++)
+ triangles[i] = i;
- model = Content.CreateVirtualAsset();
- model.SetupLODs(new int[] { 1 });
- model.LODs[0].Meshes[0].UpdateMesh(vertices.ToArray(), (int[])(object)triangles, normals.ToArray(), null, uvs.ToArray());
+ model = Content.CreateVirtualAsset();
+ model.SetupLODs(new int[] { 1 });
+ model.LODs[0].Meshes[0].UpdateMesh(vertices.ToArray(), (int[])(object)triangles, normals.ToArray(),
+ null, uvs.ToArray());
- StaticModel childModel = Actor.AddChild();
- childModel.Name = "MapModel";
- childModel.Model = model;
- childModel.SetMaterial(0, material);
+ StaticModel childModel = Actor.AddChild();
+ childModel.Name = "MapModel";
+ childModel.Model = model;
+ childModel.SetMaterial(0, material);
- CollisionData collisionData = Content.CreateVirtualAsset();
- if (collisionData.CookCollision(CollisionDataType.TriangleMesh, vertices.ToArray(), triangles.ToArray()))
- throw new Exception("failed to cook final collision");
- var meshCollider = childModel.AddChild();
- meshCollider.CollisionData = collisionData;
-
- // TODO: flip Y and Z
- //childModel.Orientation = Quaternion.RotationYawPitchRoll(180f*Mathf.DegreesToRadians, -90f*Mathf.DegreesToRadians, 0f);
- //childModel.Scale = new Vector3(1f, -1f, 1f);
+ CollisionData collisionData = Content.CreateVirtualAsset();
+ if (collisionData.CookCollision(CollisionDataType.TriangleMesh, vertices.ToArray(),
+ triangles.ToArray()))
+ throw new Exception("failed to cook final collision");
+ var meshCollider = childModel.AddChild();
+ meshCollider.CollisionData = collisionData;
+ }
}
}