diff --git a/.gitignore b/.gitignore index aa7dc4b..3f57b1e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ *.lock save.bin save.txt -rg3d.log \ No newline at end of file +fyrox.log \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 42177b9..ba7cacf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,8 +9,5 @@ license = "MIT" opt-level = 3 [dependencies] -rg3d = { path = "../rg3d" } +fyrox = { path = "../Fyrox" } crossbeam = "0.8.0" - -[features] -enable_profiler = ["rg3d/enable_profiler"] \ No newline at end of file diff --git a/README.md b/README.md index eb52f0e..1777bb2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # What is this? -Single player 3d shooter written in Rust and based on [rg3d engine](https://github.com/mrDIMAS/rg3d) +Single player 3d shooter written in Rust and based on [fyrox engine](https://github.com/mrDIMAS/fyrox) ## How to build -Cargo.toml contains hardcoded relative path to engine `rg3d = { path = "../rg3d" }`, so you have to change this or put engine folder near the game folder to get game compile, because it always uses latest rg3d which could be not published on crates.io. +Cargo.toml contains hardcoded relative path to engine `fyrox = { path = "../fyrox" }`, so you have to change this or put engine folder near the game folder to get game compile, because it always uses latest fyrox which could be not published on crates.io. In other words you can do something like this: ``` -git clone https://github.com/mrDIMAS/rg3d +git clone https://github.com/mrDIMAS/fyrox git clone https://github.com/mrDIMAS/rusty-shooter cd rusty-shooter cargo run --release @@ -16,7 +16,7 @@ cargo run --release Or if you're updating to the latest version, do this: ``` -cd rg3d +cd fyrox git pull cd ../rusty-shooter git pull diff --git a/data/textures/blocks10.tga b/data/levels/blocks10.tga similarity index 100% rename from data/textures/blocks10.tga rename to data/levels/blocks10.tga diff --git a/data/textures/blocks11b.tga b/data/levels/blocks11b.tga similarity index 100% rename from data/textures/blocks11b.tga rename to data/levels/blocks11b.tga diff --git a/data/textures/blocks11b_normal.tga b/data/levels/blocks11b_normal.tga similarity index 100% rename from data/textures/blocks11b_normal.tga rename to data/levels/blocks11b_normal.tga diff --git a/data/textures/blocks15.tga b/data/levels/blocks15.tga similarity index 100% rename from data/textures/blocks15.tga rename to data/levels/blocks15.tga diff --git a/data/textures/blocks15_normal.tga b/data/levels/blocks15_normal.tga similarity index 100% rename from data/textures/blocks15_normal.tga rename to data/levels/blocks15_normal.tga diff --git a/data/textures/blocks17floor.tga b/data/levels/blocks17floor.tga similarity index 100% rename from data/textures/blocks17floor.tga rename to data/levels/blocks17floor.tga diff --git a/data/textures/blocks17floor2.tga b/data/levels/blocks17floor2.tga similarity index 100% rename from data/textures/blocks17floor2.tga rename to data/levels/blocks17floor2.tga diff --git a/data/textures/blocks9.tga b/data/levels/blocks9.tga similarity index 100% rename from data/textures/blocks9.tga rename to data/levels/blocks9.tga diff --git a/data/textures/blocks9_normal.tga b/data/levels/blocks9_normal.tga similarity index 100% rename from data/textures/blocks9_normal.tga rename to data/levels/blocks9_normal.tga diff --git a/data/textures/brick.tga b/data/levels/brick.tga similarity index 100% rename from data/textures/brick.tga rename to data/levels/brick.tga diff --git a/data/textures/brick2.tga b/data/levels/brick2.tga similarity index 100% rename from data/textures/brick2.tga rename to data/levels/brick2.tga diff --git a/data/textures/brick2_normal.tga b/data/levels/brick2_normal.tga similarity index 100% rename from data/textures/brick2_normal.tga rename to data/levels/brick2_normal.tga diff --git a/data/textures/brick3.tga b/data/levels/brick3.tga similarity index 100% rename from data/textures/brick3.tga rename to data/levels/brick3.tga diff --git a/data/textures/brick3_normal.tga b/data/levels/brick3_normal.tga similarity index 100% rename from data/textures/brick3_normal.tga rename to data/levels/brick3_normal.tga diff --git a/data/textures/brick4.tga b/data/levels/brick4.tga similarity index 100% rename from data/textures/brick4.tga rename to data/levels/brick4.tga diff --git a/data/textures/brick_normal.tga b/data/levels/brick_normal.tga similarity index 100% rename from data/textures/brick_normal.tga rename to data/levels/brick_normal.tga diff --git a/data/models/dm6.fbx b/data/levels/dm6.fbx similarity index 100% rename from data/models/dm6.fbx rename to data/levels/dm6.fbx diff --git a/data/levels/dm6.rgs b/data/levels/dm6.rgs new file mode 100644 index 0000000..cd96bd3 Binary files /dev/null and b/data/levels/dm6.rgs differ diff --git a/data/textures/largeblockfloor3.tga b/data/levels/largeblockfloor3.tga similarity index 100% rename from data/textures/largeblockfloor3.tga rename to data/levels/largeblockfloor3.tga diff --git a/data/textures/largeblockfloor3_normal.tga b/data/levels/largeblockfloor3_normal.tga similarity index 100% rename from data/textures/largeblockfloor3_normal.tga rename to data/levels/largeblockfloor3_normal.tga diff --git a/data/textures/largeblockfloor4.tga b/data/levels/largeblockfloor4.tga similarity index 100% rename from data/textures/largeblockfloor4.tga rename to data/levels/largeblockfloor4.tga diff --git a/data/textures/largeblockfloor4_normal.tga b/data/levels/largeblockfloor4_normal.tga similarity index 100% rename from data/textures/largeblockfloor4_normal.tga rename to data/levels/largeblockfloor4_normal.tga diff --git a/data/textures/mesh.png b/data/levels/mesh.png similarity index 100% rename from data/textures/mesh.png rename to data/levels/mesh.png diff --git a/data/textures/mesh.tga b/data/levels/mesh.tga similarity index 100% rename from data/textures/mesh.tga rename to data/levels/mesh.tga diff --git a/data/textures/mesh_normal.png b/data/levels/mesh_normal.png similarity index 100% rename from data/textures/mesh_normal.png rename to data/levels/mesh_normal.png diff --git a/data/textures/metal.tga b/data/levels/metal.tga similarity index 100% rename from data/textures/metal.tga rename to data/levels/metal.tga diff --git a/data/textures/metal1_1.tga b/data/levels/metal1_1.tga similarity index 100% rename from data/textures/metal1_1.tga rename to data/levels/metal1_1.tga diff --git a/data/textures/metal2.tga b/data/levels/metal2.tga similarity index 100% rename from data/textures/metal2.tga rename to data/levels/metal2.tga diff --git a/data/textures/metal2_normal.tga b/data/levels/metal2_normal.tga similarity index 100% rename from data/textures/metal2_normal.tga rename to data/levels/metal2_normal.tga diff --git a/data/textures/metal3.tga b/data/levels/metal3.tga similarity index 100% rename from data/textures/metal3.tga rename to data/levels/metal3.tga diff --git a/data/textures/metal3_3.tga b/data/levels/metal3_3.tga similarity index 100% rename from data/textures/metal3_3.tga rename to data/levels/metal3_3.tga diff --git a/data/textures/metal4.tga b/data/levels/metal4.tga similarity index 100% rename from data/textures/metal4.tga rename to data/levels/metal4.tga diff --git a/data/textures/metal4_normal.tga b/data/levels/metal4_normal.tga similarity index 100% rename from data/textures/metal4_normal.tga rename to data/levels/metal4_normal.tga diff --git a/data/textures/metal5.tga b/data/levels/metal5.tga similarity index 100% rename from data/textures/metal5.tga rename to data/levels/metal5.tga diff --git a/data/textures/metal8.jpg b/data/levels/metal8.jpg similarity index 100% rename from data/textures/metal8.jpg rename to data/levels/metal8.jpg diff --git a/data/textures/metal8_normal.jpg b/data/levels/metal8_normal.jpg similarity index 100% rename from data/textures/metal8_normal.jpg rename to data/levels/metal8_normal.jpg diff --git a/data/textures/metal_bare.jpg b/data/levels/metal_bare.jpg similarity index 100% rename from data/textures/metal_bare.jpg rename to data/levels/metal_bare.jpg diff --git a/data/textures/metal_bare_normal.jpg b/data/levels/metal_bare_normal.jpg similarity index 100% rename from data/textures/metal_bare_normal.jpg rename to data/levels/metal_bare_normal.jpg diff --git a/data/textures/metal_bare_specular.jpg b/data/levels/metal_bare_specular.jpg similarity index 100% rename from data/textures/metal_bare_specular.jpg rename to data/levels/metal_bare_specular.jpg diff --git a/data/textures/metal_bare_white.jpg b/data/levels/metal_bare_white.jpg similarity index 100% rename from data/textures/metal_bare_white.jpg rename to data/levels/metal_bare_white.jpg diff --git a/data/textures/metal_bare_white_normal.jpg b/data/levels/metal_bare_white_normal.jpg similarity index 100% rename from data/textures/metal_bare_white_normal.jpg rename to data/levels/metal_bare_white_normal.jpg diff --git a/data/textures/metal_bare_white_specular.jpg b/data/levels/metal_bare_white_specular.jpg similarity index 100% rename from data/textures/metal_bare_white_specular.jpg rename to data/levels/metal_bare_white_specular.jpg diff --git a/data/textures/metal_red.jpg b/data/levels/metal_red.jpg similarity index 100% rename from data/textures/metal_red.jpg rename to data/levels/metal_red.jpg diff --git a/data/textures/metal_red_normal.jpg b/data/levels/metal_red_normal.jpg similarity index 100% rename from data/textures/metal_red_normal.jpg rename to data/levels/metal_red_normal.jpg diff --git a/data/textures/metal_rusted.jpg b/data/levels/metal_rusted.jpg similarity index 100% rename from data/textures/metal_rusted.jpg rename to data/levels/metal_rusted.jpg diff --git a/data/textures/metal_rusted_normal.jpg b/data/levels/metal_rusted_normal.jpg similarity index 100% rename from data/textures/metal_rusted_normal.jpg rename to data/levels/metal_rusted_normal.jpg diff --git a/data/levels/starship.rgs b/data/levels/starship.rgs deleted file mode 100644 index 28d7b1e..0000000 Binary files a/data/levels/starship.rgs and /dev/null differ diff --git a/data/levels/starship2.rgs b/data/levels/starship2.rgs deleted file mode 100644 index 1c87981..0000000 Binary files a/data/levels/starship2.rgs and /dev/null differ diff --git a/data/textures/Ak47_Body.png b/data/models/Ak47_Body.png similarity index 100% rename from data/textures/Ak47_Body.png rename to data/models/Ak47_Body.png diff --git a/data/textures/Ak47_Body_normal.png b/data/models/Ak47_Body_normal.png similarity index 100% rename from data/textures/Ak47_Body_normal.png rename to data/models/Ak47_Body_normal.png diff --git a/data/textures/Ak47_Magazine.png b/data/models/Ak47_Magazine.png similarity index 100% rename from data/textures/Ak47_Magazine.png rename to data/models/Ak47_Magazine.png diff --git a/data/textures/Ak47_Magazine_normal.png b/data/models/Ak47_Magazine_normal.png similarity index 100% rename from data/textures/Ak47_Magazine_normal.png rename to data/models/Ak47_Magazine_normal.png diff --git a/data/textures/M4_Body.png b/data/models/M4_Body.png similarity index 100% rename from data/textures/M4_Body.png rename to data/models/M4_Body.png diff --git a/data/textures/M4_Body_normal.png b/data/models/M4_Body_normal.png similarity index 100% rename from data/textures/M4_Body_normal.png rename to data/models/M4_Body_normal.png diff --git a/data/textures/M4_Magazine.png b/data/models/M4_Magazine.png similarity index 100% rename from data/textures/M4_Magazine.png rename to data/models/M4_Magazine.png diff --git a/data/textures/M4_Magazine_normal.png b/data/models/M4_Magazine_normal.png similarity index 100% rename from data/textures/M4_Magazine_normal.png rename to data/models/M4_Magazine_normal.png diff --git a/data/textures/M4_Sight.png b/data/models/M4_Sight.png similarity index 100% rename from data/textures/M4_Sight.png rename to data/models/M4_Sight.png diff --git a/data/textures/M4_Sight_normal.png b/data/models/M4_Sight_normal.png similarity index 100% rename from data/textures/M4_Sight_normal.png rename to data/models/M4_Sight_normal.png diff --git a/data/textures/MAW_diffuse.png b/data/models/MAW_diffuse.png similarity index 100% rename from data/textures/MAW_diffuse.png rename to data/models/MAW_diffuse.png diff --git a/data/textures/MAW_glow.png b/data/models/MAW_glow.png similarity index 100% rename from data/textures/MAW_glow.png rename to data/models/MAW_glow.png diff --git a/data/textures/MAW_normal.png b/data/models/MAW_normal.png similarity index 100% rename from data/textures/MAW_normal.png rename to data/models/MAW_normal.png diff --git a/data/textures/MAW_specular.png b/data/models/MAW_specular.png similarity index 100% rename from data/textures/MAW_specular.png rename to data/models/MAW_specular.png diff --git a/data/textures/Mutant_diffuse.png b/data/models/Mutant_diffuse.png similarity index 100% rename from data/textures/Mutant_diffuse.png rename to data/models/Mutant_diffuse.png diff --git a/data/textures/Mutant_normal.png b/data/models/Mutant_normal.png similarity index 100% rename from data/textures/Mutant_normal.png rename to data/models/Mutant_normal.png diff --git a/data/textures/barell.tga b/data/models/barell.tga similarity index 100% rename from data/textures/barell.tga rename to data/models/barell.tga diff --git a/data/textures/barrel.jpg b/data/models/barrel.jpg similarity index 100% rename from data/textures/barrel.jpg rename to data/models/barrel.jpg diff --git a/data/textures/barrel_normal.jpg b/data/models/barrel_normal.jpg similarity index 100% rename from data/textures/barrel_normal.jpg rename to data/models/barrel_normal.jpg diff --git a/data/textures/blackplastic.jpg b/data/models/blackplastic.jpg similarity index 100% rename from data/textures/blackplastic.jpg rename to data/models/blackplastic.jpg diff --git a/data/textures/blackplastic_normal.jpg b/data/models/blackplastic_normal.jpg similarity index 100% rename from data/textures/blackplastic_normal.jpg rename to data/models/blackplastic_normal.jpg diff --git a/data/textures/box.jpg b/data/models/box.jpg similarity index 100% rename from data/textures/box.jpg rename to data/models/box.jpg diff --git a/data/textures/box.tga b/data/models/box.tga similarity index 100% rename from data/textures/box.tga rename to data/models/box.tga diff --git a/data/textures/box_normal.jpg b/data/models/box_normal.jpg similarity index 100% rename from data/textures/box_normal.jpg rename to data/models/box_normal.jpg diff --git a/data/textures/camouflage.jpg b/data/models/camouflage.jpg similarity index 100% rename from data/textures/camouflage.jpg rename to data/models/camouflage.jpg diff --git a/data/textures/clang_floor.tga b/data/models/clang_floor.tga similarity index 100% rename from data/textures/clang_floor.tga rename to data/models/clang_floor.tga diff --git a/data/textures/clang_floor2.tga b/data/models/clang_floor2.tga similarity index 100% rename from data/textures/clang_floor2.tga rename to data/models/clang_floor2.tga diff --git a/data/textures/clang_floor3b.tga b/data/models/clang_floor3b.tga similarity index 100% rename from data/textures/clang_floor3b.tga rename to data/models/clang_floor3b.tga diff --git a/data/textures/clouds.tga b/data/models/clouds.tga similarity index 100% rename from data/textures/clouds.tga rename to data/models/clouds.tga diff --git a/data/textures/column.tga b/data/models/column.tga similarity index 100% rename from data/textures/column.tga rename to data/models/column.tga diff --git a/data/textures/concrete.tga b/data/models/concrete.tga similarity index 100% rename from data/textures/concrete.tga rename to data/models/concrete.tga diff --git a/data/textures/concrete2.tga b/data/models/concrete2.tga similarity index 100% rename from data/textures/concrete2.tga rename to data/models/concrete2.tga diff --git a/data/textures/concrete_normal.tga b/data/models/concrete_normal.tga similarity index 100% rename from data/textures/concrete_normal.tga rename to data/models/concrete_normal.tga diff --git a/data/textures/concretefloor1.tga b/data/models/concretefloor1.tga similarity index 100% rename from data/textures/concretefloor1.tga rename to data/models/concretefloor1.tga diff --git a/data/textures/cube.tga b/data/models/cube.tga similarity index 100% rename from data/textures/cube.tga rename to data/models/cube.tga diff --git a/data/textures/fire.tga b/data/models/fire.tga similarity index 100% rename from data/textures/fire.tga rename to data/models/fire.tga diff --git a/data/textures/flare.tga b/data/models/flare.tga similarity index 100% rename from data/textures/flare.tga rename to data/models/flare.tga diff --git a/data/textures/floor.tga b/data/models/floor.tga similarity index 100% rename from data/textures/floor.tga rename to data/models/floor.tga diff --git a/data/textures/floor_metal.jpg b/data/models/floor_metal.jpg similarity index 100% rename from data/textures/floor_metal.jpg rename to data/models/floor_metal.jpg diff --git a/data/textures/floor_metal_normal.jpg b/data/models/floor_metal_normal.jpg similarity index 100% rename from data/textures/floor_metal_normal.jpg rename to data/models/floor_metal_normal.jpg diff --git a/data/textures/floor_metal_specular.jpg b/data/models/floor_metal_specular.jpg similarity index 100% rename from data/textures/floor_metal_specular.jpg rename to data/models/floor_metal_specular.jpg diff --git a/data/textures/grass.tga b/data/models/grass.tga similarity index 100% rename from data/textures/grass.tga rename to data/models/grass.tga diff --git a/data/textures/grenade.tga b/data/models/grenade.tga similarity index 100% rename from data/textures/grenade.tga rename to data/models/grenade.tga diff --git a/data/textures/grenade_specular.tga b/data/models/grenade_specular.tga similarity index 100% rename from data/textures/grenade_specular.tga rename to data/models/grenade_specular.tga diff --git a/data/textures/lamp.tga b/data/models/lamp.tga similarity index 100% rename from data/textures/lamp.tga rename to data/models/lamp.tga diff --git a/data/models/map.FBX b/data/models/map.FBX index dd166c5..01eadf4 100644 --- a/data/models/map.FBX +++ b/data/models/map.FBX @@ -30,14 +30,14 @@ FBXHeaderExtension: { Comment: "" } Properties70: { - P: "DocumentUrl", "KString", "Url", "", "C:\rg3d\data\models\map.FBX" - P: "SrcDocumentUrl", "KString", "Url", "", "C:\rg3d\data\models\map.FBX" + P: "DocumentUrl", "KString", "Url", "", "C:\fyrox\data\models\map.FBX" + P: "SrcDocumentUrl", "KString", "Url", "", "C:\fyrox\data\models\map.FBX" P: "Original", "Compound", "", "" P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" P: "Original|ApplicationName", "KString", "", "", "3ds Max" P: "Original|ApplicationVersion", "KString", "", "", "2012" P: "Original|DateTime_GMT", "DateTime", "", "", "16/06/2019 13:49:16.493" - P: "Original|FileName", "KString", "", "", "C:\rg3d\data\models\map.FBX" + P: "Original|FileName", "KString", "", "", "C:\fyrox\data\models\map.FBX" P: "LastSaved", "Compound", "", "" P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" P: "LastSaved|ApplicationName", "KString", "", "", "3ds Max" diff --git a/data/textures/medkit_ao.png b/data/models/medkit_ao.png similarity index 100% rename from data/textures/medkit_ao.png rename to data/models/medkit_ao.png diff --git a/data/textures/medkit_diffuse.png b/data/models/medkit_diffuse.png similarity index 100% rename from data/textures/medkit_diffuse.png rename to data/models/medkit_diffuse.png diff --git a/data/textures/medkit_metallic.png b/data/models/medkit_metallic.png similarity index 100% rename from data/textures/medkit_metallic.png rename to data/models/medkit_metallic.png diff --git a/data/textures/medkit_normal.png b/data/models/medkit_normal.png similarity index 100% rename from data/textures/medkit_normal.png rename to data/models/medkit_normal.png diff --git a/data/textures/medkit_roughness.png b/data/models/medkit_roughness.png similarity index 100% rename from data/textures/medkit_roughness.png rename to data/models/medkit_roughness.png diff --git a/data/textures/parasiteZombie_diffuse.png b/data/models/parasiteZombie_diffuse.png similarity index 100% rename from data/textures/parasiteZombie_diffuse.png rename to data/models/parasiteZombie_diffuse.png diff --git a/data/textures/parasiteZombie_normal.png b/data/models/parasiteZombie_normal.png similarity index 100% rename from data/textures/parasiteZombie_normal.png rename to data/models/parasiteZombie_normal.png diff --git a/data/textures/parasiteZombie_specular.png b/data/models/parasiteZombie_specular.png similarity index 100% rename from data/textures/parasiteZombie_specular.png rename to data/models/parasiteZombie_specular.png diff --git a/data/textures/plasma_gun.png b/data/models/plasma_gun.png similarity index 100% rename from data/textures/plasma_gun.png rename to data/models/plasma_gun.png diff --git a/data/textures/plasma_gun_ao.png b/data/models/plasma_gun_ao.png similarity index 100% rename from data/textures/plasma_gun_ao.png rename to data/models/plasma_gun_ao.png diff --git a/data/textures/plasma_gun_emissive.png b/data/models/plasma_gun_emissive.png similarity index 100% rename from data/textures/plasma_gun_emissive.png rename to data/models/plasma_gun_emissive.png diff --git a/data/textures/plasma_gun_metallic.png b/data/models/plasma_gun_metallic.png similarity index 100% rename from data/textures/plasma_gun_metallic.png rename to data/models/plasma_gun_metallic.png diff --git a/data/textures/plasma_gun_normal.png b/data/models/plasma_gun_normal.png similarity index 100% rename from data/textures/plasma_gun_normal.png rename to data/models/plasma_gun_normal.png diff --git a/data/textures/plasma_gun_roughness.png b/data/models/plasma_gun_roughness.png similarity index 100% rename from data/textures/plasma_gun_roughness.png rename to data/models/plasma_gun_roughness.png diff --git a/data/textures/rpg7_diffuse.png b/data/models/rpg7_diffuse.png similarity index 100% rename from data/textures/rpg7_diffuse.png rename to data/models/rpg7_diffuse.png diff --git a/data/textures/rpg7_normal.png b/data/models/rpg7_normal.png similarity index 100% rename from data/textures/rpg7_normal.png rename to data/models/rpg7_normal.png diff --git a/data/textures/white.jpg b/data/models/white.jpg similarity index 100% rename from data/textures/white.jpg rename to data/models/white.jpg diff --git a/data/textures/white_normal.jpg b/data/models/white_normal.jpg similarity index 100% rename from data/textures/white_normal.jpg rename to data/models/white_normal.jpg diff --git a/data/textures/yellow.jpg b/data/models/yellow.jpg similarity index 100% rename from data/textures/yellow.jpg rename to data/models/yellow.jpg diff --git a/profiling.log b/profiling.log new file mode 100644 index 0000000..d4865d3 --- /dev/null +++ b/profiling.log @@ -0,0 +1 @@ +Performance profiling results are not available, because feature 'enable_profiler' wasn't defined! diff --git a/rg3d.log b/rg3d.log new file mode 100644 index 0000000..a46afb3 --- /dev/null +++ b/rg3d.log @@ -0,0 +1,507 @@ +[INFO]: Shader BlurShader_VertexShader compiled! + +[INFO]: Shader BlurShader_FragmentShader compiled! + +[INFO]: Shader BlurShader linked! + +[INFO]: Shader SsaoShader_VertexShader compiled! + +[INFO]: Shader SsaoShader_FragmentShader compiled! + +[INFO]: Shader SsaoShader linked! + +[INFO]: Shader SpotLightShader_VertexShader compiled! + +[INFO]: Shader SpotLightShader_FragmentShader compiled! + +[INFO]: Shader SpotLightShader linked! + +[INFO]: Shader PointLightShader_VertexShader compiled! + +[INFO]: Shader PointLightShader_FragmentShader compiled! + +[INFO]: Shader PointLightShader linked! + +[INFO]: Shader DirectionalLightShader_VertexShader compiled! + +[INFO]: Shader DirectionalLightShader_FragmentShader compiled! + +[INFO]: Shader DirectionalLightShader linked! + +[INFO]: Shader AmbientLightShader_VertexShader compiled! + +[INFO]: Shader AmbientLightShader_FragmentShader compiled! + +[INFO]: Shader AmbientLightShader linked! + +[INFO]: Shader FlatShader_VertexShader compiled! + +[INFO]: Shader FlatShader_FragmentShader compiled! + +[INFO]: Shader FlatShader linked! + +[INFO]: Shader SkyboxShader_VertexShader compiled! + +[INFO]: Shader SkyboxShader_FragmentShader compiled! + +[INFO]: Shader SkyboxShader linked! + +[INFO]: Shader SpotVolumetricLight_VertexShader compiled! + +[INFO]: Shader SpotVolumetricLight_FragmentShader compiled! + +[INFO]: Shader SpotVolumetricLight linked! + +[INFO]: Shader PointVolumetricLight_VertexShader compiled! + +[INFO]: Shader PointVolumetricLight_FragmentShader compiled! + +[INFO]: Shader PointVolumetricLight linked! + +[INFO]: Shader FlatShader_VertexShader compiled! + +[INFO]: Shader FlatShader_FragmentShader compiled! + +[INFO]: Shader FlatShader linked! + +[INFO]: Shader FlatShader_VertexShader compiled! + +[INFO]: Shader FlatShader_FragmentShader compiled! + +[INFO]: Shader FlatShader linked! + +[INFO]: Shader SpriteShader_VertexShader compiled! + +[INFO]: Shader SpriteShader_FragmentShader compiled! + +[INFO]: Shader SpriteShader linked! + +[INFO]: Shader UIShader_VertexShader compiled! + +[INFO]: Shader UIShader_FragmentShader compiled! + +[INFO]: Shader UIShader linked! + +[INFO]: Shader ParticleSystemShader_VertexShader compiled! + +[INFO]: Shader ParticleSystemShader_FragmentShader compiled! + +[INFO]: Shader ParticleSystemShader linked! + +[INFO]: Shader DebugShader_VertexShader compiled! + +[INFO]: Shader DebugShader_FragmentShader compiled! + +[INFO]: Shader DebugShader linked! + +[INFO]: Shader FXAAShader_VertexShader compiled! + +[INFO]: Shader FXAAShader_FragmentShader compiled! + +[INFO]: Shader FXAAShader linked! + +[INFO]: Shader SpriteShader2D_VertexShader compiled! + +[INFO]: Shader SpriteShader2D_FragmentShader compiled! + +[INFO]: Shader SpriteShader2D linked! + +[INFO]: Sound buffer "data/sounds/Antonio_Bizarro_Berzerker.ogg" is loaded! +[INFO]: Texture "data/ui/crosshair.tga" is loaded in 411.8µs! +[INFO]: Texture "data/ui/ammo_icon.png" is loaded in 7.8668ms! +[INFO]: Texture "data/ui/shield_icon.png" is loaded in 8.8319ms! +[INFO]: Texture "data/ui/health_icon.png" is loaded in 9.1701ms! +[INFO]: Trying to load "data/models/dm6.fbx" +[INFO]: Texture "data/textures\\largeblockfloor3.tga" is loaded in 8.2399ms! +[INFO]: Texture "data/textures\\largeblockfloor4.tga" is loaded in 8.1291ms! +[INFO]: Texture "data/textures\\largeblockfloor3_normal.tga" is loaded in 8.606ms! +[INFO]: Texture "data/textures\\largeblockfloor4_normal.tga" is loaded in 12.2583ms! +[INFO]: Texture "data/textures\\blocks15_normal.tga" is loaded in 33.6066ms! +[INFO]: Texture "data/textures\\metal5.tga" is loaded in 36.04ms! +[INFO]: Texture "data/textures\\blocks9_normal.tga" is loaded in 36.5026ms! +[INFO]: Texture "data/textures\\blocks11b.tga" is loaded in 36.8723ms! +[INFO]: Texture "data/textures\\blocks9.tga" is loaded in 37.6845ms! +[INFO]: Texture "data/textures\\clang_floor2.tga" is loaded in 38.989ms! +[INFO]: Texture "data/textures\\blocks15.tga" is loaded in 40.1984ms! +[INFO]: Texture "data/textures\\white.jpg" is loaded in 3.3192ms! +[INFO]: Texture "data/textures\\metal1_1.tga" is loaded in 7.6939ms! +[INFO]: Texture "data/textures\\metal4.tga" is loaded in 29.5283ms! +[INFO]: Texture "data/textures\\concrete2.tga" is loaded in 34.079ms! +[INFO]: Texture "data/textures\\blocks10.tga" is loaded in 35.398ms! +[INFO]: Texture "data/textures\\blocks17floor2.tga" is loaded in 36.0365ms! +[INFO]: Texture "data/textures\\metal8.jpg" is loaded in 9.2625ms! +[INFO]: Texture "data/textures\\metal_rusted.jpg" is loaded in 20.224ms! +[INFO]: Texture "data/textures\\barrel.jpg" is loaded in 15.9975ms! +[INFO]: FBX "data/models/dm6.fbx" loaded in 301 ms + - Parsing - 127 ms + - DOM Prepare - 18 ms + - Conversion - 155 ms +[INFO]: Model "data/models/dm6.fbx" is loaded! +[INFO]: Resource data/models/dm6.fbx was successfully embedded into physics world! +[INFO]: Trying to load "data/models/medkit.fbx" +[INFO]: FBX "data/models/medkit.fbx" loaded in 7 ms + - Parsing - 4 ms + - DOM Prepare - 0 ms + - Conversion - 1 ms +[INFO]: Model "data/models/medkit.fbx" is loaded! +[INFO]: Resource data/models/medkit.fbx was successfully embedded into physics world! +[INFO]: Resource data/models/medkit.fbx was successfully embedded into physics world! +[INFO]: Resource data/models/medkit.fbx was successfully embedded into physics world! +[INFO]: Resource data/models/medkit.fbx was successfully embedded into physics world! +[INFO]: Trying to load "data/models/box_medium.FBX" +[INFO]: Texture "data/textures\\medkit_ao.png" is loaded in 26.517ms! +[INFO]: Texture "data/textures\\medkit_metallic.png" is loaded in 30.1074ms! +[INFO]: Texture "data/textures\\medkit_roughness.png" is loaded in 31.174ms! +[INFO]: Texture "data/textures\\medkit_normal.png" is loaded in 31.3473ms! +[INFO]: Texture "data/textures\\medkit_diffuse.png" is loaded in 32.0939ms! +[INFO]: Texture "data/textures\\box.jpg" is loaded in 104.8003ms! +[INFO]: FBX "data/models/box_medium.FBX" loaded in 55 ms + - Parsing - 43 ms + - DOM Prepare - 0 ms + - Conversion - 10 ms +[INFO]: Model "data/models/box_medium.FBX" is loaded! +[INFO]: Resource data/models/box_medium.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/models/box_small.FBX" +[INFO]: Texture "data/textures\\camouflage.jpg" is loaded in 26.6194ms! +[INFO]: FBX "data/models/box_small.FBX" loaded in 45 ms + - Parsing - 24 ms + - DOM Prepare - 1 ms + - Conversion - 19 ms +[INFO]: Model "data/models/box_small.FBX" is loaded! +[INFO]: Resource data/models/box_small.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/models/yellow_box.FBX" +[INFO]: FBX "data/models/yellow_box.FBX" loaded in 54 ms + - Parsing - 42 ms + - DOM Prepare - 5 ms + - Conversion - 7 ms +[INFO]: Texture "data/textures\\yellow.jpg" is loaded in 2.753ms! +[INFO]: Model "data/models/yellow_box.FBX" is loaded! +[INFO]: Resource data/models/yellow_box.FBX was successfully embedded into physics world! +[INFO]: Resource data/models/yellow_box.FBX was successfully embedded into physics world! +[INFO]: Resource data/models/box_small.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/models/maw.fbx" +[ERROR]: Unable to load texture "data/textures\\maria_specular.png"! Reason FileLoadError(Io(Os { code: 2, kind: NotFound, message: "Не удается найти указанный файл." })) +[INFO]: FBX "data/models/maw.fbx" loaded in 326 ms + - Parsing - 295 ms + - DOM Prepare - 7 ms + - Conversion - 23 ms +[INFO]: Texture "data/textures\\MAW_glow.png" is loaded in 16.599ms! +[INFO]: Model "data/models/maw.fbx" is loaded! +[INFO]: Resource data/models/maw.fbx was successfully embedded into physics world! +[INFO]: Trying to load "data/animations/maw/walk.fbx" +[INFO]: Trying to load "data/animations/maw/idle.fbx" +[INFO]: Trying to load "data/animations/maw/jump.fbx" +[INFO]: Trying to load "data/animations/maw/falling.fbx" +[INFO]: FBX "data/animations/maw/falling.fbx" loaded in 13 ms + - Parsing - 11 ms + - DOM Prepare - 1 ms + - Conversion - 0 ms +[INFO]: Model "data/animations/maw/falling.fbx" is loaded! +[INFO]: FBX "data/animations/maw/walk.fbx" loaded in 16 ms + - Parsing - 12 ms + - DOM Prepare - 3 ms + - Conversion - 0 ms +[INFO]: FBX "data/animations/maw/jump.fbx" loaded in 17 ms + - Parsing - 12 ms + - DOM Prepare - 3 ms + - Conversion - 1 ms +[INFO]: FBX "data/animations/maw/idle.fbx" loaded in 19 ms + - Parsing - 12 ms + - DOM Prepare - 3 ms + - Conversion - 2 ms +[INFO]: Model "data/animations/maw/walk.fbx" is loaded! +[INFO]: Model "data/animations/maw/idle.fbx" is loaded! +[INFO]: Model "data/animations/maw/jump.fbx" is loaded! +[INFO]: Trying to load "data/animations/maw/whip.fbx" +[INFO]: Trying to load "data/animations/maw/aim.fbx" +[INFO]: Trying to load "data/animations/maw/hit_reaction.fbx" +[INFO]: FBX "data/animations/maw/aim.fbx" loaded in 15 ms + - Parsing - 9 ms + - DOM Prepare - 4 ms + - Conversion - 0 ms +[INFO]: Model "data/animations/maw/aim.fbx" is loaded! +[INFO]: FBX "data/animations/maw/hit_reaction.fbx" loaded in 18 ms + - Parsing - 13 ms + - DOM Prepare - 3 ms + - Conversion - 1 ms +[INFO]: FBX "data/animations/maw/whip.fbx" loaded in 19 ms + - Parsing - 15 ms + - DOM Prepare - 2 ms + - Conversion - 1 ms +[INFO]: Model "data/animations/maw/hit_reaction.fbx" is loaded! +[INFO]: Model "data/animations/maw/whip.fbx" is loaded! +[INFO]: Trying to load "data/animations/maw/dying.fbx" +[INFO]: Trying to load "data/animations/maw/dead.fbx" +[INFO]: Texture "data/textures\\MAW_normal.png" is loaded in 107.6802ms! +[INFO]: FBX "data/animations/maw/dying.fbx" loaded in 23 ms + - Parsing - 14 ms + - DOM Prepare - 4 ms + - Conversion - 4 ms +[INFO]: Model "data/animations/maw/dying.fbx" is loaded! +[INFO]: FBX "data/animations/maw/dead.fbx" loaded in 37 ms + - Parsing - 29 ms + - DOM Prepare - 2 ms + - Conversion - 5 ms +[INFO]: Model "data/animations/maw/dead.fbx" is loaded! +[INFO]: Trying to load "data/models/ak47.FBX" +[INFO]: FBX "data/models/ak47.FBX" loaded in 22 ms + - Parsing - 14 ms + - DOM Prepare - 1 ms + - Conversion - 6 ms +[INFO]: Model "data/models/ak47.FBX" is loaded! +[INFO]: Resource data/models/ak47.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/models/mutant.FBX" +[INFO]: Texture "data/textures\\Ak47_Body_normal.png" is loaded in 88.3829ms! +[INFO]: Texture "data/textures\\Ak47_Magazine_normal.png" is loaded in 89.7413ms! +[INFO]: Texture "data/textures\\Ak47_Magazine.png" is loaded in 94.0795ms! +[INFO]: Texture "data/textures\\Ak47_Body.png" is loaded in 111.6744ms! +[INFO]: Texture "data/textures\\MAW_diffuse.png" is loaded in 306.409ms! +[INFO]: FBX "data/models/mutant.FBX" loaded in 171 ms + - Parsing - 102 ms + - DOM Prepare - 2 ms + - Conversion - 66 ms +[INFO]: Model "data/models/mutant.FBX" is loaded! +[INFO]: Resource data/models/mutant.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/animations/mutant/idle.fbx" +[INFO]: Trying to load "data/animations/mutant/walk.fbx" +[INFO]: Trying to load "data/animations/mutant/jump.fbx" +[INFO]: Trying to load "data/animations/mutant/falling.fbx" +[INFO]: FBX "data/animations/mutant/walk.fbx" loaded in 18 ms + - Parsing - 16 ms + - DOM Prepare - 0 ms + - Conversion - 0 ms +[INFO]: Model "data/animations/mutant/walk.fbx" is loaded! +[INFO]: FBX "data/animations/mutant/idle.fbx" loaded in 19 ms + - Parsing - 18 ms + - DOM Prepare - 0 ms + - Conversion - 0 ms +[INFO]: Model "data/animations/mutant/idle.fbx" is loaded! +[INFO]: FBX "data/animations/mutant/jump.fbx" loaded in 23 ms + - Parsing - 20 ms + - DOM Prepare - 1 ms + - Conversion - 0 ms +[INFO]: Model "data/animations/mutant/jump.fbx" is loaded! +[INFO]: FBX "data/animations/mutant/falling.fbx" loaded in 23 ms + - Parsing - 22 ms + - DOM Prepare - 1 ms + - Conversion - 0 ms +[INFO]: Model "data/animations/mutant/falling.fbx" is loaded! +[INFO]: Trying to load "data/animations/mutant/aim.fbx" +[INFO]: Trying to load "data/animations/mutant/hit_reaction.fbx" +[INFO]: Trying to load "data/animations/mutant/whip.fbx" +[INFO]: FBX "data/animations/mutant/aim.fbx" loaded in 8 ms + - Parsing - 6 ms + - DOM Prepare - 1 ms + - Conversion - 0 ms +[INFO]: FBX "data/animations/mutant/hit_reaction.fbx" loaded in 8 ms + - Parsing - 5 ms + - DOM Prepare - 2 ms + - Conversion - 1 ms +[INFO]: Model "data/animations/mutant/aim.fbx" is loaded! +[INFO]: Model "data/animations/mutant/hit_reaction.fbx" is loaded! +[INFO]: FBX "data/animations/mutant/whip.fbx" loaded in 10 ms + - Parsing - 6 ms + - DOM Prepare - 1 ms + - Conversion - 1 ms +[INFO]: Model "data/animations/mutant/whip.fbx" is loaded! +[INFO]: Trying to load "data/animations/mutant/dying.fbx" +[INFO]: Trying to load "data/animations/mutant/dead.fbx" +[INFO]: FBX "data/animations/mutant/dying.fbx" loaded in 10 ms + - Parsing - 6 ms + - DOM Prepare - 1 ms + - Conversion - 2 ms +[INFO]: Model "data/animations/mutant/dying.fbx" is loaded! +[INFO]: FBX "data/animations/mutant/dead.fbx" loaded in 22 ms + - Parsing - 15 ms + - DOM Prepare - 1 ms + - Conversion - 5 ms +[INFO]: Model "data/animations/mutant/dead.fbx" is loaded! +[INFO]: Resource data/models/ak47.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/models/parasite.FBX" +[INFO]: Texture "data/textures\\Mutant_diffuse.png" is loaded in 322.1863ms! +[INFO]: Texture "data/textures\\Mutant_normal.png" is loaded in 339.584ms! +[INFO]: FBX "data/models/parasite.FBX" loaded in 404 ms + - Parsing - 231 ms + - DOM Prepare - 7 ms + - Conversion - 165 ms +[INFO]: Model "data/models/parasite.FBX" is loaded! +[INFO]: Resource data/models/parasite.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/animations/parasite/idle.fbx" +[INFO]: Trying to load "data/animations/parasite/walk.fbx" +[INFO]: Trying to load "data/animations/parasite/jump.fbx" +[INFO]: Trying to load "data/animations/parasite/falling.fbx" +[INFO]: FBX "data/animations/parasite/walk.fbx" loaded in 18 ms + - Parsing - 13 ms + - DOM Prepare - 4 ms + - Conversion - 0 ms +[INFO]: FBX "data/animations/parasite/falling.fbx" loaded in 18 ms + - Parsing - 14 ms + - DOM Prepare - 3 ms + - Conversion - 0 ms +[INFO]: FBX "data/animations/parasite/jump.fbx" loaded in 19 ms + - Parsing - 14 ms + - DOM Prepare - 3 ms + - Conversion - 1 ms +[INFO]: Model "data/animations/parasite/walk.fbx" is loaded! +[INFO]: Model "data/animations/parasite/falling.fbx" is loaded! +[INFO]: Model "data/animations/parasite/jump.fbx" is loaded! +[INFO]: FBX "data/animations/parasite/idle.fbx" loaded in 99 ms + - Parsing - 69 ms + - DOM Prepare - 4 ms + - Conversion - 25 ms +[INFO]: Model "data/animations/parasite/idle.fbx" is loaded! +[INFO]: Trying to load "data/animations/parasite/aim.fbx" +[INFO]: Trying to load "data/animations/parasite/whip.fbx" +[INFO]: Trying to load "data/animations/parasite/hit_reaction.fbx" +[INFO]: FBX "data/animations/parasite/aim.fbx" loaded in 16 ms + - Parsing - 10 ms + - DOM Prepare - 5 ms + - Conversion - 1 ms +[INFO]: Model "data/animations/parasite/aim.fbx" is loaded! +[INFO]: FBX "data/animations/parasite/hit_reaction.fbx" loaded in 22 ms + - Parsing - 14 ms + - DOM Prepare - 6 ms + - Conversion - 1 ms +[INFO]: Model "data/animations/parasite/hit_reaction.fbx" is loaded! +[INFO]: FBX "data/animations/parasite/whip.fbx" loaded in 26 ms + - Parsing - 16 ms + - DOM Prepare - 5 ms + - Conversion - 4 ms +[INFO]: Model "data/animations/parasite/whip.fbx" is loaded! +[INFO]: Trying to load "data/animations/parasite/dead.fbx" +[INFO]: Trying to load "data/animations/parasite/dying.fbx" +[INFO]: FBX "data/animations/parasite/dying.fbx" loaded in 26 ms + - Parsing - 17 ms + - DOM Prepare - 6 ms + - Conversion - 3 ms +[INFO]: Model "data/animations/parasite/dying.fbx" is loaded! +[INFO]: FBX "data/animations/parasite/dead.fbx" loaded in 54 ms + - Parsing - 34 ms + - DOM Prepare - 7 ms + - Conversion - 12 ms +[INFO]: Model "data/animations/parasite/dead.fbx" is loaded! +[INFO]: Resource data/models/ak47.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/models/m4.FBX" +[INFO]: FBX "data/models/m4.FBX" loaded in 66 ms + - Parsing - 42 ms + - DOM Prepare - 4 ms + - Conversion - 19 ms +[INFO]: Model "data/models/m4.FBX" is loaded! +[INFO]: Resource data/models/m4.FBX was successfully embedded into physics world! +[INFO]: Resource data/models/ak47.FBX was successfully embedded into physics world! +[INFO]: Trying to load "data/models/plasma_rifle.FBX" +[INFO]: Texture "data/textures\\parasiteZombie_specular.png" is loaded in 324.3075ms! +[INFO]: FBX "data/models/plasma_rifle.FBX" loaded in 16 ms + - Parsing - 12 ms + - DOM Prepare - 0 ms + - Conversion - 2 ms +[INFO]: Model "data/models/plasma_rifle.FBX" is loaded! +[INFO]: Resource data/models/plasma_rifle.FBX was successfully embedded into physics world! +[INFO]: Texture "data/textures\\M4_Magazine.png" is loaded in 94.5239ms! +[INFO]: Texture "data/textures\\M4_Sight.png" is loaded in 94.833ms! +[INFO]: Trying to load "data/models/Rpg7.FBX" +[INFO]: Texture "data/textures\\M4_Sight_normal.png" is loaded in 99.0336ms! +[INFO]: Texture "data/textures\\M4_Magazine_normal.png" is loaded in 110.1161ms! +[INFO]: Texture "data/textures\\M4_Body_normal.png" is loaded in 107.8005ms! +[INFO]: Texture "data/textures\\M4_Body.png" is loaded in 123.3408ms! +[INFO]: Texture "data/textures\\parasiteZombie_normal.png" is loaded in 435.889ms! +[INFO]: Texture "data/textures\\parasiteZombie_diffuse.png" is loaded in 446.9015ms! +[INFO]: Texture "data/textures\\plasma_gun_emissive.png" is loaded in 267.4828ms! +[INFO]: Texture "data/textures\\plasma_gun.png" is loaded in 317.734ms! +[INFO]: Texture "data/textures\\plasma_gun_ao.png" is loaded in 328.7616ms! +[INFO]: Texture "data/textures\\rpg7_diffuse.png" is loaded in 54.4744ms! +[INFO]: Texture "data/textures\\plasma_gun_normal.png" is loaded in 347.215ms! +[INFO]: Texture "data/textures\\rpg7_normal.png" is loaded in 42.4419ms! +[INFO]: Texture "data/textures\\plasma_gun_metallic.png" is loaded in 314.7294ms! +[INFO]: FBX "data/models/Rpg7.FBX" loaded in 316 ms + - Parsing - 88 ms + - DOM Prepare - 3 ms + - Conversion - 224 ms +[INFO]: Model "data/models/Rpg7.FBX" is loaded! +[INFO]: Resource data/models/Rpg7.FBX was successfully embedded into physics world! +[WARNING]: Shot point not found! +[INFO]: Sound buffer "data/sounds/item_pickup.ogg" is loaded! +[INFO]: Shader DecalShader_VertexShader compiled! + +[INFO]: Shader DecalShader_FragmentShader compiled! + +[INFO]: Shader DecalShader linked! + +[INFO]: Shader AdaptationShader_VertexShader compiled! + +[INFO]: Shader AdaptationShader_FragmentShader compiled! + +[INFO]: Shader AdaptationShader linked! + +[INFO]: Shader LuminanceShader_VertexShader compiled! + +[INFO]: Shader LuminanceShader_FragmentShader compiled! + +[INFO]: Shader LuminanceShader linked! + +[INFO]: Shader DownscaleShader_VertexShader compiled! + +[INFO]: Shader DownscaleShader_FragmentShader compiled! + +[INFO]: Shader DownscaleShader linked! + +[INFO]: Shader HdrToLdrShader_VertexShader compiled! + +[INFO]: Shader HdrToLdrShader_FragmentShader compiled! + +[INFO]: Shader HdrToLdrShader linked! + +[INFO]: Shader BloomShader_VertexShader compiled! + +[INFO]: Shader BloomShader_FragmentShader compiled! + +[INFO]: Shader BloomShader linked! + +[INFO]: Shader GaussianBlurShader_VertexShader compiled! + +[INFO]: Shader GaussianBlurShader_FragmentShader compiled! + +[INFO]: Shader GaussianBlurShader linked! + +[INFO]: Shader StandardShader_GBuffer_VertexShader compiled! + +[INFO]: Shader StandardShader_GBuffer_FragmentShader compiled! + +[INFO]: Shader StandardShader_GBuffer linked! + +[INFO]: Shader StandardShader_Forward_VertexShader compiled! + +[INFO]: Shader StandardShader_Forward_FragmentShader compiled! + +[INFO]: Shader StandardShader_Forward linked! + +[INFO]: Shader StandardShader_SpotShadow_VertexShader compiled! + +[INFO]: Shader StandardShader_SpotShadow_FragmentShader compiled! + +[INFO]: Shader StandardShader_SpotShadow linked! + +[INFO]: Shader StandardShader_PointShadow_VertexShader compiled! + +[INFO]: Shader StandardShader_PointShadow_FragmentShader compiled! + +[INFO]: Shader StandardShader_PointShadow linked! + +[INFO]: Sound buffer "data/sounds/footsteps/FootStep_shoe_stone_step1.wav" is loaded! +[INFO]: Sound buffer "data/sounds/footsteps/FootStep_shoe_stone_step4.wav" is loaded! +[INFO]: Trying to load "data/models/rocket.FBX" +[INFO]: FBX "data/models/rocket.FBX" loaded in 5 ms + - Parsing - 4 ms + - DOM Prepare - 0 ms + - Conversion - 0 ms +[INFO]: Model "data/models/rocket.FBX" is loaded! +[INFO]: Resource data/models/rocket.FBX was successfully embedded into physics world! +[INFO]: Sound buffer "data/sounds/grenade_launcher_fire.ogg" is loaded! +[INFO]: Texture "data/particles/circle_05.png" is loaded in 22.7814ms! +[INFO]: Sound buffer "data/sounds/explosion.ogg" is loaded! +[INFO]: Sound buffer "data/sounds/ak47.ogg" is loaded! +[INFO]: Texture "data/particles/light_01.png" is loaded in 11.0216ms! +[INFO]: Sound buffer "data/sounds/bullet_impact_concrete.ogg" is loaded! +[INFO]: Sound buffer "data/sounds/footsteps/FootStep_shoe_stone_step3.wav" is loaded! +[INFO]: Sound buffer "data/sounds/footsteps/FootStep_shoe_stone_step2.wav" is loaded! +[INFO]: Current level destroyed! diff --git a/src/actor.rs b/src/actor.rs index aa698e7..b5dfe68 100644 --- a/src/actor.rs +++ b/src/actor.rs @@ -1,15 +1,12 @@ use crate::{ bot::Bot, character::Character, level::UpdateContext, message::Message, player::Player, }; -use rg3d::{ +use fyrox::{ core::{ algebra::Vector3, - pool::{ - Handle, Pool, PoolIterator, PoolIteratorMut, PoolPairIterator, PoolPairIteratorMut, - }, + pool::{Handle, Pool}, visitor::{Visit, VisitResult, Visitor}, }, - physics3d::rapier::geometry::ContactEvent, scene::Scene, }; use std::ops::{Deref, DerefMut}; @@ -159,7 +156,7 @@ impl ActorContainer { self.target_descriptors.push(TargetDescriptor { handle, health: actor.health, - position: actor.position(&context.scene.physics), + position: actor.position(&context.scene.graph), }); } @@ -172,10 +169,9 @@ impl ActorContainer { } if !is_dead { for (item_handle, item) in context.items.pair_iter() { - let body = context.scene.physics.bodies.get(&actor.get_body()).unwrap(); let distance = (context.scene.graph[item.get_pivot()].global_position() - - body.position().translation.vector) - .norm(); + - actor.position(&context.scene.graph)) + .norm(); if distance < 1.25 && !item.is_picked_up() { actor .sender @@ -201,78 +197,45 @@ impl ActorContainer { .unwrap(); } } + + self.handle_event(context); } - pub fn handle_event(&mut self, contact_event: &ContactEvent, context: &mut UpdateContext) { - if let &ContactEvent::Started(a, b) = contact_event { - for actor in self.pool.iter_mut() { + fn handle_event(&mut self, context: &mut UpdateContext) { + for actor in self.pool.iter_mut() { + let mut velocity = None; + for contact_manifold in context.scene.graph[actor.collider] + .as_collider() + .contacts(&context.scene.graph.physics) + { for jump_pad in context.jump_pads.iter() { - let coll_a = context - .scene - .physics - .bodies - .handle_map() - .key_of( - &context - .scene - .physics - .colliders - .native_ref(a) - .unwrap() - .parent() - .unwrap(), - ) - .cloned() - .unwrap(); - let coll_b = context - .scene - .physics - .bodies - .handle_map() - .key_of( - &context - .scene - .physics - .colliders - .native_ref(b) - .unwrap() - .parent() - .unwrap(), - ) - .cloned() - .unwrap(); - - let body = context - .scene - .physics - .bodies - .get_mut(&actor.get_body()) - .unwrap(); - let capsule_collider = body.colliders()[0]; - - if capsule_collider == a && coll_b == jump_pad.rigid_body() - || capsule_collider == b && coll_a == jump_pad.rigid_body() - { - body.set_linvel(jump_pad.get_force(), true); + if contact_manifold.collider2 == jump_pad.collider() { + velocity = Some(jump_pad.velocity()); } } } + + if let Some(velocity) = velocity { + context.scene.graph[actor.get_body()] + .as_rigid_body_mut() + .set_lin_vel(velocity); + } } } - pub fn iter(&self) -> PoolIterator { + pub fn iter(&self) -> impl Iterator { self.pool.iter() } - pub fn pair_iter(&self) -> PoolPairIterator { + pub fn pair_iter(&self) -> impl Iterator, &Actor)> { self.pool.pair_iter() } - pub fn pair_iter_mut(&mut self) -> PoolPairIteratorMut { + pub fn pair_iter_mut(&mut self) -> impl Iterator, &mut Actor)> { self.pool.pair_iter_mut() } - pub fn iter_mut(&mut self) -> PoolIteratorMut { + pub fn iter_mut(&mut self) -> impl Iterator { self.pool.iter_mut() } } diff --git a/src/bot.rs b/src/bot.rs index 1aa9fa8..c6aafd1 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -7,8 +7,11 @@ use crate::{ weapon::WeaponContainer, GameTime, }; -use rg3d::engine::resource_manager::MaterialSearchOptions; -use rg3d::{ +use fyrox::scene::collider::{ColliderBuilder, ColliderShape, InteractionGroups}; +use fyrox::scene::graph::physics::RayCastOptions; +use fyrox::scene::pivot::PivotBuilder; +use fyrox::scene::rigidbody::RigidBodyBuilder; +use fyrox::{ animation::{ machine::{self, Machine, PoseNode, State}, Animation, AnimationSignal, @@ -22,21 +25,15 @@ use rg3d::{ visitor::{Visit, VisitResult, Visitor}, }, engine::resource_manager::ResourceManager, - physics3d::{ - rapier::dynamics::{RigidBodyBuilder, RigidBodyType}, - rapier::geometry::{ColliderBuilder, InteractionGroups}, - RayCastOptions, - }, rand, resource::model::Model, scene::{ self, base::BaseBuilder, debug::SceneDrawingContext, graph::Graph, node::Node, - physics::Physics, transform::TransformBuilder, Scene, + transform::TransformBuilder, Scene, }, utils::log::{Log, MessageKind}, utils::navmesh::Navmesh, }; -use std::path::PathBuf; use std::{ ops::{Deref, DerefMut}, path::Path, @@ -270,23 +267,11 @@ impl LocomotionMachine { scene: &mut Scene, spine: Handle, ) -> Self { - let (idle_animation, walk_animation, jump_animation, falling_animation) = rg3d::core::futures::join!( - resource_manager.request_model( - definition.idle_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ), - resource_manager.request_model( - definition.walk_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ), - resource_manager.request_model( - definition.jump_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ), - resource_manager.request_model( - definition.falling_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ) + let (idle_animation, walk_animation, jump_animation, falling_animation) = fyrox::core::futures::join!( + resource_manager.request_model(definition.idle_animation,), + resource_manager.request_model(definition.walk_animation,), + resource_manager.request_model(definition.jump_animation,), + resource_manager.request_model(definition.falling_animation,) ); let idle_animation = prepare_animation(scene, idle_animation.unwrap(), model, spine); @@ -300,7 +285,7 @@ impl LocomotionMachine { .add_signal(AnimationSignal::new(Self::STEP_SIGNAL, 0.4)) .add_signal(AnimationSignal::new(Self::STEP_SIGNAL, 0.8)); - let mut machine = Machine::new(); + let mut machine = Machine::new(model); let jump_node = machine.add_node(machine::PoseNode::make_play_animation(jump_animation)); let jump_state = machine.add_state(State::new("Jump", jump_node)); @@ -444,15 +429,9 @@ impl DyingMachine { scene: &mut Scene, spine: Handle, ) -> Self { - let (dying_animation, dead_animation) = rg3d::core::futures::join!( - resource_manager.request_model( - definition.dying_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ), - resource_manager.request_model( - definition.dead_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ) + let (dying_animation, dead_animation) = fyrox::core::futures::join!( + resource_manager.request_model(definition.dying_animation,), + resource_manager.request_model(definition.dead_animation,) ); let dying_animation = prepare_animation(scene, dying_animation.unwrap(), model, spine); @@ -470,7 +449,7 @@ impl DyingMachine { .set_enabled(false) .set_loop(false); - let mut machine = Machine::new(); + let mut machine = Machine::new(model); let dying_node = machine.add_node(machine::PoseNode::make_play_animation(dying_animation)); let dying_state = machine.add_state(State::new("Dying", dying_node)); @@ -564,19 +543,10 @@ impl CombatMachine { scene: &mut Scene, spine: Handle, ) -> Self { - let (aim_animation, whip_animation, hit_reaction_animation) = rg3d::core::futures::join!( - resource_manager.request_model( - definition.aim_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ), - resource_manager.request_model( - definition.whip_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ), - resource_manager.request_model( - definition.hit_reaction_animation, - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")) - ) + let (aim_animation, whip_animation, hit_reaction_animation) = fyrox::core::futures::join!( + resource_manager.request_model(definition.aim_animation,), + resource_manager.request_model(definition.whip_animation,), + resource_manager.request_model(definition.hit_reaction_animation,) ); let aim_animation = prepare_animation(scene, aim_animation.unwrap(), model, spine); @@ -635,7 +605,7 @@ impl CombatMachine { &scene.graph, ); - let mut machine = Machine::new(); + let mut machine = Machine::new(model); let hit_reaction_node = machine.add_node(machine::PoseNode::make_play_animation( hit_reaction_animation, @@ -837,10 +807,7 @@ impl Bot { let body_height = 1.25; let model = resource_manager - .request_model( - Path::new(definition.model), - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")), - ) + .request_model(Path::new(definition.model)) .await .unwrap() .instantiate_geometry(scene); @@ -862,28 +829,32 @@ impl Bot { ); } - let pivot = BaseBuilder::new() - .with_children(&[model]) - .build(&mut scene.graph); - - let body = scene.physics.add_body( - RigidBodyBuilder::new(RigidBodyType::Dynamic) - .translation(position) - .build(), - ); - scene.physics.add_collider( - ColliderBuilder::capsule_y(body_height * 0.5, 0.28) - .friction(0.0) - .build(), - &body, - ); - - scene.physics_binder.bind(pivot, body.into()); + let collider; + let body = RigidBodyBuilder::new( + BaseBuilder::new() + .with_local_transform( + TransformBuilder::new() + .with_local_position(position) + .build(), + ) + .with_children(&[ + { + collider = ColliderBuilder::new(BaseBuilder::new()) + .with_shape(ColliderShape::capsule_y(body_height * 0.5, 0.28)) + .with_friction(0.0) + .build(&mut scene.graph); + collider + }, + model, + ]), + ) + .with_can_sleep(false) + .build(&mut scene.graph); let hand = scene.graph.find_by_name(model, definition.weapon_hand_name); let wpn_scale = definition.weapon_scale * (1.0 / definition.scale); - let weapon_pivot = BaseBuilder::new() - .with_local_transform( + let weapon_pivot = PivotBuilder::new( + BaseBuilder::new().with_local_transform( TransformBuilder::new() .with_local_scale(Vector3::new(wpn_scale, wpn_scale, wpn_scale)) .with_local_rotation( @@ -896,8 +867,9 @@ impl Bot { ), ) .build(), - ) - .build(&mut scene.graph); + ), + ) + .build(&mut scene.graph); scene.graph.link_nodes(weapon_pivot, hand); @@ -911,8 +883,8 @@ impl Bot { Self { character: Character { - pivot, body, + collider, weapon_pivot, health: definition.health, sender: Some(sender), @@ -946,18 +918,18 @@ impl Bot { targets: &[TargetDescriptor], ) { self.target = None; - let position = self.character.position(&scene.physics); + let position = self.character.position(&scene.graph); let mut closest_distance = std::f32::MAX; let mut query_buffer = Vec::default(); 'target_loop: for desc in targets { if desc.handle != self_handle && self.frustum.is_contains_point(desc.position) { let ray = Ray::from_two_points(desc.position, position); - scene.physics.cast_ray( + scene.graph.physics.cast_ray( RayCastOptions { ray_origin: Point3::from(ray.origin), ray_direction: ray.dir, - groups: InteractionGroups::all(), + groups: InteractionGroups::default(), max_len: ray.dir.norm(), sort_results: true, }, @@ -965,16 +937,10 @@ impl Bot { ); 'hit_loop: for hit in query_buffer.iter() { - let collider = scene.physics.colliders.get(&hit.collider).unwrap(); - let body = scene - .physics - .bodies - .handle_map() - .key_of(&collider.parent().unwrap()) - .cloned() - .unwrap(); + let collider = scene.graph[hit.collider].as_collider(); + let body = collider.parent(); - if collider.shape().as_trimesh().is_some() { + if matches!(collider.shape(), ColliderShape::Trimesh(_)) { // Target is behind something. continue 'target_loop; } else { @@ -1000,7 +966,7 @@ impl Bot { fn select_point_of_interest(&mut self, items: &ItemContainer, scene: &Scene, time: &GameTime) { if time.elapsed - self.last_poi_update_time >= 1.25 { // Select closest non-despawned item as point of interest. - let self_position = self.position(&scene.physics); + let self_position = self.position(&scene.graph); let mut closest_distance = std::f32::MAX; for item in items.iter() { if !item.is_picked_up() { @@ -1070,16 +1036,15 @@ impl Bot { } } - fn aim_horizontally(&mut self, look_dir: Vector3, physics: &mut Physics, time: GameTime) { + fn aim_horizontally(&mut self, look_dir: Vector3, graph: &mut Graph, time: GameTime) { let angle = self.yaw.angle(); self.yaw .set_target(look_dir.x.atan2(look_dir.z)) .update(time.delta); - let body = physics.bodies.get_mut(&self.body).unwrap(); - let mut position = *body.position(); - position.rotation = UnitQuaternion::from_axis_angle(&Vector3::y_axis(), angle); - body.set_position(position, true); + graph[self.body] + .local_transform_mut() + .set_rotation(UnitQuaternion::from_axis_angle(&Vector3::y_axis(), angle)); } fn rebuild_path(&mut self, position: Vector3, navmesh: &mut Navmesh, time: GameTime) { @@ -1113,26 +1078,18 @@ impl Bot { self.select_weapon(context.weapons); self.select_point_of_interest(context.items, context.scene, &context.time); - let has_ground_contact = self.character.has_ground_contact(&context.scene.physics); - let body = context - .scene - .physics - .bodies - .get_mut(&self.character.body) - .unwrap(); + let has_ground_contact = self.character.has_ground_contact(&context.scene.graph); + let body = context.scene.graph[self.character.body].as_rigid_body_mut(); let (in_close_combat, look_dir) = match self.target.as_ref() { - None => ( - false, - self.point_of_interest - body.position().translation.vector, - ), + None => (false, self.point_of_interest - body.global_position()), Some(target) => { - let d = target.position - body.position().translation.vector; + let d = target.position - body.global_position(); let close_combat_threshold = 2.0; (d.norm() <= close_combat_threshold, d) } }; - let position = body.position().translation.vector; + let position = body.global_position(); if let Some(path_point) = self.path.get(self.current_path_point) { self.move_target = *path_point; @@ -1143,11 +1100,9 @@ impl Bot { } } - self.update_frustum(position, &context.scene.graph); - let need_jump = look_dir.y >= 0.3 && has_ground_contact && in_close_combat; if need_jump { - body.set_linvel(Vector3::new(body.linvel().x, 0.08, body.linvel().z), true); + body.set_lin_vel(Vector3::new(body.lin_vel().x, 0.08, body.lin_vel().z)); } let was_damaged = self.character.health < self.last_health; if was_damaged { @@ -1169,21 +1124,23 @@ impl Bot { (self.move_target - position).try_normalize(std::f32::EPSILON) { let mut vel = move_dir.scale(self.definition.walk_speed); - vel.y = body.linvel().y; - body.set_linvel(vel, true); + vel.y = body.lin_vel().y; + body.set_lin_vel(vel); self.last_move_dir = move_dir; } } else { // A bit of air control. This helps jump of ledges when there is jump pad below bot. let mut vel = self.last_move_dir.scale(self.definition.walk_speed); - vel.y = body.linvel().y; - body.set_linvel(vel, true); + vel.y = body.lin_vel().y; + body.set_lin_vel(vel); } } - if let Some(look_dir) = look_dir.try_normalize(std::f32::EPSILON) { + self.update_frustum(position, &context.scene.graph); + + if let Some(look_dir) = look_dir.try_normalize(f32::EPSILON) { self.aim_vertically(look_dir, &mut context.scene.graph, context.time); - self.aim_horizontally(look_dir, &mut context.scene.physics, context.time); + self.aim_horizontally(look_dir, &mut context.scene.graph, context.time); } self.locomotion_machine.apply( diff --git a/src/character.rs b/src/character.rs index 8081c44..d7d998c 100644 --- a/src/character.rs +++ b/src/character.rs @@ -1,19 +1,18 @@ use crate::{message::Message, weapon::Weapon}; -use rg3d::{ +use fyrox::{ core::{ algebra::Vector3, pool::Handle, visitor::{Visit, VisitError, VisitResult, Visitor}, }, - physics3d::RigidBodyHandle, - scene::{node::Node, physics::Physics, Scene}, + scene::{graph::Graph, node::Node, Scene}, }; use std::sync::mpsc::Sender; pub struct Character { pub name: String, - pub pivot: Handle, - pub body: RigidBodyHandle, + pub body: Handle, + pub collider: Handle, pub health: f32, pub armor: f32, pub weapons: Vec>, @@ -60,8 +59,8 @@ impl Default for Character { fn default() -> Self { Self { name: Default::default(), - pivot: Handle::NONE, body: Default::default(), + collider: Default::default(), health: 100.0, armor: 100.0, weapons: Vec::new(), @@ -78,7 +77,7 @@ impl Visit for Character { visitor.enter_region(name)?; self.name.visit("Name", visitor)?; - self.pivot.visit("Pivot", visitor)?; + self.collider.visit("Collider", visitor)?; self.body.visit("Body", visitor)?; self.health.visit("Health", visitor)?; self.armor.visit("Armor", visitor)?; @@ -92,13 +91,13 @@ impl Visit for Character { } impl Character { - pub fn get_body(&self) -> RigidBodyHandle { + pub fn get_body(&self) -> Handle { self.body } - pub fn has_ground_contact(&self, physics: &Physics) -> bool { - let body = physics.bodies.get(&self.body).unwrap(); - for contact in physics.narrow_phase.contacts_with(body.colliders()[0]) { + pub fn has_ground_contact(&self, graph: &Graph) -> bool { + let body = graph[self.collider].as_collider(); + for contact in body.contacts(&graph.physics) { for manifold in contact.manifolds.iter() { if manifold.local_n1.y > 0.7 { return true; @@ -124,21 +123,14 @@ impl Character { self.armor } - pub fn set_position(&mut self, physics: &mut Physics, position: Vector3) { - let body = physics.bodies.get_mut(&self.get_body()).unwrap(); - let mut body_position = *body.position(); - body_position.translation.vector = position; - body.set_position(body_position, true); + pub fn set_position(&mut self, graph: &mut Graph, position: Vector3) { + graph[self.body] + .local_transform_mut() + .set_position(position); } - pub fn position(&self, physics: &Physics) -> Vector3 { - physics - .bodies - .get(&self.get_body()) - .unwrap() - .position() - .translation - .vector + pub fn position(&self, graph: &Graph) -> Vector3 { + graph[self.body].global_position() } pub fn damage(&mut self, amount: f32) { @@ -243,7 +235,6 @@ impl Character { } pub fn clean_up(&mut self, scene: &mut Scene) { - scene.remove_node(self.pivot); - scene.physics.remove_body(&self.body); + scene.remove_node(self.body); } } diff --git a/src/control_scheme.rs b/src/control_scheme.rs index a7e6162..7e75c3f 100644 --- a/src/control_scheme.rs +++ b/src/control_scheme.rs @@ -1,4 +1,4 @@ -use rg3d::event::VirtualKeyCode; +use fyrox::event::VirtualKeyCode; #[derive(Copy, Clone, PartialEq, Eq, Hash)] pub enum ControlButton { @@ -19,7 +19,7 @@ impl ControlButton { 5 => "MB5", _ => "Unknown", }, - ControlButton::Key(code) => rg3d::utils::virtual_key_code_name(code), + ControlButton::Key(code) => fyrox::utils::virtual_key_code_name(code), ControlButton::WheelUp => "Wheel Up", ControlButton::WheelDown => "Wheel Down", } diff --git a/src/effects.rs b/src/effects.rs index d5f8c3b..c106fd4 100644 --- a/src/effects.rs +++ b/src/effects.rs @@ -1,4 +1,4 @@ -use rg3d::{ +use fyrox::{ core::{ algebra::Vector3, color::Color, @@ -68,7 +68,7 @@ fn create_steam( .with_height(0.2) .with_radius(0.2) .build()]) - .with_texture(resource_manager.request_texture("data/particles/smoke_04.tga", None)) + .with_texture(resource_manager.request_texture("data/particles/smoke_04.tga")) .build(graph) } @@ -104,7 +104,7 @@ fn create_bullet_impact( ) .with_radius(0.01) .build()]) - .with_texture(resource_manager.request_texture("data/particles/circle_05.png", None)) + .with_texture(resource_manager.request_texture("data/particles/circle_05.png")) .build(graph) } @@ -143,7 +143,7 @@ fn create_smoke( ) .with_radius(0.01) .build()]) - .with_texture(resource_manager.request_texture("data/particles/smoke_04.tga", None)) + .with_texture(resource_manager.request_texture("data/particles/smoke_04.tga")) .build(graph) } @@ -179,6 +179,6 @@ fn create_item_appear( ) .with_radius(0.01) .build()]) - .with_texture(resource_manager.request_texture("data/particles/star_09.png", None)) + .with_texture(resource_manager.request_texture("data/particles/star_09.png")) .build(graph) } diff --git a/src/gui.rs b/src/gui.rs index fe7980a..8e6943b 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -1,9 +1,9 @@ //! Contains all helper functions that creates styled widgets for game user interface. -//! However most of the styles are used from dark theme of rg3d-ui library so there +//! However most of the styles are used from dark theme of fyrox-ui library so there //! is not much. -use rg3d::core::pool::Handle; -use rg3d::gui::{ +use fyrox::core::pool::Handle; +use fyrox::gui::{ check_box::CheckBoxBuilder, scroll_bar::ScrollBarBuilder, scroll_viewer::ScrollViewerBuilder, widget::WidgetBuilder, BuildContext, HorizontalAlignment, Orientation, Thickness, UiNode, VerticalAlignment, diff --git a/src/hud.rs b/src/hud.rs index 930cbd1..f97d5dd 100644 --- a/src/hud.rs +++ b/src/hud.rs @@ -3,7 +3,8 @@ use crate::{ message::Message, GameTime, MatchOptions, }; -use rg3d::{ +use fyrox::core::parking_lot::Mutex; +use fyrox::{ core::{color::Color, pool::Handle}, engine::Engine, event::{Event, WindowEvent}, @@ -22,11 +23,7 @@ use rg3d::{ gui::{UiNode, UserInterface}, utils, }; -use std::{ - collections::VecDeque, - path::Path, - sync::{Arc, Mutex}, -}; +use std::{collections::VecDeque, path::Path, sync::Arc}; pub struct Hud { root: Handle, @@ -52,7 +49,7 @@ impl Hud { let ctx = &mut engine.user_interface.build_ctx(); let resource_manager = engine.resource_manager.clone(); - let font = rg3d::core::futures::executor::block_on(Font::from_file( + let font = fyrox::core::futures::executor::block_on(Font::from_file( Path::new("data/ui/SquaresBold.ttf"), 35.0, Font::default_char_set(), @@ -85,7 +82,7 @@ impl Hud { .on_column(1), ) .with_texture(utils::into_gui_texture( - resource_manager.request_texture("data/ui/crosshair.tga", None), + resource_manager.request_texture("data/ui/crosshair.tga"), )) .build(ctx), ) @@ -208,8 +205,7 @@ impl Hud { WidgetBuilder::new().with_width(35.0).with_height(35.0), ) .with_texture(utils::into_gui_texture( - resource_manager - .request_texture("data/ui/health_icon.png", None), + resource_manager.request_texture("data/ui/health_icon.png"), )) .build(ctx), ) @@ -249,7 +245,7 @@ impl Hud { WidgetBuilder::new().with_width(35.0).with_height(35.0), ) .with_texture(utils::into_gui_texture( - resource_manager.request_texture("data/ui/ammo_icon.png", None), + resource_manager.request_texture("data/ui/ammo_icon.png"), )) .build(ctx), ) @@ -289,8 +285,7 @@ impl Hud { WidgetBuilder::new().with_width(35.0).with_height(35.0), ) .with_texture(utils::into_gui_texture( - resource_manager - .request_texture("data/ui/shield_icon.png", None), + resource_manager.request_texture("data/ui/shield_icon.png"), )) .build(ctx), ) diff --git a/src/item.rs b/src/item.rs index 2147293..8c67181 100644 --- a/src/item.rs +++ b/src/item.rs @@ -1,16 +1,14 @@ -use crate::{effects::EffectKind, message::Message, rg3d::core::math::Vector3Ext, GameTime}; -use rg3d::engine::resource_manager::MaterialSearchOptions; -use rg3d::sound::pool::PoolIteratorMut; -use rg3d::{ +use crate::{effects::EffectKind, fyrox::core::math::Vector3Ext, message::Message, GameTime}; +use fyrox::scene::pivot::PivotBuilder; +use fyrox::{ core::{ algebra::Vector3, - pool::{Handle, Pool, PoolIterator, PoolPairIterator}, + pool::{Handle, Pool}, visitor::{Visit, VisitResult, Visitor}, }, engine::resource_manager::ResourceManager, scene::{base::BaseBuilder, graph::Graph, node::Node, transform::TransformBuilder, Scene}, }; -use std::path::PathBuf; use std::{path::Path, sync::mpsc::Sender}; #[derive(Copy, Clone, PartialEq, Eq, Debug)] @@ -176,16 +174,13 @@ impl Item { let definition = Self::get_definition(kind); let model = resource_manager - .request_model( - Path::new(definition.model), - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")), - ) + .request_model(Path::new(definition.model)) .await .unwrap() .instantiate_geometry(scene); - let pivot = BaseBuilder::new() - .with_local_transform( + let pivot = PivotBuilder::new( + BaseBuilder::new().with_local_transform( TransformBuilder::new() .with_local_position(position) .with_local_scale(Vector3::new( @@ -194,8 +189,9 @@ impl Item { definition.scale, )) .build(), - ) - .build(&mut scene.graph); + ), + ) + .build(&mut scene.graph); scene.graph.link_nodes(model, pivot); @@ -338,15 +334,15 @@ impl ItemContainer { self.pool.is_valid_handle(item) } - pub fn pair_iter(&self) -> PoolPairIterator { + pub fn pair_iter(&self) -> impl Iterator, &Item)> { self.pool.pair_iter() } - pub fn iter(&self) -> PoolIterator { + pub fn iter(&self) -> impl Iterator { self.pool.iter() } - pub fn iter_mut(&mut self) -> PoolIteratorMut { + pub fn iter_mut(&mut self) -> impl Iterator { self.pool.iter_mut() } diff --git a/src/jump_pad.rs b/src/jump_pad.rs index d0b06a6..efe7ce0 100644 --- a/src/jump_pad.rs +++ b/src/jump_pad.rs @@ -1,36 +1,37 @@ -use rg3d::{ - core::{ - algebra::Vector3, - pool::{Handle, Pool, PoolIterator}, - visitor::{Visit, VisitResult, Visitor}, - }, - physics3d::RigidBodyHandle, +use fyrox::core::{ + algebra::Vector3, + pool::{Handle, Pool}, + visitor::{Visit, VisitResult, Visitor}, }; +use fyrox::scene::node::Node; pub struct JumpPad { - force: Vector3, - body: RigidBodyHandle, + velocity: Vector3, + collider: Handle, } impl JumpPad { - pub fn new(shape: RigidBodyHandle, force: Vector3) -> JumpPad { - Self { force, body: shape } + pub fn new(collider: Handle, force: Vector3) -> JumpPad { + Self { + velocity: force, + collider, + } } - pub fn rigid_body(&self) -> RigidBodyHandle { - self.body + pub fn collider(&self) -> Handle { + self.collider } - pub fn get_force(&self) -> Vector3 { - self.force + pub fn velocity(&self) -> Vector3 { + self.velocity } } impl Default for JumpPad { fn default() -> Self { Self { - force: Default::default(), - body: Default::default(), + velocity: Default::default(), + collider: Default::default(), } } } @@ -39,8 +40,8 @@ impl Visit for JumpPad { fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult { visitor.enter_region(name)?; - self.force.visit("From", visitor)?; - self.body.visit("Shape", visitor)?; + self.velocity.visit("From", visitor)?; + self.collider.visit("Shape", visitor)?; visitor.leave_region() } @@ -65,7 +66,7 @@ impl JumpPadContainer { self.pool.spawn(jump_pad) } - pub fn iter(&self) -> PoolIterator { + pub fn iter(&self) -> impl Iterator { self.pool.iter() } } diff --git a/src/leader_board.rs b/src/leader_board.rs index 738650f..1fd8add 100644 --- a/src/leader_board.rs +++ b/src/leader_board.rs @@ -1,5 +1,5 @@ use crate::{character::Team, message::Message, MatchOptions}; -use rg3d::{ +use fyrox::{ core::{ color::Color, pool::Handle, diff --git a/src/level.rs b/src/level.rs index 5686d08..492944f 100644 --- a/src/level.rs +++ b/src/level.rs @@ -12,33 +12,34 @@ use crate::{ weapon::{Weapon, WeaponContainer, WeaponKind}, GameTime, MatchOptions, }; -use rg3d::core::algebra::Point3; -use rg3d::engine::Engine; -use rg3d::{ +use fyrox::{ core::{ + algebra::Point3, algebra::{Matrix3, Vector3}, color::Color, - math::{aabb::AxisAlignedBoundingBox, ray::Ray, PositionProvider, Vector3Ext}, + math::Vector3Ext, + math::{aabb::AxisAlignedBoundingBox, ray::Ray, PositionProvider}, pool::Handle, rand::Rng, visitor::{Visit, VisitResult, Visitor}, }, - engine::resource_manager::{MaterialSearchOptions, ResourceManager}, + engine::{resource_manager::ResourceManager, Engine}, event::Event, - physics3d::{ - rapier::{ - geometry::{ContactEvent, InteractionGroups, IntersectionEvent}, - pipeline::ChannelEventCollector, - }, - RayCastOptions, - }, rand, - scene::{self, base::BaseBuilder, camera::CameraBuilder, node::Node, Scene}, - sound::{ - context, - context::SoundContext, - effects::{BaseEffect, Effect, EffectInput}, - source::{generic::GenericSourceBuilder, spatial::SpatialSourceBuilder, Status}, + scene::{ + self, + base::BaseBuilder, + camera::Camera, + camera::CameraBuilder, + collider::InteractionGroups, + graph::physics::RayCastOptions, + graph::Graph, + node::Node, + sound::context::SoundContext, + sound::effect::{BaseEffectBuilder, Effect, EffectInput, ReverbEffectBuilder}, + sound::{HrirSphere, HrtfRenderer, Renderer, SoundBuilder, Status, SAMPLE_RATE}, + transform::TransformBuilder, + Scene, }, utils::{ log::{Log, MessageKind}, @@ -48,46 +49,36 @@ use rg3d::{ use std::{ path::{Path, PathBuf}, sync::{mpsc::Sender, Arc, RwLock}, - time::Duration, }; pub const RESPAWN_TIME: f32 = 4.0; #[derive(Default)] pub struct SoundManager { - context: SoundContext, reverb: Handle, } impl SoundManager { - pub fn new(context: SoundContext) -> Self { - let mut base_effect = BaseEffect::default(); - base_effect.set_gain(0.7); - let mut reverb = rg3d::sound::effects::reverb::Reverb::new(base_effect); - reverb.set_dry(0.5); - reverb.set_wet(0.5); - reverb.set_decay_time(Duration::from_secs_f32(3.0)); - let reverb = context - .state() - .add_effect(rg3d::sound::effects::Effect::Reverb(reverb)); - - let hrtf_sphere = rg3d::sound::hrtf::HrirSphere::from_file( - "data/sounds/IRC_1040_C.bin", - context::SAMPLE_RATE, - ) - .unwrap(); - context - .state() - .set_renderer(rg3d::sound::renderer::Renderer::HrtfRenderer( - rg3d::sound::renderer::hrtf::HrtfRenderer::new(hrtf_sphere), - )); - - Self { context, reverb } - } + pub fn new(context: &mut SoundContext) -> Self { + let reverb = ReverbEffectBuilder::new(BaseEffectBuilder::new().with_gain(0.7)) + .with_dry(0.5) + .with_wet(0.5) + .with_decay_time(3.0) + .build(context); + + let hrir_sphere = HrirSphere::from_file("data/sounds/IRC_1040_C.bin", SAMPLE_RATE).unwrap(); - pub async fn handle_message(&mut self, resource_manager: ResourceManager, message: &Message) { - let mut state = self.context.state(); + context.set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(hrir_sphere))); + Self { reverb } + } + + pub async fn handle_message( + &mut self, + graph: &mut Graph, + resource_manager: ResourceManager, + message: &Message, + ) { match message { Message::PlaySound { path, @@ -96,27 +87,36 @@ impl SoundManager { rolloff_factor, radius, } => { - let shot_buffer = resource_manager - .request_sound_buffer(path, false) - .await - .unwrap(); - let shot_sound = SpatialSourceBuilder::new( - GenericSourceBuilder::new() - .with_buffer(shot_buffer.into()) - .with_status(Status::Playing) - .with_play_once(true) - .with_gain(*gain) - .build() - .unwrap(), - ) - .with_position(*position) - .with_radius(*radius) - .with_rolloff_factor(*rolloff_factor) - .build_source(); - let source = state.add_source(shot_sound); - state - .effect_mut(self.reverb) - .add_input(EffectInput::direct(source)); + if let Ok(buffer) = resource_manager.request_sound_buffer(path).await { + let sound = SoundBuilder::new( + BaseBuilder::new().with_local_transform( + TransformBuilder::new() + .with_local_position(*position) + .build(), + ), + ) + .with_buffer(buffer.into()) + .with_status(Status::Playing) + .with_play_once(true) + .with_gain(*gain) + .with_radius(*radius) + .with_rolloff_factor(*rolloff_factor) + .build(graph); + + graph + .sound_context + .effect_mut(self.reverb) + .inputs_mut() + .push(EffectInput { + sound, + filter: None, + }); + } else { + Log::writeln( + MessageKind::Error, + format!("Unable to play sound {:?}", path), + ); + } } _ => {} } @@ -127,7 +127,6 @@ impl Visit for SoundManager { fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult { visitor.enter_region(name)?; - self.context.visit("Context", visitor)?; self.reverb.visit("Reverb", visitor)?; visitor.leave_region() @@ -155,8 +154,6 @@ pub struct Level { spectator_camera: Handle, target_spectator_position: Vector3, sound_manager: SoundManager, - proximity_events_receiver: Option>, - contact_events_receiver: Option>, } impl Default for Level { @@ -182,8 +179,6 @@ impl Default for Level { spectator_camera: Default::default(), target_spectator_position: Default::default(), sound_manager: Default::default(), - proximity_events_receiver: None, - contact_events_receiver: None, } } } @@ -398,9 +393,7 @@ pub async fn analyze( let len = d.norm(); let force = d.try_normalize(std::f32::EPSILON); let force = force.unwrap_or(Vector3::y()).scale(len * 3.0); - let shape = scene.physics.mesh_to_trimesh(handle, &scene.graph); - scene.physics_binder.bind(handle, shape); - result.jump_pads.add(JumpPad::new(shape, force)); + result.jump_pads.add(JumpPad::new(Handle::NONE, force)); // TODO: Create shape for jump pads in the editor }; } else if name.starts_with("Medkit") { items.push((ItemKind::Medkit, position)); @@ -413,8 +406,8 @@ pub async fn analyze( } else if name.starts_with("SpawnPoint") { spawn_points.push(node.global_position()) } else if name.starts_with("DeathZone") { - if let Node::Mesh(_) = node { - death_zones.push(handle); + if node.is_mesh() { + // death_zones.push(handle); } } } @@ -464,7 +457,7 @@ async fn spawn_player( let player = actors.add(Actor::Player(player)); actors .get_mut(player) - .set_position(&mut scene.physics, spawn_position); + .set_position(&mut scene.graph, spawn_position); let weapons_to_give = [ WeaponKind::M4, @@ -528,7 +521,7 @@ fn find_suitable_spawn_point( for (i, pt) in spawn_points.iter().enumerate() { let mut sum_distance = 0.0; for actor in actors.iter() { - let position = actor.position(&scene.physics); + let position = actor.position(&scene.graph); sum_distance += pt.position.metric_distance(&position); } if sum_distance > max_distance { @@ -618,15 +611,7 @@ impl Level { scene.ambient_lighting_color = Color::opaque(60, 60, 60); - let sound_manager = SoundManager::new(scene.sound_context.clone()); - - let (proximity_events_sender, proximity_events_receiver) = crossbeam::channel::unbounded(); - let (contact_events_sender, contact_events_receiver) = crossbeam::channel::unbounded(); - - scene.physics.event_handler = Box::new(ChannelEventCollector::new( - proximity_events_sender.clone(), - contact_events_sender.clone(), - )); + let sound_manager = SoundManager::new(&mut scene.graph.sound_context); // Spectator camera is used when there is no player on level. // This includes situation when player is dead - all dead actors are removed @@ -635,27 +620,12 @@ impl Level { .enabled(false) .build(&mut scene.graph); - let map_model = resource_manager - .request_model( - Path::new("data/models/dm6.fbx"), - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")), - ) - .await - .unwrap(); - // Instantiate map - let map_root = map_model.instantiate_geometry(&mut scene); - - // Create collision geometry - let polygon_handle = scene.graph.find_by_name(map_root, "Polygon"); - if polygon_handle.is_some() { - scene.physics.mesh_to_trimesh(polygon_handle, &scene.graph); - } else { - Log::writeln( - MessageKind::Warning, - "Unable to find Polygon node to build collision shape for level!".to_owned(), - ); - } + let map_root = resource_manager + .request_model(Path::new("data/levels/dm6.rgs")) + .await + .unwrap() + .instantiate_geometry(&mut scene); let AnalysisResult { jump_pads, @@ -709,8 +679,6 @@ impl Level { control_scheme: Some(control_scheme), time: 0.0, respawn_list: Default::default(), - contact_events_receiver: Some(contact_events_receiver), - proximity_events_receiver: Some(proximity_events_receiver), projectiles: ProjectileContainer::new(), target_spectator_position: Default::default(), sound_manager, @@ -756,7 +724,7 @@ impl Level { ) .await; - if let Node::Camera(spectator_camera) = &mut scene.graph[self.spectator_camera] { + if let Some(spectator_camera) = scene.graph[self.spectator_camera].cast_mut::() { spectator_camera.set_enabled(false); } @@ -794,12 +762,12 @@ impl Level { let options = RayCastOptions { ray_origin: Point3::from(ray.origin), ray_direction: ray.dir, - max_len: std::f32::MAX, - groups: InteractionGroups::all(), + max_len: f32::MAX, + groups: InteractionGroups::default(), sort_results: true, }; let mut query_buffer = Vec::default(); - scene.physics.cast_ray(options, &mut query_buffer); + scene.graph.physics.cast_ray(options, &mut query_buffer); if let Some(pt) = query_buffer.first() { pt.position.coords } else { @@ -845,7 +813,7 @@ impl Level { let character = self.actors.get(actor); // Make sure to remove weapons and drop appropriate items (items will be temporary). - let drop_position = character.position(&scene.physics); + let drop_position = character.position(&scene.graph); let weapons = character .weapons() .iter() @@ -1077,7 +1045,7 @@ impl Level { let who_position = if who.is_some() { let scene = &engine.scenes[self.scene]; - Some(self.actors.get(who).position(&scene.physics)) + Some(self.actors.get(who).position(&scene.graph)) } else { None }; @@ -1165,7 +1133,7 @@ impl Level { } fn update_spectator_camera(&mut self, scene: &mut Scene) { - if let Node::Camera(spectator_camera) = &mut scene.graph[self.spectator_camera] { + if let Some(spectator_camera) = scene.graph[self.spectator_camera].cast_mut::() { let mut position = spectator_camera.global_position(); position.follow(&self.target_spectator_position, 0.1); spectator_camera @@ -1179,7 +1147,7 @@ impl Level { for death_zone in self.death_zones.iter() { if death_zone .bounds - .is_contains_point(actor.position(&scene.physics)) + .is_contains_point(actor.position(&scene.graph)) { self.sender .as_ref() @@ -1205,12 +1173,6 @@ impl Level { self.time += time.delta; self.update_respawn(time); let scene = &mut engine.scenes[self.scene]; - while let Ok(proximity_event) = self.proximity_events_receiver.as_ref().unwrap().try_recv() - { - for proj in self.projectiles.iter_mut() { - proj.handle_proximity(&proximity_event, scene, &self.actors, &self.weapons); - } - } self.update_spectator_camera(scene); self.update_death_zones(scene); self.weapons.update(scene, &self.actors); @@ -1226,9 +1188,7 @@ impl Level { weapons: &self.weapons, }; self.actors.update(&mut ctx); - while let Ok(contact_event) = self.contact_events_receiver.as_ref().unwrap().try_recv() { - self.actors.handle_event(&contact_event, &mut ctx); - } + self.update_game_ending(); } @@ -1249,7 +1209,8 @@ impl Level { // camera will be used to render world until player is despawned. let scene = &mut engine.scenes[self.scene]; let position = scene.graph[player.camera()].global_position(); - if let Node::Camera(spectator_camera) = &mut scene.graph[self.spectator_camera] + if let Some(spectator_camera) = + scene.graph[self.spectator_camera].cast_mut::() { spectator_camera .set_enabled(true) @@ -1263,13 +1224,13 @@ impl Level { let options = RayCastOptions { ray_origin: Point3::from(ray.origin), ray_direction: ray.dir, - max_len: std::f32::MAX, - groups: InteractionGroups::all(), + max_len: f32::MAX, + groups: InteractionGroups::default(), sort_results: true, }; let mut query_buffer = Vec::default(); - scene.physics.cast_ray(options, &mut query_buffer); + scene.graph.physics.cast_ray(options, &mut query_buffer); if let Some(hit) = query_buffer.first() { self.target_spectator_position = hit.position.coords; // Prevent see-thru-floor @@ -1292,7 +1253,11 @@ impl Level { pub async fn handle_message(&mut self, engine: &mut Engine, message: &Message, time: GameTime) { self.sound_manager - .handle_message(engine.resource_manager.clone(), &message) + .handle_message( + &mut engine.scenes[self.scene].graph, + engine.resource_manager.clone(), + &message, + ) .await; match message { @@ -1372,7 +1337,7 @@ impl Level { } } - pub fn set_message_sender(&mut self, sender: Sender, engine: &mut Engine) { + pub fn set_message_sender(&mut self, sender: Sender) { self.sender = Some(sender.clone()); // Attach new sender to all event sources. @@ -1388,17 +1353,6 @@ impl Level { for item in self.items.iter_mut() { item.sender = Some(sender.clone()); } - - let (proximity_events_sender, proximity_events_receiver) = crossbeam::channel::unbounded(); - let (contact_events_sender, contact_events_receiver) = crossbeam::channel::unbounded(); - - self.proximity_events_receiver = Some(proximity_events_receiver); - self.contact_events_receiver = Some(contact_events_receiver); - - engine.scenes[self.scene].physics.event_handler = Box::new(ChannelEventCollector::new( - proximity_events_sender.clone(), - contact_events_sender.clone(), - )); } pub fn debug_draw(&self, engine: &mut Engine) { @@ -1408,7 +1362,7 @@ impl Level { drawing_context.clear_lines(); - scene.physics.draw(drawing_context); + scene.graph.physics.draw(drawing_context); if self.navmesh.is_some() { let navmesh = &scene.navmeshes[self.navmesh]; diff --git a/src/main.rs b/src/main.rs index a4a1ad1..1ba75a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ #![deny(unused_must_use)] extern crate crossbeam; -extern crate rg3d; +extern crate fyrox; mod actor; mod bot; @@ -27,7 +27,14 @@ use crate::{ actor::Actor, control_scheme::ControlScheme, hud::Hud, level::Level, menu::Menu, message::Message, }; -use rg3d::{ +use fyrox::core::futures::executor::block_on; +use fyrox::engine::resource_manager::ResourceManager; +use fyrox::engine::{EngineInitParams, SerializationContext}; +use fyrox::scene::base::BaseBuilder; +use fyrox::scene::node::Node; +use fyrox::scene::sound::{SoundBuilder, Status}; +use fyrox::scene::SceneLoader; +use fyrox::{ core::{ pool::Handle, visitor::{Visit, VisitResult, Visitor}, @@ -44,10 +51,6 @@ use rg3d::{ BuildContext, HorizontalAlignment, UiNode, VerticalAlignment, }, scene::Scene, - sound::{ - context::SoundContext, - source::{generic::GenericSourceBuilder, SoundSource, Status}, - }, utils::{ log::{Log, MessageKind}, translate_event, @@ -80,8 +83,8 @@ pub struct Game { events_sender: Sender, load_context: Option>>, loading_screen: LoadingScreen, - menu_sound_context: SoundContext, - music: Handle, + menu_scene: Handle, + music: Handle, } struct LoadingScreen { @@ -292,12 +295,20 @@ impl Game { monitor_dimensions.width = (monitor_dimensions.width as f32 * 0.7) as u32; let inner_size = monitor_dimensions.to_logical::(primary_monitor.scale_factor()); - let window_builder = rg3d::window::WindowBuilder::new() + let window_builder = fyrox::window::WindowBuilder::new() .with_title("Rusty Shooter") .with_inner_size(inner_size) .with_resizable(true); - let mut engine = Engine::new(window_builder, &events_loop, false).unwrap(); + let serialization_context = Arc::new(SerializationContext::new()); + let mut engine = Engine::new(EngineInitParams { + window_builder, + resource_manager: ResourceManager::new(serialization_context.clone()), + serialization_context, + events_loop: &events_loop, + vsync: false, + }) + .unwrap(); let control_scheme = Arc::new(RwLock::new(ControlScheme::default())); @@ -310,30 +321,20 @@ impl Game { }; let (tx, rx) = mpsc::channel(); - - let menu_sound_context = SoundContext::new(); - - let buffer = rg3d::core::futures::executor::block_on( + let buffer = fyrox::core::futures::executor::block_on( engine .resource_manager - .request_sound_buffer("data/sounds/Antonio_Bizarro_Berzerker.ogg", true), + .request_sound_buffer("data/sounds/Antonio_Bizarro_Berzerker.ogg"), ) .unwrap(); - let music = menu_sound_context.state().add_source( - GenericSourceBuilder::new() - .with_buffer(buffer.into()) - .with_looping(true) - .with_status(Status::Playing) - .with_gain(0.25) - .build_source() - .unwrap(), - ); - engine - .sound_engine - .lock() - .unwrap() - .add_context(menu_sound_context.clone()); + let mut menu_scene = Scene::new(); + let music = SoundBuilder::new(BaseBuilder::new()) + .with_buffer(Some(buffer)) + .with_looping(true) + .with_status(Status::Playing) + .with_gain(0.25) + .build(&mut menu_scene.graph); let mut game = Game { loading_screen: LoadingScreen::new( @@ -341,7 +342,7 @@ impl Game { inner_size.width, inner_size.height, ), - menu_sound_context, + menu_scene: engine.scenes.add(menu_scene), music, hud: Hud::new(&mut engine), running: true, @@ -402,7 +403,7 @@ impl Game { _ => (), }, Event::LoopDestroyed => { - if let Ok(profiling_results) = rg3d::core::profiler::print() { + if let Ok(profiling_results) = fyrox::core::profiler::print() { if let Ok(mut file) = File::create("profiling.log") { let _ = writeln!(file, "{}", profiling_results); } @@ -425,21 +426,21 @@ impl Game { } pub fn save_game(&mut self) -> VisitResult { - let mut visitor = Visitor::new(); - - // Visit engine state first. - self.engine.visit("Engine", &mut visitor)?; - self.level.visit("Level", &mut visitor)?; - self.menu_sound_context - .visit("MenuSoundContext", &mut visitor)?; - self.music.visit("Music", &mut visitor)?; - - // Debug output - if let Ok(mut file) = File::create(Path::new("save.txt")) { - file.write_all(visitor.save_text().as_bytes()).unwrap(); - } + if let Some(level) = self.level.as_mut() { + let mut visitor = Visitor::new(); - visitor.save_binary(Path::new("save.bin")) + self.engine.scenes[level.scene].save("Scene", &mut visitor)?; + level.visit("Level", &mut visitor)?; + + // Debug output + if let Ok(mut file) = File::create(Path::new("save.txt")) { + file.write_all(visitor.save_text().as_bytes()).unwrap(); + } + + visitor.save_binary(Path::new("save.bin")) + } else { + Ok(()) + } } pub fn load_game(&mut self) -> VisitResult { @@ -448,8 +449,7 @@ impl Game { "Attempting load a save...".to_owned(), ); - let mut visitor = - rg3d::core::futures::executor::block_on(Visitor::load_binary(Path::new("save.bin")))?; + let mut visitor = block_on(Visitor::load_binary(Path::new("save.bin")))?; // Clean up. self.destroy_level(); @@ -459,11 +459,20 @@ impl Game { MessageKind::Information, "Trying to load a save file...".to_owned(), ); - self.engine.visit("Engine", &mut visitor)?; - self.level.visit("Level", &mut visitor)?; - self.menu_sound_context - .visit("MenuSoundContext", &mut visitor)?; - self.music.visit("Music", &mut visitor)?; + + let scene = block_on( + SceneLoader::load( + "Scene", + self.engine.serialization_context.clone(), + &mut visitor, + )? + .finish(self.engine.resource_manager.clone()), + ); + + let mut level = Level::default(); + level.visit("Level", &mut visitor)?; + level.scene = self.engine.scenes.add(scene); + self.level = Some(level); Log::writeln( MessageKind::Information, @@ -475,7 +484,7 @@ impl Game { // Set control scheme for player. if let Some(level) = &mut self.level { - level.set_message_sender(self.events_sender.clone(), &mut self.engine); + level.set_message_sender(self.events_sender.clone()); level.control_scheme = Some(self.control_scheme.clone()); let player = level.get_player(); if let Actor::Player(player) = level.actors_mut().get_mut(player) { @@ -520,7 +529,7 @@ impl Game { let sender = self.events_sender.clone(); std::thread::spawn(move || { - let level = rg3d::core::futures::executor::block_on(Level::new( + let level = fyrox::core::futures::executor::block_on(Level::new( resource_manager, control_scheme, sender, @@ -634,16 +643,15 @@ impl Game { .set_visible(true, &mut self.engine.user_interface); } Message::SetMusicVolume { volume } => { - self.menu_sound_context - .state() - .source_mut(self.music) + self.engine.scenes[self.menu_scene].graph[self.music] + .as_sound_mut() .set_gain(*volume); } _ => (), } if let Some(ref mut level) = self.level { - rg3d::core::futures::executor::block_on(level.handle_message( + fyrox::core::futures::executor::block_on(level.handle_message( &mut self.engine, &message, time, diff --git a/src/match_menu.rs b/src/match_menu.rs index bd8d852..27fb70a 100644 --- a/src/match_menu.rs +++ b/src/match_menu.rs @@ -3,7 +3,7 @@ use crate::{ message::Message, DeathMatch, MatchOptions, }; -use rg3d::{ +use fyrox::{ core::pool::Handle, engine::Engine, gui::{ diff --git a/src/menu.rs b/src/menu.rs index 327977a..dd08bf9 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -2,7 +2,8 @@ use crate::{ control_scheme::ControlScheme, match_menu::MatchMenu, message::Message, options_menu::OptionsMenu, }; -use rg3d::{ +use fyrox::core::parking_lot::Mutex; +use fyrox::{ core::pool::Handle, engine::Engine, event::{Event, WindowEvent}, @@ -18,7 +19,7 @@ use rg3d::{ }; use std::{ path::Path, - sync::{mpsc::Sender, Arc, Mutex, RwLock}, + sync::{mpsc::Sender, Arc, RwLock}, }; pub struct Menu { @@ -41,7 +42,7 @@ impl Menu { ) -> Self { let frame_size = engine.renderer.get_frame_size(); - let font: Font = rg3d::core::futures::executor::block_on(Font::from_file( + let font: Font = fyrox::core::futures::executor::block_on(Font::from_file( Path::new("data/ui/SquaresBold.ttf"), 31.0, Font::default_char_set(), diff --git a/src/message.rs b/src/message.rs index 308ef14..330f101 100644 --- a/src/message.rs +++ b/src/message.rs @@ -18,7 +18,7 @@ use crate::{ weapon::{Weapon, WeaponKind}, MatchOptions, }; -use rg3d::core::{ +use fyrox::core::{ algebra::{Matrix3, Vector3}, pool::Handle, }; diff --git a/src/options_menu.rs b/src/options_menu.rs index 1a2ccc7..1f0c43f 100644 --- a/src/options_menu.rs +++ b/src/options_menu.rs @@ -3,7 +3,7 @@ use crate::{ gui::{create_check_box, create_scroll_bar, create_scroll_viewer, ScrollBarData}, message::Message, }; -use rg3d::{ +use fyrox::{ core::pool::Handle, engine::Engine, event::{Event, MouseButton, MouseScrollDelta, WindowEvent}, @@ -633,6 +633,7 @@ impl OptionsMenu { } pub fn sync_to_model(&mut self, engine: &mut Engine) { + let sound_gain = engine.sound_gain(); let ui = &mut engine.user_interface; let control_scheme = self.control_scheme.read().unwrap(); let settings = engine.renderer.get_quality_settings(); @@ -652,7 +653,7 @@ impl OptionsMenu { sync_check_box(self.cb_mouse_y_inverse, control_scheme.mouse_y_inverse); sync_check_box(self.cb_smooth_mouse, control_scheme.smooth_mouse); sync_check_box(self.cb_shake_camera, control_scheme.shake_camera); - let is_hrtf = true; /*if let rg3d::sound::renderer::Renderer::HrtfRenderer(_) = + let is_hrtf = true; /*if let fyrox::sound::renderer::Renderer::HrtfRenderer(_) = engine.sound_context.lock().unwrap().renderer() { true @@ -674,10 +675,7 @@ impl OptionsMenu { ); sync_scroll_bar(self.sb_spot_shadow_distance, settings.spot_shadows_distance); sync_scroll_bar(self.sb_mouse_sens, control_scheme.mouse_sens); - sync_scroll_bar( - self.sb_sound_volume, - engine.sound_engine.lock().unwrap().master_gain(), - ); + sync_scroll_bar(self.sb_sound_volume, sound_gain); for (btn, def) in self .control_scheme_buttons @@ -759,11 +757,7 @@ impl OptionsMenu { if let Some(ScrollBarMessage::Value(new_value)) = message.data() { if message.direction() == MessageDirection::FromWidget { if message.destination() == self.sb_sound_volume { - engine - .sound_engine - .lock() - .unwrap() - .set_master_gain(*new_value) + engine.set_sound_gain(*new_value) } else if message.destination() == self.sb_point_shadow_distance { settings.point_shadows_distance = *new_value; } else if message.destination() == self.sb_spot_shadow_distance { @@ -810,7 +804,7 @@ impl OptionsMenu { self.control_scheme.write().unwrap().reset(); self.sync_to_model(engine); } else if message.destination() == self.btn_reset_audio_settings { - engine.sound_engine.lock().unwrap().set_master_gain(1.0); + engine.set_sound_gain(1.0); self.sync_to_model(engine); } diff --git a/src/player.rs b/src/player.rs index 735374a..8619645 100644 --- a/src/player.rs +++ b/src/player.rs @@ -4,8 +4,11 @@ use crate::{ level::UpdateContext, message::Message, }; -use rg3d::sound::context::SoundContext; -use rg3d::{ +use fyrox::scene::collider::{ColliderBuilder, ColliderShape}; +use fyrox::scene::pivot::PivotBuilder; +use fyrox::scene::rigidbody::{RigidBodyBuilder, RigidBodyType}; +use fyrox::scene::sound::listener::ListenerBuilder; +use fyrox::{ core::rand::Rng, core::{ algebra::{Matrix3, UnitQuaternion, Vector3}, @@ -14,10 +17,6 @@ use rg3d::{ visitor::{Visit, VisitResult, Visitor}, }, event::{DeviceEvent, ElementState, Event, MouseScrollDelta, WindowEvent}, - physics3d::rapier::{ - dynamics::{RigidBodyBuilder, RigidBodyType}, - geometry::ColliderBuilder, - }, rand, scene::transform::TransformBuilder, scene::{base::BaseBuilder, camera::CameraBuilder, node::Node, Scene}, @@ -156,60 +155,71 @@ impl Player { pub fn new(scene: &mut Scene, sender: Sender) -> Player { let height = Self::default().stand_body_height; - let body_handle = scene.physics.add_body( - RigidBodyBuilder::new(RigidBodyType::Dynamic) - .can_sleep(false) - .build(), - ); - scene.physics.add_collider( - ColliderBuilder::capsule_y(height * 0.5, 0.35) - .friction(0.0) - .build(), - &body_handle, - ); - let camera_handle; let camera_pivot_handle; let weapon_base_pivot_handle; let weapon_pivot_handle; - let pivot_handle = BaseBuilder::new() - .with_children(&[{ - camera_pivot_handle = BaseBuilder::new() - .with_children(&[{ - camera_handle = CameraBuilder::new(BaseBuilder::new().with_children(&[{ - weapon_base_pivot_handle = BaseBuilder::new() - .with_children(&[{ - weapon_pivot_handle = - BaseBuilder::new().build(&mut scene.graph); - weapon_pivot_handle - }]) - .with_local_transform( - TransformBuilder::new() - .with_local_position(Vector3::new(-0.065, -0.052, 0.02)) - .build(), - ) - .build(&mut scene.graph); - weapon_base_pivot_handle - }])) - .build(&mut scene.graph); - camera_handle - }]) - .with_local_transform( - TransformBuilder::new() - .with_local_position(Vector3::new(0.0, height - 0.20, 0.0)) - .build(), - ) + let collider; + let body_handle = RigidBodyBuilder::new(BaseBuilder::new().with_children(&[ + { + collider = ColliderBuilder::new(BaseBuilder::new()) + .with_shape(ColliderShape::capsule_y(height * 0.5, 0.35)) + .with_friction(0.5) .build(&mut scene.graph); + collider + }, + { + camera_pivot_handle = PivotBuilder::new( + BaseBuilder::new() + .with_children(&[{ + camera_handle = CameraBuilder::new( + BaseBuilder::new().with_children(&[ + { + weapon_base_pivot_handle = PivotBuilder::new( + BaseBuilder::new() + .with_children(&[{ + weapon_pivot_handle = + PivotBuilder::new(BaseBuilder::new()) + .build(&mut scene.graph); + weapon_pivot_handle + }]) + .with_local_transform( + TransformBuilder::new() + .with_local_position(Vector3::new( + -0.065, -0.052, 0.02, + )) + .build(), + ), + ) + .build(&mut scene.graph); + weapon_base_pivot_handle + }, + ListenerBuilder::new(BaseBuilder::new()) + .build(&mut scene.graph), + ]), + ) + .build(&mut scene.graph); + camera_handle + }]) + .with_local_transform( + TransformBuilder::new() + .with_local_position(Vector3::new(0.0, height - 0.20, 0.0)) + .build(), + ), + ) + .build(&mut scene.graph); camera_pivot_handle - }]) - .build(&mut scene.graph); - - scene.physics_binder.bind(pivot_handle, body_handle.into()); + }, + ])) + .with_locked_rotations(true) + .with_can_sleep(false) + .with_body_type(RigidBodyType::Dynamic) + .build(&mut scene.graph); Player { character: Character { - pivot: pivot_handle, - body: body_handle.into(), + body: body_handle, + collider, weapon_pivot: weapon_pivot_handle, sender: Some(sender), name: "Player".to_owned(), @@ -263,11 +273,11 @@ impl Player { } fn update_movement(&mut self, context: &mut UpdateContext) { - let pivot = &context.scene.graph[self.character.pivot]; - let look = pivot.look_vector(); - let side = pivot.side_vector(); + let has_ground_contact = self.character.has_ground_contact(&context.scene.graph); - let has_ground_contact = self.character.has_ground_contact(&context.scene.physics); + let body = context.scene.graph[self.character.body].as_rigid_body_mut(); + let look = body.look_vector(); + let side = body.side_vector(); let mut velocity = Vector3::default(); if self.controller.move_forward { @@ -289,22 +299,12 @@ impl Player { 1.0 }; - let body = context - .scene - .physics - .bodies - .get_mut(&self.character.body) - .unwrap(); - body.set_angvel(Default::default(), true); if let Some(normalized_velocity) = velocity.try_normalize(std::f32::EPSILON) { - body.set_linvel( - Vector3::new( - normalized_velocity.x * self.move_speed * speed_mult, - body.linvel().y, - normalized_velocity.z * self.move_speed * speed_mult, - ), - true, - ); + body.set_lin_vel(Vector3::new( + normalized_velocity.x * self.move_speed * speed_mult, + body.lin_vel().y, + normalized_velocity.z * self.move_speed * speed_mult, + )); self.weapon_dest_offset.x = 0.01 * (self.weapon_shake_factor * 0.5).cos(); self.weapon_dest_offset.y = 0.005 * self.weapon_shake_factor.sin(); @@ -320,34 +320,20 @@ impl Player { self.weapon_dest_offset = Vector3::default(); } - // Damping to prevent sliding. - // TODO: This is needed because Rapier does not have selection of friction - // models yet. - if has_ground_contact { - let mut vel = *body.linvel(); - vel.x *= 0.9; - vel.z *= 0.9; - body.set_linvel(vel, true); - } - self.weapon_offset.follow(&self.weapon_dest_offset, 0.1); - context.scene.graph[self.character.weapon_pivot] - .local_transform_mut() - .set_position(self.weapon_offset); - if self.controller.jump { if has_ground_contact { - let mut vel = *body.linvel(); + let mut vel = body.lin_vel(); vel.y = 4.2; - body.set_linvel(vel, true); + body.set_lin_vel(vel); } self.controller.jump = false; } //self.handle_crouch(body); - self.feet_position = body.position().translation.vector; + self.feet_position = body.global_position(); self.feet_position.y -= self.stand_body_height; if self @@ -363,20 +349,6 @@ impl Player { self.camera_offset = Vector3::default(); } - let camera_node = &mut context.scene.graph[self.camera]; - camera_node - .local_transform_mut() - .set_position(self.camera_offset); - - self.head_position = camera_node.global_position(); - self.look_direction = camera_node.look_vector(); - self.up_direction = camera_node.up_vector(); - self.listener_basis = Matrix3::from_columns(&[ - camera_node.side_vector(), - camera_node.up_vector(), - -camera_node.look_vector(), - ]); - if self .control_scheme .clone() @@ -392,10 +364,11 @@ impl Player { self.pitch = self.dest_pitch; } - let mut position = *body.position(); - position.rotation = - UnitQuaternion::from_axis_angle(&Vector3::y_axis(), self.yaw.to_radians()); - body.set_position(position, true); + body.local_transform_mut() + .set_rotation(UnitQuaternion::from_axis_angle( + &Vector3::y_axis(), + self.yaw.to_radians(), + )); context.scene.graph[self.camera_pivot] .local_transform_mut() @@ -403,13 +376,24 @@ impl Player { &Vector3::x_axis(), self.pitch.to_radians(), )); - } - fn update_listener(&mut self, sound_context: SoundContext) { - let mut sound_context = sound_context.state(); - let listener = sound_context.listener_mut(); - listener.set_basis(self.listener_basis); - listener.set_position(self.head_position); + context.scene.graph[self.character.weapon_pivot] + .local_transform_mut() + .set_position(self.weapon_offset); + + let camera_node = &mut context.scene.graph[self.camera]; + camera_node + .local_transform_mut() + .set_position(self.camera_offset); + + self.head_position = camera_node.global_position(); + self.look_direction = camera_node.look_vector(); + self.up_direction = camera_node.up_vector(); + self.listener_basis = Matrix3::from_columns(&[ + camera_node.side_vector(), + camera_node.up_vector(), + -camera_node.look_vector(), + ]); } pub fn can_be_removed(&self) -> bool { @@ -536,13 +520,9 @@ impl Player { .weapons .get(self.character.current_weapon as usize) { - let velocity = context - .scene - .physics - .bodies - .get(&self.character.body) - .unwrap() - .linvel(); + let initial_velocity = context.scene.graph[self.character.body] + .as_rigid_body() + .lin_vel(); if self.controller.shoot { self.character @@ -551,7 +531,7 @@ impl Player { .unwrap() .send(Message::ShootWeapon { weapon: *current_weapon_handle, - initial_velocity: *velocity, + initial_velocity, direction: None, }) .unwrap(); @@ -571,7 +551,7 @@ impl Player { .unwrap() .send(Message::PlaySound { path: footsteps[rand::thread_rng().gen_range(0..footsteps.len())].into(), - position: self.character.position(&context.scene.physics), + position: self.character.position(&context.scene.graph), gain: 1.0, rolloff_factor: 2.0, radius: 3.0, @@ -580,8 +560,6 @@ impl Player { self.path_len = 0.0; } - - self.update_listener(context.scene.sound_context.clone()); } pub fn clean_up(&mut self, scene: &mut Scene) { diff --git a/src/projectile.rs b/src/projectile.rs index c7b1178..dcbe379 100644 --- a/src/projectile.rs +++ b/src/projectile.rs @@ -5,32 +5,25 @@ use crate::{ weapon::{Weapon, WeaponContainer}, GameTime, }; -use rg3d::core::algebra::Point3; -use rg3d::engine::resource_manager::MaterialSearchOptions; -use rg3d::{ - core::rand::Rng, +use fyrox::{ core::{ - algebra::{Isometry3, Matrix3, Translation3, UnitQuaternion, Vector3}, + algebra::{Matrix3, Point3, UnitQuaternion, Vector3}, color::Color, math::{ray::Ray, Vector3Ext}, - pool::{Handle, Pool, PoolIteratorMut}, + pool::{Handle, Pool}, + rand::Rng, visitor::{Visit, VisitResult, Visitor}, }, engine::resource_manager::ResourceManager, - physics3d::{ - rapier::{ - dynamics::{RigidBodyBuilder, RigidBodyType}, - geometry::{ColliderBuilder, InteractionGroups, IntersectionEvent}, - }, - RayCastOptions, RigidBodyHandle, - }, rand, scene::{ base::BaseBuilder, - graph::Graph, + collider::{ColliderBuilder, ColliderShape, InteractionGroups}, + graph::{physics::RayCastOptions, Graph}, light::{point::PointLightBuilder, BaseLightBuilder}, node::Node, - sprite::SpriteBuilder, + rigidbody::{RigidBodyBuilder, RigidBodyType}, + sprite::{Sprite, SpriteBuilder}, transform::TransformBuilder, Scene, }, @@ -70,7 +63,7 @@ pub struct Projectile { /// rockets, plasma balls could have rigid body to detect collisions with /// environment. Some projectiles do not have rigid body - they're ray-based - /// interaction with environment handled with ray cast. - body: Option, + body: Option>, dir: Vector3, lifetime: f32, rotation_angle: f32, @@ -170,29 +163,37 @@ impl Projectile { let size = rand::thread_rng().gen_range(0.09..0.12); let color = Color::opaque(0, 162, 232); - let model = SpriteBuilder::new( - BaseBuilder::new().with_children(&[PointLightBuilder::new( - BaseLightBuilder::new(BaseBuilder::new()).with_color(color), - ) - .with_radius(1.5) - .build(&mut scene.graph)]), - ) - .with_size(size) - .with_color(color) - .with_texture( - resource_manager.request_texture("data/particles/light_01.png", None), - ) - .build(&mut scene.graph); - let collider = ColliderBuilder::ball(size).sensor(true).build(); - let body = RigidBodyBuilder::new(RigidBodyType::KinematicPositionBased) - .translation(position) - .build(); - let body_handle = scene.physics.add_body(body); - scene.physics.add_collider(collider, &body_handle); - scene.physics_binder.bind(model, body_handle); + let model; + let collider; + let body = RigidBodyBuilder::new(BaseBuilder::new().with_children(&[ + { + model = SpriteBuilder::new( + BaseBuilder::new().with_children(&[PointLightBuilder::new( + BaseLightBuilder::new(BaseBuilder::new()).with_color(color), + ) + .with_radius(1.5) + .build(&mut scene.graph)]), + ) + .with_size(size) + .with_color(color) + .with_texture( + resource_manager.request_texture("data/particles/light_01.png"), + ) + .build(&mut scene.graph); + model + }, + { + collider = ColliderBuilder::new(BaseBuilder::new()) + .with_shape(ColliderShape::ball(size)) + .build(&mut scene.graph); + collider + }, + ])) + .with_body_type(RigidBodyType::KinematicPositionBased) + .build(&mut scene.graph); - (model, Some(body_handle)) + (model, Some(body)) } ProjectileKind::Bullet => { let model = SpriteBuilder::new( @@ -203,21 +204,14 @@ impl Projectile { ), ) .with_size(0.05) - .with_texture( - resource_manager.request_texture("data/particles/light_01.png", None), - ) + .with_texture(resource_manager.request_texture("data/particles/light_01.png")) .build(&mut scene.graph); (model, None) } ProjectileKind::Rocket => { let resource = resource_manager - .request_model( - "data/models/rocket.FBX", - MaterialSearchOptions::MaterialsDirectory(PathBuf::from( - "data/textures", - )), - ) + .request_model("data/models/rocket.FBX") .await .unwrap(); let model = resource.instantiate_geometry(scene); @@ -269,14 +263,7 @@ impl Projectile { ) { // Fetch current position of projectile. let position = if let Some(body) = self.body.as_ref() { - scene - .physics - .bodies - .get(body) - .unwrap() - .position() - .translation - .vector + scene.graph[*body].global_position() } else { scene.graph[self.model].global_position() }; @@ -287,12 +274,12 @@ impl Projectile { // fast moving projectiles. let ray = Ray::from_two_points(self.last_position, position); let mut query_buffer = Vec::default(); - scene.physics.cast_ray( + scene.graph.physics.cast_ray( RayCastOptions { ray_origin: Point3::from(ray.origin), ray_direction: ray.origin, max_len: ray.dir.norm(), - groups: InteractionGroups::all(), + groups: InteractionGroups::default(), sort_results: true, }, &mut query_buffer, @@ -300,16 +287,10 @@ impl Projectile { // List of hits sorted by distance from ray origin. 'hit_loop: for hit in query_buffer.iter() { - let collider = scene.physics.colliders.get(&hit.collider).unwrap(); - let body = scene - .physics - .bodies - .handle_map() - .key_of(&collider.parent().unwrap()) - .cloned() - .unwrap(); + let collider = scene.graph[hit.collider].as_collider(); + let body = collider.parent(); - if collider.shape().as_trimesh().is_some() { + if matches!(collider.shape(), ColliderShape::Trimesh(_)) { self.kill(); effect_position = Some(hit.position.coords); break 'hit_loop; @@ -340,14 +321,9 @@ impl Projectile { // Special case for projectiles with rigid body. if let Some(body) = self.body.as_ref() { // Move rigid body explicitly. - let body = scene.physics.bodies.get_mut(body).unwrap(); - let position = Isometry3 { - rotation: Default::default(), - translation: Translation3 { - vector: body.position().translation.vector + total_velocity, - }, - }; - body.set_next_kinematic_position(position); + scene.graph[*body] + .local_transform_mut() + .offset(total_velocity); } else { // We have just model - move it. scene.graph[self.model] @@ -356,7 +332,7 @@ impl Projectile { } } - if let Node::Sprite(sprite) = &mut scene.graph[self.model] { + if let Some(sprite) = scene.graph[self.model].cast_mut::() { sprite.set_rotation(self.rotation_angle); self.rotation_angle += 1.5; } @@ -407,87 +383,17 @@ impl Projectile { self.last_position = position; } - /// Some projectiles have just proximity sensors which used to detect contacts with - /// environment and actors. We have to handle proximity events separately. - pub fn handle_proximity( - &mut self, - proximity_event: &IntersectionEvent, - scene: &mut Scene, - actors: &ActorContainer, - weapons: &WeaponContainer, - ) { - if proximity_event.intersecting { - let mut owner_contact = false; - - let body_a = scene - .physics - .bodies - .handle_map() - .key_of( - &scene - .physics - .colliders - .native_ref(proximity_event.collider1) - .unwrap() - .parent() - .unwrap(), - ) - .cloned() - .unwrap(); - let body_b = scene - .physics - .bodies - .handle_map() - .key_of( - &scene - .physics - .colliders - .native_ref(proximity_event.collider2) - .unwrap() - .parent() - .unwrap(), - ) - .cloned() - .unwrap(); - - // Check if we got contact with any actor and damage it then. - for (actor_handle, actor) in actors.pair_iter() { - if let Some(self_body) = self.body { - if (body_a == actor.get_body() && body_b == self_body - || body_b == actor.get_body() && body_a == self_body) - && self.owner.is_some() - { - // Prevent self-damage. - let weapon = &weapons[self.owner]; - if weapon.owner() != actor_handle { - self.hits.insert(Hit { - actor: actor_handle, - who: weapon.owner(), - }); - } else { - // Make sure that projectile won't die on contact with owner. - owner_contact = true; - } - } - } - } - - if !owner_contact { - self.kill(); - } - } - } - pub fn get_position(&self, graph: &Graph) -> Vector3 { graph[self.model].global_position() } fn clean_up(&mut self, scene: &mut Scene) { if let Some(body) = self.body.as_ref() { - scene.physics.remove_body(body); - } - if self.model.is_some() { - scene.graph.remove_node(self.model); + scene.graph.remove_node(*body); + } else { + if self.model.is_some() { + scene.graph.remove_node(self.model); + } } } } @@ -534,7 +440,7 @@ impl ProjectileContainer { self.pool.spawn(projectile) } - pub fn iter_mut(&mut self) -> PoolIteratorMut { + pub fn iter_mut(&mut self) -> impl Iterator { self.pool.iter_mut() } diff --git a/src/weapon.rs b/src/weapon.rs index 52f0009..5fe99de 100644 --- a/src/weapon.rs +++ b/src/weapon.rs @@ -1,27 +1,24 @@ use crate::{ actor::Actor, actor::ActorContainer, message::Message, projectile::ProjectileKind, GameTime, }; -use rg3d::core::algebra::Point3; -use rg3d::engine::resource_manager::MaterialSearchOptions; -use rg3d::utils::log::{Log, MessageKind}; -use rg3d::{ +use fyrox::{ core::{ - algebra::{Matrix3, Vector3}, + algebra::{Matrix3, Point3, Vector3}, color::Color, math::{ray::Ray, Matrix4Ext, Vector3Ext}, - pool::{Handle, Pool, PoolIteratorMut}, + pool::{Handle, Pool}, visitor::{Visit, VisitResult, Visitor}, }, engine::resource_manager::ResourceManager, - physics3d::{rapier::geometry::InteractionGroups, RayCastOptions}, scene::{ base::BaseBuilder, - graph::Graph, + collider::InteractionGroups, + graph::{physics::RayCastOptions, Graph}, light::{point::PointLightBuilder, BaseLightBuilder}, node::Node, - physics::Physics, Scene, }, + utils::log::{Log, MessageKind}, }; use std::{ ops::{Index, IndexMut}, @@ -178,10 +175,7 @@ impl Weapon { let definition = Self::get_definition(kind); let model = resource_manager - .request_model( - Path::new(definition.model), - MaterialSearchOptions::MaterialsDirectory(PathBuf::from("data/textures")), - ) + .request_model(Path::new(definition.model)) .await .unwrap() .instantiate_geometry(scene); @@ -225,7 +219,7 @@ impl Weapon { pub fn update(&mut self, scene: &mut Scene, actors: &ActorContainer) { self.offset.follow(&self.dest_offset, 0.2); - self.update_laser_sight(&mut scene.graph, &mut scene.physics, actors); + self.update_laser_sight(&mut scene.graph, actors); let node = &mut scene.graph[self.model]; node.local_transform_mut().set_position(self.offset); @@ -257,33 +251,27 @@ impl Weapon { self.ammo += amount; } - fn update_laser_sight( - &self, - graph: &mut Graph, - physics: &mut Physics, - actors: &ActorContainer, - ) { + fn update_laser_sight(&self, graph: &mut Graph, actors: &ActorContainer) { let mut laser_dot_position = Vector3::default(); let model = &graph[self.model]; let begin = model.global_position(); let end = begin + model.look_vector().scale(100.0); let ray = Ray::from_two_points(begin, end); let mut query_buffer = Vec::default(); - physics.cast_ray( + graph.physics.cast_ray( RayCastOptions { ray_origin: Point3::from(ray.origin), ray_direction: ray.dir, - max_len: std::f32::MAX, - groups: InteractionGroups::all(), + max_len: f32::MAX, + groups: InteractionGroups::default(), sort_results: true, }, &mut query_buffer, ); 'hit_loop: for hit in query_buffer.iter() { // Filter hit with owner capsule - let body = physics.collider_parent(&hit.collider).cloned().unwrap(); for (handle, actor) in actors.pair_iter() { - if self.owner == handle && actor.body == body { + if self.owner == handle && actor.collider == hit.collider { continue 'hit_loop; } } @@ -369,7 +357,7 @@ impl WeaponContainer { self.pool.free(weapon); } - pub fn iter_mut(&mut self) -> PoolIteratorMut { + pub fn iter_mut(&mut self) -> impl Iterator { self.pool.iter_mut() }