├── highscores └── highscore.json ├── assets ├── Roboto.ttf ├── rope.png ├── audio │ ├── dash.wav │ ├── fall.wav │ ├── rifle.wav │ ├── rope.wav │ ├── minigun.wav │ ├── pistol.wav │ ├── shotgun.wav │ ├── destroyed.wav │ └── rocket_launcher.wav ├── enemy │ ├── hit.png │ ├── enemy.mtl │ ├── bigenemy.mtl │ ├── enemy.obj │ └── bigenemy.obj ├── icons │ ├── slomo.png │ ├── dash-icon.png │ ├── rifle-icon.png │ ├── rope-icon.png │ ├── vignette.png │ ├── minigun-icon.png │ ├── pistol-icon.png │ ├── rope-icon2.jpeg │ └── shotgun-icon.png ├── level │ ├── level.png │ ├── sky.png │ ├── jumppad.mtl │ ├── floatingislands.mtl │ ├── mountainous_valley.mtl │ ├── desertedsands.mtl │ └── jumppad.obj ├── particles │ ├── jetpack.png │ ├── particle.png │ ├── destroyed.png │ ├── particle.mtl │ ├── particles.mtl │ ├── particle.obj │ └── particles.obj └── guns │ ├── bullet.mtl │ ├── rifle.mtl │ ├── minigun.mtl │ ├── pistol.mtl │ ├── rocket.mtl │ ├── shotgun.mtl │ ├── minigun-barrel.mtl │ ├── rocket-launcher.mtl │ ├── bullet.obj │ ├── minigun-barrel.obj │ ├── rocket.obj │ └── pistol.obj ├── shaders ├── shadow_frag.glsl ├── sky_vert.glsl ├── shadow_vert.glsl ├── sky_frag.glsl ├── main_vert.glsl └── main_frag.glsl ├── README.md ├── particles.py ├── LICENSE ├── trail_renderer.py ├── .gitignore ├── main.py ├── enemy.py ├── maps.py ├── scene_lighting.py ├── abilities.py ├── mainmenu.py ├── player.py └── guns.py /highscores/highscore.json: -------------------------------------------------------------------------------- 1 | { 2 | "highscore": 0 3 | } -------------------------------------------------------------------------------- /assets/Roboto.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/Roboto.ttf -------------------------------------------------------------------------------- /assets/rope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/rope.png -------------------------------------------------------------------------------- /assets/audio/dash.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/dash.wav -------------------------------------------------------------------------------- /assets/audio/fall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/fall.wav -------------------------------------------------------------------------------- /assets/audio/rifle.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/rifle.wav -------------------------------------------------------------------------------- /assets/audio/rope.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/rope.wav -------------------------------------------------------------------------------- /assets/enemy/hit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/enemy/hit.png -------------------------------------------------------------------------------- /assets/icons/slomo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/slomo.png -------------------------------------------------------------------------------- /assets/level/level.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/level/level.png -------------------------------------------------------------------------------- /assets/level/sky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/level/sky.png -------------------------------------------------------------------------------- /assets/audio/minigun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/minigun.wav -------------------------------------------------------------------------------- /assets/audio/pistol.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/pistol.wav -------------------------------------------------------------------------------- /assets/audio/shotgun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/shotgun.wav -------------------------------------------------------------------------------- /assets/audio/destroyed.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/destroyed.wav -------------------------------------------------------------------------------- /assets/icons/dash-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/dash-icon.png -------------------------------------------------------------------------------- /assets/icons/rifle-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/rifle-icon.png -------------------------------------------------------------------------------- /assets/icons/rope-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/rope-icon.png -------------------------------------------------------------------------------- /assets/icons/vignette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/vignette.png -------------------------------------------------------------------------------- /assets/icons/minigun-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/minigun-icon.png -------------------------------------------------------------------------------- /assets/icons/pistol-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/pistol-icon.png -------------------------------------------------------------------------------- /assets/icons/rope-icon2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/rope-icon2.jpeg -------------------------------------------------------------------------------- /assets/icons/shotgun-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/icons/shotgun-icon.png -------------------------------------------------------------------------------- /assets/particles/jetpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/particles/jetpack.png -------------------------------------------------------------------------------- /assets/particles/particle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/particles/particle.png -------------------------------------------------------------------------------- /assets/audio/rocket_launcher.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/audio/rocket_launcher.wav -------------------------------------------------------------------------------- /assets/particles/destroyed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandaw2014/Sandbox/HEAD/assets/particles/destroyed.png -------------------------------------------------------------------------------- /assets/guns/bullet.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl None 5 | Ns 500 6 | Ka 0.8 0.8 0.8 7 | Kd 0.8 0.8 0.8 8 | Ks 0.8 0.8 0.8 9 | d 1 10 | illum 2 11 | -------------------------------------------------------------------------------- /shaders/shadow_frag.glsl: -------------------------------------------------------------------------------- 1 | #version 120 2 | 3 | varying vec4 color; 4 | varying vec2 uv; 5 | 6 | uniform sampler2D p3d_Texture0; 7 | uniform vec4 p3d_ColorScale; 8 | 9 | void main() 10 | { 11 | gl_FragColor = texture2D(p3d_Texture0, uv) * p3d_ColorScale * color; 12 | } -------------------------------------------------------------------------------- /assets/level/jumppad.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'level.blend' 2 | # Material Count: 1 3 | 4 | newmtl None.001 5 | Ns 500.000001 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.800000 0.800000 0.800000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | -------------------------------------------------------------------------------- /assets/particles/particle.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 323.999994 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | -------------------------------------------------------------------------------- /assets/guns/rifle.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'gun.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 323.999994 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/enemy/enemy.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'enemy.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/guns/minigun.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'gun.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 323.999994 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/guns/pistol.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'gun.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 323.999994 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/guns/rocket.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'gun.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material.002 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/guns/shotgun.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'gun.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 323.999994 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/enemy/bigenemy.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'enemy.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/guns/minigun-barrel.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'gun.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 323.999994 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /shaders/sky_vert.glsl: -------------------------------------------------------------------------------- 1 | #version 120 2 | 3 | attribute vec4 p3d_Vertex; 4 | attribute vec2 p3d_MultiTexCoord0; 5 | 6 | varying vec2 uv; 7 | 8 | uniform mat4 p3d_ModelViewProjectionMatrix; 9 | 10 | void main() 11 | { 12 | gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex; 13 | uv = p3d_MultiTexCoord0; 14 | } -------------------------------------------------------------------------------- /assets/guns/rocket-launcher.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'gun.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material.001 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /assets/particles/particles.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl Material.001 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd destroyed.png 14 | -------------------------------------------------------------------------------- /assets/level/floatingislands.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'level.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material.002 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | -------------------------------------------------------------------------------- /shaders/shadow_vert.glsl: -------------------------------------------------------------------------------- 1 | #version 120 2 | 3 | attribute vec4 p3d_Vertex; 4 | attribute vec4 p3d_Color; 5 | attribute vec2 p3d_MultiTexCoord0; 6 | 7 | varying vec4 color; 8 | varying vec2 uv; 9 | 10 | uniform mat4 p3d_ModelViewProjectionMatrix; 11 | 12 | void main() 13 | { 14 | gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex; 15 | color = p3d_Color; 16 | uv = p3d_MultiTexCoord0; 17 | } -------------------------------------------------------------------------------- /assets/level/mountainous_valley.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'level.blend' 2 | # Material Count: 2 3 | 4 | newmtl Material.001 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | 15 | newmtl Material.002 16 | Ns 225.000000 17 | Ka 1.000000 1.000000 1.000000 18 | Kd 0.800000 0.800000 0.800000 19 | Ks 0.500000 0.500000 0.500000 20 | Ke 0.000000 0.000000 0.000000 21 | Ni 1.450000 22 | d 1.000000 23 | illum 2 24 | map_Kd level.png 25 | -------------------------------------------------------------------------------- /shaders/sky_frag.glsl: -------------------------------------------------------------------------------- 1 | #version 120 2 | 3 | varying vec2 uv; 4 | 5 | uniform sampler2D p3d_Texture0; 6 | uniform vec4 p3d_ColorScale; 7 | 8 | uniform float gamma; 9 | 10 | vec3 ACESFilm(vec3 x) 11 | { 12 | float a = 2.51; 13 | float b = 0.03; 14 | float c = 2.43; 15 | float d = 0.59; 16 | float e = 0.14; 17 | return clamp((x*(a*x+b))/(x*(c*x+d)+e), 0.0, 1.0); 18 | } 19 | 20 | void main() 21 | { 22 | gl_FragColor.rgb = texture2D(p3d_Texture0, uv).rgb * p3d_ColorScale.rgb * p3d_ColorScale.a; 23 | 24 | // tonemapping + gamma correction 25 | // gl_FragColor.rgb = vec3(1.0) - exp(-gl_FragColor.rgb * exposure); 26 | gl_FragColor.rgb = ACESFilm(gl_FragColor.rgb); 27 | gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1.0 / gamma)); 28 | 29 | gl_FragColor.a = 1.0; 30 | } -------------------------------------------------------------------------------- /assets/level/desertedsands.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'level.blend' 2 | # Material Count: 3 3 | 4 | newmtl Material.001 5 | Ns 225.000000 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd level.png 14 | 15 | newmtl Material.002 16 | Ns 225.000000 17 | Ka 1.000000 1.000000 1.000000 18 | Kd 0.800000 0.800000 0.800000 19 | Ks 0.500000 0.500000 0.500000 20 | Ke 0.000000 0.000000 0.000000 21 | Ni 1.450000 22 | d 1.000000 23 | illum 2 24 | map_Kd level.png 25 | 26 | newmtl Material.004 27 | Ns 225.000000 28 | Ka 1.000000 1.000000 1.000000 29 | Kd 0.800000 0.800000 0.800000 30 | Ks 0.500000 0.500000 0.500000 31 | Ke 0.000000 0.000000 0.000000 32 | Ni 1.450000 33 | d 1.000000 34 | illum 2 35 | map_Kd rock-lake.png 36 | -------------------------------------------------------------------------------- /shaders/main_vert.glsl: -------------------------------------------------------------------------------- 1 | #version 120 2 | 3 | attribute vec4 p3d_Vertex; 4 | attribute vec3 p3d_Normal; 5 | attribute vec4 p3d_Color; 6 | attribute vec2 p3d_MultiTexCoord0; 7 | 8 | varying vec3 fragPos; 9 | varying vec3 normal; 10 | varying vec4 color; 11 | varying vec2 uv; 12 | varying vec4 fragPosLight; 13 | 14 | uniform mat4 p3d_ModelViewProjectionMatrix; 15 | uniform mat4 p3d_ModelMatrix; 16 | uniform mat4 p3d_ModelMatrixInverseTranspose; 17 | 18 | uniform mat4 trans_world_to_clip_of_shadowCam; 19 | 20 | void main() 21 | { 22 | gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex; 23 | fragPos = vec3(p3d_ModelMatrix * p3d_Vertex); 24 | normal = mat3(p3d_ModelMatrixInverseTranspose) * p3d_Normal; 25 | color = p3d_Color; 26 | uv = p3d_MultiTexCoord0; 27 | fragPosLight = trans_world_to_clip_of_shadowCam * vec4(fragPos, 1.0); 28 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sandbox 2 | A Simple 3D Fast Paced FPS made in Python using the Ursina Engine (wip) 3 | 4 | # How To Play 5 | 6 | Make sure you have python and ursina installed 7 | 8 | https://www.python.org/ 9 | 10 | ``` 11 | pip install https://github.com/pokepetter/ursina/archive/master.zip 12 | ``` 13 | 14 | 1. Click Code, then click download zip 15 | 2. Extract the zip, and navigate to the folder in CMD or Terminal 16 | 3. Type 17 | ``` 18 | python main.py 19 | ``` 20 | 4. And there you go :) 21 | 22 | # Controls 23 | 24 | **Movement** - *WASD* 25 | 26 | **Navigation through the menus** - *Up arrow/Left arrow/Enter* 27 | 28 | **Rope** - *Right Click* 29 | 30 | **Shoot** - *Left Click* 31 | 32 | **Dashing/Slow Motion** - *Double-tap Shift* 33 | 34 | **Respawn/Reset** - *G* 35 | 36 | **Change Weapon** - *Numbers/Scroll Wheel* 37 | 38 | ![Screenshot 2022-09-17 at 20 45 58](https://user-images.githubusercontent.com/77012627/190874048-cac65b22-df04-4d05-b06f-1f60eebffe93.png) 39 | -------------------------------------------------------------------------------- /particles.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | from ursina import curve 3 | 4 | class Particles(Entity): 5 | def __init__(self, position, direction = Vec3(random.random(), random.random(), random.random()), spray_amount = 30, **kwargs): 6 | super().__init__( 7 | model = "particle.obj", 8 | texture = "particle.png", 9 | scale = 0.2, 10 | position = position, 11 | rotation_y = random.random() * 360 12 | ) 13 | 14 | self.direction = direction 15 | self.spray_amount = spray_amount 16 | self.prev_spray_amount = self.spray_amount 17 | 18 | self.destroy(1) 19 | 20 | for key, value in kwargs.items(): 21 | setattr(self, key ,value) 22 | 23 | def update(self): 24 | self.position += self.direction * self.spray_amount * time.dt 25 | self.spray_amount -= self.prev_spray_amount * time.dt 26 | 27 | def destroy(self, delay = 1): 28 | self.fade_out(duration = 0.2, delay = 0.7, curve = curve.linear) 29 | destroy(self, delay) 30 | del self -------------------------------------------------------------------------------- /assets/particles/particle.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: '' 2 | # www.blender.org 3 | mtllib particle.mtl 4 | v -1.000000 1.000000 1.000000 5 | v -1.000000 -1.000000 1.000000 6 | v -1.000000 1.000000 -1.000000 7 | v -1.000000 -1.000000 -1.000000 8 | v 1.000000 1.000000 1.000000 9 | v 1.000000 -1.000000 1.000000 10 | v 1.000000 1.000000 -1.000000 11 | v 1.000000 -1.000000 -1.000000 12 | vt 0.625000 0.500000 13 | vt 0.875000 0.500000 14 | vt 0.875000 0.750000 15 | vt 0.625000 0.750000 16 | vt 0.375000 0.750000 17 | vt 0.625000 1.000000 18 | vt 0.375000 1.000000 19 | vt 0.375000 0.000000 20 | vt 0.625000 0.000000 21 | vt 0.625000 0.250000 22 | vt 0.375000 0.250000 23 | vt 0.125000 0.500000 24 | vt 0.375000 0.500000 25 | vt 0.125000 0.750000 26 | vn 0.0000 1.0000 0.0000 27 | vn 0.0000 0.0000 -1.0000 28 | vn 1.0000 0.0000 0.0000 29 | vn 0.0000 -1.0000 0.0000 30 | vn -1.0000 0.0000 0.0000 31 | vn 0.0000 0.0000 1.0000 32 | usemtl Material 33 | s off 34 | f 1/1/1 5/2/1 7/3/1 3/4/1 35 | f 4/5/2 3/4/2 7/6/2 8/7/2 36 | f 8/8/3 7/9/3 5/10/3 6/11/3 37 | f 6/12/4 2/13/4 4/5/4 8/14/4 38 | f 2/13/5 1/1/5 3/4/5 4/5/5 39 | f 6/11/6 5/10/6 1/1/6 2/13/6 40 | -------------------------------------------------------------------------------- /assets/level/jumppad.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: 'level.blend' 2 | # www.blender.org 3 | mtllib jumppad.mtl 4 | v 1.000000 -0.052373 -1.000000 5 | v 1.000000 0.052373 -1.000000 6 | v 1.000000 0.052373 1.000000 7 | v 1.000000 -0.052373 1.000000 8 | v -1.000000 0.052373 1.000000 9 | v -1.000000 -0.052373 1.000000 10 | v -1.000000 0.052373 -1.000000 11 | v -1.000000 -0.052373 -1.000000 12 | vt 0.192910 0.800683 13 | vt 0.196816 0.800683 14 | vt 0.196816 0.804590 15 | vt 0.192910 0.804590 16 | vt 0.196816 0.808496 17 | vt 0.192910 0.808496 18 | vt 0.196816 0.812403 19 | vt 0.192910 0.812403 20 | vt 0.196816 0.816310 21 | vt 0.192910 0.816310 22 | vt 0.189003 0.808496 23 | vt 0.189003 0.812403 24 | vt 0.200723 0.808496 25 | vt 0.200723 0.812403 26 | vn 1.0000 -0.0000 0.0000 27 | vn -0.0000 -0.0000 1.0000 28 | vn -1.0000 0.0000 -0.0000 29 | vn 0.0000 0.0000 -1.0000 30 | vn 0.0000 -1.0000 -0.0000 31 | vn -0.0000 1.0000 0.0000 32 | usemtl None.001 33 | s 1 34 | f 1/1/1 2/2/1 3/3/1 4/4/1 35 | f 4/4/2 3/3/2 5/5/2 6/6/2 36 | f 6/6/3 5/5/3 7/7/3 8/8/3 37 | f 8/8/4 7/7/4 2/9/4 1/10/4 38 | f 4/11/5 6/6/5 8/8/5 1/12/5 39 | f 5/5/6 3/13/6 2/14/6 7/7/6 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Mandaw 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /trail_renderer.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | 3 | class TrailRenderer(Entity): 4 | def __init__(self, thickness=10, color=color.white, end_color=color.clear, length=6, **kwargs): 5 | super().__init__(**kwargs) 6 | self.renderer = Entity( 7 | model = Mesh( 8 | vertices=[self.world_position for i in range(length)], 9 | colors=[lerp(end_color, color, i/length*2) for i in range(length)], 10 | mode='line', 11 | thickness=thickness, 12 | static=False 13 | ) 14 | ) 15 | self._t = 0 16 | self.update_step = .025 17 | 18 | 19 | def update(self): 20 | self._t += time.dt 21 | if self._t >= self.update_step: 22 | self._t = 0 23 | self.renderer.model.vertices.pop(0) 24 | self.renderer.model.vertices.append(self.world_position) 25 | self.renderer.model.generate() 26 | 27 | def on_destroy(self): 28 | destroy(self.renderer) 29 | 30 | 31 | 32 | if __name__ == '__main__': 33 | app = Ursina() 34 | window.color = color.black 35 | mouse.visible = False 36 | player = Entity() 37 | player.graphics = Entity(parent=player, scale=.1, model='circle') 38 | trail_renderer = TrailRenderer(parent=player, thickness=100, color=color.yellow, length=6) 39 | 40 | pivot = Entity(parent=player) 41 | trail_renderer = TrailRenderer(parent=pivot, x=.1, thickness=20, color=color.orange) 42 | trail_renderer = TrailRenderer(parent=pivot, y=1, thickness=20, color=color.orange) 43 | trail_renderer = TrailRenderer(parent=pivot, thickness=2, color=color.orange, alpha=.5, position=(.4,.8)) 44 | trail_renderer = TrailRenderer(parent=pivot, thickness=2, color=color.orange, alpha=.5, position=(-.5,.7)) 45 | 46 | def update(): 47 | player.position = lerp(player.position, mouse.position*10, time.dt*4) 48 | 49 | if pivot: 50 | pivot.rotation_z -= 3 51 | pivot.rotation_x -= 2 52 | 53 | def input(key): 54 | if key == 'space': 55 | destroy(pivot) 56 | 57 | 58 | app.run() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | from direct.stdpy import thread 3 | 4 | from player import Player 5 | from enemy import Enemy, BigEnemy 6 | 7 | from mainmenu import MainMenu 8 | 9 | from maps import FloatingIslands, DesertedSands, MountainousValley 10 | 11 | from scene_lighting import SceneLighting 12 | 13 | Text.default_font = "./assets/Roboto.ttf" 14 | Text.default_resolution = Text.size * 1080 15 | 16 | app = Ursina() 17 | window.fullscreen = True 18 | window.borderless = False 19 | window.cog_button.disable() 20 | window.collider_counter.disable() 21 | window.entity_counter.disable() 22 | window.fps_counter.disable() 23 | window.exit_button.disable() 24 | 25 | scene.fog_density = 0.001 26 | 27 | # Starting new thread for assets 28 | def load_assets(): 29 | models_to_load = [ 30 | "floatingislands", "desertedsands", "mountainous_valley", "jumppad", "particle", "particles", "enemy", "bigenemy" "pistol", 31 | "shotgun", "rifle", "pistol", "minigun", "minigun-barrel", "rocket-launcher", "rocket", "bullet", 32 | ] 33 | 34 | textures_to_load = [ 35 | "level", "particle", "destroyed", "jetpack", "sky", "rope", "hit" 36 | ] 37 | 38 | for i, m in enumerate(models_to_load): 39 | load_model(m) 40 | 41 | for i, t in enumerate(textures_to_load): 42 | load_texture(t) 43 | 44 | try: 45 | thread.start_new_thread(function = load_assets, args = "") 46 | except Exception as e: 47 | print("error starting thread", e) 48 | 49 | player = Player((-60, 50, -16)) # Flat: (-47, 50, -94) # Rope: (-61, 100, 0) 50 | player.disable() 51 | 52 | floating_islands = FloatingIslands(player, enabled = True) 53 | deserted_sands = DesertedSands(player, enabled = False) 54 | mountainous_valley = MountainousValley(player, enabled = False) 55 | 56 | player.map = floating_islands 57 | player.maps = [floating_islands, deserted_sands, mountainous_valley] 58 | 59 | # Enemy 60 | for enemy in range(10): 61 | i = random.randint(0, 2) 62 | if i == 0: 63 | e = BigEnemy(player, position = Vec3(random.randint(-50, 50))) 64 | else: 65 | e = Enemy(player, position = Vec3(random.randint(-50, 50))) 66 | 67 | e.disable() 68 | player.enemies.append(e) 69 | 70 | mainmenu = MainMenu(player, floating_islands, deserted_sands, mountainous_valley) 71 | 72 | # Lighting + Shadows 73 | scene_lighting = SceneLighting(ursina = app, player = player, sun_direction = (-0.7, -0.9, 0.5), shadow_resolution = 4096, sky_texture = "sky") 74 | 75 | def input(key): 76 | if key == "g": 77 | player.reset() 78 | 79 | # def update(): 80 | # print(player.position) 81 | 82 | app.run() -------------------------------------------------------------------------------- /enemy.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | from particles import Particles 3 | from guns import Bullet 4 | 5 | class Enemy(Entity): 6 | def __init__(self, player, move_speed = 20, position = (0, 0, 0), **kwargs): 7 | super().__init__( 8 | model = "enemy.obj", 9 | texture = "level.png", 10 | position = position, 11 | collider = "box", 12 | **kwargs 13 | ) 14 | 15 | self.player = player 16 | self.move_speed = move_speed 17 | self.health = 2 18 | self.damage = 1 19 | 20 | # Pivots 21 | self.thruster1 = Entity(parent = self, position = (-0.4, -2, 0)) 22 | self.thruster2 = Entity(parent = self, position = (0.4, -2, 0)) 23 | 24 | self.barrel = Entity() 25 | 26 | # Shooting 27 | self.cooldown_t = 0 28 | self.cooldown_length = 2 29 | 30 | # Particles 31 | self.particle_t = 0 32 | self.particle_amount = 0.4 33 | 34 | self.random = Vec3(random.randrange(-10, 10), random.randrange(0, 3), random.randrange(-10, 10)) 35 | 36 | # Audio 37 | self.gun_sound = Audio("pistol.wav", False) 38 | self.gun_sound.volume = 0.05 39 | 40 | def update(self): 41 | if distance(self, self.player) > 20: 42 | self.position += ((self.player.position + self.random) - self.position).normalized() * self.move_speed * time.dt 43 | 44 | self.look_at(self.player) 45 | self.rotation_z = 0 46 | 47 | self.barrel.position = self.position + (0, 1, 0) + self.forward 48 | self.barrel.rotation = self.world_rotation 49 | 50 | # Shooting 51 | if distance_xz(self, self.player) < 100: 52 | self.cooldown_t += time.dt 53 | if self.cooldown_t >= self.cooldown_length: 54 | self.cooldown_t = 0 55 | self.cooldown_length = random.uniform(1.5, 3) 56 | Bullet(self, self.barrel.world_position, 700, color.orange).enemy = self 57 | if distance_xz(self, self.player) < 40: 58 | self.gun_sound.play() 59 | 60 | # Particles 61 | self.particle_t += time.dt 62 | if self.particle_t >= self.particle_amount: 63 | self.particle_t = 0 64 | self.particles1 = Particles(self.thruster1.world_position, Vec3(random.random(), -random.random(), random.random()), 10, texture = "jetpack") 65 | self.particles2 = Particles(self.thruster2.world_position, Vec3(random.random(), -random.random(), random.random()), 10, texture = "jetpack") 66 | 67 | def reset_pos(self): 68 | self.position = Vec3(random.randint(-100, 300), random.randint(0, 50), random.randint(-100, 300)) 69 | 70 | class BigEnemy(Enemy): 71 | def __init__(self, player, move_speed = 10, position = (0, 0, 0), **kwargs): 72 | super().__init__( 73 | player, move_speed, position, **kwargs 74 | ) 75 | 76 | self.model = "bigenemy" 77 | self.cooldown_length = 3 78 | self.damage = 2 79 | self.health = 4 -------------------------------------------------------------------------------- /maps.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | 3 | class FloatingIslands(Entity): 4 | def __init__(self, player, **kwargs): 5 | super().__init__( 6 | model = "floatingislands.obj", 7 | texture = "level.png", 8 | collider = "mesh", 9 | **kwargs 10 | ) 11 | 12 | self.jumppad1 = JumpPad(player, jump_height = 80, position = (-28, 4, -61), rotation_y = -6, level = self) 13 | self.jumppad2 = JumpPad(player, jump_height = 30, position = (6.5, 4, 53), rotation_y = 30, level = self) 14 | self.jumppad3 = JumpPad(player, jump_height = 70, position = (31, 14, 37), rotation_y = 30, level = self) 15 | 16 | class DesertedSands(Entity): 17 | def __init__(self, player, **kwargs): 18 | super().__init__( 19 | model = "desertedsands.obj", 20 | texture = "level.png", 21 | collider = "mesh", 22 | **kwargs 23 | ) 24 | 25 | self.jumppad1 = JumpPad(player, jump_height = 80, position = (2, -24, 0), level = self, rotation_y = -40, scale = 5, model = None) 26 | self.jumppad2 = JumpPad(player, jump_height = 80, position = (0, 45, 3), level = self, rotation_y = -40, scale = 5, model = None) 27 | 28 | class MountainousValley(Entity): 29 | def __init__(self, player, **kwargs): 30 | super().__init__( 31 | model = "mountainous_valley.obj", 32 | texture = "level.png", 33 | collider = "mesh", 34 | scale = 3, 35 | y = -200, 36 | **kwargs 37 | ) 38 | 39 | self.jumppad1 = JumpPad(player, jump_height = 100, position = (-6, 26, -44), level = self, rotation_y = -40, scale = 5, model = None) 40 | self.jumppad2 = JumpPad(player, jump_height = 100, position = (-89, 2, 45), rotation_y = -20, scale = 5, level = self, model = None) 41 | self.jumppad3 = JumpPad(player, jump_height = 100, position = (58, 39, -1), rotation_y = 40, scale = 4, level = self, model = None) 42 | self.jumppad4 = JumpPad(player, jump_height = 100, position = (81, -5, 29), rotation_y = 20, scale = 5, level = self, model = None) 43 | self.jumppad5 = JumpPad(player, jump_height = 100, position = (-49, 115, 27), rotation_y = 0, level = self, model = None) 44 | self.jumppad6 = JumpPad(player, jump_height = 100, position = (-13, -19, 121), rotation_y = 0, level = self, model = None) 45 | 46 | self.player = player 47 | 48 | def update(self): 49 | if self.player.y <= -90: 50 | self.player.position = (-5, 200, -10) 51 | self.player.rotation_y = -270 52 | self.player.velocity_x = 0 53 | self.player.velocity_y = 0 54 | self.player.velocity_z = 0 55 | self.player.health -= 5 56 | self.player.healthbar.value = self.player.health 57 | 58 | class JumpPad(Entity): 59 | def __init__(self, player, jump_height = 100, model = "jumppad.obj", position = (0, 0, 0), level = None, scale = 6, **kwargs): 60 | super().__init__( 61 | model = model, 62 | texture = "level", 63 | position = position, 64 | scale = scale, 65 | **kwargs 66 | ) 67 | 68 | self.player = player 69 | self.jump_height = jump_height 70 | self.level = level 71 | 72 | if not self.show: 73 | self.visible = False 74 | 75 | def update(self): 76 | if self.visible and distance(self, self.player) < 10: 77 | self.player.velocity_y = self.jump_height 78 | 79 | def input(self, key): 80 | if self.level.enabled: 81 | self.visible = True 82 | elif not self.level.enabled: 83 | self.visible = False -------------------------------------------------------------------------------- /assets/guns/bullet.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: '' 2 | # www.blender.org 3 | mtllib bullet.mtl 4 | v 0.000000 1.000000 1.000000 5 | v 0.000000 1.000000 -1.000000 6 | v -0.587785 0.809017 1.000000 7 | v -0.587785 0.809017 -1.000000 8 | v -0.951057 0.309017 1.000000 9 | v -0.951057 0.309017 -1.000000 10 | v -0.951056 -0.309017 1.000000 11 | v -0.951056 -0.309017 -1.000000 12 | v -0.587785 -0.809017 1.000000 13 | v -0.587785 -0.809017 -1.000000 14 | v 0.000000 -1.000000 1.000000 15 | v 0.000000 -1.000000 -1.000000 16 | v 0.587785 -0.809017 1.000000 17 | v 0.587785 -0.809017 -1.000000 18 | v 0.951056 -0.309017 1.000000 19 | v 0.951056 -0.309017 -1.000000 20 | v 0.951056 0.309017 1.000000 21 | v 0.951056 0.309017 -1.000000 22 | v 0.587785 0.809017 1.000000 23 | v 0.587785 0.809017 -1.000000 24 | v -0.000000 0.310156 2.011249 25 | v -0.182305 0.250921 2.011249 26 | v -0.294976 0.095844 2.011249 27 | v -0.294976 -0.095843 2.011249 28 | v -0.182305 -0.250921 2.011249 29 | v -0.000000 -0.310156 2.011249 30 | v 0.182305 -0.250921 2.011249 31 | v 0.294976 -0.095843 2.011249 32 | v 0.294976 0.095844 2.011249 33 | v 0.182305 0.250922 2.011249 34 | vt 0.601191 0.915751 35 | vt 0.601191 0.935736 36 | vt 0.597194 0.935736 37 | vt 0.597194 0.915751 38 | vt 0.593197 0.935736 39 | vt 0.593197 0.915751 40 | vt 0.589200 0.935736 41 | vt 0.589200 0.915751 42 | vt 0.585203 0.935736 43 | vt 0.585203 0.915751 44 | vt 0.581206 0.935736 45 | vt 0.581206 0.915751 46 | vt 0.577209 0.935736 47 | vt 0.577209 0.915751 48 | vt 0.573212 0.935736 49 | vt 0.573212 0.915751 50 | vt 0.569215 0.935736 51 | vt 0.569215 0.915751 52 | vt 0.576852 0.913519 53 | vt 0.571213 0.915351 54 | vt 0.565575 0.913519 55 | vt 0.562090 0.908723 56 | vt 0.562090 0.902794 57 | vt 0.565575 0.897998 58 | vt 0.571213 0.896165 59 | vt 0.576852 0.897998 60 | vt 0.580337 0.902794 61 | vt 0.580337 0.908723 62 | vt 0.565218 0.935736 63 | vt 0.565218 0.915751 64 | vt 0.561221 0.935736 65 | vt 0.561221 0.915751 66 | vt 0.565218 0.915751 67 | vt 0.569215 0.915751 68 | vt 0.591198 0.915351 69 | vt 0.596837 0.913519 70 | vt 0.600322 0.908723 71 | vt 0.600322 0.902794 72 | vt 0.596837 0.897998 73 | vt 0.591198 0.896165 74 | vt 0.585560 0.897998 75 | vt 0.582075 0.902794 76 | vt 0.582075 0.908723 77 | vt 0.585560 0.913519 78 | vt 0.573212 0.915751 79 | vt 0.577209 0.915751 80 | vt 0.581206 0.915751 81 | vt 0.585203 0.915751 82 | vt 0.589200 0.915751 83 | vt 0.597194 0.915751 84 | vt 0.601191 0.915751 85 | vt 0.593197 0.915751 86 | vt 0.561221 0.915751 87 | vn -0.3090 0.9511 0.0000 88 | vn -0.8090 0.5878 -0.0000 89 | vn -1.0000 -0.0000 0.0000 90 | vn -0.8090 -0.5878 0.0000 91 | vn -0.3090 -0.9511 0.0000 92 | vn 0.3090 -0.9511 0.0000 93 | vn 0.8090 -0.5878 0.0000 94 | vn 1.0000 0.0000 0.0000 95 | vn -0.0000 -0.0000 -1.0000 96 | vn 0.8090 0.5878 -0.0000 97 | vn 0.3090 0.9511 -0.0000 98 | vn 0.6787 0.4931 0.5443 99 | vn 0.0000 0.0000 1.0000 100 | vn 0.8389 0.0000 0.5443 101 | vn 0.6787 -0.4931 0.5443 102 | vn 0.2592 -0.7979 0.5443 103 | vn -0.2592 -0.7979 0.5443 104 | vn -0.6787 -0.4931 0.5443 105 | vn -0.2592 0.7979 0.5443 106 | vn -0.8389 -0.0000 0.5443 107 | vn -0.6787 0.4931 0.5443 108 | vn 0.2592 0.7979 0.5443 109 | usemtl None 110 | s off 111 | f 1/1/1 2/2/1 4/3/1 3/4/1 112 | f 3/4/2 4/3/2 6/5/2 5/6/2 113 | f 5/6/3 6/5/3 8/7/3 7/8/3 114 | f 7/8/4 8/7/4 10/9/4 9/10/4 115 | f 9/10/5 10/9/5 12/11/5 11/12/5 116 | f 11/12/6 12/11/6 14/13/6 13/14/6 117 | f 13/14/7 14/13/7 16/15/7 15/16/7 118 | f 15/16/8 16/15/8 18/17/8 17/18/8 119 | f 4/19/9 2/20/9 20/21/9 18/22/9 16/23/9 14/24/9 12/25/9 10/26/9 8/27/9 6/28/9 120 | f 17/18/10 18/17/10 20/29/10 19/30/10 121 | f 19/30/11 20/29/11 2/31/11 1/32/11 122 | f 17/18/12 19/30/12 30/33/12 29/34/12 123 | f 21/35/13 22/36/13 23/37/13 24/38/13 25/39/13 26/40/13 27/41/13 28/42/13 29/43/13 30/44/13 124 | f 15/16/14 17/18/14 29/34/14 28/45/14 125 | f 13/14/15 15/16/15 28/45/15 27/46/15 126 | f 11/12/16 13/14/16 27/46/16 26/47/16 127 | f 9/10/17 11/12/17 26/47/17 25/48/17 128 | f 7/8/18 9/10/18 25/48/18 24/49/18 129 | f 1/1/19 3/4/19 22/50/19 21/51/19 130 | f 5/6/20 7/8/20 24/49/20 23/52/20 131 | f 3/4/21 5/6/21 23/52/21 22/50/21 132 | f 19/30/22 1/32/22 21/53/22 30/33/22 133 | -------------------------------------------------------------------------------- /shaders/main_frag.glsl: -------------------------------------------------------------------------------- 1 | #version 120 2 | 3 | #define PI 3.14159 4 | 5 | varying vec3 fragPos; 6 | varying vec3 normal; 7 | varying vec4 color; 8 | varying vec2 uv; 9 | varying vec4 fragPosLight; 10 | 11 | uniform vec4 p3d_ColorScale; 12 | uniform sampler2D p3d_Texture0; 13 | 14 | uniform sampler2D shadowMap; 15 | uniform vec3 shadowDir; 16 | uniform vec3 shadowSize; 17 | uniform float shadowTexelRadius; 18 | uniform float shadowBias; 19 | uniform bool softShadows; 20 | 21 | uniform vec4 sunColor; 22 | uniform vec4 ambientColor; 23 | 24 | uniform sampler2D noiseTex; 25 | 26 | uniform float gamma; 27 | uniform vec2 shadowFilterResolution; 28 | 29 | 30 | float rnd_index = 0.0; 31 | float randomNumber() 32 | { 33 | vec2 uv = rnd_index * vec2(253.47, 121.33); 34 | rnd_index += 1.3; 35 | return texture2D(noiseTex, uv).r; 36 | } 37 | 38 | // Narkowicz 2015, "ACES Filmic Tone Mapping Curve" 39 | vec3 ACESFilm(vec3 x) 40 | { 41 | float a = 2.51; 42 | float b = 0.03; 43 | float c = 2.43; 44 | float d = 0.59; 45 | float e = 0.14; 46 | return clamp((x*(a*x+b))/(x*(c*x+d)+e), 0.0, 1.0); 47 | } 48 | 49 | 50 | float calculateSoftShadow(vec3 norm, vec3 shadow_dir) 51 | { 52 | vec3 proj_coords = fragPosLight.xyz / fragPosLight.w; 53 | proj_coords = proj_coords * 0.5 + 0.5; 54 | proj_coords.z = min(proj_coords.z, 1.0); 55 | 56 | float normal_bias = tan(acos(dot(norm, -shadow_dir))) * shadowTexelRadius * shadowFilterResolution.x * 2.0 + shadowBias; 57 | normal_bias /= shadowSize.y * 2.0; 58 | 59 | float texel_size = 1.0 / shadowSize.z; 60 | float shadow = 0.0; 61 | 62 | for (int i = int(shadowFilterResolution.x); i > 0; i--) 63 | { 64 | for (int j = 0; j < int(shadowFilterResolution.y); j++) 65 | { 66 | float angle = ((float(j) + randomNumber() * 2.0 - 0.5) / shadowFilterResolution.y) * 2.0 * PI; 67 | vec2 sample_coords = proj_coords.xy + vec2(sin(angle), cos(angle)) * texel_size * (i + randomNumber() * 2.0 - 1.0); 68 | 69 | float shadow_depth = texture2D(shadowMap, sample_coords).r; 70 | shadow += proj_coords.z - normal_bias < shadow_depth ? 1.0 : 0.0; 71 | } 72 | 73 | if (shadow == 0.0 || (shadow == shadowFilterResolution.y && i == int(shadowFilterResolution.x))) 74 | { 75 | shadow = shadowFilterResolution.x * shadowFilterResolution.y * min(shadow, 1.0); 76 | break; 77 | } 78 | } 79 | shadow /= shadowFilterResolution.x * shadowFilterResolution.y; 80 | 81 | return shadow; 82 | } 83 | 84 | float calculateHardShadow(vec3 norm, vec3 shadow_dir) 85 | { 86 | vec3 proj_coords = fragPosLight.xyz / fragPosLight.w; 87 | proj_coords = proj_coords * 0.5 + 0.5; 88 | proj_coords.z = min(proj_coords.z, 1.0); 89 | 90 | float normal_bias = tan(acos(dot(norm, -shadow_dir))) * shadowTexelRadius + shadowBias; 91 | normal_bias /= shadowSize.y * 2.0; 92 | 93 | float shadow_depth = texture2D(shadowMap, proj_coords.xy).r; 94 | float shadow = proj_coords.z - normal_bias < shadow_depth ? 1.0 : 0.0; 95 | 96 | return shadow; 97 | } 98 | 99 | 100 | void main() 101 | { 102 | vec3 norm = normalize(normal); 103 | vec3 shadow_dir = normalize(shadowDir); 104 | 105 | rnd_index = fragPos.x + fragPos.y + fragPos.z; 106 | 107 | // shadows 108 | float shadow = 0.0; 109 | if (softShadows) 110 | shadow = calculateSoftShadow(norm, shadow_dir); 111 | else 112 | shadow = calculateHardShadow(norm, shadow_dir); 113 | 114 | 115 | vec3 ambient = ambientColor.rgb * ambientColor.a; 116 | vec3 diffuse = max(dot(norm, -shadow_dir), 0.0) * sunColor.rgb * sunColor.a * shadow; 117 | 118 | vec3 lighting_result = ambient + diffuse; 119 | 120 | gl_FragColor = texture2D(p3d_Texture0, uv) * color * p3d_ColorScale; 121 | gl_FragColor.rgb *= lighting_result; 122 | 123 | // tonemapping + gamma correction 124 | // gl_FragColor.rgb = vec3(1.0) - exp(-gl_FragColor.rgb * exposure); 125 | gl_FragColor.rgb = ACESFilm(gl_FragColor.rgb); 126 | gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1.0 / gamma)); 127 | } -------------------------------------------------------------------------------- /scene_lighting.py: -------------------------------------------------------------------------------- 1 | from panda3d.core import WindowProperties, FrameBufferProperties, GraphicsPipe, Texture, GraphicsOutput, SamplerState, OrthographicLens, Shader, Camera, NodePath, PandaNode, PNMImage 2 | from ursina import Entity, camera 3 | from math import sqrt 4 | from random import random 5 | 6 | 7 | class SceneLighting(Entity): 8 | def __init__(self, ursina, player, sun_direction = (0.75, -1, 0.5), sun_color = (1.0, 0.7, 0.3, 1.0), ambient_color = (0.6, 0.65, 0.7, 0.5), 9 | shadow_resolution = 2048, shadow_size = 100, shadow_height = 200, shadow_bias = 0.0, shadow_camera_direction_offset = True, 10 | shadow_filter_radius = 3.0, shadow_filter_samples = 10.0, soft_shadows = True, 11 | sky_texture = None, sky_color = (1.0, 1.0, 1.0, 1.5), gamma = 2.0): 12 | 13 | self.player = player 14 | self.shadow_camera_direction_offset = (shadow_size / 2.0) * shadow_camera_direction_offset 15 | 16 | # noise texture creation for random values in shader 17 | def createNoiseTexture(tex_size): 18 | noise_img = PNMImage(tex_size, tex_size) 19 | 20 | for x in range(tex_size): 21 | for y in range(tex_size): 22 | noise_img.setRed(x, y, random()) 23 | 24 | noise_texture = Texture("noise texture") 25 | noise_texture.load(noise_img) 26 | noise_texture.setMagfilter(SamplerState.FT_nearest) 27 | noise_texture.setMagfilter(SamplerState.FT_nearest) 28 | return noise_texture 29 | 30 | 31 | # sky 32 | if (sky_texture): 33 | self.sky_shader = Shader.load(lang = Shader.SL_GLSL, vertex = "shaders/sky_vert.glsl", fragment = "shaders/sky_frag.glsl") 34 | self.sky = Entity(model = "sphere", texture = sky_texture, scale = 5000, double_sided = True, color = sky_color) 35 | self.sky.setShader(self.sky_shader) 36 | self.sky.setShaderInput("gamma", gamma) 37 | 38 | # bufffer creation 39 | win_prop = WindowProperties(size = (shadow_resolution, shadow_resolution)) 40 | fb_prop = FrameBufferProperties() 41 | fb_prop.setRgbColor(1) 42 | fb_prop.setAlphaBits(1) 43 | fb_prop.setDepthBits(1) 44 | shadow_buffer = ursina.graphicsEngine.makeOutput(ursina.pipe, "shadow buffer", -100, fb_prop, win_prop, GraphicsPipe.BFRefuseWindow, ursina.win.getGsg(), ursina.win) 45 | 46 | shadow_tex = Texture() 47 | shadow_buffer.addRenderTexture(shadow_tex, GraphicsOutput.RTM_bind_or_copy, 48 | GraphicsOutput.RTP_depth_stencil) 49 | shadow_tex.setMinfilter(SamplerState.FT_nearest) 50 | shadow_tex.setMagfilter(SamplerState.FT_nearest) 51 | shadow_tex.setWrapU(Texture.WM_border_color) 52 | shadow_tex.setWrapV(Texture.WM_border_color) 53 | shadow_tex.setBorderColor((1.0, 1.0, 1.0, 1.0)) 54 | 55 | shadow_buffer.setClearActive(GraphicsOutput.RTP_depth, True) 56 | shadow_buffer.setClearValue(GraphicsOutput.RTP_depth, 1.0) 57 | 58 | # shadow camera creation 59 | self.shadow_cam = Camera("shadow camera") 60 | shadow_cam_lens = OrthographicLens() 61 | shadow_cam_lens.setFilmSize(shadow_size, shadow_size) 62 | shadow_cam_lens.setFilmOffset(0, 0) 63 | shadow_cam_lens.setNearFar(-shadow_height, shadow_height) 64 | self.shadow_cam.setLens(shadow_cam_lens) 65 | 66 | self.shadow_cam_np = ursina.render.attachNewNode(self.shadow_cam) 67 | self.shadow_cam_np.lookAt(sun_direction) 68 | 69 | display_region = shadow_buffer.makeDisplayRegion() 70 | display_region.disableClears() 71 | display_region.setActive(True) 72 | display_region.setCamera(self.shadow_cam_np) 73 | 74 | # main shader 75 | self.main_shader = Shader.load(lang = Shader.SL_GLSL, vertex = "shaders/main_vert.glsl", fragment = "shaders/main_frag.glsl") 76 | 77 | ursina.render.setShaderInput("shadowMap", shadow_tex) 78 | ursina.render.setShaderInput("shadowCam", self.shadow_cam_np) 79 | ursina.render.setShaderInput("shadowDir", sun_direction) 80 | ursina.render.setShaderInput("shadowSize", (shadow_size, shadow_height, shadow_resolution)) 81 | ursina.render.setShaderInput("shadowBias", shadow_bias) 82 | ursina.render.setShaderInput("shadowFilterResolution", (shadow_filter_radius, shadow_filter_samples)) 83 | ursina.render.setShaderInput("softShadows", soft_shadows) 84 | 85 | shadow_texel_size = shadow_size / shadow_resolution 86 | shadow_texel_radius = sqrt(shadow_texel_size**2 + shadow_texel_size**2) / 2.0 87 | ursina.render.setShaderInput("shadowTexelRadius", shadow_texel_radius) 88 | 89 | ursina.render.setShaderInput("sunColor", sun_color) 90 | ursina.render.setShaderInput("ambientColor", ambient_color) 91 | 92 | noise_tex = createNoiseTexture(128) 93 | ursina.render.setShaderInput("noiseTex", noise_tex) 94 | 95 | ursina.render.setShaderInput("gamma", gamma) 96 | 97 | main_camera_initializer = NodePath(PandaNode("main camera initializer")) 98 | main_camera_initializer.setShader(self.main_shader) 99 | ursina.cam.node().setInitialState(main_camera_initializer.getState()) 100 | 101 | # shadow shader 102 | self.shadow_shader = Shader.load(lang = Shader.SL_GLSL, vertex = "shaders/shadow_vert.glsl", fragment = "shaders/shadow_frag.glsl") 103 | 104 | shadow_camera_initializer = NodePath(PandaNode("shadow camera initializer")) 105 | shadow_camera_initializer.setShader(self.shadow_shader) 106 | self.shadow_cam.setInitialState(shadow_camera_initializer.getState()) 107 | 108 | # debug shadow buffer 109 | # ursina.accept("v", ursina.bufferViewer.toggleEnable) 110 | 111 | 112 | def update(self): 113 | self.shadow_cam_np.setPos(self.player.world_position + camera.forward.normalized() * self.shadow_camera_direction_offset) -------------------------------------------------------------------------------- /abilities.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | from ursina import curve 3 | 4 | class Ability(Entity): 5 | def __init__(self, player, ability_enabled = True): 6 | super().__init__( 7 | parent = player 8 | ) 9 | 10 | self.player = player 11 | self.ability_enabled = ability_enabled 12 | self.shift_count = 0 13 | 14 | class Rope(Ability): 15 | def __init__(self, player, enabled = True): 16 | super().__init__( 17 | player, enabled 18 | ) 19 | 20 | self.rope_pivot = Entity() 21 | self.rope = Entity(model = Mesh(vertices = [self.world_position, self.rope_pivot.world_position], mode = "line", thickness = 15, colors = [color.hex("#ff8b00")]), texture = "rope.png", enabled = False) 22 | self.rope_position = self.position 23 | self.can_rope = False 24 | self.rope_length = 200 25 | self.max_rope_length = False 26 | self.below_rope = False 27 | 28 | # Audio 29 | self.rope_sound = Audio("rope.wav", False) 30 | 31 | def update(self): 32 | if self.ability_enabled: 33 | if self.can_rope and self.player.ability_bar.value > 0: 34 | if held_keys["right mouse"]: 35 | if distance(self.player.position, self.rope_pivot.position) > 10: 36 | if distance(self.player.position, self.rope_pivot.position) < self.rope_length and not self.player.grounded: 37 | self.player.position += ((self.rope_pivot.position - self.player.position).normalized() * 20) * time.dt 38 | self.player.velocity_z += 2 * time.dt 39 | self.rope_position = lerp(self.rope_position, self.rope_pivot.world_position, time.dt * 20) 40 | self.rope.model.vertices.pop(0) 41 | self.rope.model.vertices = [self.player.position - (0, 5, 0) + (self.player.forward * 4) + (self.player.left * 2), self.rope_position] 42 | self.rope.model.generate() 43 | self.rope.enable() 44 | if self.player.y < self.rope_pivot.y: 45 | self.player.velocity_y += 40 * time.dt 46 | else: 47 | self.player.velocity_y -= 60 * time.dt 48 | 49 | if (self.rope_pivot.y - self.player.y) > self.rope_length: 50 | self.below_rope = True 51 | invoke(setattr, self, "below_rope", False, delay = 5) 52 | 53 | if self.below_rope: 54 | self.player.velocity_y += 50 * time.dt 55 | else: 56 | self.rope.disable() 57 | if distance(self.player.position, self.rope_pivot.position) > self.rope_length: 58 | self.max_rope_length = True 59 | invoke(setattr, self, "max_rope_length", False, delay = 2) 60 | if self.max_rope_length: 61 | self.player.position += ((self.rope_pivot.position - self.player.position).normalized() * 25 * time.dt) 62 | self.player.velocity_z -= 5 * time.dt 63 | self.player.velocity_y -= 80 * time.dt 64 | 65 | self.player.using_ability = True 66 | self.player.ability_bar.value -= 3 * time.dt 67 | 68 | def input(self, key): 69 | if self.ability_enabled: 70 | if key == "right mouse down" and self.player.ability_bar.value > 0: 71 | rope_ray = raycast(camera.world_position, camera.forward, distance = 100, traverse_target = self.player.map, ignore = [self, camera, ]) 72 | if rope_ray.hit: 73 | self.can_rope = True 74 | rope_point = rope_ray.world_point 75 | self.rope_entity = rope_ray.entity 76 | self.rope_pivot.position = rope_point 77 | self.rope_position = self.position 78 | self.rope_sound.pitch = random.uniform(0.7, 1) 79 | self.rope_sound.play() 80 | elif key == "right mouse up": 81 | self.rope_pivot.position = self.position 82 | if self.can_rope and self.player.ability_bar.value > 0: 83 | self.rope.disable() 84 | self.player.velocity_y += 10 85 | self.can_rope = False 86 | invoke(setattr, self.player, "using_ability", False, delay = 2) 87 | 88 | class DashAbility(Ability): 89 | def __init__(self, player, enabled = True): 90 | super().__init__( 91 | player, enabled 92 | ) 93 | 94 | self.dashing = False 95 | 96 | # Audio 97 | self.dash_sound = Audio("dash.wav", False) 98 | self.dash_sound.volume = 0.8 99 | 100 | def update(self): 101 | if self.ability_enabled: 102 | if self.dashing and not held_keys["right mouse"]: 103 | if held_keys["a"]: 104 | self.player.animate_position(self.player.position + (camera.left * 40), duration = 0.2, curve = curve.in_out_quad) 105 | elif held_keys["d"]: 106 | self.player.animate_position(self.player.position + (camera.right * 40), duration = 0.2, curve = curve.in_out_quad) 107 | else: 108 | self.player.animate_position(self.player.position + (camera.forward * 40), duration = 0.2, curve = curve.in_out_quad) 109 | 110 | camera.animate("fov", 120, duration = 0.2, curve = curve.in_quad) 111 | camera.animate("fov", 100, curve = curve.out_quad, delay = 0.2) 112 | 113 | self.dashing = False 114 | self.player.velocity_y = 0 115 | 116 | self.player.shake_camera(0.3, 100) 117 | 118 | self.dash_sound.play() 119 | 120 | self.player.movementX = (self.player.forward[0] * self.player.velocity_z + 121 | self.player.left[0] * self.player.velocity_x + 122 | self.player.back[0] * -self.player.velocity_z + 123 | self.player.right[0] * -self.player.velocity_x) * self.player.speed * time.dt 124 | 125 | self.player.movementZ = (self.player.forward[2] * self.player.velocity_z + 126 | self.player.left[2] * self.player.velocity_x + 127 | self.player.back[2] * -self.player.velocity_z + 128 | self.player.right[2] * -self.player.velocity_x) * self.player.speed * time.dt 129 | 130 | def input(self, key): 131 | if self.ability_enabled: 132 | if key == "left shift": 133 | self.shift_count += 1 134 | if self.shift_count >= 2 and self.player.ability_bar.value >= 5: 135 | self.dashing = True 136 | self.player.ability_bar.value -= 5 137 | self.player.using_ability = True 138 | invoke(setattr, self.player, "using_ability", False, delay = 2) 139 | invoke(setattr, self, "shift_count", 0, delay = 0.2) 140 | 141 | class SlowMotion(Ability): 142 | def __init__(self, player, enabled = True): 143 | super().__init__(player, enabled) 144 | 145 | self.slow_motion = False 146 | self.start_slow_motion = False 147 | self.vignette = Entity(model = "quad", texture = "vignette.png", parent = camera.ui, scale_x = 2, enabled = False) 148 | 149 | def update(self): 150 | if self.ability_enabled: 151 | if self.start_slow_motion: 152 | application.time_scale = 0.5 153 | self.vignette.enable() 154 | self.player.using_ability = True 155 | self.start_slow_motion = False 156 | 157 | if self.slow_motion: 158 | self.player.ability_bar.value -= 3 * time.dt 159 | self.player.using_ability = True 160 | 161 | if self.player.ability_bar.value <= 1: 162 | application.time_scale = 1 163 | self.vignette.disable() 164 | self.player.using_ability = False 165 | self.shift_count = 0 166 | 167 | def input(self, key): 168 | if self.ability_enabled: 169 | if key == "left shift": 170 | self.shift_count += 1 171 | if self.shift_count >= 2 and self.player.ability_bar.value >= 5: 172 | self.slow_motion = True 173 | self.start_slow_motion = True 174 | invoke(setattr, self, "shift_count", 0, delay = 0.2) 175 | elif key == "left shift up": 176 | self.slow_motion = False 177 | application.time_scale = 1 178 | self.vignette.disable() 179 | self.player.using_ability = False -------------------------------------------------------------------------------- /assets/particles/particles.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: '' 2 | # www.blender.org 3 | mtllib particles.mtl 4 | v 0.129844 -3.448412 -3.120373 5 | v 2.529845 -3.448412 -3.120373 6 | v 2.529845 -3.448412 -5.520373 7 | v 0.129845 -3.448412 -5.520373 8 | v 0.129845 -5.448412 -5.520374 9 | v 2.529845 -5.448412 -5.520373 10 | v 2.529845 -5.448412 -3.120373 11 | v 0.129844 -5.448412 -3.120374 12 | v 6.047523 2.383461 2.705202 13 | v 8.447523 2.383461 2.705203 14 | v 8.447523 2.383462 0.305203 15 | v 6.047523 2.383462 0.305202 16 | v 6.047523 0.383462 0.305202 17 | v 8.447523 0.383462 0.305202 18 | v 8.447523 0.383462 2.705202 19 | v 6.047523 0.383462 2.705202 20 | v -12.400982 4.309852 9.258223 21 | v -10.000981 4.309852 9.258223 22 | v -10.000981 4.309852 6.858223 23 | v -12.400982 4.309852 6.858223 24 | v -12.400982 2.309852 6.858222 25 | v -10.000981 2.309852 6.858223 26 | v -10.000981 2.309852 9.258223 27 | v -12.400982 2.309852 9.258222 28 | v -2.778959 -0.039516 21.074820 29 | v -0.378959 -0.039516 21.074820 30 | v -0.378959 -0.039516 18.674820 31 | v -2.778959 -0.039516 18.674820 32 | v -2.778959 -2.039516 18.674820 33 | v -0.378959 -2.039516 18.674820 34 | v -0.378959 -2.039516 21.074820 35 | v -2.778959 -2.039516 21.074820 36 | v -2.730914 -3.662977 -21.392658 37 | v -0.330914 -3.662977 -21.392656 38 | v -0.330913 -3.662976 -23.792656 39 | v -2.730913 -3.662976 -23.792658 40 | v -2.730913 -5.662975 -23.792658 41 | v -0.330913 -5.662975 -23.792658 42 | v -0.330914 -5.662976 -21.392658 43 | v -2.730914 -5.662976 -21.392658 44 | v -1.200000 4.529378 1.200001 45 | v 1.200000 4.529378 1.200001 46 | v 1.200000 4.529378 -1.199999 47 | v -1.200000 4.529378 -1.199999 48 | v -1.200000 2.529378 -1.200000 49 | v 1.200000 2.529378 -1.199999 50 | v 1.200000 2.529378 1.200001 51 | v -1.200000 2.529378 1.200000 52 | v 10.844564 -3.150863 13.006284 53 | v 13.244564 -3.150863 13.006285 54 | v 13.244564 -3.150863 10.606285 55 | v 10.844564 -3.150863 10.606284 56 | v 10.844564 -5.150863 10.606284 57 | v 13.244564 -5.150863 10.606284 58 | v 13.244564 -5.150863 13.006284 59 | v 10.844564 -5.150863 13.006284 60 | v 2.919547 10.938696 -6.945989 61 | v 5.319546 10.938696 -6.945989 62 | v 5.319546 10.938697 -9.345988 63 | v 2.919547 10.938697 -9.345989 64 | v 2.919547 8.938697 -9.345989 65 | v 5.319546 8.938697 -9.345989 66 | v 5.319546 8.938696 -6.945989 67 | v 2.919547 8.938696 -6.945989 68 | v -7.531394 12.673494 9.281415 69 | v -5.131394 12.673494 9.281415 70 | v -5.131394 12.673495 6.881415 71 | v -7.531394 12.673495 6.881415 72 | v -7.531394 10.673495 6.881414 73 | v -5.131394 10.673495 6.881415 74 | v -5.131394 10.673494 9.281415 75 | v -7.531394 10.673494 9.281415 76 | v -8.345941 0.387241 -3.470749 77 | v -5.945941 0.387241 -3.470749 78 | v -5.945941 0.387241 -5.870750 79 | v -8.345941 0.387241 -5.870750 80 | v -8.345941 -1.612759 -5.870750 81 | v -5.945941 -1.612759 -5.870750 82 | v -5.945941 -1.612759 -3.470749 83 | v -8.345941 -1.612759 -3.470749 84 | vt 0.625000 0.500000 85 | vt 0.875000 0.500000 86 | vt 0.875000 0.750000 87 | vt 0.625000 0.750000 88 | vt 0.375000 0.750000 89 | vt 0.625000 1.000000 90 | vt 0.375000 1.000000 91 | vt 0.375000 0.000000 92 | vt 0.625000 0.000000 93 | vt 0.625000 0.250000 94 | vt 0.375000 0.250000 95 | vt 0.125000 0.500000 96 | vt 0.375000 0.500000 97 | vt 0.125000 0.750000 98 | vt 0.625000 0.500000 99 | vt 0.875000 0.500000 100 | vt 0.875000 0.750000 101 | vt 0.625000 0.750000 102 | vt 0.375000 0.750000 103 | vt 0.625000 1.000000 104 | vt 0.375000 1.000000 105 | vt 0.375000 0.000000 106 | vt 0.625000 0.000000 107 | vt 0.625000 0.250000 108 | vt 0.375000 0.250000 109 | vt 0.125000 0.500000 110 | vt 0.375000 0.500000 111 | vt 0.125000 0.750000 112 | vt 0.625000 0.500000 113 | vt 0.875000 0.500000 114 | vt 0.875000 0.750000 115 | vt 0.625000 0.750000 116 | vt 0.375000 0.750000 117 | vt 0.625000 1.000000 118 | vt 0.375000 1.000000 119 | vt 0.375000 0.000000 120 | vt 0.625000 0.000000 121 | vt 0.625000 0.250000 122 | vt 0.375000 0.250000 123 | vt 0.125000 0.500000 124 | vt 0.375000 0.500000 125 | vt 0.125000 0.750000 126 | vt 0.625000 0.500000 127 | vt 0.875000 0.500000 128 | vt 0.875000 0.750000 129 | vt 0.625000 0.750000 130 | vt 0.375000 0.750000 131 | vt 0.625000 1.000000 132 | vt 0.375000 1.000000 133 | vt 0.375000 0.000000 134 | vt 0.625000 0.000000 135 | vt 0.625000 0.250000 136 | vt 0.375000 0.250000 137 | vt 0.125000 0.500000 138 | vt 0.375000 0.500000 139 | vt 0.125000 0.750000 140 | vt 0.625000 0.500000 141 | vt 0.875000 0.500000 142 | vt 0.875000 0.750000 143 | vt 0.625000 0.750000 144 | vt 0.375000 0.750000 145 | vt 0.625000 1.000000 146 | vt 0.375000 1.000000 147 | vt 0.375000 0.000000 148 | vt 0.625000 0.000000 149 | vt 0.625000 0.250000 150 | vt 0.375000 0.250000 151 | vt 0.125000 0.500000 152 | vt 0.375000 0.500000 153 | vt 0.125000 0.750000 154 | vt 0.625000 0.500000 155 | vt 0.875000 0.500000 156 | vt 0.875000 0.750000 157 | vt 0.625000 0.750000 158 | vt 0.375000 0.750000 159 | vt 0.625000 1.000000 160 | vt 0.375000 1.000000 161 | vt 0.375000 0.000000 162 | vt 0.625000 0.000000 163 | vt 0.625000 0.250000 164 | vt 0.375000 0.250000 165 | vt 0.125000 0.500000 166 | vt 0.375000 0.500000 167 | vt 0.125000 0.750000 168 | vt 0.625000 0.500000 169 | vt 0.875000 0.500000 170 | vt 0.875000 0.750000 171 | vt 0.625000 0.750000 172 | vt 0.375000 0.750000 173 | vt 0.625000 1.000000 174 | vt 0.375000 1.000000 175 | vt 0.375000 0.000000 176 | vt 0.625000 0.000000 177 | vt 0.625000 0.250000 178 | vt 0.375000 0.250000 179 | vt 0.125000 0.500000 180 | vt 0.375000 0.500000 181 | vt 0.125000 0.750000 182 | vt 0.625000 0.500000 183 | vt 0.875000 0.500000 184 | vt 0.875000 0.750000 185 | vt 0.625000 0.750000 186 | vt 0.375000 0.750000 187 | vt 0.625000 1.000000 188 | vt 0.375000 1.000000 189 | vt 0.375000 0.000000 190 | vt 0.625000 0.000000 191 | vt 0.625000 0.250000 192 | vt 0.375000 0.250000 193 | vt 0.125000 0.500000 194 | vt 0.375000 0.500000 195 | vt 0.125000 0.750000 196 | vt 0.625000 0.500000 197 | vt 0.875000 0.500000 198 | vt 0.875000 0.750000 199 | vt 0.625000 0.750000 200 | vt 0.375000 0.750000 201 | vt 0.625000 1.000000 202 | vt 0.375000 1.000000 203 | vt 0.375000 0.000000 204 | vt 0.625000 0.000000 205 | vt 0.625000 0.250000 206 | vt 0.375000 0.250000 207 | vt 0.125000 0.500000 208 | vt 0.375000 0.500000 209 | vt 0.125000 0.750000 210 | vt 0.625000 0.500000 211 | vt 0.875000 0.500000 212 | vt 0.875000 0.750000 213 | vt 0.625000 0.750000 214 | vt 0.375000 0.750000 215 | vt 0.625000 1.000000 216 | vt 0.375000 1.000000 217 | vt 0.375000 0.000000 218 | vt 0.625000 0.000000 219 | vt 0.625000 0.250000 220 | vt 0.375000 0.250000 221 | vt 0.125000 0.500000 222 | vt 0.375000 0.500000 223 | vt 0.125000 0.750000 224 | vn -0.0000 1.0000 0.0000 225 | vn 0.0000 0.0000 -1.0000 226 | vn 1.0000 -0.0000 0.0000 227 | vn 0.0000 -1.0000 -0.0000 228 | vn -1.0000 0.0000 -0.0000 229 | vn -0.0000 -0.0000 1.0000 230 | usemtl Material.001 231 | s 1 232 | f 1/1/1 2/2/1 3/3/1 4/4/1 233 | f 5/5/2 4/4/2 3/6/2 6/7/2 234 | f 6/8/3 3/9/3 2/10/3 7/11/3 235 | f 7/12/4 8/13/4 5/5/4 6/14/4 236 | f 8/13/5 1/1/5 4/4/5 5/5/5 237 | f 7/11/6 2/10/6 1/1/6 8/13/6 238 | f 9/15/1 10/16/1 11/17/1 12/18/1 239 | f 13/19/2 12/18/2 11/20/2 14/21/2 240 | f 14/22/3 11/23/3 10/24/3 15/25/3 241 | f 15/26/4 16/27/4 13/19/4 14/28/4 242 | f 16/27/5 9/15/5 12/18/5 13/19/5 243 | f 15/25/6 10/24/6 9/15/6 16/27/6 244 | f 17/29/1 18/30/1 19/31/1 20/32/1 245 | f 21/33/2 20/32/2 19/34/2 22/35/2 246 | f 22/36/3 19/37/3 18/38/3 23/39/3 247 | f 23/40/4 24/41/4 21/33/4 22/42/4 248 | f 24/41/5 17/29/5 20/32/5 21/33/5 249 | f 23/39/6 18/38/6 17/29/6 24/41/6 250 | f 25/43/1 26/44/1 27/45/1 28/46/1 251 | f 29/47/2 28/46/2 27/48/2 30/49/2 252 | f 30/50/3 27/51/3 26/52/3 31/53/3 253 | f 31/54/4 32/55/4 29/47/4 30/56/4 254 | f 32/55/5 25/43/5 28/46/5 29/47/5 255 | f 31/53/6 26/52/6 25/43/6 32/55/6 256 | f 33/57/1 34/58/1 35/59/1 36/60/1 257 | f 37/61/2 36/60/2 35/62/2 38/63/2 258 | f 38/64/3 35/65/3 34/66/3 39/67/3 259 | f 39/68/4 40/69/4 37/61/4 38/70/4 260 | f 40/69/5 33/57/5 36/60/5 37/61/5 261 | f 39/67/6 34/66/6 33/57/6 40/69/6 262 | f 41/71/1 42/72/1 43/73/1 44/74/1 263 | f 45/75/2 44/74/2 43/76/2 46/77/2 264 | f 46/78/3 43/79/3 42/80/3 47/81/3 265 | f 47/82/4 48/83/4 45/75/4 46/84/4 266 | f 48/83/5 41/71/5 44/74/5 45/75/5 267 | f 47/81/6 42/80/6 41/71/6 48/83/6 268 | f 49/85/1 50/86/1 51/87/1 52/88/1 269 | f 53/89/2 52/88/2 51/90/2 54/91/2 270 | f 54/92/3 51/93/3 50/94/3 55/95/3 271 | f 55/96/4 56/97/4 53/89/4 54/98/4 272 | f 56/97/5 49/85/5 52/88/5 53/89/5 273 | f 55/95/6 50/94/6 49/85/6 56/97/6 274 | f 57/99/1 58/100/1 59/101/1 60/102/1 275 | f 61/103/2 60/102/2 59/104/2 62/105/2 276 | f 62/106/3 59/107/3 58/108/3 63/109/3 277 | f 63/110/4 64/111/4 61/103/4 62/112/4 278 | f 64/111/5 57/99/5 60/102/5 61/103/5 279 | f 63/109/6 58/108/6 57/99/6 64/111/6 280 | f 65/113/1 66/114/1 67/115/1 68/116/1 281 | f 69/117/2 68/116/2 67/118/2 70/119/2 282 | f 70/120/3 67/121/3 66/122/3 71/123/3 283 | f 71/124/4 72/125/4 69/117/4 70/126/4 284 | f 72/125/5 65/113/5 68/116/5 69/117/5 285 | f 71/123/6 66/122/6 65/113/6 72/125/6 286 | f 73/127/1 74/128/1 75/129/1 76/130/1 287 | f 77/131/2 76/130/2 75/132/2 78/133/2 288 | f 78/134/3 75/135/3 74/136/3 79/137/3 289 | f 79/138/4 80/139/4 77/131/4 78/140/4 290 | f 80/139/5 73/127/5 76/130/5 77/131/5 291 | f 79/137/6 74/136/6 73/127/6 80/139/6 292 | -------------------------------------------------------------------------------- /mainmenu.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | from ursina import curve 3 | 4 | colourH = color.rgba(18, 152, 255, 180) 5 | colourN = color.rgba(0, 0, 0, 0.7) 6 | highlighted = lambda button: button.color == colourH 7 | 8 | class MainMenu(Entity): 9 | def __init__(self, player, floating_islands, deserted_sands, mountainous_valley): 10 | super().__init__( 11 | parent = camera.ui 12 | ) 13 | 14 | # Player 15 | self.player = player 16 | 17 | # Maps 18 | self.floating_islands = floating_islands 19 | self.deserted_sands = deserted_sands 20 | self.mountainous_valley = mountainous_valley 21 | 22 | # Menus 23 | self.mainmenu = Entity(parent = self, enabled = False) 24 | self.end_screen = Entity(parent = self, enabled = False) 25 | self.pause_menu = Entity(parent = self, enabled = False) 26 | self.maps_menu = Entity(parent = self, enabled = False) 27 | 28 | self.menus = [self.mainmenu, self.pause_menu, self.maps_menu] 29 | self.index = 0 30 | 31 | self.enable_end_screen = True 32 | 33 | # Animate the Menus 34 | for menu in self.menus: 35 | def animate_in_menu(menu = menu): 36 | for i, e in enumerate(menu.children): 37 | e.original_scale = e.scale 38 | e.scale -= 0.01 39 | e.animate_scale(e.original_scale, delay = i * 0.05, duration = 0.1, curve = curve.out_quad) 40 | 41 | e.alpha = 0 42 | e.animate("alpha", 0.7, delay = i * 0.05, duration = 0.1, curve = curve.out_quad) 43 | 44 | if hasattr(e, "text_entity"): 45 | e.text_entity.alpha = 0 46 | e.text_entity.animate("alpha", 1, delay = i * 0.05, duration = 0.1) 47 | 48 | if menu != self.pause_menu: 49 | menu.on_enable = animate_in_menu 50 | 51 | self.mainmenu.enable() 52 | 53 | # Main Menu 54 | self.start_button = Button(text = "Start", color = colourH, highlight_color = colourH, scale_y = 0.1, scale_x = 0.3, y = 0.05, parent = self.mainmenu) 55 | self.maps_button = Button(text = "Maps", color = colourN, highlight_color = colourN, scale_y = 0.1, scale_x = 0.3, y = -0.07, parent = self.mainmenu) 56 | self.quit_button = Button(text = "Quit", color = colourN, highlight_color = colourN, scale_y = 0.1, scale_x = 0.3, y = -0.19, parent = self.mainmenu) 57 | 58 | invoke(setattr, self.start_button, "color", colourH, delay = 0.5) 59 | 60 | # Endscreen 61 | retry_text = Text("Retry", scale = 4, origin = (0, 0.5), x = 0, y = 0.1, z = -100, parent = self.end_screen) 62 | press_enter = Text("Press Enter", scale = 2, origin = (0, 0.5), x = 0, y = 0, z = -100, parent = self.end_screen) 63 | self.highscore_text = Text(text = str(self.player.highscore), origin = (0, 0), size = 0.05, scale = (0.8, 0.8), position = window.top - (0, 0.1), parent = self.end_screen, z = -100) 64 | camera.overlay.parent = self.end_screen 65 | camera.overlay.color = color.rgba(220, 0, 0, 100) 66 | 67 | # Pause Menu 68 | self.resume_button = Button(text = "Resume", color = colourN, highlight_color = colourN, scale_y = 0.1, scale_x = 0.3, y = 0.05, parent = self.pause_menu) 69 | self.retry_button = Button(text = "Retry", color = colourN, highlight_color = colourN, scale_y = 0.1, scale_x = 0.3, y = -0.07, parent = self.pause_menu) 70 | self.mainmenu_button = Button(text = "Main Menu", color = colourN, highlight_color = colourN, scale_y = 0.1, scale_x = 0.3, y = -0.19, parent = self.pause_menu) 71 | self.pause_overlay = Entity(parent = self.pause_menu, model = "quad", scale = 99, color = color.rgba(20, 20, 20, 100), eternal = True, z = 10) 72 | 73 | # Maps Menu 74 | self.floating_islands_button = Button(text = "Floating Islands", color = colourN, highlighted_color = colourH, scale_y = 0.1, scale_x = 0.3, y = 0.05, parent = self.maps_menu) 75 | self.deserted_sands_button = Button(text = "Deserted Sands", color = colourN, highlighted_color = colourH, scale_y = 0.1, scale_x = 0.3, y = -0.07, parent = self.maps_menu) 76 | self.mountainous_valley_button = Button(text = "Mountainous Valley", color = colourN, highlighted_color = colourH, scale_y = 0.1, scale_x = 0.3, y = -0.19, parent = self.maps_menu) 77 | 78 | def update(self): 79 | if self.player.health <= 0: 80 | if self.enable_end_screen: 81 | self.end_screen.enable() 82 | self.enable_end_screen = False 83 | self.player.check_highscore() 84 | application.time_scale = 0.2 85 | self.player.dead = True 86 | self.highscore_text.text = "Highscore: " + str(self.player.highscore) 87 | 88 | if held_keys["enter"] and not self.enable_end_screen: 89 | self.player.reset() 90 | self.end_screen.disable() 91 | self.enable_end_screen = True 92 | 93 | def input(self, key): 94 | if key == "up arrow": 95 | for menu in self.menus: 96 | if menu.enabled: 97 | self.index -= 1 98 | if self.index <= -1: 99 | self.index = 0 100 | if isinstance(menu.children[self.index], Button): 101 | menu.children[self.index].color = colourH 102 | menu.children[self.index].highlight_color = colourH 103 | for button in menu.children: 104 | if menu.children[self.index] != button: 105 | button.color = colourN 106 | button.highlight_color = colourN 107 | else: 108 | self.index += 1 109 | 110 | elif key == "down arrow": 111 | for menu in self.menus: 112 | if menu.enabled: 113 | self.index += 1 114 | if self.index > len(menu.children) - 1: 115 | self.index = len(menu.children) - 1 116 | if isinstance(menu.children[self.index], Button): 117 | menu.children[self.index].color = colourH 118 | menu.children[self.index].highlight_color = colourH 119 | for button in menu.children: 120 | if menu.children[self.index] != button: 121 | button.color = colourN 122 | button.highlight_color = colourN 123 | else: 124 | self.index -= 1 125 | 126 | if key == "enter": 127 | # Main Menu 128 | if self.mainmenu.enabled: 129 | if highlighted(self.start_button): 130 | self.start() 131 | elif highlighted(self.maps_button): 132 | self.maps_menu.enable() 133 | self.mainmenu.disable() 134 | self.update_menu(self.maps_menu) 135 | elif highlighted(self.quit_button): 136 | application.quit() 137 | 138 | # Pause Menu 139 | elif self.pause_menu.enabled: 140 | if highlighted(self.resume_button): 141 | self.pause(False, False) 142 | elif highlighted(self.retry_button): 143 | self.player.reset() 144 | self.pause_menu.disable() 145 | elif highlighted(self.mainmenu_button): 146 | self.player.disable() 147 | self.player.reset() 148 | for enemy in self.player.enemies: 149 | enemy.disable() 150 | self.mainmenu.enable() 151 | self.pause_menu.disable() 152 | self.update_menu(self.pause_menu) 153 | 154 | # Maps menu 155 | elif self.maps_menu.enabled: 156 | if highlighted(self.floating_islands_button): 157 | for map in self.player.maps: 158 | map.disable() 159 | self.floating_islands.enable() 160 | self.player.map = self.floating_islands 161 | self.start() 162 | if highlighted(self.deserted_sands_button): 163 | for map in self.player.maps: 164 | map.disable() 165 | self.deserted_sands.enable() 166 | self.player.map = self.deserted_sands 167 | self.start() 168 | if highlighted(self.mountainous_valley_button): 169 | for map in self.player.maps: 170 | map.disable() 171 | self.mountainous_valley.enable() 172 | self.player.map = self.mountainous_valley 173 | self.player.position = (-5, 200, -10) 174 | self.start() 175 | 176 | # End Screen 177 | if self.player.health <= 0: 178 | self.end_screen.disable() 179 | self.enable_end_screen = True 180 | self.player.reset() 181 | 182 | if key == "escape": 183 | if self.maps_menu.enabled: 184 | self.maps_menu.disable() 185 | self.mainmenu.enable() 186 | 187 | # Pause Menu 188 | if self.player.enabled: 189 | self.pause() 190 | self.update_menu(self.pause_menu) 191 | 192 | def start(self): 193 | self.mainmenu.disable() 194 | self.maps_menu.disable() 195 | for enemy in self.player.enemies: 196 | enemy.enable() 197 | self.player.enable() 198 | 199 | def pause(self, opposite = True, pause = True): 200 | if opposite: 201 | self.pause_menu.enabled = not self.pause_menu.enabled 202 | if self.pause_menu.enabled: 203 | application.time_scale = 0.1 204 | else: 205 | application.time_scale = 1 206 | else: 207 | if pause: 208 | self.pause_menu.enable() 209 | application.time_scale = 0.1 210 | else: 211 | self.pause_menu.disable() 212 | application.time_scale = 1 213 | 214 | def update_menu(self, menu): 215 | for c in menu.children: 216 | c.color = colourN 217 | c.highlighted_color = colourN 218 | menu.children[0].color = colourH 219 | menu.children[0].highlighted_color = colourH 220 | self.index = 0 -------------------------------------------------------------------------------- /assets/enemy/enemy.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: 'enemy.blend' 2 | # www.blender.org 3 | mtllib enemy.mtl 4 | v -1.000000 1.000000 -1.000000 5 | v -1.000000 -1.000000 -1.000000 6 | v 1.000000 1.000000 -1.000000 7 | v 1.000000 -1.000000 -1.000000 8 | v -0.154935 0.749505 1.000000 9 | v -0.154935 0.439634 1.000000 10 | v 0.154935 0.749505 1.000000 11 | v 0.154935 0.439634 1.000000 12 | v -1.000000 1.000000 1.000000 13 | v -1.000000 -1.000000 1.000000 14 | v 1.000000 1.000000 1.000000 15 | v 1.000000 -1.000000 1.000000 16 | v -0.154935 0.749505 2.390970 17 | v -0.154935 0.439634 2.390970 18 | v 0.154935 0.749505 2.390970 19 | v 0.154935 0.439634 2.390970 20 | v -0.289962 -0.109934 1.080805 21 | v -0.289962 0.109934 1.080805 22 | v -0.509830 -0.109934 1.080805 23 | v -0.509830 0.109934 1.080805 24 | v -0.289962 -0.109934 0.860936 25 | v -0.289962 0.109934 0.860936 26 | v -0.509830 -0.109934 0.860936 27 | v -0.509830 0.109934 0.860936 28 | v 0.521499 -0.109934 1.080805 29 | v 0.521499 0.109934 1.080805 30 | v 0.301631 -0.109934 1.080805 31 | v 0.301631 0.109934 1.080805 32 | v 0.521499 -0.109934 0.860936 33 | v 0.521499 0.109934 0.860936 34 | v 0.301631 -0.109934 0.860936 35 | v 0.301631 0.109934 0.860936 36 | v -0.154462 0.199421 1.093031 37 | v -0.119195 0.366685 1.093031 38 | v -0.774046 0.377460 1.093031 39 | v -0.738779 0.544724 1.093031 40 | v -0.154462 0.199421 0.864081 41 | v -0.119195 0.366685 0.864081 42 | v -0.774046 0.377460 0.864081 43 | v -0.738779 0.544724 0.864081 44 | v -0.453319 -0.332703 0.864081 45 | v -0.508041 -0.555017 0.864081 46 | v 0.508041 -0.569338 0.864081 47 | v 0.453319 -0.791652 0.864081 48 | v -0.453319 -0.332703 1.093031 49 | v -0.508041 -0.555017 1.093031 50 | v 0.508041 -0.569338 1.093031 51 | v 0.453319 -0.791652 1.093031 52 | v 0.196951 0.199421 1.093031 53 | v 0.161683 0.366685 1.093031 54 | v 0.816535 0.377460 1.093031 55 | v 0.781267 0.544724 1.093031 56 | v 0.196951 0.199421 0.864081 57 | v 0.161683 0.366685 0.864081 58 | v 0.816535 0.377460 0.864082 59 | v 0.781267 0.544724 0.864082 60 | v -0.149975 -1.881223 -0.288817 61 | v -0.165134 -0.774313 -0.273658 62 | v -0.149975 -1.881223 0.288817 63 | v -0.165134 -0.774313 0.273658 64 | v -0.727609 -1.881223 -0.288817 65 | v -0.712450 -0.774313 -0.273658 66 | v -0.727609 -1.881223 0.288817 67 | v -0.712450 -0.774313 0.273658 68 | v -0.059673 -2.148595 0.379119 69 | v -0.059673 -2.148595 -0.379119 70 | v -0.817911 -2.148595 0.379119 71 | v -0.817911 -2.148595 -0.379119 72 | v 0.894354 -1.881223 -0.288817 73 | v 0.879195 -0.774313 -0.273658 74 | v 0.894354 -1.881223 0.288817 75 | v 0.879195 -0.774313 0.273658 76 | v 0.316720 -1.881223 -0.288817 77 | v 0.331879 -0.774313 -0.273658 78 | v 0.316720 -1.881223 0.288817 79 | v 0.331879 -0.774313 0.273658 80 | v 0.984657 -2.148595 0.379119 81 | v 0.984657 -2.148595 -0.379119 82 | v 0.226418 -2.148595 0.379119 83 | v 0.226418 -2.148595 -0.379119 84 | vt 0.675798 0.942530 85 | vt 0.675798 0.947301 86 | vt 0.671027 0.947301 87 | vt 0.671027 0.942530 88 | vt 0.680568 0.942530 89 | vt 0.680568 0.937758 90 | vt 0.685337 0.937758 91 | vt 0.685337 0.942530 92 | vt 0.299248 0.568314 93 | vt 0.298509 0.568314 94 | vt 0.298509 0.564996 95 | vt 0.299248 0.564996 96 | vt 0.680568 0.947301 97 | vt 0.680568 0.942530 98 | vt 0.685337 0.942530 99 | vt 0.685337 0.947301 100 | vt 0.680568 0.942530 101 | vt 0.675798 0.942530 102 | vt 0.675798 0.937758 103 | vt 0.680568 0.937758 104 | vt 0.680568 0.947301 105 | vt 0.675798 0.947301 106 | vt 0.675798 0.942530 107 | vt 0.680568 0.942530 108 | vt 0.673043 0.941193 109 | vt 0.673043 0.941932 110 | vt 0.671027 0.942530 111 | vt 0.671027 0.937758 112 | vt 0.673782 0.941932 113 | vt 0.673782 0.941193 114 | vt 0.675798 0.937758 115 | vt 0.302204 0.568942 116 | vt 0.301465 0.568942 117 | vt 0.301465 0.568203 118 | vt 0.302204 0.568203 119 | vt 0.299248 0.564996 120 | vt 0.299987 0.564996 121 | vt 0.299987 0.568314 122 | vt 0.299248 0.568314 123 | vt 0.300726 0.564996 124 | vt 0.301465 0.564996 125 | vt 0.301465 0.568314 126 | vt 0.300726 0.568314 127 | vt 0.300726 0.568314 128 | vt 0.299987 0.568314 129 | vt 0.299987 0.564996 130 | vt 0.300726 0.564996 131 | vt 0.075224 0.940581 132 | vt 0.075224 0.942321 133 | vt 0.073484 0.942321 134 | vt 0.073484 0.940581 135 | vt 0.092293 0.943844 136 | vt 0.090553 0.943844 137 | vt 0.090553 0.942104 138 | vt 0.092293 0.942104 139 | vt 0.076964 0.940581 140 | vt 0.076964 0.942321 141 | vt 0.075224 0.942321 142 | vt 0.075224 0.940581 143 | vt 0.076964 0.944061 144 | vt 0.075224 0.944061 145 | vt 0.076964 0.942321 146 | vt 0.073426 0.942393 147 | vt 0.073426 0.944133 148 | vt 0.071687 0.944133 149 | vt 0.071687 0.942393 150 | vt 0.069947 0.944133 151 | vt 0.069947 0.942393 152 | vt 0.071687 0.942393 153 | vt 0.071687 0.944133 154 | vt 0.090553 0.942104 155 | vt 0.090553 0.943844 156 | vt 0.088813 0.943844 157 | vt 0.088813 0.942104 158 | vt 0.075224 0.944061 159 | vt 0.073484 0.944061 160 | vt 0.073484 0.942321 161 | vt 0.075224 0.942321 162 | vt 0.078705 0.940581 163 | vt 0.078705 0.942321 164 | vt 0.076964 0.942321 165 | vt 0.076964 0.940581 166 | vt 0.093355 0.942104 167 | vt 0.091616 0.942104 168 | vt 0.091616 0.940364 169 | vt 0.093355 0.940364 170 | vt 0.079754 0.944404 171 | vt 0.079754 0.942664 172 | vt 0.081493 0.942664 173 | vt 0.081493 0.944404 174 | vt 0.076964 0.944061 175 | vt 0.076964 0.942321 176 | vt 0.078704 0.942321 177 | vt 0.078704 0.944061 178 | vt 0.091975 0.934772 179 | vt 0.093324 0.934870 180 | vt 0.093324 0.939971 181 | vt 0.091975 0.939874 182 | vt 0.091955 0.938396 183 | vt 0.090625 0.938396 184 | vt 0.090625 0.936584 185 | vt 0.091955 0.936584 186 | vt 0.087002 0.939549 187 | vt 0.088351 0.939452 188 | vt 0.088351 0.944554 189 | vt 0.087002 0.944651 190 | vt 0.091955 0.936584 191 | vt 0.090625 0.936584 192 | vt 0.090625 0.934772 193 | vt 0.088813 0.939452 194 | vt 0.087002 0.934513 195 | vt 0.088813 0.934513 196 | vt 0.088813 0.934513 197 | vt 0.087002 0.934513 198 | vt 0.087002 0.929573 199 | vt 0.088813 0.929573 200 | vt 0.085190 0.937229 201 | vt 0.083378 0.937229 202 | vt 0.083378 0.929573 203 | vt 0.085190 0.929573 204 | vt 0.087002 0.937229 205 | vt 0.085190 0.937229 206 | vt 0.085190 0.929573 207 | vt 0.087002 0.929573 208 | vt 0.071716 0.942393 209 | vt 0.069947 0.942393 210 | vt 0.069947 0.940581 211 | vt 0.071716 0.940581 212 | vt 0.081566 0.929573 213 | vt 0.083378 0.929573 214 | vt 0.083378 0.937408 215 | vt 0.081566 0.937408 216 | vt 0.073484 0.942393 217 | vt 0.071716 0.942393 218 | vt 0.071716 0.940581 219 | vt 0.073484 0.940581 220 | vt 0.081566 0.937408 221 | vt 0.079754 0.937408 222 | vt 0.079754 0.929573 223 | vt 0.081566 0.929573 224 | vt 0.090625 0.929573 225 | vt 0.090625 0.934675 226 | vt 0.091975 0.934772 227 | vt 0.091975 0.929670 228 | vt 0.082811 0.944476 229 | vt 0.082811 0.942664 230 | vt 0.081493 0.942664 231 | vt 0.081493 0.944476 232 | vt 0.091975 0.929670 233 | vt 0.091975 0.934772 234 | vt 0.093324 0.934675 235 | vt 0.093324 0.929573 236 | vt 0.093610 0.943916 237 | vt 0.093610 0.942104 238 | vt 0.092293 0.942104 239 | vt 0.092293 0.943916 240 | vt 0.088813 0.929573 241 | vt 0.088813 0.934437 242 | vt 0.090625 0.934437 243 | vt 0.090625 0.929573 244 | vt 0.088813 0.934437 245 | vt 0.088813 0.939301 246 | vt 0.090625 0.939301 247 | vt 0.090625 0.934437 248 | vt 0.445307 0.943177 249 | vt 0.436576 0.943177 250 | vt 0.436576 0.934446 251 | vt 0.445307 0.934446 252 | vt 0.436576 0.925715 253 | vt 0.445307 0.925715 254 | vt 0.436576 0.916985 255 | vt 0.445307 0.916985 256 | vt 0.436576 0.908254 257 | vt 0.445307 0.908254 258 | vt 0.445307 0.925715 259 | vt 0.445307 0.934446 260 | vt 0.427845 0.925715 261 | vt 0.427845 0.916985 262 | vt 0.454037 0.925715 263 | vt 0.445307 0.916985 264 | vt 0.454037 0.916985 265 | vt 0.445307 0.943177 266 | vt 0.445307 0.908254 267 | vt 0.445307 0.943177 268 | vt 0.436576 0.943177 269 | vt 0.436576 0.934446 270 | vt 0.445307 0.934446 271 | vt 0.436576 0.925715 272 | vt 0.445307 0.925715 273 | vt 0.436576 0.916985 274 | vt 0.445307 0.916985 275 | vt 0.436576 0.908254 276 | vt 0.445307 0.908254 277 | vt 0.445307 0.925715 278 | vt 0.445307 0.934446 279 | vt 0.427845 0.925715 280 | vt 0.427845 0.916985 281 | vt 0.454037 0.925715 282 | vt 0.445307 0.916985 283 | vt 0.454037 0.916985 284 | vt 0.445307 0.943177 285 | vt 0.445307 0.908254 286 | vn 0.0000 0.0000 -1.0000 287 | vn 0.0000 1.0000 -0.0000 288 | vn 1.0000 0.0000 0.0000 289 | vn 0.0000 -1.0000 -0.0000 290 | vn -1.0000 0.0000 -0.0000 291 | vn -0.0000 0.0000 1.0000 292 | vn -0.9785 0.2063 0.0000 293 | vn 0.9785 -0.2063 0.0000 294 | vn -0.2762 -0.9611 0.0000 295 | vn 0.2762 0.9611 -0.0000 296 | vn 0.2390 0.9710 0.0000 297 | vn -0.2390 -0.9710 -0.0000 298 | vn 0.9710 -0.2390 0.0000 299 | vn -0.9710 0.2390 -0.0000 300 | vn 0.9785 0.2063 0.0000 301 | vn -0.9785 -0.2063 0.0000 302 | vn 0.2762 -0.9611 0.0000 303 | vn -0.2762 0.9611 0.0000 304 | vn 0.9999 0.0137 -0.0000 305 | vn 0.0000 0.0137 0.9999 306 | vn -0.9999 0.0137 0.0000 307 | vn -0.0000 0.0137 -0.9999 308 | vn 0.0000 0.3200 0.9474 309 | vn 0.9474 0.3200 0.0000 310 | vn -0.9474 0.3200 0.0000 311 | vn 0.0000 0.3200 -0.9474 312 | usemtl Material 313 | s off 314 | f 2/1/1 1/2/1 3/3/1 4/4/1 315 | f 1/5/2 9/6/2 11/7/2 3/8/2 316 | f 8/9/3 7/10/3 15/11/3 16/12/3 317 | f 10/13/4 2/14/4 4/15/4 12/16/4 318 | f 10/17/5 9/18/5 1/19/5 2/20/5 319 | f 4/21/3 3/22/3 11/23/3 12/24/3 320 | f 6/25/6 5/26/6 9/27/6 10/28/6 321 | f 5/26/6 7/29/6 11/23/6 9/27/6 322 | f 7/29/6 8/30/6 12/31/6 11/23/6 323 | f 8/30/6 6/25/6 10/28/6 12/31/6 324 | f 16/32/6 15/33/6 13/34/6 14/35/6 325 | f 5/36/5 6/37/5 14/38/5 13/39/5 326 | f 6/40/4 8/41/4 16/42/4 14/43/4 327 | f 7/44/2 5/45/2 13/46/2 15/47/2 328 | f 17/48/6 18/49/6 20/50/6 19/51/6 329 | f 19/52/5 20/53/5 24/54/5 23/55/5 330 | f 23/56/1 24/57/1 22/58/1 21/59/1 331 | f 21/60/3 22/61/3 18/49/3 17/62/3 332 | f 19/63/4 23/64/4 21/65/4 17/66/4 333 | f 24/67/2 20/68/2 18/69/2 22/70/2 334 | f 25/71/6 26/72/6 28/73/6 27/74/6 335 | f 27/75/5 28/76/5 32/77/5 31/78/5 336 | f 31/79/1 32/80/1 30/81/1 29/82/1 337 | f 29/83/3 30/84/3 26/85/3 25/86/3 338 | f 27/87/4 31/88/4 29/89/4 25/90/4 339 | f 32/91/2 28/92/2 26/93/2 30/94/2 340 | f 33/95/6 34/96/6 36/97/6 35/98/6 341 | f 35/99/7 36/100/7 40/101/7 39/102/7 342 | f 39/103/1 40/104/1 38/105/1 37/106/1 343 | f 37/107/8 38/108/8 34/109/8 33/95/8 344 | f 35/110/9 39/103/9 37/111/9 33/112/9 345 | f 40/113/10 36/114/10 34/115/10 38/116/10 346 | f 41/117/11 45/118/11 47/119/11 43/120/11 347 | f 46/121/12 42/122/12 44/123/12 48/124/12 348 | f 44/125/13 43/126/13 47/127/13 48/128/13 349 | f 42/129/1 41/130/1 43/131/1 44/132/1 350 | f 46/133/14 45/134/14 41/135/14 42/136/14 351 | f 48/137/6 47/138/6 45/139/6 46/140/6 352 | f 49/141/6 51/142/6 52/143/6 50/144/6 353 | f 51/145/15 55/146/15 56/147/15 52/148/15 354 | f 55/149/1 53/150/1 54/151/1 56/152/1 355 | f 53/153/16 49/154/16 50/155/16 54/156/16 356 | f 51/157/17 49/158/17 53/159/17 55/160/17 357 | f 56/161/18 54/162/18 50/163/18 52/164/18 358 | f 57/165/19 58/166/19 60/167/19 59/168/19 359 | f 59/168/20 60/167/20 64/169/20 63/170/20 360 | f 63/170/21 64/169/21 62/171/21 61/172/21 361 | f 61/172/22 62/171/22 58/173/22 57/174/22 362 | f 59/168/23 63/170/23 67/175/23 65/176/23 363 | f 64/169/2 60/177/2 58/178/2 62/171/2 364 | f 65/179/4 67/175/4 68/180/4 66/181/4 365 | f 57/165/24 59/168/24 65/176/24 66/182/24 366 | f 63/170/25 61/172/25 68/180/25 67/175/25 367 | f 61/172/26 57/174/26 66/183/26 68/180/26 368 | f 69/184/19 70/185/19 72/186/19 71/187/19 369 | f 71/187/20 72/186/20 76/188/20 75/189/20 370 | f 75/189/21 76/188/21 74/190/21 73/191/21 371 | f 73/191/22 74/190/22 70/192/22 69/193/22 372 | f 71/187/23 75/189/23 79/194/23 77/195/23 373 | f 76/188/2 72/196/2 70/197/2 74/190/2 374 | f 77/198/4 79/194/4 80/199/4 78/200/4 375 | f 69/184/24 71/187/24 77/195/24 78/201/24 376 | f 75/189/25 73/191/25 80/199/25 79/194/25 377 | f 73/191/26 69/193/26 78/202/26 80/199/26 378 | -------------------------------------------------------------------------------- /assets/enemy/bigenemy.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: 'enemy.blend' 2 | # www.blender.org 3 | mtllib bigenemy.mtl 4 | v -1.295194 1.237553 -1.459564 5 | v -1.295194 -1.352835 -1.459564 6 | v 1.295194 1.237553 -1.459564 7 | v 1.295194 -1.352835 -1.459564 8 | v -0.200671 0.913113 1.130824 9 | v -0.200671 0.511771 1.130824 10 | v 0.200671 0.913113 1.130824 11 | v 0.200671 0.511771 1.130824 12 | v -1.295194 1.237553 1.130824 13 | v -1.295194 -1.352835 1.130824 14 | v 1.295194 1.237553 1.130824 15 | v 1.295194 -1.352835 1.130824 16 | v -0.200671 0.913113 2.932399 17 | v -0.200671 0.511771 2.932399 18 | v 0.200671 0.913113 2.932399 19 | v 0.200671 0.511771 2.932399 20 | v -0.319335 -0.121071 1.190293 21 | v -0.319335 0.121071 1.190293 22 | v -0.561477 -0.121071 1.190293 23 | v -0.561477 0.121071 1.190293 24 | v -0.319335 -0.121071 0.948151 25 | v -0.319335 0.121071 0.948151 26 | v -0.561477 -0.121071 0.948151 27 | v -0.561477 0.121071 0.948151 28 | v 0.574328 -0.121071 1.190293 29 | v 0.574328 0.121071 1.190293 30 | v 0.332187 -0.121071 1.190293 31 | v 0.332187 0.121071 1.190293 32 | v 0.574328 -0.121071 0.948151 33 | v 0.574328 0.121071 0.948151 34 | v 0.332187 -0.121071 0.948151 35 | v 0.332187 0.121071 0.948151 36 | v -0.170109 0.219623 1.203758 37 | v -0.131269 0.403831 1.203758 38 | v -0.852459 0.415698 1.203758 39 | v -0.813619 0.599906 1.203758 40 | v -0.170109 0.219623 0.951615 41 | v -0.131269 0.403831 0.951615 42 | v -0.852459 0.415698 0.951615 43 | v -0.813619 0.599906 0.951615 44 | v -0.499242 -0.366407 0.951615 45 | v -0.559507 -0.611242 0.951615 46 | v 0.559507 -0.627014 0.951615 47 | v 0.499241 -0.871849 0.951615 48 | v -0.499242 -0.366407 1.203758 49 | v -0.559507 -0.611242 1.203758 50 | v 0.559507 -0.627014 1.203758 51 | v 0.499241 -0.871849 1.203758 52 | v 0.216902 0.219623 1.203758 53 | v 0.178062 0.403831 1.203758 54 | v 0.899252 0.415698 1.203758 55 | v 0.860411 0.599906 1.203758 56 | v 0.216902 0.219623 0.951615 57 | v 0.178062 0.403831 0.951615 58 | v 0.899252 0.415698 0.951615 59 | v 0.860411 0.599906 0.951615 60 | v -0.165168 -2.071795 -0.318075 61 | v -0.181862 -0.852753 -0.301380 62 | v -0.165168 -2.071795 0.318075 63 | v -0.181862 -0.852753 0.301380 64 | v -0.801318 -2.071795 -0.318075 65 | v -0.784623 -0.852753 -0.301380 66 | v -0.801318 -2.071795 0.318075 67 | v -0.784623 -0.852753 0.301380 68 | v -0.065718 -2.366253 0.417525 69 | v -0.065718 -2.366253 -0.417525 70 | v -0.900768 -2.366253 0.417525 71 | v -0.900768 -2.366253 -0.417525 72 | v 0.984955 -2.071795 -0.318075 73 | v 0.968260 -0.852753 -0.301380 74 | v 0.984955 -2.071795 0.318075 75 | v 0.968260 -0.852753 0.301380 76 | v 0.348805 -2.071795 -0.318075 77 | v 0.365499 -0.852753 -0.301380 78 | v 0.348805 -2.071795 0.318075 79 | v 0.365499 -0.852753 0.301380 80 | v 1.084405 -2.366253 0.417525 81 | v 1.084405 -2.366253 -0.417525 82 | v 0.249355 -2.366253 0.417525 83 | v 0.249355 -2.366253 -0.417525 84 | vt 0.178809 0.685225 85 | vt 0.178809 0.689996 86 | vt 0.174038 0.689996 87 | vt 0.174038 0.685225 88 | vt 0.183579 0.685225 89 | vt 0.183579 0.680454 90 | vt 0.188349 0.680454 91 | vt 0.188349 0.685225 92 | vt 0.299248 0.568314 93 | vt 0.298509 0.568314 94 | vt 0.298509 0.564996 95 | vt 0.299248 0.564996 96 | vt 0.183579 0.689996 97 | vt 0.183579 0.685225 98 | vt 0.188349 0.685225 99 | vt 0.188349 0.689996 100 | vt 0.183579 0.685225 101 | vt 0.178809 0.685225 102 | vt 0.178809 0.680454 103 | vt 0.183579 0.680454 104 | vt 0.183579 0.689996 105 | vt 0.178809 0.689996 106 | vt 0.178809 0.685225 107 | vt 0.183579 0.685225 108 | vt 0.176054 0.683888 109 | vt 0.176054 0.684627 110 | vt 0.174038 0.685225 111 | vt 0.174038 0.680454 112 | vt 0.176793 0.684627 113 | vt 0.176793 0.683888 114 | vt 0.178809 0.680454 115 | vt 0.302204 0.568942 116 | vt 0.301465 0.568942 117 | vt 0.301465 0.568203 118 | vt 0.302204 0.568203 119 | vt 0.299248 0.564996 120 | vt 0.299987 0.564996 121 | vt 0.299987 0.568314 122 | vt 0.299248 0.568314 123 | vt 0.300726 0.564996 124 | vt 0.301465 0.564996 125 | vt 0.301465 0.568314 126 | vt 0.300726 0.568314 127 | vt 0.300726 0.568314 128 | vt 0.299987 0.568314 129 | vt 0.299987 0.564996 130 | vt 0.300726 0.564996 131 | vt 0.075224 0.940581 132 | vt 0.075224 0.942321 133 | vt 0.073484 0.942321 134 | vt 0.073484 0.940581 135 | vt 0.092293 0.943844 136 | vt 0.090553 0.943844 137 | vt 0.090553 0.942104 138 | vt 0.092293 0.942104 139 | vt 0.076964 0.940581 140 | vt 0.076964 0.942321 141 | vt 0.075224 0.942321 142 | vt 0.075224 0.940581 143 | vt 0.076964 0.944061 144 | vt 0.075224 0.944061 145 | vt 0.076964 0.942321 146 | vt 0.073426 0.942393 147 | vt 0.073426 0.944133 148 | vt 0.071687 0.944133 149 | vt 0.071687 0.942393 150 | vt 0.069947 0.944133 151 | vt 0.069947 0.942393 152 | vt 0.071687 0.942393 153 | vt 0.071687 0.944133 154 | vt 0.090553 0.942104 155 | vt 0.090553 0.943844 156 | vt 0.088813 0.943844 157 | vt 0.088813 0.942104 158 | vt 0.075224 0.944061 159 | vt 0.073484 0.944061 160 | vt 0.073484 0.942321 161 | vt 0.075224 0.942321 162 | vt 0.078705 0.940581 163 | vt 0.078705 0.942321 164 | vt 0.076964 0.942321 165 | vt 0.076964 0.940581 166 | vt 0.093355 0.942104 167 | vt 0.091616 0.942104 168 | vt 0.091616 0.940364 169 | vt 0.093355 0.940364 170 | vt 0.079754 0.944404 171 | vt 0.079754 0.942664 172 | vt 0.081493 0.942664 173 | vt 0.081493 0.944404 174 | vt 0.076964 0.944061 175 | vt 0.076964 0.942321 176 | vt 0.078704 0.942321 177 | vt 0.078704 0.944061 178 | vt 0.091975 0.934772 179 | vt 0.093324 0.934870 180 | vt 0.093324 0.939971 181 | vt 0.091975 0.939874 182 | vt 0.091955 0.938396 183 | vt 0.090625 0.938396 184 | vt 0.090625 0.936584 185 | vt 0.091955 0.936584 186 | vt 0.087002 0.939549 187 | vt 0.088351 0.939452 188 | vt 0.088351 0.944554 189 | vt 0.087002 0.944651 190 | vt 0.091955 0.936584 191 | vt 0.090625 0.936584 192 | vt 0.090625 0.934772 193 | vt 0.088813 0.939452 194 | vt 0.087002 0.934513 195 | vt 0.088813 0.934513 196 | vt 0.088813 0.934513 197 | vt 0.087002 0.934513 198 | vt 0.087002 0.929573 199 | vt 0.088813 0.929573 200 | vt 0.085190 0.937229 201 | vt 0.083378 0.937229 202 | vt 0.083378 0.929573 203 | vt 0.085190 0.929573 204 | vt 0.087002 0.937229 205 | vt 0.085190 0.937229 206 | vt 0.085190 0.929573 207 | vt 0.087002 0.929573 208 | vt 0.071716 0.942393 209 | vt 0.069947 0.942393 210 | vt 0.069947 0.940581 211 | vt 0.071716 0.940581 212 | vt 0.081566 0.929573 213 | vt 0.083378 0.929573 214 | vt 0.083378 0.937408 215 | vt 0.081566 0.937408 216 | vt 0.073484 0.942393 217 | vt 0.071716 0.942393 218 | vt 0.071716 0.940581 219 | vt 0.073484 0.940581 220 | vt 0.081566 0.937408 221 | vt 0.079754 0.937408 222 | vt 0.079754 0.929573 223 | vt 0.081566 0.929573 224 | vt 0.090625 0.929573 225 | vt 0.090625 0.934675 226 | vt 0.091975 0.934772 227 | vt 0.091975 0.929670 228 | vt 0.082811 0.944476 229 | vt 0.082811 0.942664 230 | vt 0.081493 0.942664 231 | vt 0.081493 0.944476 232 | vt 0.091975 0.929670 233 | vt 0.091975 0.934772 234 | vt 0.093324 0.934675 235 | vt 0.093324 0.929573 236 | vt 0.093610 0.943916 237 | vt 0.093610 0.942104 238 | vt 0.092293 0.942104 239 | vt 0.092293 0.943916 240 | vt 0.088813 0.929573 241 | vt 0.088813 0.934437 242 | vt 0.090625 0.934437 243 | vt 0.090625 0.929573 244 | vt 0.088813 0.934437 245 | vt 0.088813 0.939301 246 | vt 0.090625 0.939301 247 | vt 0.090625 0.934437 248 | vt 0.445307 0.943177 249 | vt 0.436576 0.943177 250 | vt 0.436576 0.934446 251 | vt 0.445307 0.934446 252 | vt 0.436576 0.925715 253 | vt 0.445307 0.925715 254 | vt 0.436576 0.916985 255 | vt 0.445307 0.916985 256 | vt 0.436576 0.908254 257 | vt 0.445307 0.908254 258 | vt 0.445307 0.925715 259 | vt 0.445307 0.934446 260 | vt 0.427845 0.925715 261 | vt 0.427845 0.916985 262 | vt 0.454037 0.925715 263 | vt 0.445307 0.916985 264 | vt 0.454037 0.916985 265 | vt 0.445307 0.943177 266 | vt 0.445307 0.908254 267 | vt 0.445307 0.943177 268 | vt 0.436576 0.943177 269 | vt 0.436576 0.934446 270 | vt 0.445307 0.934446 271 | vt 0.436576 0.925715 272 | vt 0.445307 0.925715 273 | vt 0.436576 0.916985 274 | vt 0.445307 0.916985 275 | vt 0.436576 0.908254 276 | vt 0.445307 0.908254 277 | vt 0.445307 0.925715 278 | vt 0.445307 0.934446 279 | vt 0.427845 0.925715 280 | vt 0.427845 0.916985 281 | vt 0.454037 0.925715 282 | vt 0.445307 0.916985 283 | vt 0.454037 0.916985 284 | vt 0.445307 0.943177 285 | vt 0.445307 0.908254 286 | vn 0.0000 0.0000 -1.0000 287 | vn 0.0000 1.0000 0.0000 288 | vn 1.0000 0.0000 0.0000 289 | vn 0.0000 -1.0000 0.0000 290 | vn -1.0000 0.0000 -0.0000 291 | vn 0.0000 0.0000 1.0000 292 | vn -0.9785 0.2063 0.0000 293 | vn 0.9785 -0.2063 0.0000 294 | vn -0.2762 -0.9611 0.0000 295 | vn 0.2762 0.9611 -0.0000 296 | vn 0.2390 0.9710 0.0000 297 | vn -0.2390 -0.9710 -0.0000 298 | vn 0.9710 -0.2390 0.0000 299 | vn -0.9710 0.2390 -0.0000 300 | vn 0.9785 0.2063 0.0000 301 | vn -0.9785 -0.2063 -0.0000 302 | vn 0.2762 -0.9611 0.0000 303 | vn -0.2762 0.9611 -0.0000 304 | vn 0.9999 0.0137 -0.0000 305 | vn 0.0000 0.0137 0.9999 306 | vn -0.9999 0.0137 0.0000 307 | vn 0.0000 0.0137 -0.9999 308 | vn 0.0000 0.3200 0.9474 309 | vn 0.9474 0.3200 0.0000 310 | vn -0.9474 0.3200 0.0000 311 | vn 0.0000 0.3200 -0.9474 312 | usemtl Material 313 | s off 314 | f 2/1/1 1/2/1 3/3/1 4/4/1 315 | f 1/5/2 9/6/2 11/7/2 3/8/2 316 | f 8/9/3 7/10/3 15/11/3 16/12/3 317 | f 10/13/4 2/14/4 4/15/4 12/16/4 318 | f 10/17/5 9/18/5 1/19/5 2/20/5 319 | f 4/21/3 3/22/3 11/23/3 12/24/3 320 | f 6/25/6 5/26/6 9/27/6 10/28/6 321 | f 5/26/6 7/29/6 11/23/6 9/27/6 322 | f 7/29/6 8/30/6 12/31/6 11/23/6 323 | f 8/30/6 6/25/6 10/28/6 12/31/6 324 | f 16/32/6 15/33/6 13/34/6 14/35/6 325 | f 5/36/5 6/37/5 14/38/5 13/39/5 326 | f 6/40/4 8/41/4 16/42/4 14/43/4 327 | f 7/44/2 5/45/2 13/46/2 15/47/2 328 | f 17/48/6 18/49/6 20/50/6 19/51/6 329 | f 19/52/5 20/53/5 24/54/5 23/55/5 330 | f 23/56/1 24/57/1 22/58/1 21/59/1 331 | f 21/60/3 22/61/3 18/49/3 17/62/3 332 | f 19/63/4 23/64/4 21/65/4 17/66/4 333 | f 24/67/2 20/68/2 18/69/2 22/70/2 334 | f 25/71/6 26/72/6 28/73/6 27/74/6 335 | f 27/75/5 28/76/5 32/77/5 31/78/5 336 | f 31/79/1 32/80/1 30/81/1 29/82/1 337 | f 29/83/3 30/84/3 26/85/3 25/86/3 338 | f 27/87/4 31/88/4 29/89/4 25/90/4 339 | f 32/91/2 28/92/2 26/93/2 30/94/2 340 | f 33/95/6 34/96/6 36/97/6 35/98/6 341 | f 35/99/7 36/100/7 40/101/7 39/102/7 342 | f 39/103/1 40/104/1 38/105/1 37/106/1 343 | f 37/107/8 38/108/8 34/109/8 33/95/8 344 | f 35/110/9 39/103/9 37/111/9 33/112/9 345 | f 40/113/10 36/114/10 34/115/10 38/116/10 346 | f 41/117/11 45/118/11 47/119/11 43/120/11 347 | f 46/121/12 42/122/12 44/123/12 48/124/12 348 | f 44/125/13 43/126/13 47/127/13 48/128/13 349 | f 42/129/1 41/130/1 43/131/1 44/132/1 350 | f 46/133/14 45/134/14 41/135/14 42/136/14 351 | f 48/137/6 47/138/6 45/139/6 46/140/6 352 | f 49/141/6 51/142/6 52/143/6 50/144/6 353 | f 51/145/15 55/146/15 56/147/15 52/148/15 354 | f 55/149/1 53/150/1 54/151/1 56/152/1 355 | f 53/153/16 49/154/16 50/155/16 54/156/16 356 | f 51/157/17 49/158/17 53/159/17 55/160/17 357 | f 56/161/18 54/162/18 50/163/18 52/164/18 358 | f 57/165/19 58/166/19 60/167/19 59/168/19 359 | f 59/168/20 60/167/20 64/169/20 63/170/20 360 | f 63/170/21 64/169/21 62/171/21 61/172/21 361 | f 61/172/22 62/171/22 58/173/22 57/174/22 362 | f 59/168/23 63/170/23 67/175/23 65/176/23 363 | f 64/169/2 60/177/2 58/178/2 62/171/2 364 | f 65/179/4 67/175/4 68/180/4 66/181/4 365 | f 57/165/24 59/168/24 65/176/24 66/182/24 366 | f 63/170/25 61/172/25 68/180/25 67/175/25 367 | f 61/172/26 57/174/26 66/183/26 68/180/26 368 | f 69/184/19 70/185/19 72/186/19 71/187/19 369 | f 71/187/20 72/186/20 76/188/20 75/189/20 370 | f 75/189/21 76/188/21 74/190/21 73/191/21 371 | f 73/191/22 74/190/22 70/192/22 69/193/22 372 | f 71/187/23 75/189/23 79/194/23 77/195/23 373 | f 76/188/2 72/196/2 70/197/2 74/190/2 374 | f 77/198/4 79/194/4 80/199/4 78/200/4 375 | f 69/184/24 71/187/24 77/195/24 78/201/24 376 | f 75/189/25 73/191/25 80/199/25 79/194/25 377 | f 73/191/26 69/193/26 78/202/26 80/199/26 378 | -------------------------------------------------------------------------------- /player.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | from ursina import curve 3 | 4 | from ursina.prefabs.health_bar import HealthBar 5 | 6 | from guns import * 7 | from abilities import * 8 | 9 | import json 10 | 11 | sign = lambda x: -1 if x < 0 else (1 if x > 0 else 0) 12 | y_dir = lambda y: -1 if y < 0 else(1 if y > 0 else -1) 13 | 14 | class Player(Entity): 15 | def __init__(self, position, speed = 5, jump_height = 14): 16 | super().__init__( 17 | model = "cube", 18 | position = position, 19 | scale = (1.3, 1, 1.3), 20 | visible_self = False, 21 | rotation_y = -270 22 | ) 23 | 24 | # Camera 25 | mouse.locked = True 26 | camera.parent = self 27 | camera.position = (0, 2, 0) 28 | camera.rotation = (0, 0, 0) 29 | camera.fov = 100 30 | 31 | # Crosshair 32 | self.crosshair = Entity(model = "quad", color = color.black, parent = camera, rotation_z = 45, position = (0, 0, 1), scale = 1, z = 100, always_on_top = True) 33 | 34 | # Player values 35 | self.speed = speed 36 | self.jump_count = 0 37 | self.jump_height = jump_height 38 | self.jumping = False 39 | self.can_move = True 40 | self.grounded = False 41 | 42 | # Velocity 43 | self.velocity = (0, 0, 0) 44 | self.velocity_x = self.velocity[0] 45 | self.velocity_y = self.velocity[1] 46 | self.velocity_z = self.velocity[2] 47 | 48 | # Movement 49 | self.movementX = 0 50 | self.movementZ = 0 51 | 52 | self.mouse_sensitivity = 50 53 | 54 | # Map 55 | self.map = None 56 | self.maps = [] 57 | 58 | # Camera Shake 59 | self.can_shake = False 60 | self.shake_duration = 0.1 61 | self.shake_timer = 0 62 | self.shake_divider = 70 # the less, the more camera shake 63 | 64 | # Guns 65 | self.rifle = Rifle(self, True, enabled = True) 66 | self.shotgun = Shotgun(self, True, enabled = False) 67 | self.pistol = Pistol(self, True, enabled = False) 68 | self.minigun = MiniGun(self, True, enabled = False) 69 | self.rocket_launcher = RocketLauncher(self, True, enabled = False) 70 | 71 | self.guns = [self.rifle, self.shotgun, self.pistol, self.minigun, self.rocket_launcher] 72 | self.current_gun = 0 73 | 74 | # Abilities 75 | self.rope = Rope(self) 76 | self.dash_ability = DashAbility(self) 77 | self.slow_motion = SlowMotion(self, False) 78 | 79 | self.primary_abilities = [self.rope] 80 | self.secondary_abilities = [self.dash_ability, self.slow_motion] 81 | 82 | # Sliding 83 | self.sliding = False 84 | self.slope = False 85 | self.slide_pivot = Entity() 86 | self.set_slide_rotation = False 87 | 88 | # Enemies 89 | self.enemies = [] 90 | 91 | # Health 92 | self.healthbar = HealthBar(10, bar_color = color.hex("#ff1e1e"), roundness = 0, y = window.bottom_left[1] + 0.1, scale_y = 0.03, scale_x = 0.3) 93 | self.healthbar.text_entity.disable() 94 | self.ability_bar = HealthBar(10, bar_color = color.hex("#50acff"), roundness = 0, position = window.bottom_left + (0.12, 0.05), scale_y = 0.007, scale_x = 0.2) 95 | self.ability_bar.text_entity.disable() 96 | self.ability_bar.animation_duration = 0 97 | 98 | self.health = 10 99 | self.using_ability = False 100 | self.dead = False 101 | 102 | # Score 103 | self.score = 0 104 | self.score_text = Text(text = str(self.score), origin = (0, 0), size = 0.05, scale = (1, 1), position = window.top_right - (0.1, 0.1)) 105 | self.score_text.text = str(self.score) 106 | 107 | # Get highscore from json file 108 | path = os.path.dirname(sys.argv[0]) 109 | self.highscore_path = os.path.join(path, "./highscores/highscore.json") 110 | 111 | try: 112 | with open(self.highscore_path, "r") as hs: 113 | highscore_file = json.load(hs) 114 | self.highscore = highscore_file["highscore"] 115 | except FileNotFoundError: 116 | with open(self.highscore_path, "w+") as hs: 117 | json.dump({"highscore": 0}, hs, indent = 4) 118 | self.highscore = 0 119 | 120 | # Audio 121 | self.fall_sound = Audio("fall.wav", False) 122 | 123 | def jump(self): 124 | self.jumping = True 125 | self.velocity_y = self.jump_height 126 | self.jump_count += 1 127 | 128 | def update(self): 129 | movementY = self.velocity_y / 75 130 | self.velocity_y = clamp(self.velocity_y, -70, 100) 131 | 132 | direction = (0, sign(movementY), 0) 133 | 134 | # Main raycast for collision 135 | y_ray = raycast(origin = self.world_position, direction = (0, y_dir(self.velocity_y), 0), traverse_target = self.map, ignore = [self, ]) 136 | 137 | if y_ray.distance <= self.scale_y * 1.5 + abs(movementY): 138 | if not self.grounded: 139 | self.velocity_y = 0 140 | self.grounded = True 141 | self.fall_sound.play() 142 | 143 | # Check if hitting a wall or steep slope 144 | if y_dir(self.velocity_y) == -1: 145 | if y_ray.world_normal.y > 0.7 and y_ray.world_point.y - self.world_y < 0.5: 146 | # Set the y value to the ground's y value 147 | if not held_keys["space"]: 148 | self.y = y_ray.world_point.y + 1.4 149 | self.jump_count = 0 150 | self.jumping = False 151 | else: 152 | if not self.rope.can_rope: 153 | self.velocity_y -= 40 * time.dt 154 | self.grounded = False 155 | self.jump_count = 1 156 | 157 | self.y += movementY * 50 * time.dt 158 | 159 | # Sliding 160 | if self.sliding: 161 | camera.y = 0 162 | if y_ray.distance <= 2: 163 | slide_ray = raycast(self.world_position + self.forward, self.forward, distance = 8, traverse_target = self.map, ignore = [self, ]) 164 | if not slide_ray.hit: 165 | if hasattr(y_ray.world_point, "y"): 166 | self.y = y_ray.world_point.y + 1.4 167 | 168 | if y_ray.world_normal[2] * 10 < 0: 169 | self.velocity_z -= y_ray.world_normal[2] * 10 * time.dt 170 | if y_ray.world_normal[2] * 10 > 0: 171 | self.velocity_z += y_ray.world_normal[2] * 10 * time.dt 172 | elif slide_ray.hit: 173 | self.velocity_z = -10 174 | if self.velocity_z <= -1: 175 | self.velocity_z = -1 176 | if hasattr(y_ray.world_point, "y"): 177 | self.y = y_ray.world_point.y + 1.4 178 | 179 | if self.set_slide_rotation: 180 | self.slide_pivot.rotation = camera.world_rotation 181 | self.set_slide_rotation = False 182 | else: 183 | camera.y = 2 184 | 185 | # Velocity / Momentum 186 | if not self.sliding: 187 | movement = 10 if y_ray.distance < 5 and not self.rope.can_rope else 5 188 | 189 | if held_keys["w"]: 190 | self.velocity_z += movement * time.dt 191 | else: 192 | self.velocity_z = lerp(self.velocity_z, 0 if y_ray.distance < 5 else 1, time.dt * 3) 193 | if held_keys["a"]: 194 | self.velocity_x += movement * time.dt 195 | else: 196 | self.velocity_x = lerp(self.velocity_x, 0 if y_ray.distance < 5 else 1, time.dt * 3) 197 | if held_keys["s"]: 198 | self.velocity_z -= movement * time.dt 199 | else: 200 | self.velocity_z = lerp(self.velocity_z, 0 if y_ray.distance < 5 else 1, time.dt * 3) 201 | if held_keys["d"]: 202 | self.velocity_x -= movement * time.dt 203 | else: 204 | self.velocity_x = lerp(self.velocity_x, 0 if y_ray.distance < 5 else -1, time.dt * 3) 205 | 206 | # Movement 207 | if y_ray.distance <= 5 or self.rope.can_rope: 208 | if not self.sliding: 209 | self.movementX = (self.forward[0] * self.velocity_z + 210 | self.left[0] * self.velocity_x + 211 | self.back[0] * -self.velocity_z + 212 | self.right[0] * -self.velocity_x) * self.speed * time.dt 213 | 214 | self.movementZ = (self.forward[2] * self.velocity_z + 215 | self.left[2] * self.velocity_x + 216 | self.back[2] * -self.velocity_z + 217 | self.right[2] * -self.velocity_x) * self.speed * time.dt 218 | else: 219 | air_movementX = 0.5 if self.movementX < 0.5 and self.movementX > -0.5 else 0.2 220 | air_movementZ = 0.5 if self.movementZ < 0.5 and self.movementZ > -0.5 else 0.2 221 | 222 | self.movementX += (self.forward[0] * held_keys["w"] * air_movementX + 223 | self.left[0] * held_keys["a"] * air_movementX + 224 | self.back[0] * held_keys["s"] * air_movementX + 225 | self.right[0] * held_keys["d"] * air_movementX) / 2 * time.dt 226 | 227 | self.movementZ += (self.forward[2] * held_keys["w"] * air_movementZ + 228 | self.left[2] * held_keys["a"] * air_movementZ + 229 | self.back[2] * held_keys["s"] * air_movementZ + 230 | self.right[2] * held_keys["d"] * air_movementZ) / 2 * time.dt 231 | 232 | # Collision Detection 233 | if self.movementX != 0: 234 | direction = (sign(self.movementX), 0, 0) 235 | x_ray = raycast(origin = self.world_position, direction = direction, traverse_target = self.map, ignore = [self, ]) 236 | 237 | if x_ray.distance > self.scale_x / 2 + abs(self.movementX): 238 | self.x += self.movementX 239 | 240 | if self.movementZ != 0: 241 | direction = (0, 0, sign(self.movementZ)) 242 | z_ray = raycast(origin = self.world_position, direction = direction, traverse_target = self.map, ignore = [self, ]) 243 | 244 | if z_ray.distance > self.scale_z / 2 + abs(self.movementZ): 245 | self.z += self.movementZ 246 | 247 | # Camera 248 | camera.rotation_x -= mouse.velocity[1] * self.mouse_sensitivity 249 | self.rotation_y += mouse.velocity[0] * self.mouse_sensitivity 250 | camera.rotation_x = min(max(-90, camera.rotation_x), 90) 251 | 252 | # Camera Shake 253 | if self.can_shake: 254 | camera.position = self.prev_camera_pos + Vec3(random.randrange(-10, 10), random.randrange(-10, 10), random.randrange(-10, 10)) / self.shake_divider 255 | 256 | # Abilities 257 | n = clamp(self.ability_bar.value, 0, self.ability_bar.max_value) 258 | self.ability_bar.bar.scale_x = n / self.ability_bar.max_value 259 | 260 | if not self.using_ability and self.ability_bar.value < 10: 261 | self.ability_bar.value += 5 * time.dt 262 | if self.ability_bar.value <= 0: 263 | self.rope.rope_pivot.position = self.rope.position 264 | self.rope.rope.disable() 265 | self.rope.can_rope = False 266 | 267 | # Resets the player if falls of the map 268 | if self.y <= -100: 269 | self.position = (-60, 15, -16) 270 | self.rotation_y = -270 271 | self.velocity_x = 0 272 | self.velocity_y = 0 273 | self.velocity_z = 0 274 | self.health -= 5 275 | self.healthbar.value = self.health 276 | 277 | def input(self, key): 278 | if key == "space": 279 | if self.jump_count < 1: 280 | self.jump() 281 | 282 | if key == "left shift": 283 | self.sliding = False # turned sliding off for now 284 | self.set_slide_rotation = True 285 | elif key == "left shift up": 286 | self.sliding = False 287 | 288 | if key == "1": 289 | if not self.rifle.enabled: 290 | for gun in self.guns: 291 | gun.disable() 292 | self.rifle.enable() 293 | elif key == "2": 294 | if not self.shotgun.enabled: 295 | for gun in self.guns: 296 | gun.disable() 297 | self.shotgun.enable() 298 | elif key == "3": 299 | if not self.pistol.enabled: 300 | for gun in self.guns: 301 | gun.disable() 302 | self.pistol.enable() 303 | elif key == "4": 304 | if not self.minigun.enabled: 305 | for gun in self.guns: 306 | gun.disable() 307 | self.minigun.enable() 308 | elif key == "5": 309 | if not self.rocket_launcher.enabled: 310 | for gun in self.guns: 311 | gun.disable() 312 | self.rocket_launcher.enable() 313 | 314 | if key == "scroll up": 315 | self.current_gun = (self.current_gun - 1) % len(self.guns) 316 | for i, gun in enumerate(self.guns): 317 | if i == self.current_gun: 318 | gun.enable() 319 | else: 320 | gun.disable() 321 | 322 | if key == "scroll down": 323 | self.current_gun = (self.current_gun + 1) % len(self.guns) 324 | for i, gun in enumerate(self.guns): 325 | if i == self.current_gun: 326 | gun.enable() 327 | else: 328 | gun.disable() 329 | 330 | def shot_enemy(self): 331 | if not self.dead: 332 | self.score += 1 333 | self.score_text.text = str(self.score) 334 | if self.score > self.highscore: 335 | self.animate_text(self.score_text, 1.8, 1) 336 | 337 | def reset(self): 338 | if self.map == self.maps[0] or self.map == self.maps[1]: 339 | self.position = (-60, 15, -16) 340 | elif self.map == self.maps[2]: 341 | self.position = (-5, 200, -10) 342 | self.rotation = (0, -270, 0) 343 | self.velocity_x = 0 344 | self.velocity_y = 0 345 | self.velocity_z = 0 346 | self.health = 10 347 | self.healthbar.value = self.health 348 | self.ability_bar.value = 10 349 | self.dead = False 350 | self.score = 0 351 | self.score_text.text = self.score 352 | application.time_scale = 1 353 | for enemy in self.enemies: 354 | enemy.reset_pos() 355 | 356 | def shake_camera(self, duration = 0.1, divider = 70): 357 | self.can_shake = True 358 | self.shake_duration = duration 359 | self.shake_divider = divider 360 | self.prev_camera_pos = camera.position 361 | invoke(setattr, self, "can_shake", False, delay = self.shake_duration) 362 | invoke(setattr, camera, "position", self.prev_camera_pos, delay = self.shake_duration) 363 | 364 | def check_highscore(self): 365 | if self.score > self.highscore: 366 | self.highscore = self.score 367 | with open(self.highscore_path, "w") as hs: 368 | json.dump({"highscore": int(self.highscore)}, hs, indent = 4) 369 | 370 | def animate_text(self, text, top = 1.2, bottom = 0.6): 371 | """ 372 | Animates the scale of text 373 | """ 374 | text.animate_scale((top, top, top), curve = curve.out_expo) 375 | invoke(text.animate_scale, (bottom, bottom, bottom), delay = 0.4) -------------------------------------------------------------------------------- /guns.py: -------------------------------------------------------------------------------- 1 | from ursina import * 2 | from ursina import curve 3 | from trail_renderer import TrailRenderer 4 | 5 | from particles import Particles 6 | 7 | class Gun(Entity): 8 | def __init__(self, player, equipped = True, **kwargs): 9 | super().__init__( 10 | parent = camera, 11 | scale = 0.3, 12 | position = (0.5, -0.75, 1.7), 13 | **kwargs 14 | ) 15 | 16 | self.player = player 17 | self.map = self.player.map 18 | self.tip = Entity(parent = self, position = (-0.5, 1.3, 1.5)) 19 | 20 | self.pos_x = 0.5 21 | self.pos_y = -0.75 22 | 23 | # Pivot 24 | self.pivot = Entity(parent = camera, position = (0.5, -0.75, 1.7)) 25 | 26 | # Cooldown 27 | self.cooldown_t = 0 28 | self.cooldown_length = 0.3 29 | self.can_shoot = True 30 | self.started_shooting = False 31 | 32 | # Damage 33 | self.damage = 1 34 | 35 | # Spring 36 | self.spring = Spring() 37 | self.start_spring = False 38 | 39 | # Camera Shake amount 40 | self.shake_divider = 70 41 | 42 | # Gun type 43 | self.gun_type = "pistol" 44 | self.charged = False 45 | self.equipped = equipped 46 | 47 | # Audio 48 | self.gun_sound = Audio("pistol.wav", False) 49 | self.destroyed_enemy = Audio("destroyed.wav", False) 50 | self.gun_sound.volume = 0.8 51 | self.destroyed_enemy.volume = 0.1 52 | 53 | def update(self): 54 | if self.player.enabled: 55 | if self.equipped: 56 | self.cooldown_t += time.dt 57 | if self.cooldown_t >= self.cooldown_length: 58 | self.cooldown_t = 0 59 | self.can_shoot = True 60 | 61 | if held_keys["left mouse"] and not self.started_shooting: 62 | if self.gun_type == "minigun": 63 | if self.charged: 64 | self.shoot() 65 | else: 66 | self.shoot() 67 | 68 | # Springs 69 | if self.start_spring: 70 | gun_movement = self.spring.update(time.dt) 71 | self.spring.shove(Vec3(mouse.x, mouse.y, 0)) 72 | self.x = gun_movement.x + self.pos_x 73 | self.y = gun_movement.y + self.pos_y 74 | 75 | if not self.equipped: 76 | # Pivot Springs 77 | pivot_movement = self.spring.update(time.dt) 78 | self.spring.shove(Vec3(mouse.x, mouse.y, 0)) 79 | self.pivot.x = pivot_movement.x + self.pos_x 80 | self.pivot.y = pivot_movement.y + self.pos_y 81 | 82 | def shoot(self): 83 | # Spawn bullet 84 | if self.equipped: 85 | if self.gun_type == "pistol": 86 | Bullet(self, self.tip.world_position) 87 | 88 | self.gun_sound.clip = "pistol.wav" 89 | self.gun_sound.volume = 0.8 90 | self.gun_sound.play() 91 | 92 | elif self.gun_type == "shotgun": 93 | for i in range(random.randint(2, 4)): 94 | b = Bullet(self, self.tip.world_position, randomness = 10) 95 | 96 | self.gun_sound.clip = "shotgun.wav" 97 | self.gun_sound.volume = 0.8 98 | self.gun_sound.play() 99 | elif self.gun_type == "rifle": 100 | Bullet(self, self.tip.world_position) 101 | 102 | self.gun_sound.clip = "rifle.wav" 103 | self.gun_sound.volume = 0.8 104 | self.gun_sound.play() 105 | elif self.gun_type == "minigun": 106 | Bullet(self, self.tip.world_position) 107 | 108 | self.shooting = True 109 | self.gun_sound.clip = "minigun.wav" 110 | self.gun_sound.volume = 0.8 111 | self.gun_sound.play() 112 | 113 | # Animate the gun 114 | if self.gun_type == "pistol" or self.gun_type == "shotgun": 115 | self.animate_rotation((-30, 0, 0), duration = 0.1, curve = curve.linear) 116 | self.animate("z", 1, duration = 0.03, curve = curve.linear) 117 | self.animate("z", 1.5, 0.2, delay = 0.1, curve = curve.linear) 118 | self.animate_rotation((-15, 0, 0), 0.2, delay = 0.1, curve = curve.linear) 119 | self.animate_rotation((0, 0, 0), 0.4, delay = 0.12, curve = curve.linear) 120 | elif self.gun_type == "rifle": 121 | self.animate_rotation((-20, 0, 0), duration = 0.1, curve = curve.linear) 122 | self.animate("z", 1.2, duration = 0.03, curve = curve.linear) 123 | self.animate("z", 1.5, 0.2, delay = 0.1, curve = curve.linear) 124 | self.animate_rotation((-10, 0, 0), 0.2, delay = 0.1, curve = curve.linear) 125 | self.animate_rotation((0, 0, 0), 0.4, delay = 0.12, curve = curve.linear) 126 | elif self.gun_type == "minigun": 127 | self.animate_rotation((-10, 0, 0), duration = 0.05, curve = curve.linear) 128 | self.animate("z", 1, duration = 0.015, curve = curve.linear) 129 | self.animate("z", 1.5, 0.2, delay = 0.05, curve = curve.linear) 130 | self.animate_rotation((-5, 0, 0), 0.2, delay = 0.05, curve = curve.linear) 131 | self.animate_rotation((0, 0, 0), 0.4, delay = 0.06, curve = curve.linear) 132 | 133 | self.can_shoot = False 134 | 135 | # Camera Shake 136 | self.player.shake_camera(0.1, self.shake_divider) 137 | 138 | def equip(self): 139 | self.equipped = True 140 | self.on_equipped() 141 | 142 | def input(self, key): 143 | if key == "left mouse down" and self.can_shoot: 144 | if self.gun_type == "minigun": 145 | if self.charged: 146 | self.shoot() 147 | self.started_shooting = True 148 | invoke(setattr, self, "started_shooting", False, delay = self.cooldown_length / 2) 149 | else: 150 | self.barrel.animate("rotation_z", self.barrel.rotation_z + 720, 1) 151 | invoke(setattr, self, "charged", True, delay = 1) 152 | 153 | self.player.speed = 2 154 | else: 155 | self.shoot() 156 | self.started_shooting = True 157 | invoke(setattr, self, "started_shooting", False, delay = self.cooldown_length / 2) 158 | 159 | elif key == "left mouse up": 160 | if hasattr(self, "shooting"): 161 | self.shooting = False 162 | self.charged = False 163 | self.player.speed = 5 164 | 165 | def on_enable(self): 166 | self.on_equipped() 167 | 168 | def on_equipped(self): 169 | self.y = -2 170 | self.rotation_x = 50 171 | try: 172 | self.animate("y", self.pos_y, duration = 0.4, curve = curve.linear) 173 | except AttributeError: 174 | self.animate("y", -0.5, duration = 0.4, curve = curve.linear) 175 | self.animate("rotation_x", 0, duration = 0.4, curve = curve.linear) 176 | invoke(setattr, self, "start_spring", True, delay = 0.4) 177 | 178 | def on_disable(self): 179 | self.start_spring = False 180 | 181 | class Bullet(Entity): 182 | def __init__(self, gun, pos, speed = 2000, trail_colour = color.hex("#00baff"), randomness = 0): 183 | super().__init__( 184 | model = "bullet.obj", 185 | texture = "level.png", 186 | scale = 0.08, 187 | position = pos 188 | ) 189 | 190 | self.gun = gun 191 | self.speed = speed 192 | self.hit_player = False 193 | self.randomness = Vec3(random.randint(-10, 10) * random.randint(-1, 1), random.randint(-10, 10) * random.randint(-1, 1), random.randint(-10, 10) * random.randint(-1, 1)) * Vec3(randomness) 194 | self.enemy = None 195 | 196 | self.trail_thickness = 8 197 | self.trail = TrailRenderer(self.trail_thickness, trail_colour, color.clear, 5, parent = self) 198 | 199 | if hasattr(self.gun, "tip"): 200 | self.rotation = camera.world_rotation 201 | self.is_player = True 202 | self.no_point = False 203 | else: 204 | self.world_rotation = self.gun.world_rotation 205 | self.is_player = False 206 | 207 | if self.is_player: 208 | if mouse.hovered_entity: 209 | if mouse.hovered_entity != self.gun.player.map: 210 | self.hovered_point = mouse.hovered_entity 211 | self.animate("position", Vec3(self.hovered_point.world_position) + (self.forward * 10000) + self.randomness, distance(self.hovered_point.world_position + (self.forward * 10000), self.gun.player) / 150, curve = curve.linear) 212 | else: 213 | self.hovered_point = mouse.world_point 214 | self.animate("position", Vec3(self.hovered_point) + self.randomness + (self.forward * 10000), distance(self.hovered_point + (self.forward * 10000), self.gun.player) / 150, curve = curve.linear) 215 | 216 | else: 217 | self.animate("position", self.world_position + (self.forward * 10000) + self.randomness, 5, curve = curve.linear) 218 | self.no_point = True 219 | 220 | destroy(self, 2) 221 | 222 | def update(self): 223 | if self.is_player: 224 | if not self.no_point: 225 | if self.hovered_point != self.gun.player.map and not isinstance(self.hovered_point, LVector3f): 226 | if distance(self, self.hovered_point) < 3 and self.hovered_point != self.gun.player: 227 | for i in range(2): 228 | p = Particles(self.hovered_point.world_position, Vec3(random.random(), random.randrange(-10, 10, 1) / 10, random.random()), spray_amount = 10, model = "particles") 229 | 230 | self.hovered_point.health -= self.gun.damage 231 | self.hovered_point.texture = "hit.png" 232 | invoke(setattr, self.hovered_point, "texture", "level", delay = 0.1) 233 | if self.hovered_point.health <= 0: 234 | for i in range(6): 235 | p = Particles(self.hovered_point.world_position, Vec3(random.random(), random.randrange(-10, 10, 1) / 10, random.random()), spray_amount = 10, model = "particles", texture = "destroyed") 236 | self.hovered_point.reset_pos() 237 | self.hovered_point.health = 2 238 | self.gun.player.shot_enemy() 239 | self.gun.destroyed_enemy.play() 240 | 241 | destroy(self) 242 | else: 243 | if self.gun.gun_type != "shotgun": 244 | if distance(self, self.hovered_point) < 3 and self.hovered_point != self.gun.player: 245 | for i in range(2): 246 | p = Particles(self.hovered_point - (self.forward * 10), Vec3(random.random(), random.random(), random.random()), 30, model = "particles") 247 | 248 | destroy(self) 249 | else: 250 | level_ray = raycast(self.world_position, self.forward, distance = 3, traverse_target = self.gun.player.map, ignore = [self, self.gun, self.gun.player]) 251 | if level_ray.hit: 252 | for i in range(2): 253 | p = Particles(self.hovered_point - (self.forward * 10), Vec3(random.random(), random.random(), random.random()), 30, model = "particles") 254 | 255 | destroy(self) 256 | else: 257 | self.position += self.forward * self.speed * time.dt 258 | 259 | level_ray = raycast(self.world_position, self.forward, distance = 3, traverse_target = self.gun.player.map, ignore = [self, self.gun]) 260 | if distance(self, self.gun.player) <= 2: 261 | if not self.hit_player: 262 | self.gun.player.health -= self.enemy.damage 263 | self.gun.player.healthbar.value = self.gun.player.health 264 | self.hit_player = True 265 | destroy(self) 266 | if level_ray.hit: 267 | destroy(self) 268 | destroy(self, delay = 2) 269 | 270 | class Rocket(Entity): 271 | def __init__(self, gun, pos, speed = 100, trail_colour = color.hex("#00baff"), randomness = 0, cooldown = 3): 272 | super().__init__( 273 | model = "rocket.obj", 274 | texture = "level.png", 275 | position = pos, 276 | parent = gun 277 | ) 278 | 279 | self.gun = gun 280 | self.speed = speed 281 | self.randomness = Vec3(random.randint(-10, 10) * random.randint(-1, 1), random.randint(-10, 10) * random.randint(-1, 1), random.randint(-10, 10) * random.randint(-1, 1)) * Vec3(randomness) 282 | self.pos = pos 283 | self.trail_colour = trail_colour 284 | self.no_point = False 285 | self.cooldown = cooldown 286 | 287 | self.fired = False 288 | self.gun.ready = True 289 | 290 | def fire(self): 291 | self.fired = True 292 | self.parent = scene 293 | self.gun.ready = False 294 | self.position = self.gun.world_position 295 | self.rotation = camera.world_rotation 296 | 297 | self.trail_thickness = 8 298 | self.trail = TrailRenderer(self.trail_thickness, self.trail_colour, color.clear, 5, parent = self) 299 | 300 | if mouse.hovered_entity: 301 | if mouse.hovered_entity != self.gun.player.map: 302 | self.hovered_point = mouse.hovered_entity 303 | self.animate("position", Vec3(self.hovered_point.world_position) + (self.forward) + self.randomness, distance(self.hovered_point.world_position + (self.forward), self.gun.player) / 150, curve = curve.linear) 304 | else: 305 | self.hovered_point = mouse.world_point 306 | self.animate("position", Vec3(self.hovered_point) + self.randomness + (self.forward), distance(self.hovered_point + (self.forward), self.gun.player) / 150, curve = curve.linear) 307 | self.no_point = False 308 | else: 309 | self.animate("position", self.world_position + (self.forward * 400) + self.randomness, 1.9, curve = curve.linear) 310 | self.no_point = True 311 | 312 | def update(self): 313 | if self.fired and not self.no_point: 314 | if self.hovered_point != self.gun.player.map and not isinstance(self.hovered_point, LVector3f): 315 | if distance(self, self.hovered_point) < 5 and self.hovered_point != self.gun.player: 316 | for i in range(2): 317 | p = Particles(self.hovered_point.world_position, Vec3(random.random(), random.randrange(-10, 10, 1) / 10, random.random()), spray_amount = 10, model = "particles") 318 | 319 | for enemy in self.gun.player.enemies: 320 | if distance(self, enemy) < 10: 321 | enemy.health -= (self.gun.damage - distance(self, enemy)) 322 | enemy.texture = "hit.png" 323 | invoke(setattr, enemy, "texture", "level", delay = 0.1) 324 | if enemy.health <= 0: 325 | for i in range(6): 326 | p = Particles(enemy.world_position, Vec3(random.random(), random.randrange(-10, 10, 1) / 10, random.random()), spray_amount = 10, model = "particles", texture = "destroyed") 327 | enemy.reset_pos() 328 | enemy.health = 2 329 | self.gun.player.shot_enemy() 330 | self.gun.destroyed_enemy.play() 331 | 332 | destroy(self) 333 | else: 334 | level_ray = raycast(self.world_position, self.forward, distance = 3, traverse_target = self.gun.player.map, ignore = [self, self.gun, self.gun.player]) 335 | if level_ray.hit: 336 | for i in range(10): 337 | p = Particles(self.hovered_point - (self.forward * 10), Vec3(random.random(), random.random(), random.random()), 30, model = "particles", texture = "jetpack") 338 | 339 | destroy(self) 340 | 341 | class Pistol(Gun): 342 | def __init__(self, player, equipped = True, **kwargs): 343 | super().__init__( 344 | model = "pistol.obj", 345 | texture = "level.png", 346 | player = player, 347 | equipped = equipped, 348 | **kwargs 349 | ) 350 | 351 | self.gun_type = "pistol" 352 | self.equip() 353 | 354 | class Shotgun(Gun): 355 | def __init__(self, player, equipped = False, **kwargs): 356 | super().__init__( 357 | model = "shotgun.obj", 358 | texture = "level.png", 359 | player = player, 360 | equipped = equipped, 361 | **kwargs 362 | ) 363 | 364 | self.gun_type = "shotgun" 365 | self.tip.z = 2 366 | 367 | self.pos_x = 0.6 368 | self.pos_y = -0.5 369 | 370 | self.damage = 1 371 | 372 | self.shake_divider = 40 373 | self.cooldown_length = 0.8 374 | 375 | class Rifle(Gun): 376 | def __init__(self, player, equipped = True, **kwargs): 377 | super().__init__( 378 | model = "rifle.obj", 379 | texture = "level.png", 380 | player = player, 381 | equipped = equipped, 382 | **kwargs 383 | ) 384 | 385 | self.gun_type = "rifle" 386 | self.tip.z = 8 387 | self.tip.y = 0 388 | 389 | self.pos_x = 0.6 390 | self.pos_y = -0.5 391 | 392 | self.damage = 0.8 393 | 394 | self.shake_divider = 80 395 | self.cooldown_length = 0.2 396 | self.equip() 397 | 398 | class MiniGun(Gun): 399 | def __init__(self, player, equipped = False, **kwargs): 400 | super().__init__( 401 | model = "minigun.obj", 402 | texture = "level.png", 403 | player = player, 404 | equipped = equipped, 405 | **kwargs 406 | ) 407 | 408 | self.barrel = Entity(model = "minigun-barrel", texture = "level", parent = self) 409 | self.shooting = False 410 | 411 | self.gun_type = "minigun" 412 | self.tip.z = 7 413 | self.tip.y = 0 414 | 415 | self.pos_x = 0.9 416 | self.pos_y = -1.2 417 | 418 | self.damage = 0.5 419 | 420 | self.shake_divider = 70 421 | self.cooldown_length = 0.1 422 | 423 | def update(self): 424 | if self.shooting: 425 | self.barrel.rotation_z += 400 * time.dt 426 | return super().update() 427 | 428 | class RocketLauncher(Gun): 429 | def __init__(self, player, equipped = False, **kwargs): 430 | super().__init__( 431 | model = "rocket-launcher.obj", 432 | texture = "level.png", 433 | player = player, 434 | equipped = equipped, 435 | **kwargs 436 | ) 437 | 438 | self.gun_type = "rocket launcher" 439 | self.tip.z = 8 440 | self.tip.y = 0 441 | 442 | self.pos_x = 0.6 443 | self.pos_y = -0.5 444 | 445 | self.damage = 10 446 | self.ready = True 447 | 448 | self.shake_divider = 20 449 | self.cooldown_length = 5 450 | 451 | self.rocket = Rocket(self, (0, 0, 0)) 452 | 453 | def input(self, key): 454 | if key == "left mouse down" and self.ready: 455 | self.rocket.fire() 456 | self.animate_rotation((-40, 0, 0), duration = 0.1, curve = curve.linear) 457 | self.animate("z", 0.5, duration = 0.1, curve = curve.linear) 458 | self.animate("z", 1.5, 0.2, delay = 0.1, curve = curve.linear) 459 | self.animate_rotation((-5, 0, 0), 0.5, delay = 0.15, curve = curve.linear) 460 | self.animate_rotation((0, 0, 0), 0.6, delay = 0.5, curve = curve.linear) 461 | 462 | self.player.shake_camera(0.1, self.shake_divider) 463 | invoke(self.reload, delay = 3) 464 | 465 | self.gun_sound.clip = "rocket_launcher.wav" 466 | self.gun_sound.play() 467 | 468 | def reload(self): 469 | self.rocket = Rocket(self, (0, 0, 0)) 470 | 471 | class Spring: 472 | def __init__(self, mass = 5, force = 50, damping = 4, speed = 4): 473 | self.target = Vec3() 474 | self.position = Vec3() 475 | self.velocity = Vec3() 476 | 477 | self.iterations = 8 478 | 479 | self.mass = mass 480 | self.force = force 481 | self.damping = damping 482 | self.speed = speed 483 | 484 | def shove(self, force): 485 | x, y, z = force.x, force.y, force.z 486 | 487 | if x != x: 488 | x = 0 489 | if y != y: 490 | y = 0 491 | if z != z: 492 | z = 0 493 | 494 | self.velocity = self.velocity + Vec3(x, y, z) 495 | 496 | def update(self, dt): 497 | scaledDeltaTime = min(dt,1) * self.speed / self.iterations 498 | 499 | for i in range(self.iterations): 500 | iterationForce = self.target - self.position 501 | acceleration = (iterationForce * self.force) / self.mass 502 | 503 | acceleration = acceleration - self.velocity * self.damping 504 | 505 | self.velocity = self.velocity + acceleration * scaledDeltaTime 506 | self.position = self.position + self.velocity * scaledDeltaTime 507 | 508 | return self.position -------------------------------------------------------------------------------- /assets/guns/minigun-barrel.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: 'gun.blend' 2 | # www.blender.org 3 | mtllib minigun-barrel.mtl 4 | v -0.361049 0.382310 7.283692 5 | v -0.361049 0.444959 2.362501 6 | v -0.486848 0.330196 7.283833 7 | v -0.520654 0.378840 2.362682 8 | v -0.538956 0.204383 7.284180 9 | v -0.586765 0.219217 2.363120 10 | v -0.486848 0.078569 7.284527 11 | v -0.520654 0.059593 2.363559 12 | v -0.361049 0.026455 7.284667 13 | v -0.361049 -0.006525 2.363740 14 | v -0.235249 0.078569 7.284527 15 | v -0.201443 0.059593 2.363559 16 | v -0.183141 0.204383 7.284180 17 | v -0.135332 0.219217 2.363120 18 | v -0.235249 0.330196 7.283833 19 | v -0.201443 0.378840 2.362682 20 | v 0.000000 0.630234 7.283012 21 | v 0.000000 0.692882 2.361821 22 | v -0.125800 0.578120 7.283153 23 | v -0.159606 0.626764 2.362002 24 | v -0.177908 0.452306 7.283501 25 | v -0.225717 0.467141 2.362439 26 | v -0.125800 0.326493 7.283847 27 | v -0.159606 0.307517 2.362879 28 | v 0.000000 0.274379 7.283987 29 | v 0.000000 0.241399 2.363060 30 | v 0.125800 0.326493 7.283847 31 | v 0.159606 0.307517 2.362879 32 | v 0.177908 0.452306 7.283501 33 | v 0.225717 0.467141 2.362439 34 | v 0.125800 0.578120 7.283153 35 | v 0.159606 0.626764 2.362002 36 | v 0.361049 0.382310 7.283692 37 | v 0.361049 0.444959 2.362501 38 | v 0.235249 0.330196 7.283833 39 | v 0.201443 0.378840 2.362682 40 | v 0.183141 0.204383 7.284180 41 | v 0.135332 0.219217 2.363120 42 | v 0.235249 0.078569 7.284527 43 | v 0.201443 0.059593 2.363559 44 | v 0.361049 0.026455 7.284667 45 | v 0.361049 -0.006525 2.363740 46 | v 0.486849 0.078569 7.284527 47 | v 0.520655 0.059593 2.363559 48 | v 0.538957 0.204383 7.284180 49 | v 0.586766 0.219217 2.363120 50 | v 0.486849 0.330196 7.283833 51 | v 0.520655 0.378840 2.362682 52 | v -0.361049 -0.451837 2.364958 53 | v -0.361049 -0.418856 7.285886 54 | v -0.520654 -0.385718 2.364779 55 | v -0.486848 -0.366742 7.285744 56 | v -0.586765 -0.226095 2.364339 57 | v -0.538956 -0.240929 7.285398 58 | v -0.520654 -0.066471 2.363899 59 | v -0.486848 -0.115115 7.285052 60 | v -0.361049 -0.000353 2.363721 61 | v -0.361049 -0.063001 7.284911 62 | v -0.201443 -0.066471 2.363899 63 | v -0.235249 -0.115115 7.285052 64 | v -0.135332 -0.226095 2.364339 65 | v -0.183141 -0.240929 7.285398 66 | v -0.201443 -0.385718 2.364779 67 | v -0.235249 -0.366742 7.285744 68 | v 0.000000 -0.699760 2.365638 69 | v 0.000000 -0.666780 7.286566 70 | v -0.159606 -0.633642 2.365459 71 | v -0.125800 -0.614666 7.286425 72 | v -0.225717 -0.474019 2.365019 73 | v -0.177908 -0.488852 7.286079 74 | v -0.159606 -0.314395 2.364580 75 | v -0.125800 -0.363039 7.285733 76 | v 0.000000 -0.248277 2.364401 77 | v 0.000000 -0.310925 7.285590 78 | v 0.159606 -0.314395 2.364580 79 | v 0.125800 -0.363039 7.285733 80 | v 0.225717 -0.474019 2.365019 81 | v 0.177908 -0.488852 7.286079 82 | v 0.159606 -0.633642 2.365459 83 | v 0.125800 -0.614666 7.286425 84 | v 0.361049 -0.451837 2.364958 85 | v 0.361049 -0.418856 7.285886 86 | v 0.201443 -0.385718 2.364779 87 | v 0.235249 -0.366742 7.285744 88 | v 0.135332 -0.226095 2.364339 89 | v 0.183141 -0.240929 7.285398 90 | v 0.201443 -0.066471 2.363899 91 | v 0.235249 -0.115115 7.285052 92 | v 0.361049 -0.000353 2.363721 93 | v 0.361049 -0.063001 7.284911 94 | v 0.520655 -0.066471 2.363899 95 | v 0.486849 -0.115115 7.285052 96 | v 0.586766 -0.226095 2.364339 97 | v 0.538957 -0.240929 7.285398 98 | v 0.520655 -0.385718 2.364779 99 | v 0.486849 -0.366742 7.285744 100 | v -0.361049 0.430124 7.283561 101 | v -0.520654 0.364006 7.283740 102 | v -0.586765 0.204383 7.284180 103 | v -0.520654 0.044759 7.284619 104 | v -0.361049 -0.021359 7.284798 105 | v -0.201443 0.044759 7.284619 106 | v -0.135332 0.204383 7.284180 107 | v -0.201443 0.364006 7.283740 108 | v 0.000000 0.678048 7.282881 109 | v -0.159606 0.611930 7.283060 110 | v -0.225717 0.452306 7.283501 111 | v -0.159606 0.292683 7.283939 112 | v 0.000000 0.226565 7.284118 113 | v 0.159606 0.292683 7.283939 114 | v 0.225717 0.452306 7.283501 115 | v 0.159606 0.611930 7.283060 116 | v 0.361049 0.430124 7.283561 117 | v 0.201443 0.364006 7.283740 118 | v 0.135332 0.204383 7.284180 119 | v 0.201443 0.044759 7.284619 120 | v 0.361049 -0.021359 7.284798 121 | v 0.520655 0.044759 7.284619 122 | v 0.586766 0.204383 7.284180 123 | v 0.520655 0.364006 7.283740 124 | v -0.520654 -0.400552 7.285837 125 | v -0.361049 -0.466670 7.286018 126 | v -0.586765 -0.240929 7.285398 127 | v -0.520654 -0.081305 7.284961 128 | v -0.361049 -0.015187 7.284780 129 | v -0.201443 -0.081305 7.284961 130 | v -0.135332 -0.240929 7.285398 131 | v -0.201443 -0.400552 7.285837 132 | v -0.159606 -0.648476 7.286518 133 | v 0.000000 -0.714594 7.286698 134 | v -0.225717 -0.488852 7.286079 135 | v -0.159606 -0.329229 7.285640 136 | v 0.000000 -0.263111 7.285459 137 | v 0.159606 -0.329229 7.285640 138 | v 0.225717 -0.488852 7.286079 139 | v 0.159606 -0.648476 7.286518 140 | v 0.201443 -0.400552 7.285837 141 | v 0.361049 -0.466670 7.286018 142 | v 0.135332 -0.240929 7.285398 143 | v 0.201443 -0.081305 7.284961 144 | v 0.361049 -0.015187 7.284780 145 | v 0.520655 -0.081305 7.284961 146 | v 0.586766 -0.240929 7.285398 147 | v 0.520655 -0.400552 7.285837 148 | v -0.361048 0.384109 6.686363 149 | v -0.486848 0.331996 6.686502 150 | v -0.538956 0.206182 6.686851 151 | v -0.486848 0.080368 6.687197 152 | v -0.361048 0.028254 6.687336 153 | v -0.235249 0.080368 6.687197 154 | v -0.183141 0.206182 6.686851 155 | v -0.235249 0.331996 6.686502 156 | v 0.000000 0.632033 6.685683 157 | v -0.125800 0.579919 6.685822 158 | v -0.177908 0.454106 6.686171 159 | v -0.125800 0.328292 6.686517 160 | v 0.000000 0.276178 6.686656 161 | v 0.125800 0.328292 6.686517 162 | v 0.177908 0.454106 6.686171 163 | v 0.125800 0.579919 6.685822 164 | v 0.361049 0.384109 6.686363 165 | v 0.235249 0.331996 6.686502 166 | v 0.183141 0.206182 6.686851 167 | v 0.235249 0.080368 6.687197 168 | v 0.361049 0.028254 6.687336 169 | v 0.486849 0.080368 6.687197 170 | v 0.538957 0.206182 6.686851 171 | v 0.486849 0.331996 6.686502 172 | v -0.486848 -0.364943 6.688414 173 | v -0.361048 -0.417057 6.688556 174 | v -0.538956 -0.239129 6.688069 175 | v -0.486848 -0.113316 6.687723 176 | v -0.361048 -0.061202 6.687582 177 | v -0.235249 -0.113316 6.687723 178 | v -0.183141 -0.239129 6.688069 179 | v -0.235249 -0.364943 6.688414 180 | v -0.125800 -0.612867 6.689095 181 | v 0.000000 -0.664981 6.689236 182 | v -0.177908 -0.487053 6.688749 183 | v -0.125800 -0.361240 6.688403 184 | v 0.000000 -0.309126 6.688260 185 | v 0.125800 -0.361240 6.688403 186 | v 0.177908 -0.487053 6.688749 187 | v 0.125800 -0.612867 6.689095 188 | v 0.235249 -0.364943 6.688414 189 | v 0.361049 -0.417057 6.688556 190 | v 0.183141 -0.239129 6.688069 191 | v 0.235249 -0.113316 6.687723 192 | v 0.361049 -0.061202 6.687582 193 | v 0.486849 -0.113316 6.687723 194 | v 0.538957 -0.239129 6.688069 195 | v 0.486849 -0.364943 6.688414 196 | vt 0.431914 0.942941 197 | vt 0.431914 0.956061 198 | vt 0.428634 0.956061 199 | vt 0.428634 0.942941 200 | vt 0.425354 0.956061 201 | vt 0.425354 0.942941 202 | vt 0.422074 0.956061 203 | vt 0.422074 0.942941 204 | vt 0.418794 0.956061 205 | vt 0.418794 0.942941 206 | vt 0.415514 0.956061 207 | vt 0.415514 0.942941 208 | vt 0.412234 0.956061 209 | vt 0.412234 0.942941 210 | vt 0.416687 0.940834 211 | vt 0.412234 0.942678 212 | vt 0.407781 0.940834 213 | vt 0.405937 0.936381 214 | vt 0.407781 0.931928 215 | vt 0.412234 0.930083 216 | vt 0.416687 0.931928 217 | vt 0.418532 0.936381 218 | vt 0.408954 0.956061 219 | vt 0.408954 0.942941 220 | vt 0.405674 0.956061 221 | vt 0.405674 0.942941 222 | vt 0.408724 0.939891 223 | vt 0.407270 0.936381 224 | vt 0.407270 0.936381 225 | vt 0.408724 0.939891 226 | vt 0.431914 0.942941 227 | vt 0.431914 0.956061 228 | vt 0.428634 0.956061 229 | vt 0.428634 0.942941 230 | vt 0.425354 0.956061 231 | vt 0.425354 0.942941 232 | vt 0.422074 0.956061 233 | vt 0.422074 0.942941 234 | vt 0.418794 0.956061 235 | vt 0.418794 0.942941 236 | vt 0.415514 0.956061 237 | vt 0.415514 0.942941 238 | vt 0.412234 0.956061 239 | vt 0.412234 0.942941 240 | vt 0.416687 0.940834 241 | vt 0.412234 0.942678 242 | vt 0.407781 0.940834 243 | vt 0.405937 0.936381 244 | vt 0.407781 0.931928 245 | vt 0.412234 0.930083 246 | vt 0.416687 0.931928 247 | vt 0.418532 0.936381 248 | vt 0.408954 0.956061 249 | vt 0.408954 0.942941 250 | vt 0.405674 0.956061 251 | vt 0.405674 0.942941 252 | vt 0.428864 0.932871 253 | vt 0.425354 0.931417 254 | vt 0.425354 0.931417 255 | vt 0.428864 0.932871 256 | vt 0.431914 0.942941 257 | vt 0.431914 0.956061 258 | vt 0.428634 0.956061 259 | vt 0.428634 0.942941 260 | vt 0.425354 0.956061 261 | vt 0.425354 0.942941 262 | vt 0.422074 0.956061 263 | vt 0.422074 0.942941 264 | vt 0.418794 0.956061 265 | vt 0.418794 0.942941 266 | vt 0.415514 0.956061 267 | vt 0.415514 0.942941 268 | vt 0.412234 0.956061 269 | vt 0.412234 0.942941 270 | vt 0.416687 0.940834 271 | vt 0.412234 0.942678 272 | vt 0.407781 0.940834 273 | vt 0.405937 0.936381 274 | vt 0.407781 0.931928 275 | vt 0.412234 0.930083 276 | vt 0.416687 0.931928 277 | vt 0.418532 0.936381 278 | vt 0.408954 0.956061 279 | vt 0.408954 0.942941 280 | vt 0.405674 0.956061 281 | vt 0.405674 0.942941 282 | vt 0.415744 0.939891 283 | vt 0.412234 0.941344 284 | vt 0.412234 0.941344 285 | vt 0.415744 0.939891 286 | vt 0.431914 0.942941 287 | vt 0.431914 0.956061 288 | vt 0.428634 0.956061 289 | vt 0.428634 0.942941 290 | vt 0.425354 0.956061 291 | vt 0.425354 0.942941 292 | vt 0.422074 0.956061 293 | vt 0.422074 0.942941 294 | vt 0.418794 0.956061 295 | vt 0.418794 0.942941 296 | vt 0.415514 0.956061 297 | vt 0.415514 0.942941 298 | vt 0.412234 0.956061 299 | vt 0.412234 0.942941 300 | vt 0.408724 0.932871 301 | vt 0.408724 0.932871 302 | vt 0.408954 0.956061 303 | vt 0.408954 0.942941 304 | vt 0.405674 0.956061 305 | vt 0.405674 0.942941 306 | vt 0.425354 0.942678 307 | vt 0.429807 0.940834 308 | vt 0.431652 0.936381 309 | vt 0.429807 0.931928 310 | vt 0.425354 0.930083 311 | vt 0.420901 0.931928 312 | vt 0.419056 0.936381 313 | vt 0.420901 0.940834 314 | vt 0.431914 0.942941 315 | vt 0.431914 0.956061 316 | vt 0.428634 0.956061 317 | vt 0.428634 0.942941 318 | vt 0.425354 0.956061 319 | vt 0.425354 0.942941 320 | vt 0.422074 0.956061 321 | vt 0.422074 0.942941 322 | vt 0.418794 0.956061 323 | vt 0.418794 0.942941 324 | vt 0.415514 0.956061 325 | vt 0.415514 0.942941 326 | vt 0.412234 0.956061 327 | vt 0.412234 0.942941 328 | vt 0.430318 0.936381 329 | vt 0.430318 0.936381 330 | vt 0.408954 0.956061 331 | vt 0.408954 0.942941 332 | vt 0.405674 0.956061 333 | vt 0.405674 0.942941 334 | vt 0.425354 0.942678 335 | vt 0.429807 0.940834 336 | vt 0.431652 0.936381 337 | vt 0.429807 0.931928 338 | vt 0.425354 0.930083 339 | vt 0.420901 0.931928 340 | vt 0.419056 0.936381 341 | vt 0.420901 0.940834 342 | vt 0.431914 0.942941 343 | vt 0.431914 0.956061 344 | vt 0.428634 0.956061 345 | vt 0.428634 0.942941 346 | vt 0.425354 0.956061 347 | vt 0.425354 0.942941 348 | vt 0.422074 0.956061 349 | vt 0.422074 0.942941 350 | vt 0.418794 0.956061 351 | vt 0.418794 0.942941 352 | vt 0.415514 0.956061 353 | vt 0.415514 0.942941 354 | vt 0.412234 0.956061 355 | vt 0.412234 0.942941 356 | vt 0.421844 0.939891 357 | vt 0.425354 0.941344 358 | vt 0.425354 0.941344 359 | vt 0.421844 0.939891 360 | vt 0.408954 0.956061 361 | vt 0.408954 0.942941 362 | vt 0.405674 0.956061 363 | vt 0.405674 0.942941 364 | vt 0.425354 0.942678 365 | vt 0.429807 0.940834 366 | vt 0.431652 0.936381 367 | vt 0.429807 0.931928 368 | vt 0.425354 0.930083 369 | vt 0.420901 0.931928 370 | vt 0.419056 0.936381 371 | vt 0.420901 0.940834 372 | vt 0.428864 0.939891 373 | vt 0.425354 0.941344 374 | vt 0.425354 0.942678 375 | vt 0.429807 0.940834 376 | vt 0.430318 0.936381 377 | vt 0.431652 0.936381 378 | vt 0.428864 0.932871 379 | vt 0.429807 0.931928 380 | vt 0.425354 0.931417 381 | vt 0.425354 0.930083 382 | vt 0.421844 0.932871 383 | vt 0.420901 0.931928 384 | vt 0.420390 0.936381 385 | vt 0.419056 0.936381 386 | vt 0.421844 0.939891 387 | vt 0.420901 0.940834 388 | vt 0.428864 0.939891 389 | vt 0.425354 0.941344 390 | vt 0.425354 0.942678 391 | vt 0.429807 0.940834 392 | vt 0.431652 0.936381 393 | vt 0.429807 0.931928 394 | vt 0.425354 0.930083 395 | vt 0.421844 0.932871 396 | vt 0.420901 0.931928 397 | vt 0.420390 0.936381 398 | vt 0.419056 0.936381 399 | vt 0.421844 0.939891 400 | vt 0.420901 0.940834 401 | vt 0.428864 0.939891 402 | vt 0.425354 0.942678 403 | vt 0.429807 0.940834 404 | vt 0.430318 0.936381 405 | vt 0.431652 0.936381 406 | vt 0.428864 0.932871 407 | vt 0.429807 0.931928 408 | vt 0.425354 0.931417 409 | vt 0.425354 0.930083 410 | vt 0.421844 0.932871 411 | vt 0.420901 0.931928 412 | vt 0.420390 0.936381 413 | vt 0.419056 0.936381 414 | vt 0.420901 0.940834 415 | vt 0.416687 0.940834 416 | vt 0.412234 0.942678 417 | vt 0.417198 0.936381 418 | vt 0.418532 0.936381 419 | vt 0.415744 0.932871 420 | vt 0.416687 0.931928 421 | vt 0.412234 0.931417 422 | vt 0.412234 0.930083 423 | vt 0.408724 0.932871 424 | vt 0.407781 0.931928 425 | vt 0.407270 0.936381 426 | vt 0.405937 0.936381 427 | vt 0.408724 0.939891 428 | vt 0.407781 0.940834 429 | vt 0.412234 0.941344 430 | vt 0.415744 0.939891 431 | vt 0.416687 0.940834 432 | vt 0.412234 0.942678 433 | vt 0.417198 0.936381 434 | vt 0.418532 0.936381 435 | vt 0.415744 0.932871 436 | vt 0.416687 0.931928 437 | vt 0.412234 0.931417 438 | vt 0.412234 0.930083 439 | vt 0.407781 0.931928 440 | vt 0.405937 0.936381 441 | vt 0.407781 0.940834 442 | vt 0.412234 0.941344 443 | vt 0.415744 0.939891 444 | vt 0.416687 0.940834 445 | vt 0.412234 0.942678 446 | vt 0.417198 0.936381 447 | vt 0.418532 0.936381 448 | vt 0.415744 0.932871 449 | vt 0.416687 0.931928 450 | vt 0.412234 0.931417 451 | vt 0.412234 0.930083 452 | vt 0.408724 0.932871 453 | vt 0.407781 0.931928 454 | vt 0.407270 0.936381 455 | vt 0.405937 0.936381 456 | vt 0.408724 0.939891 457 | vt 0.407781 0.940834 458 | vt 0.425354 0.941344 459 | vt 0.428864 0.939891 460 | vt 0.430318 0.936381 461 | vt 0.428864 0.932871 462 | vt 0.425354 0.931417 463 | vt 0.421844 0.932871 464 | vt 0.420390 0.936381 465 | vt 0.421844 0.939891 466 | vt 0.425354 0.941344 467 | vt 0.428864 0.939891 468 | vt 0.421844 0.932871 469 | vt 0.420390 0.936381 470 | vt 0.421844 0.939891 471 | vt 0.428864 0.939891 472 | vt 0.430318 0.936381 473 | vt 0.428864 0.932871 474 | vt 0.425354 0.931417 475 | vt 0.421844 0.932871 476 | vt 0.420390 0.936381 477 | vt 0.408724 0.939891 478 | vt 0.407270 0.936381 479 | vt 0.408724 0.932871 480 | vt 0.412234 0.931417 481 | vt 0.415744 0.932871 482 | vt 0.417198 0.936381 483 | vt 0.415744 0.939891 484 | vt 0.412234 0.941344 485 | vt 0.412234 0.931417 486 | vt 0.415744 0.932871 487 | vt 0.417198 0.936381 488 | vt 0.415744 0.939891 489 | vt 0.412234 0.941344 490 | vt 0.408724 0.939891 491 | vt 0.407270 0.936381 492 | vt 0.408724 0.932871 493 | vt 0.412234 0.931417 494 | vt 0.415744 0.932871 495 | vt 0.417198 0.936381 496 | vn -0.3827 0.9239 0.0028 497 | vn -0.9239 0.3827 0.0012 498 | vn -0.9239 -0.3827 -0.0012 499 | vn -0.3827 -0.9239 -0.0028 500 | vn 0.3827 -0.9239 -0.0028 501 | vn 0.9239 -0.3826 -0.0012 502 | vn 0.0000 -0.0027 -1.0000 503 | vn 0.9239 0.3826 0.0012 504 | vn 0.3827 0.9239 0.0028 505 | vn -0.9239 0.3826 0.0012 506 | vn -0.9239 -0.3826 -0.0012 507 | vn 0.9239 0.3827 0.0012 508 | vn 0.9239 -0.3827 -0.0012 509 | vn -0.0000 0.0027 1.0000 510 | vn 0.0000 0.0028 1.0000 511 | usemtl Material 512 | s off 513 | f 97/1/1 2/2/1 4/3/1 98/4/1 514 | f 98/4/2 4/3/2 6/5/2 99/6/2 515 | f 99/6/3 6/5/3 8/7/3 100/8/3 516 | f 100/8/4 8/7/4 10/9/4 101/10/4 517 | f 101/10/5 10/9/5 12/11/5 102/12/5 518 | f 102/12/6 12/11/6 14/13/6 103/14/6 519 | f 4/15/7 2/16/7 16/17/7 14/18/7 12/19/7 10/20/7 8/21/7 6/22/7 520 | f 103/14/8 14/13/8 16/23/8 104/24/8 521 | f 104/24/9 16/23/9 2/25/9 97/26/9 522 | f 80/27/2 78/28/2 183/29/2 184/30/2 523 | f 105/31/1 18/32/1 20/33/1 106/34/1 524 | f 106/34/10 20/33/10 22/35/10 107/36/10 525 | f 107/36/11 22/35/11 24/37/11 108/38/11 526 | f 108/38/4 24/37/4 26/39/4 109/40/4 527 | f 109/40/5 26/39/5 28/41/5 110/42/5 528 | f 110/42/6 28/41/6 30/43/6 111/44/6 529 | f 20/45/7 18/46/7 32/47/7 30/48/7 28/49/7 26/50/7 24/51/7 22/52/7 530 | f 111/44/12 30/43/12 32/53/12 112/54/12 531 | f 112/54/9 32/53/9 18/55/9 105/56/9 532 | f 23/57/9 25/58/9 157/59/9 156/60/9 533 | f 113/61/1 34/62/1 36/63/1 114/64/1 534 | f 114/64/10 36/63/10 38/65/10 115/66/10 535 | f 115/66/11 38/65/11 40/67/11 116/68/11 536 | f 116/68/4 40/67/4 42/69/4 117/70/4 537 | f 117/70/5 42/69/5 44/71/5 118/72/5 538 | f 118/72/6 44/71/6 46/73/6 119/74/6 539 | f 36/75/7 34/76/7 48/77/7 46/78/7 44/79/7 42/80/7 40/81/7 38/82/7 540 | f 119/74/12 46/73/12 48/83/12 120/84/12 541 | f 120/84/9 48/83/9 34/85/9 113/86/9 542 | f 52/87/9 50/88/9 170/89/9 169/90/9 543 | f 49/91/4 122/92/4 121/93/4 51/94/4 544 | f 51/94/11 121/93/11 123/95/11 53/96/11 545 | f 53/96/10 123/95/10 124/97/10 55/98/10 546 | f 55/98/1 124/97/1 125/99/1 57/100/1 547 | f 57/100/9 125/99/9 126/101/9 59/102/9 548 | f 59/102/8 126/101/8 127/103/8 61/104/8 549 | f 78/28/3 76/105/3 182/106/3 183/29/3 550 | f 61/104/13 127/103/13 128/107/13 63/108/13 551 | f 63/108/5 128/107/5 122/109/5 49/110/5 552 | f 49/111/7 51/112/7 53/113/7 55/114/7 57/115/7 59/116/7 61/117/7 63/118/7 553 | f 65/119/4 130/120/4 129/121/4 67/122/4 554 | f 67/122/11 129/121/11 131/123/11 69/124/11 555 | f 69/124/10 131/123/10 132/125/10 71/126/10 556 | f 71/126/1 132/125/1 133/127/1 73/128/1 557 | f 73/128/9 133/127/9 134/129/9 75/130/9 558 | f 75/130/8 134/129/8 135/131/8 77/132/8 559 | f 21/133/12 23/57/12 156/60/12 155/134/12 560 | f 77/132/13 135/131/13 136/135/13 79/136/13 561 | f 79/136/5 136/135/5 130/137/5 65/138/5 562 | f 65/139/7 67/140/7 69/141/7 71/142/7 73/143/7 75/144/7 77/145/7 79/146/7 563 | f 81/147/4 138/148/4 137/149/4 83/150/4 564 | f 83/150/11 137/149/11 139/151/11 85/152/11 565 | f 85/152/10 139/151/10 140/153/10 87/154/10 566 | f 87/154/1 140/153/1 141/155/1 89/156/1 567 | f 89/156/9 141/155/9 142/157/9 91/158/9 568 | f 91/158/8 142/157/8 143/159/8 93/160/8 569 | f 47/161/4 33/162/4 161/163/4 168/164/4 570 | f 93/160/13 143/159/13 144/165/13 95/166/13 571 | f 95/166/5 144/165/5 138/167/5 81/168/5 572 | f 81/169/7 83/170/7 85/171/7 87/172/7 89/173/7 91/174/7 93/175/7 95/176/7 573 | f 3/177/14 1/178/14 97/179/14 98/180/14 574 | f 5/181/15 3/177/15 98/180/15 99/182/15 575 | f 7/183/15 5/181/15 99/182/15 100/184/15 576 | f 9/185/14 7/183/14 100/184/14 101/186/14 577 | f 11/187/14 9/185/14 101/186/14 102/188/14 578 | f 13/189/15 11/187/15 102/188/15 103/190/15 579 | f 15/191/15 13/189/15 103/190/15 104/192/15 580 | f 1/178/14 15/191/14 104/192/14 97/179/14 581 | f 19/193/14 17/194/14 105/195/14 106/196/14 582 | f 21/133/15 19/193/15 106/196/15 107/197/15 583 | f 23/57/14 21/133/14 107/197/14 108/198/14 584 | f 25/58/14 23/57/14 108/198/14 109/199/14 585 | f 27/200/14 25/58/14 109/199/14 110/201/14 586 | f 29/202/14 27/200/14 110/201/14 111/203/14 587 | f 31/204/15 29/202/15 111/203/15 112/205/15 588 | f 17/194/14 31/204/14 112/205/14 105/195/14 589 | f 35/206/14 33/162/14 113/207/14 114/208/14 590 | f 37/209/15 35/206/15 114/208/15 115/210/15 591 | f 39/211/15 37/209/15 115/210/15 116/212/15 592 | f 41/213/14 39/211/14 116/212/14 117/214/14 593 | f 43/215/14 41/213/14 117/214/14 118/216/14 594 | f 45/217/15 43/215/15 118/216/15 119/218/15 595 | f 47/161/15 45/217/15 119/218/15 120/219/15 596 | f 33/162/14 47/161/14 120/219/14 113/207/14 597 | f 50/88/15 52/87/15 121/220/15 122/221/15 598 | f 52/87/14 54/222/14 123/223/14 121/220/14 599 | f 54/222/14 56/224/14 124/225/14 123/223/14 600 | f 56/224/14 58/226/14 125/227/14 124/225/14 601 | f 58/226/14 60/228/14 126/229/14 125/227/14 602 | f 60/228/14 62/230/14 127/231/14 126/229/14 603 | f 62/230/14 64/232/14 128/233/14 127/231/14 604 | f 64/232/15 50/88/15 122/221/15 128/233/15 605 | f 66/234/15 68/235/15 129/236/15 130/237/15 606 | f 68/235/14 70/238/14 131/239/14 129/236/14 607 | f 70/238/15 72/240/15 132/241/15 131/239/15 608 | f 72/240/15 74/242/15 133/243/15 132/241/15 609 | f 74/242/15 76/105/15 134/244/15 133/243/15 610 | f 76/105/15 78/28/15 135/245/15 134/244/15 611 | f 78/28/14 80/27/14 136/246/14 135/245/14 612 | f 80/27/15 66/234/15 130/237/15 136/246/15 613 | f 82/247/15 84/248/15 137/249/15 138/250/15 614 | f 84/248/14 86/251/14 139/252/14 137/249/14 615 | f 86/251/14 88/253/14 140/254/14 139/252/14 616 | f 88/253/14 90/255/14 141/256/14 140/254/14 617 | f 90/255/14 92/257/14 142/258/14 141/256/14 618 | f 92/257/14 94/259/14 143/260/14 142/258/14 619 | f 94/259/14 96/261/14 144/262/14 143/260/14 620 | f 96/261/15 82/247/15 138/250/15 144/262/15 621 | f 145/263/14 146/264/14 147/265/14 148/266/14 149/267/14 150/268/14 151/269/14 152/270/14 622 | f 153/271/14 154/272/14 155/134/14 156/60/14 157/59/14 158/273/14 159/274/14 160/275/14 623 | f 161/163/14 162/276/14 163/277/14 164/278/14 165/279/14 166/280/14 167/281/14 168/164/14 624 | f 169/90/14 170/89/14 176/282/14 175/283/14 174/284/14 173/285/14 172/286/14 171/287/14 625 | f 177/288/14 178/289/14 184/30/14 183/29/14 182/106/14 181/290/14 180/291/14 179/292/14 626 | f 185/293/14 186/294/14 192/295/14 191/296/14 190/297/14 189/298/14 188/299/14 187/300/14 627 | f 54/222/12 52/87/12 169/90/12 171/287/12 628 | f 25/58/1 27/200/1 158/273/1 157/59/1 629 | f 66/234/1 80/27/1 184/30/1 178/289/1 630 | f 56/224/6 54/222/6 171/287/6 172/286/6 631 | f 27/200/2 29/202/2 159/274/2 158/273/2 632 | f 84/248/9 82/247/9 186/294/9 185/293/9 633 | f 1/178/5 3/177/5 146/264/5 145/263/5 634 | f 58/226/5 56/224/5 172/286/5 173/285/5 635 | f 29/202/11 31/204/11 160/275/11 159/274/11 636 | f 86/251/12 84/248/12 185/293/12 187/300/12 637 | f 3/177/13 5/181/13 147/265/13 146/264/13 638 | f 60/228/4 58/226/4 173/285/4 174/284/4 639 | f 31/204/4 17/194/4 153/271/4 160/275/4 640 | f 88/253/6 86/251/6 187/300/6 188/299/6 641 | f 5/181/8 7/183/8 148/266/8 147/265/8 642 | f 62/230/11 60/228/11 174/284/11 175/283/11 643 | f 33/162/5 35/206/5 162/276/5 161/163/5 644 | f 90/255/5 88/253/5 188/299/5 189/298/5 645 | f 7/183/9 9/185/9 149/267/9 148/266/9 646 | f 64/232/10 62/230/10 175/283/10 176/282/10 647 | f 35/206/6 37/209/6 163/277/6 162/276/6 648 | f 92/257/4 90/255/4 189/298/4 190/297/4 649 | f 9/185/1 11/187/1 150/268/1 149/267/1 650 | f 50/88/1 64/232/1 176/282/1 170/89/1 651 | f 37/209/8 39/211/8 164/278/8 163/277/8 652 | f 94/259/11 92/257/11 190/297/11 191/296/11 653 | f 11/187/10 13/189/10 151/269/10 150/268/10 654 | f 68/235/9 66/234/9 178/289/9 177/288/9 655 | f 39/211/9 41/213/9 165/279/9 164/278/9 656 | f 96/261/2 94/259/2 191/296/2 192/295/2 657 | f 13/189/11 15/191/11 152/270/11 151/269/11 658 | f 70/238/12 68/235/12 177/288/12 179/292/12 659 | f 41/213/1 43/215/1 166/280/1 165/279/1 660 | f 82/247/1 96/261/1 192/295/1 186/294/1 661 | f 15/191/4 1/178/4 145/263/4 152/270/4 662 | f 72/240/6 70/238/6 179/292/6 180/291/6 663 | f 43/215/10 45/217/10 167/281/10 166/280/10 664 | f 17/194/5 19/193/5 154/272/5 153/271/5 665 | f 74/242/5 72/240/5 180/291/5 181/290/5 666 | f 45/217/3 47/161/3 168/164/3 167/281/3 667 | f 19/193/6 21/133/6 155/134/6 154/272/6 668 | f 76/105/4 74/242/4 181/290/4 182/106/4 669 | -------------------------------------------------------------------------------- /assets/guns/rocket.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: 'gun.blend' 2 | # www.blender.org 3 | mtllib rocket.mtl 4 | v 0.000000 0.697816 7.785615 5 | v 0.000000 0.697816 7.070768 6 | v -0.348908 0.604327 7.785615 7 | v -0.348908 0.604327 7.070768 8 | v -0.604327 0.348908 7.785615 9 | v -0.604327 0.348908 7.070768 10 | v -0.697816 -0.000000 7.785615 11 | v -0.697816 -0.000000 7.070768 12 | v -0.604327 -0.348908 7.785615 13 | v -0.604327 -0.348908 7.070768 14 | v -0.348908 -0.604327 7.785615 15 | v -0.348908 -0.604327 7.070768 16 | v -0.000000 -0.697816 7.785615 17 | v -0.000000 -0.697816 7.070768 18 | v 0.348908 -0.604327 7.785615 19 | v 0.348908 -0.604327 7.070768 20 | v 0.604327 -0.348908 7.785615 21 | v 0.604327 -0.348908 7.070768 22 | v 0.697816 -0.000000 7.785615 23 | v 0.697816 -0.000000 7.070768 24 | v 0.604327 0.348908 7.785615 25 | v 0.604327 0.348908 7.070768 26 | v 0.348909 0.604326 7.785615 27 | v 0.348909 0.604326 7.070768 28 | v -0.000000 0.327608 9.690504 29 | v -0.163804 0.283717 9.690504 30 | v -0.283717 0.163804 9.690504 31 | v -0.327608 0.000000 9.690504 32 | v -0.283717 -0.163804 9.690504 33 | v -0.163804 -0.283717 9.690504 34 | v -0.000000 -0.327608 9.690504 35 | v 0.163804 -0.283717 9.690504 36 | v 0.283717 -0.163804 9.690504 37 | v 0.327608 -0.000000 9.690504 38 | v 0.283717 0.163804 9.690504 39 | v 0.163804 0.283717 9.690504 40 | v -0.221429 0.383526 5.735177 41 | v -0.000000 0.442858 5.735177 42 | v -0.383526 0.221429 5.735177 43 | v -0.442858 -0.000000 5.735177 44 | v -0.383526 -0.221429 5.735177 45 | v -0.221429 -0.383526 5.735177 46 | v -0.000000 -0.442858 5.735177 47 | v 0.221429 -0.383526 5.735177 48 | v 0.383526 -0.221429 5.735177 49 | v 0.442858 -0.000000 5.735177 50 | v 0.383526 0.221429 5.735177 51 | v 0.221429 0.383526 5.735177 52 | v 0.000000 0.697816 7.461451 53 | v 0.000000 0.697816 7.394933 54 | v -0.348908 0.604327 7.394933 55 | v -0.348908 0.604327 7.461451 56 | v -0.604327 0.348908 7.394933 57 | v -0.604327 0.348908 7.461451 58 | v -0.697816 -0.000000 7.394933 59 | v -0.697816 -0.000000 7.461451 60 | v -0.604327 -0.348908 7.394933 61 | v -0.604327 -0.348908 7.461451 62 | v -0.348908 -0.604327 7.394933 63 | v -0.348908 -0.604327 7.461451 64 | v -0.000000 -0.697816 7.394933 65 | v -0.000000 -0.697816 7.461451 66 | v 0.348908 -0.604327 7.394933 67 | v 0.348908 -0.604327 7.461451 68 | v 0.604327 -0.348908 7.394933 69 | v 0.604327 -0.348908 7.461451 70 | v 0.697816 -0.000000 7.394933 71 | v 0.697816 -0.000000 7.461451 72 | v 0.604327 0.348908 7.394933 73 | v 0.604327 0.348908 7.461451 74 | v 0.348909 0.604326 7.394933 75 | v 0.348909 0.604326 7.461451 76 | v 0.000000 0.734628 7.463205 77 | v 0.000000 0.734628 7.393178 78 | v -0.367314 0.636207 7.393178 79 | v -0.367314 0.636207 7.463205 80 | v -0.636207 0.367314 7.393178 81 | v -0.636207 0.367314 7.463205 82 | v -0.734628 -0.000000 7.393178 83 | v -0.734628 -0.000000 7.463205 84 | v -0.636207 -0.367314 7.393178 85 | v -0.636207 -0.367314 7.463205 86 | v -0.367314 -0.636207 7.393178 87 | v -0.367314 -0.636207 7.463205 88 | v -0.000000 -0.734628 7.393178 89 | v -0.000000 -0.734628 7.463205 90 | v 0.367314 -0.636207 7.393178 91 | v 0.367314 -0.636207 7.463205 92 | v 0.636207 -0.367314 7.393178 93 | v 0.636207 -0.367314 7.463205 94 | v 0.734628 -0.000000 7.393178 95 | v 0.734628 -0.000000 7.463205 96 | v 0.636207 0.367314 7.393178 97 | v 0.636207 0.367314 7.463205 98 | v 0.367315 0.636207 7.393178 99 | v 0.367315 0.636207 7.463205 100 | v -0.000000 0.363888 9.690504 101 | v -0.181944 0.315137 9.690504 102 | v -0.315137 0.181944 9.690504 103 | v -0.363889 0.000000 9.690504 104 | v -0.315137 -0.181944 9.690504 105 | v -0.181944 -0.315137 9.690504 106 | v -0.000000 -0.363888 9.690504 107 | v 0.181944 -0.315137 9.690504 108 | v 0.315136 -0.181944 9.690504 109 | v 0.363888 -0.000000 9.690504 110 | v 0.315137 0.181944 9.690504 111 | v 0.181944 0.315137 9.690504 112 | v -0.000000 0.235831 9.902461 113 | v -0.117916 0.204236 9.902461 114 | v -0.204236 0.117916 9.902461 115 | v -0.235831 0.000000 9.902461 116 | v -0.204236 -0.117915 9.902461 117 | v -0.117916 -0.204236 9.902461 118 | v -0.000000 -0.235831 9.902461 119 | v 0.117915 -0.204236 9.902461 120 | v 0.204236 -0.117916 9.902461 121 | v 0.235831 -0.000000 9.902461 122 | v 0.204236 0.117916 9.902461 123 | v 0.117916 0.204236 9.902461 124 | v -0.000000 0.085366 10.137303 125 | v -0.042683 0.073929 10.137303 126 | v -0.073929 0.042683 10.137303 127 | v -0.085366 0.000000 10.137303 128 | v -0.073929 -0.042683 10.137303 129 | v -0.042683 -0.073929 10.137303 130 | v -0.000000 -0.085366 10.137303 131 | v 0.042683 -0.073929 10.137303 132 | v 0.073929 -0.042683 10.137303 133 | v 0.085366 0.000000 10.137303 134 | v 0.073929 0.042683 10.137303 135 | v 0.042683 0.073929 10.137303 136 | v 0.556831 0.389644 7.956751 137 | v 0.389645 0.556831 7.956751 138 | v 0.243526 0.303745 9.519367 139 | v 0.303745 0.243525 9.519367 140 | v 0.615857 -0.287407 7.956751 141 | v 0.677052 -0.059027 7.956751 142 | v 0.384813 -0.059027 9.519368 143 | v 0.362772 -0.141288 9.519367 144 | v 0.059027 -0.677052 7.956751 145 | v 0.287407 -0.615858 7.956751 146 | v 0.141288 -0.362772 9.519368 147 | v 0.059027 -0.384814 9.519367 148 | v -0.556831 -0.389645 7.956751 149 | v -0.389645 -0.556831 7.956751 150 | v -0.243526 -0.303745 9.519367 151 | v -0.303745 -0.243525 9.519368 152 | v -0.059027 0.677052 7.956751 153 | v -0.287407 0.615858 7.956751 154 | v -0.141288 0.362772 9.519368 155 | v -0.059027 0.384814 9.519368 156 | v -0.615858 0.287407 7.956751 157 | v -0.677052 0.059027 7.956751 158 | v -0.384814 0.059027 9.519367 159 | v -0.362772 0.141288 9.519368 160 | v 0.518500 0.362822 8.010534 161 | v 0.362823 0.518500 8.010534 162 | v 0.282836 0.226762 9.465584 163 | v 0.226762 0.282836 9.465584 164 | v 0.573463 -0.267623 8.010534 165 | v 0.630445 -0.054964 8.010534 166 | v 0.337799 -0.131562 9.465584 167 | v 0.358324 -0.054964 9.465585 168 | v 0.054963 -0.630445 8.010534 169 | v 0.267623 -0.573464 8.010534 170 | v 0.054963 -0.358324 9.465584 171 | v 0.131562 -0.337799 9.465585 172 | v -0.518500 -0.362823 8.010534 173 | v -0.362823 -0.518500 8.010534 174 | v -0.282836 -0.226762 9.465585 175 | v -0.226762 -0.282836 9.465584 176 | v -0.054964 0.630445 8.010534 177 | v -0.267623 0.573463 8.010534 178 | v -0.054964 0.358324 9.465585 179 | v -0.131562 0.337799 9.465585 180 | v -0.573463 0.267623 8.010534 181 | v -0.630445 0.054964 8.010534 182 | v -0.337799 0.131562 9.465585 183 | v -0.358324 0.054964 9.465584 184 | v -0.221429 0.383526 5.176741 185 | v -0.000000 0.442858 5.176741 186 | v -0.383526 0.221429 5.176741 187 | v -0.442858 -0.000000 5.176741 188 | v -0.383526 -0.221429 5.176741 189 | v -0.221429 -0.383526 5.176741 190 | v -0.000000 -0.442858 5.176741 191 | v 0.221429 -0.383526 5.176741 192 | v 0.383526 -0.221429 5.176741 193 | v 0.442858 -0.000000 5.176741 194 | v 0.383526 0.221429 5.176741 195 | v 0.221429 0.383526 5.176741 196 | v 0.028157 0.424854 5.391716 197 | v -0.026854 0.613823 5.391716 198 | v 0.028157 0.424854 5.751783 199 | v 0.019024 0.456226 5.751783 200 | v -0.233933 0.348558 5.391716 201 | v -0.288943 0.537527 5.391716 202 | v -0.233933 0.348558 5.751783 203 | v -0.243066 0.379930 5.751783 204 | v -0.351097 0.229944 5.391716 205 | v -0.540498 0.283446 5.391716 206 | v -0.351097 0.229944 5.751783 207 | v -0.382541 0.238826 5.751783 208 | v -0.425302 -0.032746 5.391716 209 | v -0.614703 0.020756 5.391716 210 | v -0.425302 -0.032746 5.751783 211 | v -0.456746 -0.023864 5.751783 212 | v -0.375433 -0.184078 5.391716 213 | v -0.514531 -0.323316 5.391716 214 | v -0.375433 -0.184078 5.751783 215 | v -0.398525 -0.207194 5.751783 216 | v -0.182317 -0.377000 5.391716 217 | v -0.321415 -0.516238 5.391716 218 | v -0.182317 -0.377000 5.751783 219 | v -0.205410 -0.400116 5.751783 220 | v -0.030980 -0.417543 5.391716 221 | v 0.019642 -0.607735 5.391716 222 | v -0.030980 -0.417543 5.751783 223 | v -0.022576 -0.449118 5.751783 224 | v 0.232805 -0.347333 5.391716 225 | v 0.283427 -0.537525 5.391716 226 | v 0.232805 -0.347333 5.751783 227 | v 0.241209 -0.378908 5.751783 228 | v 0.346206 -0.232894 5.391716 229 | v 0.536143 -0.284465 5.391716 230 | v 0.346206 -0.232894 5.751783 231 | v 0.377739 -0.241455 5.751783 232 | v 0.417733 0.030538 5.391716 233 | v 0.607669 -0.021033 5.391716 234 | v 0.417733 0.030538 5.751783 235 | v 0.449265 0.021976 5.751783 236 | v 0.383186 0.188242 5.391716 237 | v 0.519962 0.329760 5.391716 238 | v 0.383186 0.188242 5.751783 239 | v 0.405893 0.211736 5.751783 240 | v 0.186907 0.377944 5.391716 241 | v 0.323683 0.519462 5.391716 242 | v 0.186907 0.377944 5.751783 243 | v 0.209614 0.401438 5.751783 244 | vt 0.576960 0.692891 245 | vt 0.576960 0.697875 246 | vt 0.574468 0.697875 247 | vt 0.574468 0.692891 248 | vt 0.571976 0.697875 249 | vt 0.571976 0.692891 250 | vt 0.569484 0.697875 251 | vt 0.569484 0.692891 252 | vt 0.566992 0.697875 253 | vt 0.566992 0.692891 254 | vt 0.564500 0.697875 255 | vt 0.564500 0.692891 256 | vt 0.562008 0.697875 257 | vt 0.562008 0.692891 258 | vt 0.559516 0.697875 259 | vt 0.559516 0.692891 260 | vt 0.557024 0.697875 261 | vt 0.557024 0.692891 262 | vt 0.554532 0.697875 263 | vt 0.554532 0.692891 264 | vt 0.552040 0.697875 265 | vt 0.552040 0.692891 266 | vt 0.559516 0.697875 267 | vt 0.557024 0.697875 268 | vt 0.549548 0.697875 269 | vt 0.549548 0.692891 270 | vt 0.547056 0.697875 271 | vt 0.547056 0.692891 272 | vt 0.556292 0.682923 273 | vt 0.556597 0.682923 274 | vt 0.556597 0.682923 275 | vt 0.556292 0.682923 276 | vt 0.575945 0.675447 277 | vt 0.575080 0.672216 278 | vt 0.575080 0.672216 279 | vt 0.575945 0.675447 280 | vt 0.574468 0.682923 281 | vt 0.571976 0.682923 282 | vt 0.571976 0.682923 283 | vt 0.574468 0.682923 284 | vt 0.554532 0.682923 285 | vt 0.552040 0.682923 286 | vt 0.552040 0.682923 287 | vt 0.554532 0.682923 288 | vt 0.561581 0.682923 289 | vt 0.559943 0.682923 290 | vt 0.559943 0.682923 291 | vt 0.561581 0.682923 292 | vt 0.559516 0.682923 293 | vt 0.557024 0.682923 294 | vt 0.557024 0.682923 295 | vt 0.559516 0.682923 296 | vt 0.551308 0.682923 297 | vt 0.551612 0.682923 298 | vt 0.551612 0.682923 299 | vt 0.551308 0.682923 300 | vt 0.564500 0.682923 301 | vt 0.562008 0.682923 302 | vt 0.562008 0.682923 303 | vt 0.564500 0.682923 304 | vt 0.554959 0.682923 305 | vt 0.554959 0.682923 306 | vt 0.569484 0.682923 307 | vt 0.566992 0.682923 308 | vt 0.566992 0.682923 309 | vt 0.569484 0.682923 310 | vt 0.549548 0.682923 311 | vt 0.547056 0.682923 312 | vt 0.547056 0.682923 313 | vt 0.549548 0.682923 314 | vt 0.549975 0.682923 315 | vt 0.549975 0.682923 316 | vt 0.570216 0.682923 317 | vt 0.571244 0.682923 318 | vt 0.571244 0.682923 319 | vt 0.570216 0.682923 320 | vt 0.549548 0.697875 321 | vt 0.552040 0.697875 322 | vt 0.552040 0.697875 323 | vt 0.549548 0.697875 324 | vt 0.562008 0.697875 325 | vt 0.564500 0.697875 326 | vt 0.566992 0.697875 327 | vt 0.569484 0.697875 328 | vt 0.547056 0.697875 329 | vt 0.576960 0.697875 330 | vt 0.574468 0.697875 331 | vt 0.571976 0.697875 332 | vt 0.554532 0.697875 333 | vt 0.549548 0.687907 334 | vt 0.547056 0.687907 335 | vt 0.569484 0.687907 336 | vt 0.571976 0.687907 337 | vt 0.571976 0.687907 338 | vt 0.569484 0.687907 339 | vt 0.552040 0.687907 340 | vt 0.549548 0.692891 341 | vt 0.552040 0.692891 342 | vt 0.554532 0.687907 343 | vt 0.559516 0.687907 344 | vt 0.562008 0.687907 345 | vt 0.562008 0.687907 346 | vt 0.559516 0.687907 347 | vt 0.557024 0.687907 348 | vt 0.566992 0.692891 349 | vt 0.569484 0.692891 350 | vt 0.552040 0.687907 351 | vt 0.549548 0.687907 352 | vt 0.557024 0.692891 353 | vt 0.559516 0.692891 354 | vt 0.564500 0.687907 355 | vt 0.566992 0.687907 356 | vt 0.566992 0.687907 357 | vt 0.547056 0.692891 358 | vt 0.574468 0.692891 359 | vt 0.576960 0.692891 360 | vt 0.557024 0.687907 361 | vt 0.574468 0.687907 362 | vt 0.564500 0.692891 363 | vt 0.576960 0.682923 364 | vt 0.576960 0.687907 365 | vt 0.547056 0.687907 366 | vt 0.554532 0.687907 367 | vt 0.554532 0.692891 368 | vt 0.562008 0.692891 369 | vt 0.564500 0.687907 370 | vt 0.571976 0.692891 371 | vt 0.574468 0.687907 372 | vt 0.576960 0.687907 373 | vt 0.572715 0.681043 374 | vt 0.569484 0.681909 375 | vt 0.569484 0.682624 376 | vt 0.573072 0.681663 377 | vt 0.575080 0.678678 378 | vt 0.575699 0.679036 379 | vt 0.576661 0.675447 380 | vt 0.575699 0.671859 381 | vt 0.572715 0.669851 382 | vt 0.573072 0.669232 383 | vt 0.569484 0.668986 384 | vt 0.569484 0.668270 385 | vt 0.566253 0.669851 386 | vt 0.565895 0.669232 387 | vt 0.563888 0.672216 388 | vt 0.563268 0.671859 389 | vt 0.563022 0.675447 390 | vt 0.562307 0.675447 391 | vt 0.563888 0.678678 392 | vt 0.563268 0.679036 393 | vt 0.566253 0.681043 394 | vt 0.565895 0.681663 395 | vt 0.563888 0.678678 396 | vt 0.566253 0.681043 397 | vt 0.566253 0.681043 398 | vt 0.563888 0.678678 399 | vt 0.572715 0.681043 400 | vt 0.569484 0.681909 401 | vt 0.563888 0.672216 402 | vt 0.566253 0.669851 403 | vt 0.572715 0.669851 404 | vt 0.575080 0.678678 405 | vt 0.563022 0.675447 406 | vt 0.569484 0.668986 407 | vt 0.569484 0.681909 408 | vt 0.572715 0.681043 409 | vt 0.575080 0.678678 410 | vt 0.575945 0.675447 411 | vt 0.575080 0.672216 412 | vt 0.572715 0.669851 413 | vt 0.569484 0.668986 414 | vt 0.566253 0.669851 415 | vt 0.563888 0.672216 416 | vt 0.563022 0.675447 417 | vt 0.550279 0.682923 418 | vt 0.555264 0.682923 419 | vt 0.560248 0.682923 420 | vt 0.561276 0.682923 421 | vt 0.564927 0.682923 422 | vt 0.566565 0.682923 423 | vt 0.565232 0.682923 424 | vt 0.566260 0.682923 425 | vt 0.574895 0.682923 426 | vt 0.576533 0.682923 427 | vt 0.575200 0.682923 428 | vt 0.576960 0.682923 429 | vt 0.576228 0.682923 430 | vt 0.569911 0.682923 431 | vt 0.571549 0.682923 432 | vt 0.550279 0.682923 433 | vt 0.555264 0.682923 434 | vt 0.560248 0.682923 435 | vt 0.561276 0.682923 436 | vt 0.566565 0.682923 437 | vt 0.564927 0.682923 438 | vt 0.565232 0.682923 439 | vt 0.566260 0.682923 440 | vt 0.576533 0.682923 441 | vt 0.574895 0.682923 442 | vt 0.575200 0.682923 443 | vt 0.576228 0.682923 444 | vt 0.571549 0.682923 445 | vt 0.569911 0.682923 446 | vt 0.558120 0.681663 447 | vt 0.554532 0.682624 448 | vt 0.550943 0.681663 449 | vt 0.548316 0.679036 450 | vt 0.547355 0.675447 451 | vt 0.548316 0.671859 452 | vt 0.550943 0.669232 453 | vt 0.554532 0.668270 454 | vt 0.558120 0.669232 455 | vt 0.560747 0.671859 456 | vt 0.561709 0.675447 457 | vt 0.560747 0.679036 458 | vt 0.576960 0.697875 459 | vt 0.574468 0.697875 460 | vt 0.559516 0.697875 461 | vt 0.557024 0.697875 462 | vt 0.566992 0.697875 463 | vt 0.564500 0.697875 464 | vt 0.547056 0.697875 465 | vt 0.571976 0.697875 466 | vt 0.554532 0.697875 467 | vt 0.562008 0.697875 468 | vt 0.569484 0.697875 469 | vt 0.558270 0.667971 470 | vt 0.565746 0.667971 471 | vt 0.565746 0.675447 472 | vt 0.558270 0.675447 473 | vt 0.565746 0.682923 474 | vt 0.558270 0.682923 475 | vt 0.565746 0.690399 476 | vt 0.558270 0.690399 477 | vt 0.565746 0.697875 478 | vt 0.558270 0.697875 479 | vt 0.550794 0.682923 480 | vt 0.550794 0.690399 481 | vt 0.573222 0.682923 482 | vt 0.573222 0.690399 483 | vt 0.558270 0.667971 484 | vt 0.565746 0.667971 485 | vt 0.565746 0.675447 486 | vt 0.558270 0.675447 487 | vt 0.565746 0.682923 488 | vt 0.558270 0.682923 489 | vt 0.565746 0.690399 490 | vt 0.558270 0.690399 491 | vt 0.565746 0.697875 492 | vt 0.558270 0.697875 493 | vt 0.550794 0.682923 494 | vt 0.550794 0.690399 495 | vt 0.573222 0.682923 496 | vt 0.573222 0.690399 497 | vt 0.558270 0.667971 498 | vt 0.565746 0.667971 499 | vt 0.565746 0.675447 500 | vt 0.558270 0.675447 501 | vt 0.565746 0.682923 502 | vt 0.558270 0.682923 503 | vt 0.565746 0.690399 504 | vt 0.558270 0.690399 505 | vt 0.565746 0.697875 506 | vt 0.558270 0.697875 507 | vt 0.550794 0.682923 508 | vt 0.550794 0.690399 509 | vt 0.573222 0.682923 510 | vt 0.573222 0.690399 511 | vt 0.558270 0.667971 512 | vt 0.565746 0.667971 513 | vt 0.565746 0.675447 514 | vt 0.558270 0.675447 515 | vt 0.565746 0.682923 516 | vt 0.558270 0.682923 517 | vt 0.565746 0.690399 518 | vt 0.558270 0.690399 519 | vt 0.565746 0.697875 520 | vt 0.558270 0.697875 521 | vt 0.550794 0.682923 522 | vt 0.550794 0.690399 523 | vt 0.573222 0.682923 524 | vt 0.573222 0.690399 525 | vt 0.558270 0.667971 526 | vt 0.565746 0.667971 527 | vt 0.565746 0.675447 528 | vt 0.558270 0.675447 529 | vt 0.565746 0.682923 530 | vt 0.558270 0.682923 531 | vt 0.565746 0.690399 532 | vt 0.558270 0.690399 533 | vt 0.565746 0.697875 534 | vt 0.558270 0.697875 535 | vt 0.550794 0.682923 536 | vt 0.550794 0.690399 537 | vt 0.573222 0.682923 538 | vt 0.573222 0.690399 539 | vt 0.558270 0.667971 540 | vt 0.565746 0.667971 541 | vt 0.565746 0.675447 542 | vt 0.558270 0.675447 543 | vt 0.565746 0.682923 544 | vt 0.558270 0.682923 545 | vt 0.565746 0.690399 546 | vt 0.558270 0.690399 547 | vt 0.565746 0.697875 548 | vt 0.558270 0.697875 549 | vt 0.550794 0.682923 550 | vt 0.550794 0.690399 551 | vt 0.573222 0.682923 552 | vt 0.573222 0.690399 553 | vn -0.2588 0.9659 0.0000 554 | vn -0.7071 0.7071 0.0000 555 | vn -0.9659 0.2588 -0.0000 556 | vn -0.9659 -0.2588 0.0000 557 | vn -0.7071 -0.7071 0.0000 558 | vn -0.2588 -0.9659 0.0000 559 | vn 0.2588 -0.9659 0.0000 560 | vn 0.7071 -0.7071 0.0000 561 | vn 0.9659 -0.2588 0.0000 562 | vn 0.9659 0.2588 -0.0000 563 | vn 0.6954 -0.6954 -0.1813 564 | vn 0.7071 0.7071 0.0000 565 | vn 0.2588 0.9659 0.0000 566 | vn 0.4012 0.9158 -0.0207 567 | vn -0.8911 -0.2388 0.3859 568 | vn -0.6972 0.6972 0.1670 569 | vn 0.9524 0.2552 0.1670 570 | vn 0.1966 -0.7336 0.6505 571 | vn 0.6972 -0.6972 0.1670 572 | vn -0.5925 0.8053 -0.0207 573 | vn -0.2552 -0.9524 0.1670 574 | vn 0.7336 -0.1966 0.6505 575 | vn -0.9524 -0.2552 0.1670 576 | vn 0.2552 0.9524 0.1670 577 | vn 0.5370 0.5370 0.6505 578 | vn -0.8656 0.2319 -0.4438 579 | vn 0.2545 -0.9499 -0.1813 580 | vn -0.2545 -0.9499 -0.1813 581 | vn -0.6954 -0.6954 -0.1813 582 | vn -0.9499 -0.2545 -0.1813 583 | vn 0.2545 0.9499 -0.1813 584 | vn -0.2545 0.9499 -0.1813 585 | vn -0.9499 0.2545 -0.1813 586 | vn 0.6954 0.6954 -0.1813 587 | vn -0.6954 0.6954 -0.1813 588 | vn 0.9499 0.2545 -0.1813 589 | vn 0.9499 -0.2545 -0.1813 590 | vn 0.0476 -0.0128 0.9988 591 | vn -0.0349 -0.0349 -0.9988 592 | vn -0.0128 0.0476 0.9988 593 | vn 0.0476 0.0128 -0.9988 594 | vn -0.0348 -0.0348 0.9988 595 | vn -0.0349 0.0348 -0.9988 596 | vn 0.0476 0.0128 0.9988 597 | vn -0.0128 -0.0476 -0.9988 598 | vn 0.0128 -0.0476 -0.9988 599 | vn -0.0349 0.0349 0.9988 600 | vn 0.0349 0.0348 -0.9988 601 | vn -0.0128 -0.0476 0.9988 602 | vn -0.0127 0.0476 -0.9988 603 | vn -0.0476 -0.0128 0.9988 604 | vn 0.0476 -0.0128 -0.9988 605 | vn 0.0128 0.0476 0.9988 606 | vn -0.0476 -0.0128 -0.9988 607 | vn 0.0348 -0.0348 0.9988 608 | vn 0.0128 0.0476 -0.9988 609 | vn -0.0476 0.0128 0.9988 610 | vn 0.0348 -0.0349 -0.9988 611 | vn 0.0349 0.0349 0.9988 612 | vn -0.0476 0.0128 -0.9988 613 | vn 0.0128 -0.0476 0.9988 614 | vn 0.0000 0.0000 1.0000 615 | vn 0.6013 0.6013 0.5262 616 | vn 0.6523 0.6523 0.3859 617 | vn -0.2388 0.8911 0.3859 618 | vn 0.6523 -0.6523 0.3859 619 | vn -0.6523 -0.6523 0.3859 620 | vn 0.2388 0.8911 0.3859 621 | vn -0.6523 0.6523 0.3859 622 | vn 0.8911 -0.2388 0.3859 623 | vn -0.2388 -0.8911 0.3859 624 | vn -0.8911 0.2388 0.3859 625 | vn 0.8911 0.2388 0.3859 626 | vn 0.2388 -0.8911 0.3859 627 | vn -0.2201 0.8214 0.5262 628 | vn 0.6013 -0.6013 0.5262 629 | vn -0.6013 -0.6013 0.5262 630 | vn 0.2201 0.8214 0.5262 631 | vn -0.6013 0.6013 0.5263 632 | vn 0.8214 -0.2201 0.5262 633 | vn -0.2201 -0.8214 0.5262 634 | vn -0.8214 0.2201 0.5262 635 | vn 0.8214 0.2201 0.5262 636 | vn 0.2201 -0.8214 0.5262 637 | vn -0.8214 -0.2201 0.5263 638 | vn 0.7068 0.7068 0.0279 639 | vn 0.4909 0.8529 0.1777 640 | vn 0.6924 0.6924 0.2031 641 | vn 0.8529 0.4909 0.1777 642 | vn 0.9655 -0.2587 0.0279 643 | vn 0.9841 0.0013 0.1777 644 | vn 0.9458 -0.2534 0.2031 645 | vn 0.8516 -0.4932 0.1777 646 | vn 0.2587 -0.9655 0.0279 647 | vn 0.4932 -0.8516 0.1777 648 | vn 0.2534 -0.9458 0.2031 649 | vn -0.0013 -0.9841 0.1777 650 | vn -0.7068 -0.7068 0.0279 651 | vn -0.4909 -0.8529 0.1777 652 | vn -0.6924 -0.6924 0.2031 653 | vn -0.8529 -0.4909 0.1777 654 | vn -0.2587 0.9655 0.0279 655 | vn -0.4932 0.8516 0.1777 656 | vn -0.2534 0.9458 0.2031 657 | vn 0.0013 0.9841 0.1777 658 | vn -0.9655 0.2587 0.0279 659 | vn -0.9841 -0.0013 0.1777 660 | vn -0.9458 0.2534 0.2031 661 | vn -0.8516 0.4932 0.1777 662 | vn 0.6958 0.6958 0.1778 663 | vn 0.9505 -0.2547 0.1778 664 | vn 0.2547 -0.9505 0.1778 665 | vn -0.6958 -0.6958 0.1778 666 | vn -0.2547 0.9505 0.1778 667 | vn -0.9505 0.2547 0.1778 668 | vn -0.5370 -0.5370 0.6505 669 | vn 0.8053 -0.5925 -0.0207 670 | vn 0.9937 0.1105 -0.0207 671 | vn -0.1966 0.7336 0.6505 672 | vn -0.1105 -0.9937 -0.0207 673 | vn 0.5925 -0.8053 -0.0207 674 | vn -0.7336 0.1966 0.6505 675 | vn 0.6336 0.6336 -0.4438 676 | vn -0.9158 -0.4012 -0.0207 677 | vn -0.9937 -0.1105 -0.0207 678 | vn 0.8656 -0.2319 -0.4438 679 | vn -0.8053 0.5925 -0.0207 680 | vn -0.4012 -0.9158 -0.0207 681 | vn 0.2319 -0.8656 -0.4438 682 | vn 0.9158 0.4012 -0.0207 683 | vn -0.6336 -0.6336 -0.4438 684 | vn 0.1105 0.9937 -0.0207 685 | vn -0.2319 0.8656 -0.4438 686 | vn 0.0000 0.0000 -1.0000 687 | vn 0.9601 0.2795 -0.0000 688 | vn -0.9601 -0.2795 -0.0000 689 | vn 0.2795 -0.9601 0.0000 690 | vn -0.2543 0.8737 0.4148 691 | vn 0.2718 0.9623 -0.0000 692 | vn -0.2718 -0.9623 0.0000 693 | vn 0.9623 -0.2718 0.0000 694 | vn -0.8757 0.2474 0.4148 695 | vn -0.7075 0.7068 -0.0000 696 | vn 0.7075 -0.7068 0.0000 697 | vn 0.7068 0.7075 0.0000 698 | vn -0.6431 -0.6437 0.4148 699 | vn -0.9664 -0.2572 -0.0000 700 | vn 0.9664 0.2572 -0.0000 701 | vn -0.2572 0.9664 0.0000 702 | vn 0.2340 -0.8793 0.4148 703 | vn -0.2620 -0.9651 -0.0000 704 | vn 0.2620 0.9651 0.0000 705 | vn -0.9651 0.2620 0.0000 706 | vn 0.8781 -0.2384 0.4148 707 | vn 0.7191 -0.6950 -0.0000 708 | vn -0.7191 0.6950 0.0000 709 | vn -0.6950 -0.7191 0.0000 710 | vn 0.6324 0.6543 0.4148 711 | usemtl Material.002 712 | s off 713 | f 50/1/1 2/2/1 4/3/1 51/4/1 714 | f 51/4/2 4/3/2 6/5/2 53/6/2 715 | f 53/6/3 6/5/3 8/7/3 55/8/3 716 | f 55/8/4 8/7/4 10/9/4 57/10/4 717 | f 57/10/5 10/9/5 12/11/5 59/12/5 718 | f 59/12/6 12/11/6 14/13/6 61/14/6 719 | f 61/14/7 14/13/7 16/15/7 63/16/7 720 | f 63/16/8 16/15/8 18/17/8 65/18/8 721 | f 65/18/9 18/17/9 20/19/9 67/20/9 722 | f 67/20/10 20/19/10 22/21/10 69/22/10 723 | f 18/17/11 16/15/11 44/23/11 45/24/11 724 | f 69/22/12 22/21/12 24/25/12 71/26/12 725 | f 71/26/13 24/25/13 2/27/13 50/28/13 726 | f 140/29/14 137/30/14 161/31/14 163/32/14 727 | f 28/33/15 29/34/15 113/35/15 112/36/15 728 | f 3/37/16 5/38/16 99/39/16 98/40/16 729 | f 19/41/17 21/42/17 107/43/17 106/44/17 730 | f 141/45/18 142/46/18 166/47/18 165/48/18 731 | f 15/49/19 17/50/19 105/51/19 104/52/19 732 | f 136/53/20 133/54/20 157/55/20 159/56/20 733 | f 11/57/21 13/58/21 103/59/21 102/60/21 734 | f 137/30/22 138/61/22 162/62/22 161/31/22 735 | f 7/63/23 9/64/23 101/65/23 100/66/23 736 | f 23/67/24 1/68/24 97/69/24 108/70/24 737 | f 133/54/25 134/71/25 158/72/25 157/55/25 738 | f 155/73/26 156/74/26 179/75/26 180/76/26 739 | f 48/77/12 47/78/12 191/79/12 192/80/12 740 | f 16/15/27 14/13/27 43/81/27 44/23/27 741 | f 14/13/28 12/11/28 42/82/28 43/81/28 742 | f 12/11/29 10/9/29 41/83/29 42/82/29 743 | f 10/9/30 8/7/30 40/84/30 41/83/30 744 | f 2/27/31 24/25/31 48/77/31 38/85/31 745 | f 4/3/32 2/2/32 38/86/32 37/87/32 746 | f 8/7/33 6/5/33 39/88/33 40/84/33 747 | f 24/25/34 22/21/34 47/78/34 48/77/34 748 | f 6/5/35 4/3/35 37/87/35 39/88/35 749 | f 22/21/36 20/19/36 46/89/36 47/78/36 750 | f 20/19/37 18/17/37 45/24/37 46/89/37 751 | f 23/67/13 72/90/13 49/91/13 1/68/13 752 | f 56/92/38 54/93/38 78/94/38 80/95/38 753 | f 21/42/12 70/96/12 72/90/12 23/67/12 754 | f 69/22/39 71/26/39 95/97/39 93/98/39 755 | f 19/41/10 68/99/10 70/96/10 21/42/10 756 | f 64/100/40 62/101/40 86/102/40 88/103/40 757 | f 17/50/9 66/104/9 68/99/9 19/41/9 758 | f 55/8/41 57/10/41 81/105/41 79/106/41 759 | f 15/49/8 64/100/8 66/104/8 17/50/8 760 | f 72/90/42 70/96/42 94/107/42 96/108/42 761 | f 13/58/7 62/101/7 64/100/7 15/49/7 762 | f 63/16/43 65/18/43 89/109/43 87/110/43 763 | f 11/57/6 60/111/6 62/101/6 13/58/6 764 | f 58/112/44 56/92/44 80/95/44 82/113/44 765 | f 9/64/5 58/112/5 60/111/5 11/57/5 766 | f 71/26/45 50/28/45 74/114/45 95/97/45 767 | f 7/63/4 56/92/4 58/112/4 9/64/4 768 | f 50/1/46 51/4/46 75/115/46 74/116/46 769 | f 5/38/3 54/93/3 56/92/3 7/63/3 770 | f 66/104/47 64/100/47 88/103/47 90/117/47 771 | f 3/37/2 52/118/2 54/93/2 5/38/2 772 | f 57/10/48 59/12/48 83/119/48 81/105/48 773 | f 1/120/1 49/121/1 52/118/1 3/37/1 774 | f 49/91/49 72/90/49 96/108/49 73/122/49 775 | f 96/108/13 95/97/13 74/114/13 73/122/13 776 | f 94/107/12 93/98/12 95/97/12 96/108/12 777 | f 92/123/10 91/124/10 93/98/10 94/107/10 778 | f 90/117/9 89/109/9 91/124/9 92/123/9 779 | f 88/103/8 87/110/8 89/109/8 90/117/8 780 | f 86/102/7 85/125/7 87/110/7 88/103/7 781 | f 84/126/6 83/119/6 85/125/6 86/102/6 782 | f 82/113/5 81/105/5 83/119/5 84/126/5 783 | f 80/95/4 79/106/4 81/105/4 82/113/4 784 | f 78/94/3 77/127/3 79/106/3 80/95/3 785 | f 76/128/2 75/115/2 77/127/2 78/94/2 786 | f 73/129/1 74/116/1 75/115/1 76/128/1 787 | f 61/14/50 63/16/50 87/110/50 85/125/50 788 | f 70/96/51 68/99/51 92/123/51 94/107/51 789 | f 53/6/52 55/8/52 79/106/52 77/127/52 790 | f 62/101/53 60/111/53 84/126/53 86/102/53 791 | f 67/20/54 69/22/54 93/98/54 91/124/54 792 | f 54/93/55 52/118/55 76/128/55 78/94/55 793 | f 59/12/56 61/14/56 85/125/56 83/119/56 794 | f 68/99/57 66/104/57 90/117/57 92/123/57 795 | f 51/4/58 53/6/58 77/127/58 75/115/58 796 | f 60/111/59 58/112/59 82/113/59 84/126/59 797 | f 65/18/60 67/20/60 91/124/60 89/109/60 798 | f 52/118/61 49/121/61 73/129/61 76/128/61 799 | f 26/130/62 25/131/62 97/132/62 98/133/62 800 | f 27/134/62 26/130/62 98/133/62 99/135/62 801 | f 28/33/62 27/134/62 99/135/62 100/136/62 802 | f 29/34/62 28/33/62 100/136/62 101/137/62 803 | f 30/138/62 29/34/62 101/137/62 102/139/62 804 | f 31/140/62 30/138/62 102/139/62 103/141/62 805 | f 32/142/62 31/140/62 103/141/62 104/143/62 806 | f 33/144/62 32/142/62 104/143/62 105/145/62 807 | f 34/146/62 33/144/62 105/145/62 106/147/62 808 | f 35/148/62 34/146/62 106/147/62 107/149/62 809 | f 36/150/62 35/148/62 107/149/62 108/151/62 810 | f 25/131/62 36/150/62 108/151/62 97/132/62 811 | f 119/152/63 120/153/63 132/154/63 131/155/63 812 | f 35/148/64 36/150/64 120/153/64 119/152/64 813 | f 25/131/65 26/130/65 110/156/65 109/157/65 814 | f 32/142/66 33/144/66 117/158/66 116/159/66 815 | f 29/34/67 30/138/67 114/160/67 113/35/67 816 | f 36/150/68 25/131/68 109/157/68 120/153/68 817 | f 26/130/69 27/134/69 111/161/69 110/156/69 818 | f 33/144/70 34/146/70 118/162/70 117/158/70 819 | f 30/138/71 31/140/71 115/163/71 114/160/71 820 | f 27/134/72 28/33/72 112/36/72 111/161/72 821 | f 34/146/73 35/148/73 119/152/73 118/162/73 822 | f 31/140/74 32/142/74 116/159/74 115/163/74 823 | f 121/164/62 122/165/62 123/166/62 124/167/62 125/168/62 126/169/62 127/170/62 128/171/62 129/172/62 130/173/62 131/155/62 132/154/62 824 | f 109/157/75 110/156/75 122/165/75 121/164/75 825 | f 116/159/76 117/158/76 129/172/76 128/171/76 826 | f 113/35/77 114/160/77 126/169/77 125/168/77 827 | f 120/153/78 109/157/78 121/164/78 132/154/78 828 | f 110/156/79 111/161/79 123/166/79 122/165/79 829 | f 117/158/80 118/162/80 130/173/80 129/172/80 830 | f 114/160/81 115/163/81 127/170/81 126/169/81 831 | f 111/161/82 112/36/82 124/167/82 123/166/82 832 | f 118/162/83 119/152/83 131/155/83 130/173/83 833 | f 115/163/84 116/159/84 128/171/84 127/170/84 834 | f 112/36/85 113/35/85 125/168/85 124/167/85 835 | f 21/42/86 23/67/86 134/71/86 133/54/86 836 | f 23/67/87 108/70/87 135/174/87 134/71/87 837 | f 108/70/88 107/43/88 136/53/88 135/174/88 838 | f 107/43/89 21/42/89 133/54/89 136/53/89 839 | f 17/50/90 19/41/90 138/61/90 137/30/90 840 | f 19/41/91 106/44/91 139/175/91 138/61/91 841 | f 106/44/92 105/51/92 140/29/92 139/175/92 842 | f 105/51/93 17/50/93 137/30/93 140/29/93 843 | f 13/58/94 15/49/94 142/46/94 141/45/94 844 | f 15/49/95 104/52/95 143/176/95 142/46/95 845 | f 104/52/96 103/59/96 144/177/96 143/176/96 846 | f 103/59/97 13/58/97 141/45/97 144/177/97 847 | f 9/64/98 11/57/98 146/178/98 145/179/98 848 | f 11/57/99 102/60/99 147/180/99 146/178/99 849 | f 102/60/100 101/65/100 148/181/100 147/180/100 850 | f 101/65/101 9/64/101 145/179/101 148/181/101 851 | f 1/120/102 3/37/102 150/182/102 149/183/102 852 | f 3/37/103 98/40/103 151/184/103 150/182/103 853 | f 98/40/104 97/185/104 152/186/104 151/184/104 854 | f 97/185/105 1/120/105 149/183/105 152/186/105 855 | f 5/38/106 7/63/106 154/187/106 153/188/106 856 | f 7/63/107 100/66/107 155/73/107 154/187/107 857 | f 100/66/108 99/39/108 156/74/108 155/73/108 858 | f 99/39/109 5/38/109 153/188/109 156/74/109 859 | f 157/55/110 158/72/110 160/189/110 159/56/110 860 | f 161/31/111 162/62/111 164/190/111 163/32/111 861 | f 165/48/112 166/47/112 168/191/112 167/192/112 862 | f 169/193/113 170/194/113 172/195/113 171/196/113 863 | f 173/197/114 174/198/114 176/199/114 175/200/114 864 | f 177/201/115 178/202/115 180/76/115 179/75/115 865 | f 145/179/116 146/178/116 170/194/116 169/193/116 866 | f 134/71/117 135/174/117 160/189/117 158/72/117 867 | f 144/177/118 141/45/118 165/48/118 167/192/118 868 | f 149/183/119 150/182/119 174/198/119 173/197/119 869 | f 138/61/120 139/175/120 164/190/120 162/62/120 870 | f 148/181/121 145/179/121 169/193/121 171/196/121 871 | f 153/188/122 154/187/122 178/202/122 177/201/122 872 | f 135/174/123 136/53/123 159/56/123 160/189/123 873 | f 142/46/124 143/176/124 168/191/124 166/47/124 874 | f 152/186/125 149/183/125 173/197/125 175/200/125 875 | f 139/175/126 140/29/126 163/32/126 164/190/126 876 | f 146/178/127 147/180/127 172/195/127 170/194/127 877 | f 156/74/128 153/188/128 177/201/128 179/75/128 878 | f 143/176/129 144/177/129 167/192/129 168/191/129 879 | f 150/182/130 151/184/130 176/199/130 174/198/130 880 | f 147/180/131 148/181/131 171/196/131 172/195/131 881 | f 154/187/132 155/73/132 180/76/132 178/202/132 882 | f 151/184/133 152/186/133 175/200/133 176/199/133 883 | f 181/203/134 182/204/134 192/205/134 191/206/134 190/207/134 189/208/134 188/209/134 187/210/134 186/211/134 185/212/134 184/213/134 183/214/134 884 | f 37/87/1 38/86/1 182/215/1 181/216/1 885 | f 45/24/8 44/23/8 188/217/8 189/218/8 886 | f 42/82/5 41/83/5 185/219/5 186/220/5 887 | f 38/85/13 48/77/13 192/80/13 182/221/13 888 | f 39/88/2 37/87/2 181/216/2 183/222/2 889 | f 46/89/9 45/24/9 189/218/9 190/223/9 890 | f 43/81/6 42/82/6 186/220/6 187/224/6 891 | f 40/84/3 39/88/3 183/222/3 184/225/3 892 | f 47/78/10 46/89/10 190/223/10 191/79/10 893 | f 44/23/7 43/81/7 187/224/7 188/217/7 894 | f 41/83/4 40/84/4 184/225/4 185/219/4 895 | f 193/226/135 194/227/135 196/228/135 195/229/135 896 | f 195/229/62 196/228/62 200/230/62 199/231/62 897 | f 199/231/136 200/230/136 198/232/136 197/233/136 898 | f 197/233/134 198/232/134 194/234/134 193/235/134 899 | f 195/236/137 199/231/137 197/233/137 193/237/137 900 | f 200/230/138 196/238/138 194/239/138 198/232/138 901 | f 201/240/139 202/241/139 204/242/139 203/243/139 902 | f 203/243/62 204/242/62 208/244/62 207/245/62 903 | f 207/245/140 208/244/140 206/246/140 205/247/140 904 | f 205/247/134 206/246/134 202/248/134 201/249/134 905 | f 203/250/141 207/245/141 205/247/141 201/251/141 906 | f 208/244/142 204/252/142 202/253/142 206/246/142 907 | f 209/254/143 210/255/143 212/256/143 211/257/143 908 | f 211/257/62 212/256/62 216/258/62 215/259/62 909 | f 215/259/144 216/258/144 214/260/144 213/261/144 910 | f 213/261/134 214/260/134 210/262/134 209/263/134 911 | f 211/264/145 215/259/145 213/261/145 209/265/145 912 | f 216/258/146 212/266/146 210/267/146 214/260/146 913 | f 217/268/147 218/269/147 220/270/147 219/271/147 914 | f 219/271/62 220/270/62 224/272/62 223/273/62 915 | f 223/273/148 224/272/148 222/274/148 221/275/148 916 | f 221/275/134 222/274/134 218/276/134 217/277/134 917 | f 219/278/149 223/273/149 221/275/149 217/279/149 918 | f 224/272/150 220/280/150 218/281/150 222/274/150 919 | f 225/282/151 226/283/151 228/284/151 227/285/151 920 | f 227/285/62 228/284/62 232/286/62 231/287/62 921 | f 231/287/152 232/286/152 230/288/152 229/289/152 922 | f 229/289/134 230/288/134 226/290/134 225/291/134 923 | f 227/292/153 231/287/153 229/289/153 225/293/153 924 | f 232/286/154 228/294/154 226/295/154 230/288/154 925 | f 233/296/155 234/297/155 236/298/155 235/299/155 926 | f 235/299/62 236/298/62 240/300/62 239/301/62 927 | f 239/301/156 240/300/156 238/302/156 237/303/156 928 | f 237/303/134 238/302/134 234/304/134 233/305/134 929 | f 235/306/157 239/301/157 237/303/157 233/307/157 930 | f 240/300/158 236/308/158 234/309/158 238/302/158 931 | -------------------------------------------------------------------------------- /assets/guns/pistol.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.92.0 OBJ File: 'gun.blend' 2 | # www.blender.org 3 | mtllib pistol.mtl 4 | v 0.281159 -0.641085 0.235150 5 | v 0.281159 0.808989 0.252819 6 | v -0.281159 -0.641085 0.235150 7 | v -0.281159 0.808989 0.252819 8 | v 0.281159 1.056346 -0.453469 9 | v 0.281159 1.047744 0.252465 10 | v -0.281159 1.047744 0.252465 11 | v -0.281159 1.056346 -0.453469 12 | v 0.281159 1.052349 2.084375 13 | v -0.281159 1.052349 2.084375 14 | v 0.281159 1.047809 1.352375 15 | v -0.281159 1.047809 1.352375 16 | v 0.240522 0.813594 2.084729 17 | v 0.281159 0.918381 2.084574 18 | v 0.269257 0.844285 2.084684 19 | v -0.281159 0.918381 2.084574 20 | v -0.240522 0.813594 2.084729 21 | v -0.269257 0.844285 2.084684 22 | v 0.281159 0.913841 1.352573 23 | v 0.240522 0.809054 1.352728 24 | v 0.281159 0.809051 1.301706 25 | v 0.269257 0.839745 1.352683 26 | v -0.240522 0.809054 1.352728 27 | v -0.281159 0.913841 1.352573 28 | v -0.281159 0.809051 1.301706 29 | v -0.269257 0.839745 1.352683 30 | v 0.349308 0.994983 -0.741068 31 | v 0.349308 1.577936 -0.741181 32 | v 0.349308 1.010869 2.244888 33 | v -0.349308 0.994983 -0.741068 34 | v -0.349308 1.577936 -0.741181 35 | v -0.349308 1.010869 2.244888 36 | v 0.349308 1.003133 0.568161 37 | v 0.349308 1.586086 0.568049 38 | v -0.349308 1.003133 0.568161 39 | v -0.349308 1.586086 0.568049 40 | v -0.349308 1.005581 1.098726 41 | v 0.349308 1.005581 1.098726 42 | v 0.349308 1.485546 2.244797 43 | v 0.307303 1.593822 2.244776 44 | v -0.307303 1.593822 2.244776 45 | v -0.349308 1.485546 2.244797 46 | v 0.307303 1.588534 1.098614 47 | v 0.349308 1.480258 1.098635 48 | v 0.349308 1.588291 1.045851 49 | v -0.349308 1.480258 1.098635 50 | v -0.307303 1.588534 1.098614 51 | v -0.349308 1.588291 1.045851 52 | v 0.349308 0.999316 -0.259222 53 | v -0.349308 1.582269 -0.259335 54 | v 0.349308 1.582269 -0.259335 55 | v -0.349308 0.999316 -0.259222 56 | v 0.349308 1.582698 -0.166424 57 | v -0.349308 0.999745 -0.166312 58 | v 0.349308 0.999745 -0.166312 59 | v -0.349308 1.582698 -0.166424 60 | v -0.311168 1.656913 -0.171839 61 | v -0.311168 1.656531 -0.254605 62 | v 0.311168 1.656531 -0.254605 63 | v 0.311168 1.656913 -0.171839 64 | v 0.349308 1.583074 -0.084816 65 | v 0.349308 1.583451 -0.003208 66 | v 0.349308 1.583827 0.078400 67 | v 0.349308 1.584204 0.160008 68 | v 0.349308 1.584580 0.241616 69 | v 0.349308 1.584957 0.323224 70 | v 0.349308 1.585333 0.404832 71 | v 0.349308 1.585710 0.486440 72 | v -0.349308 1.000121 -0.084704 73 | v -0.349308 1.000498 -0.003096 74 | v -0.349308 1.000874 0.078513 75 | v -0.349308 1.001251 0.160121 76 | v -0.349308 1.001627 0.241729 77 | v -0.349308 1.002004 0.323337 78 | v -0.349308 1.002380 0.404945 79 | v -0.349308 1.002757 0.486553 80 | v 0.349308 1.002757 0.486553 81 | v 0.349308 1.002380 0.404945 82 | v 0.349308 1.002004 0.323337 83 | v 0.349308 1.001627 0.241729 84 | v 0.349308 1.001251 0.160121 85 | v 0.349308 1.000874 0.078512 86 | v 0.349308 1.000498 -0.003096 87 | v 0.349308 1.000121 -0.084704 88 | v -0.349308 1.585710 0.486441 89 | v -0.349308 1.585333 0.404832 90 | v -0.349308 1.584957 0.323224 91 | v -0.349308 1.584580 0.241616 92 | v -0.349308 1.584204 0.160008 93 | v -0.349308 1.583827 0.078400 94 | v -0.349308 1.583451 -0.003208 95 | v -0.349308 1.583074 -0.084816 96 | v 0.363230 1.585710 0.486440 97 | v 0.363230 1.586086 0.568049 98 | v -0.363230 1.002757 0.486553 99 | v -0.363230 1.003133 0.568161 100 | v -0.363230 1.586086 0.568049 101 | v 0.363230 1.003133 0.568161 102 | v 0.363230 1.000121 -0.084704 103 | v 0.363230 0.999745 -0.166312 104 | v -0.363230 1.583074 -0.084816 105 | v -0.363230 1.582698 -0.166424 106 | v -0.363230 0.999745 -0.166312 107 | v 0.363230 1.582698 -0.166424 108 | v 0.363230 1.583074 -0.084816 109 | v 0.363230 1.583451 -0.003208 110 | v 0.363230 1.583827 0.078400 111 | v 0.363230 1.584204 0.160008 112 | v 0.363230 1.584580 0.241616 113 | v 0.363230 1.584957 0.323224 114 | v 0.363230 1.585333 0.404832 115 | v -0.363230 1.000121 -0.084704 116 | v -0.363230 1.000498 -0.003096 117 | v -0.363230 1.000874 0.078513 118 | v -0.363230 1.001251 0.160121 119 | v -0.363230 1.001627 0.241729 120 | v -0.363230 1.002004 0.323337 121 | v -0.363230 1.002380 0.404945 122 | v 0.363230 1.002757 0.486553 123 | v 0.363230 1.002380 0.404945 124 | v 0.363230 1.002004 0.323337 125 | v 0.363230 1.001627 0.241729 126 | v 0.363230 1.001251 0.160121 127 | v 0.363230 1.000874 0.078512 128 | v 0.363230 1.000498 -0.003096 129 | v -0.363230 1.585710 0.486441 130 | v -0.363230 1.585333 0.404832 131 | v -0.363230 1.584957 0.323224 132 | v -0.363230 1.584580 0.241616 133 | v -0.363230 1.584204 0.160008 134 | v -0.363230 1.583827 0.078400 135 | v -0.363230 1.583451 -0.003208 136 | v 0.190743 0.810212 0.337236 137 | v 0.190743 -0.639862 0.319567 138 | v -0.190743 -0.639862 0.319567 139 | v -0.190743 0.810212 0.337236 140 | v 0.182859 -0.632483 -0.470784 141 | v 0.281159 -0.633988 -0.347305 142 | v 0.252368 -0.632924 -0.434618 143 | v 0.281159 0.816086 -0.329636 144 | v 0.182859 0.817590 -0.453115 145 | v 0.281159 1.056309 -0.453469 146 | v 0.252367 0.817150 -0.416949 147 | v -0.281159 -0.633988 -0.347305 148 | v -0.182859 -0.632483 -0.470784 149 | v -0.252367 -0.632924 -0.434618 150 | v -0.182859 0.817590 -0.453115 151 | v -0.281159 0.816086 -0.329636 152 | v -0.281159 1.056309 -0.453469 153 | v -0.252368 0.817150 -0.416949 154 | v -0.023839 0.776983 0.509619 155 | v -0.023839 0.852288 0.508528 156 | v -0.022426 0.776116 0.449805 157 | v -0.022426 0.851422 0.448714 158 | v 0.024852 0.776995 0.510493 159 | v 0.024852 0.852301 0.509403 160 | v 0.026264 0.776129 0.450680 161 | v 0.026264 0.851435 0.449589 162 | v -0.022497 0.713606 0.453680 163 | v -0.023769 0.747097 0.507082 164 | v 0.026194 0.713619 0.454555 165 | v 0.024922 0.747109 0.507957 166 | v -0.023157 0.648537 0.482568 167 | v -0.024070 0.706538 0.520416 168 | v 0.025534 0.648550 0.483443 169 | v 0.024621 0.706551 0.521291 170 | v -0.024045 0.610903 0.520724 171 | v -0.024622 0.679998 0.544153 172 | v 0.024646 0.610916 0.521599 173 | v 0.024069 0.680010 0.545028 174 | v -0.024840 0.592804 0.554672 175 | v -0.025237 0.665323 0.570418 176 | v 0.023851 0.592816 0.555547 177 | v 0.023454 0.665336 0.571293 178 | v -0.025807 0.579796 0.595808 179 | v -0.025821 0.655107 0.595275 180 | v 0.022884 0.579809 0.596683 181 | v 0.022870 0.655119 0.596150 182 | v -0.026559 0.579883 0.627639 183 | v -0.026572 0.655194 0.627106 184 | v 0.022132 0.579896 0.628514 185 | v 0.022119 0.655206 0.627981 186 | v 0.042088 0.724084 0.767832 187 | v 0.031686 0.723875 0.753401 188 | v 0.042088 0.860689 0.765802 189 | v 0.031686 0.860480 0.751422 190 | v 0.031686 0.725853 0.890007 191 | v 0.042088 0.725630 0.874614 192 | v 0.031686 0.862459 0.888028 193 | v 0.042088 0.862237 0.872723 194 | v -0.031686 0.723875 0.753401 195 | v -0.042088 0.724084 0.767832 196 | v -0.031686 0.860480 0.751422 197 | v -0.042088 0.860689 0.765802 198 | v -0.042088 0.725630 0.874614 199 | v -0.031686 0.725853 0.890007 200 | v -0.042088 0.862237 0.872723 201 | v -0.031686 0.862459 0.888028 202 | v 0.031686 0.612282 0.884871 203 | v 0.042088 0.619404 0.869539 204 | v 0.042088 0.662582 0.776583 205 | v 0.031686 0.669837 0.760965 206 | v -0.042088 0.619404 0.869539 207 | v -0.031686 0.612282 0.884871 208 | v -0.031686 0.669837 0.760965 209 | v -0.042088 0.662582 0.776583 210 | v 0.031686 0.492588 0.822780 211 | v 0.042088 0.506719 0.810444 212 | v 0.042088 0.580602 0.745942 213 | v 0.031686 0.595506 0.732931 214 | v -0.042088 0.506719 0.810444 215 | v -0.031686 0.492588 0.822780 216 | v -0.031686 0.595506 0.732931 217 | v -0.042088 0.580602 0.745942 218 | v 0.031686 0.422087 0.737904 219 | v 0.042088 0.440482 0.729353 220 | v 0.042088 0.526556 0.689342 221 | v 0.031686 0.545976 0.680315 222 | v -0.042088 0.440482 0.729353 223 | v -0.031686 0.422087 0.737904 224 | v -0.031686 0.545976 0.680315 225 | v -0.042088 0.526556 0.689342 226 | v 0.031686 0.387254 0.661474 227 | v 0.042088 0.407549 0.655216 228 | v 0.042088 0.496593 0.627763 229 | v 0.031686 0.517810 0.621221 230 | v -0.042088 0.407549 0.655216 231 | v -0.031686 0.387254 0.661474 232 | v -0.031686 0.517810 0.621221 233 | v -0.042088 0.496593 0.627763 234 | v 0.031686 0.361229 0.568333 235 | v 0.042088 0.383640 0.567799 236 | v 0.042088 0.474097 0.565645 237 | v 0.031686 0.497810 0.565080 238 | v -0.042088 0.383640 0.567799 239 | v -0.031686 0.361229 0.568333 240 | v -0.031686 0.497810 0.565080 241 | v -0.042088 0.474097 0.565645 242 | v 0.042088 0.379600 0.324099 243 | v 0.031686 0.357020 0.324636 244 | v 0.031686 0.493602 0.321383 245 | v 0.042088 0.469770 0.321951 246 | v -0.031686 0.357020 0.324636 247 | v -0.042088 0.379600 0.324099 248 | v -0.042088 0.469770 0.321951 249 | v -0.031686 0.493602 0.321383 250 | v 0.000000 1.445872 2.293784 251 | v 0.000000 1.503821 1.910264 252 | v -0.111286 1.385861 2.293784 253 | v -0.135595 1.447655 1.910264 254 | v -0.134767 1.312061 2.293784 255 | v -0.191760 1.312061 1.910264 256 | v -0.111286 1.238260 2.293784 257 | v -0.135595 1.176466 1.910264 258 | v 0.000000 1.178250 2.293784 259 | v 0.000000 1.120301 1.910264 260 | v 0.111286 1.238260 2.293784 261 | v 0.135595 1.176466 1.910264 262 | v 0.134767 1.312061 2.293784 263 | v 0.191760 1.312061 1.910264 264 | v 0.111286 1.385861 2.293784 265 | v 0.135595 1.447655 1.910264 266 | v 0.000000 1.503821 2.293784 267 | v -0.135595 1.447655 2.293784 268 | v -0.191760 1.312061 2.293784 269 | v -0.135595 1.176466 2.293784 270 | v 0.000000 1.120301 2.293784 271 | v 0.135595 1.176466 2.293784 272 | v 0.191760 1.312061 2.293784 273 | v 0.135595 1.447655 2.293784 274 | v 0.000000 1.445872 2.202544 275 | v -0.111286 1.385861 2.202544 276 | v -0.134767 1.312061 2.202544 277 | v -0.111286 1.238260 2.202544 278 | v 0.000000 1.178250 2.202544 279 | v 0.111286 1.238260 2.202544 280 | v 0.134767 1.312061 2.202544 281 | v 0.111286 1.385861 2.202544 282 | vt 0.688478 0.935453 283 | vt 0.690483 0.935453 284 | vt 0.690483 0.936757 285 | vt 0.688478 0.936757 286 | vt 0.690483 0.931093 287 | vt 0.690483 0.933098 288 | vt 0.690483 0.933098 289 | vt 0.690483 0.931093 290 | vt 0.690483 0.935103 291 | vt 0.690483 0.934752 292 | vt 0.690483 0.933098 293 | vt 0.690483 0.935103 294 | vt 0.690483 0.929438 295 | vt 0.690483 0.929088 296 | vt 0.690483 0.929088 297 | vt 0.690483 0.931093 298 | vt 0.688478 0.929438 299 | vt 0.688478 0.931093 300 | vt 0.690483 0.933098 301 | vt 0.690483 0.933098 302 | vt 0.690483 0.933098 303 | vt 0.690483 0.933098 304 | vt 0.692488 0.933098 305 | vt 0.692488 0.935103 306 | vt 0.690483 0.937108 307 | vt 0.690483 0.937108 308 | vt 0.688478 0.933098 309 | vt 0.688478 0.934752 310 | vt 0.690483 0.931093 311 | vt 0.690483 0.931093 312 | vt 0.690483 0.931093 313 | vt 0.690483 0.931093 314 | vt 0.690483 0.932953 315 | vt 0.690483 0.931238 316 | vt 0.690483 0.931238 317 | vt 0.690483 0.932953 318 | vt 0.690483 0.931093 319 | vt 0.690483 0.933098 320 | vt 0.692488 0.933098 321 | vt 0.692488 0.933098 322 | vt 0.690483 0.931093 323 | vt 0.690483 0.931093 324 | vt 0.690483 0.933055 325 | vt 0.690483 0.931107 326 | vt 0.690483 0.933084 327 | vt 0.688478 0.931093 328 | vt 0.690110 0.931093 329 | vt 0.690483 0.931213 330 | vt 0.690483 0.932977 331 | vt 0.690110 0.933098 332 | vt 0.688478 0.933098 333 | vt 0.690110 0.933927 334 | vt 0.688478 0.933927 335 | vt 0.688478 0.934909 336 | vt 0.690483 0.934909 337 | vt 0.690483 0.935103 338 | vt 0.688478 0.935103 339 | vt 0.690483 0.937108 340 | vt 0.688478 0.937108 341 | vt 0.686473 0.934909 342 | vt 0.686473 0.935103 343 | vt 0.692488 0.934909 344 | vt 0.692488 0.935103 345 | vt 0.690483 0.933965 346 | vt 0.690483 0.934310 347 | vt 0.688478 0.934310 348 | vt 0.686473 0.933927 349 | vt 0.686473 0.934310 350 | vt 0.688478 0.934783 351 | vt 0.690483 0.934783 352 | vt 0.690483 0.934783 353 | vt 0.688478 0.934783 354 | vt 0.688478 0.929880 355 | vt 0.690483 0.929880 356 | vt 0.690483 0.930226 357 | vt 0.690110 0.930264 358 | vt 0.688478 0.930264 359 | vt 0.686473 0.933098 360 | vt 0.690603 0.933927 361 | vt 0.692367 0.933927 362 | vt 0.692488 0.933965 363 | vt 0.692488 0.934310 364 | vt 0.690483 0.930264 365 | vt 0.690483 0.933927 366 | vt 0.690483 0.931093 367 | vt 0.690603 0.933098 368 | vt 0.692367 0.933098 369 | vt 0.688478 0.929088 370 | vt 0.690483 0.929088 371 | vt 0.690483 0.929282 372 | vt 0.688478 0.929282 373 | vt 0.688022 0.951496 374 | vt 0.688022 0.951429 375 | vt 0.688022 0.951429 376 | vt 0.688022 0.951496 377 | vt 0.686473 0.934842 378 | vt 0.688478 0.934842 379 | vt 0.690483 0.934842 380 | vt 0.690483 0.934547 381 | vt 0.690483 0.934606 382 | vt 0.690483 0.934606 383 | vt 0.690483 0.934547 384 | vt 0.686473 0.934783 385 | vt 0.692488 0.934783 386 | vt 0.692488 0.934842 387 | vt 0.690483 0.929349 388 | vt 0.688478 0.929349 389 | vt 0.688022 0.956989 390 | vt 0.690027 0.956989 391 | vt 0.690027 0.957056 392 | vt 0.688022 0.957056 393 | vt 0.690027 0.957056 394 | vt 0.688022 0.957056 395 | vt 0.688022 0.956989 396 | vt 0.690027 0.956989 397 | vt 0.692488 0.934370 398 | vt 0.690483 0.934370 399 | vt 0.692488 0.934429 400 | vt 0.690483 0.934429 401 | vt 0.692488 0.934488 402 | vt 0.690483 0.934488 403 | vt 0.692488 0.934547 404 | vt 0.692488 0.934606 405 | vt 0.692488 0.934665 406 | vt 0.690483 0.934665 407 | vt 0.692488 0.934724 408 | vt 0.690483 0.934724 409 | vt 0.688478 0.934370 410 | vt 0.686473 0.934370 411 | vt 0.688478 0.934429 412 | vt 0.686473 0.934429 413 | vt 0.688478 0.934488 414 | vt 0.686473 0.934488 415 | vt 0.688478 0.934547 416 | vt 0.686473 0.934547 417 | vt 0.688478 0.934606 418 | vt 0.686473 0.934606 419 | vt 0.688478 0.934665 420 | vt 0.686473 0.934665 421 | vt 0.688478 0.934724 422 | vt 0.686473 0.934724 423 | vt 0.692488 0.934310 424 | vt 0.692488 0.934370 425 | vt 0.688478 0.934429 426 | vt 0.688478 0.934488 427 | vt 0.690483 0.934842 428 | vt 0.688478 0.934724 429 | vt 0.690483 0.934724 430 | vt 0.692488 0.934783 431 | vt 0.692488 0.934842 432 | vt 0.688478 0.929408 433 | vt 0.690483 0.929408 434 | vt 0.690483 0.929467 435 | vt 0.688478 0.929467 436 | vt 0.686473 0.934842 437 | vt 0.686473 0.934783 438 | vt 0.688478 0.929526 439 | vt 0.690483 0.929526 440 | vt 0.690483 0.929585 441 | vt 0.688478 0.929585 442 | vt 0.690483 0.934665 443 | vt 0.688478 0.934665 444 | vt 0.688478 0.929644 445 | vt 0.690483 0.929644 446 | vt 0.690483 0.929703 447 | vt 0.688478 0.929703 448 | vt 0.690483 0.934488 449 | vt 0.690483 0.934429 450 | vt 0.688478 0.929762 451 | vt 0.690483 0.929762 452 | vt 0.690483 0.929821 453 | vt 0.688478 0.929821 454 | vt 0.688478 0.929821 455 | vt 0.690483 0.929821 456 | vt 0.690483 0.929880 457 | vt 0.688478 0.929880 458 | vt 0.688478 0.934842 459 | vt 0.688478 0.934310 460 | vt 0.690483 0.934310 461 | vt 0.690483 0.934370 462 | vt 0.688478 0.934370 463 | vt 0.688478 0.934547 464 | vt 0.688478 0.934606 465 | vt 0.688478 0.929349 466 | vt 0.690483 0.929349 467 | vt 0.690483 0.929408 468 | vt 0.688478 0.929408 469 | vt 0.688478 0.929467 470 | vt 0.690483 0.929467 471 | vt 0.690483 0.929526 472 | vt 0.688478 0.929526 473 | vt 0.688478 0.929585 474 | vt 0.690483 0.929585 475 | vt 0.690483 0.929644 476 | vt 0.688478 0.929644 477 | vt 0.688478 0.929703 478 | vt 0.690483 0.929703 479 | vt 0.690483 0.929762 480 | vt 0.688478 0.929762 481 | vt 0.692488 0.934665 482 | vt 0.692488 0.934724 483 | vt 0.686473 0.934370 484 | vt 0.686473 0.934310 485 | vt 0.692488 0.934547 486 | vt 0.692488 0.934606 487 | vt 0.686473 0.934488 488 | vt 0.686473 0.934429 489 | vt 0.692488 0.934429 490 | vt 0.692488 0.934488 491 | vt 0.686473 0.934606 492 | vt 0.686473 0.934547 493 | vt 0.686473 0.934724 494 | vt 0.686473 0.934665 495 | vt 0.688478 0.931093 496 | vt 0.688478 0.933098 497 | vt 0.686473 0.933098 498 | vt 0.686473 0.933098 499 | vt 0.690472 0.937108 500 | vt 0.690483 0.937005 501 | vt 0.690480 0.935206 502 | vt 0.690472 0.935103 503 | vt 0.690480 0.937108 504 | vt 0.688478 0.937108 505 | vt 0.688478 0.929088 506 | vt 0.690480 0.929088 507 | vt 0.688444 0.935069 508 | vt 0.690480 0.935103 509 | vt 0.688127 0.935103 510 | vt 0.686823 0.935103 511 | vt 0.686575 0.935000 512 | vt 0.686473 0.934752 513 | vt 0.690925 0.936638 514 | vt 0.690980 0.936638 515 | vt 0.690980 0.936679 516 | vt 0.690925 0.936679 517 | vt 0.690925 0.936527 518 | vt 0.690925 0.936568 519 | vt 0.690925 0.936568 520 | vt 0.690925 0.936527 521 | vt 0.690925 0.936471 522 | vt 0.690925 0.936513 523 | vt 0.690925 0.936512 524 | vt 0.690925 0.936472 525 | vt 0.690925 0.936679 526 | vt 0.690925 0.936638 527 | vt 0.690925 0.936470 528 | vt 0.690980 0.936470 529 | vt 0.690980 0.936514 530 | vt 0.690925 0.936514 531 | vt 0.690980 0.936527 532 | vt 0.690980 0.936568 533 | vt 0.690925 0.936512 534 | vt 0.690925 0.936473 535 | vt 0.690925 0.936582 536 | vt 0.690980 0.936581 537 | vt 0.690980 0.936625 538 | vt 0.690925 0.936625 539 | vt 0.691029 0.936575 540 | vt 0.691036 0.936581 541 | vt 0.691036 0.936625 542 | vt 0.691029 0.936631 543 | vt 0.690925 0.936624 544 | vt 0.690925 0.936582 545 | vt 0.690925 0.936583 546 | vt 0.690925 0.936623 547 | vt 0.690925 0.936622 548 | vt 0.690925 0.936584 549 | vt 0.690925 0.936568 550 | vt 0.690925 0.936527 551 | vt 0.690925 0.936679 552 | vt 0.690925 0.936638 553 | vt 0.690925 0.936638 554 | vt 0.690925 0.936679 555 | vt 0.690925 0.936679 556 | vt 0.690925 0.936638 557 | vt 0.690925 0.936511 558 | vt 0.690925 0.936473 559 | vt 0.690925 0.936568 560 | vt 0.690925 0.936527 561 | vt 0.690925 0.936584 562 | vt 0.690925 0.936622 563 | vt 0.690925 0.936621 564 | vt 0.690925 0.936584 565 | vt 0.690925 0.936511 566 | vt 0.690925 0.936474 567 | vt 0.690925 0.936568 568 | vt 0.690925 0.936527 569 | vt 0.690870 0.936584 570 | vt 0.690876 0.936575 571 | vt 0.690918 0.936575 572 | vt 0.690925 0.936584 573 | vt 0.690925 0.936621 574 | vt 0.690918 0.936631 575 | vt 0.690876 0.936631 576 | vt 0.690870 0.936621 577 | vt 0.690925 0.936679 578 | vt 0.690925 0.936638 579 | vt 0.690925 0.936511 580 | vt 0.690925 0.936474 581 | vt 0.690925 0.936568 582 | vt 0.690925 0.936527 583 | vt 0.690925 0.936527 584 | vt 0.690925 0.936679 585 | vt 0.690925 0.936464 586 | vt 0.690980 0.936464 587 | vt 0.690980 0.936520 588 | vt 0.690925 0.936520 589 | vt 0.690980 0.936575 590 | vt 0.690925 0.936575 591 | vt 0.690980 0.936631 592 | vt 0.690925 0.936631 593 | vt 0.690980 0.936686 594 | vt 0.690925 0.936686 595 | vt 0.690925 0.936520 596 | vt 0.690925 0.936464 597 | vt 0.691036 0.936575 598 | vt 0.691036 0.936631 599 | vt 0.690925 0.936575 600 | vt 0.690925 0.936631 601 | vt 0.690925 0.936631 602 | vt 0.690925 0.936575 603 | vt 0.690925 0.936686 604 | vt 0.690925 0.936686 605 | vt 0.690925 0.936686 606 | vt 0.690925 0.936631 607 | vt 0.690925 0.936520 608 | vt 0.690925 0.936464 609 | vt 0.690925 0.936520 610 | vt 0.690925 0.936575 611 | vt 0.690925 0.936575 612 | vt 0.690925 0.936520 613 | vt 0.690925 0.936464 614 | vt 0.690925 0.936631 615 | vt 0.690925 0.936686 616 | vt 0.690925 0.936686 617 | vt 0.690925 0.936631 618 | vt 0.690925 0.936464 619 | vt 0.690925 0.936575 620 | vt 0.690925 0.936631 621 | vt 0.690925 0.936575 622 | vt 0.690925 0.936520 623 | vt 0.690925 0.936464 624 | vt 0.690870 0.936575 625 | vt 0.690870 0.936631 626 | vt 0.690925 0.936520 627 | vt 0.690925 0.936464 628 | vt 0.690925 0.936686 629 | vt 0.690980 0.936686 630 | vt 0.690925 0.936686 631 | vt 0.690925 0.936464 632 | vt 0.690925 0.936464 633 | vt 0.690925 0.936464 634 | vt 0.690925 0.936464 635 | vt 0.690925 0.936464 636 | vt 0.690925 0.936464 637 | vt 0.690925 0.936464 638 | vt 0.314530 0.942941 639 | vt 0.314530 0.946951 640 | vt 0.313527 0.946951 641 | vt 0.313527 0.942941 642 | vt 0.312525 0.946951 643 | vt 0.312525 0.942941 644 | vt 0.311522 0.946951 645 | vt 0.311522 0.942941 646 | vt 0.310520 0.946951 647 | vt 0.310520 0.942941 648 | vt 0.309517 0.946951 649 | vt 0.309517 0.942941 650 | vt 0.308515 0.946951 651 | vt 0.308515 0.942941 652 | vt 0.309876 0.942297 653 | vt 0.308515 0.942861 654 | vt 0.307154 0.942297 655 | vt 0.306590 0.940936 656 | vt 0.307154 0.939575 657 | vt 0.308515 0.939011 658 | vt 0.309876 0.939575 659 | vt 0.310440 0.940936 660 | vt 0.307512 0.946951 661 | vt 0.307512 0.942941 662 | vt 0.306510 0.946951 663 | vt 0.306510 0.942941 664 | vt 0.313745 0.940314 665 | vt 0.312525 0.939809 666 | vt 0.312525 0.939809 667 | vt 0.313745 0.940314 668 | vt 0.313745 0.941557 669 | vt 0.312525 0.942063 670 | vt 0.312525 0.942861 671 | vt 0.313886 0.942297 672 | vt 0.314002 0.940936 673 | vt 0.314450 0.940936 674 | vt 0.313886 0.939575 675 | vt 0.312525 0.939011 676 | vt 0.311305 0.940314 677 | vt 0.311164 0.939575 678 | vt 0.311047 0.940936 679 | vt 0.310600 0.940936 680 | vt 0.311305 0.941557 681 | vt 0.311164 0.942297 682 | vt 0.312525 0.942063 683 | vt 0.313745 0.941557 684 | vt 0.314002 0.940936 685 | vt 0.311305 0.940314 686 | vt 0.311047 0.940936 687 | vt 0.311305 0.941557 688 | vn 0.0000 0.0122 -0.9999 689 | vn 0.0000 0.9999 -0.0145 690 | vn -1.0000 0.0000 0.0000 691 | vn 1.0000 0.0000 0.0000 692 | vn 0.0000 0.9999 0.0122 693 | vn -0.0000 -0.0015 -1.0000 694 | vn 0.0000 -1.0000 0.0062 695 | vn 0.0000 -1.0000 0.0001 696 | vn 0.0000 1.0000 -0.0062 697 | vn 0.0000 1.0000 -0.0001 698 | vn 0.9389 -0.1504 0.3097 699 | vn 0.6314 -0.5904 0.5029 700 | vn -0.6313 -0.5904 0.5029 701 | vn -0.9389 -0.1504 0.3097 702 | vn 0.9873 -0.1586 0.0010 703 | vn 0.7300 -0.6834 0.0042 704 | vn -0.9873 -0.1586 0.0010 705 | vn -0.7300 -0.6834 0.0042 706 | vn 0.0000 0.0015 1.0000 707 | vn 0.0000 0.0002 1.0000 708 | vn 0.0000 -0.0002 -1.0000 709 | vn 0.0000 -1.0000 0.0090 710 | vn 0.0000 1.0000 -0.0090 711 | vn 0.0000 -1.0000 0.0046 712 | vn -0.0000 1.0000 -0.0046 713 | vn 0.7492 0.2908 0.5951 714 | vn -0.7492 0.2908 0.5951 715 | vn 0.9323 0.3617 -0.0017 716 | vn -0.9323 0.3617 -0.0017 717 | vn 0.8895 0.4570 -0.0021 718 | vn -0.0000 0.0636 -0.9980 719 | vn 0.0000 0.0728 0.9973 720 | vn -0.8895 0.4570 -0.0021 721 | vn 0.0000 -0.0122 0.9999 722 | vn 0.6824 -0.0089 0.7310 723 | vn -0.6824 -0.0089 0.7310 724 | vn 0.0000 -0.9999 0.0145 725 | vn 0.9368 -0.1603 -0.3109 726 | vn 0.4524 -0.1876 -0.8718 727 | vn -0.4524 -0.1876 -0.8718 728 | vn -0.9368 -0.1603 -0.3109 729 | vn 0.4616 0.0108 -0.8870 730 | vn 0.9497 0.0038 -0.3131 731 | vn -0.4616 0.0108 -0.8870 732 | vn -0.9497 0.0038 -0.3131 733 | vn 0.0000 -0.9999 -0.0122 734 | vn 0.0000 -0.0145 -0.9999 735 | vn 0.0000 -0.0452 0.9990 736 | vn 0.0000 -0.1386 -0.9903 737 | vn 0.0000 0.0145 0.9999 738 | vn 0.0000 -0.4605 0.8877 739 | vn 0.0000 0.3529 -0.9357 740 | vn 0.0000 0.9027 -0.4303 741 | vn 0.0000 0.7281 -0.6854 742 | vn 0.0000 -0.7692 0.6390 743 | vn 0.0000 -0.9100 0.4147 744 | vn -0.0000 -0.0238 -0.9997 745 | vn 0.0000 0.9420 -0.3356 746 | vn 0.0000 -0.9631 0.2691 747 | vn 0.0000 -0.9999 0.0173 748 | vn 0.0000 0.9999 -0.0173 749 | vn -0.9997 -0.0003 -0.0236 750 | vn 0.0180 -0.0145 -0.9997 751 | vn 0.9997 0.0003 0.0236 752 | vn -0.0180 0.0145 0.9997 753 | vn -0.0179 -0.0846 0.9963 754 | vn 0.0179 -0.0619 -0.9979 755 | vn -0.0136 0.6667 0.7452 756 | vn -0.0171 0.3124 0.9498 757 | vn 0.0165 -0.4059 -0.9138 758 | vn 0.0087 -0.8825 -0.4703 759 | vn 0.0128 -0.7120 -0.7020 760 | vn -0.0071 0.9250 0.3800 761 | vn -0.0090 0.8730 0.4876 762 | vn 0.0057 -0.9535 -0.3014 763 | vn -0.0180 0.0071 0.9998 764 | vn -0.0002 1.0000 -0.0027 765 | vn 0.0002 -1.0000 0.0027 766 | vn 0.8107 -0.0086 -0.5853 767 | vn 0.8278 0.0079 0.5609 768 | vn -0.8278 0.0079 0.5609 769 | vn -0.8107 -0.0086 -0.5853 770 | vn 0.8304 -0.0259 0.5565 771 | vn 0.8103 -0.0819 -0.5803 772 | vn -0.8103 -0.0819 -0.5803 773 | vn -0.8304 -0.0259 0.5565 774 | vn -0.8569 0.1811 -0.4826 775 | vn -0.8554 -0.2395 0.4593 776 | vn 0.8554 -0.2395 0.4593 777 | vn 0.8569 0.1811 -0.4826 778 | vn 0.8875 0.3344 -0.3171 779 | vn -0.8875 0.3344 -0.3171 780 | vn -0.8792 -0.3678 0.3030 781 | vn 0.8792 -0.3678 0.3030 782 | vn -0.8933 -0.4098 0.1844 783 | vn 0.8933 -0.4098 0.1844 784 | vn -0.9016 0.3897 -0.1877 785 | vn 0.9016 0.3897 -0.1877 786 | vn 0.9066 0.3972 -0.1427 787 | vn -0.9066 0.3972 -0.1427 788 | vn -0.9001 -0.4200 0.1162 789 | vn 0.9001 -0.4200 0.1162 790 | vn -0.9162 0.4007 -0.0070 791 | vn -0.9077 -0.4196 0.0071 792 | vn 0.9077 -0.4196 0.0071 793 | vn 0.9162 0.4007 -0.0070 794 | vn -0.3827 0.9239 0.0000 795 | vn -0.9239 0.3827 0.0000 796 | vn -0.9239 -0.3827 0.0000 797 | vn -0.3827 -0.9239 0.0000 798 | vn 0.3827 -0.9239 0.0000 799 | vn 0.9239 -0.3827 0.0000 800 | vn 0.0000 -0.0000 -1.0000 801 | vn 0.9239 0.3827 0.0000 802 | vn 0.3827 0.9239 0.0000 803 | vn 0.4746 0.8802 -0.0000 804 | vn 0.0000 0.0000 1.0000 805 | vn 0.9529 -0.3032 0.0000 806 | vn -0.9529 -0.3032 0.0000 807 | vn -0.4746 0.8802 -0.0000 808 | vn 0.9529 0.3032 -0.0000 809 | vn 0.4746 -0.8802 0.0000 810 | vn -0.4746 -0.8802 0.0000 811 | vn -0.9529 0.3032 -0.0000 812 | usemtl Material 813 | s off 814 | f 145/1/1 147/2/1 141/3/1 137/4/1 815 | f 2/5/2 4/6/2 136/7/2 133/8/2 816 | f 149/9/3 148/10/3 4/6/3 7/11/3 8/12/3 817 | f 2/5/4 140/13/4 142/14/4 5/15/4 6/16/4 818 | f 138/17/4 140/13/4 2/5/4 1/18/4 819 | f 12/19/3 24/20/3 16/21/3 10/22/3 820 | f 7/11/5 6/23/5 5/24/5 8/12/5 821 | f 142/25/6 141/3/6 147/2/6 149/9/6 8/12/6 5/26/6 822 | f 3/27/3 4/6/3 148/10/3 144/28/3 823 | f 19/29/4 11/30/4 9/31/4 14/32/4 824 | f 23/33/7 20/34/7 13/35/7 17/36/7 825 | f 4/6/8 2/5/8 21/37/8 20/34/8 23/33/8 25/38/8 826 | f 11/39/9 12/19/9 10/22/9 9/40/9 827 | f 6/23/10 7/11/10 12/19/10 11/39/10 828 | f 7/11/3 4/6/3 25/38/3 24/20/3 12/19/3 829 | f 2/5/4 6/16/4 11/30/4 19/29/4 21/37/4 830 | f 19/29/11 22/41/11 21/37/11 831 | f 22/41/12 20/42/12 21/37/12 832 | f 23/33/13 26/43/13 25/38/13 833 | f 26/43/14 24/20/14 25/38/14 834 | f 19/29/15 14/32/15 15/44/15 22/41/15 835 | f 22/41/16 15/44/16 13/35/16 20/34/16 836 | f 16/21/17 24/20/17 26/43/17 18/45/17 837 | f 18/45/18 26/43/18 23/33/18 17/36/18 838 | f 16/21/19 18/45/19 17/36/19 13/35/19 15/44/19 14/32/19 9/31/19 10/22/19 839 | f 29/46/20 39/47/20 40/48/20 41/49/20 42/50/20 32/51/20 840 | f 32/51/3 42/50/3 46/52/3 37/53/3 841 | f 52/54/3 50/55/3 31/56/3 30/57/3 842 | f 30/57/21 31/56/21 28/58/21 27/59/21 843 | f 49/60/22 52/54/22 30/57/22 27/61/22 844 | f 50/55/23 51/62/23 28/63/23 31/56/23 845 | f 37/53/3 46/52/3 48/64/3 36/65/3 35/66/3 846 | f 38/67/24 37/53/24 35/66/24 33/68/24 847 | f 69/69/20 92/70/20 101/71/20 112/72/20 848 | f 33/73/4 34/74/4 45/75/4 44/76/4 38/77/4 849 | f 29/78/24 32/51/24 37/53/24 38/67/24 850 | f 38/77/4 44/76/4 39/47/4 29/46/4 851 | f 48/64/25 47/79/25 43/80/25 45/81/25 34/82/25 36/65/25 852 | f 43/83/26 44/76/26 45/75/26 853 | f 46/52/27 47/84/27 48/64/27 854 | f 43/83/28 40/85/28 39/47/28 44/76/28 855 | f 41/86/29 47/79/29 46/52/29 42/50/29 856 | f 41/86/25 40/87/25 43/80/25 47/79/25 857 | f 27/88/4 28/89/4 51/90/4 49/91/4 858 | f 53/92/30 51/93/30 59/94/30 60/95/30 859 | f 55/96/24 54/97/24 52/54/24 49/60/24 860 | f 54/97/3 56/98/3 50/55/3 52/54/3 861 | f 88/99/25 89/100/25 130/101/25 129/102/25 862 | f 84/103/24 69/69/24 54/97/24 55/96/24 863 | f 92/70/25 61/104/25 53/105/25 56/98/25 864 | f 49/91/4 51/90/4 53/106/4 55/107/4 865 | f 57/108/25 60/109/25 59/110/25 58/111/25 866 | f 51/112/31 50/113/31 58/111/31 59/110/31 867 | f 56/114/32 53/115/32 60/109/32 57/108/32 868 | f 50/113/33 56/114/33 57/108/33 58/111/33 869 | f 36/65/25 34/82/25 68/116/25 85/117/25 870 | f 85/117/25 68/116/25 67/118/25 86/119/25 871 | f 86/119/25 67/118/25 66/120/25 87/121/25 872 | f 87/121/25 66/120/25 65/122/25 88/99/25 873 | f 88/99/25 65/122/25 64/123/25 89/100/25 874 | f 89/100/25 64/123/25 63/124/25 90/125/25 875 | f 90/125/25 63/124/25 62/126/25 91/127/25 876 | f 91/127/25 62/126/25 61/104/25 92/70/25 877 | f 33/68/24 35/66/24 76/128/24 77/129/24 878 | f 77/129/24 76/128/24 75/130/24 78/131/24 879 | f 78/131/24 75/130/24 74/132/24 79/133/24 880 | f 79/133/24 74/132/24 73/134/24 80/135/24 881 | f 80/135/24 73/134/24 72/136/24 81/137/24 882 | f 81/137/24 72/136/24 71/138/24 82/139/24 883 | f 82/139/24 71/138/24 70/140/24 83/141/24 884 | f 83/141/24 70/140/24 69/69/24 84/103/24 885 | f 68/116/25 34/82/25 94/142/25 93/143/25 886 | f 76/128/3 85/117/3 86/119/3 75/130/3 887 | f 74/132/24 75/130/24 118/144/24 117/145/24 888 | f 74/132/3 87/121/3 88/99/3 73/134/3 889 | f 92/70/25 56/98/25 102/146/25 101/71/25 890 | f 72/136/3 89/100/3 90/125/3 71/138/3 891 | f 91/127/21 70/140/21 113/147/21 132/148/21 892 | f 70/140/3 91/127/3 92/70/3 69/69/3 893 | f 53/105/25 61/104/25 105/149/25 104/150/25 894 | f 84/151/4 61/152/4 62/153/4 83/154/4 895 | f 84/103/24 55/96/24 100/155/24 99/156/24 896 | f 82/157/4 63/158/4 64/159/4 81/160/4 897 | f 71/138/20 90/125/20 131/161/20 114/162/20 898 | f 80/163/4 65/164/4 66/165/4 79/166/4 899 | f 86/119/25 87/121/25 128/167/25 127/168/25 900 | f 78/169/4 67/170/4 68/171/4 77/172/4 901 | f 119/173/4 93/174/4 94/175/4 98/176/4 902 | f 112/72/3 101/71/3 102/146/3 103/177/3 903 | f 96/178/3 97/179/3 126/180/3 95/181/3 904 | f 118/144/3 127/168/3 128/167/3 117/145/3 905 | f 116/182/3 129/102/3 130/101/3 115/183/3 906 | f 114/162/3 131/161/3 132/148/3 113/147/3 907 | f 100/184/4 104/185/4 105/186/4 99/187/4 908 | f 125/188/4 106/189/4 107/190/4 124/191/4 909 | f 123/192/4 108/193/4 109/194/4 122/195/4 910 | f 121/196/4 110/197/4 111/198/4 120/199/4 911 | f 56/98/21 54/97/21 103/177/21 102/146/21 912 | f 76/128/24 35/66/24 96/178/24 95/181/24 913 | f 62/126/25 63/124/25 107/200/25 106/201/25 914 | f 61/152/20 84/151/20 99/187/20 105/186/20 915 | f 33/68/24 77/129/24 119/202/24 98/203/24 916 | f 90/125/25 91/127/25 132/148/25 131/161/25 917 | f 83/154/21 62/153/21 106/189/21 125/188/21 918 | f 64/123/25 65/122/25 109/204/25 108/205/25 919 | f 63/158/20 82/157/20 124/191/20 107/190/20 920 | f 55/107/21 53/106/21 104/185/21 100/184/21 921 | f 78/131/24 79/133/24 121/206/24 120/207/24 922 | f 35/66/20 36/65/20 97/179/20 96/178/20 923 | f 81/160/21 64/159/21 108/193/21 123/192/21 924 | f 34/74/20 33/73/20 98/176/20 94/175/20 925 | f 66/120/25 67/118/25 111/208/25 110/209/25 926 | f 65/164/20 80/163/20 122/195/20 109/194/20 927 | f 80/135/24 81/137/24 123/210/24 122/211/24 928 | f 79/166/21 66/165/21 110/197/21 121/196/21 929 | f 85/117/21 76/128/21 95/181/21 126/180/21 930 | f 54/97/24 69/69/24 112/72/24 103/177/24 931 | f 67/170/20 78/169/20 120/199/20 111/198/20 932 | f 82/139/24 83/141/24 125/212/24 124/213/24 933 | f 75/130/20 86/119/20 127/168/20 118/144/20 934 | f 77/172/21 68/171/21 93/174/21 119/173/21 935 | f 87/121/21 74/132/21 117/145/21 128/167/21 936 | f 70/140/24 71/138/24 114/162/24 113/147/24 937 | f 36/65/25 85/117/25 126/180/25 97/179/25 938 | f 73/134/20 88/99/20 129/102/20 116/182/20 939 | f 89/100/21 72/136/21 115/183/21 130/101/21 940 | f 72/136/24 73/134/24 116/182/24 115/183/24 941 | f 134/214/34 133/8/34 136/7/34 135/215/34 942 | f 1/18/35 2/5/35 133/8/35 134/214/35 943 | f 4/6/36 3/27/36 135/215/36 136/7/36 944 | f 3/27/37 1/216/37 134/217/37 135/215/37 945 | f 140/218/38 143/219/38 142/25/38 946 | f 143/219/39 141/3/39 142/25/39 947 | f 147/2/40 150/220/40 149/9/40 948 | f 150/220/41 148/221/41 149/9/41 949 | f 137/4/42 141/3/42 143/222/42 139/223/42 950 | f 139/224/43 143/225/43 140/13/43 138/17/43 951 | f 147/2/44 145/1/44 146/226/44 150/227/44 952 | f 150/227/45 146/226/45 144/28/45 148/10/45 953 | f 1/216/46 3/27/46 144/28/46 146/226/46 145/228/46 137/229/46 139/230/46 138/231/46 954 | f 191/232/47 193/233/47 186/234/47 184/235/47 955 | f 187/236/48 196/237/48 204/238/48 199/239/48 956 | f 201/240/4 200/241/4 208/242/4 209/243/4 957 | f 191/232/49 184/235/49 202/244/49 205/245/49 958 | f 183/246/4 185/247/4 190/248/4 188/249/4 959 | f 187/236/50 189/250/50 198/251/50 196/237/50 960 | f 209/243/4 208/242/4 216/252/4 217/253/4 961 | f 195/254/3 197/255/3 194/256/3 192/257/3 962 | f 197/255/2 198/251/2 189/258/2 190/259/2 185/260/2 186/261/2 193/233/2 194/256/2 963 | f 195/254/3 192/257/3 206/262/3 203/263/3 964 | f 211/264/3 214/265/3 222/266/3 219/267/3 965 | f 199/239/51 204/238/51 212/268/51 207/269/51 966 | f 203/263/3 206/262/3 214/265/3 211/264/3 967 | f 205/245/52 202/244/52 210/270/52 213/271/52 968 | f 221/272/53 218/273/53 226/274/53 229/275/53 969 | f 213/271/54 210/270/54 218/273/54 221/272/54 970 | f 217/253/4 216/252/4 224/276/4 225/277/4 971 | f 207/269/55 212/268/55 220/278/55 215/279/55 972 | f 227/280/3 230/281/3 238/282/3 235/283/3 973 | f 225/277/4 224/276/4 232/284/4 233/285/4 974 | f 215/279/56 220/278/56 228/286/56 223/287/56 975 | f 219/267/3 222/266/3 230/281/3 227/280/3 976 | f 239/288/57 240/289/57 243/290/57 244/291/57 245/292/57 246/293/57 241/294/57 242/295/57 977 | f 229/275/58 226/274/58 234/296/58 237/297/58 978 | f 233/285/4 232/284/4 239/298/4 242/299/4 979 | f 223/287/59 228/286/59 236/300/59 231/301/59 980 | f 231/301/60 236/300/60 243/290/60 240/302/60 981 | f 235/283/3 238/282/3 245/292/3 244/291/3 982 | f 237/297/61 234/296/61 241/303/61 246/293/61 983 | f 151/304/62 152/305/62 154/306/62 153/307/62 984 | f 153/307/63 154/306/63 158/308/63 157/309/63 985 | f 157/309/64 158/308/64 156/310/64 155/311/64 986 | f 155/311/65 156/310/65 152/312/65 151/313/65 987 | f 151/304/62 153/307/62 159/314/62 160/315/62 988 | f 158/308/2 154/316/2 152/317/2 156/310/2 989 | f 161/318/64 162/319/64 166/320/64 165/321/64 990 | f 157/309/64 155/311/64 162/319/64 161/318/64 991 | f 155/311/66 151/313/66 160/322/66 162/319/66 992 | f 153/307/67 157/309/67 161/318/67 159/314/67 993 | f 166/320/68 164/323/68 168/324/68 170/325/68 994 | f 160/315/62 159/314/62 163/326/62 164/327/62 995 | f 162/319/69 160/322/69 164/323/69 166/320/69 996 | f 159/314/70 161/318/70 165/321/70 163/326/70 997 | f 167/328/71 169/329/71 173/330/71 171/331/71 998 | f 163/326/72 165/321/72 169/329/72 167/328/72 999 | f 165/321/64 166/320/64 170/325/64 169/329/64 1000 | f 164/327/62 163/326/62 167/328/62 168/332/62 1001 | f 174/333/73 172/334/73 176/335/73 178/336/73 1002 | f 169/329/64 170/325/64 174/333/64 173/330/64 1003 | f 168/332/62 167/328/62 171/331/62 172/337/62 1004 | f 170/325/74 168/324/74 172/334/74 174/333/74 1005 | f 177/338/64 178/336/64 182/339/64 181/340/64 1006 | f 171/331/75 173/330/75 177/338/75 175/341/75 1007 | f 173/330/64 174/333/64 178/336/64 177/338/64 1008 | f 172/337/62 171/331/62 175/341/62 176/342/62 1009 | f 179/343/76 181/340/76 182/339/76 180/344/76 1010 | f 176/342/62 175/341/62 179/345/62 180/346/62 1011 | f 178/336/77 176/335/77 180/347/77 182/339/77 1012 | f 175/341/78 177/338/78 181/340/78 179/345/78 1013 | f 184/235/79 186/234/79 185/348/79 183/349/79 1014 | f 189/250/80 187/236/80 188/249/80 190/248/80 1015 | f 197/255/81 195/254/81 196/237/81 198/251/81 1016 | f 193/233/82 191/232/82 192/257/82 194/256/82 1017 | f 187/236/83 199/239/83 200/241/83 188/249/83 1018 | f 202/350/84 184/351/84 183/246/84 201/240/84 1019 | f 191/232/85 205/245/85 206/262/85 192/257/85 1020 | f 204/238/86 196/237/86 195/254/86 203/263/86 1021 | f 205/245/87 213/271/87 214/265/87 206/262/87 1022 | f 212/268/88 204/238/88 203/263/88 211/264/88 1023 | f 199/239/89 207/269/89 208/242/89 200/241/89 1024 | f 210/352/90 202/350/90 201/240/90 209/243/90 1025 | f 209/243/91 217/253/91 218/353/91 210/352/91 1026 | f 222/266/92 214/265/92 213/271/92 221/272/92 1027 | f 211/264/93 219/267/93 220/278/93 212/268/93 1028 | f 216/252/94 208/242/94 207/269/94 215/279/94 1029 | f 219/267/95 227/280/95 228/286/95 220/278/95 1030 | f 224/276/96 216/252/96 215/279/96 223/287/96 1031 | f 221/272/97 229/275/97 230/281/97 222/266/97 1032 | f 226/354/98 218/353/98 217/253/98 225/277/98 1033 | f 225/277/99 233/285/99 234/355/99 226/354/99 1034 | f 238/282/100 230/281/100 229/275/100 237/297/100 1035 | f 227/280/101 235/283/101 236/300/101 228/286/101 1036 | f 232/284/102 224/276/102 223/287/102 231/301/102 1037 | f 237/297/103 246/293/103 245/292/103 238/282/103 1038 | f 243/290/104 236/300/104 235/283/104 244/291/104 1039 | f 231/301/105 240/302/105 239/298/105 232/284/105 1040 | f 241/356/106 234/355/106 233/285/106 242/299/106 1041 | f 183/246/4 188/249/4 200/241/4 201/240/4 1042 | f 263/357/107 248/358/107 250/359/107 264/360/107 1043 | f 264/360/108 250/359/108 252/361/108 265/362/108 1044 | f 265/362/109 252/361/109 254/363/109 266/364/109 1045 | f 266/364/110 254/363/110 256/365/110 267/366/110 1046 | f 267/366/111 256/365/111 258/367/111 268/368/111 1047 | f 268/368/112 258/367/112 260/369/112 269/370/112 1048 | f 250/371/113 248/372/113 262/373/113 260/374/113 258/375/113 256/376/113 254/377/113 252/378/113 1049 | f 269/370/114 260/369/114 262/379/114 270/380/114 1050 | f 270/380/115 262/379/115 248/381/115 263/382/115 1051 | f 253/383/116 255/384/116 275/385/116 274/386/116 1052 | f 249/387/117 247/388/117 263/389/117 264/390/117 1053 | f 251/391/117 249/387/117 264/390/117 265/392/117 1054 | f 253/383/117 251/391/117 265/392/117 266/393/117 1055 | f 255/384/117 253/383/117 266/393/117 267/394/117 1056 | f 257/395/117 255/384/117 267/394/117 268/396/117 1057 | f 259/397/117 257/395/117 268/396/117 269/398/117 1058 | f 261/399/117 259/397/117 269/398/117 270/400/117 1059 | f 247/388/117 261/399/117 270/400/117 263/389/117 1060 | f 271/401/117 272/402/117 273/403/117 274/386/117 275/385/117 276/404/117 277/405/117 278/406/117 1061 | f 249/387/118 251/391/118 273/403/118 272/402/118 1062 | f 259/397/119 261/399/119 278/406/119 277/405/119 1063 | f 255/384/120 257/395/120 276/404/120 275/385/120 1064 | f 251/391/121 253/383/121 274/386/121 273/403/121 1065 | f 247/388/122 249/387/122 272/402/122 271/401/122 1066 | f 261/399/123 247/388/123 271/401/123 278/406/123 1067 | f 257/395/124 259/397/124 277/405/124 276/404/124 1068 | --------------------------------------------------------------------------------