├── .gitignore ├── bin └── assets │ ├── textures │ ├── crt.png │ ├── arcade1.png │ ├── crt_normal.png │ ├── scratchmap.png │ ├── Arcade2_emission.png │ └── Arcade2_texture.png │ ├── models │ ├── bunny.mtl │ ├── Arcade2_screen.obj │ ├── Arcade2.obj │ └── arcade1.obj │ └── shaders │ ├── screenspace.vs │ ├── gbuffer.fs │ ├── blur.fs │ ├── gbuffer.vs │ ├── lighting.fs │ ├── ssao.fs │ └── screenspace.fs ├── README.md ├── src ├── gbuffer.h ├── raylibext.h ├── gbuffer.c └── main.c ├── compile_commands.json └── makefile /.gitignore: -------------------------------------------------------------------------------- 1 | obj/ 2 | bin/*.exe -------------------------------------------------------------------------------- /bin/assets/textures/crt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotxnc/Raylib-GBuffers/HEAD/bin/assets/textures/crt.png -------------------------------------------------------------------------------- /bin/assets/textures/arcade1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotxnc/Raylib-GBuffers/HEAD/bin/assets/textures/arcade1.png -------------------------------------------------------------------------------- /bin/assets/textures/crt_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotxnc/Raylib-GBuffers/HEAD/bin/assets/textures/crt_normal.png -------------------------------------------------------------------------------- /bin/assets/textures/scratchmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotxnc/Raylib-GBuffers/HEAD/bin/assets/textures/scratchmap.png -------------------------------------------------------------------------------- /bin/assets/textures/Arcade2_emission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotxnc/Raylib-GBuffers/HEAD/bin/assets/textures/Arcade2_emission.png -------------------------------------------------------------------------------- /bin/assets/textures/Arcade2_texture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotxnc/Raylib-GBuffers/HEAD/bin/assets/textures/Arcade2_texture.png -------------------------------------------------------------------------------- /bin/assets/models/bunny.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl None 5 | Ns 0 6 | Ka 0.000000 0.000000 0.000000 7 | Kd 0.8 0.8 0.8 8 | Ks 0.8 0.8 0.8 9 | d 1 10 | illum 2 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This project doesn't work and is no longer maintained 2 | It's really cool to see people discovering this but just to end the confusion, you don't need this to implement gbuffers in Raylib anymore. 3 | 4 | # If you're running an ancient version of Raylib for some reason and still *really* need gbuffers 5 | 1. Don't use this. 6 | 2. You're going to need to patch rlgl.h with the version found in my gists. 7 | 3. Good luck. 8 | -------------------------------------------------------------------------------- /src/gbuffer.h: -------------------------------------------------------------------------------- 1 | #ifndef GBUFFER_H 2 | #define GBUFFER_H 3 | 4 | #include 5 | 6 | #include 7 | #include 8 | #include 9 | 10 | #include "glad.h" 11 | 12 | typedef struct gbuffer_t { 13 | unsigned int id; 14 | int width; 15 | int height; 16 | Texture2D color; 17 | Texture2D normal; 18 | Texture2D position; 19 | Texture2D depth; 20 | } gbuffer_t; 21 | 22 | gbuffer_t gbuffer_new(int, int); 23 | void gbuffer_init(gbuffer_t*, int, int); 24 | void gbuffer_begin(gbuffer_t*); 25 | void gbuffer_end(); 26 | void gbuffer_free(gbuffer_t*); 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /bin/assets/shaders/screenspace.vs: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | // Input vertex attributes 4 | in vec3 vertexPosition; 5 | in vec2 vertexTexCoord; 6 | in vec3 vertexNormal; 7 | in vec4 vertexColor; 8 | 9 | // Input uniform values 10 | uniform mat4 mvp; 11 | 12 | // Output vertex attributes (to fragment shader) 13 | out vec2 fragTexCoord; 14 | out vec4 fragColor; 15 | 16 | // NOTE: Add here your custom variables 17 | 18 | void main() 19 | { 20 | // Send vertex attributes to fragment shader 21 | fragTexCoord = vertexTexCoord; 22 | fragColor = vertexColor; 23 | 24 | // Calculate final vertex position 25 | gl_Position = mvp*vec4(vertexPosition, 1.0); 26 | } -------------------------------------------------------------------------------- /bin/assets/shaders/gbuffer.fs: -------------------------------------------------------------------------------- 1 | #version 330 2 | layout (location = 0) out vec3 gposition; 3 | layout (location = 1) out vec3 gnormal; 4 | layout (location = 2) out vec4 galbedospec; 5 | layout (location = 3) out vec4 gemission; 6 | 7 | in vec2 fragTexCoord; 8 | in vec3 fragPos; 9 | in vec3 fragNormal; 10 | 11 | uniform sampler2D texture0; // diffuse 12 | uniform sampler2D texture1; // specular 13 | uniform sampler2D texture2; // normals 14 | 15 | out vec4 finalColor; 16 | 17 | void main() 18 | { 19 | gnormal = texture(texture2, fragTexCoord).rgb; 20 | if (gnormal.r == 1 && gnormal.g == 1 && gnormal.b == 1) 21 | gnormal = fragNormal; 22 | 23 | gposition = fragPos; 24 | galbedospec.rgb = texture(texture0, fragTexCoord).rgb; 25 | galbedospec.a = texture(texture1, fragTexCoord).r; 26 | } 27 | -------------------------------------------------------------------------------- /compile_commands.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "arguments": [ 4 | "cc", 5 | "-c", 6 | "-o", 7 | "obj/gbuffer.o", 8 | "--std=c11", 9 | "-Wno-incompatible-pointer-types", 10 | "-Wno-int-conversion", 11 | "-Wno-unused-value", 12 | "-Isrc/", 13 | "src\\gbuffer.c" 14 | ], 15 | "directory": "C:\\Users\\patri\\Desktop\\Projects\\GBuffer_Raylib", 16 | "file": "src\\gbuffer.c" 17 | }, 18 | { 19 | "arguments": [ 20 | "cc", 21 | "-c", 22 | "-o", 23 | "obj/main.o", 24 | "--std=c11", 25 | "-Wno-incompatible-pointer-types", 26 | "-Wno-int-conversion", 27 | "-Wno-unused-value", 28 | "-Isrc/", 29 | "src\\main.c" 30 | ], 31 | "directory": "C:\\Users\\patri\\Desktop\\Projects\\GBuffer_Raylib", 32 | "file": "src\\main.c" 33 | } 34 | ] -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | rwildcard = $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) 2 | SRC = $(call rwildcard, src/, *.c) #$(wildcard src/*.cpp) $(wildcard src/engine/*.cpp) 3 | OBJ = $(patsubst src/%.c, obj/%.o, $(SRC)) 4 | CFLAGS = --std=c11 -Wno-incompatible-pointer-types -Wno-int-conversion -Wno-unused-value -Isrc/ 5 | NAME = arcade 6 | OUT = 7 | 8 | LDFLAGS = -Wl,-allow-multiple-definition -static-libgcc 9 | LIBS = 10 | comp = ${CC} 11 | ifeq ($(OS),Windows_NT) 12 | OUT = $(NAME).exe 13 | # CC += clang 14 | LDFLAGS += -static 15 | LIBS = -lraylib -lopengl32 -lgdi32 -llua 16 | else 17 | OUT = $(NAME) 18 | # CC += clang 19 | LIBS = -lraylib -lGL -lXxf86vm -lXext -lX11 -lXrandr -lXinerama -lXcursor -llua5.3 -lm -lpthread -ldl 20 | endif 21 | 22 | all: $(OUT) 23 | 24 | $(OUT): $(OBJ) 25 | @ test -d bin || mkdir bin 26 | $(comp) -o bin/$(OUT) $(CFLAGS) $(OBJ) $(LIBS) $(LDFLAGS) 27 | 28 | obj/%.o: src/%.c 29 | @ test -d $(@D) || mkdir $(@D) 30 | $(comp) -c $< -o $@ $(CFLAGS) 31 | 32 | clean: 33 | rm -r obj/* 34 | rm bin/$(OUT) 35 | 36 | run: 37 | cd bin; ./$(OUT) 38 | 39 | dbg: 40 | cd bin; gdb $(OUT) 41 | -------------------------------------------------------------------------------- /bin/assets/shaders/blur.fs: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | out vec4 finalColor; 4 | 5 | in vec2 fragTexCoord; 6 | 7 | uniform sampler2D texture0; 8 | uniform sampler2D ssaobuffer; 9 | 10 | vec4 blur13(sampler2D image, vec2 uv, vec2 resolution, vec2 direction) { 11 | vec4 color = vec4(0.0); 12 | vec2 off1 = vec2(1.411764705882353) * direction; 13 | vec2 off2 = vec2(3.2941176470588234) * direction; 14 | vec2 off3 = vec2(5.176470588235294) * direction; 15 | color += texture2D(image, uv) * 0.1964825501511404; 16 | color += texture2D(image, uv + (off1 / resolution)) * 0.2969069646728344; 17 | color += texture2D(image, uv - (off1 / resolution)) * 0.2969069646728344; 18 | color += texture2D(image, uv + (off2 / resolution)) * 0.09447039785044732; 19 | color += texture2D(image, uv - (off2 / resolution)) * 0.09447039785044732; 20 | color += texture2D(image, uv + (off3 / resolution)) * 0.010381362401148057; 21 | color += texture2D(image, uv - (off3 / resolution)) * 0.010381362401148057; 22 | return color; 23 | } 24 | 25 | void main() 26 | { 27 | vec2 texelsize = 1.f / vec2(1280, 720); 28 | vec4 result; 29 | for (int x = -2; x < 2; x++) { 30 | for (int y = -2; y < 2; y++) { 31 | vec2 offset = vec2(float(x), float(y)) * texelsize; 32 | result += texture(ssaobuffer, fragTexCoord+offset); 33 | } 34 | } 35 | vec3 color = vec3(result / (4.f*4.f)); 36 | finalColor = vec4(result / (4.f*4.f)); 37 | } 38 | -------------------------------------------------------------------------------- /bin/assets/shaders/gbuffer.vs: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | // Input vertex attributes 4 | in vec3 vertexPosition; 5 | in vec2 vertexTexCoord; 6 | in vec3 vertexNormal; 7 | in vec4 vertexColor; 8 | 9 | // Input uniform values 10 | uniform mat4 mvp; 11 | uniform mat4 modelMatrix; 12 | // uniform vec3 vertexNormal; 13 | 14 | // Output vertex attributes (to fragment shader) 15 | out vec2 fragTexCoord; 16 | out vec4 fragColor; 17 | out vec3 fragNormal; 18 | out vec3 fragPos; 19 | 20 | // NOTE: Add here your custom variables 21 | 22 | void main() 23 | { 24 | fragTexCoord = vertexTexCoord; 25 | fragColor = vertexColor; 26 | 27 | mat3 normalMatrix = transpose(inverse(mat3(modelMatrix))); 28 | fragNormal = normalize(normalMatrix*vertexNormal); 29 | 30 | fragPos = vec3(modelMatrix*vec4(vertexPosition, 1.0)); 31 | 32 | gl_Position = mvp*vec4(vertexPosition, 1.0); 33 | } 34 | 35 | 36 | // #version 330 37 | 38 | // // Input vertex attributes 39 | // in vec3 vertexPosition; 40 | // in vec2 vertexTexCoord; 41 | // in vec3 vertexNormal; 42 | // in vec4 vertexColor; 43 | 44 | // // Input uniform values 45 | // uniform mat4 mvp; 46 | 47 | // // Output vertex attributes (to fragment shader) 48 | // out vec2 fragTexCoord; 49 | // out vec4 fragColor; 50 | 51 | // // NOTE: Add here your custom variables 52 | 53 | // void main() 54 | // { 55 | // // Send vertex attributes to fragment shader 56 | // fragTexCoord = vertexTexCoord; 57 | // fragColor = vertexColor; 58 | 59 | // // Calculate final vertex position 60 | // gl_Position = mvp*vec4(vertexPosition, 1.0); 61 | // } -------------------------------------------------------------------------------- /bin/assets/shaders/lighting.fs: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | in vec2 fragTexCoord; 4 | in vec3 fragColor; 5 | 6 | out vec4 finalColor; 7 | 8 | uniform sampler2D texture0; 9 | uniform sampler2D colorbuffer; 10 | uniform sampler2D normalbuffer; 11 | uniform sampler2D positionbuffer; 12 | uniform sampler2D ssaobuffer; 13 | 14 | struct light { 15 | vec3 position; 16 | vec3 color; 17 | 18 | float linear; 19 | float quadratic; 20 | }; 21 | const int num_lights = 32; 22 | uniform light lights[num_lights]; 23 | uniform vec3 viewpos; 24 | 25 | vec3 calc_lighting() 26 | { 27 | vec3 Normal = texture(normalbuffer, fragTexCoord).rgb; 28 | vec3 FragPos = texture(positionbuffer, fragTexCoord).rgb; 29 | vec3 Diffuse = texture(colorbuffer, fragTexCoord).rgb; 30 | float Specular = texture(colorbuffer, fragTexCoord).a; 31 | 32 | vec3 lighting = Diffuse * 0.1; 33 | vec3 viewdir = normalize(viewpos - FragPos); 34 | for (int i = 0; i < num_lights; i++) { 35 | vec3 lightdir = normalize(lights[i].position - FragPos); 36 | vec3 diffuse = max(dot(Normal, lightdir), 0.0) * Diffuse * lights[i].color; 37 | 38 | vec3 halfwaydir = normalize(lightdir + viewdir); 39 | float spec = pow(max(dot(Normal, halfwaydir), 0.0), 16.0); 40 | vec3 specular = lights[i].color * spec * Specular; 41 | 42 | float distance = length(lights[i].position - FragPos); 43 | float attenuation = 1.0 / (1.0 + lights[i].linear * distance + lights[i].quadratic * distance * distance); 44 | diffuse *= attenuation; 45 | specular *= attenuation; 46 | lighting += diffuse + specular; 47 | } 48 | lighting *= texture(ssaobuffer, fragTexCoord).rgb; 49 | 50 | return lighting; 51 | 52 | } 53 | 54 | void main() 55 | { 56 | finalColor = vec4(calc_lighting(), 1); 57 | } 58 | -------------------------------------------------------------------------------- /src/raylibext.h: -------------------------------------------------------------------------------- 1 | #ifndef RAYLIBEXT_H 2 | #define RAYLIBEXT_H 3 | 4 | #include 5 | #include 6 | #include "glad.h" 7 | 8 | int GetShaderUniform(Shader s, const char* name) 9 | { 10 | int loc = -1; 11 | loc = glGetUniformLocation(s.id, name); 12 | return loc; 13 | } 14 | 15 | void BindShaderTexture(Shader s, const char* name, int id) 16 | { 17 | int loc = GetShaderUniform(s, name); 18 | SetShaderValuei(s, loc, &id, 1); 19 | } 20 | 21 | void SetModelMap(Model* m, TexmapIndex i, Texture2D t) 22 | { 23 | m->material.maps[i].texture = t; 24 | } 25 | 26 | void SetModelShader(Model* m, Shader s) 27 | { 28 | m->material.shader = s; 29 | } 30 | 31 | void SetShaderTexture(Texture2D t, int i) 32 | { 33 | glActiveTexture(GL_TEXTURE0+i); 34 | glBindTexture(GL_TEXTURE_2D, t.id); 35 | } 36 | 37 | void SetShaderTexturei(unsigned int id, int i) 38 | { 39 | glActiveTexture(GL_TEXTURE0+i); 40 | glBindTexture(GL_TEXTURE_2D, id); 41 | } 42 | 43 | void SetShaderVector2(Shader s, const char* n, Vector2 v) 44 | { 45 | SetShaderValue(s, GetShaderUniform(s,n), (float*)&v, 2); 46 | } 47 | 48 | void SetShaderVector3(Shader s, const char* n, Vector3 v) 49 | { 50 | SetShaderValue(s, GetShaderUniform(s,n), (float*)&v, 3); 51 | } 52 | 53 | void SetShaderVector4(Shader s, const char* n, Vector4 v) 54 | { 55 | SetShaderValue(s, GetShaderUniform(s,n), (float*)&v, 4); 56 | } 57 | 58 | void SetShaderFloat(Shader s, const char*n, float f) 59 | { 60 | SetShaderValue(s, GetShaderUniform(s,n), &f, 1); 61 | } 62 | 63 | void SetShaderInt(Shader s, const char*n, int i) 64 | { 65 | SetShaderValuei(s, GetShaderUniform(s,n), &i, 1); 66 | } 67 | 68 | void DrawTextureFlipped(Texture2D t) 69 | { 70 | DrawTexturePro(t, (Rectangle){0, 0, t.width, -t.height}, (Rectangle){0, 0, t.width, t.height}, Vector2Zero(), 0.f, WHITE); 71 | } 72 | 73 | #endif 74 | -------------------------------------------------------------------------------- /bin/assets/shaders/ssao.fs: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | out vec4 finalColor; 4 | 5 | in vec2 fragTexCoord; 6 | 7 | uniform sampler2D texture0; 8 | uniform sampler2D normalbuffer; 9 | uniform sampler2D depthbuffer; 10 | uniform sampler2D noisebuffer; 11 | uniform vec3 samples[64]; 12 | 13 | const vec2 noisescale = vec2(1280.f/4.f, 720.f/4.f); 14 | const float factor = 1.f / 64.f; 15 | 16 | vec2 saturate(vec2 x) 17 | { 18 | vec2 t; 19 | float a = x.x; 20 | float b = x.y; 21 | t.x = max(0, min(1, a)); 22 | t.y = max(0, min(1, b)); 23 | return t; 24 | } 25 | 26 | float saturate(float x) 27 | { 28 | return max(0, min(1, x)); 29 | } 30 | 31 | vec3 depthnormal(float depth) 32 | { 33 | const vec2 offset1 = vec2(0.0f,0.001f); 34 | const vec2 offset2 = vec2(0.001f,0.0f); 35 | 36 | float depth1 = texture(depthbuffer, fragTexCoord+offset1).r; 37 | float depth2 = texture(depthbuffer, fragTexCoord+offset2).r; 38 | 39 | vec3 p1 = vec3(offset1, depth1 - depth); 40 | vec3 p2 = vec3(offset2, depth2 - depth); 41 | 42 | vec3 normal = cross(p1,p2); 43 | normal.z = -normal.z; 44 | 45 | return normalize(normal); 46 | } 47 | 48 | vec3 calc_ssao() 49 | { 50 | vec3 Normal = texture(normalbuffer, fragTexCoord).rgb; 51 | 52 | vec3 randomVec = normalize(texture(noisebuffer, fragTexCoord*noisescale).rgb).xyz; 53 | 54 | float depth = texture(depthbuffer, fragTexCoord).r; 55 | // Normal = depthnormal(depth); 56 | 57 | float radius_depth = 0.5f/depth; 58 | float occlusion = 0.f; 59 | for (int i = 0; i < 64; i++) 60 | { 61 | vec3 ray = radius_depth * reflect(samples[i], randomVec); 62 | vec3 hemi_ray = vec3(fragTexCoord, depth) + sign(dot(ray,Normal))*ray; 63 | float occ_depth = texture(depthbuffer, saturate(hemi_ray.xy)).r; 64 | float difference = depth - occ_depth; 65 | occlusion += step(0.000001f, difference) * (1.f-smoothstep(0.000001f, 0.0075f, difference)); 66 | } 67 | float ao = 1.f - 1.f * occlusion * factor; 68 | occlusion = saturate(ao + 0.2f); 69 | 70 | return vec3(occlusion); 71 | } 72 | 73 | void main() 74 | { 75 | vec3 color = calc_ssao(); 76 | finalColor = vec4(color, 1.f); 77 | // finalColor = texture(normalbuffer, fragTexCoord); 78 | } 79 | -------------------------------------------------------------------------------- /bin/assets/models/Arcade2_screen.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: 'arcade2_p3.blend' 2 | # www.blender.org 3 | mtllib Arcade2_screen.mtl 4 | o Cube.001_Cube.004 5 | v 0.694728 2.783313 0.554760 6 | v 0.694728 3.702927 0.408559 7 | v -0.698587 2.783313 0.554759 8 | v -0.698587 3.702927 0.408558 9 | v -0.559256 2.782581 0.569367 10 | v -0.419924 2.781849 0.584979 11 | v -0.280593 2.781230 0.599154 12 | v -0.141261 2.780809 0.609450 13 | v -0.001930 2.780652 0.613425 14 | v 0.137402 2.780809 0.609450 15 | v 0.276733 2.781230 0.599154 16 | v 0.416065 2.781849 0.584979 17 | v 0.555396 2.782581 0.569367 18 | v -0.559256 3.706910 0.423166 19 | v -0.419924 3.711128 0.438778 20 | v -0.280593 3.714910 0.452953 21 | v -0.141261 3.717654 0.463249 22 | v -0.001930 3.718720 0.467223 23 | v 0.137402 3.717654 0.463249 24 | v 0.276733 3.714910 0.452953 25 | v 0.416065 3.711128 0.438778 26 | v 0.555396 3.706910 0.423166 27 | vt 0.999918 0.000082 28 | vt 0.900000 1.000000 29 | vt 0.899935 0.000082 30 | vt 0.000082 0.000082 31 | vt 0.100000 1.000000 32 | vt 0.000000 1.000000 33 | vt 0.100065 0.000082 34 | vt 0.200000 1.000000 35 | vt 0.200049 0.000082 36 | vt 0.300000 1.000000 37 | vt 0.300033 0.000082 38 | vt 0.400000 1.000000 39 | vt 0.400016 0.000082 40 | vt 0.500000 1.000000 41 | vt 0.599984 0.000082 42 | vt 0.500000 0.000082 43 | vt 0.699967 0.000082 44 | vt 0.600000 1.000000 45 | vt 0.799951 0.000082 46 | vt 0.700000 1.000000 47 | vt 0.800000 1.000000 48 | vt 1.000000 1.000000 49 | vn 0.1027 0.1555 0.9825 50 | vn 0.1108 0.1556 0.9816 51 | vn 0.1060 0.1550 0.9822 52 | vn -0.1027 0.1555 0.9825 53 | vn -0.1108 0.1556 0.9816 54 | vn -0.1074 0.1561 0.9819 55 | vn -0.1060 0.1550 0.9822 56 | vn -0.1091 0.1548 0.9819 57 | vn -0.1044 0.1542 0.9825 58 | vn -0.0897 0.1544 0.9839 59 | vn -0.0858 0.1539 0.9843 60 | vn -0.0523 0.1542 0.9866 61 | vn -0.0501 0.1539 0.9868 62 | vn 0.0000 0.1541 0.9880 63 | vn 0.0501 0.1539 0.9868 64 | vn 0.0000 0.1540 0.9881 65 | vn 0.0858 0.1539 0.9843 66 | vn 0.0523 0.1542 0.9866 67 | vn 0.1044 0.1542 0.9825 68 | vn 0.0897 0.1544 0.9839 69 | vn 0.1091 0.1548 0.9819 70 | vn 0.1074 0.1561 0.9819 71 | usemtl Material.001 72 | s 1 73 | f 1/1/1 22/2/2 13/3/3 74 | f 3/4/4 14/5/5 4/6/6 75 | f 5/7/7 15/8/8 14/5/5 76 | f 6/9/9 16/10/10 15/8/8 77 | f 7/11/11 17/12/12 16/10/10 78 | f 8/13/13 18/14/14 17/12/12 79 | f 10/15/15 18/14/14 9/16/16 80 | f 11/17/17 19/18/18 10/15/15 81 | f 12/19/19 20/20/20 11/17/17 82 | f 13/3/3 21/21/21 12/19/19 83 | f 1/1/1 2/22/22 22/2/2 84 | f 3/4/4 5/7/7 14/5/5 85 | f 5/7/7 6/9/9 15/8/8 86 | f 6/9/9 7/11/11 16/10/10 87 | f 7/11/11 8/13/13 17/12/12 88 | f 8/13/13 9/16/16 18/14/14 89 | f 10/15/15 19/18/18 18/14/14 90 | f 11/17/17 20/20/20 19/18/18 91 | f 12/19/19 21/21/21 20/20/20 92 | f 13/3/3 22/2/2 21/21/21 93 | -------------------------------------------------------------------------------- /bin/assets/shaders/screenspace.fs: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | 3 | in vec2 fragTexCoord; 4 | in vec3 fragColor; 5 | 6 | out vec4 finalColor; 7 | 8 | uniform sampler2D texture0; 9 | uniform sampler2D colorbuffer; 10 | uniform sampler2D normalbuffer; 11 | uniform sampler2D positionbuffer; 12 | uniform sampler2D depthbuffer; 13 | uniform sampler2D noisebuffer; 14 | 15 | struct light { 16 | vec3 position; 17 | vec3 color; 18 | 19 | float linear; 20 | float quadratic; 21 | }; 22 | const int num_lights = 32; 23 | uniform light lights[num_lights]; 24 | uniform vec3 viewpos; 25 | 26 | uniform mat4 projection; 27 | 28 | uniform vec3 samples[64]; 29 | const vec2 noisescale = vec2(1280.f/4.f, 720.f/4.f); 30 | 31 | const float factor = 1.0f / 64.0f; 32 | 33 | vec3 calc_lighting() 34 | { 35 | vec3 Normal = texture(normalbuffer, fragTexCoord).rgb; 36 | vec3 FragPos = texture(positionbuffer, fragTexCoord).rgb; 37 | vec3 Diffuse = texture(colorbuffer, fragTexCoord).rgb; 38 | float Specular = texture(colorbuffer, fragTexCoord).a; 39 | 40 | vec3 lighting = Diffuse * 0.1; 41 | vec3 viewdir = normalize(viewpos - FragPos); 42 | for (int i = 0; i < num_lights; i++) { 43 | vec3 lightdir = normalize(lights[i].position - FragPos); 44 | vec3 diffuse = max(dot(Normal, lightdir), 0.0) * Diffuse * lights[i].color; 45 | 46 | vec3 halfwaydir = normalize(lightdir + viewdir); 47 | float spec = pow(max(dot(Normal, halfwaydir), 0.0), 16.0); 48 | vec3 specular = lights[i].color * spec * Specular; 49 | 50 | float distance = length(lights[i].position - FragPos); 51 | float attenuation = 1.0 / (1.0 + lights[i].linear * distance + lights[i].quadratic * distance * distance); 52 | diffuse *= attenuation; 53 | specular *= attenuation; 54 | lighting += diffuse + specular; 55 | } 56 | 57 | return lighting; 58 | 59 | } 60 | 61 | vec2 saturate(vec2 x) 62 | { 63 | vec2 t; 64 | float a = x.x; 65 | float b = x.y; 66 | t.x = max(0, min(1, a)); 67 | t.y = max(0, min(1, b)); 68 | return t; 69 | // return max(vec2(0), min(vec2(1), x)); 70 | } 71 | 72 | float saturate(float x) 73 | { 74 | return max(0, min(1, x)); 75 | } 76 | 77 | vec3 depthnormal(float depth) 78 | { 79 | const vec2 offset1 = vec2(0.0f,0.001f); 80 | const vec2 offset2 = vec2(0.001f,0.0f); 81 | 82 | float depth1 = texture(depthbuffer, fragTexCoord+offset1).r; 83 | float depth2 = texture(depthbuffer, fragTexCoord+offset2).r; 84 | 85 | vec3 p1 = vec3(offset1, depth1 - depth); 86 | vec3 p2 = vec3(offset2, depth2 - depth); 87 | 88 | vec3 normal = cross(p1,p2); 89 | normal.z = -normal.z; 90 | 91 | return normalize(normal); 92 | } 93 | 94 | vec3 calc_ssao() 95 | { 96 | vec3 Normal = texture(normalbuffer, fragTexCoord).rgb; 97 | vec3 FragPos = texture(positionbuffer, fragTexCoord).rgb; 98 | vec3 Diffuse = texture(colorbuffer, fragTexCoord).rgb; 99 | float Specular = texture(colorbuffer, fragTexCoord).a; 100 | 101 | vec3 randomVec = normalize(texture(noisebuffer, fragTexCoord*noisescale).rgb).xyz; 102 | 103 | // vec3 tangent = normalize(randomVec - Normal * dot(randomVec, Normal)).xyz; 104 | // vec3 bitangent = cross(Normal, tangent).xyz; 105 | // mat3 TBN = mat3(tangent, bitangent, Normal); 106 | 107 | // float occlusion = 0.0; 108 | // for (int i = 0; i < 64; i++) 109 | // { 110 | // vec3 samp = TBN * samples[i]; 111 | // samp = FragPos + samp * 0.5; 112 | 113 | // vec4 offset = vec4(samp, 1.0); 114 | // offset = projection * offset; 115 | // offset.xyz /= offset.w; 116 | // offset.xyz = offset.xyz * 0.5 + 0.5; 117 | // offset.xy = vec2(offset.x, 1.0-offset.y); 118 | 119 | // float sampleDepth = texture(positionbuffer, offset.xy).z; 120 | 121 | // float rangeCheck = smoothstep(0.0, 1.0, 0.5 / abs(FragPos.z - sampleDepth)); 122 | // occlusion += (sampleDepth >= samp.z + 0.025 ? 1.0 : 0.0) * rangeCheck; 123 | // } 124 | 125 | // occlusion = 1.0f - (occlusion * factor); 126 | float depth = texture(depthbuffer, fragTexCoord).r; 127 | float f = 10.f; 128 | float n = 0.01f; 129 | // depth = 2.f*n/(f+n-depth*(f-n)); 130 | Normal = depthnormal(depth); 131 | // return Normal; 132 | 133 | float radius_depth = 0.1f/depth; 134 | float occlusion = 0.f; 135 | for (int i = 0; i < 64; i++) 136 | { 137 | vec3 ray = radius_depth * reflect(samples[i], randomVec); 138 | vec3 hemi_ray = vec3(fragTexCoord, depth) + sign(dot(ray,Normal))*ray; 139 | float occ_depth = texture(depthbuffer, saturate(hemi_ray.xy)).r; 140 | float difference = depth - occ_depth; 141 | occlusion += step(0.000001f, difference) * (1.f-smoothstep(0.000001f, 0.0075f, difference)); 142 | } 143 | float ao = 1.f - 1.f * occlusion * factor; 144 | occlusion = saturate(ao + 0.2f); 145 | 146 | return vec3(occlusion); 147 | 148 | } 149 | 150 | void main() 151 | { 152 | 153 | vec3 color = vec3(0); 154 | color = calc_lighting(); 155 | color *= calc_ssao(); 156 | // color = texture(normalbuffer, fragTexCoord).rgb; 157 | 158 | finalColor = vec4(color, 1);//*texture(depthbuffer, fragTexCoord); 159 | 160 | if (fragTexCoord.x < 0.05 && fragTexCoord.y < 0.1) 161 | finalColor = vec4(viewpos, 1); 162 | } 163 | -------------------------------------------------------------------------------- /src/gbuffer.c: -------------------------------------------------------------------------------- 1 | #include "gbuffer.h" 2 | 3 | 4 | gbuffer_t gbuffer_new(int width, int height) 5 | { 6 | gbuffer_t gbuffer; 7 | gbuffer_init(&gbuffer, width, height); 8 | return gbuffer; 9 | } 10 | 11 | void gbuffer_init(gbuffer_t* gbuffer, int width, int height) 12 | { 13 | gbuffer->id = 0; 14 | gbuffer->width = width; 15 | gbuffer->height = height; 16 | 17 | gbuffer->color.id = 0; 18 | gbuffer->color.width = width; 19 | gbuffer->color.height = height; 20 | gbuffer->color.format = UNCOMPRESSED_R8G8B8A8; 21 | gbuffer->color.mipmaps = 0; 22 | 23 | gbuffer->normal.id = 0; 24 | gbuffer->normal.width = width; 25 | gbuffer->normal.height = height; 26 | gbuffer->normal.format = UNCOMPRESSED_R8G8B8A8; 27 | gbuffer->normal.mipmaps = 0; 28 | 29 | gbuffer->position.id = 0; 30 | gbuffer->position.width = width; 31 | gbuffer->position.height = height; 32 | gbuffer->position.format = UNCOMPRESSED_R8G8B8A8; 33 | gbuffer->position.mipmaps = 0; 34 | 35 | glGenFramebuffers(1, &gbuffer->id); 36 | glBindFramebuffer(GL_FRAMEBUFFER, gbuffer->id); 37 | 38 | glGenTextures(1, &gbuffer->position.id); 39 | glBindTexture(GL_TEXTURE_2D, gbuffer->position.id); 40 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL); 41 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 42 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 43 | glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gbuffer->position.id, 0); 44 | 45 | glGenTextures(1, &gbuffer->normal.id); 46 | glBindTexture(GL_TEXTURE_2D, gbuffer->normal.id); 47 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL); 48 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 49 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 50 | glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gbuffer->normal.id, 0); 51 | 52 | glGenTextures(1, &gbuffer->color.id); 53 | glBindTexture(GL_TEXTURE_2D, gbuffer->color.id); 54 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 55 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 56 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 57 | glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gbuffer->color.id, 0); 58 | 59 | unsigned int buffers[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2}; 60 | glDrawBuffers(3, buffers); 61 | 62 | glGenTextures(1, &gbuffer->depth.id); 63 | glBindTexture(GL_TEXTURE_2D, gbuffer->depth.id); 64 | glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); 65 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 66 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 67 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 68 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 69 | glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gbuffer->depth.id, 0); 70 | 71 | GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 72 | if (status != GL_FRAMEBUFFER_COMPLETE) { 73 | // TraceLog(LOG_WARNING, "Framebuffer object could not be created..."); 74 | 75 | switch (status) 76 | { 77 | case GL_FRAMEBUFFER_UNSUPPORTED: break; 78 | case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: TraceLog(LOG_WARNING, "Framebuffer incomplete attachment"); break; 79 | #if defined(GRAPHICS_API_OPENGL_ES2) 80 | case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: TraceLog(LOG_WARNING, "Framebuffer incomplete dimensions"); break; 81 | #endif 82 | case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: TraceLog(LOG_WARNING, "Framebuffer incomplete missing attachment"); break; 83 | } 84 | } 85 | printf("\t\tFRAMEBUFFER STATUS : %d : %s\n", status, status==GL_FRAMEBUFFER_COMPLETE?"TRUE":"FALSE"); 86 | 87 | glBindFramebuffer(GL_FRAMEBUFFER, 0); 88 | 89 | } 90 | 91 | void gbuffer_begin(gbuffer_t* gbuffer) 92 | { 93 | rlglDraw(); 94 | 95 | rlEnableRenderTexture(gbuffer->id); 96 | 97 | rlClearScreenBuffers(); 98 | 99 | rlViewport(0, 0, gbuffer->width, gbuffer->height); 100 | 101 | rlMatrixMode(RL_PROJECTION); 102 | rlLoadIdentity(); 103 | 104 | rlOrtho(0, gbuffer->width, gbuffer->height, 0, 0, 1); 105 | 106 | rlMatrixMode(RL_MODELVIEW); 107 | rlLoadIdentity(); 108 | 109 | glDisable(GL_BLEND); 110 | } 111 | 112 | void gbuffer_end() 113 | { 114 | glEnable(GL_BLEND); 115 | rlglDraw(); 116 | 117 | rlDisableRenderTexture(); 118 | 119 | rlViewport(0, 0, GetScreenWidth(), GetScreenHeight()); 120 | 121 | rlMatrixMode(RL_PROJECTION); 122 | rlLoadIdentity(); 123 | 124 | rlOrtho(0, GetScreenWidth(), GetScreenHeight(), 0, 0, 1); 125 | 126 | rlMatrixMode(RL_MODELVIEW); 127 | rlLoadIdentity(); 128 | } 129 | 130 | void gbuffer_free(gbuffer_t* gbuffer) 131 | { 132 | glDeleteFramebuffers(1, &gbuffer->id); 133 | glDeleteTextures(1, &gbuffer->color.id); 134 | glDeleteTextures(1, &gbuffer->normal.id); 135 | glDeleteTextures(1, &gbuffer->position.id); 136 | } 137 | 138 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "gbuffer.h" 4 | #include "raylibext.h" 5 | 6 | float lerp(float a, float b, float f) 7 | { 8 | return a + f * (b - a); 9 | } 10 | 11 | float random() 12 | { 13 | return (float)rand()/(float)RAND_MAX; 14 | } 15 | 16 | unsigned int generate_noise() 17 | { 18 | 19 | float ssaoNoise[16*3]; 20 | for (int i = 0; i < 16*3; i+=3) { 21 | ssaoNoise[i+0] = (float)(rand()/(float)RAND_MAX)*2.0-1.0; 22 | ssaoNoise[i+1] = (float)(rand()/(float)RAND_MAX)*2.0-1.0; 23 | ssaoNoise[i+2] = 0.f; 24 | } 25 | 26 | unsigned int noise; 27 | glGenTextures(1, &noise); 28 | glBindTexture(GL_TEXTURE_2D, noise); 29 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 4, 4, 0, GL_RGB, GL_FLOAT, &ssaoNoise); 30 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 31 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 32 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 33 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 34 | glBindTexture(GL_TEXTURE_2D, 0); 35 | return noise; 36 | } 37 | 38 | int main(int argc, char** argv) 39 | { 40 | 41 | InitWindow(1280, 720, "gbuffer"); 42 | SetTargetFPS(60); 43 | SetExitKey(KEY_F12); 44 | 45 | 46 | Camera camera = {{0, 3.5, 3}, {0, 3, 0}, {0, 1, 0}, 90.f, CAMERA_PERSPECTIVE}; 47 | SetCameraMode(camera, CAMERA_FIRST_PERSON); 48 | 49 | SetMousePosition(Vector2Zero()); 50 | // load shaders 51 | Shader gbuffer_shader = LoadShader("assets/shaders/gbuffer.vs", "assets/shaders/gbuffer.fs"); 52 | gbuffer_shader.locs[LOC_MATRIX_MODEL] = GetShaderLocation(gbuffer_shader, "modelMatrix"); 53 | 54 | Shader ssao = LoadShader(0, "assets/shaders/ssao.fs"); 55 | BindShaderTexture(ssao, "normalbuffer", 1); 56 | BindShaderTexture(ssao, "depthbuffer", 2); 57 | BindShaderTexture(ssao, "noisebuffer", 3); 58 | 59 | Shader blur = LoadShader(0, "assets/shaders/blur.fs"); 60 | BindShaderTexture(blur, "ssaobuffer", 1); 61 | 62 | Shader lighting = LoadShader(0, "assets/shaders/lighting.fs"); 63 | BindShaderTexture(lighting, "colorbuffer", 1); 64 | BindShaderTexture(lighting, "normalbuffer", 2); 65 | BindShaderTexture(lighting, "positionbuffer", 3); 66 | BindShaderTexture(lighting, "ssaobuffer", 4); 67 | 68 | // load models 69 | Model model = LoadModel("assets/models/Arcade2.obj"); 70 | SetModelShader(&model, gbuffer_shader); 71 | SetModelMap(&model, MAP_DIFFUSE, LoadTexture("assets/textures/Arcade2_texture.png")); 72 | SetModelMap(&model, MAP_METALNESS, GetTextureDefault()); 73 | SetModelMap(&model, MAP_NORMAL, GetTextureDefault()); 74 | 75 | Model screen = LoadModel("assets/models/Arcade2_screen.obj"); 76 | SetModelShader(&screen, gbuffer_shader); 77 | SetModelMap(&screen, MAP_DIFFUSE, LoadTexture("assets/textures/crt.png")); 78 | SetModelMap(&screen, MAP_SPECULAR, GetTextureDefault()); 79 | SetModelMap(&screen, MAP_NORMAL, GetTextureDefault()); 80 | 81 | Model teapot = LoadModel("assets/models/utah-teapot.obj"); 82 | SetModelShader(&teapot, gbuffer_shader); 83 | SetModelMap(&teapot, MAP_DIFFUSE, GetTextureDefault()); 84 | SetModelMap(&teapot, MAP_SPECULAR, GetTextureDefault()); 85 | SetModelMap(&teapot, MAP_NORMAL, GetTextureDefault()); 86 | 87 | Model bunny = LoadModel("assets/models/bunny.obj"); 88 | SetModelShader(&bunny, gbuffer_shader); 89 | SetModelMap(&bunny, MAP_DIFFUSE, GetTextureDefault()); 90 | SetModelMap(&bunny, MAP_SPECULAR, GetTextureDefault()); 91 | SetModelMap(&bunny, MAP_NORMAL, GetTextureDefault()); 92 | 93 | Model ground = LoadModelFromMesh(GenMeshPlane(100, 100, 5, 5)); 94 | SetModelShader(&ground, gbuffer_shader); 95 | SetModelMap(&ground, MAP_DIFFUSE, GetTextureDefault()); 96 | SetModelMap(&ground, MAP_SPECULAR, GetTextureDefault()); 97 | SetModelMap(&ground, MAP_NORMAL, GetTextureDefault()); 98 | 99 | Mesh light_mesh = GenMeshSphere(1, 10, 10); 100 | Model light = LoadModelFromMesh(light_mesh); 101 | SetModelShader(&light, gbuffer_shader); 102 | SetModelMap(&light, MAP_DIFFUSE, GetTextureDefault()); 103 | SetModelMap(&light, MAP_SPECULAR, GetTextureDefault()); 104 | SetModelMap(&light, MAP_NORMAL, GetTextureDefault()); 105 | 106 | // set light uniforms 107 | SetShaderVector3(lighting, "lights[0].position", (Vector3){0, 3, 1.5}); 108 | SetShaderVector3(lighting, "lights[0].color", (Vector3){0, 1, 1}); 109 | SetShaderFloat(lighting, "lights[0].linear", 0.7); 110 | SetShaderFloat(lighting, "lights[0].quadratic",1.8); 111 | 112 | SetShaderVector3(lighting, "lights[1].position", (Vector3){1, 3, 0}); 113 | SetShaderVector3(lighting, "lights[1].color", (Vector3){0, 1, 0}); 114 | SetShaderFloat(lighting, "lights[1].linear", 0.7); 115 | SetShaderFloat(lighting, "lights[1].quadratic",1.8); 116 | 117 | SetShaderVector3(lighting, "lights[2].position", (Vector3){-1, 3, 0}); 118 | SetShaderVector3(lighting, "lights[2].color", (Vector3){1, 0, 0}); 119 | SetShaderFloat(lighting, "lights[2].linear", 0.7); 120 | SetShaderFloat(lighting, "lights[2].quadratic",1.8); 121 | 122 | SetShaderVector3(lighting, "lights[3].position", (Vector3){0, 0.5, 0}); 123 | SetShaderVector3(lighting, "lights[3].color", (Vector3){1, 1, 1}); 124 | SetShaderFloat(lighting, "lights[3].linear", 0.7); 125 | SetShaderFloat(lighting, "lights[3].quadratic",1.8); 126 | 127 | // ssao samples and noise 128 | for (int i = 0; i < 64; i++) { 129 | Vector3 sample = {((float)rand()/(float)RAND_MAX) * 2.0 - 1.0, ((float)rand()/(float)RAND_MAX) * 2.0 - 1.0, ((float)rand()/(float)RAND_MAX)}; 130 | sample = Vector3Normalize(sample); 131 | sample = Vector3Multiply(sample, (float)rand()/(float)RAND_MAX); 132 | float scale = (float)i/64.f; 133 | 134 | scale = lerp(0.1f, 1.f, scale*scale); 135 | sample = Vector3Multiply(sample, scale); 136 | 137 | SetShaderVector3(ssao, FormatText("samples[%d]", i), sample); 138 | } 139 | unsigned int noise = generate_noise(); 140 | 141 | // framebuffers 142 | gbuffer_t gbuffer = gbuffer_new(1280, 720); 143 | 144 | RenderTexture2D t = LoadRenderTexture(1280, 720); 145 | RenderTexture2D ssao_buffer = LoadRenderTexture(1280, 720); 146 | RenderTexture2D ssao_blurred = LoadRenderTexture(1280, 720); 147 | 148 | // debug 149 | bool ssao_enabled = true; 150 | bool gbuffer_enabled = true; 151 | 152 | while (!WindowShouldClose()) 153 | { 154 | UpdateCamera(&camera); 155 | SetShaderVector3(lighting, "viewpos", camera.position); 156 | 157 | if (IsKeyPressed(KEY_F1)) ssao_enabled = !ssao_enabled; 158 | if (IsKeyPressed(KEY_F2)) gbuffer_enabled = !gbuffer_enabled; 159 | 160 | BeginDrawing(); 161 | ClearBackground(BLACK); 162 | 163 | // SetShaderVector3(lighting, "lights[0].position", (Vector3){0, 3+cos(GetTime()), 1.5}); 164 | // SetShaderVector3(lighting, "lights[1].position", (Vector3){1, 3, cos(GetTime())}); 165 | // SetShaderVector3(lighting, "lights[2].position", (Vector3){-1, 3, -cos(GetTime())}); 166 | // SetShaderVector3(lighting, "lights[3].position", (Vector3){-sin(GetTime())*2, 0.5, -cos(GetTime())*2}); 167 | 168 | gbuffer_begin(&gbuffer); 169 | BeginMode3D(camera);; 170 | DrawModel(model, Vector3Zero(), 1.f, WHITE); 171 | DrawModel(screen, Vector3Zero(), 1.f, WHITE); 172 | DrawModel(bunny, (Vector3){0, 2.75, 1}, 1.f, WHITE); 173 | // DrawModel(light, (Vector3){0, 3+cos(GetTime()), 1.5}, 0.1, BLUE); 174 | // DrawModel(light, (Vector3){1, 3, cos(GetTime())}, 0.1, BLUE); 175 | // DrawModel(light, (Vector3){-1, 3, -cos(GetTime())}, 0.1, BLUE); 176 | // DrawModel(light, (Vector3){-sin(GetTime())*2, 0.5, -cos(GetTime())*2}, 0.1, BLUE); 177 | DrawModel(ground, Vector3Zero(), 1.f, WHITE); 178 | EndMode3D(); 179 | gbuffer_end(); 180 | 181 | BeginTextureMode(ssao_buffer); BeginShaderMode(ssao); 182 | SetShaderTexture(gbuffer.normal, 1); 183 | SetShaderTexture(gbuffer.depth, 2); 184 | SetShaderTexturei(noise, 3); 185 | DrawTextureFlipped(t.texture); 186 | EndShaderMode(); EndTextureMode(); 187 | 188 | BeginTextureMode(ssao_blurred); BeginShaderMode(blur); 189 | SetShaderTexture(ssao_buffer.texture, 1); 190 | DrawTextureFlipped(t.texture); 191 | EndShaderMode(); EndTextureMode(); 192 | 193 | if (gbuffer_enabled) { 194 | BeginShaderMode(lighting); 195 | SetShaderTexture(gbuffer.color, 1); 196 | SetShaderTexture(gbuffer.normal, 2); 197 | SetShaderTexture(gbuffer.position, 3); 198 | if (ssao_enabled) SetShaderTexture(ssao_blurred.texture, 4); 199 | else SetShaderTexture(GetTextureDefault(), 4); 200 | DrawTextureFlipped(t.texture); 201 | EndShaderMode(); 202 | } 203 | else { 204 | DrawTextureFlipped(gbuffer.color); 205 | } 206 | 207 | DrawText("Deferred rendering in raylib.", 10, 10, 20, RED); 208 | DrawText(FormatText("F1 = Toggle SSAO = %s", ssao_enabled ? "ON" : "OFF"), 10, 35, 20, GREEN); 209 | DrawText(FormatText("F2 = Toggle GBuffers = %s", gbuffer_enabled ? "ON" : "OFF"), 10, 60, 20, GREEN); 210 | 211 | EndDrawing(); 212 | } 213 | 214 | UnloadModel(model); 215 | UnloadModel(screen); 216 | UnloadModel(teapot); 217 | UnloadModel(bunny); 218 | UnloadModel(ground); 219 | UnloadModel(light); 220 | UnloadShader(gbuffer_shader); 221 | UnloadShader(ssao); 222 | UnloadShader(blur); 223 | UnloadShader(lighting); 224 | UnloadRenderTexture(t); 225 | UnloadRenderTexture(ssao_buffer); 226 | UnloadRenderTexture(ssao_blurred); 227 | gbuffer_free(&gbuffer); 228 | CloseWindow(); 229 | 230 | return 0; 231 | } -------------------------------------------------------------------------------- /bin/assets/models/Arcade2.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: 'arcade2_p3.blend' 2 | # www.blender.org 3 | mtllib Arcade2.mtl 4 | o Cube_Cube.001 5 | v 0.340015 1.820020 0.799955 6 | v 0.340015 1.979981 0.799955 7 | v 0.459985 1.820020 0.799955 8 | v 0.459985 1.979981 0.799955 9 | v 0.540015 1.820020 0.799955 10 | v 0.540015 1.979981 0.799955 11 | v 0.659985 1.820020 0.799955 12 | v 0.659985 1.979981 0.799955 13 | v -0.771920 0.000000 -0.771920 14 | v -0.771920 2.315760 -0.771920 15 | v 0.771920 0.000000 -0.771920 16 | v 0.771920 2.315760 -0.771920 17 | v -0.771920 0.000000 0.771920 18 | v -0.771920 2.315760 0.771920 19 | v 0.771920 0.000000 0.771920 20 | v 0.771920 2.315760 0.771920 21 | v -0.771920 2.624528 -0.771920 22 | v 0.771920 2.624528 -0.771920 23 | v -0.771920 2.624528 1.235072 24 | v 0.771920 2.624528 1.235072 25 | v -0.771920 2.778912 -0.771920 26 | v 0.771920 2.778912 -0.771920 27 | v -0.771920 2.778912 1.235072 28 | v 0.771920 2.778912 1.235072 29 | v -0.771920 2.624528 0.771920 30 | v -0.771920 2.778912 0.771920 31 | v 0.771920 2.778912 0.771920 32 | v 0.771920 2.624528 0.771920 33 | v -0.771920 3.795368 -0.771920 34 | v 0.771920 3.795368 -0.771920 35 | v -0.771920 3.795368 0.771920 36 | v 0.771920 3.795368 0.771920 37 | v -0.771920 4.047333 -0.771920 38 | v 0.771920 4.047333 -0.771920 39 | v -0.771920 4.047333 1.157880 40 | v 0.771920 4.047333 1.157880 41 | v -0.771920 4.510912 -0.771920 42 | v 0.771920 4.510912 -0.771920 43 | v -0.771920 4.510912 1.157880 44 | v 0.771920 4.510912 1.157880 45 | v -0.771920 4.647582 -0.771920 46 | v 0.771920 4.647582 -0.771920 47 | v -0.771920 4.647582 0.694728 48 | v 0.771920 4.647582 0.694728 49 | v 0.694728 0.000000 -0.771920 50 | v 0.694728 2.315760 -0.771920 51 | v 0.694728 0.000000 0.771920 52 | v 0.694728 2.315760 0.771920 53 | v 0.694728 2.624528 -0.771920 54 | v 0.694728 2.624528 1.235072 55 | v 0.694728 2.778912 -0.771920 56 | v 0.694728 2.778912 1.235072 57 | v 0.694728 2.778912 0.771920 58 | v 0.694728 3.795368 -0.771920 59 | v 0.694728 3.795368 0.771920 60 | v 0.694728 4.047333 -0.771920 61 | v 0.694728 4.047333 1.157880 62 | v 0.694728 4.510912 -0.771920 63 | v 0.694728 4.510912 1.157880 64 | v 0.694728 4.647582 -0.771920 65 | v 0.694728 4.647582 0.694728 66 | v -0.698587 0.000000 -0.771920 67 | v -0.698588 2.315760 0.771920 68 | v -0.698588 2.624528 1.235072 69 | v -0.698588 2.778912 1.235072 70 | v -0.698587 2.315760 -0.771920 71 | v -0.698588 0.000000 0.771920 72 | v -0.698587 2.624528 -0.771920 73 | v -0.698587 2.778912 -0.771920 74 | v -0.698588 2.778912 0.771920 75 | v -0.698587 3.795368 -0.771920 76 | v -0.698588 3.795368 0.771920 77 | v -0.698587 4.047333 -0.771920 78 | v -0.698588 4.047333 1.157880 79 | v -0.698587 4.510912 -0.771920 80 | v -0.698588 4.510912 1.157880 81 | v -0.698587 4.647582 -0.771920 82 | v -0.698588 4.647582 0.694728 83 | v 0.694728 2.784196 0.538192 84 | v 0.694728 3.698422 0.391990 85 | v -0.698587 2.784196 0.538191 86 | v -0.698587 3.698422 0.391990 87 | v 0.459985 1.979981 0.771920 88 | v 0.340015 1.979981 0.771920 89 | v 0.340015 1.820020 0.771920 90 | v 0.459985 1.820020 0.771920 91 | v 0.659985 1.979981 0.771920 92 | v 0.540015 1.820020 0.771920 93 | v 0.540015 1.979981 0.771920 94 | v 0.659985 1.820020 0.771920 95 | v 0.453987 1.971983 0.799955 96 | v 0.453987 1.828018 0.799955 97 | v 0.346013 1.828018 0.799955 98 | v 0.346013 1.971983 0.799955 99 | v 0.653987 1.971983 0.799955 100 | v 0.653987 1.828018 0.799955 101 | v 0.546013 1.828018 0.799955 102 | v 0.546013 1.971983 0.799955 103 | v 0.453987 1.971983 0.794096 104 | v 0.453987 1.828018 0.794096 105 | v 0.346013 1.828018 0.794096 106 | v 0.346013 1.971983 0.794096 107 | v 0.653987 1.971983 0.794096 108 | v 0.653987 1.828018 0.794096 109 | v 0.546013 1.828018 0.794096 110 | v 0.546013 1.971983 0.794096 111 | vt 0.554846 0.109852 112 | vt 0.553392 0.111702 113 | vt 0.553385 0.111398 114 | vt 0.565597 0.120210 115 | vt 0.561341 0.117983 116 | vt 0.551655 0.109955 117 | vt 0.545851 0.110295 118 | vt 0.539685 0.110506 119 | vt 0.539586 0.109764 120 | vt 0.550089 0.122129 121 | vt 0.547470 0.120645 122 | vt 0.536172 0.104182 123 | vt 0.136928 0.006322 124 | vt 0.005420 0.057909 125 | vt 0.000228 0.054564 126 | vt 0.854125 0.179512 127 | vt 0.745271 0.016231 128 | vt 0.854125 0.016231 129 | vt 0.173662 0.302191 130 | vt 0.072008 0.361655 131 | vt 0.068311 0.359720 132 | vt 0.147550 0.695826 133 | vt 0.055914 0.809706 134 | vt 0.044282 0.751794 135 | vt 0.084435 0.421779 136 | vt 0.081939 0.424264 137 | vt 0.161486 0.827312 138 | vt 0.141138 0.824752 139 | vt 0.158174 0.163901 140 | vt 0.175036 0.168575 141 | vt 0.160394 0.171227 142 | vt 0.745271 0.179512 143 | vt 0.745271 0.201283 144 | vt 0.712615 0.201283 145 | vt 0.118712 0.183635 146 | vt 0.119229 0.188757 147 | vt 0.170533 0.436067 148 | vt 0.190145 0.443837 149 | vt 0.169941 0.439368 150 | vt 0.253436 0.247401 151 | vt 0.224988 0.268823 152 | vt 0.222040 0.263025 153 | vt 0.190903 0.438487 154 | vt 0.203388 0.446049 155 | vt 0.177199 0.699698 156 | vt 0.175133 0.829550 157 | vt 0.712615 0.212168 158 | vt 0.179559 0.665189 159 | vt 0.195727 0.658310 160 | vt 0.190625 0.700805 161 | vt 0.854125 0.212168 162 | vt 0.745271 0.212168 163 | vt 0.854125 0.201283 164 | vt 0.204533 0.440723 165 | vt 0.269348 0.460715 166 | vt 0.292119 0.139844 167 | vt 0.318530 0.163415 168 | vt 0.290601 0.146015 169 | vt 0.204704 0.146753 170 | vt 0.206433 0.152950 171 | vt 0.241239 0.843943 172 | vt 0.745271 0.283837 173 | vt 0.854125 0.301602 174 | vt 0.718058 0.334289 175 | vt 0.718058 0.301602 176 | vt 0.291676 0.703425 177 | vt 0.263897 0.849892 178 | vt 0.270582 0.455321 179 | vt 0.291669 0.466944 180 | vt 0.854125 0.334289 181 | vt 0.750714 0.343925 182 | vt 0.293243 0.461243 183 | vt 0.325365 0.474737 184 | vt 0.319885 0.158034 185 | vt 0.355939 0.162826 186 | vt 0.328119 0.682196 187 | vt 0.295839 0.857073 188 | vt 0.365330 0.121757 189 | vt 0.348983 0.005935 190 | vt 0.372608 0.122977 191 | vt 0.325252 0.468311 192 | vt 0.341447 0.474089 193 | vt 0.351927 0.156351 194 | vt 0.352336 0.753639 195 | vt 0.308694 0.856652 196 | vt 0.541040 0.835157 197 | vt 0.640758 0.801871 198 | vt 0.640363 0.836294 199 | vt 0.335005 0.000103 200 | vt 0.343624 0.010738 201 | vt 0.332997 0.008264 202 | vt 0.542632 0.696183 203 | vt 0.641827 0.697243 204 | vt 0.540662 0.868204 205 | vt 0.639985 0.869341 206 | vt 0.288757 0.000103 207 | vt 0.288933 0.006970 208 | vt 0.267747 0.001953 209 | vt 0.268207 0.008662 210 | vt 0.639609 0.902198 211 | vt 0.557639 0.923374 212 | vt 0.540286 0.901061 213 | vt 0.176518 0.003442 214 | vt 0.176672 0.010098 215 | vt 0.163216 0.003852 216 | vt 0.163584 0.010402 217 | vt 0.173560 0.162716 218 | vt 0.138188 0.012624 219 | vt 0.530536 0.078395 220 | vt 0.651879 0.029685 221 | vt 0.651959 0.078195 222 | vt 0.530456 0.029886 223 | vt 0.651857 0.016231 224 | vt 0.004600 0.141249 225 | vt 0.000103 0.144646 226 | vt 0.642157 0.532526 227 | vt 0.547261 0.371044 228 | vt 0.643354 0.372038 229 | vt 0.205516 0.270124 230 | vt 0.208793 0.275786 231 | vt 0.176388 0.305738 232 | vt 0.334649 0.251760 233 | vt 0.358316 0.292536 234 | vt 0.331078 0.257607 235 | vt 0.254427 0.253685 236 | vt 0.364053 0.288061 237 | vt 0.384328 0.326997 238 | vt 0.388520 0.366376 239 | vt 0.338148 0.467553 240 | vt 0.381790 0.364540 241 | vt 0.390973 0.324902 242 | vt 0.641795 0.687447 243 | vt 0.542844 0.686440 244 | vt 0.641968 0.654495 245 | vt 0.543303 0.653531 246 | vt 0.641958 0.636615 247 | vt 0.543633 0.635683 248 | vt 0.642402 0.564958 249 | vt 0.544507 0.564038 250 | vt 0.642236 0.554092 251 | vt 0.544855 0.553165 252 | vt 0.545325 0.531586 253 | vt 0.548821 0.265087 254 | vt 0.555334 0.120266 255 | vt 0.530433 0.979584 256 | vt 0.609482 0.969458 257 | vt 0.623978 0.983769 258 | vt 0.614888 0.928797 259 | vt 0.551330 0.964191 260 | vt 0.397108 0.090986 261 | vt 0.400565 0.109257 262 | vt 0.398391 0.113488 263 | vt 0.546660 0.108690 264 | vt 0.555780 0.118067 265 | vt 0.537413 0.125958 266 | vt 0.547075 0.119988 267 | vt 0.545861 0.111558 268 | vt 0.545806 0.110951 269 | vt 0.555621 0.117792 270 | vt 0.555521 0.110465 271 | vt 0.560696 0.116952 272 | vt 0.553403 0.111883 273 | vt 0.539967 0.121106 274 | vt 0.539517 0.121863 275 | vt 0.092321 0.621854 276 | vt 0.014687 0.518343 277 | vt 0.092321 0.518343 278 | vt 0.234479 0.621854 279 | vt 0.156845 0.518343 280 | vt 0.234479 0.518343 281 | vt 0.555368 0.117566 282 | vt 0.546662 0.119584 283 | vt 0.556184 0.111046 284 | vt 0.560161 0.116185 285 | vt 0.539845 0.110967 286 | vt 0.540269 0.120438 287 | vt 0.553948 0.108723 288 | vt 0.854125 0.283837 289 | vt 0.854125 0.343925 290 | vt 0.354156 0.716327 291 | vt 0.541434 0.800734 292 | vt 0.530433 0.016432 293 | vt 0.643988 0.266072 294 | vt 0.400636 0.096753 295 | vt 0.014687 0.621854 296 | vt 0.156845 0.621854 297 | vn 0.0000 0.0000 1.0000 298 | vn -1.0000 0.0000 0.0000 299 | vn 0.0000 1.0000 0.0000 300 | vn 0.0000 0.0000 -1.0000 301 | vn 1.0000 0.0000 0.0000 302 | vn 0.0000 -1.0000 0.0000 303 | vn 0.0000 -0.8321 0.5547 304 | vn 0.0000 -0.8374 0.5466 305 | vn 0.0000 0.9591 0.2830 306 | vn -0.0000 -0.9690 0.2472 307 | vn -0.0000 -0.8374 0.5467 308 | vn -0.0000 0.9997 0.0226 309 | usemtl Material.001 310 | s off 311 | f 2/1/1 91/2/1 4/3/1 312 | f 2/1/2 85/4/2 1/5/2 313 | f 83/6/3 2/1/3 4/3/3 314 | f 6/7/1 95/8/1 8/9/1 315 | f 6/7/2 88/10/2 5/11/2 316 | f 87/12/3 6/7/3 8/9/3 317 | usemtl Material.002 318 | f 46/13/4 11/14/4 45/15/4 319 | usemtl Material.001 320 | f 12/16/5 15/17/5 11/18/5 321 | usemtl Material.002 322 | f 63/19/1 13/20/1 67/21/1 323 | usemtl Material.001 324 | f 14/22/2 9/23/2 13/24/2 325 | usemtl Material.002 326 | f 67/21/6 9/25/6 62/26/6 327 | usemtl Material.001 328 | f 14/22/2 17/27/2 10/28/2 329 | usemtl Material.002 330 | f 20/29/1 52/30/1 50/31/1 331 | usemtl Material.001 332 | f 16/32/5 28/33/5 20/34/5 333 | usemtl Material.002 334 | f 16/35/7 50/31/7 48/36/7 335 | f 10/37/4 68/38/4 66/39/4 336 | f 70/40/3 23/41/3 65/42/3 337 | f 17/43/4 69/44/4 68/38/4 338 | usemtl Material.001 339 | f 25/45/2 21/46/2 17/27/2 340 | f 28/33/5 24/47/5 20/34/5 341 | f 25/45/2 14/22/2 19/48/2 342 | f 25/45/2 23/49/2 26/50/2 343 | f 28/33/5 22/51/5 27/52/5 344 | f 16/32/5 18/53/5 28/33/5 345 | usemtl Material.002 346 | f 21/54/4 71/55/4 69/44/4 347 | f 32/56/8 57/57/8 55/58/8 348 | f 27/59/1 55/58/1 53/60/1 349 | usemtl Material.001 350 | f 26/50/2 29/61/2 21/46/2 351 | f 22/51/5 32/62/5 27/52/5 352 | f 34/63/5 40/64/5 36/65/5 353 | f 31/66/2 33/67/2 29/61/2 354 | f 32/62/5 34/63/5 36/65/5 355 | usemtl Material.002 356 | f 29/68/4 73/69/4 71/55/4 357 | usemtl Material.001 358 | f 38/70/5 44/71/5 40/64/5 359 | usemtl Material.002 360 | f 33/72/4 75/73/4 73/69/4 361 | f 36/74/1 59/75/1 57/57/1 362 | usemtl Material.001 363 | f 35/76/2 37/77/2 33/67/2 364 | usemtl Material.002 365 | f 44/78/3 60/79/3 61/80/3 366 | f 37/81/4 77/82/4 75/73/4 367 | f 40/83/9 61/80/9 59/75/9 368 | usemtl Material.001 369 | f 37/77/2 43/84/2 41/85/2 370 | f 59/86/9 78/87/9 76/88/9 371 | usemtl Material.002 372 | f 58/89/4 42/90/4 38/91/4 373 | usemtl Material.001 374 | f 78/87/3 60/92/3 77/93/3 375 | f 57/94/1 76/88/1 74/95/1 376 | usemtl Material.002 377 | f 56/96/4 38/91/4 34/97/4 378 | f 54/98/4 34/97/4 30/99/4 379 | usemtl Material.001 380 | f 72/100/10 80/101/10 55/102/10 381 | f 55/102/11 74/95/11 72/100/11 382 | usemtl Material.002 383 | f 51/103/4 30/99/4 22/104/4 384 | f 49/105/4 22/104/4 18/106/4 385 | f 27/59/3 52/30/3 24/107/3 386 | f 46/13/4 18/106/4 12/108/4 387 | usemtl Material.001 388 | f 48/109/7 64/110/7 63/111/7 389 | f 50/112/1 65/113/1 64/110/1 390 | usemtl Material.002 391 | f 15/114/6 45/15/6 11/14/6 392 | f 16/35/1 47/115/1 15/114/1 393 | usemtl Material.001 394 | f 66/116/4 45/117/4 62/118/4 395 | usemtl Material.002 396 | f 10/37/4 62/26/4 9/25/4 397 | f 64/119/1 23/41/1 19/120/1 398 | f 63/19/7 19/120/7 14/121/7 399 | f 72/122/8 35/123/8 31/124/8 400 | f 70/40/1 31/124/1 26/125/1 401 | f 74/126/1 39/127/1 35/123/1 402 | f 78/128/3 41/129/3 43/130/3 403 | f 76/131/9 43/130/9 39/127/9 404 | usemtl Material.001 405 | f 75/132/4 60/92/4 58/133/4 406 | f 73/134/4 58/133/4 56/135/4 407 | f 71/136/4 56/135/4 54/137/4 408 | f 69/138/4 54/137/4 51/139/4 409 | f 68/140/4 51/139/4 49/141/4 410 | usemtl Material.002 411 | f 53/60/3 65/42/3 52/30/3 412 | usemtl Material.001 413 | f 66/116/4 49/141/4 46/142/4 414 | f 47/143/6 62/118/6 45/117/6 415 | f 47/143/1 86/144/1 85/4/1 416 | f 53/145/12 81/146/12 70/147/12 417 | f 70/147/5 82/148/5 72/100/5 418 | f 53/145/2 80/101/2 79/149/2 419 | f 87/150/5 7/151/5 90/152/5 420 | f 83/6/1 88/10/1 89/153/1 421 | f 83/6/5 3/154/5 86/144/5 422 | f 90/155/6 5/11/6 88/10/6 423 | f 86/144/6 1/5/6 85/4/6 424 | f 97/156/5 106/157/5 98/158/5 425 | f 4/3/1 92/159/1 3/154/1 426 | f 1/5/1 94/160/1 2/1/1 427 | f 3/154/1 93/161/1 1/5/1 428 | f 94/160/6 99/162/6 91/2/6 429 | f 8/9/1 96/163/1 7/164/1 430 | f 5/11/1 98/158/1 6/7/1 431 | f 7/164/1 97/156/1 5/11/1 432 | usemtl Material.003 433 | f 99/165/1 101/166/1 100/167/1 434 | f 103/168/1 105/169/1 104/170/1 435 | usemtl Material.001 436 | f 91/2/2 100/171/2 92/159/2 437 | f 96/163/3 105/172/3 97/156/3 438 | f 93/161/5 102/173/5 94/160/5 439 | f 92/159/3 101/174/3 93/161/3 440 | f 98/158/6 103/175/6 95/8/6 441 | f 95/8/2 104/176/2 96/163/2 442 | f 2/1/1 94/160/1 91/2/1 443 | f 2/1/2 84/177/2 85/4/2 444 | f 83/6/3 84/177/3 2/1/3 445 | f 6/7/1 98/158/1 95/8/1 446 | f 6/7/2 89/153/2 88/10/2 447 | f 87/12/3 89/153/3 6/7/3 448 | usemtl Material.002 449 | f 46/13/4 12/108/4 11/14/4 450 | usemtl Material.001 451 | f 12/16/5 16/32/5 15/17/5 452 | usemtl Material.002 453 | f 63/19/1 14/121/1 13/20/1 454 | usemtl Material.001 455 | f 14/22/2 10/28/2 9/23/2 456 | usemtl Material.002 457 | f 67/21/6 13/20/6 9/25/6 458 | usemtl Material.001 459 | f 14/22/2 25/45/2 17/27/2 460 | usemtl Material.002 461 | f 20/29/1 24/107/1 52/30/1 462 | f 16/35/7 20/29/7 50/31/7 463 | f 10/37/4 17/43/4 68/38/4 464 | f 70/40/3 26/125/3 23/41/3 465 | f 17/43/4 21/54/4 69/44/4 466 | usemtl Material.001 467 | f 25/45/2 26/50/2 21/46/2 468 | f 28/33/5 27/52/5 24/47/5 469 | f 25/45/2 19/48/2 23/49/2 470 | f 28/33/5 18/53/5 22/51/5 471 | f 16/32/5 12/16/5 18/53/5 472 | usemtl Material.002 473 | f 21/54/4 29/68/4 71/55/4 474 | f 32/56/11 36/74/11 57/57/11 475 | f 27/59/1 32/56/1 55/58/1 476 | usemtl Material.001 477 | f 26/50/2 31/66/2 29/61/2 478 | f 22/51/5 30/178/5 32/62/5 479 | f 34/63/5 38/70/5 40/64/5 480 | f 31/66/2 35/76/2 33/67/2 481 | f 32/62/5 30/178/5 34/63/5 482 | usemtl Material.002 483 | f 29/68/4 33/72/4 73/69/4 484 | usemtl Material.001 485 | f 38/70/5 42/179/5 44/71/5 486 | usemtl Material.002 487 | f 33/72/4 37/81/4 75/73/4 488 | f 36/74/1 40/83/1 59/75/1 489 | usemtl Material.001 490 | f 35/76/2 39/180/2 37/77/2 491 | usemtl Material.002 492 | f 44/78/3 42/90/3 60/79/3 493 | f 37/81/4 41/129/4 77/82/4 494 | f 40/83/9 44/78/9 61/80/9 495 | usemtl Material.001 496 | f 37/77/2 39/180/2 43/84/2 497 | f 59/86/9 61/181/9 78/87/9 498 | usemtl Material.002 499 | f 58/89/4 60/79/4 42/90/4 500 | usemtl Material.001 501 | f 78/87/3 61/181/3 60/92/3 502 | f 57/94/1 59/86/1 76/88/1 503 | usemtl Material.002 504 | f 56/96/4 58/89/4 38/91/4 505 | f 54/98/4 56/96/4 34/97/4 506 | usemtl Material.001 507 | f 72/100/10 82/148/10 80/101/10 508 | f 55/102/11 57/94/11 74/95/11 509 | usemtl Material.002 510 | f 51/103/4 54/98/4 30/99/4 511 | f 49/105/4 51/103/4 22/104/4 512 | f 27/59/3 53/60/3 52/30/3 513 | f 46/13/4 49/105/4 18/106/4 514 | usemtl Material.001 515 | f 48/109/7 50/112/7 64/110/7 516 | f 50/112/1 52/182/1 65/113/1 517 | usemtl Material.002 518 | f 15/114/6 47/115/6 45/15/6 519 | f 16/35/1 48/36/1 47/115/1 520 | usemtl Material.001 521 | f 66/116/4 46/142/4 45/117/4 522 | usemtl Material.002 523 | f 10/37/4 66/39/4 62/26/4 524 | f 64/119/1 65/42/1 23/41/1 525 | f 63/19/7 64/119/7 19/120/7 526 | f 72/122/8 74/126/8 35/123/8 527 | f 70/40/1 72/122/1 31/124/1 528 | f 74/126/1 76/131/1 39/127/1 529 | f 78/128/3 77/82/3 41/129/3 530 | f 76/131/9 78/128/9 43/130/9 531 | usemtl Material.001 532 | f 75/132/4 77/93/4 60/92/4 533 | f 73/134/4 75/132/4 58/133/4 534 | f 71/136/4 73/134/4 56/135/4 535 | f 69/138/4 71/136/4 54/137/4 536 | f 68/140/4 69/138/4 51/139/4 537 | usemtl Material.002 538 | f 53/60/3 70/40/3 65/42/3 539 | usemtl Material.001 540 | f 66/116/4 68/140/4 49/141/4 541 | f 47/143/6 67/183/6 62/118/6 542 | f 47/143/1 48/109/1 90/155/1 543 | f 48/109/1 87/12/1 90/155/1 544 | f 90/155/1 88/10/1 47/143/1 545 | f 88/10/1 86/144/1 47/143/1 546 | f 63/111/1 67/183/1 85/4/1 547 | f 67/183/1 47/143/1 85/4/1 548 | f 53/145/12 79/149/12 81/146/12 549 | f 70/147/5 81/146/5 82/148/5 550 | f 53/145/2 55/102/2 80/101/2 551 | f 87/150/5 8/184/5 7/151/5 552 | f 63/111/1 85/4/1 84/177/1 553 | f 83/6/1 86/144/1 88/10/1 554 | f 63/111/1 84/177/1 48/109/1 555 | f 84/177/1 83/6/1 48/109/1 556 | f 87/12/1 48/109/1 89/153/1 557 | f 89/153/1 48/109/1 83/6/1 558 | f 83/6/5 4/3/5 3/154/5 559 | f 90/155/6 7/164/6 5/11/6 560 | f 86/144/6 3/154/6 1/5/6 561 | f 97/156/5 105/172/5 106/157/5 562 | f 4/3/1 91/2/1 92/159/1 563 | f 1/5/1 93/161/1 94/160/1 564 | f 3/154/1 92/159/1 93/161/1 565 | f 94/160/6 102/173/6 99/162/6 566 | f 8/9/1 95/8/1 96/163/1 567 | f 5/11/1 97/156/1 98/158/1 568 | f 7/164/1 96/163/1 97/156/1 569 | usemtl Material.003 570 | f 99/165/1 102/185/1 101/166/1 571 | f 103/168/1 106/186/1 105/169/1 572 | usemtl Material.001 573 | f 91/2/2 99/162/2 100/171/2 574 | f 96/163/3 104/176/3 105/172/3 575 | f 93/161/5 101/174/5 102/173/5 576 | f 92/159/3 100/171/3 101/174/3 577 | f 98/158/6 106/157/6 103/175/6 578 | f 95/8/2 103/175/2 104/176/2 579 | -------------------------------------------------------------------------------- /bin/assets/models/arcade1.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: 'Arcade2.blend' 2 | # www.blender.org 3 | mtllib Arcade1.mtl 4 | o Cube 5 | v 0.845591 0.000000 -0.845591 6 | v 0.845591 0.000000 0.845591 7 | v -0.845592 0.000000 0.845591 8 | v -0.845591 0.000000 -0.845592 9 | v 0.845592 2.122322 -0.845591 10 | v 0.845591 2.122322 0.845592 11 | v -0.845592 2.122322 0.845591 12 | v -0.845591 2.122322 -0.845591 13 | v -0.761032 0.000000 -0.845592 14 | v -0.761032 0.000000 0.845591 15 | v -0.761032 2.122322 -0.845591 16 | v -0.761033 2.122322 0.845591 17 | v 0.765260 0.000000 -0.845591 18 | v 0.765260 0.000000 0.845591 19 | v 0.765261 2.122322 -0.845591 20 | v 0.765260 2.122322 0.845592 21 | v 0.845592 2.223588 -0.845591 22 | v 0.845591 2.223588 1.139588 23 | v -0.845592 2.223588 1.139588 24 | v -0.845591 2.223588 -0.845591 25 | v -0.761032 2.223588 -0.845591 26 | v -0.761033 2.223588 1.139588 27 | v 0.765261 2.223588 -0.845591 28 | v 0.765260 2.223588 1.139588 29 | v 0.845592 2.540107 -0.845591 30 | v 0.845591 2.540107 1.139588 31 | v -0.845592 2.540107 1.139588 32 | v -0.845591 2.540107 -0.845591 33 | v -0.761032 2.540107 -0.845591 34 | v -0.761033 2.540107 1.139588 35 | v 0.765261 2.540107 -0.845591 36 | v 0.765260 2.540107 1.139588 37 | v 0.845591 2.540107 0.450690 38 | v -0.845592 2.540107 0.450690 39 | v -0.761033 2.540107 0.450690 40 | v 0.765260 2.540107 0.450690 41 | v 0.845592 3.845323 -0.845591 42 | v -0.845592 3.845323 -0.845591 43 | v -0.761033 3.845323 -0.845591 44 | v 0.765260 3.845323 -0.845591 45 | v 0.845591 3.845323 0.450690 46 | v -0.845592 3.845323 0.450690 47 | v 0.765260 3.780062 0.079079 48 | v -0.845592 3.780062 0.079079 49 | v -0.761033 3.845323 0.059520 50 | v 0.765260 3.845323 0.059521 51 | v -0.845592 3.845323 0.059520 52 | v 0.845591 3.845323 0.059521 53 | v 0.882704 0.000000 0.059521 54 | v -0.882704 0.000000 0.059521 55 | v -0.761033 3.780062 0.079079 56 | v 0.845591 3.780062 0.079079 57 | v -0.761033 2.602104 0.432109 58 | v 0.765260 2.602104 0.432110 59 | v -0.845592 2.602104 0.432109 60 | v 0.845591 2.602104 0.432110 61 | v 0.765260 3.740867 -0.051704 62 | v -0.761033 3.740867 -0.051705 63 | v -0.761032 2.562909 0.301326 64 | v 0.765260 2.562909 0.301326 65 | v 0.899994 0.000000 -0.756970 66 | v 0.952911 0.000000 0.749562 67 | v -0.952911 0.000000 0.749562 68 | v -0.899994 0.000000 -0.756971 69 | v 0.899995 2.122322 -0.756970 70 | v 0.952911 2.122322 0.749563 71 | v -0.952911 2.122322 0.749562 72 | v -0.899994 2.122322 -0.756970 73 | v 0.899995 2.223588 -0.756970 74 | v 0.952911 2.223588 1.043559 75 | v -0.952911 2.223588 1.043559 76 | v -0.899994 2.223588 -0.756970 77 | v 0.899995 2.540107 -0.756970 78 | v 0.952911 2.540107 1.043559 79 | v -0.952911 2.540107 1.043559 80 | v -0.899994 2.540107 -0.756970 81 | v 0.899994 2.540107 0.450690 82 | v -0.899994 2.540107 0.450690 83 | v 0.899994 3.845323 -0.756970 84 | v -0.899994 3.845323 -0.756970 85 | v 0.899994 3.845323 0.450690 86 | v -0.899995 3.845323 0.450690 87 | v -0.939495 3.845323 0.059520 88 | v 0.939495 3.845323 0.059521 89 | v 0.939495 0.000000 0.059521 90 | v 0.939495 2.540107 0.059521 91 | v 0.939495 2.122322 0.059521 92 | v 0.939495 2.223588 0.059520 93 | v -0.939495 2.223588 0.059521 94 | v -0.939495 2.540107 0.059520 95 | v -0.939495 0.000000 0.059521 96 | v -0.939495 2.122322 0.059521 97 | v 0.845592 3.908746 -0.845591 98 | v -0.845592 3.908746 -0.845591 99 | v -0.761033 3.908746 -0.845591 100 | v 0.765260 3.908746 -0.845591 101 | v 0.845591 3.946422 0.758412 102 | v -0.845592 3.946423 0.758411 103 | v -0.761033 3.908746 0.314381 104 | v 0.765260 3.908746 0.314382 105 | v -0.845592 3.908746 0.314381 106 | v 0.845591 3.908746 0.314381 107 | v 0.899994 3.908746 -0.756970 108 | v -0.899994 3.908746 -0.756970 109 | v 0.899994 3.946422 0.758412 110 | v -0.899995 3.946423 0.758411 111 | v -0.899994 3.908746 0.059520 112 | v 0.899994 3.908746 0.059521 113 | v 0.807454 4.109122 -0.813444 114 | v -0.807399 4.109122 -0.813444 115 | v -0.726657 4.109122 -0.813444 116 | v 0.730748 4.109122 -0.813444 117 | v 0.845591 4.071689 0.915116 118 | v -0.845592 4.071689 0.915116 119 | v -0.726657 4.109122 0.294174 120 | v 0.730748 4.109122 0.294174 121 | v -0.807399 4.109122 0.294174 122 | v 0.807453 4.109122 0.294174 123 | v 0.859401 4.109122 -0.724823 124 | v -0.859347 4.109122 -0.724823 125 | v 0.859401 4.073146 0.867795 126 | v -0.859347 4.073147 0.867794 127 | v -0.859347 4.109122 0.050816 128 | v 0.859401 4.109122 0.050816 129 | v -0.849303 0.000000 -0.755081 130 | v 0.849303 0.000000 -0.755080 131 | v -0.903944 0.000000 -0.675322 132 | v -0.903944 2.122322 -0.675321 133 | v -0.903944 2.223588 -0.675321 134 | v -0.903944 2.540107 -0.675321 135 | v -0.903945 3.845323 -0.675321 136 | v 0.903944 3.845323 -0.675321 137 | v 0.903944 0.000000 -0.675321 138 | v 0.903945 2.540107 -0.675321 139 | v 0.903945 2.122322 -0.675321 140 | v 0.903945 2.223588 -0.675321 141 | v -0.899994 3.908746 -0.675321 142 | v 0.899994 3.908746 -0.675321 143 | v -0.807399 4.109122 -0.702683 144 | v -0.726657 4.109122 -0.702683 145 | v 0.730748 4.109122 -0.702682 146 | v 0.807454 4.109122 -0.702682 147 | v -0.859347 4.109122 -0.647260 148 | v 0.859401 4.109122 -0.647259 149 | v 0.879364 0.000000 -0.021939 150 | v 0.935940 3.845323 -0.013964 151 | v 0.935940 0.000000 -0.013963 152 | v 0.935940 2.540107 -0.013963 153 | v 0.935940 2.122322 -0.013964 154 | v 0.935940 2.223588 -0.013964 155 | v 0.899994 3.908746 -0.013964 156 | v -0.726657 4.109122 0.194488 157 | v 0.730748 4.109122 0.194488 158 | v 0.807453 4.109122 0.194488 159 | v 0.859401 4.109122 -0.018991 160 | v -0.879364 0.000000 -0.021940 161 | v -0.935940 0.000000 -0.013964 162 | v -0.935940 2.122322 -0.013964 163 | v -0.935940 2.223588 -0.013964 164 | v -0.935940 2.540107 -0.013964 165 | v -0.935940 3.845323 -0.013964 166 | v -0.899994 3.908746 -0.013964 167 | v -0.807399 4.109122 0.194488 168 | v -0.859347 4.109122 -0.018992 169 | vt 0.106536 0.574561 170 | vt 0.116900 0.575004 171 | vt 0.006528 0.590700 172 | vt 0.726429 0.270281 173 | vt 0.736765 0.256854 174 | vt 0.736765 0.270281 175 | vt 0.749821 0.483064 176 | vt 0.826103 0.497299 177 | vt 0.749821 0.490280 178 | vt 0.543849 0.843963 179 | vt 0.532969 0.565148 180 | vt 0.543849 0.565148 181 | vt 0.249788 0.516298 182 | vt 0.237753 0.343109 183 | vt 0.249788 0.343451 184 | vt 0.530040 0.551689 185 | vt 0.519160 0.270281 186 | vt 0.530040 0.270281 187 | vt 0.726429 0.551689 188 | vt 0.740237 0.843963 189 | vt 0.740238 0.565148 190 | vt 0.926157 0.793048 191 | vt 0.886805 0.590599 192 | vt 0.926157 0.590599 193 | vt 0.006528 0.793149 194 | vt 0.221689 0.590700 195 | vt 0.221689 0.793149 196 | vt 0.116900 0.808284 197 | vt 0.234745 0.807935 198 | vt 0.241745 0.979404 199 | vt 0.234745 0.979404 200 | vt 0.750574 0.843963 201 | vt 0.750574 0.565148 202 | vt 0.736765 0.551689 203 | vt 0.726429 0.256854 204 | vt 0.736765 0.214885 205 | vt 0.249788 0.288125 206 | vt 0.237753 0.006730 207 | vt 0.249788 0.007071 208 | vt 0.951430 0.792487 209 | vt 0.991767 0.803703 210 | vt 0.951430 0.803703 211 | vt 0.254801 0.807935 212 | vt 0.261801 0.979404 213 | vt 0.254801 0.979404 214 | vt 0.530040 0.256854 215 | vt 0.926157 0.803703 216 | vt 0.886805 0.793048 217 | vt 0.886805 0.579383 218 | vt 0.926157 0.579383 219 | vt 0.951430 0.590038 220 | vt 0.991767 0.792487 221 | vt 0.506104 0.270395 222 | vt 0.494069 0.257326 223 | vt 0.506104 0.256984 224 | vt 0.519160 0.256854 225 | vt 0.530040 0.214885 226 | vt 0.951430 0.579383 227 | vt 0.991767 0.590038 228 | vt 0.726429 0.214885 229 | vt 0.749821 0.269960 230 | vt 0.838459 0.472408 231 | vt 0.749821 0.472408 232 | vt 0.838459 0.483064 233 | vt 0.749821 0.258744 234 | vt 0.838459 0.269960 235 | vt 0.807888 0.790822 236 | vt 0.824759 0.993270 237 | vt 0.807888 0.993270 238 | vt 0.758052 0.219834 239 | vt 0.914438 0.231050 240 | vt 0.758052 0.231050 241 | vt 0.726429 0.041821 242 | vt 0.914438 0.219834 243 | vt 0.923102 0.231050 244 | vt 0.294914 0.873333 245 | vt 0.301914 0.830970 246 | vt 0.301914 0.873333 247 | vt 0.914438 0.006730 248 | vt 0.758052 0.017385 249 | vt 0.758052 0.006730 250 | vt 0.899388 0.409985 251 | vt 0.880352 0.412732 252 | vt 0.851515 0.394793 253 | vt 0.736765 0.041821 254 | vt 0.993472 0.565148 255 | vt 0.991767 0.579383 256 | vt 0.519160 0.214885 257 | vt 0.530040 0.041821 258 | vt 0.914438 0.017385 259 | vt 0.923102 0.219834 260 | vt 0.923102 0.006730 261 | vt 0.899023 0.565148 262 | vt 0.938374 0.565148 263 | vt 0.237753 0.301194 264 | vt 0.249788 0.301536 265 | vt 0.106536 0.808727 266 | vt 0.018745 0.818039 267 | vt 0.006528 0.803804 268 | vt 0.237753 0.287783 269 | vt 0.210173 0.804296 270 | vt 0.210414 0.811020 271 | vt 0.200026 0.811544 272 | vt 0.749821 0.017385 273 | vt 0.749821 0.006730 274 | vt 0.749821 0.219834 275 | vt 0.749821 0.231050 276 | vt 0.486467 0.803144 277 | vt 0.468953 0.965584 278 | vt 0.468953 0.803028 279 | vt 0.777439 0.790822 280 | vt 0.794832 0.993270 281 | vt 0.777439 0.993270 282 | vt 0.837815 0.790938 283 | vt 0.855329 0.953378 284 | vt 0.837815 0.953494 285 | vt 0.142158 0.288062 286 | vt 0.132703 0.007036 287 | vt 0.142158 0.007009 288 | vt 0.300490 0.270021 289 | vt 0.389019 0.551483 290 | vt 0.300490 0.551074 291 | vt 0.044174 0.288499 292 | vt 0.132703 0.301500 293 | vt 0.006528 0.302126 294 | vt 0.132703 0.343416 295 | vt 0.083113 0.344000 296 | vt 0.389019 0.270430 297 | vt 0.398474 0.257047 298 | vt 0.398474 0.270457 299 | vt 0.389019 0.257019 300 | vt 0.398474 0.215131 301 | vt 0.083113 0.516847 302 | vt 0.389019 0.215104 303 | vt 0.398474 0.042285 304 | vt 0.227248 0.287814 305 | vt 0.227248 0.301224 306 | vt 0.227248 0.343140 307 | vt 0.237753 0.515956 308 | vt 0.227248 0.515986 309 | vt 0.132703 0.288090 310 | vt 0.044174 0.007445 311 | vt 0.262844 0.256393 312 | vt 0.483564 0.270706 313 | vt 0.494069 0.551790 314 | vt 0.483564 0.551759 315 | vt 0.262844 0.214478 316 | vt 0.339429 0.214519 317 | vt 0.339429 0.041673 318 | vt 0.389019 0.042258 319 | vt 0.274857 0.873333 320 | vt 0.281857 0.830970 321 | vt 0.281857 0.873333 322 | vt 0.764382 0.845720 323 | vt 0.494069 0.215411 324 | vt 0.506104 0.215069 325 | vt 0.506104 0.042223 326 | vt 0.494069 0.042565 327 | vt 0.899023 0.817938 328 | vt 0.886805 0.803703 329 | vt 0.115885 0.567500 330 | vt 0.502597 0.565249 331 | vt 0.468953 0.576465 332 | vt 0.468953 0.565249 333 | vt 0.532969 0.843963 334 | vt 0.519160 0.566906 335 | vt 0.018745 0.565249 336 | vt 0.106536 0.567029 337 | vt 0.736765 0.033411 338 | vt 0.726429 0.033411 339 | vt 0.506104 0.551448 340 | vt 0.494069 0.270737 341 | vt 0.953135 0.817938 342 | vt 0.826103 0.244509 343 | vt 0.838459 0.258744 344 | vt 0.825312 0.611885 345 | vt 0.873749 0.777362 346 | vt 0.869174 0.770224 347 | vt 0.856330 0.387278 348 | vt 0.943250 0.251647 349 | vt 0.859220 0.587116 350 | vt 0.796908 0.584650 351 | vt 0.873749 0.565148 352 | vt 0.043709 0.530462 353 | vt 0.134829 0.551790 354 | vt 0.030215 0.547628 355 | vt 0.530040 0.033411 356 | vt 0.524074 0.006730 357 | vt 0.534463 0.006730 358 | vt 0.398927 0.033617 359 | vt 0.391145 0.006730 360 | vt 0.400084 0.006781 361 | vt 0.300137 0.814112 362 | vt 0.301914 0.807935 363 | vt 0.494069 0.034166 364 | vt 0.502469 0.006979 365 | vt 0.506104 0.033824 366 | vt 0.962053 0.017946 367 | vt 0.936158 0.215817 368 | vt 0.936158 0.022505 369 | vt 0.389518 0.033563 370 | vt 0.237753 0.524355 371 | vt 0.227298 0.524415 372 | vt 0.133202 0.524957 373 | vt 0.519160 0.041821 374 | vt 0.468953 0.789569 375 | vt 0.502597 0.778914 376 | vt 0.502597 0.789569 377 | vt 0.806276 0.609139 378 | vt 0.502597 0.576465 379 | vt 0.241429 0.660788 380 | vt 0.251818 0.647566 381 | vt 0.251818 0.660788 382 | vt 0.439343 0.660788 383 | vt 0.449212 0.647566 384 | vt 0.449212 0.660788 385 | vt 0.439343 0.647566 386 | vt 0.241429 0.779785 387 | vt 0.234745 0.782721 388 | vt 0.234745 0.772434 389 | vt 0.241429 0.647566 390 | vt 0.234745 0.571524 391 | vt 0.236515 0.565249 392 | vt 0.455896 0.679844 393 | vt 0.455896 0.689103 394 | vt 0.455896 0.571524 395 | vt 0.300025 0.028057 396 | vt 0.721988 0.006730 397 | vt 0.234149 0.551218 398 | vt 0.224217 0.551275 399 | vt 0.962053 0.220394 400 | vt 0.936158 0.225991 401 | vt 0.731858 0.006730 402 | vt 0.274857 0.830970 403 | vt 0.276627 0.814112 404 | vt 0.936158 0.011795 405 | vt 0.962053 0.006730 406 | vt 0.933296 0.434755 407 | vt 0.870984 0.437221 408 | vt 0.246153 0.551541 409 | vt 0.142612 0.524903 410 | vt 0.143768 0.551738 411 | vt 0.449212 0.779785 412 | vt 0.455896 0.782722 413 | vt 0.449212 0.794476 414 | vt 0.234745 0.689103 415 | vt 0.251818 0.794476 416 | vt 0.439343 0.779785 417 | vt 0.439343 0.794476 418 | vt 0.241429 0.794476 419 | vt 0.251818 0.779785 420 | vt 0.142158 0.516235 421 | vt 0.483614 0.034105 422 | vt 0.490466 0.007302 423 | vt 0.210173 0.578992 424 | vt 0.210414 0.572268 425 | vt 0.221689 0.579484 426 | vt 0.398474 0.551511 427 | vt 0.142158 0.343388 428 | vt 0.142158 0.301473 429 | vt 0.483564 0.215380 430 | vt 0.483564 0.257296 431 | vt 0.227248 0.006760 432 | vt 0.115885 0.815788 433 | vt 0.106536 0.816259 434 | vt 0.132703 0.516262 435 | vt 0.234745 0.679844 436 | vt 0.455896 0.772434 437 | vt 0.483564 0.042534 438 | vt 0.480534 0.007245 439 | vt 0.200026 0.571744 440 | vt 0.006528 0.579484 441 | vt 0.519160 0.551689 442 | vt 0.221689 0.803804 443 | vt 0.241745 0.807935 444 | vt 0.261801 0.807935 445 | vt 0.824758 0.790822 446 | vt 0.294914 0.830970 447 | vt 0.953135 0.565148 448 | vt 0.923102 0.017385 449 | vt 0.486467 0.965700 450 | vt 0.794832 0.790822 451 | vt 0.855329 0.790822 452 | vt 0.006528 0.344042 453 | vt 0.764383 0.566906 454 | vt 0.938374 0.817938 455 | vt 0.519160 0.845720 456 | vt 0.993472 0.817938 457 | vt 0.749821 0.251528 458 | vt 0.782254 0.634592 459 | vt 0.777439 0.627078 460 | vt 0.947825 0.244509 461 | vt 0.519160 0.033411 462 | vt 0.249788 0.524697 463 | vt 0.468953 0.778914 464 | vt 0.454120 0.565249 465 | vt 0.286532 0.010891 466 | vt 0.962053 0.231050 467 | vt 0.274857 0.807935 468 | vt 0.947825 0.456722 469 | vn 0.0000 -1.0000 0.0000 470 | vn 0.0000 0.0000 -1.0000 471 | vn 0.0000 1.0000 0.0000 472 | vn 0.0000 0.0000 1.0000 473 | vn 0.8522 0.0000 -0.5232 474 | vn -0.0000 -0.9455 0.3257 475 | vn -0.8522 0.0000 -0.5232 476 | vn 0.0000 0.9579 -0.2871 477 | vn 0.0000 0.2871 0.9579 478 | vn 0.0000 -0.9500 0.3121 479 | vn -1.0000 0.0000 -0.0000 480 | vn 0.6668 0.0000 0.7452 481 | vn -0.2798 -0.9077 0.3127 482 | vn -0.0000 -0.9579 0.2871 483 | vn 1.0000 -0.0000 0.0000 484 | vn 0.9988 0.0000 -0.0483 485 | vn -0.9998 -0.0000 -0.0194 486 | vn 0.9991 0.0395 -0.0136 487 | vn 0.9949 0.0000 0.1005 488 | vn -0.9988 0.0000 -0.0483 489 | vn 0.9998 0.0000 -0.0194 490 | vn -0.9991 0.0395 -0.0136 491 | vn -0.9960 0.0000 -0.0889 492 | vn -0.9949 -0.0000 0.1005 493 | vn 0.2798 -0.9077 0.3127 494 | vn 0.0000 -0.9704 0.2415 495 | vn -0.6668 -0.0000 0.7452 496 | vn 0.9958 -0.0712 0.0570 497 | vn 0.9555 0.2949 0.0130 498 | vn 0.0000 0.1584 -0.9874 499 | vn -0.9800 0.1988 0.0000 500 | vn 0.9119 -0.3206 0.2562 501 | vn -0.8275 0.2392 -0.5080 502 | vn -0.0000 0.1003 0.9950 503 | vn -0.8457 0.5267 0.0854 504 | vn -0.8700 0.4931 0.0000 505 | vn 0.9969 0.0621 -0.0482 506 | vn -0.0833 0.9950 0.0549 507 | vn 0.2019 0.9785 0.0431 508 | vn -0.9801 0.1984 -0.0107 509 | vn 0.9801 0.1986 0.0000 510 | vn 0.0000 -0.6534 0.7570 511 | vn -0.9825 -0.1854 0.0157 512 | vn 0.8358 0.2479 -0.4899 513 | vn 0.8692 0.4926 -0.0421 514 | vn 0.8481 0.5282 -0.0410 515 | vn -0.9981 0.0622 -0.0000 516 | vn 0.9960 0.0000 -0.0889 517 | vn 0.9900 0.1402 -0.0135 518 | vn -0.9900 0.1402 -0.0135 519 | vn 0.9825 -0.1857 0.0158 520 | vn 0.9801 0.1981 -0.0107 521 | vn -0.8357 0.2481 -0.4899 522 | vn -0.8481 0.5282 -0.0410 523 | vn 0.8457 0.5267 0.0854 524 | vn -0.2018 0.9785 0.0431 525 | vn 0.0830 0.9950 0.0549 526 | vn -0.9553 0.2952 0.0130 527 | vn -0.9125 -0.3195 0.2554 528 | vn -0.9958 -0.0711 0.0569 529 | vn 0.8275 0.2390 -0.5080 530 | vn 0.9981 0.0622 0.0000 531 | vn -0.9969 0.0621 -0.0482 532 | vn 0.8700 0.4931 0.0000 533 | vn -0.8692 0.4926 -0.0421 534 | usemtl Material 535 | s off 536 | f 50/1/1 156/2/1 10/3/1 537 | usemtl Material.001 538 | f 15/4/2 17/5/2 5/6/2 539 | f 33/7/3 74/8/3 77/9/3 540 | f 12/10/4 3/11/4 10/12/4 541 | f 37/13/5 73/14/5 25/15/5 542 | f 9/16/2 8/17/2 11/18/2 543 | usemtl Material 544 | f 13/19/2 11/18/2 15/4/2 545 | f 16/20/4 10/12/4 14/21/4 546 | usemtl Material.001 547 | f 16/22/6 22/23/6 12/24/6 548 | usemtl Material 549 | f 14/25/1 9/26/1 13/27/1 550 | f 14/25/1 13/27/1 145/28/1 551 | usemtl Material.001 552 | f 42/29/4 78/30/4 34/31/4 553 | f 6/32/4 14/21/4 2/33/4 554 | f 1/34/2 15/4/2 5/6/2 555 | f 23/35/2 25/36/2 17/5/2 556 | f 5/37/5 61/38/5 1/39/5 557 | f 22/40/4 27/41/4 19/42/4 558 | f 33/43/4 81/44/4 41/45/4 559 | f 8/17/2 21/46/2 11/18/2 560 | f 11/18/2 23/35/2 15/4/2 561 | f 6/47/6 24/48/6 16/22/6 562 | f 12/24/6 19/49/6 7/50/6 563 | usemtl Material 564 | f 24/51/4 30/52/4 22/40/4 565 | usemtl Material.001 566 | f 8/53/7 72/54/7 20/55/7 567 | f 20/56/2 29/57/2 21/46/2 568 | f 18/58/4 32/59/4 24/51/4 569 | usemtl Material 570 | f 21/46/2 31/60/2 23/35/2 571 | f 35/61/3 32/62/3 36/63/3 572 | usemtl Material.001 573 | f 36/63/3 26/64/3 33/7/3 574 | f 34/65/3 30/66/3 35/61/3 575 | usemtl Material 576 | f 54/67/8 59/68/8 53/69/8 577 | usemtl Material.001 578 | f 53/70/9 44/71/9 55/72/9 579 | usemtl Material 580 | f 29/57/2 40/73/2 31/60/2 581 | usemtl Material.001 582 | f 51/74/9 47/75/9 44/71/9 583 | f 81/76/10 97/77/10 41/78/10 584 | f 52/79/9 54/80/9 56/81/9 585 | f 41/82/11 102/83/11 48/84/11 586 | f 31/60/2 37/85/2 25/36/2 587 | f 18/58/12 74/86/12 26/87/12 588 | f 28/88/2 39/89/2 29/57/2 589 | f 43/90/9 45/91/9 51/74/9 590 | f 48/92/9 43/90/9 52/79/9 591 | f 7/50/13 71/93/13 67/94/13 592 | f 25/15/5 69/95/5 17/96/5 593 | usemtl Material 594 | f 49/97/1 62/98/1 2/99/1 595 | usemtl Material.001 596 | f 17/96/5 65/100/5 5/37/5 597 | usemtl Material 598 | f 126/101/1 61/102/1 133/103/1 599 | usemtl Material.001 600 | f 56/81/9 36/104/9 33/105/9 601 | f 35/106/9 55/72/9 34/107/9 602 | f 54/80/9 35/106/9 36/104/9 603 | usemtl Material 604 | f 54/108/11 57/109/11 60/110/11 605 | f 51/111/14 57/112/14 43/113/14 606 | f 53/114/15 58/115/15 51/116/15 607 | usemtl Material.001 608 | f 149/117/16 85/118/16 147/119/16 609 | usemtl Material 610 | f 67/120/17 91/121/17 63/122/17 611 | usemtl Material.001 612 | f 66/123/18 88/124/18 70/125/18 613 | usemtl Material 614 | f 88/124/19 86/126/19 77/127/19 615 | usemtl Material.001 616 | f 92/128/20 159/129/20 158/130/20 617 | f 89/131/20 160/132/20 159/129/20 618 | usemtl Material 619 | f 86/126/19 81/133/19 77/127/19 620 | usemtl Material.001 621 | f 90/134/20 161/135/20 160/132/20 622 | f 135/136/16 69/95/16 136/137/16 623 | f 136/137/16 73/14/16 134/138/16 624 | f 134/138/16 79/139/16 132/140/16 625 | usemtl Material 626 | f 87/141/21 62/142/21 85/118/21 627 | usemtl Material.001 628 | f 89/131/22 67/120/22 71/143/22 629 | f 128/144/20 64/145/20 127/146/20 630 | usemtl Material 631 | f 71/143/23 75/147/23 78/148/23 632 | f 90/134/24 82/149/24 83/150/24 633 | usemtl Material.001 634 | f 42/151/10 106/152/10 82/153/10 635 | f 2/33/12 66/154/12 6/32/12 636 | f 20/55/7 76/155/7 28/156/7 637 | f 38/157/7 76/155/7 80/158/7 638 | f 6/47/25 70/159/25 18/160/25 639 | usemtl Material 640 | f 50/1/1 157/161/1 156/2/1 641 | usemtl Material.001 642 | f 47/162/26 99/163/26 101/164/26 643 | f 7/165/27 63/166/27 3/11/27 644 | usemtl Material 645 | f 50/1/1 63/167/1 91/168/1 646 | usemtl Material.001 647 | f 40/73/2 93/169/2 37/85/2 648 | f 39/89/2 96/170/2 40/73/2 649 | f 4/171/7 68/172/7 8/53/7 650 | f 27/41/27 71/173/27 19/42/27 651 | f 34/65/3 75/174/3 27/175/3 652 | f 42/176/15 34/177/15 55/178/15 653 | f 41/82/11 52/179/11 56/180/11 654 | f 98/181/28 117/182/28 114/183/28 655 | usemtl Material 656 | f 105/184/29 124/185/29 121/186/29 657 | usemtl Material.001 658 | f 95/187/30 110/188/30 111/189/30 659 | f 162/190/31 123/191/31 164/192/31 660 | f 97/77/32 121/193/32 113/194/32 661 | f 104/195/33 110/196/33 94/197/33 662 | usemtl Material 663 | f 99/198/34 116/199/34 115/200/34 664 | usemtl Material.001 665 | f 82/149/35 107/201/35 83/150/35 666 | f 161/135/36 107/201/36 162/190/36 667 | f 37/13/5 103/202/5 79/139/5 668 | f 79/139/37 138/203/37 132/140/37 669 | f 81/133/15 108/204/15 105/184/15 670 | f 80/158/7 94/197/7 38/157/7 671 | f 38/205/2 95/187/2 39/89/2 672 | f 102/206/26 46/207/26 48/208/26 673 | f 42/176/15 101/209/15 98/181/15 674 | f 46/207/26 99/163/26 45/210/26 675 | f 163/211/3 115/212/3 152/213/3 676 | f 153/214/3 118/215/3 154/216/3 677 | usemtl Material 678 | f 152/213/3 116/217/3 153/214/3 679 | usemtl Material.001 680 | f 139/218/3 120/219/3 143/220/3 681 | f 117/221/38 122/222/38 114/223/38 682 | f 154/216/3 124/224/3 155/225/3 683 | f 118/215/39 121/226/39 124/224/39 684 | usemtl Material 685 | f 106/227/40 123/191/40 107/201/40 686 | f 95/187/30 112/228/30 96/170/30 687 | usemtl Material.001 688 | f 138/203/41 119/229/41 144/230/41 689 | f 100/231/34 118/232/34 116/199/34 690 | f 96/170/30 109/233/30 93/169/30 691 | f 98/234/42 122/235/42 106/152/42 692 | f 99/198/34 117/236/34 101/237/34 693 | f 97/238/43 118/239/43 102/83/43 694 | f 103/202/44 109/240/44 119/229/44 695 | usemtl Material 696 | f 151/241/41 144/230/41 155/242/41 697 | usemtl Material.001 698 | f 142/243/3 119/244/3 109/245/3 699 | f 139/218/3 164/246/3 163/211/3 700 | f 111/247/3 141/248/3 112/249/3 701 | f 112/249/3 142/243/3 109/245/3 702 | f 110/250/3 140/251/3 111/247/3 703 | f 132/140/45 151/241/45 146/252/45 704 | f 80/158/11 137/253/11 104/195/11 705 | f 137/253/31 120/254/31 104/195/31 706 | usemtl Material 707 | f 125/255/1 64/256/1 4/257/1 708 | f 157/258/20 128/144/20 127/146/20 709 | f 148/259/16 132/140/16 146/252/16 710 | f 150/260/16 134/138/16 148/259/16 711 | usemtl Material.001 712 | f 150/260/16 135/136/16 136/137/16 713 | f 130/261/20 80/158/20 76/155/20 714 | f 129/262/20 76/155/20 72/54/20 715 | f 128/144/20 72/54/20 68/172/20 716 | f 65/100/16 133/263/16 61/38/16 717 | usemtl Material 718 | f 145/28/1 133/103/1 147/264/1 719 | f 49/97/1 147/264/1 85/265/1 720 | usemtl Material.001 721 | f 88/124/16 149/117/16 150/260/16 722 | f 88/124/16 148/259/16 86/126/16 723 | f 86/126/16 146/252/16 84/266/16 724 | f 92/128/20 157/258/20 91/121/20 725 | f 146/252/46 108/204/46 84/266/46 726 | f 163/211/3 123/267/3 117/221/3 727 | f 151/241/41 124/185/41 108/204/41 728 | f 142/243/3 155/225/3 144/268/3 729 | usemtl Material 730 | f 141/248/3 152/213/3 153/214/3 731 | usemtl Material.001 732 | f 141/248/3 154/216/3 142/243/3 733 | f 139/218/3 152/213/3 140/251/3 734 | f 131/269/47 162/190/47 137/253/47 735 | usemtl Material 736 | f 162/190/31 143/270/31 137/253/31 737 | f 156/2/1 127/271/1 125/255/1 738 | f 160/132/20 131/269/20 130/261/20 739 | f 159/129/20 130/261/20 129/262/20 740 | usemtl Material.001 741 | f 158/130/20 129/262/20 128/144/20 742 | usemtl Material 743 | f 135/136/16 147/119/16 133/263/16 744 | f 4/257/1 9/26/1 125/255/1 745 | f 9/26/1 10/3/1 156/2/1 746 | f 125/255/1 9/26/1 156/2/1 747 | f 10/3/1 3/272/1 50/1/1 748 | usemtl Material.001 749 | f 15/4/2 23/35/2 17/5/2 750 | f 33/7/3 26/64/3 74/8/3 751 | f 12/10/4 7/165/4 3/11/4 752 | f 37/13/5 79/139/5 73/14/5 753 | f 9/16/2 4/273/2 8/17/2 754 | usemtl Material 755 | f 13/19/2 9/16/2 11/18/2 756 | f 16/20/4 12/10/4 10/12/4 757 | usemtl Material.001 758 | f 16/22/6 24/48/6 22/23/6 759 | usemtl Material 760 | f 14/25/1 10/3/1 9/26/1 761 | f 13/27/1 1/274/1 126/101/1 762 | f 145/28/1 49/97/1 14/25/1 763 | f 49/97/1 2/99/1 14/25/1 764 | f 13/27/1 126/101/1 145/28/1 765 | usemtl Material.001 766 | f 42/29/4 82/275/4 78/30/4 767 | f 6/32/4 16/20/4 14/21/4 768 | f 1/34/2 13/19/2 15/4/2 769 | f 23/35/2 31/60/2 25/36/2 770 | f 5/37/5 65/100/5 61/38/5 771 | f 22/40/4 30/52/4 27/41/4 772 | f 33/43/4 77/276/4 81/44/4 773 | f 8/17/2 20/56/2 21/46/2 774 | f 11/18/2 21/46/2 23/35/2 775 | f 6/47/6 18/160/6 24/48/6 776 | f 12/24/6 22/23/6 19/49/6 777 | usemtl Material 778 | f 24/51/4 32/59/4 30/52/4 779 | usemtl Material.001 780 | f 8/53/7 68/172/7 72/54/7 781 | f 20/56/2 28/88/2 29/57/2 782 | f 18/58/4 26/87/4 32/59/4 783 | usemtl Material 784 | f 21/46/2 29/57/2 31/60/2 785 | f 35/61/3 30/66/3 32/62/3 786 | usemtl Material.001 787 | f 36/63/3 32/62/3 26/64/3 788 | f 34/65/3 27/175/3 30/66/3 789 | usemtl Material 790 | f 54/67/8 60/277/8 59/68/8 791 | usemtl Material.001 792 | f 53/70/9 51/74/9 44/71/9 793 | usemtl Material 794 | f 29/57/2 39/89/2 40/73/2 795 | usemtl Material.001 796 | f 51/74/9 45/91/9 47/75/9 797 | f 81/76/10 105/278/10 97/77/10 798 | f 52/79/9 43/90/9 54/80/9 799 | f 41/82/11 97/238/11 102/83/11 800 | f 31/60/2 40/73/2 37/85/2 801 | f 18/58/12 70/279/12 74/86/12 802 | f 28/88/2 38/205/2 39/89/2 803 | f 43/90/9 46/280/9 45/91/9 804 | f 48/92/9 46/280/9 43/90/9 805 | f 7/50/13 19/49/13 71/93/13 806 | f 25/15/5 73/14/5 69/95/5 807 | usemtl Material 808 | f 49/97/1 85/265/1 62/98/1 809 | usemtl Material.001 810 | f 17/96/5 69/95/5 65/100/5 811 | usemtl Material 812 | f 126/101/1 1/274/1 61/102/1 813 | usemtl Material.001 814 | f 56/81/9 54/80/9 36/104/9 815 | f 35/106/9 53/70/9 55/72/9 816 | f 54/80/9 53/70/9 35/106/9 817 | usemtl Material 818 | f 54/108/11 43/281/11 57/109/11 819 | f 51/111/14 58/282/14 57/112/14 820 | f 53/114/15 59/283/15 58/115/15 821 | usemtl Material.001 822 | f 149/117/16 87/141/16 85/118/16 823 | usemtl Material 824 | f 67/120/17 92/128/17 91/121/17 825 | usemtl Material.001 826 | f 66/123/21 87/141/21 88/124/21 827 | usemtl Material 828 | f 74/284/48 70/125/48 77/127/48 829 | f 70/125/49 88/124/49 77/127/49 830 | usemtl Material.001 831 | f 92/128/20 89/131/20 159/129/20 832 | f 89/131/20 90/134/20 160/132/20 833 | usemtl Material 834 | f 86/126/19 84/266/19 81/133/19 835 | usemtl Material.001 836 | f 90/134/20 83/150/20 161/135/20 837 | f 135/136/16 65/100/16 69/95/16 838 | f 136/137/16 69/95/16 73/14/16 839 | f 134/138/16 73/14/16 79/139/16 840 | usemtl Material 841 | f 87/141/21 66/123/21 62/142/21 842 | usemtl Material.001 843 | f 89/131/17 92/128/17 67/120/17 844 | f 128/144/20 68/172/20 64/145/20 845 | usemtl Material 846 | f 78/148/24 90/134/24 89/131/24 847 | f 89/131/50 71/143/50 78/148/50 848 | f 90/134/24 78/148/24 82/149/24 849 | usemtl Material.001 850 | f 42/151/10 98/234/10 106/152/10 851 | f 2/33/12 62/285/12 66/154/12 852 | f 20/55/7 72/54/7 76/155/7 853 | f 38/157/7 28/156/7 76/155/7 854 | f 6/47/25 66/286/25 70/159/25 855 | usemtl Material 856 | f 50/1/1 91/168/1 157/161/1 857 | usemtl Material.001 858 | f 47/162/26 45/210/26 99/163/26 859 | f 7/165/27 67/287/27 63/166/27 860 | usemtl Material 861 | f 50/1/1 3/272/1 63/167/1 862 | usemtl Material.001 863 | f 40/73/2 96/170/2 93/169/2 864 | f 39/89/2 95/187/2 96/170/2 865 | f 4/171/7 64/145/7 68/172/7 866 | f 27/41/27 75/288/27 71/173/27 867 | f 34/65/3 78/289/3 75/174/3 868 | f 55/178/15 44/290/15 42/176/15 869 | f 44/290/15 47/291/15 42/176/15 870 | f 56/180/11 33/292/11 41/82/11 871 | f 41/82/11 48/84/11 52/179/11 872 | f 98/181/51 101/209/51 117/182/51 873 | usemtl Material 874 | f 105/184/52 108/204/52 124/185/52 875 | usemtl Material.001 876 | f 95/187/30 94/293/30 110/188/30 877 | f 162/190/31 107/201/31 123/191/31 878 | f 97/77/42 105/278/42 121/193/42 879 | f 104/195/53 120/254/53 110/196/53 880 | usemtl Material 881 | f 99/198/34 100/231/34 116/199/34 882 | usemtl Material.001 883 | f 82/149/11 106/227/11 107/201/11 884 | f 161/135/54 83/150/54 107/201/54 885 | f 37/13/5 93/294/5 103/202/5 886 | f 79/139/15 103/202/15 138/203/15 887 | f 81/133/55 84/266/55 108/204/55 888 | f 80/158/7 104/195/7 94/197/7 889 | f 38/205/2 94/293/2 95/187/2 890 | f 102/206/26 100/295/26 46/207/26 891 | f 42/176/15 47/291/15 101/209/15 892 | f 46/207/26 100/295/26 99/163/26 893 | f 163/211/3 117/221/3 115/212/3 894 | f 153/214/3 116/217/3 118/215/3 895 | usemtl Material 896 | f 152/213/3 115/212/3 116/217/3 897 | usemtl Material.001 898 | f 139/218/3 110/250/3 120/219/3 899 | f 117/221/56 123/267/56 122/222/56 900 | f 154/216/3 118/215/3 124/224/3 901 | f 118/215/57 113/296/57 121/226/57 902 | usemtl Material 903 | f 106/227/58 122/297/58 123/191/58 904 | f 95/187/30 111/189/30 112/228/30 905 | usemtl Material.001 906 | f 138/203/41 103/202/41 119/229/41 907 | f 100/231/34 102/298/34 118/232/34 908 | f 96/170/30 112/228/30 109/233/30 909 | f 98/234/59 114/299/59 122/235/59 910 | f 99/198/34 115/200/34 117/236/34 911 | f 97/238/60 113/300/60 118/239/60 912 | f 103/202/61 93/294/61 109/240/61 913 | usemtl Material 914 | f 151/241/41 138/203/41 144/230/41 915 | usemtl Material.001 916 | f 142/243/3 144/268/3 119/244/3 917 | f 139/218/3 143/220/3 164/246/3 918 | f 111/247/3 140/251/3 141/248/3 919 | f 112/249/3 141/248/3 142/243/3 920 | f 110/250/3 139/218/3 140/251/3 921 | f 132/140/62 138/203/62 151/241/62 922 | f 80/158/63 131/269/63 137/253/63 923 | f 137/253/31 143/270/31 120/254/31 924 | usemtl Material 925 | f 125/255/1 127/271/1 64/256/1 926 | f 157/258/20 158/130/20 128/144/20 927 | f 148/259/16 134/138/16 132/140/16 928 | f 150/260/16 136/137/16 134/138/16 929 | usemtl Material.001 930 | f 150/260/16 149/117/16 135/136/16 931 | f 130/261/20 131/269/20 80/158/20 932 | f 129/262/20 130/261/20 76/155/20 933 | f 128/144/20 129/262/20 72/54/20 934 | f 65/100/16 135/136/16 133/263/16 935 | usemtl Material 936 | f 145/28/1 126/101/1 133/103/1 937 | f 49/97/1 145/28/1 147/264/1 938 | usemtl Material.001 939 | f 88/124/16 87/141/16 149/117/16 940 | f 88/124/16 150/260/16 148/259/16 941 | f 86/126/16 148/259/16 146/252/16 942 | f 92/128/20 158/130/20 157/258/20 943 | f 146/252/64 151/241/64 108/204/64 944 | f 163/211/3 164/246/3 123/267/3 945 | f 151/241/41 155/242/41 124/185/41 946 | f 142/243/3 154/216/3 155/225/3 947 | usemtl Material 948 | f 141/248/3 140/251/3 152/213/3 949 | usemtl Material.001 950 | f 141/248/3 153/214/3 154/216/3 951 | f 139/218/3 163/211/3 152/213/3 952 | f 131/269/65 161/135/65 162/190/65 953 | usemtl Material 954 | f 162/190/31 164/192/31 143/270/31 955 | f 156/2/1 157/161/1 127/271/1 956 | f 160/132/20 161/135/20 131/269/20 957 | f 159/129/20 160/132/20 130/261/20 958 | usemtl Material.001 959 | f 158/130/20 159/129/20 129/262/20 960 | usemtl Material 961 | f 135/136/16 149/117/16 147/119/16 962 | l 47 83 963 | l 84 48 964 | --------------------------------------------------------------------------------