Full Code of Ruddle/oxidator for AI

master ba77b3419a1c cached
106 files
594.5 KB
190.2k tokens
334 symbols
1 requests
Download .txt
Showing preview only (624K chars total). Download the full file or copy to clipboard to get everything.
Repository: Ruddle/oxidator
Branch: master
Commit: ba77b3419a1c
Files: 106
Total size: 594.5 KB

Directory structure:
gitextract_h9fjhbh5/

├── .gitignore
├── Cargo.toml
├── LICENSE
├── README.md
└── src/
    ├── asset/
    │   ├── 3d/
    │   │   ├── arrow.obj
    │   │   ├── axis_debug.obj
    │   │   ├── cube.obj
    │   │   ├── small_sphere.obj
    │   │   └── tank/
    │   │       ├── base.obj
    │   │       ├── canon.obj
    │   │       └── wheel.obj
    │   ├── botdef/
    │   │   ├── building_example.json
    │   │   └── unit_example.json
    │   └── map/
    │       └── map_example/
    │           └── data.json
    ├── botdef.rs
    ├── client/
    │   ├── camera.rs
    │   ├── game_state.rs
    │   ├── heightmap_editor.rs
    │   ├── input_state.rs
    │   ├── misc.rs
    │   ├── mod.rs
    │   ├── play.rs
    │   ├── render.rs
    │   ├── uitool.rs
    │   ├── unit_editor.rs
    │   └── unit_part_gpu.rs
    ├── frame.rs
    ├── frame_server/
    │   └── mod.rs
    ├── glsl.rs
    ├── gpu_obj/
    │   ├── arrow_gpu.rs
    │   ├── blit_texture.rs
    │   ├── explosion.rs
    │   ├── glsl_compiler.rs
    │   ├── gpu.rs
    │   ├── health_bar.rs
    │   ├── heightmap_gpu.rs
    │   ├── heightmap_helper.rs
    │   ├── imgui_wgpu.rs
    │   ├── line.rs
    │   ├── mod.rs
    │   ├── model_gpu.rs
    │   ├── post_fx.rs
    │   ├── post_fxaa.rs
    │   ├── texture_view_bicopy.rs
    │   ├── trait_gpu.rs
    │   ├── unit_icon.rs
    │   └── water.rs
    ├── heightmap_phy.rs
    ├── main.rs
    ├── manager.rs
    ├── mobile.rs
    ├── moddef.rs
    ├── model.rs
    ├── net_client.rs
    ├── net_server.rs
    ├── procedural_texels.rs
    ├── shader/
    │   ├── arrow.frag
    │   ├── arrow.vert
    │   ├── blit_texture.frag
    │   ├── blit_texture.vert
    │   ├── compiled/
    │   │   ├── arrow.frag.spirv
    │   │   ├── arrow.vert.spirv
    │   │   ├── blit_texture.frag.spirv
    │   │   ├── blit_texture.vert.spirv
    │   │   ├── cube_instanced.frag.spirv
    │   │   ├── cube_instanced.vert.spirv
    │   │   ├── explosion.frag.spirv
    │   │   ├── explosion.vert.spirv
    │   │   ├── health_bar.frag.spirv
    │   │   ├── health_bar.vert.spirv
    │   │   ├── heightmap.frag.spirv
    │   │   ├── heightmap.vert.spirv
    │   │   ├── imgui.frag.spirv
    │   │   ├── imgui.vert.spirv
    │   │   ├── line.frag.spirv
    │   │   ├── line.vert.spirv
    │   │   ├── post.vert.spirv
    │   │   ├── post_bicopy.frag.spirv
    │   │   ├── post_fxaa.frag.spirv
    │   │   ├── post_ui.frag.spirv
    │   │   ├── unit_icon.frag.spirv
    │   │   ├── unit_icon.vert.spirv
    │   │   ├── water.frag.spirv
    │   │   └── water.vert.spirv
    │   ├── cube_instanced.frag
    │   ├── cube_instanced.vert
    │   ├── explosion.frag
    │   ├── explosion.vert
    │   ├── health_bar.frag
    │   ├── health_bar.vert
    │   ├── heightmap.frag
    │   ├── heightmap.vert
    │   ├── imgui.frag
    │   ├── imgui.vert
    │   ├── line.frag
    │   ├── line.vert
    │   ├── post.vert
    │   ├── post_bicopy.frag
    │   ├── post_fxaa.frag
    │   ├── post_ui.frag
    │   ├── unit_icon.frag
    │   ├── unit_icon.vert
    │   ├── water.frag
    │   └── water.vert
    ├── unit.rs
    └── utils.rs

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
/target
**/*.rs.bk
.idea
*.iml
.vscode/tasks.json
*.blend
*.blend1

================================================
FILE: Cargo.toml
================================================
[package]
name = "oxidator"
version = "0.2.0"
authors = ["Thomas SIMON <thomas.simon.work@gmail.com>"]
edition = "2018"
default-run = "oxidator"

[features]
#Choose one method of loading spirv out of the three. default uses the precompiled shaders, but does not support hot-reloading.
use_shaderc =["shaderc"]
use_glsl_to_spirv =["glsl-to-spirv"]
default = []

[dependencies]
wgpu = { version = "0.4.0" }
env_logger = "0.7.1"
glsl-to-spirv = {version= "0.1", optional= true}
log = "0.4"
png = "0.15"
winit = "=0.20.0-alpha4"
raw-window-handle = "0.3.3"
imgui = "0.2.1"
shaderc = {version = "0.6", optional = true} 
noise = "0.6.0"
nalgebra = {version=  "0.19", features= ["serde-serialize"]}
crossbeam-channel = "0.3"
rand = "0.7.3"
notify = "=5.0.0-pre.1"
byteorder = "1.3.2"
typename = "0.1.2"
base-62 = "0.1.1"
obj-rs = "0.5"
spin_sleep = "0.3.7"
serde = { version = "1.0", features = ["derive"] }
bincode = "1.2.1"
serde_json = "1.0.46"
flate2 = "1.0"
rayon = "1.3.0"
fnv = "1.0.6"

[dependencies.imgui-winit-support]
version = "0.2.1"
default-features = false
features = ["winit-20"]

[[bin]]
name = "oxidator"
path = "src/main.rs"

[profile.release]
#lto = true

================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2019 Thomas SIMON

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# What is this?

A real time strategy game/engine written with Rust and WebGPU.
Eventually it will be able to run in a web browser thanks to WebGPU.
This project is inspired by Total Annihilation, Supreme Commander, [Spring Engine](https://springrts.com/) and [Zero-k](https://zero-k.info/).

## Demo

![Map editor](etc/map_editor.gif)
Map editor [HQ version](https://streamable.com/9vn0z)

![Unit editor](etc/unit_editor.gif)
Unit editor [HQ version](https://streamable.com/ywr44)

![Play mode](etc/play.gif)
Gameplay (35000 units) [HQ version](https://streamable.com/499j0)



## Goal

The ultimate goal is to provide a modern, carefully crafted, minimal and highly constrained set of tools for players/designers to create mods (game variant) without programming knowledge. 
Those tool would be comprised of :
- Map editor
- Unit editor
    * 3d model import, animation, behavior definition (simple visual programming language, non turing complete), formation ...
- Mod(set of units) editor
- Online repository to publish maps, units, and mods.
- Multiplayer lobby and client/server system
    * Where player can select a tuple of map and mod to play with others
    * Aiming for a quite higher latency than usual (100ms + ping) between server and clients
- High performance multithreaded renderer 
    * Aiming for 100k moving units at 60fps, 1080p with middle-end 2016 hardware
- High performance multithreaded simulation
    * same goal than the renderer

All in one executable.

the test for this goal would be to be able implement a [Zero-k](https://zero-k.info/) clone in this project, with all its features and play it with 32 players.

## Non-Goals

* General purpose modding/ turing complete scripting language.

* Low latency server: the increase in dev time between 10ms latency and 100ms is huge. Not worth the effort given that I want people from all around the world to play together. Also I want games to be about strategy, not action per minute (I am getting too old for this ^^).

* Hosted simulation server. I am broke, people will have to host their own server to play with others (that would just mean clicking the host button in the multi lobby, and having sufficient bandwidth). the online repository will help with discovery though.  

* Deterministic engine: that makes multithreading less efficient and harder. It has nice properties (low file size for replay, debugging) but for my goals they are not worth their price. It is usually done to make networking easier and extremely low bandwidth (because peers only have to share player inputs). I have a plan to keep 80% of those properties with a non-deterministic engine (for 20% the price in dev time). 

* Replacing [Spring Engine](https://springrts.com/): This engine will be far more constrained than spring for performance and time reason. There will not be a scripting language like Lua to mod. However I will make sure everything that has been done in the most popular mods of spring will be doable here. 

## Features

- Map editor
    - [x] raise, lower, flatten, blur, noise pencil
    - [ ] texture layer
    - [ ] changeable map size/water level
    - [ ] resources placing
    - [ ] save and load from file system (try the current save, load button at your own risk)
    - [ ] save and load from online repository  

- Unit editor
    - [x] basic imgui editor to create node hierarchy
    - [x] joint selection (Fix, weapon aim, wheel)
    - [x] mesh selection
    - [x] parameter editing (speed, turn rate, health...)
    - [ ] save/load from filesystem
    - [ ] graphical editor
    - [ ] integration with online repository

- Mod editor
    - [ ] N/A

- Online repository
    - [ ] N/A

- Multiplayer
    - [x] working PoC localhost tcp client/server (1/2 will fry your computer and consume 1 Mo/s) 
    - [ ] optimise to reach 300 Ko/sec with 100k units moving
    - [ ] lobby
    - [ ] live swapping host if current host disconnect
    - [ ] simple chat
    - [ ] ability to draw on the map, and tag place/units
- Rendering 
    - [x] basic display of 3D models (with instancing)
    - [x] basic display a heightmap (from [this blog](http://casual-effects.blogspot.com/2014/04/fast-terrain-rendering-with-continuous.html)) 
    - [x] fxaa (from [this blog](http://blog.simonrodriguez.fr/articles/30-07-2016_implementing_fxaa.html))
    - [x] screen space reflection for water
    - [ ] materials
    - [ ] particles
    - [ ] sounds
    - [ ] animation system
    - [ ] inverted kinematics

- Simulation 
    - [x] working draft of collision detection
    - [x] working draft of flock behavior
    - [x] basic health and damage computation
    - [x] construction and repair
    - [ ] detection (visual and radar)
    - [ ] user-defined AI for units (follow target, formation, flee, target selection etc)
    - [ ] resource counting
    - [ ] integrating pathfinding (I already built a working flowfield pathfinding [here](https://github.com/Ruddle/rustfield))
    
- UI
    - [x] select units (picking and rectangle selection)
    - [x] give move order
    - [x] give build order
    - [x] display current order (Hold LShift)
    - [ ] give user defined, unit specific order
    - [ ] display info about game state (current resources etc)
    - [ ] display info about selected units
    - [ ] display statistics


## Supported platforms

 * Windows (dx12 and vulkan)
 * Linux (vulkan)
 * Mac Untested (*should just work TM*)

All thanks to WebGPU and [wgpu-rs](https://github.com/gfx-rs/wgpu-rs) (and [winit](https://github.com/rust-windowing/winit)). No efforts was made by me in this regard. If anything I posted a stupid issue there that was solved in 0.03 second.
 
## Build

```text
git clone https://github.com/Ruddle/oxidator
cd oxidator
cargo run --release
```

## Fun stuff if you clone this

Shaders are automatically hot-reloaded if you change any .frag or .vert file and you compiled with either shaderc 
```text
cargo run --features use_shaderc --release
```
or glsl_to_spirv
```text
cargo run --features use_glsl_to_spirv --release
```

Logs can be enabled via the [environment variable RUST_LOG](https://github.com/sebasmagri/env_logger/).
for instance:
```text
RUST_LOG=oxidator=debug cargo run --release
```

My go-to command when I develop:
```text
RUST_LOG=oxidator=debug cargo run --features use_shaderc --release
```

You can also compile all the shaders to spirv without starting the full application. The compiled shaders will be saved in /src/shader/compiled. This folder is used when no shader compiler flag is enabled.

```text
cargo run --features use_shaderc --release compile
```


## Roadmap

I push features that I feel like pushing in the moment. 
This project could (and probably will) lose its only contributor any time before any playable milestone is reached.

================================================
FILE: src/asset/3d/arrow.obj
================================================
# Blender v2.80 (sub 75) OBJ File: ''
# www.blender.org
mtllib arrow.mtl
o Cube
v -0.000000 0.020000 1.000000
v -0.000000 -0.020000 1.000000
v 0.200000 0.020000 -1.000000
v 0.200000 -0.020000 -1.000000
v -0.200000 0.020000 -1.000000
v -0.200000 -0.020000 -1.000000
v 0.631076 -0.020000 0.361554
v -0.648924 0.020000 0.361554
v -0.648924 -0.020000 0.361554
v 0.631076 0.020000 0.361554
v 0.200000 -0.020000 0.359655
v -0.200000 0.020000 0.359655
v -0.200000 -0.020000 0.359655
v 0.200000 0.020000 0.359655
vt 0.455043 0.250000
vt 0.625000 0.000000
vt 0.455043 0.000000
vt 0.375000 0.500000
vt 0.625000 0.330043
vt 0.375000 0.330043
vt 0.375000 0.750000
vt 0.625000 0.500000
vt 0.576873 0.750000
vt 0.576873 1.000000
vt 0.625000 1.000000
vt 0.625000 0.750000
vt 0.875000 0.701874
vt 0.625000 0.701874
vt 0.875000 0.669957
vt 0.625000 0.669957
vt 0.544957 1.000000
vt 0.544957 0.750000
vt 0.375000 0.298127
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.375000 0.000000
vt 0.423127 0.250000
vt 0.423127 0.000000
vt 0.375000 1.000000
vt 0.875000 0.500000
vt 0.625000 0.500000
vt 0.625000 0.298127
vt 0.625000 0.250000
vt 0.625000 0.750000
vt 0.875000 0.750000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 0.0000
vn -0.7112 0.0000 -0.7030
vn -0.0044 0.0000 1.0000
vn 0.7013 0.0000 -0.7128
vn -1.0000 0.0000 0.0000
vn 0.0042 0.0000 1.0000
usemtl Material
s off
f 12/1/1 3/2/1 14/3/1
f 6/4/2 12/5/2 13/6/2
f 4/7/3 5/8/3 6/4/3
f 7/9/4 9/10/4 2/11/4
f 2/12/5 10/13/5 7/14/5
f 7/14/6 14/15/6 11/16/6
f 13/17/4 7/9/4 11/18/4
f 9/19/7 1/20/7 2/21/7
f 1/22/1 8/23/1 10/24/1
f 6/25/4 11/18/4 4/7/4
f 11/16/8 3/26/8 4/27/8
f 13/6/9 8/28/9 9/19/9
f 10/24/1 12/1/1 14/3/1
f 12/1/1 5/29/1 3/2/1
f 6/4/2 5/8/2 12/5/2
f 4/7/3 3/30/3 5/8/3
f 2/12/5 1/31/5 10/13/5
f 7/14/6 10/13/6 14/15/6
f 13/17/4 9/10/4 7/9/4
f 9/19/7 8/28/7 1/20/7
f 6/25/4 13/17/4 11/18/4
f 11/16/8 14/15/8 3/26/8
f 13/6/9 12/5/9 8/28/9
f 10/24/1 8/23/1 12/1/1


================================================
FILE: src/asset/3d/axis_debug.obj
================================================
# Blender v2.80 (sub 75) OBJ File: 'axis_debug.blend'
# www.blender.org
o Cylinder.002
v -0.078259 0.000390 0.500086
v -0.078259 0.000390 1.000086
v -0.039173 0.068088 0.500086
v -0.039173 0.068088 1.000086
v 0.038998 0.068088 0.500086
v 0.038998 0.068088 1.000086
v 0.078084 0.000390 0.500086
v 0.078084 0.000390 1.000086
v 0.038998 -0.067308 0.500086
v 0.038998 -0.067308 1.000086
v -0.039173 -0.067308 0.500086
v -0.039173 -0.067308 1.000086
v 0.499912 0.500390 0.500086
v 0.499912 0.500390 -0.499914
v 0.499912 -0.499610 0.500086
v 0.499912 -0.499610 -0.499914
v -0.500088 0.500390 0.500086
v -0.500088 0.500390 -0.499914
v -0.500088 -0.499610 0.500086
v -0.500088 -0.499610 -0.499914
v 0.499912 0.078561 0.000086
v 0.999912 0.078561 0.000086
v 0.499912 0.039476 -0.067612
v 0.999912 0.039476 -0.067612
v 0.499912 -0.038696 -0.067612
v 0.999912 -0.038696 -0.067612
v 0.499912 -0.077781 0.000086
v 0.999912 -0.077781 0.000086
v 0.499912 -0.038696 0.067785
v 0.999912 -0.038696 0.067785
v 0.499912 0.039476 0.067785
v 0.999912 0.039476 0.067785
v -0.078259 0.500390 0.000086
v -0.078259 1.000390 0.000086
v -0.039173 0.500390 -0.067612
v -0.039173 1.000390 -0.067612
v 0.038998 0.500390 -0.067612
v 0.038998 1.000390 -0.067612
v 0.078084 0.500390 0.000086
v 0.078084 1.000390 0.000086
v 0.038998 0.500390 0.067785
v 0.038998 1.000390 0.067785
v -0.039173 0.500390 0.067785
v -0.039173 1.000390 0.067785
v 0.554715 0.440554 -0.412883
v 0.554715 0.294033 -0.412883
v 0.554715 0.005957 -0.062722
v 0.554715 -0.285843 -0.412883
v 0.554715 -0.433606 -0.412883
v 0.554715 -0.068545 0.025439
v 0.554715 -0.407530 0.433960
v 0.554715 -0.259768 0.433960
v 0.554715 0.005957 0.111117
v 0.554715 0.270440 0.433960
v 0.554715 0.416961 0.433960
v 0.554715 0.079218 0.025439
v 0.356042 0.440554 -0.412883
v 0.356042 0.294033 -0.412883
v 0.356042 0.005957 -0.062722
v 0.356042 -0.285843 -0.412883
v 0.356042 -0.433606 -0.412883
v 0.356042 -0.068545 0.025439
v 0.356042 -0.407530 0.433960
v 0.356042 -0.259768 0.433960
v 0.356042 0.005957 0.111117
v 0.356042 0.270440 0.433960
v 0.356042 0.416961 0.433960
v 0.356042 0.079218 0.025439
v 0.356042 0.440554 -0.412883
v 0.368459 0.466882 -0.425300
v 0.356042 0.294033 -0.412883
v 0.368459 0.288169 -0.425300
v 0.356042 0.005957 -0.062722
v 0.368459 0.005896 -0.082192
v 0.356042 -0.285843 -0.412883
v 0.368459 -0.280028 -0.425300
v 0.356042 -0.433606 -0.412883
v 0.368459 -0.460108 -0.425300
v 0.356042 -0.068545 0.025439
v 0.368459 -0.084692 0.025454
v 0.356042 -0.407530 0.433960
v 0.368459 -0.433969 0.446377
v 0.356042 -0.259768 0.433960
v 0.368459 -0.253906 0.446377
v 0.356042 0.005957 0.111117
v 0.368459 0.005935 0.130683
v 0.356042 0.270440 0.433960
v 0.368459 0.264561 0.446377
v 0.356042 0.416961 0.433960
v 0.368459 0.443338 0.446377
v 0.356042 0.079218 0.025439
v 0.368459 0.095319 0.025428
v 0.368459 0.466882 -0.425300
v 0.542298 0.466882 -0.425300
v 0.368459 0.288169 -0.425300
v 0.542298 0.288169 -0.425300
v 0.368459 0.005896 -0.082192
v 0.542298 0.005896 -0.082192
v 0.368459 -0.280028 -0.425300
v 0.542298 -0.280028 -0.425300
v 0.368459 -0.460108 -0.425300
v 0.542298 -0.460108 -0.425300
v 0.368459 -0.084692 0.025454
v 0.542298 -0.084693 0.025454
v 0.368459 -0.433969 0.446377
v 0.542298 -0.433969 0.446377
v 0.368459 -0.253906 0.446377
v 0.542298 -0.253906 0.446377
v 0.368459 0.005935 0.130683
v 0.542298 0.005935 0.130683
v 0.368459 0.264561 0.446377
v 0.542298 0.264561 0.446377
v 0.368459 0.443338 0.446377
v 0.542298 0.443338 0.446377
v 0.368459 0.095319 0.025428
v 0.542298 0.095319 0.025428
v 0.542298 0.466882 -0.425300
v 0.554715 0.440554 -0.412883
v 0.542298 0.288169 -0.425300
v 0.554715 0.294033 -0.412883
v 0.542298 0.005896 -0.082192
v 0.554715 0.005957 -0.062722
v 0.542298 -0.280028 -0.425300
v 0.554715 -0.285843 -0.412883
v 0.542298 -0.460108 -0.425300
v 0.554715 -0.433606 -0.412883
v 0.542298 -0.084693 0.025454
v 0.554715 -0.068545 0.025439
v 0.542298 -0.433969 0.446377
v 0.554715 -0.407530 0.433960
v 0.542298 -0.253906 0.446377
v 0.554715 -0.259768 0.433960
v 0.542298 0.005935 0.130683
v 0.554715 0.005957 0.111117
v 0.542298 0.264561 0.446377
v 0.554715 0.270440 0.433960
v 0.542298 0.443338 0.446377
v 0.554715 0.416961 0.433960
v 0.542298 0.095319 0.025428
v 0.554715 0.079218 0.025439
v -0.376351 0.550070 0.415498
v -0.062199 0.550070 0.015669
v -0.062199 0.550070 -0.431345
v 0.059488 0.550070 -0.431345
v 0.059488 0.550070 0.016911
v 0.373639 0.550070 0.415498
v 0.227118 0.550070 0.415498
v -0.000114 0.550070 0.123697
v -0.229830 0.550070 0.415498
v -0.376351 0.351397 0.415498
v -0.062199 0.351397 0.015669
v -0.062199 0.351397 -0.431345
v 0.059488 0.351397 -0.431345
v 0.059488 0.351397 0.016910
v 0.373639 0.351397 0.415498
v 0.227118 0.351397 0.415498
v -0.000114 0.351397 0.123697
v -0.229830 0.351397 0.415498
v -0.376351 0.351397 0.415498
v -0.401898 0.363814 0.427915
v -0.062199 0.351397 0.015669
v -0.074617 0.363814 0.011374
v -0.062199 0.351397 -0.431345
v -0.074617 0.363814 -0.443762
v 0.059488 0.351397 -0.431345
v 0.071905 0.363814 -0.443762
v 0.059488 0.351397 0.016910
v 0.071905 0.363814 0.012605
v 0.373639 0.351397 0.415498
v 0.399236 0.363814 0.427915
v 0.227118 0.351397 0.415498
v 0.221049 0.363814 0.427915
v -0.000114 0.351397 0.123697
v -0.000167 0.363814 0.143839
v -0.229830 0.351397 0.415498
v -0.223802 0.363814 0.427915
v -0.401898 0.363814 0.427915
v -0.401898 0.537653 0.427915
v -0.074617 0.363814 0.011374
v -0.074617 0.537653 0.011374
v -0.074617 0.363814 -0.443762
v -0.074616 0.537653 -0.443762
v 0.071905 0.363814 -0.443762
v 0.071905 0.537653 -0.443762
v 0.071905 0.363814 0.012605
v 0.071905 0.537653 0.012605
v 0.399236 0.363814 0.427915
v 0.399236 0.537653 0.427915
v 0.221049 0.363814 0.427915
v 0.221049 0.537653 0.427915
v -0.000167 0.363814 0.143839
v -0.000167 0.537653 0.143839
v -0.223802 0.363814 0.427915
v -0.223802 0.537653 0.427915
v -0.401898 0.537653 0.427915
v -0.376351 0.550070 0.415498
v -0.074617 0.537653 0.011374
v -0.062199 0.550070 0.015669
v -0.074616 0.537653 -0.443762
v -0.062199 0.550070 -0.431345
v 0.071905 0.537653 -0.443762
v 0.059488 0.550070 -0.431345
v 0.071905 0.537653 0.012605
v 0.059488 0.550070 0.016911
v 0.399236 0.537653 0.427915
v 0.373639 0.550070 0.415498
v 0.221049 0.537653 0.427915
v 0.227118 0.550070 0.415498
v -0.000167 0.537653 0.143839
v -0.000114 0.550070 0.123697
v -0.223802 0.537653 0.427915
v -0.229830 0.550070 0.415498
v 0.349194 -0.424488 0.550865
v -0.380928 -0.424488 0.550865
v 0.157972 0.313085 0.550865
v -0.380928 0.313085 0.550865
v -0.380928 0.422355 0.550865
v 0.382720 0.422355 0.550865
v -0.156179 -0.315218 0.550865
v 0.349194 -0.315218 0.550865
v 0.349194 -0.424488 0.352193
v -0.380928 -0.424488 0.352193
v 0.157972 0.313085 0.352193
v -0.380928 0.313085 0.352193
v -0.380928 0.422355 0.352193
v 0.382720 0.422355 0.352193
v -0.156179 -0.315218 0.352193
v 0.349194 -0.315218 0.352193
v 0.349194 -0.424488 0.352193
v 0.361611 -0.436905 0.364610
v -0.380928 -0.424488 0.352193
v -0.405379 -0.436905 0.364610
v 0.157972 0.313085 0.352193
v 0.133521 0.300668 0.364610
v -0.380928 0.313085 0.352193
v -0.393345 0.300668 0.364610
v -0.380928 0.422355 0.352193
v -0.393345 0.434772 0.364610
v 0.382720 0.422355 0.352193
v 0.407171 0.434772 0.364610
v -0.156179 -0.315218 0.352193
v -0.131729 -0.302801 0.364610
v 0.349194 -0.315218 0.352193
v 0.361611 -0.302801 0.364610
v 0.361611 -0.436905 0.364610
v 0.361611 -0.436905 0.538448
v -0.405379 -0.436905 0.364610
v -0.405379 -0.436905 0.538448
v 0.133521 0.300668 0.364610
v 0.133521 0.300668 0.538448
v -0.393345 0.300668 0.364610
v -0.393345 0.300668 0.538448
v -0.393345 0.434772 0.364610
v -0.393345 0.434772 0.538448
v 0.407171 0.434772 0.364610
v 0.407171 0.434772 0.538448
v -0.131729 -0.302801 0.364610
v -0.131729 -0.302801 0.538448
v 0.361611 -0.302801 0.364610
v 0.361611 -0.302801 0.538448
v 0.361611 -0.436905 0.538448
v 0.349194 -0.424488 0.550865
v -0.405379 -0.436905 0.538448
v -0.380928 -0.424488 0.550865
v 0.133521 0.300668 0.538448
v 0.157972 0.313085 0.550865
v -0.393345 0.300668 0.538448
v -0.380928 0.313085 0.550865
v -0.393345 0.434772 0.538448
v -0.380928 0.422355 0.550865
v 0.407171 0.434772 0.538448
v 0.382720 0.422355 0.550865
v -0.131729 -0.302801 0.538448
v -0.156179 -0.315218 0.550865
v 0.361611 -0.302801 0.538448
v 0.349194 -0.315218 0.550865
vt 0.831726 0.844892
vt 0.841085 0.823278
vt 0.831726 0.823278
vt 0.892429 0.844892
vt 0.881622 0.823278
vt 0.892429 0.823278
vt 0.841085 0.844892
vt 0.831726 0.823278
vt 0.841085 0.823278
vt 0.831726 0.844892
vt 0.822366 0.823278
vt 0.822366 0.832556
vt 0.831726 0.827152
vt 0.841085 0.832556
vt 0.881622 0.844892
vt 0.892429 0.823278
vt 0.881622 0.823278
vt 0.822366 0.844892
vt 0.822366 0.823278
vt 0.831726 0.827152
vt 0.822366 0.832556
vt 0.822366 0.843363
vt 0.225312 0.847355
vt 0.114117 0.736160
vt 0.225312 0.736160
vt 0.833085 0.104738
vt 0.936375 0.072440
vt 0.833085 0.072440
vt 0.060544 0.238768
vt 0.147219 0.066745
vt 0.147219 0.238767
vt 0.900850 0.768835
vt 0.762601 0.907084
vt 0.900850 0.907084
vt 0.140228 0.927705
vt 0.061206 0.902996
vt 0.140228 0.902996
vt 0.269790 0.745180
vt 0.158595 0.779949
vt 0.158595 0.745180
vt 0.190557 0.066745
vt 0.202501 0.152756
vt 0.190557 0.152756
vt 0.202501 0.066745
vt 0.223506 0.152756
vt 0.223506 0.066745
vt 0.232567 0.152756
vt 0.190557 0.152756
vt 0.179722 0.066745
vt 0.190557 0.066745
vt 0.158955 0.159480
vt 0.164822 0.152756
vt 0.170690 0.159480
vt 0.179722 0.152756
vt 0.158054 0.066745
vt 0.158054 0.152756
vt 0.147219 0.066745
vt 0.147219 0.159480
vt 0.158955 0.172927
vt 0.147219 0.172927
vt 0.895059 0.123781
vt 0.946704 0.119744
vt 0.895059 0.119744
vt 0.895059 0.111669
vt 0.946704 0.107632
vt 0.895059 0.107632
vt 0.895059 0.111669
vt 0.880693 0.090775
vt 0.876656 0.088589
vt 0.880693 0.086402
vt 0.946704 0.111669
vt 0.895059 0.119744
vt 0.946704 0.119744
vt 0.880693 0.090775
vt 0.888768 0.090775
vt 0.888768 0.086402
vt 0.114540 0.172228
vt 0.084700 0.271120
vt 0.061642 0.282111
vt 0.126166 0.184444
vt 0.190303 0.220783
vt 0.167439 0.231681
vt 0.137598 0.161237
vt 0.057573 0.108538
vt 0.126166 0.148415
vt 0.193984 0.043516
vt 0.080631 0.097547
vt 0.171120 0.054414
vt 0.118423 0.284705
vt 0.148263 0.185814
vt 0.095365 0.295696
vt 0.159889 0.198029
vt 0.224026 0.234368
vt 0.201162 0.245267
vt 0.171322 0.174823
vt 0.091296 0.122124
vt 0.159889 0.162000
vt 0.227707 0.057101
vt 0.114354 0.111133
vt 0.204843 0.068000
vt 0.600272 0.443762
vt 0.571818 0.514908
vt 0.546948 0.504889
vt 0.610389 0.469969
vt 0.674252 0.556174
vt 0.649382 0.546155
vt 0.620928 0.451825
vt 0.600272 0.350859
vt 0.620927 0.359180
vt 0.540816 0.529686
vt 0.569270 0.458539
vt 0.515945 0.519666
vt 0.579387 0.484747
vt 0.643250 0.570952
vt 0.618379 0.560933
vt 0.589925 0.466603
vt 0.569269 0.365636
vt 0.589925 0.373958
vt 0.416070 0.598978
vt 0.522951 0.657033
vt 0.399019 0.607106
vt 0.501853 0.633537
vt 0.546574 0.565319
vt 0.525476 0.541823
vt 0.638048 0.602170
vt 0.655100 0.594043
vt 0.522951 0.615857
vt 0.416070 0.557802
vt 0.399019 0.565930
vt 0.501853 0.592361
vt 0.546574 0.524144
vt 0.525476 0.500647
vt 0.638048 0.560995
vt 0.655099 0.552867
vt 0.841085 0.844892
vt 0.881622 0.844892
vt 0.822366 0.844892
vt 0.841085 0.843363
vt 0.831726 0.848766
vt 0.822366 0.843363
vt 0.892429 0.844892
vt 0.831726 0.848766
vt 0.841085 0.843363
vt 0.841085 0.832556
vt 0.114117 0.847355
vt 0.936375 0.104738
vt 0.060544 0.066745
vt 0.762601 0.768835
vt 0.061206 0.927705
vt 0.269790 0.779949
vt 0.232567 0.066745
vt 0.170690 0.172927
vt 0.158955 0.172927
vt 0.164822 0.179651
vt 0.147219 0.152756
vt 0.153087 0.152756
vt 0.158955 0.159480
vt 0.153087 0.179651
vt 0.946704 0.123781
vt 0.946704 0.111669
vt 0.888768 0.086402
vt 0.892805 0.088589
vt 0.888768 0.090775
vt 0.892805 0.088589
vt 0.880693 0.086402
vt 0.876656 0.088589
vt 0.201820 0.065013
vt 0.227707 0.057101
vt 0.229708 0.051720
vt 0.159889 0.162000
vt 0.204843 0.068000
vt 0.113154 0.107277
vt 0.157772 0.157121
vt 0.091296 0.122124
vt 0.114354 0.111133
vt 0.143636 0.186169
vt 0.085053 0.120672
vt 0.095365 0.295696
vt 0.148263 0.185814
vt 0.117231 0.285994
vt 0.089132 0.299387
vt 0.159889 0.198029
vt 0.118423 0.284705
vt 0.198136 0.247429
vt 0.157778 0.201237
vt 0.224026 0.234368
vt 0.201162 0.245267
vt 0.171726 0.172774
vt 0.226034 0.234131
vt 0.171322 0.174823
vt 0.172312 0.053126
vt 0.229708 0.051720
vt 0.200200 0.039833
vt 0.128264 0.145233
vt 0.201820 0.065013
vt 0.113154 0.107277
vt 0.157772 0.157121
vt 0.055545 0.108785
vt 0.083646 0.095390
vt 0.114128 0.174281
vt 0.085053 0.120672
vt 0.059624 0.287500
vt 0.143636 0.186169
vt 0.087723 0.274106
vt 0.089132 0.299387
vt 0.128270 0.189350
vt 0.117231 0.285994
vt 0.168629 0.235541
vt 0.157778 0.201237
vt 0.196527 0.222243
vt 0.198136 0.247429
vt 0.142219 0.160886
vt 0.226034 0.234131
vt 0.171726 0.172774
vt 0.193984 0.043516
vt 0.172312 0.053126
vt 0.200200 0.039833
vt 0.126166 0.148415
vt 0.171120 0.054414
vt 0.083646 0.095390
vt 0.128264 0.145233
vt 0.057573 0.108538
vt 0.080631 0.097547
vt 0.114128 0.174281
vt 0.055545 0.108785
vt 0.061642 0.282111
vt 0.114540 0.172228
vt 0.087723 0.274106
vt 0.059624 0.287500
vt 0.126166 0.184444
vt 0.084700 0.271120
vt 0.168629 0.235541
vt 0.128270 0.189350
vt 0.190303 0.220783
vt 0.167439 0.231681
vt 0.142219 0.160886
vt 0.196527 0.222243
vt 0.137598 0.161237
vt 0.593970 0.465639
vt 0.643250 0.570952
vt 0.649524 0.574349
vt 0.589925 0.373958
vt 0.589925 0.466603
vt 0.593970 0.371310
vt 0.569269 0.365636
vt 0.569100 0.455875
vt 0.569099 0.361290
vt 0.515945 0.519666
vt 0.569270 0.458539
vt 0.543784 0.531751
vt 0.513538 0.519566
vt 0.579387 0.484747
vt 0.540816 0.529686
vt 0.619293 0.562170
vt 0.581333 0.488002
vt 0.618379 0.560933
vt 0.621098 0.452708
vt 0.649524 0.574349
vt 0.676651 0.561418
vt 0.593970 0.371310
vt 0.593970 0.465639
vt 0.596227 0.348360
vt 0.621097 0.358379
vt 0.596227 0.442944
vt 0.569099 0.361290
vt 0.540665 0.506635
vt 0.569100 0.455875
vt 0.570911 0.518820
vt 0.513538 0.519566
vt 0.581333 0.488002
vt 0.543784 0.531751
vt 0.646421 0.549240
vt 0.608460 0.475071
vt 0.619293 0.562170
vt 0.674252 0.556174
vt 0.621098 0.452708
vt 0.676651 0.561418
vt 0.620927 0.359180
vt 0.620928 0.451825
vt 0.600272 0.350859
vt 0.621097 0.358379
vt 0.596227 0.442944
vt 0.596227 0.348360
vt 0.546948 0.504889
vt 0.600272 0.443762
vt 0.570911 0.518820
vt 0.540665 0.506635
vt 0.610389 0.469969
vt 0.571818 0.514908
vt 0.646421 0.549240
vt 0.608460 0.475071
vt 0.649382 0.546155
vt 0.394973 0.568578
vt 0.522951 0.615857
vt 0.399019 0.565930
vt 0.548787 0.529313
vt 0.525163 0.621026
vt 0.638048 0.560995
vt 0.546574 0.524144
vt 0.638218 0.565341
vt 0.655099 0.552867
vt 0.659145 0.555366
vt 0.525476 0.500647
vt 0.499640 0.592339
vt 0.523264 0.500625
vt 0.416070 0.557802
vt 0.501853 0.592361
vt 0.089836 0.283127
vt 0.110933 0.272352
vt 0.110763 0.273152
vt 0.525164 0.657055
vt 0.394973 0.568578
vt 0.394973 0.604607
vt 0.548787 0.565342
vt 0.525163 0.621026
vt 0.638218 0.601370
vt 0.548787 0.529313
vt 0.659145 0.591395
vt 0.638218 0.565341
vt 0.523264 0.536654
vt 0.659145 0.555366
vt 0.499640 0.628367
vt 0.523264 0.500625
vt 0.415900 0.594632
vt 0.499640 0.592339
vt 0.415900 0.558603
vt 0.522951 0.657033
vt 0.394973 0.604607
vt 0.399019 0.607106
vt 0.548787 0.565342
vt 0.525164 0.657055
vt 0.638048 0.602170
vt 0.546574 0.565319
vt 0.655100 0.594043
vt 0.638218 0.601370
vt 0.525476 0.541823
vt 0.659145 0.591395
vt 0.499640 0.628367
vt 0.523264 0.536654
vt 0.416070 0.598978
vt 0.501853 0.633537
vt 0.415900 0.594632
vt 0.415900 0.558603
vt 0.093881 0.280479
vn -0.8660 0.5000 0.0000
vn 0.0000 1.0000 -0.0000
vn 0.8660 0.5000 -0.0000
vn 0.8660 -0.5000 -0.0000
vn -0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn -0.8660 -0.5000 0.0000
vn 0.0000 0.0000 -1.0000
vn -1.0000 0.0000 -0.0000
vn 1.0000 -0.0000 0.0000
vn 0.0000 0.8660 -0.5000
vn 0.0000 -0.8660 -0.5000
vn -0.0000 -0.8660 0.5000
vn -0.0000 0.8660 0.5000
vn -0.8660 0.0000 -0.5000
vn 0.8660 -0.0000 -0.5000
vn 0.8660 -0.0000 0.5000
vn -0.8660 0.0000 0.5000
vn -0.7417 -0.2864 -0.6065
vn -0.9198 0.3549 -0.1674
vn -0.8431 -0.0017 -0.5377
vn -0.7412 0.2847 -0.6079
vn -0.9206 -0.3537 -0.1657
vn -0.7927 -0.6096 0.0005
vn -0.9203 -0.3541 0.1663
vn -0.7417 0.2863 0.6065
vn -0.8443 -0.0006 0.5358
vn -0.7419 -0.2869 0.6060
vn -0.9200 0.3545 0.1669
vn -0.7919 0.6106 -0.0004
vn 0.0000 -0.4270 -0.9042
vn 0.0000 0.9044 -0.4266
vn 0.0000 -0.0031 -1.0000
vn 0.0000 0.4241 -0.9056
vn 0.0000 -0.9055 -0.4243
vn 0.0000 -1.0000 0.0009
vn 0.0000 -0.9051 0.4251
vn 0.0000 0.4269 0.9043
vn 0.0000 -0.0011 1.0000
vn 0.0000 -0.4279 0.9038
vn 0.0000 0.9048 0.4259
vn 0.0000 1.0000 -0.0007
vn 0.9198 0.3549 -0.1673
vn 0.7417 -0.2864 -0.6065
vn 0.9198 0.3549 -0.1674
vn 0.8431 -0.0017 -0.5377
vn 0.7412 0.2847 -0.6079
vn 0.9206 -0.3537 -0.1657
vn 0.7927 -0.6096 0.0005
vn 0.9203 -0.3541 0.1663
vn 0.7417 0.2863 0.6065
vn 0.8443 -0.0006 0.5358
vn 0.7419 -0.2869 0.6060
vn 0.9200 0.3545 0.1669
vn 0.7919 0.6106 -0.0004
vn -0.6491 -0.7268 -0.2245
vn -0.3602 -0.9163 0.1751
vn -0.4082 -0.8165 -0.4082
vn 0.4082 -0.8165 -0.4082
vn 0.6489 -0.7269 -0.2250
vn 0.3599 -0.9165 0.1746
vn -0.2934 -0.7439 0.6005
vn -0.0014 -0.8512 0.5248
vn 0.2921 -0.7434 0.6016
vn -0.9451 0.0000 -0.3269
vn -0.8994 0.0000 0.4371
vn -0.7071 0.0000 -0.7071
vn 0.7071 0.0000 -0.7071
vn 0.9448 0.0000 -0.3276
vn 0.8997 0.0000 0.4364
vn -0.4391 0.0000 0.8984
vn -0.0026 0.0000 1.0000
vn 0.4367 0.0000 0.8996
vn -0.3602 0.9163 0.1751
vn -0.6491 0.7268 -0.2245
vn -0.4082 0.8165 -0.4082
vn 0.4082 0.8165 -0.4082
vn 0.6489 0.7269 -0.2250
vn 0.3599 0.9165 0.1746
vn -0.2934 0.7439 0.6005
vn -0.0014 0.8512 0.5248
vn 0.2921 0.7434 0.6016
vn 0.4082 -0.4082 -0.8165
vn -0.3677 -0.1867 -0.9109
vn -0.4082 -0.4082 -0.8165
vn -0.4082 0.4082 -0.8165
vn 0.3677 0.1867 -0.9109
vn 0.4082 0.4082 -0.8165
vn -0.8916 -0.4528 0.0000
vn 0.7071 -0.7071 0.0000
vn -0.7071 -0.7071 0.0000
vn -0.7071 0.7071 0.0000
vn 0.8916 0.4528 0.0000
vn 0.7071 0.7071 0.0000
vn -0.3677 -0.1867 0.9109
vn 0.4082 -0.4082 0.8165
vn -0.3677 -0.1868 0.9109
vn -0.4082 -0.4082 0.8165
vn -0.4082 0.4082 0.8165
vn 0.3677 0.1867 0.9109
vn 0.4082 0.4082 0.8165
s off
f 2/1/1 3/2/1 1/3/1
f 4/4/2 5/5/2 3/6/2
f 6/7/3 7/8/3 5/9/3
f 8/10/4 9/11/4 7/8/4
f 10/12/5 8/13/5 6/14/5
f 10/15/6 11/16/6 9/17/6
f 12/18/7 1/3/7 11/19/7
f 7/20/8 9/21/8 11/22/8
f 17/23/5 15/24/5 13/25/5
f 15/26/6 20/27/6 16/28/6
f 19/29/9 18/30/9 20/31/9
f 14/32/8 20/33/8 18/34/8
f 13/35/10 16/36/10 14/37/10
f 18/38/2 13/39/2 14/40/2
f 22/41/11 23/42/11 21/43/11
f 24/44/8 25/45/8 23/42/8
f 26/46/12 27/47/12 25/45/12
f 28/48/13 29/49/13 27/50/13
f 30/51/10 28/52/10 26/53/10
f 30/54/5 31/55/5 29/49/5
f 32/56/14 21/57/14 31/55/14
f 31/58/9 25/59/9 29/60/9
f 33/61/15 36/62/15 35/63/15
f 36/62/8 37/64/8 35/63/8
f 37/64/16 40/65/16 39/66/16
f 40/65/17 41/67/17 39/66/17
f 42/68/2 40/69/2 38/70/2
f 42/71/5 43/72/5 41/67/5
f 44/73/18 33/61/18 43/72/18
f 41/74/6 43/75/6 35/76/6
f 50/77/10 52/78/10 51/79/10
f 50/77/10 53/80/10 52/78/10
f 53/80/10 55/81/10 54/82/10
f 53/80/10 56/83/10 55/81/10
f 50/77/10 56/83/10 53/80/10
f 49/84/10 56/83/10 50/77/10
f 49/84/10 47/85/10 56/83/10
f 47/85/10 45/86/10 56/83/10
f 49/84/10 48/87/10 47/85/10
f 46/88/10 45/86/10 47/85/10
f 64/89/9 62/90/9 63/91/9
f 65/92/9 62/90/9 64/89/9
f 67/93/9 65/92/9 66/94/9
f 68/95/9 65/92/9 67/93/9
f 68/95/9 62/90/9 65/92/9
f 68/95/9 61/96/9 62/90/9
f 59/97/9 61/96/9 68/95/9
f 57/98/9 59/97/9 68/95/9
f 60/99/9 61/96/9 59/97/9
f 57/98/9 58/100/9 59/97/9
f 145/101/2 147/102/2 146/103/2
f 145/101/2 148/104/2 147/102/2
f 148/104/2 141/105/2 149/106/2
f 148/104/2 142/107/2 141/105/2
f 145/101/2 142/107/2 148/104/2
f 144/108/2 142/107/2 145/101/2
f 144/108/2 143/109/2 142/107/2
f 156/110/6 154/111/6 155/112/6
f 157/113/6 154/111/6 156/110/6
f 150/114/6 157/113/6 158/115/6
f 151/116/6 157/113/6 150/114/6
f 151/116/6 154/111/6 157/113/6
f 151/116/6 153/117/6 154/111/6
f 152/118/6 153/117/6 151/116/6
f 220/119/5 214/120/5 213/121/5
f 220/119/5 219/122/5 214/120/5
f 219/122/5 215/123/5 214/120/5
f 218/124/5 215/123/5 219/122/5
f 218/124/5 216/125/5 215/123/5
f 218/124/5 217/126/5 216/125/5
f 222/127/8 228/128/8 221/129/8
f 227/130/8 228/128/8 222/127/8
f 223/131/8 227/130/8 222/127/8
f 223/131/8 226/132/8 227/130/8
f 224/133/8 226/132/8 223/131/8
f 225/134/8 226/132/8 224/133/8
f 2/1/1 4/135/1 3/2/1
f 4/4/2 6/136/2 5/5/2
f 6/7/3 8/10/3 7/8/3
f 8/10/4 10/137/4 9/11/4
f 6/14/5 4/138/5 2/139/5
f 2/139/5 12/140/5 6/14/5
f 12/140/5 10/12/5 6/14/5
f 10/15/6 12/141/6 11/16/6
f 12/18/7 2/1/7 1/3/7
f 11/22/8 1/142/8 3/143/8
f 3/143/8 5/144/8 11/22/8
f 5/144/8 7/20/8 11/22/8
f 17/23/5 19/145/5 15/24/5
f 15/26/6 19/146/6 20/27/6
f 19/29/9 17/147/9 18/30/9
f 14/32/8 16/148/8 20/33/8
f 13/35/10 15/149/10 16/36/10
f 18/38/2 17/150/2 13/39/2
f 22/41/11 24/44/11 23/42/11
f 24/44/8 26/46/8 25/45/8
f 26/46/12 28/151/12 27/47/12
f 28/48/13 30/54/13 29/49/13
f 26/53/10 24/152/10 32/153/10
f 24/152/10 22/154/10 32/153/10
f 32/153/10 30/51/10 26/53/10
f 30/54/5 32/56/5 31/55/5
f 32/56/14 22/155/14 21/57/14
f 31/58/9 21/156/9 23/157/9
f 23/157/9 25/59/9 31/58/9
f 25/59/9 27/158/9 29/60/9
f 33/61/15 34/159/15 36/62/15
f 36/62/8 38/160/8 37/64/8
f 37/64/16 38/160/16 40/65/16
f 40/65/17 42/71/17 41/67/17
f 38/70/2 36/161/2 42/68/2
f 36/161/2 34/162/2 44/163/2
f 42/68/2 36/161/2 44/163/2
f 42/71/5 44/73/5 43/72/5
f 44/73/18 34/159/18 33/61/18
f 43/75/6 33/164/6 35/76/6
f 35/76/6 37/165/6 41/74/6
f 37/165/6 39/166/6 41/74/6
s 1
f 72/167/19 69/168/20 70/169/20
f 72/167/19 73/170/21 71/171/19
f 76/172/22 73/170/21 74/173/21
f 76/172/22 77/174/23 75/175/22
f 80/176/24 77/174/23 78/177/23
f 80/176/24 81/178/25 79/179/24
f 84/180/26 81/178/25 82/181/25
f 84/180/26 85/182/27 83/183/26
f 88/184/28 85/182/27 86/185/27
f 88/184/28 89/186/29 87/187/28
f 92/188/30 89/186/29 90/189/29
f 92/188/30 69/168/20 91/190/30
f 96/191/31 93/192/32 94/193/32
f 98/194/33 95/195/31 96/191/31
f 98/194/33 99/196/34 97/197/33
f 102/198/35 99/196/34 100/199/34
f 104/200/36 101/201/35 102/198/35
f 106/202/37 103/203/36 104/200/36
f 108/204/38 105/205/37 106/202/37
f 110/206/39 107/207/38 108/204/38
f 112/208/40 109/209/39 110/206/39
f 114/210/41 111/211/40 112/208/40
f 116/212/42 113/213/41 114/210/41
f 94/193/32 115/214/42 116/212/42
f 118/215/43 119/216/44 117/217/45
f 122/218/46 119/216/44 120/219/44
f 122/218/46 123/220/47 121/221/46
f 126/222/48 123/220/47 124/223/47
f 126/222/48 127/224/49 125/225/48
f 130/226/50 127/224/49 128/227/49
f 130/226/50 131/228/51 129/229/50
f 134/230/52 131/228/51 132/231/51
f 134/230/52 135/232/53 133/233/52
f 138/234/54 135/232/53 136/235/53
f 138/234/54 139/236/55 137/237/54
f 118/215/43 139/236/55 140/238/55
f 162/239/56 159/240/57 160/241/57
f 162/239/56 163/242/58 161/243/56
f 164/244/58 165/245/59 163/242/58
f 168/246/60 165/245/59 166/247/59
f 168/246/60 169/248/61 167/249/60
f 172/250/62 169/248/61 170/251/61
f 172/250/62 173/252/63 171/253/62
f 176/254/64 173/252/63 174/255/63
f 176/254/64 159/240/57 175/256/64
f 180/257/65 177/258/66 178/259/66
f 180/257/65 181/260/67 179/261/65
f 184/262/68 181/260/67 182/263/67
f 186/264/69 183/265/68 184/262/68
f 188/266/70 185/267/69 186/264/69
f 190/268/71 187/269/70 188/266/70
f 190/268/71 191/270/72 189/271/71
f 194/272/73 191/270/72 192/273/72
f 178/259/66 193/274/73 194/272/73
f 196/275/74 197/276/75 195/277/74
f 200/278/76 197/276/75 198/279/75
f 202/280/77 199/281/76 200/278/76
f 202/280/77 203/282/78 201/283/77
f 206/284/79 203/282/78 204/285/78
f 206/284/79 207/286/80 205/287/79
f 210/288/81 207/286/80 208/289/80
f 210/288/81 211/290/82 209/291/81
f 196/275/74 211/290/82 212/292/82
f 230/293/83 231/294/84 229/295/83
f 234/296/84 231/294/84 232/297/84
f 234/296/84 235/298/85 233/299/84
f 236/300/85 237/301/86 235/298/85
f 238/302/86 239/303/87 237/301/86
f 242/304/87 239/303/87 240/305/87
f 242/304/87 243/306/88 241/307/87
f 230/308/83 243/309/88 244/310/88
f 248/311/89 245/312/90 246/313/90
f 250/314/89 247/315/89 248/311/89
f 252/316/91 249/317/89 250/314/89
f 254/318/92 251/319/91 252/316/91
f 256/320/93 253/321/92 254/318/92
f 258/322/93 255/323/93 256/320/93
f 260/324/94 257/325/93 258/322/93
f 246/313/90 259/326/94 260/324/94
f 264/327/95 261/328/96 262/329/96
f 264/327/95 265/330/97 263/331/95
f 268/332/98 265/330/97 266/333/95
f 270/334/99 267/335/98 268/332/98
f 272/336/100 269/337/99 270/334/99
f 272/336/100 273/338/100 271/339/100
f 276/340/101 273/338/100 274/341/100
f 276/340/101 261/328/96 275/342/101
f 72/167/19 71/171/19 69/168/20
f 72/167/19 74/173/21 73/170/21
f 76/172/22 75/175/22 73/170/21
f 76/172/22 78/177/23 77/174/23
f 80/176/24 79/179/24 77/174/23
f 80/176/24 82/181/25 81/178/25
f 84/180/26 83/183/26 81/178/25
f 84/180/26 86/185/27 85/182/27
f 88/184/28 87/187/28 85/182/27
f 88/184/28 90/189/29 89/186/29
f 92/188/30 91/190/30 89/186/29
f 92/188/30 70/169/20 69/168/20
f 96/191/31 95/195/31 93/192/32
f 98/194/33 97/197/33 95/195/31
f 98/194/33 100/199/34 99/196/34
f 102/198/35 101/201/35 99/196/34
f 104/200/36 103/203/36 101/201/35
f 106/202/37 105/205/37 103/203/36
f 108/204/38 107/207/38 105/205/37
f 110/206/39 109/209/39 107/207/38
f 112/208/40 111/211/40 109/209/39
f 114/210/41 113/213/41 111/211/40
f 116/212/42 115/214/42 113/213/41
f 94/193/32 93/192/32 115/214/42
f 118/215/43 120/219/44 119/216/44
f 122/218/46 121/221/46 119/216/44
f 122/218/46 124/223/47 123/220/47
f 126/222/48 125/225/48 123/220/47
f 126/222/48 128/227/49 127/224/49
f 130/226/50 129/229/50 127/224/49
f 130/226/50 132/231/51 131/228/51
f 134/230/52 133/233/52 131/228/51
f 134/230/52 136/235/53 135/232/53
f 138/234/54 137/237/54 135/232/53
f 138/234/54 140/238/55 139/236/55
f 118/215/43 117/217/45 139/236/55
f 162/239/56 161/243/56 159/240/57
f 162/239/56 164/244/58 163/242/58
f 164/244/58 166/247/59 165/245/59
f 168/246/60 167/249/60 165/245/59
f 168/246/60 170/251/61 169/248/61
f 172/250/62 171/253/62 169/248/61
f 172/250/62 174/255/63 173/252/63
f 176/254/64 175/256/64 173/252/63
f 176/254/64 160/241/57 159/240/57
f 180/257/65 179/261/65 177/258/66
f 180/257/65 182/263/67 181/260/67
f 184/262/68 183/265/68 181/260/67
f 186/264/69 185/267/69 183/265/68
f 188/266/70 187/269/70 185/267/69
f 190/268/71 189/271/71 187/269/70
f 190/268/71 192/273/72 191/270/72
f 194/272/73 193/274/73 191/270/72
f 178/259/66 177/258/66 193/274/73
f 196/275/74 198/279/75 197/276/75
f 200/278/76 199/281/76 197/276/75
f 202/280/77 201/283/77 199/281/76
f 202/280/77 204/285/78 203/282/78
f 206/284/79 205/287/79 203/282/78
f 206/284/79 208/289/80 207/286/80
f 210/288/81 209/291/81 207/286/80
f 210/288/81 212/292/82 211/290/82
f 196/275/74 195/277/74 211/290/82
f 230/293/83 232/297/84 231/294/84
f 234/296/84 233/299/84 231/294/84
f 234/296/84 236/300/85 235/298/85
f 236/300/85 238/302/86 237/301/86
f 238/302/86 240/305/87 239/303/87
f 242/304/87 241/307/87 239/303/87
f 242/304/87 244/343/88 243/306/88
f 230/308/83 229/344/83 243/309/88
f 248/311/89 247/315/89 245/312/90
f 250/314/89 249/317/89 247/315/89
f 252/316/91 251/319/91 249/317/89
f 254/318/92 253/321/92 251/319/91
f 256/320/93 255/323/93 253/321/92
f 258/322/93 257/325/93 255/323/93
f 260/324/94 259/326/94 257/325/93
f 246/313/90 245/312/90 259/326/94
f 264/327/95 263/331/95 261/328/96
f 264/327/95 266/333/95 265/330/97
f 268/332/98 267/335/98 265/330/97
f 270/334/99 269/337/99 267/335/98
f 272/336/100 271/339/100 269/337/99
f 272/336/100 274/341/100 273/338/100
f 276/340/101 275/342/101 273/338/100
f 276/340/101 262/329/96 261/328/96


================================================
FILE: src/asset/3d/cube.obj
================================================
# Blender v2.80 (sub 75) OBJ File: ''
# www.blender.org
o Cube
v 0.500000 0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 0.500000
vt 0.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
s off
f 5/1/1 3/2/1 1/3/1
f 3/4/2 8/5/2 4/6/2
f 7/7/3 6/8/3 8/5/3
f 2/9/4 8/5/4 6/10/4
f 1/3/5 4/11/5 2/12/5
f 5/1/6 2/12/6 6/13/6
f 5/1/1 7/14/1 3/2/1
f 3/4/2 7/7/2 8/5/2
f 7/7/3 5/15/3 6/8/3
f 2/9/4 4/6/4 8/5/4
f 1/3/5 3/16/5 4/11/5
f 5/1/6 1/3/6 2/12/6


================================================
FILE: src/asset/3d/small_sphere.obj
================================================
# Blender v2.80 (sub 75) OBJ File: ''
# www.blender.org
o Icosphere
v 0.000000 -0.250000 0.000000
v 0.180902 -0.111805 0.131431
v -0.069097 -0.111805 0.212662
v -0.223607 -0.111804 0.000000
v -0.069097 -0.111805 -0.212662
v 0.180902 -0.111805 -0.131431
v 0.069097 0.111805 0.212662
v -0.180902 0.111805 0.131431
v -0.180902 0.111805 -0.131431
v 0.069097 0.111805 -0.212662
v 0.223607 0.111804 0.000000
v 0.000000 0.250000 0.000000
v -0.040614 -0.212664 0.124999
v 0.106331 -0.212664 0.077253
v 0.065717 -0.131434 0.202253
v 0.212662 -0.131434 0.000000
v 0.106331 -0.212664 -0.077253
v -0.131432 -0.212663 0.000000
v -0.172047 -0.131434 0.124999
v -0.040614 -0.212664 -0.124999
v -0.172047 -0.131434 -0.124999
v 0.065717 -0.131434 -0.202253
v 0.237764 0.000000 0.077253
v 0.237764 0.000000 -0.077253
v 0.000000 0.000000 0.250000
v 0.146946 0.000000 0.202254
v -0.237764 0.000000 0.077253
v -0.146946 0.000000 0.202254
v -0.146946 0.000000 -0.202254
v -0.237764 0.000000 -0.077253
v 0.146946 0.000000 -0.202254
v 0.000000 0.000000 -0.250000
v 0.172047 0.131434 0.124999
v -0.065717 0.131434 0.202253
v -0.212662 0.131434 0.000000
v -0.065717 0.131434 -0.202253
v 0.172047 0.131434 -0.124999
v 0.040614 0.212664 0.124999
v 0.131432 0.212663 0.000000
v -0.106331 0.212664 0.077253
v -0.106331 0.212664 -0.077253
v 0.040614 0.212664 -0.124999
vt 0.389468 0.000000
vt 0.650001 0.176206
vt 0.450001 0.176206
vt 0.650001 0.352414
vt 0.750000 0.323790
vt 0.250000 0.176208
vt 0.049999 0.176206
vt 1.049999 0.176206
vt 0.849999 0.176206
vt 0.700001 0.500000
vt 0.450001 0.352414
vt 0.550001 0.323789
vt 0.500000 0.500000
vt 0.250000 0.352416
vt 0.350000 0.323790
vt 0.299999 0.500000
vt 0.049999 0.352414
vt 0.150000 0.323790
vt 0.100000 0.500000
vt 0.849999 0.352414
vt 0.949999 0.323789
vt 0.900000 0.500000
vt 0.600000 0.500000
vt 0.400000 0.500000
vt 0.200001 0.500000
vt 0.000000 0.500000
vt 0.799999 0.500000
vt 0.549999 0.647586
vt 0.650000 0.676210
vt 0.549999 0.823794
vt 0.349999 0.647586
vt 0.449999 0.676211
vt 0.349999 0.823794
vt 0.150001 0.647586
vt 0.250000 0.676210
vt 0.150001 0.823794
vt 0.950001 0.647586
vt 1.050001 0.676211
vt 0.950001 0.823794
vt 0.750000 0.647584
vt 0.850000 0.676210
vt 0.750000 0.823792
vt 0.867720 1.000000
vt 1.150001 0.823794
vt 0.050001 0.676211
vt 1.349999 0.823794
vt 1.000000 0.500000
vt 1.049999 0.352414
vn 0.0000 -1.0000 0.0000
vn 0.4253 -0.8506 0.3090
vn -0.1625 -0.8506 0.5000
vn 0.7236 -0.4472 0.5257
vn 0.8506 -0.5257 0.0000
vn -0.5257 -0.8506 0.0000
vn -0.1625 -0.8506 -0.5000
vn 0.4253 -0.8506 -0.3090
vn 0.9510 0.0000 0.3090
vn -0.2764 -0.4472 0.8506
vn 0.2629 -0.5257 0.8090
vn 0.0000 0.0000 1.0000
vn -0.8944 -0.4472 0.0000
vn -0.6882 -0.5257 0.5000
vn -0.9510 0.0000 0.3090
vn -0.2764 -0.4472 -0.8506
vn -0.6882 -0.5257 -0.5000
vn -0.5878 0.0000 -0.8090
vn 0.7236 -0.4472 -0.5257
vn 0.2629 -0.5257 -0.8090
vn 0.5878 0.0000 -0.8090
vn 0.5878 0.0000 0.8090
vn -0.5878 0.0000 0.8090
vn -0.9510 0.0000 -0.3090
vn 0.0000 0.0000 -1.0000
vn 0.9510 0.0000 -0.3090
vn 0.2764 0.4472 0.8506
vn 0.6882 0.5257 0.5000
vn 0.1625 0.8506 0.5000
vn -0.7236 0.4472 0.5257
vn -0.2629 0.5257 0.8090
vn -0.4253 0.8506 0.3090
vn -0.7236 0.4472 -0.5257
vn -0.8506 0.5257 0.0000
vn -0.4253 0.8506 -0.3090
vn 0.2764 0.4472 -0.8506
vn -0.2629 0.5257 -0.8090
vn 0.1625 0.8506 -0.5000
vn 0.8944 0.4472 0.0000
vn 0.6882 0.5257 -0.5000
vn 0.5257 0.8506 0.0000
vn 0.0000 1.0000 0.0000
s 1
f 1/1/1 14/2/2 13/3/3
f 2/4/4 14/2/2 16/5/5
f 1/1/1 13/3/3 18/6/6
f 1/1/1 18/6/6 20/7/7
f 1/1/1 20/8/7 17/9/8
f 2/4/4 16/5/5 23/10/9
f 3/11/10 15/12/11 25/13/12
f 4/14/13 19/15/14 27/16/15
f 5/17/16 21/18/17 29/19/18
f 6/20/19 22/21/20 31/22/21
f 2/4/4 23/10/9 26/23/22
f 3/11/10 25/13/12 28/24/23
f 4/14/13 27/16/15 30/25/24
f 5/17/16 29/19/18 32/26/25
f 6/20/19 31/22/21 24/27/26
f 7/28/27 33/29/28 38/30/29
f 8/31/30 34/32/31 40/33/32
f 9/34/33 35/35/34 41/36/35
f 10/37/36 36/38/37 42/39/38
f 11/40/39 37/41/40 39/42/41
f 39/42/41 42/39/38 12/43/42
f 39/42/41 37/41/40 42/39/38
f 37/41/40 10/37/36 42/39/38
f 42/39/38 41/44/35 12/43/42
f 42/39/38 36/38/37 41/44/35
f 36/45/37 9/34/33 41/36/35
f 41/44/35 40/46/32 12/43/42
f 41/36/35 35/35/34 40/33/32
f 35/35/34 8/31/30 40/33/32
f 40/46/32 38/30/29 12/43/42
f 40/33/32 34/32/31 38/30/29
f 34/32/31 7/28/27 38/30/29
f 38/30/29 39/42/41 12/43/42
f 38/30/29 33/29/28 39/42/41
f 33/29/28 11/40/39 39/42/41
f 24/27/26 37/41/40 11/40/39
f 24/27/26 31/22/21 37/41/40
f 31/22/21 10/37/36 37/41/40
f 32/47/25 36/38/37 10/37/36
f 32/26/25 29/19/18 36/45/37
f 29/19/18 9/34/33 36/45/37
f 30/25/24 35/35/34 9/34/33
f 30/25/24 27/16/15 35/35/34
f 27/16/15 8/31/30 35/35/34
f 28/24/23 34/32/31 8/31/30
f 28/24/23 25/13/12 34/32/31
f 25/13/12 7/28/27 34/32/31
f 26/23/22 33/29/28 7/28/27
f 26/23/22 23/10/9 33/29/28
f 23/10/9 11/40/39 33/29/28
f 31/22/21 32/47/25 10/37/36
f 31/22/21 22/21/20 32/47/25
f 22/21/20 5/48/16 32/47/25
f 29/19/18 30/25/24 9/34/33
f 29/19/18 21/18/17 30/25/24
f 21/18/17 4/14/13 30/25/24
f 27/16/15 28/24/23 8/31/30
f 27/16/15 19/15/14 28/24/23
f 19/15/14 3/11/10 28/24/23
f 25/13/12 26/23/22 7/28/27
f 25/13/12 15/12/11 26/23/22
f 15/12/11 2/4/4 26/23/22
f 23/10/9 24/27/26 11/40/39
f 23/10/9 16/5/5 24/27/26
f 16/5/5 6/20/19 24/27/26
f 17/9/8 22/21/20 6/20/19
f 17/9/8 20/8/7 22/21/20
f 20/8/7 5/48/16 22/21/20
f 20/7/7 21/18/17 5/17/16
f 20/7/7 18/6/6 21/18/17
f 18/6/6 4/14/13 21/18/17
f 18/6/6 19/15/14 4/14/13
f 18/6/6 13/3/3 19/15/14
f 13/3/3 3/11/10 19/15/14
f 16/5/5 17/9/8 6/20/19
f 16/5/5 14/2/2 17/9/8
f 14/2/2 1/1/1 17/9/8
f 13/3/3 15/12/11 3/11/10
f 13/3/3 14/2/2 15/12/11
f 14/2/2 2/4/4 15/12/11


================================================
FILE: src/asset/3d/tank/base.obj
================================================
# Blender v2.80 (sub 75) OBJ File: 'tank.blend'
# www.blender.org
o tank-base_Cube
v 0.645520 0.500000 0.145520
v 0.645520 0.395520 0.250000
v 0.750000 0.395520 0.145520
v 0.645520 0.395520 -0.250000
v 0.645520 0.500000 -0.145520
v 0.750000 0.395520 -0.145520
v 0.750000 -0.395520 0.145520
v 0.645520 -0.395520 0.250000
v 0.645520 -0.500000 0.145520
v 0.750000 -0.395520 -0.145520
v 0.645520 -0.500000 -0.145520
v 0.645520 -0.395520 -0.250000
v -0.645520 0.500000 0.145520
v -0.750000 0.395520 0.145520
v -0.645520 0.395520 0.250000
v -0.750000 0.395520 -0.145520
v -0.645520 0.500000 -0.145520
v -0.645520 0.395520 -0.250000
v -0.750000 -0.395520 0.145520
v -0.645520 -0.500000 0.145520
v -0.645520 -0.395520 0.250000
v -0.645520 -0.395520 -0.250000
v -0.645520 -0.500000 -0.145520
v -0.750000 -0.395520 -0.145520
vt 0.195508 0.920138
vt 0.097603 0.830157
vt 0.097603 0.920138
vt 0.852376 0.070561
vt 0.852376 0.160542
vt 0.852376 0.070561
vt 0.958204 0.058676
vt 0.860299 0.058676
vt 0.958204 0.058676
vt 0.451048 0.929439
vt 0.548952 0.839458
vt 0.548952 0.929439
vt 0.966127 0.160542
vt 0.966127 0.070561
vt 0.966127 0.160542
vt 0.195508 0.209632
vt 0.195508 0.197747
vt 0.203431 0.197747
vt 0.195508 0.932023
vt 0.203431 0.920138
vt 0.203431 0.107765
vt 0.195508 0.107765
vt 0.195508 0.095881
vt 0.203431 0.830157
vt 0.195508 0.818272
vt 0.195508 0.830157
vt 0.097603 0.209632
vt 0.089680 0.197747
vt 0.097603 0.197747
vt 0.089680 0.920138
vt 0.097603 0.932023
vt 0.089680 0.107765
vt 0.097603 0.095881
vt 0.097603 0.107765
vt 0.097603 0.818272
vt 0.089680 0.830157
vt 0.958204 0.172427
vt 0.860299 0.058676
vt 0.966127 0.070561
vt 0.860299 0.172427
vt 0.852376 0.160542
vt 0.860299 0.172427
vt 0.091402 0.479812
vt 0.189307 0.467928
vt 0.189307 0.479812
vt 0.197230 0.569794
vt 0.189307 0.569794
vt 0.091402 0.569794
vt 0.083479 0.479812
vt 0.091402 0.581679
vt 0.958204 0.172427
vt 0.451048 0.839458
vt 0.091402 0.467928
vt 0.197230 0.479812
vt 0.083479 0.569794
vt 0.189307 0.581679
vn 0.0000 0.0000 -1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 0.0000
vn 0.5774 0.5774 0.5774
vn 0.5774 0.5774 -0.5774
vn 0.5774 -0.5774 0.5774
vn 0.5774 -0.5774 -0.5774
vn -0.5774 0.5774 0.5774
vn -0.5774 0.5774 -0.5774
vn -0.5774 -0.5774 0.5774
vn -0.5774 -0.5774 -0.5774
vn -0.7071 0.0000 -0.7071
vn 0.0000 0.7071 -0.7071
vn 0.7071 0.7071 0.0000
vn -0.7071 -0.7071 0.0000
vn 0.7071 -0.7071 0.0000
vn -0.7071 0.7071 0.0000
vn 0.0000 -0.7071 0.7071
vn 0.7071 0.0000 0.7071
vn 0.0000 -0.7071 -0.7071
vn -0.7071 0.0000 0.7071
vn 0.0000 0.7071 0.7071
vn 0.7071 0.0000 -0.7071
vn 0.0000 1.0000 0.0000
s off
f 4/1/1 22/2/1 18/3/1
f 19/4/2 16/5/2 24/6/2
f 9/7/3 23/8/3 11/9/3
f 15/10/4 8/11/4 2/12/4
f 3/13/5 10/14/5 6/15/5
f 1/16/6 2/17/6 3/18/6
f 4/1/7 5/19/7 6/20/7
f 7/21/8 8/22/8 9/23/8
f 10/24/9 11/25/9 12/26/9
f 13/27/10 14/28/10 15/29/10
f 16/30/11 17/31/11 18/3/11
f 19/32/12 20/33/12 21/34/12
f 22/2/13 23/35/13 24/36/13
f 22/2/14 16/30/14 18/3/14
f 18/3/15 5/19/15 4/1/15
f 6/15/16 1/37/16 3/13/16
f 20/38/17 24/6/17 23/8/17
f 11/9/18 7/39/18 9/7/18
f 17/40/19 14/41/19 13/42/19
f 21/43/20 9/44/20 8/45/20
f 8/45/21 3/46/21 2/47/21
f 12/26/22 23/35/22 22/2/22
f 15/48/23 19/49/23 21/43/23
f 2/47/24 13/50/24 15/48/24
f 4/1/25 10/24/25 12/26/25
f 13/42/26 5/51/26 17/40/26
f 4/1/1 12/26/1 22/2/1
f 19/4/2 14/41/2 16/5/2
f 9/7/3 20/38/3 23/8/3
f 15/10/4 21/52/4 8/11/4
f 3/13/5 7/39/5 10/14/5
f 22/2/14 24/36/14 16/30/14
f 18/3/15 17/31/15 5/19/15
f 6/15/16 5/51/16 1/37/16
f 20/38/17 19/4/17 24/6/17
f 11/9/18 10/14/18 7/39/18
f 17/40/19 16/5/19 14/41/19
f 21/43/20 20/53/20 9/44/20
f 8/45/21 7/54/21 3/46/21
f 12/26/22 11/25/22 23/35/22
f 15/48/23 14/55/23 19/49/23
f 2/47/24 1/56/24 13/50/24
f 4/1/25 6/20/25 10/24/25
f 13/42/26 1/37/26 5/51/26


================================================
FILE: src/asset/3d/tank/canon.obj
================================================
# Blender v2.80 (sub 75) OBJ File: 'tank.blend'
# www.blender.org
o Sphere_Sphere.001
v -0.367321 -0.026418 0.622755
v -0.440375 -0.075231 0.586362
v -0.496289 -0.112591 0.519116
v -0.526549 -0.132810 0.431254
v -0.526549 -0.132810 0.336154
v -0.440375 -0.075231 0.181046
v -0.413958 -0.035694 0.608885
v -0.487012 -0.065954 0.556050
v -0.535825 -0.086173 0.476977
v -0.552966 -0.093273 0.383704
v -0.535825 -0.086173 0.290431
v -0.487012 -0.065954 0.211358
v -0.413958 -0.035694 0.158523
v -0.374421 -0.009277 0.622755
v -0.460594 -0.026417 0.586362
v -0.526549 -0.039537 0.519116
v -0.562243 -0.046637 0.431254
v -0.562243 -0.046637 0.336154
v -0.526549 -0.039537 0.248292
v -0.460594 -0.026417 0.181046
v -0.374421 -0.009277 0.144653
v -0.421058 0.000000 0.608885
v -0.500131 0.000000 0.556050
v -0.552966 0.000000 0.476977
v -0.571519 0.000000 0.383704
v -0.552966 0.000000 0.290431
v -0.500131 0.000000 0.211358
v -0.421058 0.000000 0.158523
v -0.374421 0.009277 0.622755
v -0.460594 0.026418 0.586362
v -0.526549 0.039537 0.519116
v -0.562243 0.046637 0.431254
v -0.562243 0.046637 0.336154
v -0.526549 0.039537 0.248292
v -0.460594 0.026418 0.181046
v -0.374421 0.009277 0.144653
v -0.413958 0.035694 0.608885
v -0.487012 0.065954 0.556050
v -0.535825 0.086173 0.476977
v -0.552966 0.093273 0.383704
v -0.535825 0.086173 0.290431
v -0.487012 0.065954 0.211358
v -0.413958 0.035694 0.158523
v -0.367321 0.026418 0.622755
v -0.440375 0.075231 0.586362
v -0.496288 0.112591 0.519116
v -0.526548 0.132810 0.431254
v -0.526548 0.132810 0.336154
v -0.496288 0.112591 0.248292
v -0.440375 0.075231 0.181046
v -0.367321 0.026418 0.144653
v -0.393739 0.065954 0.608885
v -0.449652 0.121867 0.556050
v -0.487012 0.159227 0.476977
v -0.500131 0.172346 0.383704
v -0.487012 0.159227 0.290431
v -0.449652 0.121867 0.211358
v -0.393739 0.065954 0.158523
v -0.354202 0.039537 0.622755
v -0.403015 0.112591 0.586362
v -0.440375 0.168504 0.519116
v -0.460594 0.198764 0.431254
v -0.460594 0.198764 0.336154
v -0.440375 0.168504 0.248292
v -0.403015 0.112591 0.181046
v -0.354202 0.039537 0.144653
v -0.363479 0.086173 0.608885
v -0.393739 0.159227 0.556050
v -0.413958 0.208041 0.476977
v -0.421058 0.225181 0.383704
v -0.413958 0.208041 0.290431
v -0.393739 0.159227 0.211358
v -0.363479 0.086173 0.158523
v -0.337061 0.046637 0.622755
v -0.354202 0.132810 0.586362
v -0.367321 0.198764 0.519116
v -0.374421 0.234458 0.431254
v -0.374421 0.234458 0.336154
v -0.367321 0.198764 0.248292
v -0.354202 0.132810 0.181046
v -0.337061 0.046637 0.144653
v -0.327785 0.093273 0.608885
v -0.327785 0.172346 0.556050
v -0.327785 0.225181 0.476977
v -0.327785 0.243735 0.383704
v -0.327785 0.225181 0.290431
v -0.327785 0.172346 0.211358
v -0.327785 0.093273 0.158523
v -0.318508 0.046637 0.622755
v -0.301367 0.132810 0.586362
v -0.288248 0.198764 0.519116
v -0.281148 0.234458 0.431254
v -0.281148 0.234458 0.336154
v -0.288248 0.198764 0.248292
v -0.301367 0.132810 0.181046
v -0.318508 0.046637 0.144653
v -0.292090 0.086173 0.608885
v -0.261830 0.159227 0.556050
v -0.241611 0.208041 0.476977
v -0.234511 0.225181 0.383704
v -0.241611 0.208041 0.290431
v -0.261830 0.159227 0.211358
v -0.292090 0.086173 0.158523
v -0.327785 0.000000 0.139970
v -0.301367 0.039537 0.622755
v -0.252554 0.112591 0.586362
v -0.215194 0.168504 0.519116
v -0.194975 0.198764 0.431254
v -0.194975 0.198764 0.336154
v -0.215194 0.168504 0.248292
v -0.252554 0.112591 0.181046
v -0.301367 0.039537 0.144653
v -0.261830 0.065954 0.608885
v -0.205917 0.121867 0.556050
v -0.168557 0.159227 0.476977
v -0.155438 0.172346 0.383704
v -0.168557 0.159227 0.290431
v -0.205917 0.121867 0.211358
v -0.261831 0.065954 0.158523
v -0.288248 0.026418 0.622755
v -0.215194 0.075231 0.586362
v -0.159281 0.112591 0.519116
v -0.129021 0.132810 0.431254
v -0.129021 0.132810 0.336154
v -0.159281 0.112591 0.248292
v -0.215194 0.075231 0.181046
v -0.288248 0.026418 0.144653
v -0.241611 0.035694 0.608885
v -0.168557 0.065954 0.556050
v -0.119744 0.086173 0.476977
v -0.096037 0.083271 0.383704
v -0.119744 0.086173 0.290431
v -0.168557 0.065954 0.211358
v -0.241611 0.035694 0.158523
v -0.281148 0.009277 0.622755
v -0.194975 0.026418 0.586362
v -0.129021 0.039537 0.519116
v -0.096037 0.060303 0.445189
v -0.096037 0.060303 0.322219
v -0.129021 0.039537 0.248292
v -0.194975 0.026418 0.181046
v -0.281148 0.009277 0.144653
v -0.234511 0.000000 0.608885
v -0.155438 0.000000 0.556050
v -0.096037 -0.000000 0.466975
v 0.507671 0.083271 0.383704
v -0.096037 -0.000000 0.300433
v -0.155438 0.000000 0.211358
v -0.234511 0.000000 0.158523
v -0.327785 0.000000 0.627439
v -0.281148 -0.009277 0.622755
v -0.194975 -0.026417 0.586362
v -0.129021 -0.039537 0.519116
v -0.096037 -0.060303 0.445189
v -0.096037 -0.060303 0.322219
v -0.129021 -0.039537 0.248292
v -0.194975 -0.026417 0.181046
v -0.281148 -0.009277 0.144653
v -0.241611 -0.035694 0.608885
v -0.168557 -0.065954 0.556050
v -0.119744 -0.086173 0.476977
v -0.096037 -0.083271 0.383704
v -0.119744 -0.086173 0.290431
v -0.168557 -0.065954 0.211358
v -0.241611 -0.035694 0.158523
v -0.288248 -0.026417 0.622755
v -0.215194 -0.075231 0.586362
v -0.159281 -0.112591 0.519116
v -0.129021 -0.132810 0.431254
v -0.129021 -0.132810 0.336154
v -0.159281 -0.112591 0.248292
v -0.215194 -0.075231 0.181046
v -0.288248 -0.026417 0.144653
v -0.261831 -0.065954 0.608885
v -0.205917 -0.121867 0.556050
v -0.168557 -0.159227 0.476977
v -0.155438 -0.172346 0.383704
v -0.168557 -0.159227 0.290431
v -0.205917 -0.121867 0.211358
v -0.261831 -0.065954 0.158523
v -0.301367 -0.039537 0.622755
v -0.252554 -0.112591 0.586362
v -0.215194 -0.168504 0.519116
v -0.194975 -0.198764 0.431254
v -0.194975 -0.198764 0.336154
v -0.215194 -0.168504 0.248292
v -0.252554 -0.112591 0.181046
v -0.301367 -0.039537 0.144653
v -0.292091 -0.086173 0.608885
v -0.261831 -0.159227 0.556050
v -0.241611 -0.208040 0.476977
v -0.234511 -0.225181 0.383704
v -0.241611 -0.208040 0.290431
v -0.261831 -0.159227 0.211358
v -0.292091 -0.086173 0.158523
v -0.318508 -0.046637 0.622755
v -0.301367 -0.132810 0.586362
v -0.288248 -0.198764 0.519116
v -0.281148 -0.234458 0.431254
v -0.281148 -0.234458 0.336154
v -0.288248 -0.198764 0.248292
v -0.301367 -0.132810 0.181046
v -0.318508 -0.046637 0.144653
v -0.327785 -0.093273 0.608885
v -0.327785 -0.172346 0.556050
v -0.327785 -0.225181 0.476977
v -0.327785 -0.243734 0.383704
v -0.327785 -0.225181 0.290431
v -0.327785 -0.172346 0.211358
v -0.327785 -0.093273 0.158523
v -0.337061 -0.046637 0.622755
v -0.354202 -0.132810 0.586362
v -0.367321 -0.198764 0.519116
v -0.374421 -0.234458 0.431254
v -0.374421 -0.234458 0.336154
v -0.367321 -0.198764 0.248292
v -0.354202 -0.132810 0.181046
v -0.337061 -0.046637 0.144653
v -0.363479 -0.086173 0.608885
v -0.393739 -0.159227 0.556050
v -0.413958 -0.208040 0.476977
v -0.421058 -0.225181 0.383704
v -0.413958 -0.208040 0.290431
v -0.393739 -0.159227 0.211358
v -0.363479 -0.086173 0.158523
v -0.354202 -0.039537 0.622755
v -0.403015 -0.112591 0.586362
v -0.440375 -0.168504 0.519116
v -0.460594 -0.198764 0.431254
v -0.460594 -0.198764 0.336154
v -0.440375 -0.168504 0.248292
v -0.403015 -0.112591 0.181046
v -0.354202 -0.039537 0.144653
v -0.393739 -0.065954 0.608885
v -0.449652 -0.121867 0.556050
v -0.487012 -0.159227 0.476977
v -0.500131 -0.172346 0.383704
v -0.487012 -0.159227 0.290431
v -0.449652 -0.121867 0.211358
v -0.393739 -0.065954 0.158523
v -0.496288 -0.112591 0.248292
v -0.367321 -0.026417 0.144653
v 0.507671 0.060303 0.445189
v 0.507671 0.060303 0.322219
v 0.507671 0.000000 0.466975
v 0.507671 0.000000 0.300433
v 0.507671 -0.060303 0.445189
v 0.507671 -0.060303 0.322219
v 0.507671 -0.083271 0.383704
v 0.507671 0.060200 0.383704
v 0.507671 0.043596 0.428154
v 0.507671 0.043596 0.339254
v 0.507671 0.000000 0.443904
v 0.507671 0.000000 0.323504
v 0.507671 -0.043596 0.428154
v 0.507671 -0.043596 0.339254
v 0.507671 -0.060200 0.383704
v 0.230468 0.060200 0.383704
v 0.230468 0.043596 0.428154
v 0.230468 0.043596 0.339254
v 0.230468 0.000000 0.443904
v 0.230468 0.000000 0.323504
v 0.230468 -0.043596 0.428154
v 0.230468 -0.043596 0.339254
v 0.230468 -0.060200 0.383704
vt 0.117968 0.474762
vt 0.102825 0.497425
vt 0.099065 0.478522
vt 0.121728 0.493665
vt 0.113533 0.513450
vt 0.132436 0.509690
vt 0.102825 0.459619
vt 0.083040 0.489230
vt 0.086800 0.470327
vt 0.086800 0.470327
vt 0.072332 0.505255
vt 0.083040 0.489230
vt 0.097508 0.454301
vt 0.076092 0.486352
vt 0.148461 0.520398
vt 0.151339 0.513450
vt 0.167364 0.524158
vt 0.086800 0.508133
vt 0.086800 0.540183
vt 0.076092 0.524158
vt 0.140631 0.497425
vt 0.132436 0.509690
vt 0.121728 0.493665
vt 0.072332 0.505255
vt 0.099065 0.478522
vt 0.086800 0.508133
vt 0.102825 0.497425
vt 0.129558 0.524158
vt 0.148461 0.520398
vt 0.113533 0.513450
vt 0.113533 0.534865
vt 0.097508 0.524158
vt 0.151339 0.513450
vt 0.167364 0.524158
vt 0.076092 0.524158
vt 0.097508 0.524158
vt 0.129558 0.524158
vt 0.132436 0.538625
vt 0.148461 0.527918
vt 0.113533 0.534865
vt 0.148461 0.527918
vt 0.072332 0.543061
vt 0.102825 0.550891
vt 0.072332 0.543061
vt 0.068572 0.524158
vt 0.086800 0.540183
vt 0.083040 0.559086
vt 0.102825 0.550891
vt 0.099065 0.569794
vt 0.083040 0.559086
vt 0.132436 0.538625
vt 0.121728 0.554651
vt 0.151339 0.534865
vt 0.151339 0.534865
vt 0.121728 0.554651
vt 0.086800 0.577989
vt 0.086800 0.577989
vt 0.076092 0.561964
vt 0.140631 0.550891
vt 0.099065 0.569794
vt 0.102825 0.588697
vt 0.156656 0.540183
vt 0.117968 0.573554
vt 0.121728 0.592457
vt 0.102825 0.588697
vt 0.140631 0.550891
vt 0.117968 0.573554
vt 0.136871 0.569794
vt 0.156656 0.540183
vt 0.113533 0.604722
vt 0.097508 0.594014
vt 0.113533 0.604722
vt 0.140631 0.588697
vt 0.152896 0.559086
vt 0.121728 0.592457
vt 0.136871 0.569794
vt 0.163604 0.543061
vt 0.151339 0.604722
vt 0.132436 0.608482
vt 0.152896 0.559086
vt 0.140631 0.588697
vt 0.156656 0.577989
vt 0.132436 0.608482
vt 0.148461 0.619190
vt 0.129558 0.615430
vt 0.163604 0.543061
vt 0.167364 0.594014
vt 0.167364 0.561964
vt 0.151339 0.604722
vt 0.148461 0.619190
vt 0.156656 0.577989
vt 0.167364 0.594014
vt 0.183389 0.604722
vt 0.167364 0.615430
vt 0.167364 0.561964
vt 0.178072 0.577989
vt 0.167364 0.615430
vt 0.171124 0.543061
vt 0.194097 0.588697
vt 0.181832 0.559086
vt 0.183389 0.604722
vt 0.186267 0.619190
vt 0.171124 0.543061
vt 0.178072 0.577989
vt 0.186267 0.619190
vt 0.167364 0.622950
vt 0.194097 0.588697
vt 0.213000 0.592457
vt 0.202292 0.608482
vt 0.181832 0.559086
vt 0.197857 0.569794
vt 0.202292 0.608482
vt 0.221195 0.604722
vt 0.216760 0.573554
vt 0.194097 0.550891
vt 0.213000 0.592457
vt 0.178072 0.540183
vt 0.197857 0.569794
vt 0.221195 0.604722
vt 0.205170 0.615430
vt 0.178072 0.540183
vt 0.216760 0.573554
vt 0.235663 0.569794
vt 0.231903 0.588697
vt 0.194097 0.550891
vt 0.231903 0.588697
vt 0.247928 0.577989
vt 0.231903 0.550891
vt 0.202292 0.538625
vt 0.213000 0.554651
vt 0.235663 0.569794
vt 0.183389 0.534865
vt 0.213000 0.554651
vt 0.183389 0.534865
vt 0.247928 0.577989
vt 0.237220 0.594014
vt 0.247928 0.540183
vt 0.251688 0.559086
vt 0.221195 0.534865
vt 0.202292 0.538625
vt 0.251688 0.559086
vt 0.231903 0.550891
vt 0.237220 0.524158
vt 0.205170 0.524158
vt 0.186267 0.527918
vt 0.221195 0.534865
vt 0.247928 0.540183
vt 0.261298 0.548600
vt 0.261298 0.557909
vt 0.186267 0.527918
vt 0.261298 0.548600
vt 0.261298 0.524158
vt 0.205170 0.524158
vt 0.221195 0.513450
vt 0.261298 0.524158
vt 0.891784 0.561601
vt 0.945650 0.552291
vt 0.891784 0.552291
vt 0.247928 0.508132
vt 0.237220 0.524158
vt 0.202292 0.509690
vt 0.247928 0.508132
vt 0.186267 0.520398
vt 0.221195 0.513450
vt 0.891784 0.503406
vt 0.945650 0.527849
vt 0.891784 0.527849
vt 0.186267 0.520398
vt 0.891784 0.494097
vt 0.945650 0.503406
vt 0.231903 0.497425
vt 0.202292 0.509690
vt 0.213000 0.493665
vt 0.251688 0.489230
vt 0.891784 0.552291
vt 0.945650 0.561601
vt 0.231903 0.497425
vt 0.251688 0.489230
vt 0.261298 0.499715
vt 0.194097 0.497425
vt 0.235663 0.478522
vt 0.183389 0.513450
vt 0.213000 0.493665
vt 0.247928 0.470327
vt 0.261298 0.490406
vt 0.183389 0.513450
vt 0.235663 0.478522
vt 0.216760 0.474762
vt 0.261298 0.499715
vt 0.247928 0.470327
vt 0.197857 0.478522
vt 0.231903 0.459619
vt 0.216760 0.474762
vt 0.231903 0.459619
vt 0.194097 0.497425
vt 0.213000 0.455859
vt 0.178072 0.508132
vt 0.221195 0.443594
vt 0.237220 0.454301
vt 0.178072 0.508133
vt 0.213000 0.455859
vt 0.197857 0.478522
vt 0.221195 0.443594
vt 0.194097 0.459619
vt 0.178072 0.470327
vt 0.202292 0.439834
vt 0.194097 0.459619
vt 0.181832 0.489230
vt 0.183389 0.443594
vt 0.202292 0.439834
vt 0.181832 0.489230
vt 0.167364 0.486352
vt 0.171124 0.505255
vt 0.186267 0.429126
vt 0.205170 0.432886
vt 0.171124 0.505255
vt 0.178072 0.470327
vt 0.186267 0.429126
vt 0.167364 0.454301
vt 0.183389 0.443594
vt 0.156656 0.470327
vt 0.167364 0.454301
vt 0.151339 0.443594
vt 0.167364 0.432886
vt 0.167364 0.432886
vt 0.167364 0.486352
vt 0.152896 0.489230
vt 0.163604 0.505255
vt 0.156656 0.470327
vt 0.163604 0.505255
vt 0.148461 0.429126
vt 0.140631 0.459619
vt 0.148461 0.429126
vt 0.167364 0.425366
vt 0.151339 0.443594
vt 0.132436 0.439834
vt 0.140631 0.459619
vt 0.121728 0.455859
vt 0.132436 0.439834
vt 0.152896 0.489230
vt 0.129558 0.432886
vt 0.136871 0.478522
vt 0.156656 0.508132
vt 0.156656 0.508133
vt 0.136871 0.478522
vt 0.113533 0.443594
vt 0.113533 0.443594
vt 0.121728 0.455859
vt 0.102825 0.459619
vt 0.117968 0.474762
vt 0.140631 0.497425
vt 0.945650 0.527849
vt 0.891784 0.527849
vt 0.891784 0.503406
vt 0.945650 0.503406
vt 0.945650 0.494097
vt 0.945650 0.552291
vt 0.945650 0.510178
vt 0.945650 0.527849
vt 0.945650 0.545519
vt 0.945650 0.527849
vt 0.945650 0.545519
vt 0.945650 0.552250
vt 0.945650 0.510178
vt 0.945650 0.503448
vt 0.937178 0.552250
vt 0.937178 0.545519
vt 0.937178 0.527849
vt 0.937178 0.503448
vt 0.937178 0.545519
vt 0.937178 0.527849
vt 0.937178 0.510178
vt 0.937178 0.510178
vn -0.5053 -0.5053 0.6995
vn -0.6602 -0.2734 0.6995
vn -0.6962 -0.4652 0.5466
vn -0.4683 -0.3129 -0.8263
vn -0.5524 -0.1099 -0.8263
vn -0.3604 -0.1493 -0.9208
vn -0.6556 -0.6556 0.3745
vn -0.8566 -0.3548 0.3745
vn -0.8163 -0.5454 0.1902
vn -0.8163 -0.5454 -0.1902
vn -0.9629 -0.1915 -0.1902
vn -0.8566 -0.3548 -0.3745
vn -0.7071 -0.7071 0.0000
vn -0.9239 -0.3827 0.0000
vn -0.1996 -0.0397 0.9791
vn -0.1692 -0.1131 0.9791
vn 0.0000 0.0000 1.0000
vn -0.8213 -0.1633 0.5466
vn -0.8213 0.1634 0.5466
vn -0.9272 0.0000 0.3745
vn -0.2758 -0.2758 0.9208
vn -0.3604 -0.1493 0.9208
vn -0.4683 -0.3129 0.8263
vn -0.9629 -0.1915 0.1902
vn -0.6962 -0.4652 -0.5466
vn -0.8213 -0.1633 -0.5466
vn -0.6602 -0.2734 -0.6995
vn -0.3901 0.0000 -0.9208
vn -0.1996 -0.0397 -0.9791
vn -0.5524 -0.1099 0.8263
vn -0.5524 0.1099 0.8263
vn -0.7146 0.0000 0.6995
vn -0.1692 -0.1131 -0.9791
vn 0.0000 0.0000 -1.0000
vn -0.9272 0.0000 -0.3745
vn -0.7146 0.0000 -0.6995
vn -0.3901 0.0000 0.9208
vn -0.3604 0.1493 0.9208
vn -0.1996 0.0397 0.9791
vn -0.5524 0.1099 -0.8263
vn -0.1996 0.0397 -0.9791
vn -0.9629 0.1915 -0.1902
vn -0.6602 0.2734 0.6995
vn -0.9629 0.1915 0.1902
vn -1.0000 0.0000 0.0000
vn -0.8213 0.1633 -0.5466
vn -0.8566 0.3548 -0.3745
vn -0.6602 0.2734 -0.6995
vn -0.6962 0.4652 0.5466
vn -0.8566 0.3548 0.3745
vn -0.3604 0.1493 -0.9208
vn -0.4683 0.3129 0.8263
vn -0.1692 0.1131 0.9791
vn -0.1692 0.1131 -0.9791
vn -0.4683 0.3129 -0.8263
vn -0.8163 0.5454 -0.1902
vn -0.8163 0.5454 0.1902
vn -0.9239 0.3827 0.0000
vn -0.2758 0.2758 0.9208
vn -0.6962 0.4652 -0.5466
vn -0.6556 0.6556 -0.3745
vn -0.1131 0.1692 0.9791
vn -0.5053 0.5053 -0.6995
vn -0.4652 0.6962 0.5466
vn -0.6556 0.6556 0.3745
vn -0.2758 0.2758 -0.9208
vn -0.5053 0.5053 0.6995
vn -0.3129 0.4683 0.8263
vn -0.1131 0.1692 -0.9791
vn -0.5454 0.8163 0.1902
vn -0.7071 0.7071 0.0000
vn -0.5454 0.8163 -0.1902
vn -0.2734 0.6602 0.6995
vn -0.1493 0.3604 0.9208
vn -0.4652 0.6962 -0.5466
vn -0.3129 0.4683 -0.8263
vn -0.0397 0.1996 0.9791
vn -0.1633 0.8213 0.5466
vn -0.3548 0.8566 0.3745
vn -0.1493 0.3604 -0.9208
vn -0.2734 0.6602 -0.6995
vn -0.1099 0.5524 0.8263
vn -0.3548 0.8566 -0.3745
vn -0.1915 0.9629 0.1902
vn -0.3827 0.9239 0.0000
vn -0.0397 0.1996 -0.9791
vn 0.0000 0.7146 0.6995
vn 0.0000 0.3901 0.9208
vn -0.1633 0.8213 -0.5466
vn -0.1915 0.9629 -0.1902
vn -0.1099 0.5524 -0.8263
vn 0.0000 0.7146 -0.6995
vn 0.1634 0.8213 0.5466
vn 0.0000 0.9272 0.3745
vn 0.0000 0.3901 -0.9208
vn 0.1099 0.5524 0.8263
vn 0.0000 0.9272 -0.3745
vn 0.0397 0.1996 -0.9791
vn 0.2734 0.6602 0.6995
vn 0.1493 0.3604 0.9208
vn 0.1634 0.8213 -0.5466
vn 0.1915 0.9629 -0.1902
vn 0.0397 0.1996 0.9791
vn 0.1099 0.5524 -0.8263
vn 0.1915 0.9629 0.1902
vn 0.0000 1.0000 0.0000
vn 0.2734 0.6602 -0.6995
vn 0.4652 0.6962 0.5466
vn 0.3548 0.8566 0.3745
vn 0.1493 0.3604 -0.9208
vn 0.3129 0.4683 0.8263
vn 0.3548 0.8566 -0.3745
vn 0.5454 0.8163 -0.1902
vn 0.5053 0.5053 0.6995
vn 0.2758 0.2758 0.9208
vn 0.4652 0.6962 -0.5466
vn 0.1131 0.1692 0.9791
vn 0.3129 0.4683 -0.8263
vn 0.5454 0.8163 0.1902
vn 0.3827 0.9239 0.0000
vn 0.1131 0.1692 -0.9791
vn 0.5053 0.5053 -0.6995
vn 0.6962 0.4652 0.5466
vn 0.6556 0.6556 0.3745
vn 0.2758 0.2758 -0.9208
vn 0.6556 0.6556 -0.3745
vn 0.8050 0.5620 -0.1899
vn 0.6602 0.2734 0.6995
vn 0.3604 0.1493 0.9208
vn 0.4683 0.3129 0.8263
vn 0.6962 0.4652 -0.5466
vn 0.1692 0.1131 0.9791
vn 0.4683 0.3129 -0.8263
vn 0.1692 0.1131 -0.9791
vn 0.8050 0.5620 0.1899
vn 0.7071 0.7071 0.0000
vn 0.8169 0.1643 0.5528
vn 0.8322 0.3716 0.4115
vn 0.5524 0.1099 0.8263
vn 0.3604 0.1493 -0.9208
vn 0.8322 0.3716 -0.4115
vn 0.6602 0.2734 -0.6995
vn 0.7146 0.0000 0.6995
vn 0.3901 0.0000 0.9208
vn 0.1996 0.0397 0.9791
vn 0.5524 0.1099 -0.8263
vn 0.8169 0.1643 -0.5528
vn 0.5832 0.5606 0.5878
vn 0.5667 0.8239 0.0000
vn 0.1996 0.0397 -0.9791
vn 0.5832 0.5606 -0.5878
vn 0.5658 0.0000 0.8245
vn 0.3901 0.0000 -0.9208
vn 0.5524 -0.1099 0.8263
vn 0.5658 0.0000 -0.8245
vn 0.6237 0.5497 -0.5557
vn 0.8169 -0.1643 0.5528
vn 0.7146 0.0000 -0.6995
vn 0.3604 -0.1493 0.9208
vn 0.8169 -0.1643 -0.5528
vn 0.1996 -0.0397 0.9791
vn 0.5524 -0.1099 -0.8263
vn 0.5832 -0.5606 0.5878
vn 0.6380 0.0000 0.7700
vn 0.1996 -0.0397 -0.9791
vn 0.5667 -0.8239 0.0000
vn 0.6237 -0.5497 0.5557
vn 0.6602 -0.2734 0.6995
vn 0.3604 -0.1493 -0.9208
vn 0.4683 -0.3129 0.8263
vn 0.8322 -0.3716 -0.4115
vn 0.6362 0.7715 0.0000
vn 0.6602 -0.2734 -0.6995
vn 0.8322 -0.3716 0.4115
vn 0.2758 -0.2758 0.9208
vn 0.6962 -0.4652 -0.5466
vn 0.1692 -0.1131 0.9791
vn 0.4683 -0.3129 -0.8263
vn 0.8050 -0.5620 0.1899
vn 0.1692 -0.1131 -0.9791
vn 0.6962 -0.4652 0.5466
vn 0.5053 -0.5053 0.6995
vn 0.5832 -0.5606 -0.5878
vn 0.8050 -0.5620 -0.1899
vn 0.3129 -0.4683 0.8263
vn 0.6556 -0.6556 -0.3745
vn 0.5053 -0.5053 -0.6995
vn 0.6556 -0.6556 0.3745
vn 0.2758 -0.2758 -0.9208
vn 0.4652 -0.6962 -0.5466
vn 0.1131 -0.1692 0.9791
vn 0.5454 -0.8163 0.1902
vn 0.7071 -0.7071 0.0000
vn 0.1131 -0.1692 -0.9791
vn 0.4652 -0.6962 0.5466
vn 0.3129 -0.4683 -0.8263
vn 0.5454 -0.8163 -0.1902
vn 0.2734 -0.6602 0.6995
vn 0.1099 -0.5524 0.8263
vn 0.3548 -0.8566 -0.3745
vn 0.2734 -0.6602 -0.6995
vn 0.1493 -0.3604 0.9208
vn 0.1633 -0.8213 0.5466
vn 0.3548 -0.8566 0.3745
vn 0.1493 -0.3604 -0.9208
vn 0.0000 -0.3901 0.9208
vn 0.0397 -0.1996 0.9791
vn 0.1915 -0.9629 0.1902
vn 0.3827 -0.9239 0.0000
vn 0.0397 -0.1996 -0.9791
vn 0.1099 -0.5524 -0.8263
vn 0.1915 -0.9629 -0.1902
vn 0.0000 -0.7146 0.6995
vn 0.1633 -0.8213 -0.5466
vn -0.1099 -0.5524 0.8263
vn 0.0000 -0.7146 -0.6995
vn -0.1634 -0.8213 0.5466
vn 0.0000 -0.9272 0.3745
vn 0.0000 -0.9272 -0.3745
vn 0.0000 -0.3901 -0.9208
vn -0.1493 -0.3604 0.9208
vn -0.0397 -0.1996 0.9791
vn -0.1099 -0.5524 -0.8263
vn -0.0397 -0.1996 -0.9791
vn -0.1915 -0.9629 -0.1902
vn -0.2734 -0.6602 0.6995
vn -0.1915 -0.9629 0.1902
vn 0.0000 -1.0000 0.0000
vn -0.1634 -0.8213 -0.5466
vn -0.3548 -0.8566 -0.3745
vn -0.2734 -0.6602 -0.6995
vn -0.4652 -0.6962 0.5466
vn -0.3548 -0.8566 0.3745
vn -0.1493 -0.3604 -0.9208
vn -0.3827 -0.9239 0.0000
vn -0.3129 -0.4683 0.8263
vn -0.1131 -0.1692 0.9791
vn -0.1131 -0.1692 -0.9791
vn -0.3129 -0.4683 -0.8263
vn -0.5454 -0.8163 -0.1902
vn -0.5454 -0.8163 0.1902
vn -0.4652 -0.6962 -0.5466
vn -0.6556 -0.6556 -0.3745
vn -0.5053 -0.5053 -0.6995
vn -0.2758 -0.2758 -0.9208
vn 0.6380 0.0000 -0.7700
vn 0.6237 -0.5497 -0.5557
vn 0.6362 -0.7715 0.0000
vn 0.6237 0.5497 0.5557
vn 0.8148 0.4076 -0.4121
vn 0.7921 0.0000 -0.6103
vn 0.8148 -0.4076 0.4121
vn 0.7921 0.0000 0.6103
vn 0.8148 -0.4076 -0.4121
vn 0.7949 -0.6066 0.0000
vn 0.8148 0.4076 0.4121
vn 0.7949 0.6066 0.0000
s 1
f 235/1/1 8/2/2 3/3/3
f 6/4/4 20/5/5 13/6/6
f 236/7/7 9/8/8 4/9/9
f 5/10/10 18/11/11 11/12/12
f 237/13/13 10/14/14 5/10/10
f 14/15/15 1/16/16 150/17/17
f 16/18/18 31/19/19 24/20/20
f 234/21/21 7/22/22 2/23/23
f 3/3/3 16/18/18 9/8/8
f 4/9/9 17/24/24 10/14/14
f 241/25/25 19/26/26 12/27/27
f 13/6/6 28/28/28 21/29/29
f 15/30/30 30/31/31 23/32/32
f 242/33/33 21/29/29 104/34/34
f 11/12/12 26/35/35 19/26/26
f 9/8/8 24/20/20 17/24/24
f 12/27/27 27/36/36 20/5/5
f 17/24/24 18/11/11 10/14/14
f 22/37/37 37/38/38 30/31/31
f 29/39/39 14/15/15 150/17/17
f 20/5/5 35/40/40 28/28/28
f 21/29/29 36/41/41 104/34/34
f 18/11/11 33/42/42 26/35/35
f 23/32/32 38/43/43 31/19/19
f 17/24/24 32/44/44 25/45/45
f 19/26/26 34/46/46 27/36/36
f 26/35/35 41/47/47 34/46/46
f 27/36/36 42/48/48 35/40/40
f 31/19/19 46/49/49 39/50/50
f 24/20/20 39/50/50 32/44/44
f 28/28/28 43/51/51 36/41/41
f 32/44/44 33/42/42 25/45/45
f 30/31/31 45/52/52 38/43/43
f 44/53/53 29/39/39 150/17/17
f 36/41/41 51/54/54 104/34/34
f 35/40/40 50/55/55 43/51/51
f 33/42/42 48/56/56 41/47/47
f 32/44/44 47/57/57 40/58/58
f 37/38/38 52/59/59 45/52/52
f 34/46/46 49/60/60 42/48/48
f 41/47/47 56/61/61 49/60/60
f 59/62/62 44/53/53 150/17/17
f 42/48/48 57/63/63 50/55/55
f 46/49/49 61/64/64 54/65/65
f 39/50/50 54/65/65 47/57/57
f 43/51/51 58/66/66 51/54/54
f 38/43/43 53/67/67 46/49/49
f 45/52/52 60/68/68 53/67/67
f 47/57/57 48/56/56 40/58/58
f 51/54/54 66/69/69 104/34/34
f 47/57/57 62/70/70 55/71/71
f 48/56/56 63/72/72 56/61/61
f 53/67/67 68/73/73 61/64/64
f 52/59/59 67/74/74 60/68/68
f 49/60/60 64/75/75 57/63/63
f 50/55/55 65/76/76 58/66/66
f 74/77/77 59/62/62 150/17/17
f 61/64/64 76/78/78 69/79/79
f 54/65/65 69/79/79 62/70/70
f 58/66/66 73/80/80 66/69/69
f 57/63/63 72/81/81 65/76/76
f 62/70/70 63/72/72 55/71/71
f 60/68/68 75/82/82 68/73/73
f 56/61/61 71/83/83 64/75/75
f 62/70/70 77/84/84 70/85/85
f 66/69/69 81/86/86 104/34/34
f 68/73/73 83/87/87 76/78/78
f 67/74/74 82/88/88 75/82/82
f 64/75/75 79/89/89 72/81/81
f 63/72/72 78/90/90 71/83/83
f 65/76/76 80/91/91 73/80/80
f 72/81/81 87/92/92 80/91/91
f 76/78/78 91/93/93 84/94/94
f 69/79/79 84/94/94 77/84/84
f 73/80/80 88/95/95 81/86/86
f 77/84/84 78/90/90 70/85/85
f 75/82/82 90/96/96 83/87/87
f 71/83/83 86/97/97 79/89/89
f 81/86/86 96/98/98 104/34/34
f 83/87/87 98/99/99 91/93/93
f 82/88/88 97/100/100 90/96/96
f 79/89/89 94/101/101 87/92/92
f 78/90/90 93/102/102 86/97/97
f 89/103/103 74/77/77 150/17/17
f 80/91/91 95/104/104 88/95/95
f 77/84/84 92/105/105 85/106/106
f 87/92/92 102/107/107 95/104/104
f 91/93/93 107/108/108 99/109/109
f 88/95/95 103/110/110 96/98/98
f 92/105/105 93/102/102 85/106/106
f 90/96/96 106/111/111 98/99/99
f 84/94/94 99/109/109 92/105/105
f 86/97/97 101/112/112 94/101/101
f 93/102/102 109/113/113 101/112/112
f 98/99/99 114/114/114 107/108/108
f 97/100/100 113/115/115 106/111/111
f 94/101/101 110/116/116 102/107/107
f 105/117/117 89/103/103 150/17/17
f 95/104/104 111/118/118 103/110/110
f 92/105/105 108/119/119 100/120/120
f 96/98/98 112/121/121 104/34/34
f 102/107/107 118/122/122 111/118/118
f 107/108/108 122/123/123 115/124/124
f 108/119/119 109/113/113 100/120/120
f 99/109/109 115/124/124 108/119/119
f 103/110/110 119/125/125 112/121/121
f 101/112/112 117/126/126 110/116/116
f 109/113/113 124/127/127 117/126/126
f 114/114/114 129/128/128 122/123/123
f 113/115/115 128/129/129 121/130/130
f 110/116/116 125/131/131 118/122/122
f 120/132/132 105/117/117 150/17/17
f 111/118/118 126/133/133 119/125/125
f 106/111/111 121/130/130 114/114/114
f 112/121/121 127/134/134 104/34/34
f 108/119/119 123/135/135 116/136/136
f 122/123/123 137/137/137 130/138/138
f 115/124/124 130/138/138 123/135/135
f 123/135/135 124/127/127 116/136/136
f 121/130/130 136/139/139 129/128/128
f 119/125/125 134/140/140 127/134/134
f 117/126/126 132/141/141 125/131/131
f 118/122/122 133/142/142 126/133/133
f 129/128/128 144/143/143 137/137/137
f 128/129/129 143/144/144 136/139/139
f 135/145/145 120/132/132 150/17/17
f 126/133/133 141/146/146 134/140/140
f 125/131/131 140/147/147 133/142/142
f 123/135/135 138/148/148 131/149/149
f 127/134/134 142/150/150 104/34/34
f 124/127/127 139/151/151 132/141/141
f 130/138/138 145/152/152 138/148/148
f 134/140/140 149/153/153 142/150/150
f 136/139/139 152/154/154 144/143/143
f 132/141/141 147/155/155 140/147/147
f 131/156/149 244/157/156 139/158/151
f 137/137/137 153/159/157 145/152/152
f 133/142/142 148/160/158 141/146/146
f 143/144/144 159/161/159 152/154/154
f 140/147/147 156/162/160 148/160/158
f 151/163/161 135/145/145 150/17/17
f 141/146/146 157/164/162 149/153/153
f 154/165/163 245/166/164 145/167/152
f 142/150/150 158/168/165 104/34/34
f 162/169/166 247/170/167 154/165/163
f 144/143/143 160/171/168 153/159/157
f 149/153/153 165/172/169 158/168/165
f 152/154/154 167/173/170 160/171/168
f 147/155/155 163/174/171 156/162/160
f 138/175/148 146/176/172 131/156/149
f 148/160/158 164/177/173 157/164/162
f 145/152/152 161/178/174 154/179/163
f 159/161/159 174/180/175 167/173/170
f 156/162/160 171/181/176 164/177/173
f 166/182/177 151/163/161 150/17/17
f 157/164/162 172/183/178 165/172/169
f 154/179/163 169/184/179 162/185/166
f 158/168/165 173/186/180 104/34/34
f 153/159/157 168/187/181 161/178/174
f 160/171/168 175/188/182 168/187/181
f 155/189/183 170/190/184 163/174/171
f 169/184/179 170/190/184 162/185/166
f 167/173/170 182/191/185 175/188/182
f 163/174/171 178/192/186 171/181/176
f 164/177/173 179/193/187 172/183/178
f 161/178/174 176/194/188 169/184/179
f 165/172/169 180/195/189 173/186/180
f 171/181/176 186/196/190 179/193/187
f 181/197/191 166/182/177 150/17/17
f 169/184/179 184/198/192 177/199/193
f 173/186/180 188/200/194 104/34/34
f 168/187/181 183/201/195 176/194/188
f 172/183/178 187/202/196 180/195/189
f 170/190/184 185/203/197 178/192/186
f 175/188/182 190/204/198 183/201/195
f 184/198/192 185/203/197 177/199/193
f 182/191/185 197/205/199 190/204/198
f 178/192/186 193/206/200 186/196/190
f 179/193/187 194/207/201 187/202/196
f 174/180/175 189/208/202 182/191/185
f 183/201/195 198/209/203 191/210/204
f 180/195/189 195/211/205 188/200/194
f 176/194/188 191/210/204 184/198/192
f 189/208/202 204/212/206 197/205/199
f 196/213/207 181/197/191 150/17/17
f 184/198/192 199/214/208 192/215/209
f 188/200/194 203/216/210 104/34/34
f 187/202/196 202/217/211 195/211/205
f 185/203/197 200/218/212 193/206/200
f 190/204/198 205/219/213 198/209/203
f 186/196/190 201/220/214 194/207/201
f 197/205/199 212/221/215 205/219/213
f 194/207/201 209/222/216 202/217/211
f 198/209/203 213/223/217 206/224/218
f 193/206/200 208/225/219 201/220/214
f 191/210/204 206/224/218 199/214/208
f 195/211/205 210/226/220 203/216/210
f 199/214/208 200/218/212 192/215/209
f 204/212/206 219/227/221 212/221/215
f 211/228/222 196/213/207 150/17/17
f 202/217/211 217/229/223 210/226/220
f 203/216/210 218/230/224 104/34/34
f 200/218/212 215/231/225 208/225/219
f 205/219/213 220/232/226 213/223/217
f 199/214/208 214/233/227 207/234/228
f 201/220/214 216/235/229 209/222/216
f 208/225/219 223/236/230 216/235/229
f 209/222/216 224/237/231 217/229/223
f 213/223/217 228/238/232 221/239/233
f 206/224/218 221/239/233 214/233/227
f 210/226/220 225/240/234 218/230/224
f 207/234/228 222/241/235 215/231/225
f 212/221/215 227/242/236 220/232/226
f 226/243/237 211/228/222 150/17/17
f 218/230/224 233/244/238 104/34/34
f 217/229/223 232/245/239 225/240/234
f 215/231/225 230/246/240 223/236/230
f 214/233/227 229/247/241 222/241/235
f 219/227/221 234/21/21 227/242/236
f 216/235/229 231/248/242 224/237/231
f 223/236/230 238/249/243 231/248/242
f 224/237/231 239/250/244 232/245/239
f 228/238/232 3/3/3 236/7/7
f 221/239/233 236/7/7 229/247/241
f 225/240/234 240/251/245 233/244/238
f 220/232/226 235/1/1 228/238/232
f 227/242/236 2/23/23 235/1/1
f 222/241/235 237/13/13 230/246/240
f 1/16/16 226/243/237 150/17/17
f 233/244/238 242/33/33 104/34/34
f 229/247/241 4/9/9 237/13/13
f 230/246/240 5/10/10 238/249/243
f 231/248/242 241/25/25 239/250/244
f 232/245/239 6/4/4 240/251/245
f 7/22/22 22/37/37 15/30/30
f 13/6/6 240/251/245 6/4/4
f 239/250/244 12/27/27 6/4/4
f 11/12/12 238/249/243 5/10/10
f 2/23/23 15/30/30 8/2/2
f 8/2/2 23/32/32 16/18/18
f 235/1/1 2/23/23 8/2/2
f 6/4/4 12/27/27 20/5/5
f 236/7/7 3/3/3 9/8/8
f 5/10/10 10/14/14 18/11/11
f 237/13/13 4/9/9 10/14/14
f 14/15/15 7/22/22 1/16/16
f 16/18/18 23/32/32 31/19/19
f 234/21/21 1/16/16 7/22/22
f 3/3/3 8/2/2 16/18/18
f 4/9/9 9/8/8 17/24/24
f 241/25/25 11/12/12 19/26/26
f 13/6/6 20/5/5 28/28/28
f 15/30/30 22/37/37 30/31/31
f 242/33/33 13/6/6 21/29/29
f 11/12/12 18/11/11 26/35/35
f 9/8/8 16/18/18 24/20/20
f 12/27/27 19/26/26 27/36/36
f 17/24/24 25/45/45 18/11/11
f 22/37/37 29/39/39 37/38/38
f 29/39/39 22/37/37 14/15/15
f 20/5/5 27/36/36 35/40/40
f 21/29/29 28/28/28 36/41/41
f 18/11/11 25/45/45 33/42/42
f 23/32/32 30/31/31 38/43/43
f 17/24/24 24/20/20 32/44/44
f 19/26/26 26/35/35 34/46/46
f 26/35/35 33/42/42 41/47/47
f 27/36/36 34/46/46 42/48/48
f 31/19/19 38/43/43 46/49/49
f 24/20/20 31/19/19 39/50/50
f 28/28/28 35/40/40 43/51/51
f 32/44/44 40/58/58 33/42/42
f 30/31/31 37/38/38 45/52/52
f 44/53/53 37/38/38 29/39/39
f 36/41/41 43/51/51 51/54/54
f 35/40/40 42/48/48 50/55/55
f 33/42/42 40/58/58 48/56/56
f 32/44/44 39/50/50 47/57/57
f 37/38/38 44/53/53 52/59/59
f 34/46/46 41/47/47 49/60/60
f 41/47/47 48/56/56 56/61/61
f 59/62/62 52/59/59 44/53/53
f 42/48/48 49/60/60 57/63/63
f 46/49/49 53/67/67 61/64/64
f 39/50/50 46/49/49 54/65/65
f 43/51/51 50/55/55 58/66/66
f 38/43/43 45/52/52 53/67/67
f 45/52/52 52/59/59 60/68/68
f 47/57/57 55/71/71 48/56/56
f 51/54/54 58/66/66 66/69/69
f 47/57/57 54/65/65 62/70/70
f 48/56/56 55/71/71 63/72/72
f 53/67/67 60/68/68 68/73/73
f 52/59/59 59/62/62 67/74/74
f 49/60/60 56/61/61 64/75/75
f 50/55/55 57/63/63 65/76/76
f 74/77/77 67/74/74 59/62/62
f 61/64/64 68/73/73 76/78/78
f 54/65/65 61/64/64 69/79/79
f 58/66/66 65/76/76 73/80/80
f 57/63/63 64/75/75 72/81/81
f 62/70/70 70/85/85 63/72/72
f 60/68/68 67/74/74 75/82/82
f 56/61/61 63/72/72 71/83/83
f 62/70/70 69/79/79 77/84/84
f 66/69/69 73/80/80 81/86/86
f 68/73/73 75/82/82 83/87/87
f 67/74/74 74/77/77 82/88/88
f 64/75/75 71/83/83 79/89/89
f 63/72/72 70/85/85 78/90/90
f 65/76/76 72/81/81 80/91/91
f 72/81/81 79/89/89 87/92/92
f 76/78/78 83/87/87 91/93/93
f 69/79/79 76/78/78 84/94/94
f 73/80/80 80/91/91 88/95/95
f 77/84/84 85/106/106 78/90/90
f 75/82/82 82/88/88 90/96/96
f 71/83/83 78/90/90 86/97/97
f 81/86/86 88/95/95 96/98/98
f 83/87/87 90/96/96 98/99/99
f 82/88/88 89/103/103 97/100/100
f 79/89/89 86/97/97 94/101/101
f 78/90/90 85/106/106 93/102/102
f 89/103/103 82/88/88 74/77/77
f 80/91/91 87/92/92 95/104/104
f 77/84/84 84/94/94 92/105/105
f 87/92/92 94/101/101 102/107/107
f 91/93/93 98/99/99 107/108/108
f 88/95/95 95/104/104 103/110/110
f 92/105/105 100/120/120 93/102/102
f 90/96/96 97/100/100 106/111/111
f 84/94/94 91/93/93 99/109/109
f 86/97/97 93/102/102 101/112/112
f 93/102/102 100/120/120 109/113/113
f 98/99/99 106/111/111 114/114/114
f 97/100/100 105/117/117 113/115/115
f 94/101/101 101/112/112 110/116/116
f 105/117/117 97/100/100 89/103/103
f 95/104/104 102/107/107 111/118/118
f 92/105/105 99/109/109 108/119/119
f 96/98/98 103/110/110 112/121/121
f 102/107/107 110/116/116 118/122/122
f 107/108/108 114/114/114 122/123/123
f 108/119/119 116/136/136 109/113/113
f 99/109/109 107/108/108 115/124/124
f 103/110/110 111/118/118 119/125/125
f 101/112/112 109/113/113 117/126/126
f 109/113/113 116/136/136 124/127/127
f 114/114/114 121/130/130 129/128/128
f 113/115/115 120/132/132 128/129/129
f 110/116/116 117/126/126 125/131/131
f 120/132/132 113/115/115 105/117/117
f 111/118/118 118/122/122 126/133/133
f 106/111/111 113/115/115 121/130/130
f 112/121/121 119/125/125 127/134/134
f 108/119/119 115/124/124 123/135/135
f 122/123/123 129/128/128 137/137/137
f 115/124/124 122/123/123 130/138/138
f 123/135/135 131/149/149 124/127/127
f 121/130/130 128/129/129 136/139/139
f 119/125/125 126/133/133 134/140/140
f 117/126/126 124/127/127 132/141/141
f 118/122/122 125/131/131 133/142/142
f 129/128/128 136/139/139 144/143/143
f 128/129/129 135/145/145 143/144/144
f 135/145/145 128/129/129 120/132/132
f 126/133/133 133/142/142 141/146/146
f 125/131/131 132/141/141 140/147/147
f 123/135/135 130/138/138 138/148/148
f 127/134/134 134/140/140 142/150/150
f 124/127/127 131/149/149 139/151/151
f 130/138/138 137/137/137 145/152/152
f 134/140/140 141/146/146 149/153/153
f 136/139/139 143/144/144 152/154/154
f 132/141/141 139/151/151 147/155/155
f 139/158/151 246/252/246 147/253/155
f 137/137/137 144/143/143 153/159/157
f 133/142/142 140/147/147 148/160/158
f 143/144/144 151/163/161 159/161/159
f 140/147/147 147/155/155 156/162/160
f 151/163/161 143/144/144 135/145/145
f 141/146/146 148/160/158 157/164/162
f 155/254/183 246/252/246 248/255/247
f 142/150/150 149/153/153 158/168/165
f 155/254/183 249/256/248 162/169/166
f 144/143/143 152/154/154 160/171/168
f 149/153/153 157/164/162 165/172/169
f 152/154/154 159/161/159 167/173/170
f 147/155/155 155/189/183 163/174/171
f 145/167/152 243/257/249 138/175/148
f 148/160/158 156/162/160 164/177/173
f 145/152/152 153/159/157 161/178/174
f 159/161/159 166/182/177 174/180/175
f 156/162/160 163/174/171 171/181/176
f 166/182/177 159/161/159 151/163/161
f 157/164/162 164/177/173 172/183/178
f 154/179/163 161/178/174 169/184/179
f 158/168/165 165/172/169 173/186/180
f 153/159/157 160/171/168 168/187/181
f 160/171/168 167/173/170 175/188/182
f 155/189/183 162/185/166 170/190/184
f 169/184/179 177/199/193 170/190/184
f 167/173/170 174/180/175 182/191/185
f 163/174/171 170/190/184 178/192/186
f 164/177/173 171/181/176 179/193/187
f 161/178/174 168/187/181 176/194/188
f 165/172/169 172/183/178 180/195/189
f 171/181/176 178/192/186 186/196/190
f 181/197/191 174/180/175 166/182/177
f 169/184/179 176/194/188 184/198/192
f 173/186/180 180/195/189 188/200/194
f 168/187/181 175/188/182 183/201/195
f 172/183/178 179/193/187 187/202/196
f 170/190/184 177/199/193 185/203/197
f 175/188/182 182/191/185 190/204/198
f 184/198/192 192/215/209 185/203/197
f 182/191/185 189/208/202 197/205/199
f 178/192/186 185/203/197 193/206/200
f 179/193/187 186/196/190 194/207/201
f 174/180/175 181/197/191 189/208/202
f 183/201/195 190/204/198 198/209/203
f 180/195/189 187/202/196 195/211/205
f 176/194/188 183/201/195 191/210/204
f 189/208/202 196/213/207 204/212/206
f 196/213/207 189/208/202 181/197/191
f 184/198/192 191/210/204 199/214/208
f 188/200/194 195/211/205 203/216/210
f 187/202/196 194/207/201 202/217/211
f 185/203/197 192/215/209 200/218/212
f 190/204/198 197/205/199 205/219/213
f 186/196/190 193/206/200 201/220/214
f 197/205/199 204/212/206 212/221/215
f 194/207/201 201/220/214 209/222/216
f 198/209/203 205/219/213 213/223/217
f 193/206/200 200/218/212 208/225/219
f 191/210/204 198/209/203 206/224/218
f 195/211/205 202/217/211 210/226/220
f 199/214/208 207/234/228 200/218/212
f 204/212/206 211/228/222 219/227/221
f 211/228/222 204/212/206 196/213/207
f 202/217/211 209/222/216 217/229/223
f 203/216/210 210/226/220 218/230/224
f 200/218/212 207/234/228 215/231/225
f 205/219/213 212/221/215 220/232/226
f 199/214/208 206/224/218 214/233/227
f 201/220/214 208/225/219 216/235/229
f 208/225/219 215/231/225 223/236/230
f 209/222/216 216/235/229 224/237/231
f 213/223/217 220/232/226 228/238/232
f 206/224/218 213/223/217 221/239/233
f 210/226/220 217/229/223 225/240/234
f 207/234/228 214/233/227 222/241/235
f 212/221/215 219/227/221 227/242/236
f 226/243/237 219/227/221 211/228/222
f 218/230/224 225/240/234 233/244/238
f 217/229/223 224/237/231 232/245/239
f 215/231/225 222/241/235 230/246/240
f 214/233/227 221/239/233 229/247/241
f 219/227/221 226/243/237 234/21/21
f 216/235/229 223/236/230 231/248/242
f 223/236/230 230/246/240 238/249/243
f 224/237/231 231/248/242 239/250/244
f 228/238/232 235/1/1 3/3/3
f 221/239/233 228/238/232 236/7/7
f 225/240/234 232/245/239 240/251/245
f 220/232/226 227/242/236 235/1/1
f 227/242/236 234/21/21 2/23/23
f 222/241/235 229/247/241 237/13/13
f 1/16/16 234/21/21 226/243/237
f 233/244/238 240/251/245 242/33/33
f 229/247/241 236/7/7 4/9/9
f 230/246/240 237/13/13 5/10/10
f 231/248/242 238/249/243 241/25/25
f 232/245/239 239/250/244 6/4/4
f 7/22/22 14/15/15 22/37/37
f 13/6/6 242/33/33 240/251/245
f 239/250/244 241/25/25 12/27/27
f 11/12/12 241/25/25 238/249/243
f 2/23/23 7/22/22 15/30/30
f 8/2/2 15/30/30 23/32/32
f 245/166/164 255/258/250 253/259/251
f 246/252/246 252/260/252 254/261/253
f 249/256/248 255/258/250 247/170/167
f 146/176/172 252/260/252 244/157/156
f 245/166/164 251/262/254 243/257/249
f 146/176/172 251/262/254 250/263/255
f 249/256/248 256/264/256 257/265/257
f 246/252/246 256/264/256 248/255/247
f 251/262/254 258/266/248 250/263/255
f 253/259/251 259/267/247 251/262/254
f 255/258/250 261/268/246 253/259/251
f 256/264/256 265/269/172 257/265/257
f 250/263/255 260/270/167 252/260/252
f 252/260/252 262/271/164 254/261/253
f 254/261/253 264/272/249 256/264/256
f 255/258/250 265/269/172 263/273/156
f 262/271/164 258/266/248 261/268/246
f 131/156/149 146/176/172 244/157/156
f 154/165/163 247/170/167 245/166/164
f 162/169/166 249/256/248 247/170/167
f 138/175/148 243/257/249 146/176/172
f 139/158/151 244/157/156 246/252/246
f 155/254/183 147/253/155 246/252/246
f 155/254/183 248/255/247 249/256/248
f 145/167/152 245/166/164 243/257/249
f 245/166/164 247/170/167 255/258/250
f 246/252/246 244/157/156 252/260/252
f 249/256/248 257/265/257 255/258/250
f 146/176/172 250/263/255 252/260/252
f 245/166/164 253/259/251 251/262/254
f 146/176/172 243/257/249 251/262/254
f 249/256/248 248/255/247 256/264/256
f 246/252/246 254/261/253 256/264/256
f 251/262/254 259/267/247 258/266/248
f 253/259/251 261/268/246 259/267/247
f 255/258/250 263/273/156 261/268/246
f 256/264/256 264/272/249 265/269/172
f 250/263/255 258/266/248 260/270/167
f 252/260/252 260/270/167 262/271/164
f 254/261/253 262/271/164 264/272/249
f 255/258/250 257/265/257 265/269/172
f 261/268/246 263/273/156 265/269/172
f 265/269/172 264/272/249 262/271/164
f 262/271/164 260/270/167 258/266/248
f 258/266/248 259/267/247 261/268/246
f 261/268/246 265/269/172 262/271/164


================================================
FILE: src/asset/3d/tank/wheel.obj
================================================
# Blender v2.80 (sub 75) OBJ File: 'wheel.blend'
# www.blender.org
o Cylinder
v 0.000000 0.250000 -0.125000
v 0.000000 0.250000 0.125000
v 0.048773 0.245196 -0.125000
v 0.048773 0.245196 0.125000
v 0.095671 0.230970 -0.125000
v 0.095671 0.230970 0.125000
v 0.138893 0.207867 -0.125000
v 0.138893 0.207867 0.125000
v 0.176777 0.176777 -0.125000
v 0.176777 0.176777 0.125000
v 0.207868 0.138893 -0.125000
v 0.207868 0.138893 0.125000
v 0.230971 0.095671 -0.125000
v 0.230971 0.095671 0.125000
v 0.245197 0.048773 -0.125000
v 0.245197 0.048773 0.125000
v 0.250001 0.000000 -0.125000
v 0.250001 0.000000 0.125000
v 0.245197 -0.048773 -0.125000
v 0.245197 -0.048773 0.125000
v 0.230971 -0.095671 -0.125000
v 0.230971 -0.095671 0.125000
v 0.207868 -0.138893 -0.125000
v 0.207868 -0.138893 0.125000
v 0.176777 -0.176777 -0.125000
v 0.176777 -0.176777 0.125000
v 0.138893 -0.207867 -0.125000
v 0.138893 -0.207867 0.125000
v 0.095671 -0.230970 -0.125000
v 0.095671 -0.230970 0.125000
v 0.048773 -0.245196 -0.125000
v 0.048773 -0.245196 0.125000
v -0.000000 -0.250000 -0.125000
v -0.000000 -0.250000 0.125000
v -0.048773 -0.245196 -0.125000
v -0.048773 -0.245196 0.125000
v -0.095671 -0.230970 -0.125000
v -0.095671 -0.230970 0.125000
v -0.138893 -0.207867 -0.125000
v -0.138893 -0.207867 0.125000
v -0.176778 -0.176777 -0.125000
v -0.176778 -0.176777 0.125000
v -0.207868 -0.138892 -0.125000
v -0.207868 -0.138892 0.125000
v -0.230971 -0.095671 -0.125000
v -0.230971 -0.095671 0.125000
v -0.245197 -0.048772 -0.125000
v -0.245197 -0.048772 0.125000
v -0.250001 0.000000 -0.125000
v -0.250001 0.000000 0.125000
v -0.245197 0.048773 -0.125000
v -0.245197 0.048773 0.125000
v -0.230971 0.095671 -0.125000
v -0.230971 0.095671 0.125000
v -0.207868 0.138893 -0.125000
v -0.207868 0.138893 0.125000
v -0.176777 0.176777 -0.125000
v -0.176777 0.176777 0.125000
v -0.138893 0.207868 -0.125000
v -0.138893 0.207868 0.125000
v -0.095671 0.230970 -0.125000
v -0.095671 0.230970 0.125000
v -0.048772 0.245196 -0.125000
v -0.048772 0.245196 0.125000
v -0.000000 0.260013 -0.130006
v -0.020424 0.274546 -0.128018
v -0.020424 0.274546 0.128018
v -0.000000 0.260013 0.130006
v 0.050726 0.255017 0.130006
v 0.073593 0.265287 0.128018
v 0.073593 0.265287 -0.128018
v 0.050726 0.255017 -0.130006
v 0.086195 0.261464 -0.128018
v 0.099503 0.240220 -0.130006
v 0.099503 0.240220 0.130006
v 0.086195 0.261464 0.128018
v 0.144456 0.216193 0.130006
v 0.169512 0.216930 0.128018
v 0.169512 0.216930 -0.128018
v 0.144456 0.216193 -0.130006
v 0.179692 0.208576 -0.128018
v 0.183857 0.183857 -0.130006
v 0.183857 0.183857 0.130006
v 0.179692 0.208576 0.128018
v 0.216194 0.144455 0.130006
v 0.239625 0.135548 0.128018
v 0.239625 0.135548 -0.128018
v 0.216194 0.144455 -0.130006
v 0.245833 0.123934 -0.128018
v 0.240221 0.099503 -0.130006
v 0.240221 0.099503 0.130006
v 0.245833 0.123934 0.128018
v 0.255018 0.050726 0.130006
v 0.273257 0.033530 0.128018
v 0.273257 0.033530 -0.128018
v 0.255018 0.050726 -0.130006
v 0.274547 0.020424 -0.128018
v 0.260014 0.000000 -0.130006
v 0.260014 0.000000 0.130006
v 0.274547 0.020424 0.128018
v 0.255018 -0.050726 0.130006
v 0.265288 -0.073593 0.128018
v 0.265288 -0.073593 -0.128018
v 0.255018 -0.050726 -0.130006
v 0.261465 -0.086195 -0.128018
v 0.240221 -0.099503 -0.130006
v 0.240221 -0.099503 0.130006
v 0.261465 -0.086195 0.128018
v 0.216194 -0.144455 0.130006
v 0.216931 -0.169512 0.128018
v 0.216931 -0.169512 -0.128018
v 0.216194 -0.144455 -0.130006
v 0.208576 -0.179692 -0.128018
v 0.183857 -0.183857 -0.130006
v 0.183857 -0.183857 0.130006
v 0.208576 -0.179692 0.128018
v 0.144456 -0.216193 0.130006
v 0.135548 -0.239624 0.128018
v 0.135548 -0.239624 -0.128018
v 0.144456 -0.216193 -0.130006
v 0.123934 -0.245832 -0.128018
v 0.099503 -0.240220 -0.130006
v 0.099503 -0.240220 0.130006
v 0.123934 -0.245832 0.128018
v 0.050726 -0.255017 0.130006
v 0.033530 -0.273256 0.128018
v 0.033530 -0.273256 -0.128018
v 0.050726 -0.255017 -0.130006
v 0.020424 -0.274546 -0.128018
v -0.000000 -0.260013 -0.130006
v -0.000000 -0.260013 0.130006
v 0.020424 -0.274546 0.128018
v -0.050726 -0.255017 0.130006
v -0.073593 -0.265287 0.128018
v -0.073593 -0.265287 -0.128018
v -0.050726 -0.255017 -0.130006
v -0.086195 -0.261464 -0.128018
v -0.099503 -0.240220 -0.130006
v -0.099503 -0.240220 0.130006
v -0.086195 -0.261464 0.128018
v -0.144456 -0.216193 0.130006
v -0.169513 -0.216930 0.128018
v -0.169513 -0.216930 -0.128018
v -0.144456 -0.216193 -0.130006
v -0.179692 -0.208576 -0.128018
v -0.183858 -0.183857 -0.130006
v -0.183858 -0.183857 0.130006
v -0.179692 -0.208576 0.128018
v -0.216194 -0.144455 0.130006
v -0.239625 -0.135548 0.128018
v -0.239625 -0.135548 -0.128018
v -0.216194 -0.144455 -0.130006
v -0.245833 -0.123934 -0.128018
v -0.240221 -0.099502 -0.130006
v -0.240221 -0.099502 0.130006
v -0.245833 -0.123934 0.128018
v -0.255018 -0.050726 0.130006
v -0.273257 -0.033529 0.128018
v -0.273257 -0.033529 -0.128018
v -0.255018 -0.050726 -0.130006
v -0.274548 -0.020424 -0.128018
v -0.260014 0.000000 -0.130006
v -0.260014 0.000000 0.130006
v -0.274548 -0.020424 0.128018
v -0.255018 0.050726 0.130006
v -0.265288 0.073593 0.128018
v -0.265288 0.073593 -0.128018
v -0.255018 0.050726 -0.130006
v -0.261465 0.086195 -0.128018
v -0.240221 0.099503 -0.130006
v -0.240221 0.099503 0.130006
v -0.261465 0.086195 0.128018
v -0.216193 0.144456 0.130006
v -0.216931 0.169512 0.128018
v -0.216931 0.169512 -0.128018
v -0.216193 0.144456 -0.130006
v -0.208576 0.179692 -0.128018
v -0.183857 0.183857 -0.130006
v -0.183857 0.183857 0.130006
v -0.208576 0.179692 0.128018
v -0.144456 0.216193 0.130006
v -0.135548 0.239624 0.128018
v -0.135548 0.239624 -0.128018
v -0.144456 0.216193 -0.130006
v -0.123934 0.245832 -0.128018
v -0.099503 0.240221 -0.130006
v -0.099503 0.240221 0.130006
v -0.123934 0.245832 0.128018
v -0.050726 0.255017 0.130006
v -0.033529 0.273256 0.128018
v -0.033529 0.273256 -0.128018
v -0.050726 0.255017 -0.130006
v 0.038788 0.195002 0.101006
v 0.000000 0.198822 0.101006
v 0.076086 0.183688 0.101006
v 0.110460 0.165315 0.101006
v 0.140589 0.140589 0.101006
v 0.165315 0.110460 0.101006
v 0.183689 0.076086 0.101006
v 0.195003 0.038788 0.101006
v 0.198823 0.000000 0.101006
v 0.195003 -0.038788 0.101006
v 0.183689 -0.076086 0.101006
v 0.165315 -0.110460 0.101006
v 0.140589 -0.140589 0.101006
v 0.110460 -0.165315 0.101006
v 0.076086 -0.183688 0.101006
v 0.038788 -0.195002 0.101006
v -0.000000 -0.198822 0.101006
v -0.038789 -0.195002 0.101006
v -0.076086 -0.183688 0.101006
v -0.110460 -0.165315 0.101006
v -0.140589 -0.140589 0.101006
v -0.165315 -0.110460 0.101006
v -0.183689 -0.076086 0.101006
v -0.195003 -0.038788 0.101006
v -0.198823 0.000000 0.101006
v -0.195003 0.038789 0.101006
v -0.183689 0.076086 0.101006
v -0.165315 0.110460 0.101006
v -0.140589 0.140589 0.101006
v -0.110460 0.165315 0.101006
v -0.076086 0.183688 0.101006
v -0.038788 0.195002 0.101006
v 0.024488 0.123107 0.119050
v 0.000000 0.125518 0.119050
v 0.048034 0.115964 0.119050
v 0.069735 0.104365 0.119050
v 0.088755 0.088755 0.119050
v 0.104365 0.069734 0.119050
v 0.115964 0.048034 0.119050
v 0.123107 0.024487 0.119050
v 0.125519 0.000000 0.119050
v 0.123107 -0.024487 0.119050
v 0.115964 -0.048034 0.119050
v 0.104365 -0.069734 0.119050
v 0.088755 -0.088755 0.119050
v 0.069734 -0.104365 0.119050
v 0.048034 -0.115964 0.119050
v 0.024487 -0.123106 0.119050
v -0.000000 -0.125518 0.119050
v -0.024488 -0.123106 0.119050
v -0.048034 -0.115964 0.119050
v -0.069735 -0.104365 0.119050
v -0.088755 -0.088755 0.119050
v -0.104365 -0.069734 0.119050
v -0.115964 -0.048034 0.119050
v -0.123107 -0.024487 0.119050
v -0.125519 0.000000 0.119050
v -0.123107 0.024488 0.119050
v -0.115964 0.048034 0.119050
v -0.104365 0.069734 0.119050
v -0.088755 0.088755 0.119050
v -0.069734 0.104365 0.119050
v -0.048034 0.115964 0.119050
v -0.024487 0.123107 0.119050
v 0.015584 0.078347 0.098577
v 0.000000 0.079882 0.098577
v 0.030570 0.073802 0.098577
v 0.044380 0.066420 0.098577
v 0.056486 0.056485 0.098577
v 0.066420 0.044380 0.098577
v 0.073802 0.030570 0.098577
v 0.078348 0.015584 0.098577
v 0.079883 0.000000 0.098577
v 0.078348 -0.015584 0.098577
v 0.073802 -0.030570 0.098577
v 0.066420 -0.044380 0.098577
v 0.056486 -0.056485 0.098577
v 0.044380 -0.066420 0.098577
v 0.030570 -0.073802 0.098577
v 0.015584 -0.078347 0.098577
v -0.000000 -0.079882 0.098577
v -0.015584 -0.078347 0.098577
v -0.030570 -0.073802 0.098577
v -0.044380 -0.066420 0.098577
v -0.056486 -0.056485 0.098577
v -0.066420 -0.044380 0.098577
v -0.073802 -0.030570 0.098577
v -0.078348 -0.015584 0.098577
v -0.079883 0.000000 0.098577
v -0.078348 0.015584 0.098577
v -0.073802 0.030570 0.098577
v -0.066420 0.044380 0.098577
v -0.056485 0.056485 0.098577
v -0.044380 0.066420 0.098577
v -0.030570 0.073802 0.098577
v -0.015584 0.078347 0.098577
vt 0.097288 0.960814
vt 0.095523 0.932572
vt 0.097288 0.932572
vt 0.095523 0.960814
vt 0.095523 0.932572
vt 0.093758 0.960814
vt 0.091992 0.932572
vt 0.093758 0.932572
vt 0.075635 0.907179
vt 0.073581 0.908865
vt 0.073581 0.908865
vt 0.090227 0.960814
vt 0.088462 0.932572
vt 0.090227 0.932572
vt 0.049629 0.960814
vt 0.049629 0.932572
vt 0.049629 0.932572
vt 0.086697 0.960814
vt 0.084932 0.932572
vt 0.086697 0.932572
vt 0.093758 0.960814
vt 0.083167 0.960814
vt 0.081401 0.932572
vt 0.083167 0.932572
vt 0.077871 0.960814
vt 0.077871 0.932572
vt 0.077871 0.932572
vt 0.079636 0.960814
vt 0.079636 0.932572
vt 0.047864 0.932572
vt 0.047864 0.960814
vt 0.047864 0.960814
vt 0.076106 0.960814
vt 0.074341 0.932572
vt 0.076106 0.932572
vt 0.088354 0.930975
vt 0.085811 0.931746
vt 0.088354 0.930975
vt 0.072576 0.960814
vt 0.070811 0.932572
vt 0.072576 0.932572
vt 0.081401 0.960814
vt 0.081401 0.932572
vt 0.069045 0.960814
vt 0.067280 0.932572
vt 0.069045 0.932572
vt 0.071895 0.925982
vt 0.073581 0.928036
vt 0.073581 0.928036
vt 0.065515 0.960814
vt 0.063750 0.932572
vt 0.065515 0.932572
vt 0.054924 0.932007
vt 0.052280 0.931746
vt 0.052280 0.931746
vt 0.061985 0.960814
vt 0.060220 0.932572
vt 0.061985 0.932572
vt 0.079636 0.960814
vt 0.058455 0.960814
vt 0.056689 0.932572
vt 0.058455 0.932572
vt 0.912589 0.240475
vt 0.912161 0.214329
vt 0.912589 0.214329
vt 0.054924 0.960814
vt 0.053159 0.932572
vt 0.054924 0.932572
vt 0.095691 0.913263
vt 0.096463 0.915806
vt 0.095691 0.913263
vt 0.051394 0.960814
vt 0.051394 0.932572
vt 0.080522 0.905155
vt 0.077979 0.905926
vt 0.077979 0.905926
vt 0.046098 0.932572
vt 0.065515 0.960814
vt 0.198437 0.502542
vt 0.198697 0.499897
vt 0.198697 0.499897
vt 0.044333 0.960814
vt 0.042568 0.932572
vt 0.044333 0.932572
vt 0.898468 0.240475
vt 0.898039 0.214329
vt 0.898468 0.214329
vt 0.096463 0.921095
vt 0.085811 0.905155
vt 0.069871 0.915806
vt 0.060112 0.930975
vt 0.057569 0.931746
vt 0.057569 0.931746
vt 0.064510 0.928036
vt 0.062456 0.929722
vt 0.062456 0.929722
vt 0.066196 0.925982
vt 0.067449 0.923638
vt 0.066196 0.925982
vt 0.068481 0.918450
vt 0.068220 0.921095
vt 0.068220 0.921095
vt 0.067449 0.913263
vt 0.068220 0.915806
vt 0.068220 0.915806
vt 0.064510 0.908865
vt 0.066196 0.910919
vt 0.066196 0.910919
vt 0.060112 0.905926
vt 0.062456 0.907179
vt 0.062456 0.907179
vt 0.054924 0.904894
vt 0.057569 0.905155
vt 0.057569 0.905155
vt 0.052280 0.905155
vt 0.049736 0.905926
vt 0.052280 0.905155
vt 0.045338 0.908865
vt 0.047393 0.907179
vt 0.047393 0.907179
vt 0.042400 0.913263
vt 0.043653 0.910919
vt 0.043653 0.910919
vt 0.041628 0.915806
vt 0.041368 0.918451
vt 0.041628 0.915806
vt 0.041628 0.921095
vt 0.042400 0.923638
vt 0.041628 0.921095
vt 0.043653 0.925982
vt 0.045338 0.928036
vt 0.043653 0.925982
vt 0.049736 0.930975
vt 0.047393 0.929722
vt 0.047393 0.929722
vt 0.080522 0.931746
vt 0.083167 0.932007
vt 0.083167 0.932007
vt 0.046098 0.960814
vt 0.046098 0.932572
vt 0.061985 0.960814
vt 0.091992 0.960814
vt 0.091992 0.932572
vt 0.063750 0.960814
vt 0.063750 0.932572
vt 0.926710 0.240475
vt 0.926282 0.214329
vt 0.926710 0.214329
vt 0.060220 0.960814
vt 0.060220 0.932572
vt 0.076106 0.960814
vt 0.894938 0.240475
vt 0.894509 0.214329
vt 0.894938 0.214329
vt 0.094438 0.910919
vt 0.092752 0.908865
vt 0.092752 0.908865
vt 0.940832 0.240475
vt 0.940403 0.214329
vt 0.940832 0.214329
vt 0.044333 0.960814
vt 0.074341 0.960814
vt 0.074341 0.932572
vt 0.090227 0.960814
vt 0.075635 0.929722
vt 0.077979 0.930975
vt 0.077979 0.930975
vt 0.909059 0.240475
vt 0.908630 0.214329
vt 0.909059 0.214329
vt 0.092752 0.928036
vt 0.090698 0.929722
vt 0.092752 0.928036
vt 0.042568 0.960814
vt 0.042568 0.932572
vt 0.058455 0.960814
vt 0.088462 0.960814
vt 0.088462 0.932572
vt 0.071895 0.910919
vt 0.070642 0.913263
vt 0.070642 0.913263
vt 0.923180 0.240475
vt 0.922751 0.214329
vt 0.923180 0.214329
vt 0.056689 0.960814
vt 0.056689 0.932572
vt 0.072576 0.960814
vt 0.090698 0.907179
vt 0.088354 0.905926
vt 0.088354 0.905926
vt 0.937301 0.240475
vt 0.936873 0.214329
vt 0.937301 0.214329
vt 0.097288 0.960814
vt 0.070811 0.960814
vt 0.070811 0.932572
vt 0.086697 0.960814
vt 0.944362 0.240475
vt 0.943933 0.214329
vt 0.944362 0.214329
vt 0.905529 0.240475
vt 0.905100 0.214329
vt 0.905529 0.214329
vt 0.094438 0.925982
vt 0.095691 0.923638
vt 0.095691 0.923638
vt 0.054924 0.960814
vt 0.084932 0.960814
vt 0.084932 0.932572
vt 0.069610 0.918451
vt 0.069610 0.918451
vt 0.919650 0.240475
vt 0.919221 0.214329
vt 0.919650 0.214329
vt 0.053159 0.960814
vt 0.053159 0.932572
vt 0.069045 0.960814
vt 0.083167 0.904894
vt 0.083167 0.904894
vt 0.933771 0.240475
vt 0.933342 0.214329
vt 0.933771 0.214329
vt 0.067280 0.960814
vt 0.067280 0.932572
vt 0.083167 0.960814
vt 0.901998 0.240475
vt 0.901570 0.214329
vt 0.901998 0.214329
vt 0.096723 0.918450
vt 0.096723 0.918450
vt 0.051394 0.960814
vt 0.930241 0.240475
vt 0.929812 0.214329
vt 0.930241 0.214329
vt 0.069871 0.921095
vt 0.070642 0.923638
vt 0.070642 0.923638
vt 0.916120 0.240475
vt 0.915691 0.214329
vt 0.916120 0.214329
vt 0.890979 0.921218
vt 0.890311 0.947568
vt 0.890311 0.921015
vt 0.944362 0.947365
vt 0.945030 0.920170
vt 0.945030 0.948413
vt 0.944362 0.921218
vt 0.943318 0.920170
vt 0.943318 0.948413
vt 0.943933 0.947365
vt 0.940832 0.947365
vt 0.941500 0.920170
vt 0.941500 0.948413
vt 0.940403 0.921218
vt 0.941447 0.920170
vt 0.940832 0.921218
vt 0.940403 0.947365
vt 0.941447 0.948413
vt 0.939788 0.948413
vt 0.939735 0.920170
vt 0.939735 0.948413
vt 0.937301 0.921218
vt 0.937970 0.948413
vt 0.937301 0.947365
vt 0.936873 0.921218
vt 0.937917 0.920170
vt 0.936257 0.948413
vt 0.936873 0.947365
vt 0.936204 0.920170
vt 0.936204 0.948413
vt 0.933771 0.921218
vt 0.934439 0.948413
vt 0.933771 0.947365
vt 0.932727 0.920170
vt 0.934386 0.920170
vt 0.932727 0.948413
vt 0.933342 0.947365
vt 0.930241 0.921218
vt 0.930909 0.948413
vt 0.930241 0.947365
vt 0.929812 0.921218
vt 0.930856 0.920170
vt 0.929197 0.948413
vt 0.929812 0.947365
vt 0.929144 0.920170
vt 0.929144 0.948413
vt 0.926710 0.921218
vt 0.927379 0.948413
vt 0.926710 0.947365
vt 0.926282 0.921218
vt 0.927326 0.920170
vt 0.926282 0.947365
vt 0.927326 0.948413
vt 0.925666 0.948413
vt 0.925614 0.920170
vt 0.925614 0.948413
vt 0.923180 0.921218
vt 0.923848 0.948413
vt 0.923180 0.947365
vt 0.922136 0.920170
vt 0.923796 0.920170
vt 0.922136 0.948413
vt 0.922751 0.947365
vt 0.919650 0.947365
vt 0.920318 0.920170
vt 0.920318 0.948413
vt 0.919221 0.921218
vt 0.919650 0.921218
vt 0.919221 0.947365
vt 0.918606 0.948413
vt 0.918553 0.920170
vt 0.916120 0.921218
vt 0.916788 0.948413
vt 0.916120 0.947365
vt 0.915691 0.921218
vt 0.916735 0.920170
vt 0.915691 0.947365
vt 0.916735 0.948413
vt 0.915075 0.948413
vt 0.915023 0.920170
vt 0.915023 0.948413
vt 0.912589 0.947365
vt 0.913257 0.920170
vt 0.913257 0.948413
vt 0.912161 0.921218
vt 0.913205 0.920170
vt 0.912589 0.921218
vt 0.911545 0.948413
vt 0.912161 0.947365
vt 0.911492 0.920170
vt 0.909059 0.921218
vt 0.909727 0.948413
vt 0.909059 0.947365
vt 0.908630 0.921218
vt 0.909674 0.920170
vt 0.908015 0.948413
vt 0.908630 0.947365
vt 0.907962 0.920170
vt 0.905529 0.921218
vt 0.906197 0.948413
vt 0.905529 0.947365
vt 0.904485 0.920170
vt 0.906144 0.920170
vt 0.904485 0.948413
vt 0.905100 0.947365
vt 0.904432 0.920170
vt 0.904432 0.948413
vt 0.901998 0.921218
vt 0.902667 0.948413
vt 0.901998 0.947365
vt 0.901570 0.921218
vt 0.902614 0.920170
vt 0.900954 0.948413
vt 0.901570 0.947365
vt 0.900901 0.920170
vt 0.900901 0.948413
vt 0.898468 0.921218
vt 0.899136 0.948413
vt 0.898468 0.947365
vt 0.898039 0.921218
vt 0.899083 0.920170
vt 0.897424 0.948413
vt 0.898039 0.947365
vt 0.897371 0.920170
vt 0.894938 0.921218
vt 0.895606 0.948413
vt 0.894938 0.947365
vt 0.894509 0.921218
vt 0.895553 0.920170
vt 0.894509 0.947365
vt 0.893894 0.948413
vt 0.893841 0.920170
vt 0.893841 0.948413
vt 0.891407 0.921218
vt 0.892076 0.948413
vt 0.891407 0.947365
vt 0.892023 0.920170
vt 0.890979 0.947365
vt 0.892023 0.948413
vt 0.890363 0.948413
vt 0.891407 0.240475
vt 0.890979 0.214329
vt 0.891407 0.214329
vt 0.073242 0.102763
vt 0.075296 0.101077
vt 0.073242 0.102763
vt 0.199262 0.542261
vt 0.197497 0.542261
vt 0.197497 0.542261
vt 0.172616 0.505085
vt 0.171845 0.502542
vt 0.172616 0.505085
vt 0.192672 0.511169
vt 0.194727 0.509483
vt 0.194727 0.509483
vt 0.206323 0.542261
vt 0.204557 0.542261
vt 0.204557 0.542261
vt 0.173869 0.492366
vt 0.172616 0.494710
vt 0.172616 0.494710
vt 0.174550 0.542261
vt 0.172785 0.542261
vt 0.172785 0.542261
vt 0.213383 0.542261
vt 0.211618 0.542261
vt 0.211618 0.542261
vt 0.182496 0.486602
vt 0.179953 0.487373
vt 0.179953 0.487373
vt 0.181610 0.542261
vt 0.179845 0.542261
vt 0.179845 0.542261
vt 0.220444 0.542261
vt 0.218679 0.542261
vt 0.218679 0.542261
vt 0.192672 0.488626
vt 0.190329 0.487373
vt 0.190329 0.487373
vt 0.186906 0.542261
vt 0.188671 0.542261
vt 0.186906 0.542261
vt 0.227504 0.542261
vt 0.225739 0.542261
vt 0.225739 0.542261
vt 0.185141 0.513454
vt 0.182496 0.513193
vt 0.185141 0.513454
vt 0.198437 0.497253
vt 0.197665 0.494710
vt 0.197665 0.494710
vt 0.195732 0.542261
vt 0.193966 0.542261
vt 0.193966 0.542261
vt 0.175555 0.509483
vt 0.173869 0.507429
vt 0.175555 0.509483
vt 0.196412 0.507429
vt 0.197665 0.505085
vt 0.197665 0.505085
vt 0.202792 0.542261
vt 0.201027 0.542261
vt 0.201027 0.542261
vt 0.171845 0.497253
vt 0.171584 0.499898
vt 0.171584 0.499898
vt 0.190329 0.512422
vt 0.187785 0.513193
vt 0.190329 0.512422
vt 0.209853 0.542261
vt 0.208088 0.542261
vt 0.208088 0.542261
vt 0.177609 0.488626
vt 0.175555 0.490312
vt 0.175555 0.490312
vt 0.176315 0.542261
vt 0.178080 0.542261
vt 0.176315 0.542261
vt 0.216913 0.542261
vt 0.215148 0.542261
vt 0.215148 0.542261
vt 0.187785 0.486602
vt 0.185141 0.486341
vt 0.185141 0.486341
vt 0.183376 0.542261
vt 0.185141 0.542261
vt 0.183376 0.542261
vt 0.222209 0.542261
vt 0.223974 0.542261
vt 0.222209 0.542261
vt 0.196412 0.492366
vt 0.194727 0.490312
vt 0.194727 0.490312
vt 0.190436 0.542261
vt 0.192201 0.542261
vt 0.190436 0.542261
vt 0.179953 0.512422
vt 0.177609 0.511169
vt 0.179953 0.512422
vt 0.056689 0.960814
vt 0.058455 0.960814
vt 0.056689 0.960814
vt 0.114600 0.154712
vt 0.112835 0.154712
vt 0.112835 0.154712
vt 0.088123 0.154712
vt 0.089888 0.154712
vt 0.088123 0.154712
vt 0.096124 0.114993
vt 0.096384 0.112348
vt 0.096384 0.112348
vt 0.071556 0.104817
vt 0.070303 0.107161
vt 0.070303 0.107161
vt 0.111070 0.154712
vt 0.109305 0.154712
vt 0.109305 0.154712
vt 0.084593 0.154712
vt 0.086358 0.154712
vt 0.084593 0.154712
vt 0.095352 0.107161
vt 0.096124 0.109704
vt 0.095352 0.107161
vt 0.069271 0.112348
vt 0.069532 0.109704
vt 0.069271 0.112348
vt 0.107540 0.154712
vt 0.105775 0.154712
vt 0.105775 0.154712
vt 0.082828 0.154712
vt 0.081063 0.154712
vt 0.081063 0.154712
vt 0.094099 0.104817
vt 0.092414 0.102763
vt 0.092414 0.102763
vt 0.070303 0.117536
vt 0.069532 0.114993
vt 0.070303 0.117536
vt 0.104010 0.154712
vt 0.102244 0.154712
vt 0.102244 0.154712
vt 0.079297 0.154712
vt 0.077532 0.154712
vt 0.077532 0.154712
vt 0.090359 0.101077
vt 0.088016 0.099824
vt 0.088016 0.099824
vt 0.125191 0.154712
vt 0.123426 0.154712
vt 0.123426 0.154712
vt 0.073242 0.121934
vt 0.071556 0.119880
vt 0.073242 0.121934
vt 0.100479 0.154712
vt 0.098714 0.154712
vt 0.098714 0.154712
vt 0.088016 0.124873
vt 0.085472 0.125644
vt 0.088016 0.124873
vt 0.074002 0.154712
vt 0.075767 0.154712
vt 0.074002 0.154712
vt 0.085472 0.099053
vt 0.082828 0.098792
vt 0.082828 0.098792
vt 0.119896 0.154712
vt 0.121661 0.154712
vt 0.119896 0.154712
vt 0.075296 0.123620
vt 0.077640 0.124873
vt 0.077640 0.124873
vt 0.096949 0.154712
vt 0.095184 0.154712
vt 0.095184 0.154712
vt 0.090359 0.123620
vt 0.092414 0.121934
vt 0.092414 0.121934
vt 0.070472 0.154712
vt 0.072237 0.154712
vt 0.070472 0.154712
vt 0.077640 0.099824
vt 0.080183 0.099053
vt 0.077640 0.099824
vt 0.118131 0.154712
vt 0.116366 0.154712
vt 0.116366 0.154712
vt 0.082828 0.125905
vt 0.080183 0.125644
vt 0.082828 0.125905
vt 0.093419 0.154712
vt 0.091654 0.154712
vt 0.091654 0.154712
vt 0.094099 0.119880
vt 0.095352 0.117536
vt 0.095352 0.117536
vt 0.895008 0.080332
vt 0.902344 0.062619
vt 0.920057 0.069956
vt 0.068220 0.915806
vt 0.067449 0.913263
vt 0.067449 0.913263
vt 0.041368 0.918451
vt 0.041628 0.915806
vt 0.041368 0.918451
vt 0.079636 0.960814
vt 0.077871 0.960814
vt 0.077871 0.960814
vt 0.053159 0.960814
vt 0.054924 0.960814
vt 0.053159 0.960814
vt 0.066196 0.910919
vt 0.064510 0.908865
vt 0.064510 0.908865
vt 0.042400 0.923638
vt 0.041628 0.921095
vt 0.042400 0.923638
vt 0.076106 0.960814
vt 0.074341 0.960814
vt 0.074341 0.960814
vt 0.051394 0.960814
vt 0.049629 0.960814
vt 0.049629 0.960814
vt 0.062456 0.907179
vt 0.060112 0.905926
vt 0.060112 0.905926
vt 0.097288 0.960814
vt 0.095523 0.960814
vt 0.095523 0.960814
vt 0.043653 0.925982
vt 0.045338 0.928036
vt 0.045338 0.928036
vt 0.072576 0.960814
vt 0.070811 0.960814
vt 0.070811 0.960814
vt 0.057569 0.931746
vt 0.060112 0.930975
vt 0.060112 0.930975
vt 0.047864 0.960814
vt 0.046098 0.960814
vt 0.046098 0.960814
vt 0.057569 0.905155
vt 0.054924 0.904894
vt 0.054924 0.904894
vt 0.093758 0.960814
vt 0.091992 0.960814
vt 0.091992 0.960814
vt 0.047393 0.929722
vt 0.049736 0.930975
vt 0.049736 0.930975
vt 0.069045 0.960814
vt 0.067280 0.960814
vt 0.067280 0.960814
vt 0.062456 0.929722
vt 0.064510 0.928036
vt 0.064510 0.928036
vt 0.044333 0.960814
vt 0.042568 0.960814
vt 0.042568 0.960814
vt 0.049736 0.905926
vt 0.052280 0.905155
vt 0.049736 0.905926
vt 0.090227 0.960814
vt 0.088462 0.960814
vt 0.088462 0.960814
vt 0.052280 0.931746
vt 0.054924 0.932007
vt 0.054924 0.932007
vt 0.065515 0.960814
vt 0.063750 0.960814
vt 0.063750 0.960814
vt 0.066196 0.925982
vt 0.067449 0.923638
vt 0.067449 0.923638
vt 0.045338 0.908865
vt 0.047393 0.907179
vt 0.045338 0.908865
vt 0.086697 0.960814
vt 0.084932 0.960814
vt 0.084932 0.960814
vt 0.060220 0.960814
vt 0.061985 0.960814
vt 0.060220 0.960814
vt 0.068220 0.921095
vt 0.068481 0.918450
vt 0.068481 0.918450
vt 0.043653 0.910919
vt 0.042400 0.913263
vt 0.042400 0.913263
vt 0.081401 0.960814
vt 0.083167 0.960814
vt 0.081401 0.960814
vt 0.095523 0.960814
vt 0.075635 0.907179
vt 0.049629 0.960814
vt 0.093758 0.932572
vt 0.077871 0.960814
vt 0.047864 0.932572
vt 0.085811 0.931746
vt 0.081401 0.960814
vt 0.071895 0.925982
vt 0.054924 0.932007
vt 0.079636 0.932572
vt 0.912161 0.240475
vt 0.096463 0.915806
vt 0.080522 0.905155
vt 0.065515 0.932572
vt 0.198437 0.502542
vt 0.898039 0.240475
vt 0.090698 0.929722
vt 0.060112 0.930975
vt 0.064510 0.928036
vt 0.067449 0.923638
vt 0.068481 0.918450
vt 0.067449 0.913263
vt 0.064510 0.908865
vt 0.060112 0.905926
vt 0.054924 0.904894
vt 0.049736 0.905926
vt 0.045338 0.908865
vt 0.042400 0.913263
vt 0.041368 0.918451
vt 0.042400 0.923638
vt 0.045338 0.928036
vt 0.049736 0.930975
vt 0.080522 0.931746
vt 0.046098 0.960814
vt 0.061985 0.932572
vt 0.091992 0.960814
vt 0.063750 0.960814
vt 0.926282 0.240475
vt 0.060220 0.960814
vt 0.076106 0.932572
vt 0.894509 0.240475
vt 0.094438 0.910919
vt 0.940403 0.240475
vt 0.044333 0.932572
vt 0.074341 0.960814
vt 0.090227 0.932572
vt 0.075635 0.929722
vt 0.908630 0.240475
vt 0.042568 0.960814
vt 0.058455 0.932572
vt 0.088462 0.960814
vt 0.071895 0.910919
vt 0.922751 0.240475
vt 0.056689 0.960814
vt 0.072576 0.932572
vt 0.090698 0.907179
vt 0.936873 0.240475
vt 0.097288 0.932572
vt 0.070811 0.960814
vt 0.086697 0.932572
vt 0.943933 0.240475
vt 0.905100 0.240475
vt 0.094438 0.925982
vt 0.054924 0.932572
vt 0.084932 0.960814
vt 0.069871 0.915806
vt 0.919221 0.240475
vt 0.053159 0.960814
vt 0.069045 0.932572
vt 0.085811 0.905155
vt 0.933342 0.240475
vt 0.067280 0.960814
vt 0.083167 0.932572
vt 0.901570 0.240475
vt 0.096463 0.921095
vt 0.051394 0.932572
vt 0.929812 0.240475
vt 0.069871 0.921095
vt 0.915691 0.240475
vt 0.943933 0.921218
vt 0.939788 0.920170
vt 0.937970 0.920170
vt 0.936257 0.920170
vt 0.937917 0.948413
vt 0.933342 0.921218
vt 0.929197 0.920170
vt 0.927379 0.920170
vt 0.925666 0.920170
vt 0.922751 0.921218
vt 0.916788 0.920170
vt 0.915075 0.920170
vt 0.913205 0.948413
vt 0.906197 0.920170
vt 0.905100 0.921218
vt 0.906144 0.948413
vt 0.902667 0.920170
vt 0.900954 0.920170
vt 0.902614 0.948413
vt 0.893894 0.920170
vt 0.892076 0.920170
vt 0.890363 0.920170
vt 0.890979 0.240475
vt 0.075296 0.101077
vt 0.199262 0.542261
vt 0.171845 0.502542
vt 0.192672 0.511169
vt 0.206323 0.542261
vt 0.173869 0.492366
vt 0.174550 0.542261
vt 0.213383 0.542261
vt 0.182496 0.486602
vt 0.181610 0.542261
vt 0.220444 0.542261
vt 0.192672 0.488626
vt 0.188671 0.542261
vt 0.227504 0.542261
vt 0.182496 0.513193
vt 0.198437 0.497253
vt 0.195732 0.542261
vt 0.173869 0.507429
vt 0.196412 0.507429
vt 0.202792 0.542261
vt 0.171845 0.497253
vt 0.187785 0.513193
vt 0.209853 0.542261
vt 0.177609 0.488626
vt 0.178080 0.542261
vt 0.216913 0.542261
vt 0.187785 0.486602
vt 0.185141 0.542261
vt 0.223974 0.542261
vt 0.196412 0.492366
vt 0.192201 0.542261
vt 0.177609 0.511169
vt 0.058455 0.960814
vt 0.114600 0.154712
vt 0.089888 0.154712
vt 0.096124 0.114993
vt 0.071556 0.104817
vt 0.111070 0.154712
vt 0.086358 0.154712
vt 0.096124 0.109704
vt 0.069532 0.109704
vt 0.107540 0.154712
vt 0.082828 0.154712
vt 0.094099 0.104817
vt 0.069532 0.114993
vt 0.104010 0.154712
vt 0.079297 0.154712
vt 0.090359 0.101077
vt 0.125191 0.154712
vt 0.071556 0.119880
vt 0.100479 0.154712
vt 0.085472 0.125644
vt 0.075767 0.154712
vt 0.085472 0.099053
vt 0.121661 0.154712
vt 0.075296 0.123620
vt 0.096949 0.154712
vt 0.090359 0.123620
vt 0.072237 0.154712
vt 0.080183 0.099053
vt 0.118131 0.154712
vt 0.080183 0.125644
vt 0.093419 0.154712
vt 0.094099 0.119880
vt 0.912720 0.087668
vt 0.910177 0.088440
vt 0.907532 0.088700
vt 0.904887 0.088440
vt 0.902344 0.087668
vt 0.900001 0.086415
vt 0.897946 0.084730
vt 0.896260 0.082675
vt 0.894236 0.077789
vt 0.893976 0.075144
vt 0.894236 0.072499
vt 0.895008 0.069956
vt 0.896260 0.067612
vt 0.897946 0.065558
vt 0.900001 0.063872
vt 0.904887 0.061848
vt 0.907532 0.061587
vt 0.910177 0.061848
vt 0.912720 0.062619
vt 0.915064 0.063872
vt 0.917118 0.065558
vt 0.918804 0.067612
vt 0.920828 0.072499
vt 0.921089 0.075144
vt 0.920828 0.077789
vt 0.920057 0.080332
vt 0.918804 0.082675
vt 0.917118 0.084730
vt 0.915064 0.086415
vt 0.068220 0.915806
vt 0.041628 0.915806
vt 0.079636 0.960814
vt 0.054924 0.960814
vt 0.066196 0.910919
vt 0.041628 0.921095
vt 0.076106 0.960814
vt 0.051394 0.960814
vt 0.062456 0.907179
vt 0.097288 0.960814
vt 0.043653 0.925982
vt 0.072576 0.960814
vt 0.057569 0.931746
vt 0.047864 0.960814
vt 0.057569 0.905155
vt 0.093758 0.960814
vt 0.047393 0.929722
vt 0.069045 0.960814
vt 0.062456 0.929722
vt 0.044333 0.960814
vt 0.052280 0.905155
vt 0.090227 0.960814
vt 0.052280 0.931746
vt 0.065515 0.960814
vt 0.066196 0.925982
vt 0.047393 0.907179
vt 0.086697 0.960814
vt 0.061985 0.960814
vt 0.068220 0.921095
vt 0.043653 0.910919
vt 0.083167 0.960814
vn 0.0980 0.9952 0.0000
vn -0.9808 0.1951 0.0000
vn 0.4714 0.8819 0.0000
vn 0.2848 0.3470 -0.8936
vn 0.7730 0.6344 0.0000
vn -0.5556 -0.8315 0.0000
vn 0.9569 0.2903 0.0000
vn 0.9239 -0.3827 0.0000
vn 0.9952 -0.0980 0.0000
vn 0.5556 0.8315 0.0000
vn 0.8819 -0.4714 0.0000
vn 0.7071 0.7071 0.0000
vn 0.6344 -0.7730 0.0000
vn -0.1303 -0.4296 -0.8936
vn 0.2903 -0.9569 0.0000
vn 0.1951 0.9808 0.0000
vn -0.0980 -0.9952 0.0000
vn 0.3470 -0.2848 -0.8936
vn -0.4714 -0.8819 0.0000
vn 0.0440 -0.4468 0.8936
vn -0.7730 -0.6344 0.0000
vn -0.3827 -0.9239 0.0000
vn -0.9569 -0.2903 0.0000
vn -0.6344 -0.7730 0.0000
vn -0.9952 0.0980 0.0000
vn -0.4296 0.1303 -0.8936
vn -0.8819 0.4714 0.0000
vn 0.1303 0.4296 -0.8936
vn -0.6344 0.7730 0.0000
vn -0.9239 0.3827 0.0000
vn -0.4241 -0.0418 0.9046
vn -0.2903 0.9569 0.0000
vn -0.7730 0.6344 0.0000
vn 0.0000 0.0000 -1.0000
vn -0.1303 -0.4296 0.8936
vn -0.2848 -0.3470 0.8936
vn -0.3959 -0.2116 0.8936
vn -0.4468 -0.0440 0.8936
vn -0.4296 0.1303 0.8936
vn -0.3470 0.2848 0.8936
vn -0.2116 0.3959 0.8936
vn -0.0440 0.4468 0.8936
vn 0.1303 0.4296 0.8936
vn 0.2848 0.3470 0.8936
vn 0.3959 0.2116 0.8936
vn 0.4468 0.0440 0.8936
vn 0.4296 -0.1303 0.8936
vn 0.3470 -0.2848 0.8936
vn 0.2116 -0.3959 0.8936
vn 0.0440 -0.4468 -0.8936
vn -0.8315 -0.5556 0.0000
vn -0.7071 0.7071 0.0000
vn -0.8315 0.5556 0.0000
vn 0.8315 -0.5556 0.0000
vn 0.7730 -0.6344 0.0000
vn 0.5556 -0.8315 0.0000
vn -0.7071 -0.7071 0.0000
vn -0.4714 0.8819 0.0000
vn -0.3470 0.2848 -0.8936
vn 0.6344 0.7730 0.0000
vn 0.9239 0.3827 0.0000
vn 0.8315 0.5556 0.0000
vn 0.7071 -0.7071 0.0000
vn 0.2116 -0.3959 -0.8936
vn -0.8819 -0.4714 0.0000
vn -0.2848 -0.3470 -0.8936
vn -0.9808 -0.1951 0.0000
vn -0.3827 0.9239 0.0000
vn -0.5556 0.8315 0.0000
vn 0.3959 0.2116 -0.8936
vn 0.4714 -0.8819 0.0000
vn 0.1951 -0.9808 0.0000
vn -0.9239 -0.3827 0.0000
vn -0.2116 0.3959 -0.8936
vn 0.8819 0.4714 0.0000
vn 1.0000 0.0000 0.0000
vn 0.9808 0.1951 0.0000
vn 0.3827 -0.9239 0.0000
vn 0.2903 0.9569 0.0000
vn -0.9952 -0.0980 0.0000
vn -0.3959 -0.2116 -0.8936
vn 0.0000 1.0000 0.0000
vn -0.1951 0.9808 0.0000
vn 0.4468 0.0440 -0.8936
vn 0.0980 -0.9952 0.0000
vn -0.1951 -0.9808 0.0000
vn -1.0000 0.0000 0.0000
vn -0.0440 0.4468 -0.8936
vn 0.9952 0.0980 0.0000
vn 0.9808 -0.1951 0.0000
vn -0.0000 -1.0000 0.0000
vn -0.9569 0.2903 0.0000
vn -0.4468 -0.0440 -0.8936
vn 0.3827 0.9239 0.0000
vn 0.9569 -0.2903 0.0000
vn 0.4296 -0.1303 -0.8936
vn -0.2903 -0.9569 -0.0000
vn 0.5798 0.8148 0.0000
vn -0.4097 0.9122 0.0000
vn 0.0348 0.1148 -0.9928
vn 0.0348 0.1148 0.9928
vn 0.8474 0.5309 0.0000
vn -0.0294 0.9996 0.0000
vn 0.0761 0.0927 -0.9928
vn 0.0761 0.0927 0.9928
vn 0.9861 0.1662 0.0000
vn 0.3553 0.9347 0.0000
vn 0.1058 0.0565 -0.9928
vn 0.1058 0.0565 0.9928
vn 0.9746 -0.2239 0.0000
vn 0.6860 0.7276 0.0000
vn 0.1193 0.0118 -0.9928
vn 0.1193 0.0118 0.9928
vn 0.8148 -0.5798 0.0000
vn 0.9122 0.4097 0.0000
vn 0.1147 -0.0348 -0.9928
vn 0.1147 -0.0348 0.9928
vn 0.5309 -0.8475 0.0000
vn 0.9996 0.0294 0.0000
vn 0.0927 -0.0761 -0.9928
vn 0.0927 -0.0761 0.9928
vn 0.1662 -0.9861 0.0000
vn 0.9347 -0.3553 0.0000
vn 0.0565 -0.1058 -0.9928
vn 0.0565 -0.1058 0.9928
vn -0.2239 -0.9746 0.0000
vn 0.7276 -0.6860 0.0000
vn 0.0118 -0.1193 -0.9928
vn 0.0118 -0.1193 0.9928
vn -0.5798 -0.8148 0.0000
vn 0.4097 -0.9122 0.0000
vn -0.0348 -0.1147 -0.9928
vn -0.0348 -0.1148 0.9928
vn -0.8474 -0.5309 0.0000
vn 0.0294 -0.9996 0.0000
vn -0.0761 -0.0927 -0.9928
vn -0.0761 -0.0927 0.9928
vn -0.9861 -0.1662 0.0000
vn -0.3553 -0.9347 0.0000
vn -0.1058 -0.0565 -0.9928
vn -0.1058 -0.0565 0.9928
vn -0.9746 0.2239 0.0000
vn -0.6860 -0.7276 0.0000
vn -0.1193 -0.0118 -0.9928
vn -0.1193 -0.0118 0.9928
vn -0.8148 0.5798 0.0000
vn -0.9122 -0.4097 0.0000
vn -0.1148 0.0348 -0.9928
vn -0.1147 0.0348 0.9928
vn -0.5309 0.8475 0.0000
vn -0.9996 -0.0294 0.0000
vn -0.0927 0.0761 -0.9928
vn -0.0927 0.0761 0.9928
vn -0.1662 0.9861 0.0000
vn -0.9347 0.3553 -0.0000
vn -0.0565 0.1058 -0.9928
vn -0.0565 0.1058 0.9928
vn 0.2239 0.9746 0.0000
vn -0.7276 0.6860 0.0000
vn -0.0118 0.1193 -0.9928
vn -0.0118 0.1193 0.9928
vn -0.0980 0.9952 0.0000
vn -0.1523 -0.1856 0.9707
vn 0.0418 0.4241 0.9046
vn 0.4078 -0.1237 0.9046
vn -0.2704 -0.3294 0.9046
vn -0.2704 0.3294 0.9046
vn 0.3759 0.2009 0.9046
vn 0.1237 -0.4078 0.9046
vn -0.4241 0.0418 0.9046
vn 0.1237 0.4078 0.9046
vn 0.3759 -0.2009 0.9046
vn -0.3294 -0.2704 0.9046
vn -0.2009 0.3759 0.9046
vn 0.4078 0.1237 0.9046
vn -0.0418 -0.4241 0.9046
vn 0.0418 -0.4241 0.9046
vn -0.4078 0.1237 0.9046
vn 0.2009 0.3759 0.9046
vn 0.3294 -0.2704 0.9046
vn -0.3759 -0.2009 0.9046
vn -0.1237 0.4078 0.9046
vn 0.4241 0.0418 0.9046
vn -0.1237 -0.4078 0.9046
vn -0.3759 0.2009 0.9046
vn 0.2704 0.3294 0.9046
vn 0.2704 -0.3294 0.9046
vn -0.4078 -0.1237 0.9046
vn -0.0418 0.4241 0.9046
vn 0.4241 -0.0418 0.9046
vn -0.2009 -0.3759 0.9046
vn -0.3294 0.2704 0.9046
vn 0.3294 0.2704 0.9046
vn 0.2009 -0.3759 0.9046
vn 0.3933 0.1193 0.9117
vn 0.2298 0.0697 0.9707
vn -0.1856 -0.1523 0.9707
vn 0.2390 0.0235 0.9707
vn -0.2118 -0.1132 0.9707
vn 0.2390 -0.0235 0.9707
vn -0.2298 -0.0697 0.9707
vn 0.2298 -0.0697 0.9707
vn -0.2390 -0.0235 0.9707
vn 0.2118 -0.1132 0.9707
vn -0.2390 0.0235 0.9707
vn 0.1856 -0.1523 0.9707
vn -0.2298 0.0697 0.9707
vn 0.1523 -0.1856 0.9707
vn -0.2118 0.1132 0.9707
vn 0.1132 -0.2118 0.9707
vn 0.0235 0.2390 0.9707
vn -0.1856 0.1523 0.9707
vn 0.0697 -0.2298 0.9707
vn 0.0697 0.2298 0.9707
vn -0.1523 0.1856 0.9707
vn 0.0235 -0.2390 0.9707
vn 0.1132 0.2118 0.9707
vn -0.1132 0.2118 0.9707
vn -0.0235 -0.2390 0.9707
vn 0.1523 0.1856 0.9707
vn -0.0697 0.2298 0.9707
vn -0.0697 -0.2298 0.9707
vn 0.1856 0.1523 0.9707
vn -0.0235 0.2390 0.9707
vn -0.1132 -0.2118 0.9707
vn 0.2118 0.1132 0.9707
vn 0.0000 0.0000 1.0000
vn -0.3933 0.1193 0.9117
vn 0.4090 0.0403 0.9117
vn -0.3624 0.1937 0.9117
vn 0.4090 -0.0403 0.9117
vn -0.3177 0.2607 0.9117
vn 0.3933 -0.1193 0.9117
vn -0.2607 0.3177 0.9117
vn 0.3624 -0.1937 0.9117
vn -0.1937 0.3624 0.9117
vn -0.0403 -0.4090 0.9117
vn 0.3177 -0.2607 0.9117
vn -0.1193 0.3933 0.9117
vn -0.1193 -0.3933 0.9117
vn 0.2607 -0.3177 0.9117
vn -0.0403 0.4090 0.9117
vn -0.1937 -0.3624 0.9117
vn 0.1937 -0.3624 0.9117
vn 0.0403 0.4090 0.9117
vn -0.2607 -0.3177 0.9117
vn 0.1193 -0.3933 0.9117
vn 0.1193 0.3933 0.9117
vn -0.3177 -0.2607 0.9117
vn 0.0403 -0.4090 0.9117
vn 0.1937 0.3624 0.9117
vn -0.3624 -0.1937 0.9117
vn 0.2607 0.3177 0.9117
vn -0.3933 -0.1193 0.9117
vn 0.3177 0.2607 0.9117
vn -0.4090 -0.0403 0.9117
vn 0.3624 0.1937 0.9117
vn -0.4090 0.0403 0.9117
vn 0.8475 0.5309 0.0000
vn 0.1148 -0.0348 -0.9928
vn 0.1148 -0.0348 0.9928
vn -0.0348 -0.1148 -0.9928
vn -0.8475 -0.5309 0.0000
vn -0.1148 0.0348 0.9928
s off
f 2/1/1 3/2/1 1/3/1
f 4/4/2 72/5/2 3/2/2
f 6/6/3 7/7/3 5/8/3
f 39/9/4 146/10/4 41/11/4
f 10/12/5 11/13/5 9/14/5
f 56/15/6 176/16/6 55/17/6
f 14/18/7 15/19/7 13/20/7
f 5/8/8 75/21/8 6/6/8
f 18/22/9 19/23/9 17/24/9
f 24/25/10 112/26/10 23/27/10
f 22/28/11 23/27/11 21/29/11
f 57/30/12 179/31/12 58/32/12
f 26/33/13 27/34/13 25/35/13
f 5/36/14 72/37/14 74/38/14
f 30/39/15 31/40/15 29/41/15
f 20/42/16 104/43/16 19/23/16
f 34/44/17 35/45/17 33/46/17
f 55/47/18 178/48/18 57/49/18
f 38/50/19 39/51/19 37/52/19
f 2/53/20 189/54/20 64/55/20
f 42/56/21 43/57/21 41/58/21
f 21/29/22 107/59/22 22/28/22
f 46/60/23 47/61/23 45/62/23
f 142/63/24 145/64/24 143/65/24
f 50/66/25 51/67/25 49/68/25
f 21/69/26 104/70/26 106/71/26
f 54/72/27 55/17/27 53/73/27
f 35/74/28 138/75/28 37/76/28
f 58/32/29 59/77/29 57/30/29
f 37/52/30 139/78/30 38/50/30
f 16/79/31 201/80/31 18/81/31
f 62/82/32 63/83/32 61/84/32
f 174/85/33 177/86/33 175/87/33
f 15/88/34 31/89/34 47/90/34
f 6/91/35 69/92/35 4/93/35
f 10/94/36 77/95/36 8/96/36
f 12/97/37 91/98/37 85/99/37
f 18/100/38 93/101/38 16/102/38
f 22/103/39 101/104/39 20/105/39
f 26/106/40 109/107/40 24/108/40
f 30/109/41 117/110/41 28/111/41
f 34/112/42 125/113/42 32/114/42
f 36/115/43 139/116/43 133/117/43
f 42/118/44 141/119/44 40/120/44
f 46/121/45 149/122/45 44/123/45
f 48/124/46 163/125/46 157/126/46
f 52/127/47 171/128/47 165/129/47
f 56/130/48 179/131/48 173/132/48
f 62/133/49 181/134/49 60/135/49
f 63/136/50 65/137/50 1/138/50
f 60/139/51 184/140/51 59/77/51
f 41/58/52 147/141/52 42/56/52
f 8/142/53 80/143/53 7/7/53
f 40/144/54 144/145/54 39/51/54
f 110/146/55 113/147/55 111/148/55
f 44/149/56 152/150/56 43/57/56
f 25/35/57 115/151/57 26/33/57
f 182/152/58 185/153/58 183/154/58
f 23/155/59 114/156/59 25/157/59
f 78/158/60 81/159/60 79/160/60
f 61/84/61 187/161/61 62/82/61
f 28/162/62 120/163/62 27/34/62
f 9/14/63 83/164/63 10/12/63
f 59/165/64 186/166/64 61/167/64
f 150/168/65 153/169/65 151/170/65
f 9/171/66 80/172/66 82/173/66
f 64/174/67 192/175/67 63/83/67
f 45/62/68 155/176/68 46/60/68
f 12/177/69 88/178/69 11/13/69
f 43/179/70 154/180/70 45/181/70
f 118/182/71 121/183/71 119/184/71
f 48/185/72 160/186/72 47/61/72
f 29/41/73 123/187/73 30/39/73
f 27/188/74 122/189/74 29/190/74
f 86/191/75 89/192/75 87/193/75
f 1/3/76 68/194/76 2/1/76
f 32/195/77 128/196/77 31/40/77
f 13/20/78 91/197/78 14/18/78
f 70/198/79 73/199/79 71/200/79
f 158/201/80 161/202/80 159/203/80
f 11/204/81 90/205/81 13/206/81
f 49/68/82 163/207/82 50/66/82
f 16/208/83 96/209/83 15/19/83
f 47/90/84 162/210/84 49/211/84
f 126/212/85 129/213/85 127/214/85
f 52/215/86 168/216/86 51/67/86
f 33/46/87 131/217/87 34/44/87
f 31/89/88 130/218/88 33/219/88
f 94/220/89 97/221/89 95/222/89
f 36/223/90 136/224/90 35/45/90
f 17/24/91 99/225/91 18/22/91
f 166/226/92 169/227/92 167/228/92
f 15/88/93 98/229/93 17/230/93
f 53/73/94 171/231/94 54/72/94
f 102/232/95 105/233/95 103/234/95
f 51/235/96 170/236/96 53/237/96
f 134/238/97 137/239/97 135/240/97
f 66/241/98 68/242/98 65/243/98
f 70/244/99 72/245/99 69/246/99
f 71/247/100 74/248/100 72/245/100
f 70/244/101 75/249/101 76/250/101
f 74/248/102 76/250/102 75/249/102
f 78/251/103 80/252/103 77/253/103
f 81/254/104 80/255/104 79/256/104
f 84/257/105 77/258/105 83/259/105
f 82/260/106 84/257/106 83/261/106
f 87/262/107 85/263/107 86/264/107
f 89/265/108 88/266/108 87/262/108
f 86/264/109 91/267/109 92/268/109
f 90/269/110 92/268/110 91/270/110
f 95/271/111 93/272/111 94/273/111
f 95/271/112 98/274/112 96/275/112
f 94/273/113 99/276/113 100/277/113
f 98/274/114 100/277/114 99/276/114
f 103/278/115 101/279/115 102/280/115
f 105/281/116 104/282/116 103/278/116
f 102/280/117 107/283/117 108/284/117
f 106/285/118 108/284/118 107/286/118
f 111/287/119 109/288/119 110/289/119
f 113/290/120 112/291/120 111/287/120
f 116/292/121 109/293/121 115/294/121
f 114/295/122 116/292/122 115/296/122
f 119/297/123 117/298/123 118/299/123
f 119/297/124 122/300/124 120/301/124
f 118/299/125 123/302/125 124/303/125
f 122/300/126 124/303/126 123/302/126
f 126/304/127 128/305/127 125/306/127
f 129/307/128 128/305/128 127/308/128
f 132/309/129 125/306/129 131/310/129
f 130/311/130 132/309/130 131/310/130
f 135/312/131 133/313/131 134/314/131
f 137/315/132 136/316/132 135/312/132
f 140/317/133 133/318/133 139/319/133
f 138/320/134 140/317/134 139/321/134
f 142/322/135 144/323/135 141/324/135
f 145/325/136 144/326/136 143/327/136
f 142/322/137 147/328/137 148/329/137
f 146/330/138 148/329/138 147/328/138
f 151/331/139 149/332/139 150/333/139
f 153/334/140 152/335/140 151/331/140
f 150/333/141 155/336/141 156/337/141
f 154/338/142 156/337/142 155/336/142
f 159/339/143 157/340/143 158/341/143
f 159/339/144 162/342/144 160/343/144
f 158/341/145 163/344/145 164/345/145
f 162/346/146 164/345/146 163/347/146
f 167/348/147 165/349/147 166/350/147
f 169/351/148 168/352/148 167/348/148
f 166/350/149 171/353/149 172/354/149
f 170/355/150 172/354/150 171/356/150
f 175/357/151 173/358/151 174/359/151
f 177/360/152 176/361/152 175/357/152
f 174/359/153 179/362/153 180/363/153
f 178/364/154 180/363/154 179/362/154
f 183/365/155 181/366/155 182/367/155
f 185/368/156 184/369/156 183/365/156
f 188/370/157 181/366/157 187/371/157
f 186/372/158 188/370/158 187/373/158
f 191/374/159 189/375/159 190/376/159
f 66/241/160 192/377/160 191/374/160
f 67/378/161 189/379/161 68/380/161
f 190/381/162 66/382/162 191/383/162
f 213/384/163 244/385/163 245/386/163
f 34/387/164 210/388/164 36/389/164
f 54/390/165 218/391/165 219/392/165
f 8/393/166 197/394/166 10/395/166
f 26/396/167 206/397/167 28/398/167
f 44/399/168 215/400/168 46/401/168
f 62/402/169 224/403/169 64/404/169
f 18/405/170 202/406/170 20/407/170
f 36/408/171 211/409/171 38/410/171
f 54/411/172 220/412/172 56/413/172
f 10/414/173 198/415/173 12/416/173
f 28/417/174 207/418/174 30/419/174
f 48/420/175 215/421/175 216/422/175
f 2/423/176 193/424/176 4/425/176
f 2/426/177 224/427/177 194/428/177
f 20/429/178 203/430/178 22/431/178
f 38/432/179 212/433/179 40/434/179
f 58/435/180 220/436/180 221/437/180
f 12/438/181 199/439/181 14/440/181
f 30/441/182 208/442/182 32/443/182
f 48/444/183 217/445/183 50/446/183
f 6/447/184 193/448/184 195/449/184
f 22/450/185 204/451/185 24/452/185
f 40/453/186 213/454/186 42/455/186
f 60/456/187 221/457/187 222/458/187
f 14/459/188 200/460/188 16/461/188
f 32/462/189 209/463/189 34/464/189
f 52/465/190 217/466/190 218/467/190
f 8/468/191 195/469/191 196/470/191
f 24/471/192 205/472/192 26/473/192
f 44/474/193 213/475/193 214/476/193
f 62/477/194 222/478/194 223/479/194
f 248/480/195 279/481/195 280/482/195
f 199/483/196 232/484/196 200/485/196
f 214/486/197 245/487/197 246/488/197
f 200/489/198 233/490/198 201/491/198
f 214/492/199 247/493/199 215/494/199
f 201/495/200 234/496/200 202/497/200
f 216/498/201 247/499/201 248/500/201
f 203/501/202 234/502/202 235/503/202
f 217/504/203 248/505/203 249/506/203
f 203/507/204 236/508/204 204/509/204
f 217/510/205 250/511/205 218/512/205
f 204/513/206 237/514/206 205/515/206
f 219/516/207 250/517/207 251/518/207
f 205/519/208 238/520/208 206/521/208
f 219/522/209 252/523/209 220/524/209
f 206/525/210 239/526/210 207/527/210
f 194/528/211 225/529/211 193/530/211
f 221/531/212 252/532/212 253/533/212
f 207/534/213 240/535/213 208/536/213
f 195/537/214 225/538/214 227/539/214
f 222/540/215 253/541/215 254/542/215
f 208/543/216 241/544/216 209/545/216
f 196/546/217 227/547/217 228/548/217
f 222/549/218 255/550/218 223/551/218
f 209/552/219 242/553/219 210/554/219
f 196/555/220 229/556/220 197/557/220
f 224/558/221 255/559/221 256/560/221
f 211/561/222 242/562/222 243/563/222
f 197/564/223 230/565/223 198/566/223
f 194/567/224 256/568/224 226/569/224
f 211/570/225 244/571/225 212/572/225
f 198/573/226 231/574/226 199/575/226
f 283/576/227 275/577/227 267/578/227
f 234/579/228 267/580/228 235/581/228
f 249/582/229 280/583/229 281/584/229
f 235/585/230 268/586/230 236/587/230
f 250/588/231 281/589/231 282/590/231
f 236/591/232 269/592/232 237/593/232
f 251/594/233 282/595/233 283/596/233
f 237/597/234 270/598/234 238/599/234
f 251/600/235 284/601/235 252/602/235
f 238/603/236 271/604/236 239/605/236
f 226/606/237 257/607/237 225/608/237
f 252/609/238 285/610/238 253/611/238
f 239/612/239 272/613/239 240/614/239
f 225/615/240 259/616/240 227/617/240
f 253/618/241 286/619/241 254/620/241
f 240/621/242 273/622/242 241/623/242
f 227/624/243 260/625/243 228/626/243
f 254/627/244 287/628/244 255/629/244
f 241/630/245 274/631/245 242/632/245
f 228/633/246 261/634/246 229/635/246
f 255/636/247 288/637/247 256/638/247
f 243/639/248 274/640/248 275/641/248
f 229/642/249 262/643/249 230/644/249
f 256/645/250 258/646/250 226/647/250
f 243/648/251 276/649/251 244/650/251
f 230/651/252 263/652/252 231/653/252
f 245/654/253 276/655/253 277/656/253
f 231/657/254 264/658/254 232/659/254
f 246/660/255 277/661/255 278/662/255
f 232/663/256 265/664/256 233/665/256
f 246/666/257 279/667/257 247/668/257
f 234/669/258 265/670/258 266/671/258
f 2/1/1 4/4/1 3/2/1
f 4/4/2 69/672/2 72/5/2
f 6/6/3 8/142/3 7/7/3
f 39/9/4 144/673/4 146/10/4
f 10/12/5 12/177/5 11/13/5
f 56/15/6 173/674/6 176/16/6
f 14/18/7 16/208/7 15/19/7
f 5/8/8 74/675/8 75/21/8
f 18/22/9 20/42/9 19/23/9
f 24/25/10 109/676/10 112/26/10
f 22/28/11 24/25/11 23/27/11
f 57/30/12 178/677/12 179/31/12
f 26/33/13 28/162/13 27/34/13
f 5/36/14 3/678/14 72/37/14
f 30/39/15 32/195/15 31/40/15
f 20/42/16 101/679/16 104/43/16
f 34/44/17 36/223/17 35/45/17
f 55/47/18 176/680/18 178/48/18
f 38/50/19 40/144/19 39/51/19
f 2/53/20 68/681/20 189/54/20
f 42/56/21 44/149/21 43/57/21
f 21/29/22 106/682/22 107/59/22
f 46/60/23 48/185/23 47/61/23
f 142/63/24 148/683/24 145/64/24
f 50/66/25 52/215/25 51/67/25
f 21/69/26 19/684/26 104/70/26
f 54/72/27 56/15/27 55/17/27
f 35/74/28 136/685/28 138/75/28
f 58/32/29 60/139/29 59/77/29
f 37/52/30 138/686/30 139/78/30
f 16/79/31 200/687/31 201/80/31
f 62/82/32 64/174/32 63/83/32
f 174/85/33 180/688/33 177/86/33
f 63/136/34 1/138/34 3/678/34
f 3/678/34 5/36/34 7/689/34
f 7/689/34 9/171/34 11/204/34
f 11/204/34 13/206/34 7/689/34
f 13/206/34 15/88/34 7/689/34
f 15/88/34 17/230/34 19/684/34
f 19/684/34 21/69/34 15/88/34
f 21/69/34 23/155/34 15/88/34
f 23/155/34 25/157/34 31/89/34
f 25/157/34 27/188/34 31/89/34
f 27/188/34 29/190/34 31/89/34
f 31/89/34 33/219/34 35/74/34
f 35/74/34 37/76/34 39/9/34
f 39/9/34 41/11/34 47/90/34
f 41/11/34 43/179/34 47/90/34
f 43/179/34 45/181/34 47/90/34
f 47/90/34 49/211/34 51/235/34
f 51/235/34 53/237/34 55/47/34
f 55/47/34 57/49/34 59/165/34
f 59/165/34 61/167/34 63/136/34
f 63/136/34 3/678/34 7/689/34
f 31/89/34 35/74/34 47/90/34
f 35/74/34 39/9/34 47/90/34
f 47/90/34 51/235/34 63/136/34
f 51/235/34 55/47/34 63/136/34
f 55/47/34 59/165/34 63/136/34
f 63/136/34 7/689/34 15/88/34
f 15/88/34 23/155/34 31/89/34
f 63/136/34 15/88/34 47/90/34
f 6/91/35 75/690/35 69/92/35
f 10/94/36 83/691/36 77/95/36
f 12/97/37 14/692/37 91/98/37
f 18/100/38 99/693/38 93/101/38
f 22/103/39 107/694/39 101/104/39
f 26/106/40 115/695/40 109/107/40
f 30/109/41 123/696/41 117/110/41
f 34/112/42 131/697/42 125/113/42
f 36/115/43 38/698/43 139/116/43
f 42/118/44 147/699/44 141/119/44
f 46/121/45 155/700/45 149/122/45
f 48/124/46 50/701/46 163/125/46
f 52/127/47 54/702/47 171/128/47
f 56/130/48 58/703/48 179/131/48
f 62/133/49 187/704/49 181/134/49
f 63/136/50 192/705/50 65/137/50
f 60/139/51 181/706/51 184/140/51
f 41/58/52 146/707/52 147/141/52
f 8/142/53 77/708/53 80/143/53
f 40/144/54 141/709/54 144/145/54
f 110/146/55 116/710/55 113/147/55
f 44/149/56 149/711/56 152/150/56
f 25/35/57 114/712/57 115/151/57
f 182/152/58 188/713/58 185/153/58
f 23/155/59 112/714/59 114/156/59
f 78/158/60 84/715/60 81/159/60
f 61/84/61 186/716/61 187/161/61
f 28/162/62 117/717/62 120/163/62
f 9/14/63 82/718/63 83/164/63
f 59/165/64 184/719/64 186/166/64
f 150/168/65 156/720/65 153/169/65
f 9/171/66 7/689/66 80/172/66
f 64/174/67 189/721/67 192/175/67
f 45/62/68 154/722/68 155/176/68
f 12/177/69 85/723/69 88/178/69
f 43/179/70 152/724/70 154/180/70
f 118/182/71 124/725/71 121/183/71
f 48/185/72 157/726/72 160/186/72
f 29/41/73 122/727/73 123/187/73
f 27/188/74 120/728/74 122/189/74
f 86/191/75 92/729/75 89/192/75
f 1/3/76 65/730/76 68/194/76
f 32/195/77 125/731/77 128/196/77
f 13/20/78 90/732/78 91/197/78
f 70/198/79 76/733/79 73/199/79
f 158/201/80 164/734/80 161/202/80
f 11/204/81 88/735/81 90/205/81
f 49/68/82 162/736/82 163/207/82
f 16/208/83 93/737/83 96/209/83
f 47/90/84 160/738/84 162/210/84
f 126/212/85 132/739/85 129/213/85
f 52/215/86 165/740/86 168/216/86
f 33/46/87 130/741/87 131/217/87
f 31/89/88 128/742/88 130/218/88
f 94/220/89 100/743/89 97/221/89
f 36/223/90 133/744/90 136/224/90
f 17/24/91 98/745/91 99/225/91
f 166/226/92 172/746/92 169/227/92
f 15/88/93 96/747/93 98/229/93
f 53/73/94 170/748/94 171/231/94
f 102/232/95 108/749/95 105/233/95
f 51/235/96 168/750/96 170/236/96
f 134/238/97 140/751/97 137/239/97
f 66/241/98 67/378/98 68/242/98
f 70/244/99 71/247/99 72/245/99
f 71/247/100 73/752/100 74/248/100
f 70/244/101 69/246/101 75/249/101
f 74/248/259 73/752/259 76/250/259
f 78/251/103 79/256/103 80/252/103
f 81/254/104 82/753/104 80/255/104
f 84/257/105 78/251/105 77/258/105
f 82/260/106 81/254/106 84/257/106
f 87/262/107 88/754/107 85/263/107
f 89/265/108 90/755/108 88/266/108
f 86/264/109 85/756/109 91/267/109
f 90/269/110 89/265/110 92/268/110
f 95/271/111 96/275/111 93/272/111
f 95/271/112 97/757/112 98/274/112
f 94/273/113 93/272/113 99/276/113
f 98/274/114 97/757/114 100/277/114
f 103/278/115 104/282/115 101/279/115
f 105/281/260 106/758/260 104/282/260
f 102/280/261 101/279/261 107/283/261
f 106/285/118 105/281/118 108/284/118
f 111/287/119 112/759/119 109/288/119
f 113/290/120 114/760/120 112/291/120
f 116/292/121 110/289/121 109/293/121
f 114/295/122 113/290/122 116/292/122
f 119/297/123 120/301/123 117/298/123
f 119/297/124 121/761/124 122/300/124
f 118/299/125 117/298/125 123/302/125
f 122/300/126 121/761/126 124/303/126
f 126/304/127 127/308/127 128/305/127
f 129/307/128 130/311/128 128/305/128
f 132/309/129 126/304/129 125/306/129
f 130/311/130 129/307/130 132/309/130
f 135/312/131 136/762/131 133/313/131
f 137/315/262 138/763/262 136/316/262
f 140/317/133 134/314/133 133/318/133
f 138/320/263 137/315/263 140/317/263
f 142/322/135 143/327/135 144/323/135
f 145/325/136 146/330/136 144/326/136
f 142/322/137 141/764/137 147/328/137
f 146/330/138 145/325/138 148/329/138
f 151/331/139 152/335/139 149/332/139
f 153/334/140 154/338/140 152/335/140
f 150/333/141 149/332/141 155/336/141
f 154/338/142 153/334/142 156/337/142
f 159/339/143 160/765/143 157/340/143
f 159/339/144 161/766/144 162/342/144
f 158/341/145 157/767/145 163/344/145
f 162/346/146 161/766/146 164/345/146
f 167/348/147 168/768/147 165/349/147
f 169/351/148 170/769/148 168/352/148
f 166/350/264 165/770/264 171/353/264
f 170/355/150 169/351/150 172/354/150
f 175/357/151 176/361/151 173/358/151
f 177/360/152 178/364/152 176/361/152
f 174/359/153 173/358/153 179/362/153
f 178/364/154 177/360/154 180/363/154
f 183/365/155 184/369/155 181/366/155
f 185/368/156 186/771/156 184/369/156
f 188/370/157 182/367/157 181/366/157
f 186/372/158 185/368/158 188/370/158
f 191/374/159 192/772/159 189/375/159
f 66/241/160 65/773/160 192/377/160
f 67/378/161 190/376/161 189/379/161
f 190/381/162 67/774/162 66/382/162
f 213/384/163 212/775/163 244/385/163
f 34/387/164 209/776/164 210/388/164
f 54/390/165 52/777/165 218/391/165
f 8/393/166 196/778/166 197/394/166
f 26/396/167 205/779/167 206/397/167
f 44/399/168 214/780/168 215/400/168
f 62/402/169 223/781/169 224/403/169
f 18/405/170 201/782/170 202/406/170
f 36/408/171 210/783/171 211/409/171
f 54/411/172 219/784/172 220/412/172
f 10/414/173 197/785/173 198/415/173
f 28/417/174 206/786/174 207/418/174
f 48/420/175 46/787/175 215/421/175
f 2/423/176 194/788/176 193/424/176
f 2/426/177 64/789/177 224/427/177
f 20/429/178 202/790/178 203/430/178
f 38/432/179 211/791/179 212/433/179
f 58/435/180 56/792/180 220/436/180
f 12/438/181 198/793/181 199/439/181
f 30/441/182 207/794/182 208/442/182
f 48/444/183 216/795/183 217/445/183
f 6/447/184 4/796/184 193/448/184
f 22/450/185 203/797/185 204/451/185
f 40/453/186 212/798/186 213/454/186
f 60/456/187 58/799/187 221/457/187
f 14/459/188 199/800/188 200/460/188
f 32/462/189 208/801/189 209/463/189
f 52/465/190 50/802/190 217/466/190
f 8/468/191 6/803/191 195/469/191
f 24/471/192 204/804/192 205/472/192
f 44/474/193 42/805/193 213/475/193
f 62/477/194 60/806/194 222/478/194
f 248/480/195 247/807/195 279/481/195
f 199/483/196 231/808/196 232/484/196
f 214/486/197 213/809/197 245/487/197
f 200/489/198 232/810/198 233/490/198
f 214/492/199 246/811/199 247/493/199
f 201/495/200 233/812/200 234/496/200
f 216/498/201 215/813/201 247/499/201
f 203/501/202 202/814/202 234/502/202
f 217/504/203 216/815/203 248/505/203
f 203/507/204 235/816/204 236/508/204
f 217/510/205 249/817/205 250/511/205
f 204/513/206 236/818/206 237/514/206
f 219/516/207 218/819/207 250/517/207
f 205/519/208 237/820/208 238/520/208
f 219/522/209 251/821/209 252/523/209
f 206/525/210 238/822/210 239/526/210
f 194/528/211 226/823/211 225/529/211
f 221/531/212 220/824/212 252/532/212
f 207/534/213 239/825/213 240/535/213
f 195/537/214 193/826/214 225/538/214
f 222/540/215 221/827/215 253/541/215
f 208/543/216 240/828/216 241/544/216
f 196/546/217 195/829/217 227/547/217
f 222/549/218 254/830/218 255/550/218
f 209/552/219 241/831/219 242/553/219
f 196/555/220 228/832/220 229/556/220
f 224/558/221 223/833/221 255/559/221
f 211/561/222 210/834/222 242/562/222
f 197/564/223 229/835/223 230/565/223
f 194/567/224 224/836/224 256/568/224
f 211/570/225 243/837/225 244/571/225
f 198/573/226 230/838/226 231/574/226
f 259/839/227 257/840/227 258/841/227
f 258/841/227 288/842/227 287/843/227
f 287/843/227 286/844/227 283/576/227
f 286/844/227 285/845/227 283/576/227
f 285/845/227 284/846/227 283/576/227
f 283/576/227 282/847/227 281/848/227
f 281/848/227 280/849/227 279/850/227
f 279/850/227 278/851/227 275/577/227
f 278/851/227 277/852/227 275/577/227
f 277/852/227 276/853/227 275/577/227
f 275/577/227 274/854/227 273/855/227
f 273/855/227 272/856/227 271/857/227
f 271/857/227 270/858/227 269/859/227
f 269/859/227 268/860/227 267/578/227
f 267/578/227 266/861/227 265/862/227
f 265/862/227 264/863/227 267/578/227
f 264/863/227 263/864/227 267/578/227
f 263/864/227 262/865/227 261/866/227
f 261/866/227 260/867/227 263/864/227
f 260/867/227 259/839/227 263/864/227
f 259/839/227 258/841/227 283/576/227
f 258/841/227 287/843/227 283/576/227
f 283/576/227 281/848/227 275/577/227
f 281/848/227 279/850/227 275/577/227
f 275/577/227 273/855/227 271/857/227
f 271/857/227 269/859/227 275/577/227
f 269/859/227 267/578/227 275/577/227
f 267/578/227 263/864/227 259/839/227
f 259/839/227 283/576/227 267/578/227
f 234/579/228 266/868/228 267/580/228
f 249/582/229 248/869/229 280/583/229
f 235/585/230 267/870/230 268/586/230
f 250/588/231 249/871/231 281/589/231
f 236/591/232 268/872/232 269/592/232
f 251/594/233 250/873/233 282/595/233
f 237/597/234 269/874/234 270/598/234
f 251/600/235 283/875/235 284/601/235
f 238/603/236 270/876/236 271/604/236
f 226/606/237 258/877/237 257/607/237
f 252/609/238 284/878/238 285/610/238
f 239/612/239 271/879/239 272/613/239
f 225/615/240 257/880/240 259/616/240
f 253/618/241 285/881/241 286/619/241
f 240/621/242 272/882/242 273/622/242
f 227/624/243 259/883/243 260/625/243
f 254/627/244 286/884/244 287/628/244
f 241/630/245 273/885/245 274/631/245
f 228/633/246 260/886/246 261/634/246
f 255/636/247 287/887/247 288/637/247
f 243/639/248 242/888/248 274/640/248
f 229/642/249 261/889/249 262/643/249
f 256/645/250 288/890/250 258/646/250
f 243/648/251 275/891/251 276/649/251
f 230/651/252 262/892/252 263/652/252
f 245/654/253 244/893/253 276/655/253
f 231/657/254 263/894/254 264/658/254
f 246/660/255 245/895/255 277/661/255
f 232/663/256 264/896/256 265/664/256
f 246/666/257 278/897/257 279/667/257
f 234/669/258 233/898/258 265/670/258


================================================
FILE: src/asset/botdef/building_example.json
================================================
{
  "id": {
    "value": 1441884615969752781,
    "phantom": null
  },
  "file_path": "./src/asset/botdef/building_example.json",
  "radius": 0.5,
  "max_life": 1000,
  "turn_accel": 0.0,
  "max_turn_rate": 0.0,
  "accel": 0.0,
  "break_accel": 0.0,
  "max_speed": 0.0,
  "build_power": 0.5,
  "build_dist": 10.0,
  "metal_cost": 100,
  "part_tree": {
    "id": {
      "value": 19713591288447385,
      "phantom": null
    },
    "placed_mesh": null,
    "placed_collider": null,
    "parent_to_self": [
      1.0,
      0.0,
      0.0,
      0.0,
      0.0,
      1.0,
      0.0,
      0.0,
      0.0,
      0.0,
      1.0,
      0.0,
      0.0,
      0.0,
      0.0,
      1.0
    ],
    "joint": "Fix",
    "children": [
      {
        "id": {
          "value": 6444314735306398051,
          "phantom": null
        },
        "placed_mesh": {
          "trans": [
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0
          ],
          "mesh_path": "./src/asset/3d/cube.obj",
          "mesh_index": 0
        },
        "placed_collider": null,
        "parent_to_self": [
          1.0,
          0.0,
          0.0,
          0.0,
          0.0,
          1.0,
          0.0,
          0.0,
          0.0,
          0.0,
          1.0,
          0.0,
          0.0,
          0.0,
          0.0,
          1.0
        ],
        "joint": "Fix",
        "children": []
      }
    ]
  }
}

================================================
FILE: src/asset/botdef/unit_example.json
================================================
{
  "id": {
    "value": 14418846159697527818,
    "phantom": null
  },
  "file_path": "./src/asset/botdef/unit_example.json",
  "radius": 0.5,
  "max_life": 100,
  "turn_accel": 0.44440976,
  "max_turn_rate": 0.38327432,
  "accel": 0.1,
  "break_accel": 0.3,
  "max_speed": 1.0,
  "build_power": 0.5,
  "build_dist": 10.0,
  "metal_cost": 10,
  "part_tree": {
    "id": {
      "value": 197135912884473854,
      "phantom": null
    },
    "placed_mesh": null,
    "placed_collider": null,
    "parent_to_self": [
      1.0,
      0.0,
      0.0,
      0.0,
      0.0,
      1.0,
      0.0,
      0.0,
      0.0,
      0.0,
      1.0,
      0.0,
      0.0,
      0.0,
      0.0,
      1.0
    ],
    "joint": "Fix",
    "children": [
      {
        "id": {
          "value": 1756212347027302969,
          "phantom": null
        },
        "placed_mesh": {
          "trans": [
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0,
            0.0,
            0.0,
            0.0,
            0.0,
            1.0
          ],
          "mesh_path": "./src/asset/3d/tank/base.obj",
          "mesh_index": 3
        },
        "placed_collider": null,
        "parent_to_self": [
          1.0,
          0.0,
          0.0,
          0.0,
          0.0,
          1.0,
          0.0,
          0.0,
          0.0,
          0.0,
          1.0,
          0.0,
          0.0,
          0.0,
          0.25,
          1.0
        ],
        "joint": "Fix",
        "children": [
          {
            "id": {
              "value": 13491902060961674828,
              "phantom": null
            },
            "placed_mesh": {
              "trans": [
                1.0,
                0.0,
                0.0,
                0.0,
                0.0,
                1.0,
                0.0,
                0.0,
                0.0,
                0.0,
                1.0,
                0.0,
                0.315,
                0.005,
                0.0,
                1.0
              ],
              "mesh_path": "./src/asset/3d/tank/canon.obj",
              "mesh_index": 5
            },
            "placed_collider": null,
            "parent_to_self": [
              1.0,
              0.0,
              0.0,
              0.0,
              0.0,
              1.0,
              0.0,
              0.0,
              0.0,
              0.0,
              1.0,
              0.0,
              -0.196,
              0.0,
              0.0,
              1.0
            ],
            "joint": "AimWeapon0",
            "children": []
          },
          {
            "id": {
              "value": 11290295935695058242,
              "phantom": null
            },
            "placed_mesh": {
              "trans": [
                -0.0011959828,
                -1.8058838e-10,
                -0.9999993,
                0.0,
                2.3841828e-7,
                1.0,
                -4.657329e-10,
                0.0,
                0.9999993,
                -2.384187e-7,
                -0.0011959828,
                0.0,
                0.0,
                0.0,
                0.0,
                1.0
              ],
              "mesh_path": "./src/asset/3d/tank/wheel.obj",
              "mesh_index": 4
            },
            "placed_collider": null,
            "parent_to_self": [
              -0.99999875,
              0.001592548,
              0.0,
              0.0,
              -0.001592548,
              -0.99999875,
              0.0,
              0.0,
              0.0,
              0.0,
              1.0,
              0.0,
              -0.516,
              -0.617,
              0.0,
              1.0
            ],
            "joint": "Wheel0",
            "children": []
          },
          {
            "id": {
              "value": 6250614812945715198,
              "phantom": null
            },
            "placed_mesh": {
              "trans": [
                0.010791883,
                0.0,
                -0.99994177,
                0.0,
                0.0,
                1.0,
                0.0,
                0.0,
                0.99994177,
                0.0,
                0.010791883,
                0.0,
                0.0,
                0.0,
                0.0,
                1.0
              ],
              "mesh_path": "./src/asset/3d/tank/wheel.obj",
              "mesh_index": 4
            },
            "placed_collider": null,
            "parent_to_self": [
              -0.99999875,
              0.001592548,
              0.0,
              0.0,
              -0.001592548,
              -0.99999875,
              0.0,
              0.0,
              0.0,
              0.0,
              1.0,
              0.0,
              0.518,
              -0.619,
              0.0,
              1.0
            ],
            "joint": "Wheel0",
            "children": []
          },
          {
            "id": {
              "value": 12952766970854183071,
              "phantom": null
            },
            "placed_mesh": {
              "trans": [
                0.0042427215,
                4.6193324e-7,
                0.999991,
                0.0,
                -0.00010887664,
                1.0,
                0.0,
                0.0,
                -0.999991,
                -0.000108875654,
                0.0042427215,
                0.0,
                0.0,
                0.0,
                0.0,
                1.0
              ],
              "mesh_path": "./src/asset/3d/tank/wheel.obj",
              "mesh_index": 4
            },
            "placed_collider": null,
            "parent_to_self": [
              -0.99999994,
              0.00040736992,
              0.0,
              0.0,
              -0.00040736992,
              -0.99999994,
              0.0,
              0.0,
              0.0,
              0.0,
              1.0,
              0.0,
              0.523,
              0.625,
              0.0,
              1.0
            ],
            "joint": "Wheel0",
            "children": []
          },
          {
            "id": {
              "value": 833497444713801088,
              "phantom": null
            },
            "placed_mesh": {
              "trans": [
                -0.00059798185,
                -0.000007530322,
                -0.9999998,
                0.0,
                0.012592674,
                -0.9999207,
                -4.656272e-10,
                0.0,
                -0.99992055,
                -0.012592672,
                0.00059802923,
                0.0,
                0.0,
                0.0,
                0.0,
                1.0
              ],
              "mesh_path": "./src/asset/3d/tank/wheel.obj",
              "mesh_index": 4
            },
            "placed_collider": null,
            "parent_to_self": [
              -0.999954,
              -0.009592537,
              0.0,
              0.0,
              0.009592537,
              -0.999954,
              0.0,
              0.0,
              0.0,
              0.0,
              1.0,
              0.0,
              -0.525,
              0.609,
              0.0,
              1.0
            ],
            "joint": "Wheel0",
            "children": []
          }
        ]
      }
    ]
  }
}

================================================
FILE: src/asset/map/map_example/data.json
================================================
{
  "metal_spots": []
}

================================================
FILE: src/botdef.rs
================================================
use crate::unit;
use crate::utils;
use serde::{Deserialize, Serialize};
use typename::TypeName;
use utils::Id;

#[derive(Clone, TypeName, Debug, Serialize, Deserialize, PartialEq)]
pub struct BotDef {
    pub id: Id<BotDef>,
    pub file_path: String,
    pub radius: f32,
    pub max_life: i32,
    //Movement
    ///rad/frame²
    pub turn_accel: f32,
    ///rad/frame
    pub max_turn_rate: f32,
    ///m/frame²
    pub accel: f32,
    ///m/frame²
    pub break_accel: f32,
    ///m/frame
    pub max_speed: f32,
    ///metal/frame
    pub build_power: f32,
    ///m
    pub build_dist: f32,
    ///metal
    pub metal_cost: i32,

    pub part_tree: unit::PartTree,
}


================================================
FILE: src/client/camera.rs
================================================
extern crate nalgebra as na;
use super::client::*;
use na::{Matrix4, Point3, Vector3};

const FOVY: f32 = 3.14 / 4.0;
const NEAR: f32 = 1.0;
const FAR: f32 = 8000.0;

pub fn create_view(pos: &Point3<f32>, dir: &Vector3<f32>) -> Matrix4<f32> {
    Matrix4::look_at_rh(pos, &(pos + dir), &Vector3::new(0.0, 0.0, 1.0))
}

pub fn create_normal(pos: &Point3<f32>, dir: &Vector3<f32>) -> Matrix4<f32> {
    create_view(pos, dir).try_inverse().unwrap().transpose()
}

pub fn create_proj(aspect_ratio: f32, near: f32) -> Matrix4<f32> {
    let mx_projection = Matrix4::new_perspective(aspect_ratio, FOVY, near, FAR);
    let mx_correction: Matrix4<f32> = Matrix4::new(
        1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0,
    );
    mx_correction * mx_projection
}

pub fn create_view_proj(
    aspect_ratio: f32,
    near: f32,
    pos: &Point3<f32>,
    dir: &Vector3<f32>,
) -> Matrix4<f32> {
    let mx_view = create_view(pos, dir);
    let mx_proj = create_proj(aspect_ratio, near);
    mx_proj * mx_view
}

pub fn create_camera_uniform_vec(
    screen_res: (u32, u32),
    near: f32,
    pos: &Point3<f32>,
    dir: &Vector3<f32>,
) -> Vec<f32> {
    let mut res = Vec::new();
    //ViewProj
    let mx_total = create_view_proj(screen_res.0 as f32 / screen_res.1 as f32, near, pos, dir);
    let mx_ref: &[f32] = mx_total.as_slice();
    res.extend_from_slice(mx_ref);
    //View
    let mx_total = create_view(pos, dir);
    let mx_ref: &[f32] = mx_total.as_slice();
    res.extend_from_slice(mx_ref);
    //Proj
    let mx_total = create_proj(screen_res.0 as f32 / screen_res.1 as f32, near);
    let mx_ref: &[f32] = mx_total.as_slice();
    res.extend_from_slice(mx_ref);
    //Normal
    let mx_total = create_normal(pos, dir);
    let mx_ref: &[f32] = mx_total.as_slice();
    res.extend_from_slice(mx_ref);
    res
}

impl App {
    pub fn rts_camera(&mut self, sim_sec: f32) {
        use winit::event::VirtualKeyCode as Key;
        let key_pressed = &self.input_state.key_pressed;
        let on = |vkc| key_pressed.contains(&vkc);

        let mut offset = Vector3::new(0.0, 0.0, 0.0);
        let mut dir_offset = self.game_state.dir.clone();
        let mut new_dir = None;

        let camera_ground_height = self.heightmap_gpu.phy.z(
            self.game_state
                .position
                .x
                .max(0.0)
                .min(self.heightmap_gpu.phy.width as f32 - 1.0),
            self.game_state
                .position
                .y
                .max(0.0)
                .min(self.heightmap_gpu.phy.height as f32 - 1.0),
        );

        let screen_center_world_pos_fallback = self.game_state.position_smooth
            + self.game_state.dir_smooth * (40.0 - self.game_state.position_smooth.z)
                / self.game_state.dir_smooth.z;

        let height_from_ground = self.game_state.position.z - camera_ground_height;
        let distance_camera_middle_screen = self
            .game_state
            .screen_center_world_pos
            .or(Some(screen_center_world_pos_fallback.coords))
            .map(|scwp| (self.game_state.position.coords - scwp).magnitude())
            .unwrap_or(height_from_ground);
        let k =
            (if !on(Key::LShift) { 1.0 } else { 2.0 }) * distance_camera_middle_screen.max(10.0);
        //Game
        if on(Key::S) {
            offset.y -= k;
        }
        if on(Key::Z) {
            offset.y += k;
        }
        if on(Key::Q) {
            offset.x -= k;
        }
        if on(Key::D) {
            offset.x += k;
        }

        if on(Key::LControl) {
            if let Some(screen_center_world_pos) = self
                .game_state
                .screen_center_world_pos
                .or(Some(screen_center_world_pos_fallback.coords))
            {
                if self.input_state.last_scroll != 0.0 {
                    let camera_to_center =
                        screen_center_world_pos - self.game_state.position.coords;

                    let distance = camera_to_center.norm();

                    let mut new_camera_to_center = camera_to_center.normalize();

                    if self.input_state.last_scroll > 0.0 {
                        new_camera_to_center.y += 1.0 * 0.30;
                    }
                    if self.input_state.last_scroll < 0.0 {
                        new_camera_to_center.z -= 1.0 * 0.30;
                    }
                    new_camera_to_center.x = 0.0;

                    new_camera_to_center = new_camera_to_center.normalize();
                    new_camera_to_center.y = new_camera_to_center.y.max(0.01);

                    new_dir = Some(new_camera_to_center);
                    let new_pos =
                        screen_center_world_pos - new_camera_to_center.normalize() * distance;
                    offset += (new_pos - self.game_state.position.coords) / sim_sec;
                }
            } else {
                if self.input_state.last_scroll > 0.0 {
                    dir_offset.y += 0.010 / sim_sec;
                }
                if self.input_state.last_scroll < 0.0 {
                    dir_offset.z -= 0.010 / sim_sec;
                }
            }
        } else {
            if let Some(mouse_world_pos) = self
                .game_state
                .mouse_world_pos
                .or(Some(screen_center_world_pos_fallback.coords))
            {
                let u = (mouse_world_pos - self.game_state.position.coords).normalize();
                offset += self.input_state.last_scroll * u * k * 0.75 * 0.320 / sim_sec;
            } else {
                offset.z = -self.input_state.last_scroll * k * 0.75 * 0.20 / sim_sec;
            }
        }

        self.game_state.position += offset * sim_sec;
        self.game_state.dir = (self.game_state.dir + dir_offset * 33.0 * sim_sec).normalize();

        new_dir.map(|new_dir| {
            self.game_state.dir = new_dir;
        });

        self.game_state.position.z = self.game_state.position.z.max(camera_ground_height + 3.0);

        if self.game_state.position.coords.magnitude() > 7000.0 {
            self.game_state.position =
                Point3::from(7000.0 * self.game_state.position.coords.normalize());
        }

        self.game_state.position_smooth += (self.game_state.position.coords
            - self.game_state.position_smooth.coords)
            * sim_sec.min(0.033)
            * 15.0;

        self.game_state.dir_smooth +=
            (self.game_state.dir - self.game_state.dir_smooth) * sim_sec.min(0.033) * 15.0;
    }

    pub fn orbit_camera(&mut self, sim_sec: f32) {
        let to_orbit =
            (self.unit_editor.orbit.coords - self.game_state.position_smooth.coords).normalize();

        let right_vec = to_orbit.cross(&Vector3::new(0.0, 0.0, 1.0)).normalize();
        let up_vec = -to_orbit.cross(&right_vec).normalize();
        if self
            .input_state
            .mouse_pressed
            .contains(&winit::event::MouseButton::Middle)
        {
            let k = 3.0;
            let right_offset = -self.input_state.cursor_offset.0 as f32 * right_vec * sim_sec * k;
            let up_offset = self.input_state.cursor_offset.1 as f32 * up_vec * sim_sec * k;
            self.game_state.position += right_offset + up_offset;
            self.game_state.position_smooth += right_offset + up_offset;

            if self
                .input_state
                .key_pressed
                .contains(&winit::event::VirtualKeyCode::LShift)
            {
                self.unit_editor.orbit += right_offset + up_offset;
            }
        }

        let to_orbit =
            (self.unit_editor.orbit.coords - self.game_state.position_smooth.coords).normalize();

        self.game_state.dir = to_orbit;
        self.game_state.dir_smooth = self.game_state.dir;

        self.game_state.position += self.input_state.last_scroll * to_orbit * sim_sec * 15.0;
        self.game_state.position_smooth = self.game_state.position;
    }
}


================================================
FILE: src/client/game_state.rs
================================================
extern crate nalgebra as na;
use super::heightmap_editor;
use crate::botdef;
use crate::frame::Frame;
use crate::mobile;
use crate::utils;
use fnv::{FnvHashMap, FnvHashSet};
use na::{Matrix4, Point3, Vector2, Vector3};
use std::time::Instant;
use utils::*;

use super::uitool::UiTool;
use crate::frame::Player;
use mobile::*;

#[derive(Clone, Copy, Debug)]
pub struct Explosion {
    pub position: Point3<f32>,
    pub born_sec: f32,
    pub death_sec: f32,
    pub size: f32,
    pub seed: f32,
}

pub struct State {
    pub position: Point3<f32>,
    pub dir: Vector3<f32>,

    pub position_smooth: Point3<f32>,
    pub dir_smooth: Vector3<f32>,

    pub mouse_world_pos: Option<Vector3<f32>>,
    pub screen_center_world_pos: Option<Vector3<f32>>,

    pub heightmap_editor: heightmap_editor::State,

    //Data to interpolate
    pub frame_minus_one: Frame,
    pub frame_zero: Frame,
    pub frame_zero_time_received: Instant,

    //Interpolated from curve
    pub kbots: Vec<(KBot, ClientKbot)>,
    pub server_sec: f32,
    //Extrapolated from events
    pub explosions: Vec<Explosion>,
    pub kinematic_projectiles_cache: FnvHashMap<Id<KinematicProjectile>, KinematicProjectile>,
    pub kinematic_projectiles: Vec<Point3<f32>>,

    pub selected: FnvHashSet<Id<KBot>>,
    pub under_mouse: Option<Id<KBot>>,
    pub uitool: UiTool,

    pub start_time: Instant,
    pub last_frame: Instant,

    pub my_player_id: Option<Id<Player>>,

    pub players: FnvHashMap<Id<Player>, Player>,

    pub fps: u64,

    //parameters
    pub unit_icon_distance: f32,
}

impl State {
    pub fn new() -> Self {
        State {
            position: Point3::new(1024.0, 100.0, 50.0),
            dir: Vector3::new(0.0, 0.3, -1.0),
            position_smooth: Point3::new(0.0, 0.0, 30000.0),
            dir_smooth: Vector3::new(0.0, 0.01, -1.0),

            mouse_world_pos: None,
            screen_center_world_pos: None,

            heightmap_editor: heightmap_editor::State::new(),

            frame_minus_one: Frame::new(),
            frame_zero: Frame::new(),
            frame_zero_time_received: Instant::now(),

            kbots: Vec::new(),
            kinematic_projectiles_cache: FnvHashMap::default(),
            kinematic_projectiles: Vec::new(),

            explosions: Vec::new(),
            server_sec: 0.0,

            selected: FnvHashSet::default(),
            under_mouse: None,
            uitool: UiTool::None,

            players: FnvHashMap::default(),
            my_player_id: None,

            start_time: Instant::now(),
            last_frame: Instant::now(),
            fps: 144,
            unit_icon_distance: 200.0,
        }
    }

    pub fn handle_new_frame(&mut self, frame: Frame) {
        let time_between = self.frame_zero_time_received.elapsed();
        log::trace!("receive: NewFrame after {:?}", time_between);
        self.frame_zero_time_received = Instant::now();
        self.frame_minus_one = std::mem::replace(&mut self.frame_zero, frame);

        let sec = self.frame_zero.number as f32 / 10.0;
        let mut seed = sec * 3.141592;

        for explosion in self.frame_zero.explosions.iter() {
            seed += 1.0;
            self.explosions.push(Explosion {
                position: explosion.position,
                born_sec: sec,
                death_sec: sec + explosion.life_time,
                size: explosion.size,
                seed,
            });
        }

        for proj_b in self.frame_zero.kinematic_projectiles_birth.iter() {
            self.kinematic_projectiles_cache
                .insert(proj_b.id, proj_b.clone());
        }

        for dead in self.frame_zero.kinematic_projectiles_dead.iter() {
            self.kinematic_projectiles_cache.remove(dead);
        }

        self.selected = self
            .selected
            .difference(&self.frame_zero.kbots_dead.iter().cloned().collect())
            .copied()
            .collect();

        self.kbots = self
            .frame_zero
            .kbots
            .values()
            .map(|kbot| (kbot.clone(), ClientKbot::new(kbot.position)))
            .collect();
    }

    pub fn interpolate(&mut self, threadpool: &rayon::ThreadPool, view_proj: &Matrix4<f32>) {
        let elapsed = self.frame_zero_time_received.elapsed().as_secs_f64();
        //elapsed normalize between 0 and 1 if frame arrives every 100ms (0.1s)
        let lambda = (elapsed / 0.1) as f32;
        let i0 = lambda;
        let im = 1.0 - lambda;

        self.server_sec =
            (self.frame_zero.number as f32 * i0 + self.frame_minus_one.number as f32 * im) / 10.0;

        log::trace!("server_sec {}", self.server_sec);

        use rayon::prelude::*;
        fn test_screen(
            id: Id<KBot>,
            position: Point3<f32>,
            view_proj: &Matrix4<f32>,
        ) -> Option<(Id<KBot>, Vector2<f32>, f32)> {
            let p = position.to_homogeneous();
            let r = view_proj * p;
            let margin = 1.2;
            let rw_with_margin = r.w * margin;
            //Keeping those of the clipped space in screen (-1 1, -1 1 , 0 1)
            if r.z > 0.0
                && r.x < rw_with_margin
                && r.x > -rw_with_margin
                && r.y < rw_with_margin
                && r.y > -rw_with_margin
            {
                // log::debug!("z {}", r.w);
                // log::debug!("d {}", (position.coords - cam_pos.coords).norm());
                Some((id, Vector2::new(r.x / r.w, r.y / r.w), r.w))
            } else {
                None
            }
        }

        self.explosions = self
            .explosions
            .iter()
            .copied()
            .filter(|e| e.death_sec > self.server_sec)
            .collect();

        let mut kbots = std::mem::replace(&mut self.kbots, Vec::new());

        threadpool.install(|| {
            kbots.par_chunks_mut(1000).for_each(|chunk| {
                for (kbot_0, client_kbot0) in chunk.iter_mut() {
                    let kbot_m_opt = self.frame_minus_one.kbots.get(&kbot_0.id);
                    if let Some(kbot_m) = kbot_m_opt {
                        client_kbot0.position =
                            kbot_0.position * i0 + (im * kbot_m.position).coords;
                    }

                    let screen = test_screen(kbot_0.id, client_kbot0.position, view_proj);
                    match screen {
                        Some((_, screen_pos, distance_to_camera)) => {
                            if let Some(kbot_m) = kbot_m_opt {
                                client_kbot0.dir = kbot_0.dir * i0 + kbot_m.dir * im;
                                client_kbot0.up = kbot_0.up * i0 + kbot_m.up * im;
                                client_kbot0.weapon0_dir =
                                    kbot_0.weapon0_dir * i0 + kbot_m.weapon0_dir * im;
                                client_kbot0.wheel0_angle =
                                    kbot_0.wheel0_angle * i0 + kbot_m.wheel0_angle * im;
                            }
                            client_kbot0.is_in_screen = true;
                            let mat = utils::face_towards_dir(
                                &client_kbot0.position.coords,
                                &(client_kbot0.dir.normalize()),
                                &client_kbot0.up,
                            );
                            client_kbot0.trans = Some(mat);
                            client_kbot0.distance_to_camera = distance_to_camera;
                            client_kbot0.screen_pos = screen_pos;
                        }
                        _ => {
                            client_kbot0.is_in_screen = false;
                        }
                    }
                }
            });
        });

        self.kbots = kbots;
        self.kinematic_projectiles.clear();

        for kproj in self.kinematic_projectiles_cache.values_mut() {
            let pos = kproj.position_at(self.frame_minus_one.number + 1) * im
                + kproj.position_at(self.frame_zero.number + 1).coords * i0;

            self.kinematic_projectiles.push(pos);
        }

        self.players = self.frame_zero.players.clone();
    }

    pub fn my_player(&self) -> Option<&Player> {
        self.my_player_id
            .map(|id| self.players.get(&id))
            .unwrap_or(None)
    }

    pub fn near(&self) -> f32 {
        if self.position_smooth.z > 515.0
            || self.position_smooth.coords.x < -500.0
            || self.position_smooth.coords.y < -500.0
        {
            10.0
        } else {
            0.3
        }
    }
}


================================================
FILE: src/client/heightmap_editor.rs
================================================
use imgui::*;
use na::Vector3;
use std::collections::HashSet;

use crate::gpu_obj::heightmap_gpu;
use noise::{NoiseFn, Seedable};

#[derive(PartialEq, Clone, Copy)]
pub enum Mode {
    Raise,
    Flatten,
    Median,
    Noise,
    Blur,
}

pub struct State {
    pub map_path: String,
    pub pen_radius: u32,
    pub pen_strength: f32,
    pub mode: Mode,
    noise: noise::Perlin,
    noise_freq: f64,
    min_z: f32,
    max_z: f32,
}

impl State {
    pub fn new() -> Self {
        State {
            map_path: "src/asset/map/map_example".to_owned(),
            pen_radius: 30,
            pen_strength: 2.0,
            mode: Mode::Raise,
            noise: noise::Perlin::new().set_seed(0),
            noise_freq: 10.0,
            min_z: 0.0,
            max_z: heightmap_gpu::MAX_Z,
        }
    }

    pub fn draw_ui(&mut self, ui: &Ui, heightmap_gpu: &mut heightmap_gpu::HeightmapGpu) {
        let pen_radius = &mut self.pen_radius;
        let pen_strength = &mut self.pen_strength;
        let mode = &mut self.mode;
        let noise_freq = &mut self.noise_freq;
        let noise_seed: &mut i32 = &mut (self.noise.seed() as i32);
        let mut update_noise = false;

        let min_z = &mut self.min_z;
        let max_z = &mut self.max_z;
        let edit_height_window = imgui::Window::new(im_str!("Heightmap editor"));
        edit_height_window
            .size([400.0, 300.0], imgui::Condition::FirstUseEver)
            .position([3.0, 415.0], imgui::Condition::FirstUseEver)
            .collapsed(false, imgui::Condition::FirstUseEver)
            .build(&ui, || {
                ui.radio_button(im_str!("Raise/Lower"), mode, Mode::Raise);
                ui.radio_button(im_str!("Flatten/Unflatten"), mode, Mode::Flatten);
                ui.radio_button(im_str!("Median"), mode, Mode::Median);
                ui.radio_button(im_str!("Blur"), mode, Mode::Blur);
                ui.radio_button(im_str!("Noise"), mode, Mode::Noise);

                if mode == &mut Mode::Noise {
                    imgui::Slider::new(im_str!("noise frequency"), 0.0_f64..=200.0)
                        .power(3.0)
                        .build(&ui, noise_freq);

                    update_noise = ui
                        .drag_int(im_str!("noise seed"), noise_seed)
                        .min(0)
                        .build();
                    ui.separator();
                } else {
                    ui.separator();
                }

                imgui::Slider::new(im_str!("pen radius"), 1..=1000).build(&ui, pen_radius);
                imgui::Slider::new(im_str!("pen strength"), 0.0..=10.0).build(&ui, pen_strength);
                ui.separator();

                imgui::Slider::new(im_str!("min height"), 0.0..=heightmap_gpu::MAX_Z)
                    .build(&ui, min_z);
                imgui::Slider::new(im_str!("max height"), 0.0..=heightmap_gpu::MAX_Z)
                    .build(&ui, max_z);

                if ui.small_button(im_str!("Save")) {
                    Self::save(heightmap_gpu, "src/asset/map/map_example");
                }

                if ui.small_button(im_str!("Clear")) {
                    for i in 0..heightmap_gpu.phy.width * heightmap_gpu.phy.height {
                        heightmap_gpu.phy.texels[i as usize] = 50.0;
                    }
                    heightmap_gpu.update_rect(
                        0 as u32,
                        0 as u32,
                        heightmap_gpu.phy.width as u32,
                        heightmap_gpu.phy.height as u32,
                    );
                }

                if ui.small_button(im_str!("Load")) {
                    Self::load(heightmap_gpu, "src/asset/map/map_example");
                }
            });

        // let window_selector = imgui::Window::new(im_str!("Map Selector"));
        // window_selector
        //     .size([400.0, 200.0], imgui::Condition::FirstUseEver)
        //     .position([400.0, 3.0], imgui::Condition::FirstUseEver)
        //     .collapsed(false, imgui::Condition::FirstUseEver)
        //     .build(&ui, || {
        //         // Self::visit_dirs_for_selection(ui);
        //     });

        self.max_z = max_z.max(*min_z);
        if update_noise {
            self.noise = self.noise.set_seed(*noise_seed as u32);
        }
    }

    pub fn handle_user_input(
        &self,
        mouse_pressed: &HashSet<winit::event::MouseButton>,
        mouse_world_pos: &Vector3<f32>,
        heightmap_gpu: &mut heightmap_gpu::HeightmapGpu,
    ) {
        log::trace!("heightmap_editor handle_user_input");
        {
            let pen_strength = self.pen_strength
                * if mouse_pressed.contains(&winit::event::MouseButton::Left) {
                    1.0
                } else if mouse_pressed.contains(&winit::event::MouseButton::Right) {
                    -1.0
                } else {
                    0.0
                };

            if pen_strength != 0.0 {
                let (x, y) = (mouse_world_pos.x, mouse_world_pos.y);

                let middle_i = x.floor() as i32;
                let middle_j = y.floor() as i32;

                let pen_size = self.pen_radius as i32;
                let pen_size2 = pen_size * pen_size;

                let min_i = (middle_i - pen_size).max(0);
                let min_j = (middle_j - pen_size).max(0);

                let max_i = (middle_i + pen_size).min(heightmap_gpu.phy.width as i32 - 1);
                let max_j = (middle_j + pen_size).min(heightmap_gpu.phy.height as i32 - 1);

                let size_i = max_i - min_i + 1;
                let size_j = max_j - min_j + 1;

                if size_i > 0 && size_j > 0 {
                    //let start = std::time::Instant::now();

                    let mut pixels = Vec::with_capacity((size_i * size_j) as usize);
                    for j in min_j..=max_j {
                        for i in min_i..=max_i {
                            let falloff = 1.0
                                - (i32::pow(i - middle_i, 2) + i32::pow(j - middle_j, 2)) as f32
                                    / pen_size2 as f32;

                            pixels.push((
                                i,
                                j,
                                (i + j * heightmap_gpu.phy.width as i32) as usize,
                                falloff.max(0.0),
                            ));
                        }
                    }

                    match self.mode {
                        Mode::Raise => {
                            for (_, _, index, falloff) in pixels {
                                let power = pen_strength * falloff;
                                heightmap_gpu.phy.texels[index] = (heightmap_gpu.phy.texels[index]
                                    + power)
                                    .min(self.max_z)
                                    .max(self.min_z);
                            }
                        }
                        Mode::Flatten => {
                            let mut average = 0.0;
                            for (_, _, index, _) in &pixels {
                                let z = heightmap_gpu.phy.texels[*index];
                                average += z;
                            }
                            average /= (size_i * size_j) as f32;
                            for (_, _, index, falloff) in pixels {
                                let power = (pen_strength * falloff) / 50.0;
                                let z = heightmap_gpu.phy.texels[index] * (1.0 - power)
                                    + average * power;
                                heightmap_gpu.phy.texels[index] = z.min(self.max_z).max(self.min_z);
                            }
                        }
                        Mode::Noise => {
                            for (i, j, index, falloff) in pixels {
                                let power = pen_strength
                                    * falloff
                                    * self.noise.get([
                                        (0.001 * self.noise_freq) * i as f64,
                                        (0.001 * self.noise_freq) * j as f64,
                                    ]) as f32;

                                heightmap_gpu.phy.texels[index] = (heightmap_gpu.phy.texels[index]
                                    + power)
                                    .min(self.max_z)
                                    .max(self.min_z);
                            }
                        }
                        Mode::Median => {
                            let mut new_pix = Vec::new();
                            for (i, j, index, _) in pixels {
                                let power = pen_strength / 10.0;

                                let kernel = 4;
                                let mut acc = Vec::new();

                                for ti in (-kernel + i).max(0)
                                    ..=(kernel + i).min(heightmap_gpu.phy.width as i32 - 1)
                                {
                                    for tj in (-kernel + j).max(0)
                                        ..=(kernel + j).min(heightmap_gpu.phy.height as i32 - 1)
                                    {
                                        let tindex =
                                            (ti + tj * heightmap_gpu.phy.width as i32) as usize;
                                        acc.push(
                                            (heightmap_gpu.phy.texels[tindex] * 1000.0 * 1000.0)
                                                .floor()
                                                as i128,
                                        );
                                    }
                                }
                                acc.sort();
                                new_pix.push((
                                    index,
                                    heightmap_gpu.phy.texels[index] * (1.0 - power)
                                        + power * (acc[acc.len() / 2] as f64 / 1000000.0) as f32,
                                ));
                            }
                            for (index, z) in new_pix {
                                heightmap_gpu.phy.texels[index] = z.min(self.max_z).max(self.min_z);
                            }
                        }
                        Mode::Blur => {
                            let mut new_pix = Vec::new();
                            for (i, j, index, falloff) in pixels {
                                let power = pen_strength * falloff / 10.0;

                                let kernel = 1;
                                let mut acc = 0.0;
                                let mut tap = 0;

                                for ti in (-kernel + i).max(0)
                                    ..=(kernel + i).min(heightmap_gpu.phy.width as i32 - 1)
                                {
                                    for tj in (-kernel + j).max(0)
                                        ..=(kernel + j).min(heightmap_gpu.phy.height as i32 - 1)
                                    {
                                        tap += 1;
                                        let tindex =
                                            (ti + tj * heightmap_gpu.phy.width as i32) as usize;
                                        acc += heightmap_gpu.phy.texels[tindex];
                                    }
                                }
                                let z = heightmap_gpu.phy.texels
                                    [(i + j * heightmap_gpu.phy.width as i32) as usize]
                                    * (1.0 - power)
                                    + power * (acc / tap as f32);
                                new_pix.push((index, z));
                            }
                            for (index, z) in new_pix {
                                heightmap_gpu.phy.texels[index] = z.min(self.max_z).max(self.min_z);
                            }
                        }
                    }

                    heightmap_gpu.update_rect(
                        min_i as u32,
                        min_j as u32,
                        size_i as u32,
                        size_j as u32,
                    );
                    //                    println!("handle hei took {}", start.elapsed().as_micros());
                }
            }
        }
    }

    pub fn save(heightmap_gpu: &heightmap_gpu::HeightmapGpu, path: &str) {
        use std::fs::File;
        use std::io::BufWriter;
        use std::path::Path;

        let height_path = format!("{}/height.png", path);
        let height_path = Path::new(&height_path);
        let file = File::create(height_path).unwrap();
        let ref mut w = BufWriter::new(file);

        let mut encoder = png::Encoder::new(
            w,
            heightmap_gpu.phy.width as u32,
            heightmap_gpu.phy.height as u32,
        );
        encoder.set_color(png::ColorType::Grayscale);
        encoder.set_depth(png::BitDepth::Sixteen);
        let mut writer = encoder.write_header().unwrap();

        let data: Vec<u8> = heightmap_gpu
            .phy
            .texels
            .iter()
            .map(|e| ((e / 511.0).min(1.0).max(0.0) * 65535.0) as u16)
            .flat_map(|e| vec![(e >> 8) as u8, e as u8])
            .collect();
        //        let data = &data[..] ;//[255, 0, 0, 255, 0, 0, 0, 255]; // An array containing a RGBA sequence. First pixel is red and second pixel is black.
        writer.write_image_data(&data).unwrap(); // Save

        let json_path = &format!("{}/data.json", path);

        use std::fs::OpenOptions;
        use std::io::prelude::*;
        use std::io::BufReader;
        let file = OpenOptions::new()
            .read(true)
            .write(true)
            .create(true)
            .truncate(true)
            .open(json_path)
            .unwrap();
        let mut buf_w = BufWriter::new(file);
        serde_json::to_writer_pretty(buf_w, &heightmap_gpu.phy.data);
    }

    pub fn load(heightmap_gpu: &mut heightmap_gpu::HeightmapGpu, path: &str) {
        use byteorder::{BigEndian, ReadBytesExt};
        use std::fs::File;
        use std::io::Cursor;
        let height_path = format!("{}/height.png", path);
        let mut decoder = png::Decoder::new(File::open(&height_path).unwrap());
        decoder.set_transformations(png::Transformations::IDENTITY);
        let (info, mut reader) = decoder.read_info().unwrap();
        log::debug!("info: {:?}", info.width);
        log::debug!("height: {:?}", info.height);
        log::debug!("bit depth: {:?}", info.bit_depth);
        log::debug!("buffer size: {:?}", info.buffer_size());
        let mut buf = vec![0; info.buffer_size()];
        reader.next_frame(&mut buf).unwrap();
        // Transform buffer into 16 bits slice.
        let mut buffer_u16 = vec![0; (info.width * info.height) as usize];
        let mut buffer_cursor = Cursor::new(buf);
        buffer_cursor
            .read_u16_into::<BigEndian>(&mut buffer_u16)
            .unwrap();

        for i in 0..heightmap_gpu.phy.width * heightmap_gpu.phy.height {
            heightmap_gpu.phy.texels[i as usize] =
                buffer_u16[i as usize] as f32 / (65535.0 / 511.0);
        }
        heightmap_gpu.update_rect(
            0 as u32,
            0 as u32,
            heightmap_gpu.phy.width as u32,
            heightmap_gpu.phy.height as u32,
        );
    }
}


================================================
FILE: src/client/input_state.rs
================================================
use std::collections::HashSet;

#[derive(Clone, Debug)]
pub enum Drag {
    None,
    Start { x0: u32, y0: u32 },
    Dragging { x0: u32, y0: u32, x1: u32, y1: u32 },
    End { x0: u32, y0: u32, x1: u32, y1: u32 },
}

#[derive(Clone, Debug)]
pub struct InputState {
    pub key_pressed: HashSet<winit::event::VirtualKeyCode>,
    pub mouse_pressed: HashSet<winit::event::MouseButton>,
    pub key_trigger: HashSet<winit::event::VirtualKeyCode>,
    pub mouse_trigger: HashSet<winit::event::MouseButton>,
    pub key_release: HashSet<winit::event::VirtualKeyCode>,
    pub mouse_release: HashSet<winit::event::MouseButton>,
    pub drag: Drag,
    pub last_scroll: f32,
    pub cursor_pos: (u32, u32),
    pub cursor_offset: (i32, i32),
}

impl InputState {
    pub fn new() -> Self {
        InputState {
            key_pressed: HashSet::new(),
            mouse_pressed: HashSet::new(),
            key_trigger: HashSet::new(),
            mouse_trigger: HashSet::new(),
            key_release: HashSet::new(),
            mouse_release: HashSet::new(),
            last_scroll: 0.0,
            cursor_pos: (0, 0),
            cursor_offset: (0, 0),
            drag: Drag::None,
        }
    }

    pub fn update(&mut self) {
        self.key_trigger.clear();
        self.mouse_trigger.clear();
        self.mouse_release.clear();
        self.key_release.clear();
        if let Drag::End { .. } = self.drag {
            self.drag = Drag::None;
        }
        self.last_scroll = 0.0;
        self.cursor_offset = (0, 0);
    }
}


================================================
FILE: src/client/misc.rs
================================================
use super::client::*;
use crate::*;
use unit_part_gpu::*;

use super::uitool::UiTool;
impl App {
    pub fn clear_gpu_instance_and_game_state(&mut self) {
        self.game_state.players.clear();
        self.game_state.my_player_id = None;
        self.game_state.kbots.clear();
        self.game_state.selected.clear();
        self.game_state.explosions.clear();
        self.game_state.kinematic_projectiles_cache.clear();
        // self.unit_editor.root.children.clear();

        self.health_bar.update_instance(&[], &self.gpu.device);
        self.unit_icon.update_instance(&[], &self.gpu.device);
        self.explosion_gpu.update_instance(&[], &self.gpu.device);
        for (model_gpu_state) in self.unit_part_gpu.states.iter_mut() {
            match model_gpu_state {
                ModelGpuState::Ready(model_gpu) => {
                    model_gpu.update_instance_dirty(&[], &self.gpu.device)
                }
                _ => {}
            }
        }
        self.kinematic_projectile_gpu
            .update_instance_dirty(&[], &self.gpu.device);
    }

    pub fn visit_part_tree(
        part_tree: &unit::PartTree,
        root_trans: &Matrix4<f32>,
        unit_part_gpu: &mut UnitPartGpu,
        highlight_factor: f32,
        team: f32,
        con_completed: f32,
        weapon0_dir: Vector3<f32>,
        wheel0_angle: f32,
    ) {
        for c in part_tree.children.iter() {
            if let Some(placed_mesh) = &c.placed_mesh {
                let display_model = &placed_mesh;

                let combined = match &c.joint {
                    unit::Joint::Fix => root_trans * c.parent_to_self,
                    unit::Joint::AimWeapon0 => {
                        let comb = root_trans * c.parent_to_self;

                        utils::face_towards_dir(
                            &Vector3::new(comb[12], comb[13], comb[14]),
                            &weapon0_dir,
                            &Vector3::new(0.0, 0.0, 1.0),
                        )
                    }
                    unit::Joint::Wheel0 => {
                        let comb = root_trans * c.parent_to_self;

                        comb * utils::face_towards_dir(
                            &Vector3::new(0.0, 0.0, 0.0),
                            &Vector3::new(0.0, 1.0, 0.0),
                            &Vector3::new(f32::cos(wheel0_angle), 0.0, f32::sin(wheel0_angle)),
                        )
                    }
                };

                let for_display = combined * display_model.trans;
                // log::warn!(
                //     "root {:?}\nlocal {:?}\ncombined {:?}\n",
                //     root_trans,
                //     mat,
                //     combined
                // );

                //TODO fix performance : HALF OF TIME IS IN GET_MUT
                match unit_part_gpu.get_mut(placed_mesh.mesh_index) {
                    //}  get_mut(&placed_mesh.mesh_path) {
                    ModelGpuState::Ready(generic_cpu) => {
                        let buf = &mut generic_cpu.instance_attr_cpu_buf;

                        let isometry: Isometry3<f32> = unsafe {
                            na::convert_unchecked::<Matrix4<f32>, Isometry3<f32>>(for_display)
                        };
                        let euler = isometry.rotation.euler_angles();
                        buf.push(for_display[12]);
                        buf.push(for_display[13]);
                        buf.push(for_display[14]);
                        buf.push(euler.0);
                        buf.push(euler.1);
                        buf.push(euler.2);

                        //Bit representation in decimal order
                        //SELECTED TEAM TEAM
                        //ex : team 5 and selected = 1 0 5
                        let bitpacked: f32 = highlight_factor * 100. + team;

                        buf.push(bitpacked);
                        buf.push(con_completed);
                    }
                    _ => {}
                }
                Self::visit_part_tree(
                    c,
                    &combined,
                    unit_part_gpu,
                    highlight_factor,
                    team,
                    con_completed,
                    weapon0_dir,
                    wheel0_angle,
                );
            } else {
                Self::visit_part_tree(
                    c,
                    root_trans,
                    unit_part_gpu,
                    highlight_factor,
                    team,
                    con_completed,
                    weapon0_dir,
                    wheel0_angle,
                );
            }
        }
    }

    pub fn upload_to_gpu(&mut self, view_proj: &Matrix4<f32>, encoder: &mut wgpu::CommandEncoder) {
        //Upload to gpu
        let upload_to_gpu_duration = time(|| {
            let unit_icon_distance = self.game_state.unit_icon_distance;

            //generic_gpu
            {
                for model_gpu in self.unit_part_gpu.states.iter_mut() {
                    match model_gpu {
                        ModelGpuState::Ready(model_gpu) => {
                            model_gpu.instance_attr_cpu_buf.clear();
                        }
                        _ => {}
                    }
                }

                let identity = utils::face_towards_dir(
                    &Vector3::new(300.0_f32, 100.0, 0.50),
                    &Vector3::new(1.0, 0.0, 0.0),
                    &Vector3::new(0.0, 0.0, 1.0),
                ); //Matrix4::identity();

                let t = self.game_state.start_time.elapsed().as_secs_f32();
                if self.main_menu == MainMode::UnitEditor {
                    Self::visit_part_tree(
                        &self.unit_editor.botdef.part_tree,
                        &identity,
                        &mut self.unit_part_gpu,
                        0.0,
                        0.0,
                        1.0,
                        Vector3::new(f32::cos(t), f32::sin(t), f32::sin(t / 5.0) * 0.1).normalize(),
                        (t * 2.0),
                    );
                }

                //Kbot
                {
                    for (mobile, client_kbot) in
                        self.game_state.kbots.iter_mut().filter(|e| {
                            e.1.is_in_screen && e.1.distance_to_camera < unit_icon_distance
                        })
                    {
                        let mat = client_kbot.trans.unwrap();

                        let highlight_factor: f32 = match (
                            self.game_state.selected.contains(&mobile.id),
                            self.game_state.under_mouse == Some(mobile.id),
                        ) {
                            (true, false) => 1.0,
                            (false, false) => 0.0,
                            (false, true) => 2.0,
                            (true, true) => 3.0,
                        };

                        let team = mobile.team;

                        if let Some(botdef) =
                            self.game_state.frame_zero.bot_defs.get(&mobile.botdef_id)
                        {
                            Self::visit_part_tree(
                                &botdef.part_tree,
                                &mat,
                                &mut self.unit_part_gpu,
                                highlight_factor,
                                team as f32,
                                mobile.con_completed,
                                client_kbot.weapon0_dir,
                                client_kbot.wheel0_angle,
                            );
                        }
                    }
                }

                for model_gpu in self.unit_part_gpu.states.iter_mut() {
                    match model_gpu {
                        ModelGpuState::Ready(model_gpu) => {
                            model_gpu.update_instance_dirty_own_buffer(&self.gpu.device);
                        }
                        _ => {}
                    }
                }
            }

            // //Kbot
            // {
            //     self.vertex_attr_buffer_f32.clear();

            //     for mobile in self
            //         .game_state
            //         .kbots
            //         .iter()
            //         .filter(|e| e.is_in_screen && e.distance_to_camera < unit_icon_distance)
            //     {
            //         let mat = mobile.trans.unwrap();
            //         let is_selected = if self.game_state.selected.contains(&mobile.id.value) {
            //             1.0
            //         } else {
            //             0.0
            //         };
            //         let team = mobile.team;

            //         self.vertex_attr_buffer_f32
            //             .extend_from_slice(mat.as_slice());
            //         self.vertex_attr_buffer_f32.push(is_selected);
            //         self.vertex_attr_buffer_f32.push(team as f32)
            //     }

            //     self.kbot_gpu
            //         .update_instance_dirty(&self.vertex_attr_buffer_f32[..], &self.gpu.device);
            // }
            //Kinematic Projectile
            self.vertex_attr_buffer_f32.clear();
            for mobile in self.game_state.kinematic_projectiles.iter() {
                let mat = utils::face_towards_dir(
                    &mobile.coords,
                    &(Vector3::new(1.0, 0.0, 0.0)),
                    &Vector3::new(0.0, 0.0, 1.0),
                );

                let isometry: Isometry3<f32> =
                    unsafe { na::convert_unchecked::<Matrix4<f32>, Isometry3<f32>>(mat) };
                let euler = isometry.rotation.euler_angles();

                self.vertex_attr_buffer_f32.push(mat[12]);
                self.vertex_attr_buffer_f32.push(mat[13]);
                self.vertex_attr_buffer_f32.push(mat[14]);
                self.vertex_attr_buffer_f32.push(euler.0);
                self.vertex_attr_buffer_f32.push(euler.1);
                self.vertex_attr_buffer_f32.push(euler.2);
                self.vertex_attr_buffer_f32.push(99.);
                self.vertex_attr_buffer_f32.push(1.0)
            }

            self.kinematic_projectile_gpu
                .update_instance_dirty(&self.vertex_attr_buffer_f32[..], &self.gpu.device);

            //Arrow
            self.vertex_attr_buffer_f32.clear();
            for arrow in self.game_state.frame_zero.arrows.iter() {
                let mat = Matrix4::face_towards(
                    &arrow.position,
                    &arrow.end,
                    &Vector3::new(0.0, 0.0, 1.0),
                );

                self.vertex_attr_buffer_f32
                    .extend_from_slice(mat.as_slice());
                self.vertex_attr_buffer_f32
                    .extend_from_slice(&arrow.color[..3]);
                self.vertex_attr_buffer_f32
                    .push((arrow.end.coords - arrow.position.coords).magnitude());
            }

            self.arrow_gpu
                .update_instance(&self.vertex_attr_buffer_f32[..], &self.gpu.device);

            //Unit life
            self.vertex_attr_buffer_f32.clear();
            for (kbot, client_kbot) in self
                .game_state
                .kbots
                .iter()
                .filter(|e| e.1.is_in_screen && e.1.distance_to_camera < unit_icon_distance)
            {
                let distance = (self.game_state.position_smooth.coords
                    - client_kbot.position.coords)
                    .magnitude();

                let alpha_range = 10.0;
                let max_dist = 100.0;
                let alpha = (1.0 + (max_dist - distance) / alpha_range)
                    .min(1.0)
                    .max(0.0)
                    .powf(2.0);

                let alpha_range = 50.0;
                let size_factor = (0.3 + (max_dist - distance) / alpha_range)
                    .min(1.0)
                    .max(0.3)
                    .powf(1.0);

Download .txt
gitextract_h9fjhbh5/

├── .gitignore
├── Cargo.toml
├── LICENSE
├── README.md
└── src/
    ├── asset/
    │   ├── 3d/
    │   │   ├── arrow.obj
    │   │   ├── axis_debug.obj
    │   │   ├── cube.obj
    │   │   ├── small_sphere.obj
    │   │   └── tank/
    │   │       ├── base.obj
    │   │       ├── canon.obj
    │   │       └── wheel.obj
    │   ├── botdef/
    │   │   ├── building_example.json
    │   │   └── unit_example.json
    │   └── map/
    │       └── map_example/
    │           └── data.json
    ├── botdef.rs
    ├── client/
    │   ├── camera.rs
    │   ├── game_state.rs
    │   ├── heightmap_editor.rs
    │   ├── input_state.rs
    │   ├── misc.rs
    │   ├── mod.rs
    │   ├── play.rs
    │   ├── render.rs
    │   ├── uitool.rs
    │   ├── unit_editor.rs
    │   └── unit_part_gpu.rs
    ├── frame.rs
    ├── frame_server/
    │   └── mod.rs
    ├── glsl.rs
    ├── gpu_obj/
    │   ├── arrow_gpu.rs
    │   ├── blit_texture.rs
    │   ├── explosion.rs
    │   ├── glsl_compiler.rs
    │   ├── gpu.rs
    │   ├── health_bar.rs
    │   ├── heightmap_gpu.rs
    │   ├── heightmap_helper.rs
    │   ├── imgui_wgpu.rs
    │   ├── line.rs
    │   ├── mod.rs
    │   ├── model_gpu.rs
    │   ├── post_fx.rs
    │   ├── post_fxaa.rs
    │   ├── texture_view_bicopy.rs
    │   ├── trait_gpu.rs
    │   ├── unit_icon.rs
    │   └── water.rs
    ├── heightmap_phy.rs
    ├── main.rs
    ├── manager.rs
    ├── mobile.rs
    ├── moddef.rs
    ├── model.rs
    ├── net_client.rs
    ├── net_server.rs
    ├── procedural_texels.rs
    ├── shader/
    │   ├── arrow.frag
    │   ├── arrow.vert
    │   ├── blit_texture.frag
    │   ├── blit_texture.vert
    │   ├── compiled/
    │   │   ├── arrow.frag.spirv
    │   │   ├── arrow.vert.spirv
    │   │   ├── blit_texture.frag.spirv
    │   │   ├── blit_texture.vert.spirv
    │   │   ├── cube_instanced.frag.spirv
    │   │   ├── cube_instanced.vert.spirv
    │   │   ├── explosion.frag.spirv
    │   │   ├── explosion.vert.spirv
    │   │   ├── health_bar.frag.spirv
    │   │   ├── health_bar.vert.spirv
    │   │   ├── heightmap.frag.spirv
    │   │   ├── heightmap.vert.spirv
    │   │   ├── imgui.frag.spirv
    │   │   ├── imgui.vert.spirv
    │   │   ├── line.frag.spirv
    │   │   ├── line.vert.spirv
    │   │   ├── post.vert.spirv
    │   │   ├── post_bicopy.frag.spirv
    │   │   ├── post_fxaa.frag.spirv
    │   │   ├── post_ui.frag.spirv
    │   │   ├── unit_icon.frag.spirv
    │   │   ├── unit_icon.vert.spirv
    │   │   ├── water.frag.spirv
    │   │   └── water.vert.spirv
    │   ├── cube_instanced.frag
    │   ├── cube_instanced.vert
    │   ├── explosion.frag
    │   ├── explosion.vert
    │   ├── health_bar.frag
    │   ├── health_bar.vert
    │   ├── heightmap.frag
    │   ├── heightmap.vert
    │   ├── imgui.frag
    │   ├── imgui.vert
    │   ├── line.frag
    │   ├── line.vert
    │   ├── post.vert
    │   ├── post_bicopy.frag
    │   ├── post_fxaa.frag
    │   ├── post_ui.frag
    │   ├── unit_icon.frag
    │   ├── unit_icon.vert
    │   ├── water.frag
    │   └── water.vert
    ├── unit.rs
    └── utils.rs
Download .txt
SYMBOL INDEX (334 symbols across 43 files)

FILE: src/botdef.rs
  type BotDef (line 8) | pub struct BotDef {

FILE: src/client/camera.rs
  constant FOVY (line 5) | const FOVY: f32 = 3.14 / 4.0;
  constant NEAR (line 6) | const NEAR: f32 = 1.0;
  constant FAR (line 7) | const FAR: f32 = 8000.0;
  function create_view (line 9) | pub fn create_view(pos: &Point3<f32>, dir: &Vector3<f32>) -> Matrix4<f32> {
  function create_normal (line 13) | pub fn create_normal(pos: &Point3<f32>, dir: &Vector3<f32>) -> Matrix4<f...
  function create_proj (line 17) | pub fn create_proj(aspect_ratio: f32, near: f32) -> Matrix4<f32> {
  function create_view_proj (line 25) | pub fn create_view_proj(
  function create_camera_uniform_vec (line 36) | pub fn create_camera_uniform_vec(
  method rts_camera (line 63) | pub fn rts_camera(&mut self, sim_sec: f32) {
  method orbit_camera (line 186) | pub fn orbit_camera(&mut self, sim_sec: f32) {

FILE: src/client/game_state.rs
  type Explosion (line 17) | pub struct Explosion {
  type State (line 25) | pub struct State {
    method new (line 68) | pub fn new() -> Self {
    method handle_new_frame (line 105) | pub fn handle_new_frame(&mut self, frame: Frame) {
    method interpolate (line 148) | pub fn interpolate(&mut self, threadpool: &rayon::ThreadPool, view_pro...
    method my_player (line 245) | pub fn my_player(&self) -> Option<&Player> {
    method near (line 251) | pub fn near(&self) -> f32 {

FILE: src/client/heightmap_editor.rs
  type Mode (line 9) | pub enum Mode {
  type State (line 17) | pub struct State {
    method new (line 29) | pub fn new() -> Self {
    method draw_ui (line 42) | pub fn draw_ui(&mut self, ui: &Ui, heightmap_gpu: &mut heightmap_gpu::...
    method handle_user_input (line 123) | pub fn handle_user_input(
    method save (line 295) | pub fn save(heightmap_gpu: &heightmap_gpu::HeightmapGpu, path: &str) {
    method load (line 340) | pub fn load(heightmap_gpu: &mut heightmap_gpu::HeightmapGpu, path: &st...

FILE: src/client/input_state.rs
  type Drag (line 4) | pub enum Drag {
  type InputState (line 12) | pub struct InputState {
    method new (line 26) | pub fn new() -> Self {
    method update (line 41) | pub fn update(&mut self) {

FILE: src/client/misc.rs
  method clear_gpu_instance_and_game_state (line 7) | pub fn clear_gpu_instance_and_game_state(&mut self) {
  method visit_part_tree (line 31) | pub fn visit_part_tree(
  method upload_to_gpu (line 127) | pub fn upload_to_gpu(&mut self, view_proj: &Matrix4<f32>, encoder: &mut ...

FILE: src/client/mod.rs
  type StartClient (line 41) | pub struct StartClient {
  type StartServer (line 45) | pub struct StartServer {
  type FromClient (line 49) | pub enum FromClient {
  type ImguiWrap (line 57) | struct ImguiWrap {
  type RenderEvent (line 64) | enum RenderEvent {
  type MainMode (line 69) | pub enum MainMode {
  type NetMode (line 78) | pub enum NetMode {
  type App (line 84) | pub struct App {
    method new (line 147) | pub fn new(
    method resize (line 611) | fn resize(&mut self) -> Option<wgpu::CommandBuffer> {
    method handle_winit_event (line 724) | pub fn handle_winit_event(&mut self, _event: &winit::event::Event<()>) {
    method map_read_async_msg (line 855) | pub fn map_read_async_msg(&mut self, vec: Vec<f32>, usage: String) {
    method receive (line 869) | pub fn receive(&mut self) {

FILE: src/client/play.rs
  method init_play (line 14) | pub fn init_play(&mut self) {
  method handle_play (line 112) | pub fn handle_play(

FILE: src/client/render.rs
  method render (line 17) | pub fn render(&mut self) {

FILE: src/client/uitool.rs
  type UiTool (line 5) | pub enum UiTool {

FILE: src/client/unit_editor.rs
  type UnitEditor (line 12) | pub struct UnitEditor {
    method new (line 18) | pub fn new() -> Self {
    method add_to_parts (line 51) | fn add_to_parts(&mut self, parent: utils::Id<PartTree>, path: PathBuf,...
  method init_unit_editor (line 77) | pub fn init_unit_editor(&mut self) {
  method draw_unit_editor_ui (line 85) | pub fn draw_unit_editor_ui(
  method save_botdef_on_disk (line 225) | pub fn save_botdef_on_disk(bot_def: &BotDef, path: &str) {
  method load_botdef_on_disk (line 241) | pub fn load_botdef_on_disk(path: &str) -> serde_json::Result<BotDef> {
  method load_botdef_in_editor (line 255) | pub fn load_botdef_in_editor(
  method ui_part_tree (line 280) | fn ui_part_tree(
  method visit_dirs_for_add_child (line 462) | fn visit_dirs_for_add_child(
  method visit_dirs_for_replace_mesh (line 521) | fn visit_dirs_for_replace_mesh(
  method visit_dirs_for_selection (line 612) | fn visit_dirs_for_selection(

FILE: src/client/unit_part_gpu.rs
  type ModelGpuState (line 6) | pub enum ModelGpuState {
  type UnitPartGpu (line 12) | pub struct UnitPartGpu {
    method new (line 18) | pub fn new() -> Self {
    method index_of (line 25) | pub fn index_of(&self, path: PathBuf) -> Option<&usize> {
    method path_get (line 29) | pub fn path_get(&self, path: PathBuf) -> Option<&ModelGpuState> {
    method path_get_mut (line 33) | pub fn path_get_mut(&mut self, path: PathBuf) -> Option<&mut ModelGpuS...
    method get (line 39) | pub fn get(&self, index: usize) -> &ModelGpuState {
    method get_mut (line 42) | pub fn get_mut(&mut self, index: usize) -> &mut ModelGpuState {
    method load_at (line 46) | fn load_at(&mut self, index: usize, path: PathBuf) {
    method append (line 56) | pub fn append(&mut self, path: PathBuf) -> usize {
    method reload (line 62) | pub fn reload(&mut self, path: PathBuf) -> usize {
    method index_of_or_create_if_na (line 72) | pub fn index_of_or_create_if_na(&mut self, path: PathBuf) -> usize {
    method path_get_or_create_if_na (line 79) | pub fn path_get_or_create_if_na(&mut self, path: PathBuf) -> (usize, &...

FILE: src/frame.rs
  type Player (line 20) | pub struct Player {
    method new (line 29) | pub fn new() -> Self {
  type FrameEventFromPlayer (line 42) | pub enum FrameEventFromPlayer {
  type ProfilerMap (line 63) | pub struct ProfilerMap {
    method new (line 67) | pub fn new() -> Self {
    method mix (line 70) | pub fn mix(&mut self, s: &str, duration: Duration, last_ratio: u32) {
    method add (line 87) | pub fn add(&mut self, s: &str, duration: Duration) {
    method get (line 90) | pub fn get(&self, s: &str) -> Option<&Duration> {
  type DataToComputeNextFrame (line 96) | pub struct DataToComputeNextFrame {
  type FrameUpdate (line 102) | pub struct FrameUpdate {
  type Frame (line 107) | pub struct Frame {
    method new (line 127) | pub fn new() -> Self {

FILE: src/frame_server/mod.rs
  type ToFrameServer (line 12) | pub enum ToFrameServer {
  type FromFrameServer (line 16) | pub enum FromFrameServer {
  type FrameServerCache (line 20) | pub struct FrameServerCache {
    method spawn (line 27) | pub fn spawn(
    method new (line 59) | pub fn new() -> Self {
    method next_frame (line 67) | pub fn next_frame(&mut self, old_frame: Frame, events: Vec<FrameEventF...
  function update_mobile_target (line 180) | pub fn update_mobile_target(
  function update_units (line 253) | pub fn update_units(
  function avoid_neighbors_force (line 842) | fn avoid_neighbors_force(
  type TargetForce (line 865) | struct TargetForce {
  function to_target_force (line 869) | fn to_target_force(me: &KBot, botdef: &botdef::BotDef) -> TargetForce {

FILE: src/glsl.rs
  function compile_all_glsl (line 7) | pub fn compile_all_glsl() {
  function visit_dirs (line 39) | fn visit_dirs(dir: &Path, cb: &dyn Fn(&DirEntry)) -> io::Result<()> {

FILE: src/gpu_obj/arrow_gpu.rs
  type ArrowGpu (line 6) | pub struct ArrowGpu {
    method new (line 16) | pub fn new(
    method create_pipeline (line 57) | pub fn create_pipeline(
    method render (line 176) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_instance (line 188) | pub fn update_instance(&mut self, instance_attr: &[f32], device: &wgpu...
    method reload_shader (line 200) | fn reload_shader(

FILE: src/gpu_obj/blit_texture.rs
  type BlitTextureGpu (line 6) | pub struct BlitTextureGpu {
    method new (line 16) | pub fn new(
    method create_bind_group (line 107) | pub fn create_bind_group(
    method create_pipeline (line 140) | pub fn create_pipeline(
    method render (line 218) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_instance (line 229) | pub fn update_instance(&mut self, instance_attr: &[f32], device: &wgpu...
    method reload_shader (line 241) | fn reload_shader(

FILE: src/gpu_obj/explosion.rs
  type ExplosionGpu (line 6) | pub struct ExplosionGpu {
    method new (line 16) | pub fn new(
    method create_bind_group (line 142) | pub fn create_bind_group(
    method update_bind_group (line 217) | pub fn update_bind_group(
    method create_pipeline (line 233) | pub fn create_pipeline(
    method open_noise (line 311) | pub fn open_noise() -> Vec<u8> {
    method render (line 336) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_instance (line 347) | pub fn update_instance(&mut self, instance_attr: &[f32], device: &wgpu...
    method reload_shader (line 359) | fn reload_shader(

FILE: src/gpu_obj/glsl_compiler.rs
  type ShaderStage (line 5) | pub enum ShaderStage {
  function str_to_shader_stage (line 11) | fn str_to_shader_stage(str: &str) -> ShaderStage {
  type Result (line 25) | pub type Result<T> = std::result::Result<T, ShaderCompilationError>;
  type ShaderCompilationError (line 28) | pub struct ShaderCompilationError {
    method fmt (line 33) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    method source (line 39) | fn source(&self) -> Option<&(dyn error::Error + 'static)> {
  function load (line 45) | pub fn load(rel_path: &str) -> Result<Vec<u32>> {
  function load (line 69) | pub fn load(rel_path: &str) -> Result<Vec<u32>> {
  function load (line 93) | pub fn load(rel_path: &str) -> Result<Vec<u32>> {

FILE: src/gpu_obj/gpu.rs
  type WgpuState (line 3) | pub struct WgpuState {
    method new (line 14) | pub fn new(window: winit::window::Window) -> Self {

FILE: src/gpu_obj/health_bar.rs
  type HealthBarGpu (line 6) | pub struct HealthBarGpu {
    method new (line 13) | pub fn new(
    method create_pipeline (line 38) | pub fn create_pipeline(
    method render (line 120) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_instance (line 130) | pub fn update_instance(&mut self, instance_attr: &[f32], device: &wgpu...
    method reload_shader (line 142) | fn reload_shader(

FILE: src/gpu_obj/heightmap_gpu.rs
  constant ZONE_SIZE_MIP0 (line 8) | const ZONE_SIZE_MIP0: usize = 64;
  constant UPDATE_PER_STEP (line 9) | const UPDATE_PER_STEP: usize = 300;
  constant MIP_COUNT (line 10) | const MIP_COUNT: u32 = 5;
  constant MAX_Z (line 11) | pub const MAX_Z: f32 = 511.0;
  type HeightmapGpu (line 13) | pub struct HeightmapGpu {
    method new (line 32) | pub fn new(
    method create_pipeline (line 450) | pub fn create_pipeline(
    method mipmap_update (line 539) | pub fn mipmap_update(
    method render (line 598) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_uniform (line 608) | pub fn update_uniform(
    method step (line 637) | pub fn step(&mut self, device: &Device, encoder: &mut CommandEncoder) {
    method update_rect (line 864) | pub fn update_rect(&mut self, min_x: u32, min_y: u32, width: u32, heig...
    method reload_shader (line 891) | fn reload_shader(

FILE: src/gpu_obj/heightmap_helper.rs
  type Vertex (line 5) | pub struct Vertex {
    method canonicalize (line 19) | fn canonicalize(&self) -> i128 {
  method eq (line 11) | fn eq(&self, other: &Vertex) -> bool {
  method hash (line 25) | fn hash<H>(&self, state: &mut H)
  function z (line 33) | pub fn z(x: f32, y: f32) -> f32 {
  function create_texels (line 47) | pub fn create_texels(width: u32, height: u32, t: f32) -> Vec<f32> {
  function create_vertex_index_rings (line 58) | pub fn create_vertex_index_rings(hsize: u32) -> (Vec<Vertex>, Vec<u32>) {
  function optimize_vertex_index (line 330) | pub fn optimize_vertex_index(

FILE: src/gpu_obj/imgui_wgpu.rs
  type RendererResult (line 5) | pub type RendererResult<T> = Result<T, RendererError>;
  type RendererError (line 8) | pub enum RendererError {
  function get_program_link (line 12) | fn get_program_link() -> (&'static str, &'static str) {
  type Texture (line 17) | struct Texture {
    method new (line 23) | fn new(texture: wgpu::Texture, layout: &BindGroupLayout, device: &Devi...
  type Renderer (line 60) | pub struct Renderer {
    method new (line 71) | pub fn new(
    method new_impl (line 85) | fn new_impl(
    method render (line 227) | pub fn render<'a>(
    method render_draw_list (line 291) | fn render_draw_list<'render>(
    method update_uniform_buffer (line 347) | fn update_uniform_buffer(
    method upload_vertex_buffer (line 369) | fn upload_vertex_buffer(&mut self, device: &Device, vertices: &[DrawVe...
    method upload_index_buffer (line 376) | fn upload_index_buffer(&mut self, device: &Device, indices: &[DrawIdx]...
    method reload_font_texture (line 385) | pub fn reload_font_texture(
    method upload_font_texture (line 399) | fn upload_font_texture(

FILE: src/gpu_obj/line.rs
  type LineGpu (line 6) | pub struct LineGpu {
    method new (line 13) | pub fn new(
    method create_pipeline (line 38) | pub fn create_pipeline(
    method render (line 115) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_instance (line 125) | pub fn update_instance(&mut self, instance_attr: &[f32], device: &wgpu...
    method reload_shader (line 137) | fn reload_shader(

FILE: src/gpu_obj/model_gpu.rs
  type ModelGpu (line 6) | pub struct ModelGpu {
    method new (line 17) | pub fn new(
    method create_pipeline (line 59) | pub fn create_pipeline(
    method render (line 178) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_instance_dirty (line 189) | pub fn update_instance_dirty(&mut self, instance_attr: &[f32], device:...
    method update_instance_dirty_own_buffer (line 199) | pub fn update_instance_dirty_own_buffer(&mut self, device: &wgpu::Devi...
    method update_instance (line 209) | pub fn update_instance(
    method reload_shader (line 253) | fn reload_shader(

FILE: src/gpu_obj/post_fx.rs
  type PostFx (line 5) | pub struct PostFx {
    method new (line 13) | pub fn new(
    method update_pos_att_view (line 74) | pub fn update_pos_att_view(&mut self, device: &Device, position_att_vi...
    method create_pipeline (line 90) | fn create_pipeline(
    method render (line 144) | pub fn render(&self, rpass: &mut RenderPass, device: &Device, main_bin...
    method reload_shader (line 155) | fn reload_shader(

FILE: src/gpu_obj/post_fxaa.rs
  type PostFxaa (line 5) | pub struct PostFxaa {
    method new (line 12) | pub fn new(
    method update_last_pass_view (line 73) | pub fn update_last_pass_view(&mut self, device: &Device, last_pass_vie...
    method create_pipeline (line 101) | fn create_pipeline(
    method render (line 151) | pub fn render(&self, rpass: &mut RenderPass, device: &Device, main_bin...
    method reload_shader (line 161) | fn reload_shader(

FILE: src/gpu_obj/texture_view_bicopy.rs
  type TextureViewBiCopy (line 5) | pub struct TextureViewBiCopy {
    method new (line 13) | pub fn new(
    method update_last_pass_view (line 75) | pub fn update_last_pass_view(&mut self, device: &Device, last_pass_vie...
    method create_pipeline (line 91) | fn create_pipeline(
    method render (line 141) | pub fn render(&self, rpass: &mut RenderPass, device: &Device, main_bin...
    method reload_shader (line 151) | fn reload_shader(

FILE: src/gpu_obj/trait_gpu.rs
  type TraitGpu (line 4) | pub trait TraitGpu {
    method reload_shader (line 5) | fn reload_shader(

FILE: src/gpu_obj/unit_icon.rs
  type UnitIconGpu (line 6) | pub struct UnitIconGpu {
    method new (line 13) | pub fn new(
    method create_pipeline (line 38) | pub fn create_pipeline(
    method render (line 110) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method update_instance (line 120) | pub fn update_instance(&mut self, instance_attr: &[f32], device: &wgpu...
    method reload_shader (line 132) | fn reload_shader(

FILE: src/gpu_obj/water.rs
  type WaterGpu (line 6) | pub struct WaterGpu {
    method new (line 13) | pub fn new(
    method update_bind_group (line 70) | pub fn update_bind_group(
    method create_bind_group (line 84) | pub fn create_bind_group(
    method create_pipeline (line 137) | pub fn create_pipeline(
    method render (line 199) | pub fn render(&self, rpass: &mut RenderPass, main_bind_group: &BindGro...
    method reload_shader (line 209) | fn reload_shader(

FILE: src/heightmap_phy.rs
  type Data (line 5) | pub struct Data {
  type HeightmapPhy (line 9) | pub struct HeightmapPhy {
    method new (line 33) | pub fn new(width: usize, height: usize) -> Self {
    method z (line 52) | pub fn z(&self, x: f32, y: f32) -> f32 {
    method safe_z (line 59) | pub fn safe_z(&self, x: f32, y: f32) -> f32 {
    method z_linear (line 66) | pub fn z_linear(&self, x: f32, y: f32) -> f32 {
    method normal (line 89) | pub fn normal(&self, x: f32, y: f32) -> Vector3<f32> {
  type MetalSpot (line 16) | pub struct MetalSpot {
  type HeightMapPhyUsize (line 22) | trait HeightMapPhyUsize {
    method z (line 23) | fn z(&self, x: usize, y: usize) -> f32;
    method z (line 27) | fn z(&self, x: usize, y: usize) -> f32 {

FILE: src/main.rs
  type ToClient (line 33) | pub enum ToClient {
  type EventLoopMsg (line 39) | pub enum EventLoopMsg {
  function main (line 43) | fn main() {
  function do_the_thing (line 54) | fn do_the_thing() {

FILE: src/manager.rs
  type Manager (line 11) | pub struct Manager {}
    method new (line 14) | pub fn new(
  type Net (line 141) | enum Net {
  type ManagerInfo (line 148) | pub struct ManagerInfo {
  type GlobalInfo (line 154) | pub struct GlobalInfo {

FILE: src/mobile.rs
  type ExplosionEvent (line 12) | pub struct ExplosionEvent {
  type Angle (line 19) | pub struct Angle {
    method from (line 23) | pub fn from(x: f32, y: f32) -> Self {
    method new (line 30) | pub fn new(rad: f32) -> Self {
    method clamp_around (line 34) | pub fn clamp_around(self, other: Angle, cone_angle: Angle) -> Self {
    method modulo (line 42) | pub fn modulo(&self) -> Self {
    type Output (line 51) | type Output = Angle;
    method add (line 53) | fn add(self, rhs: Angle) -> Angle {
    type Output (line 62) | type Output = Angle;
    method sub (line 64) | fn sub(self, rhs: Angle) -> Angle {
    type Output (line 73) | type Output = Angle;
    method neg (line 75) | fn neg(self) -> Angle {
    method from (line 84) | fn from(dir: Vector2<f32>) -> Self {
    method into (line 90) | fn into(self) -> Vector2<f32> {
    method from (line 96) | fn from(dir: (f32, f32)) -> Self {
    method from (line 102) | fn from(rad: f32) -> Self {
  type Command (line 108) | pub enum Command {
  type KBot (line 115) | pub struct KBot {
    method new (line 138) | pub fn new(position: Point3<f32>, botdef: &botdef::BotDef, player_id: ...
  type ClientKbot (line 163) | pub struct ClientKbot {
    method new (line 178) | pub fn new(position: Point3<f32>) -> Self {
  type KinematicProjectile (line 194) | pub struct KinematicProjectile {
    method speed_at (line 208) | pub fn speed_at(&mut self, frame_number: i32) -> Vector3<f32> {
    method position_at (line 224) | pub fn position_at(&mut self, frame_number: i32) -> Point3<f32> {
  type Arrow (line 243) | pub struct Arrow {
    method new (line 250) | pub fn new(position: Point3<f32>, end: Point3<f32>, color: [f32; 4]) -...

FILE: src/moddef.rs
  type ModDef (line 10) | pub struct ModDef {
    method new (line 16) | pub fn new() -> Self {

FILE: src/model.rs
  type Vertex (line 2) | pub struct Vertex {
  type TriangleList (line 9) | pub struct TriangleList {
  function open_obj (line 14) | pub fn open_obj(path: &str) -> Result<TriangleList, String> {

FILE: src/net_client.rs
  type BindState (line 10) | pub enum BindState {
  type NetClientInfo (line 18) | pub struct NetClientInfo {
  type ToNetClientInner (line 22) | pub enum ToNetClientInner {
  type FromNetClientInner (line 26) | pub enum FromNetClientInner {
  type NetClient (line 30) | pub struct NetClient {
    method new (line 39) | pub fn new(bind: &str) -> Self {
    method kill (line 122) | pub fn kill(&mut self) {
    method collect_data_to_compute_next_frame (line 126) | pub fn collect_data_to_compute_next_frame(&mut self) -> Option<DataToC...
    method send_player_inputs (line 139) | pub fn send_player_inputs(&mut self, player_inputs: Vec<FrameEventFrom...
    method get_info (line 148) | pub fn get_info(&mut self) -> NetClientInfo {

FILE: src/net_server.rs
  type BindState (line 9) | pub enum BindState {
  type NetServerInfo (line 16) | pub struct NetServerInfo {
  type ToNetServerInner (line 21) | pub enum ToNetServerInner {
  type FromNetServerInner (line 25) | pub enum FromNetServerInner {
  type NetServer (line 29) | pub struct NetServer {
    method new (line 37) | pub fn new(bind: &str) -> Self {
    method kill (line 125) | pub fn kill(&mut self) {}
    method collect_remote_players_inputs (line 127) | pub fn collect_remote_players_inputs(&mut self) -> Vec<FrameEventFromP...
    method broadcast_data_to_compute_next_frame (line 137) | pub fn broadcast_data_to_compute_next_frame(&mut self, data: DataToCom...
    method get_info (line 143) | pub fn get_info(&mut self) -> NetServerInfo {
  type ToNetStream (line 152) | enum ToNetStream {
  type FromNetStream (line 156) | enum FromNetStream {
  type NetStream (line 160) | struct NetStream {
    method new (line 166) | fn new(stream: TcpStream) -> Self {
    method collect_remote_player_input (line 211) | pub fn collect_remote_player_input(&mut self) -> Vec<FrameEventFromPla...
    method send_data_to_compute_next_frame (line 220) | pub fn send_data_to_compute_next_frame(&mut self, data: Vec<u8>) {

FILE: src/procedural_texels.rs
  function create_texels (line 1) | pub fn create_texels(size: usize) -> Vec<u8> {
  function checker (line 16) | pub fn checker(size: usize) -> Vec<u8> {

FILE: src/unit.rs
  type PlacedMesh (line 12) | pub struct PlacedMesh {
  type PlacedCollider (line 19) | pub enum PlacedCollider {
  type Joint (line 24) | pub enum Joint {
    method next (line 31) | pub fn next(&self) -> Self {
    method replace_with_next (line 39) | pub fn replace_with_next(&mut self) {
  type PartTree (line 46) | pub struct PartTree {
    method iter (line 70) | pub fn iter(&self) -> PartTreeIter {
    method find_node_mut (line 74) | pub fn find_node_mut(&mut self, id: utils::Id<PartTree>) -> Option<&mu...
    method find_node (line 87) | pub fn find_node(&self, id: utils::Id<PartTree>) -> Option<&PartTree> {
    method remove_node (line 102) | pub fn remove_node(&mut self, id: utils::Id<PartTree>) -> Option<utils...
  type PartTreeIter (line 54) | pub struct PartTreeIter<'a> {
  type Item (line 59) | type Item = &'a PartTree;
  method next (line 60) | fn next(&mut self) -> Option<&'a PartTree> {

FILE: src/utils.rs
  function face_towards_dir (line 11) | pub fn face_towards_dir(
  constant ID_CHARS (line 28) | const ID_CHARS: [char; 62] = [
  constant ID_SIZE (line 34) | const ID_SIZE: usize = 5;
  type IdBase (line 36) | trait IdBase {
    type Type (line 105) | type Type = T;
  type IdValue (line 40) | pub type IdValue = u64;
  type Id (line 43) | pub struct Id<T> {
  function new (line 49) | pub fn new(value: IdValue) -> Self {
  function fmt (line 58) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  function fmt (line 64) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  method clone (line 81) | fn clone(&self) -> Self {
  method eq (line 88) | fn eq(&self, other: &Self) -> bool {
  method hash (line 94) | fn hash<H>(&self, state: &mut H)
  function rand_id (line 108) | pub fn rand_id<T>() -> Id<T> {
  function rand_id_unsafe (line 112) | pub fn rand_id_unsafe() -> String {
  function pop_set (line 121) | pub fn pop_set<T: Clone + Eq + std::hash::Hash>(set: &mut HashSet<T>) ->...
  function time (line 126) | pub fn time<F, K>(f: F) -> std::time::Duration
  type FileTree (line 139) | pub enum FileTree {
    method new (line 151) | pub fn new(path: PathBuf) -> Self {
  type ImageRGBA8 (line 169) | pub struct ImageRGBA8 {
    method open (line 176) | pub fn open(path: &str) -> ImageRGBA8 {
Condensed preview — 106 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (633K chars).
[
  {
    "path": ".gitignore",
    "chars": 66,
    "preview": "/target\n**/*.rs.bk\n.idea\n*.iml\n.vscode/tasks.json\n*.blend\n*.blend1"
  },
  {
    "path": "Cargo.toml",
    "chars": 1167,
    "preview": "[package]\nname = \"oxidator\"\nversion = \"0.2.0\"\nauthors = [\"Thomas SIMON <thomas.simon.work@gmail.com>\"]\nedition = \"2018\"\n"
  },
  {
    "path": "LICENSE",
    "chars": 1069,
    "preview": "MIT License\n\nCopyright (c) 2019 Thomas SIMON\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "README.md",
    "chars": 6792,
    "preview": "# What is this?\n\nA real time strategy game/engine written with Rust and WebGPU.\nEventually it will be able to run in a w"
  },
  {
    "path": "src/asset/3d/arrow.obj",
    "chars": 1956,
    "preview": "# Blender v2.80 (sub 75) OBJ File: ''\n# www.blender.org\nmtllib arrow.mtl\no Cube\nv -0.000000 0.020000 1.000000\nv -0.00000"
  },
  {
    "path": "src/asset/3d/axis_debug.obj",
    "chars": 27449,
    "preview": "# Blender v2.80 (sub 75) OBJ File: 'axis_debug.blend'\n# www.blender.org\no Cylinder.002\nv -0.078259 0.000390 0.500086\nv -"
  },
  {
    "path": "src/asset/3d/cube.obj",
    "chars": 1046,
    "preview": "# Blender v2.80 (sub 75) OBJ File: ''\n# www.blender.org\no Cube\nv 0.500000 0.500000 -0.500000\nv 0.500000 -0.500000 -0.500"
  },
  {
    "path": "src/asset/3d/small_sphere.obj",
    "chars": 5587,
    "preview": "# Blender v2.80 (sub 75) OBJ File: ''\n# www.blender.org\no Icosphere\nv 0.000000 -0.250000 0.000000\nv 0.180902 -0.111805 0"
  },
  {
    "path": "src/asset/3d/tank/base.obj",
    "chars": 3797,
    "preview": "# Blender v2.80 (sub 75) OBJ File: 'tank.blend'\n# www.blender.org\no tank-base_Cube\nv 0.645520 0.500000 0.145520\nv 0.6455"
  },
  {
    "path": "src/asset/3d/tank/canon.obj",
    "chars": 38433,
    "preview": "# Blender v2.80 (sub 75) OBJ File: 'tank.blend'\n# www.blender.org\no Sphere_Sphere.001\nv -0.367321 -0.026418 0.622755\nv -"
  },
  {
    "path": "src/asset/3d/tank/wheel.obj",
    "chars": 54280,
    "preview": "# Blender v2.80 (sub 75) OBJ File: 'wheel.blend'\n# www.blender.org\no Cylinder\nv 0.000000 0.250000 -0.125000\nv 0.000000 0"
  },
  {
    "path": "src/asset/botdef/building_example.json",
    "chars": 1620,
    "preview": "{\n  \"id\": {\n    \"value\": 1441884615969752781,\n    \"phantom\": null\n  },\n  \"file_path\": \"./src/asset/botdef/building_examp"
  },
  {
    "path": "src/asset/botdef/unit_example.json",
    "chars": 7505,
    "preview": "{\n  \"id\": {\n    \"value\": 14418846159697527818,\n    \"phantom\": null\n  },\n  \"file_path\": \"./src/asset/botdef/unit_example."
  },
  {
    "path": "src/asset/map/map_example/data.json",
    "chars": 23,
    "preview": "{\n  \"metal_spots\": []\n}"
  },
  {
    "path": "src/botdef.rs",
    "chars": 671,
    "preview": "use crate::unit;\nuse crate::utils;\nuse serde::{Deserialize, Serialize};\nuse typename::TypeName;\nuse utils::Id;\n\n#[derive"
  },
  {
    "path": "src/client/camera.rs",
    "chars": 8054,
    "preview": "extern crate nalgebra as na;\nuse super::client::*;\nuse na::{Matrix4, Point3, Vector3};\n\nconst FOVY: f32 = 3.14 / 4.0;\nco"
  },
  {
    "path": "src/client/game_state.rs",
    "chars": 8631,
    "preview": "extern crate nalgebra as na;\nuse super::heightmap_editor;\nuse crate::botdef;\nuse crate::frame::Frame;\nuse crate::mobile;"
  },
  {
    "path": "src/client/heightmap_editor.rs",
    "chars": 15607,
    "preview": "use imgui::*;\nuse na::Vector3;\nuse std::collections::HashSet;\n\nuse crate::gpu_obj::heightmap_gpu;\nuse noise::{NoiseFn, S"
  },
  {
    "path": "src/client/input_state.rs",
    "chars": 1541,
    "preview": "use std::collections::HashSet;\n\n#[derive(Clone, Debug)]\npub enum Drag {\n    None,\n    Start { x0: u32, y0: u32 },\n    Dr"
  },
  {
    "path": "src/client/misc.rs",
    "chars": 24557,
    "preview": "use super::client::*;\nuse crate::*;\nuse unit_part_gpu::*;\n\nuse super::uitool::UiTool;\nimpl App {\n    pub fn clear_gpu_in"
  },
  {
    "path": "src/client/mod.rs",
    "chars": 37325,
    "preview": "use crate::*;\n\nuse na::{Isometry3, Matrix4, Point3, Vector2, Vector3, Vector4};\n\nuse gpu_obj::imgui_wgpu::Renderer;\n\nuse"
  },
  {
    "path": "src/client/play.rs",
    "chars": 9680,
    "preview": "use super::client::*;\nuse crate::botdef;\nuse crate::frame::FrameEventFromPlayer;\nuse crate::frame::Player;\nuse crate::*;"
  },
  {
    "path": "src/client/render.rs",
    "chars": 36928,
    "preview": "use super::client::*;\nuse super::uitool::UiTool;\nuse crate::frame;\nuse crate::frame::FrameEventFromPlayer;\nuse crate::fr"
  },
  {
    "path": "src/client/uitool.rs",
    "chars": 194,
    "preview": "use crate::botdef;\nuse crate::*;\nuse utils::*;\n#[derive(Clone, Copy, Debug, PartialEq)]\npub enum UiTool {\n    None,\n    "
  },
  {
    "path": "src/client/unit_editor.rs",
    "chars": 28430,
    "preview": "use super::client::*;\nuse crate::botdef::BotDef;\nuse crate::model::*;\nuse crate::utils::FileTree;\nuse crate::*;\nuse gpu_"
  },
  {
    "path": "src/client/unit_part_gpu.rs",
    "chars": 2446,
    "preview": "use crate::gpu_obj;\nuse crate::model;\nuse gpu_obj::model_gpu::ModelGpu;\nuse std::collections::{HashMap, HashSet};\nuse st"
  },
  {
    "path": "src/frame.rs",
    "chars": 4024,
    "preview": "extern crate nalgebra as na;\n\nuse crate::heightmap_phy;\n\nuse crate::botdef;\nuse crate::mobile;\nuse crate::moddef;\nuse cr"
  },
  {
    "path": "src/frame_server/mod.rs",
    "chars": 33016,
    "preview": "use crate::frame::*;\n\nuse crate::botdef;\nuse crate::heightmap_phy;\nuse crate::mobile::*;\nuse crate::utils::*;\nuse crossb"
  },
  {
    "path": "src/glsl.rs",
    "chars": 1613,
    "preview": "use crate::gpu_obj::glsl_compiler;\nuse std::fs::{self, DirEntry};\nuse std::io;\nuse std::path::Path;\nuse std::slice;\n\npub"
  },
  {
    "path": "src/gpu_obj/arrow_gpu.rs",
    "chars": 8361,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, Texture"
  },
  {
    "path": "src/gpu_obj/blit_texture.rs",
    "chars": 9472,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse crate::utils::ImageRGBA8;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGr"
  },
  {
    "path": "src/gpu_obj/explosion.rs",
    "chars": 14119,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, Texture"
  },
  {
    "path": "src/gpu_obj/glsl_compiler.rs",
    "chars": 3499,
    "preview": "#[cfg(feature = \"use_shaderc\")]\nuse shaderc;\n\n#[allow(dead_code)]\npub enum ShaderStage {\n    Vertex,\n    Fragment,\n    C"
  },
  {
    "path": "src/gpu_obj/gpu.rs",
    "chars": 2047,
    "preview": "use wgpu::SwapChain;\n\npub struct WgpuState {\n    pub sc_desc: wgpu::SwapChainDescriptor,\n    pub device: wgpu::Device,\n "
  },
  {
    "path": "src/gpu_obj/health_bar.rs",
    "chars": 5737,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, Texture"
  },
  {
    "path": "src/gpu_obj/heightmap_gpu.rs",
    "chars": 32365,
    "preview": "use super::glsl_compiler;\nuse super::heightmap_helper;\nuse crate::heightmap_phy;\n\nuse wgpu::{BindGroup, BindGroupLayout,"
  },
  {
    "path": "src/gpu_obj/heightmap_helper.rs",
    "chars": 12835,
    "preview": "use std::collections::HashMap;\nuse std::hash::Hash;\nuse std::hash::Hasher;\n#[derive(Clone, Copy, Debug)]\npub struct Vert"
  },
  {
    "path": "src/gpu_obj/imgui_wgpu.rs",
    "chars": 16359,
    "preview": "use imgui::{Context, DrawCmd::Elements, DrawIdx, DrawList, DrawVert, TextureId, Textures, Ui};\nuse std::mem::size_of;\nus"
  },
  {
    "path": "src/gpu_obj/line.rs",
    "chars": 5468,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, Texture"
  },
  {
    "path": "src/gpu_obj/mod.rs",
    "chars": 332,
    "preview": "pub mod arrow_gpu;\npub mod blit_texture;\npub mod explosion;\npub mod glsl_compiler;\npub mod gpu;\npub mod health_bar;\npub "
  },
  {
    "path": "src/gpu_obj/model_gpu.rs",
    "chars": 10194,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, Texture"
  },
  {
    "path": "src/gpu_obj/post_fx.rs",
    "chars": 6239,
    "preview": "use super::glsl_compiler;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, TextureFormat, TextureVie"
  },
  {
    "path": "src/gpu_obj/post_fxaa.rs",
    "chars": 6532,
    "preview": "use super::glsl_compiler;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, TextureFormat, TextureVie"
  },
  {
    "path": "src/gpu_obj/texture_view_bicopy.rs",
    "chars": 6086,
    "preview": "use super::glsl_compiler;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, TextureFormat, TextureVie"
  },
  {
    "path": "src/gpu_obj/trait_gpu.rs",
    "chars": 263,
    "preview": "use wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, TextureFormat};\n\npub trait TraitGpu {\n    fn reload"
  },
  {
    "path": "src/gpu_obj/unit_icon.rs",
    "chars": 5278,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, Texture"
  },
  {
    "path": "src/gpu_obj/water.rs",
    "chars": 8333,
    "preview": "use super::glsl_compiler;\nuse crate::model;\nuse wgpu::Device;\nuse wgpu::{BindGroup, BindGroupLayout, RenderPass, Texture"
  },
  {
    "path": "src/heightmap_phy.rs",
    "chars": 2812,
    "preview": "use na::Vector3;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]\npub st"
  },
  {
    "path": "src/main.rs",
    "chars": 2593,
    "preview": "mod botdef;\nmod client;\nmod frame;\nmod frame_server;\nmod glsl;\nmod gpu_obj;\nmod heightmap_phy;\nmod manager;\nmod mobile;\n"
  },
  {
    "path": "src/manager.rs",
    "chars": 6872,
    "preview": "use crate::client;\nuse crate::frame;\nuse crate::frame_server;\nuse crate::net_client;\nuse crate::net_server;\nuse crate::T"
  },
  {
    "path": "src/mobile.rs",
    "chars": 6636,
    "preview": "use super::frame::Player;\nuse crate::botdef;\nuse crate::unit;\nuse crate::utils;\nuse na::{Matrix4, Point3, Vector2, Vecto"
  },
  {
    "path": "src/moddef.rs",
    "chars": 497,
    "preview": "use crate::botdef::BotDef;\nuse crate::unit;\nuse crate::utils;\nuse fnv::FnvHashMap;\nuse serde::{Deserialize, Serialize};\n"
  },
  {
    "path": "src/model.rs",
    "chars": 983,
    "preview": "#[derive(Clone, Copy)]\npub struct Vertex {\n    _pos: [f32; 4],\n    _nor: [f32; 3],\n    _tex_coord: [f32; 2],\n}\n\n#[derive"
  },
  {
    "path": "src/net_client.rs",
    "chars": 5085,
    "preview": "use crate::frame::*;\nuse crossbeam_channel::{unbounded, Receiver, Sender};\nuse spin_sleep::LoopHelper;\nuse std::io::prel"
  },
  {
    "path": "src/net_server.rs",
    "chars": 7540,
    "preview": "use crate::frame::*;\nuse crossbeam_channel::{unbounded, Receiver, Sender};\nuse spin_sleep::LoopHelper;\nuse std::io::prel"
  },
  {
    "path": "src/procedural_texels.rs",
    "chars": 834,
    "preview": "pub fn create_texels(size: usize) -> Vec<u8> {\n    let mut v = Vec::new();\n    for i in 0..size {\n        for j in 0..si"
  },
  {
    "path": "src/shader/arrow.frag",
    "chars": 522,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) in vec3 world_pos;\nlayout(location = 2) in v"
  },
  {
    "path": "src/shader/arrow.vert",
    "chars": 1014,
    "preview": "#version 450\n\nlayout(location = 0) in vec4 a_Pos;\nlayout(location = 1) in vec2 a_TexCoord;\n\nlayout(location = 2) in vec4"
  },
  {
    "path": "src/shader/blit_texture.frag",
    "chars": 568,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 0) out vec4 o_Target;\n\nlayout(set = 1, binding "
  },
  {
    "path": "src/shader/blit_texture.vert",
    "chars": 671,
    "preview": "#version 450\n\n//min_screen [0,1]\nlayout(location = 0) in vec2 min_screen;\nlayout(location = 1) in vec2 max_screen;\n\n//mi"
  },
  {
    "path": "src/shader/cube_instanced.frag",
    "chars": 2680,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) in vec3 world_pos;\nlayout(location = 2) in f"
  },
  {
    "path": "src/shader/cube_instanced.vert",
    "chars": 2448,
    "preview": "#version 450\n\nlayout(location = 0) in vec4 a_Pos;\nlayout(location = 1) in vec3 a_normal;\nlayout(location = 2) in vec2 a_"
  },
  {
    "path": "src/shader/explosion.frag",
    "chars": 7470,
    "preview": "#version 450\n\n#define EXPLOSION_SEED 1.\n\n\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) in vec2 v_cente"
  },
  {
    "path": "src/shader/explosion.vert",
    "chars": 1846,
    "preview": "#version 450\n\nlayout(location = 0) out vec2 v_TexCoord;\nlayout(location = 1) out vec2 v_center;\nlayout(location = 2) out"
  },
  {
    "path": "src/shader/health_bar.frag",
    "chars": 853,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) in vec2 v_min;\nlayout(location = 2) in vec2 "
  },
  {
    "path": "src/shader/health_bar.vert",
    "chars": 1098,
    "preview": "#version 450\n\nlayout(location = 0) out vec2 v_TexCoord;\nlayout(location = 1) out vec2 v_min;\nlayout(location = 2) out ve"
  },
  {
    "path": "src/shader/heightmap.frag",
    "chars": 3954,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) in vec3 color;\nlayout(location = 2) in float"
  },
  {
    "path": "src/shader/heightmap.vert",
    "chars": 2547,
    "preview": "#version 450\n\n\nlayout(location = 0) in vec2 a_Pos;\nlayout(location = 1) in float mip;\n\nlayout(location = 0) out vec2 v_T"
  },
  {
    "path": "src/shader/imgui.frag",
    "chars": 330,
    "preview": "#version 450\n\nlayout(set = 1, binding = 0) uniform texture2D u_Texture;\nlayout(set = 1, binding = 1) uniform sampler u_S"
  },
  {
    "path": "src/shader/imgui.vert",
    "chars": 495,
    "preview": "#version 450\n\nlayout(set = 0, binding = 0) uniform View {\n  mat4 u_Matrix;\n};\n\nlayout(location = 0) in vec2 a_Pos;\nlayou"
  },
  {
    "path": "src/shader/line.frag",
    "chars": 1200,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) in vec2 v_min;\nlayout(location = 2) in vec2 "
  },
  {
    "path": "src/shader/line.vert",
    "chars": 1542,
    "preview": "#version 450\n\nlayout(location = 0) out vec2 v_TexCoord;\nlayout(location = 1) out vec2 v_min;\nlayout(location = 2) out ve"
  },
  {
    "path": "src/shader/post.vert",
    "chars": 380,
    "preview": "#version 450\n\nlayout(location = 0) out vec2 v_TexCoord;\n\nvoid main() {\n    vec2 tc = vec2(0.0);\n    switch(gl_VertexInde"
  },
  {
    "path": "src/shader/post_bicopy.frag",
    "chars": 607,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 0) out vec4 o_Target;\n\nlayout(set = 1, binding "
  },
  {
    "path": "src/shader/post_fxaa.frag",
    "chars": 8445,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 0) out vec4 o_Target;\n\nlayout(set = 1, binding "
  },
  {
    "path": "src/shader/post_ui.frag",
    "chars": 3482,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 0) out vec4 o_Target;\n\nlayout(set = 1, binding "
  },
  {
    "path": "src/shader/unit_icon.frag",
    "chars": 1178,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) in vec2 v_center;\nlayout(location = 2) in fl"
  },
  {
    "path": "src/shader/unit_icon.vert",
    "chars": 1280,
    "preview": "#version 450\n\nlayout(location = 0) out vec2 v_TexCoord;\nlayout(location = 1) out vec2 v_center;\nlayout(location = 2) out"
  },
  {
    "path": "src/shader/water.frag",
    "chars": 3381,
    "preview": "#version 450\n\nlayout(location = 0) in vec2 v_TexCoord;\nlayout(location = 1) flat in int v_floor_lwall_fwall_rwall;\n\n\nlay"
  },
  {
    "path": "src/shader/water.vert",
    "chars": 1536,
    "preview": "#version 450\n\nlayout(location = 0) out vec2 v_TexCoord;\nlayout(location = 1) flat out int v_floor_lwall_fwall_rwall;\n\nla"
  },
  {
    "path": "src/unit.rs",
    "chars": 3155,
    "preview": "use super::client::*;\nuse crate::model::*;\nuse crate::utils::FileTree;\nuse crate::*;\nuse gpu_obj::model_gpu::ModelGpu;\nu"
  },
  {
    "path": "src/utils.rs",
    "chars": 5220,
    "preview": "use base_62::base62;\nuse na::{IsometryMatrix3, Matrix4, Point3, Vector2, Vector3, Vector4};\nuse rand::seq::SliceRandom;\n"
  }
]

// ... and 24 more files (download for full content)

About this extraction

This page contains the full source code of the Ruddle/oxidator GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 106 files (594.5 KB), approximately 190.2k tokens, and a symbol index with 334 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!