├── .clang-format ├── .gitignore ├── .gitmodules ├── CMakeLists.txt ├── README.md ├── assets ├── levels │ ├── city │ │ ├── Cement02.jpg │ │ ├── city.bin │ │ ├── city.gltf │ │ ├── concrete.jpg │ │ ├── darkwood5.jpg │ │ ├── floor.png │ │ ├── grass2.png │ │ ├── large_grey_tiles_diff.jpg │ │ ├── store_banner.jpg │ │ ├── store_brick.png │ │ ├── store_logo.png │ │ ├── store_posters.png │ │ ├── store_roof_wood.png │ │ ├── store_stripe.png │ │ ├── tree.png │ │ └── wooden_door.png │ └── house │ │ ├── atlas.png │ │ ├── house.bin │ │ ├── house.gltf │ │ └── house.json ├── models │ ├── CatoTexture.png │ ├── cato.bin │ ├── cato.gltf │ ├── face_default.png │ ├── yae.bin │ ├── yae.gltf │ └── yae_mer128.png └── textures │ ├── shinji.png │ ├── skybox │ └── distant_sunset │ │ ├── back.jpg │ │ ├── bottom.jpg │ │ ├── front.jpg │ │ ├── left.jpg │ │ ├── right.jpg │ │ └── top.jpg │ └── tree.png ├── cmake ├── ColorDiagnostics.cmake ├── FetchSubmodules.cmake └── TargetAddExtraWarnings.cmake ├── minimal_example ├── CMakeLists.txt ├── README.md └── main.cpp ├── screenshots ├── 1_triangle.png ├── 2_textured_quad.png ├── 3_model.png ├── 4_blinn_phong.png ├── 5_gltf_scene_loading.png └── 6_skeletal_animation.mp4 ├── src ├── CMakeLists.txt ├── FreeCameraController.cpp ├── FreeCameraController.h ├── Game.cpp ├── Game.h ├── Graphics │ ├── Camera.cpp │ ├── Camera.h │ ├── GPUMesh.h │ ├── Material.h │ ├── Mesh.cpp │ ├── Mesh.h │ ├── MipMapGenerator.cpp │ ├── MipMapGenerator.h │ ├── Scene.h │ ├── SkeletalAnimation.h │ ├── Skeleton.cpp │ ├── Skeleton.h │ ├── SkeletonAnimator.cpp │ ├── SkeletonAnimator.h │ ├── Texture.cpp │ └── Texture.h ├── MaterialCache.cpp ├── MaterialCache.h ├── Math │ ├── GlobalAxes.h │ ├── Transform.cpp │ └── Transform.h ├── MeshCache.cpp ├── MeshCache.h ├── main.cpp └── util │ ├── GltfLoader.cpp │ ├── GltfLoader.h │ ├── ImageLoader.cpp │ ├── ImageLoader.h │ ├── InputUtil.cpp │ ├── InputUtil.h │ ├── OSUtil.cpp │ ├── OSUtil.h │ ├── SDLWebGPU.cpp │ ├── SDLWebGPU.h │ ├── WebGPUUtil.cpp │ └── WebGPUUtil.h ├── third_party ├── CMakeLists.txt └── stb │ ├── CMakeLists.txt │ └── include │ └── stb_image.h └── tools └── init_submodules.sh /.clang-format: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/.clang-format -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/.gitignore -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/.gitmodules -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/CMakeLists.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/README.md -------------------------------------------------------------------------------- /assets/levels/city/Cement02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/Cement02.jpg -------------------------------------------------------------------------------- /assets/levels/city/city.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/city.bin -------------------------------------------------------------------------------- /assets/levels/city/city.gltf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/city.gltf -------------------------------------------------------------------------------- /assets/levels/city/concrete.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/concrete.jpg -------------------------------------------------------------------------------- /assets/levels/city/darkwood5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/darkwood5.jpg -------------------------------------------------------------------------------- /assets/levels/city/floor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/floor.png -------------------------------------------------------------------------------- /assets/levels/city/grass2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/grass2.png -------------------------------------------------------------------------------- /assets/levels/city/large_grey_tiles_diff.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/large_grey_tiles_diff.jpg -------------------------------------------------------------------------------- /assets/levels/city/store_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/store_banner.jpg -------------------------------------------------------------------------------- /assets/levels/city/store_brick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/store_brick.png -------------------------------------------------------------------------------- /assets/levels/city/store_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/store_logo.png -------------------------------------------------------------------------------- /assets/levels/city/store_posters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/store_posters.png -------------------------------------------------------------------------------- /assets/levels/city/store_roof_wood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/store_roof_wood.png -------------------------------------------------------------------------------- /assets/levels/city/store_stripe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/store_stripe.png -------------------------------------------------------------------------------- /assets/levels/city/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/tree.png -------------------------------------------------------------------------------- /assets/levels/city/wooden_door.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/city/wooden_door.png -------------------------------------------------------------------------------- /assets/levels/house/atlas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/house/atlas.png -------------------------------------------------------------------------------- /assets/levels/house/house.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/house/house.bin -------------------------------------------------------------------------------- /assets/levels/house/house.gltf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/house/house.gltf -------------------------------------------------------------------------------- /assets/levels/house/house.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/levels/house/house.json -------------------------------------------------------------------------------- /assets/models/CatoTexture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/models/CatoTexture.png -------------------------------------------------------------------------------- /assets/models/cato.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/models/cato.bin -------------------------------------------------------------------------------- /assets/models/cato.gltf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/models/cato.gltf -------------------------------------------------------------------------------- /assets/models/face_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/models/face_default.png -------------------------------------------------------------------------------- /assets/models/yae.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/models/yae.bin -------------------------------------------------------------------------------- /assets/models/yae.gltf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/models/yae.gltf -------------------------------------------------------------------------------- /assets/models/yae_mer128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/models/yae_mer128.png -------------------------------------------------------------------------------- /assets/textures/shinji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/shinji.png -------------------------------------------------------------------------------- /assets/textures/skybox/distant_sunset/back.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/skybox/distant_sunset/back.jpg -------------------------------------------------------------------------------- /assets/textures/skybox/distant_sunset/bottom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/skybox/distant_sunset/bottom.jpg -------------------------------------------------------------------------------- /assets/textures/skybox/distant_sunset/front.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/skybox/distant_sunset/front.jpg -------------------------------------------------------------------------------- /assets/textures/skybox/distant_sunset/left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/skybox/distant_sunset/left.jpg -------------------------------------------------------------------------------- /assets/textures/skybox/distant_sunset/right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/skybox/distant_sunset/right.jpg -------------------------------------------------------------------------------- /assets/textures/skybox/distant_sunset/top.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/skybox/distant_sunset/top.jpg -------------------------------------------------------------------------------- /assets/textures/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/assets/textures/tree.png -------------------------------------------------------------------------------- /cmake/ColorDiagnostics.cmake: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/cmake/ColorDiagnostics.cmake -------------------------------------------------------------------------------- /cmake/FetchSubmodules.cmake: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/cmake/FetchSubmodules.cmake -------------------------------------------------------------------------------- /cmake/TargetAddExtraWarnings.cmake: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/cmake/TargetAddExtraWarnings.cmake -------------------------------------------------------------------------------- /minimal_example/CMakeLists.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/minimal_example/CMakeLists.txt -------------------------------------------------------------------------------- /minimal_example/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/minimal_example/README.md -------------------------------------------------------------------------------- /minimal_example/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/minimal_example/main.cpp -------------------------------------------------------------------------------- /screenshots/1_triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/screenshots/1_triangle.png -------------------------------------------------------------------------------- /screenshots/2_textured_quad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/screenshots/2_textured_quad.png -------------------------------------------------------------------------------- /screenshots/3_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/screenshots/3_model.png -------------------------------------------------------------------------------- /screenshots/4_blinn_phong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/screenshots/4_blinn_phong.png -------------------------------------------------------------------------------- /screenshots/5_gltf_scene_loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/screenshots/5_gltf_scene_loading.png -------------------------------------------------------------------------------- /screenshots/6_skeletal_animation.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/screenshots/6_skeletal_animation.mp4 -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/CMakeLists.txt -------------------------------------------------------------------------------- /src/FreeCameraController.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/FreeCameraController.cpp -------------------------------------------------------------------------------- /src/FreeCameraController.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/FreeCameraController.h -------------------------------------------------------------------------------- /src/Game.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Game.cpp -------------------------------------------------------------------------------- /src/Game.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Game.h -------------------------------------------------------------------------------- /src/Graphics/Camera.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Camera.cpp -------------------------------------------------------------------------------- /src/Graphics/Camera.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Camera.h -------------------------------------------------------------------------------- /src/Graphics/GPUMesh.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/GPUMesh.h -------------------------------------------------------------------------------- /src/Graphics/Material.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Material.h -------------------------------------------------------------------------------- /src/Graphics/Mesh.cpp: -------------------------------------------------------------------------------- 1 | #include "Mesh.h" 2 | -------------------------------------------------------------------------------- /src/Graphics/Mesh.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Mesh.h -------------------------------------------------------------------------------- /src/Graphics/MipMapGenerator.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/MipMapGenerator.cpp -------------------------------------------------------------------------------- /src/Graphics/MipMapGenerator.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/MipMapGenerator.h -------------------------------------------------------------------------------- /src/Graphics/Scene.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Scene.h -------------------------------------------------------------------------------- /src/Graphics/SkeletalAnimation.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/SkeletalAnimation.h -------------------------------------------------------------------------------- /src/Graphics/Skeleton.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | -------------------------------------------------------------------------------- /src/Graphics/Skeleton.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Skeleton.h -------------------------------------------------------------------------------- /src/Graphics/SkeletonAnimator.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/SkeletonAnimator.cpp -------------------------------------------------------------------------------- /src/Graphics/SkeletonAnimator.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/SkeletonAnimator.h -------------------------------------------------------------------------------- /src/Graphics/Texture.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Texture.cpp -------------------------------------------------------------------------------- /src/Graphics/Texture.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Graphics/Texture.h -------------------------------------------------------------------------------- /src/MaterialCache.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/MaterialCache.cpp -------------------------------------------------------------------------------- /src/MaterialCache.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/MaterialCache.h -------------------------------------------------------------------------------- /src/Math/GlobalAxes.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Math/GlobalAxes.h -------------------------------------------------------------------------------- /src/Math/Transform.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Math/Transform.cpp -------------------------------------------------------------------------------- /src/Math/Transform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/Math/Transform.h -------------------------------------------------------------------------------- /src/MeshCache.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/MeshCache.cpp -------------------------------------------------------------------------------- /src/MeshCache.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/MeshCache.h -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/main.cpp -------------------------------------------------------------------------------- /src/util/GltfLoader.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/GltfLoader.cpp -------------------------------------------------------------------------------- /src/util/GltfLoader.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/GltfLoader.h -------------------------------------------------------------------------------- /src/util/ImageLoader.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/ImageLoader.cpp -------------------------------------------------------------------------------- /src/util/ImageLoader.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/ImageLoader.h -------------------------------------------------------------------------------- /src/util/InputUtil.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/InputUtil.cpp -------------------------------------------------------------------------------- /src/util/InputUtil.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/InputUtil.h -------------------------------------------------------------------------------- /src/util/OSUtil.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/OSUtil.cpp -------------------------------------------------------------------------------- /src/util/OSUtil.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/OSUtil.h -------------------------------------------------------------------------------- /src/util/SDLWebGPU.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/SDLWebGPU.cpp -------------------------------------------------------------------------------- /src/util/SDLWebGPU.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/SDLWebGPU.h -------------------------------------------------------------------------------- /src/util/WebGPUUtil.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/WebGPUUtil.cpp -------------------------------------------------------------------------------- /src/util/WebGPUUtil.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/src/util/WebGPUUtil.h -------------------------------------------------------------------------------- /third_party/CMakeLists.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/third_party/CMakeLists.txt -------------------------------------------------------------------------------- /third_party/stb/CMakeLists.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/third_party/stb/CMakeLists.txt -------------------------------------------------------------------------------- /third_party/stb/include/stb_image.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eliasdaler/webgpu-learning/HEAD/third_party/stb/include/stb_image.h -------------------------------------------------------------------------------- /tools/init_submodules.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -x 3 | git submodule update --init --depth 1 4 | --------------------------------------------------------------------------------