diff --git a/DevScreenshots/10. Materials.png b/DevScreenshots/10. Materials.png new file mode 100644 index 0000000..02fec97 Binary files /dev/null and b/DevScreenshots/10. Materials.png differ diff --git a/NFPackCreator/AssetBuild/CubeTest/models/cubetest.obj b/NFPackCreator/AssetBuild/CubeTest/models/cubetest.obj deleted file mode 100644 index c2a1b3e..0000000 --- a/NFPackCreator/AssetBuild/CubeTest/models/cubetest.obj +++ /dev/null @@ -1,46 +0,0 @@ -# Blender v2.93.3 OBJ File: '' -# www.blender.org -o Cube_Cube.001 -v -1.000000 -1.000000 -1.000000 -v -1.000000 1.000000 -1.000000 -v 1.000000 -1.000000 -1.000000 -v 1.000000 1.000000 -1.000000 -v -1.000000 -1.000000 1.000000 -v -1.000000 1.000000 1.000000 -v 1.000000 -1.000000 1.000000 -v 1.000000 1.000000 1.000000 -vt 0.380883 0.000961 -vt 0.630883 0.250961 -vt 0.380883 0.250961 -vt 0.875500 0.748039 -vt 0.625500 0.498039 -vt 0.875500 0.498039 -vt 0.625500 0.748039 -vt 0.375500 0.498039 -vt 0.375500 0.748039 -vt 0.125500 0.498039 -vt 0.375500 0.248039 -vt 0.625500 0.248039 -vt 0.625500 0.998039 -vt 0.630883 0.000961 -vt 0.125500 0.748039 -vt 0.375500 0.998039 -vn 0.0000 0.0000 -1.0000 -vn 1.0000 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -s off -f 2/1/1 3/2/1 1/3/1 -f 4/4/2 7/5/2 3/6/2 -f 8/7/3 5/8/3 7/5/3 -f 6/9/4 1/10/4 5/8/4 -f 7/5/5 1/11/5 3/12/5 -f 4/13/6 6/9/6 8/7/6 -f 2/1/1 4/14/1 3/2/1 -f 4/4/2 8/7/2 7/5/2 -f 8/7/3 6/9/3 5/8/3 -f 6/9/4 2/15/4 1/10/4 -f 7/5/5 5/8/5 1/11/5 -f 4/13/6 2/16/6 6/9/6 diff --git a/NFPackCreator/AssetBuild/CubeTest/models/spec.mtl b/NFPackCreator/AssetBuild/CubeTest/models/spec.mtl new file mode 100644 index 0000000..a2737ae --- /dev/null +++ b/NFPackCreator/AssetBuild/CubeTest/models/spec.mtl @@ -0,0 +1,14 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl Material.001 +Ns 750.283502 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd diff.png +map_Ks spec.png diff --git a/NFPackCreator/AssetBuild/CubeTest/models/spec.obj b/NFPackCreator/AssetBuild/CubeTest/models/spec.obj new file mode 100644 index 0000000..d928228 --- /dev/null +++ b/NFPackCreator/AssetBuild/CubeTest/models/spec.obj @@ -0,0 +1,46 @@ +# Blender v2.93.3 OBJ File: '' +# www.blender.org +mtllib spec.mtl +o Cube_Cube.001 +v -1.000000 -1.000000 1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +vt -2.000000 -1.000000 +vt -1.000000 0.000000 +vt -2.000000 0.000000 +vt -1.000000 -1.000000 +vt 0.000000 0.000000 +vt 0.000000 -1.000000 +vt 1.000000 0.000000 +vt 1.000000 -1.000000 +vt 2.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 -2.000000 +vt 2.000000 -1.000000 +vt 1.000000 -2.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.001 +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/2/2 +f 8/6/3 5/7/3 7/5/3 +f 6/8/4 1/9/4 5/7/4 +f 7/5/5 1/10/5 3/11/5 +f 4/12/6 6/8/6 8/6/6 +f 2/1/1 4/4/1 3/2/1 +f 4/4/2 8/6/2 7/5/2 +f 8/6/3 6/8/3 5/7/3 +f 6/8/4 2/13/4 1/9/4 +f 7/5/5 5/7/5 1/10/5 +f 4/12/6 2/14/6 6/8/6 diff --git a/NFPackCreator/AssetBuild/CubeTest/textures/diff.png b/NFPackCreator/AssetBuild/CubeTest/textures/diff.png new file mode 100644 index 0000000..596e8da Binary files /dev/null and b/NFPackCreator/AssetBuild/CubeTest/textures/diff.png differ diff --git a/NFPackCreator/AssetBuild/CubeTest/textures/spec.png b/NFPackCreator/AssetBuild/CubeTest/textures/spec.png new file mode 100644 index 0000000..681bf6e Binary files /dev/null and b/NFPackCreator/AssetBuild/CubeTest/textures/spec.png differ diff --git a/NFPackCreator/AssetBuild/CubeTest/textures/texture2.png b/NFPackCreator/AssetBuild/CubeTest/textures/texture2.png deleted file mode 100644 index ec23ac9..0000000 Binary files a/NFPackCreator/AssetBuild/CubeTest/textures/texture2.png and /dev/null differ diff --git a/NFPackCreator/AssetBuild/base/models/cone.mtl b/NFPackCreator/AssetBuild/base/models/cone.mtl new file mode 100644 index 0000000..6e8d955 --- /dev/null +++ b/NFPackCreator/AssetBuild/base/models/cone.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 100 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/NFPackCreator/AssetBuild/base/models/cone.obj b/NFPackCreator/AssetBuild/base/models/cone.obj index be8ca08..cb63c2a 100644 --- a/NFPackCreator/AssetBuild/base/models/cone.obj +++ b/NFPackCreator/AssetBuild/base/models/cone.obj @@ -1,5 +1,6 @@ # Blender v2.93.3 OBJ File: '' # www.blender.org +mtllib cone.mtl o Cone v 0.000000 -1.000000 -1.000000 v 0.195090 -1.000000 -0.980785 @@ -133,6 +134,7 @@ vn -0.4969 0.4472 -0.7437 vn -0.3423 0.4472 -0.8263 vn 0.0000 -1.0000 0.0000 vn -0.1745 0.4472 -0.8772 +usemtl None s 1 f 1/1/1 33/2/2 2/3/3 f 2/3/3 33/2/2 3/4/4 diff --git a/NFPackCreator/AssetBuild/base/models/cube.mtl b/NFPackCreator/AssetBuild/base/models/cube.mtl new file mode 100644 index 0000000..6e8d955 --- /dev/null +++ b/NFPackCreator/AssetBuild/base/models/cube.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 100 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/NFPackCreator/AssetBuild/base/models/cube.obj b/NFPackCreator/AssetBuild/base/models/cube.obj index 84ea1f6..a52eabe 100644 --- a/NFPackCreator/AssetBuild/base/models/cube.obj +++ b/NFPackCreator/AssetBuild/base/models/cube.obj @@ -1,6 +1,7 @@ # Blender v2.93.3 OBJ File: '' # www.blender.org -o Cube_Cube.002 +mtllib cube.mtl +o Cube_Cube.001 v -1.000000 -1.000000 1.000000 v -1.000000 1.000000 1.000000 v -1.000000 -1.000000 -1.000000 @@ -29,6 +30,7 @@ vn 1.0000 0.0000 0.0000 vn 0.0000 0.0000 1.0000 vn 0.0000 -1.0000 0.0000 vn 0.0000 1.0000 0.0000 +usemtl None s off f 2/1/1 3/2/1 1/3/1 f 4/4/2 7/5/2 3/2/2 diff --git a/NFPackCreator/AssetBuild/base/models/cylinder.mtl b/NFPackCreator/AssetBuild/base/models/cylinder.mtl new file mode 100644 index 0000000..6e8d955 --- /dev/null +++ b/NFPackCreator/AssetBuild/base/models/cylinder.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 100 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/NFPackCreator/AssetBuild/base/models/cylinder.obj b/NFPackCreator/AssetBuild/base/models/cylinder.obj index 2f31320..3734aa0 100644 --- a/NFPackCreator/AssetBuild/base/models/cylinder.obj +++ b/NFPackCreator/AssetBuild/base/models/cylinder.obj @@ -1,6 +1,7 @@ # Blender v2.93.3 OBJ File: '' # www.blender.org -o Cylinder +mtllib cylinder.mtl +o Cylinder_Cylinder.001 v 0.000000 -1.000000 -1.000000 v 0.000000 1.000000 -1.000000 v 0.195090 -1.000000 -0.980785 @@ -229,6 +230,7 @@ vn -0.3827 0.0000 -0.9239 vn 0.0000 1.0000 -0.0000 vn -0.1951 0.0000 -0.9808 vn 0.0000 -1.0000 0.0000 +usemtl None s 1 f 2/1/1 3/2/2 1/3/1 f 4/4/2 5/5/3 3/2/2 diff --git a/NFPackCreator/AssetBuild/base/models/plane.mtl b/NFPackCreator/AssetBuild/base/models/plane.mtl new file mode 100644 index 0000000..6e8d955 --- /dev/null +++ b/NFPackCreator/AssetBuild/base/models/plane.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 100 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/NFPackCreator/AssetBuild/base/models/plane.obj b/NFPackCreator/AssetBuild/base/models/plane.obj index 9360dff..1fb326d 100644 --- a/NFPackCreator/AssetBuild/base/models/plane.obj +++ b/NFPackCreator/AssetBuild/base/models/plane.obj @@ -1,5 +1,6 @@ # Blender v2.93.3 OBJ File: '' # www.blender.org +mtllib plane.mtl o Plane v -1.000000 0.000000 1.000000 v 1.000000 0.000000 1.000000 @@ -10,6 +11,7 @@ vt 0.000000 1.000000 vt 0.000000 0.000000 vt 1.000000 1.000000 vn 0.0000 1.0000 0.0000 +usemtl None s off f 2/1/1 3/2/1 1/3/1 f 2/1/1 4/4/1 3/2/1 diff --git a/NFPackCreator/AssetBuild/base/models/sphere.mtl b/NFPackCreator/AssetBuild/base/models/sphere.mtl new file mode 100644 index 0000000..6e8d955 --- /dev/null +++ b/NFPackCreator/AssetBuild/base/models/sphere.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 100 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/NFPackCreator/AssetBuild/base/models/sphere.obj b/NFPackCreator/AssetBuild/base/models/sphere.obj index 58a8463..4e304be 100644 --- a/NFPackCreator/AssetBuild/base/models/sphere.obj +++ b/NFPackCreator/AssetBuild/base/models/sphere.obj @@ -1,6 +1,7 @@ # Blender v2.93.3 OBJ File: '' # www.blender.org -o Sphere +mtllib sphere.mtl +o Sphere_Sphere.001 v 0.000000 0.980785 -0.195090 v 0.000000 0.923880 -0.382683 v 0.000000 0.831470 -0.555570 @@ -483,11 +484,13 @@ v 0.000000 -0.382683 -0.923879 v 0.000000 -0.923880 -0.382683 v 0.000000 -0.980785 -0.195090 v 0.000000 -1.000000 0.000000 +vt 0.750000 0.375000 +vt 0.718750 0.312500 +vt 0.750000 0.312500 vt 0.750000 0.812500 vt 0.718750 0.750000 vt 0.750000 0.750000 vt 0.750000 0.250000 -vt 0.718750 0.312500 vt 0.718750 0.250000 vt 0.718750 0.687500 vt 0.750000 0.687500 @@ -512,9 +515,8 @@ vt 0.750000 0.437500 vt 0.718750 0.875000 vt 0.750000 0.875000 vt 0.718750 0.375000 -vt 0.750000 0.375000 vt 0.718750 0.812500 -vt 0.750000 0.312500 +vt 0.687500 0.375000 vt 0.687500 0.812500 vt 0.687500 0.312500 vt 0.687500 0.750000 @@ -531,7 +533,7 @@ vt 0.687500 0.937500 vt 0.703125 0.000000 vt 0.687500 0.437500 vt 0.687500 0.875000 -vt 0.687500 0.375000 +vt 0.656250 0.125000 vt 0.656250 0.562500 vt 0.656250 0.062500 vt 0.656250 0.500000 @@ -548,7 +550,8 @@ vt 0.656250 0.250000 vt 0.656250 0.687500 vt 0.656250 0.187500 vt 0.656250 0.625000 -vt 0.656250 0.125000 +vt 0.625000 0.875000 +vt 0.625000 0.812500 vt 0.625000 0.375000 vt 0.625000 0.312500 vt 0.625000 0.750000 @@ -564,10 +567,8 @@ vt 0.640625 1.000000 vt 0.625000 0.937500 vt 0.640625 0.000000 vt 0.625000 0.437500 -vt 0.625000 0.875000 -vt 0.625000 0.812500 -vt 0.593750 0.062500 vt 0.593750 0.562500 +vt 0.593750 0.062500 vt 0.593750 0.500000 vt 0.609375 1.000000 vt 0.593750 0.937500 @@ -583,6 +584,7 @@ vt 0.593750 0.687500 vt 0.593750 0.187500 vt 0.593750 0.625000 vt 0.593750 0.125000 +vt 0.562500 0.312500 vt 0.562500 0.750000 vt 0.562500 0.250000 vt 0.562500 0.687500 @@ -599,13 +601,12 @@ vt 0.562500 0.437500 vt 0.562500 0.875000 vt 0.562500 0.375000 vt 0.562500 0.812500 -vt 0.562500 0.312500 +vt 0.531250 0.062500 vt 0.531250 0.562500 vt 0.531250 0.500000 vt 0.546875 1.000000 vt 0.531250 0.937500 vt 0.546875 0.000000 -vt 0.531250 0.062500 vt 0.531250 0.437500 vt 0.531250 0.875000 vt 0.531250 0.375000 @@ -617,8 +618,8 @@ vt 0.531250 0.687500 vt 0.531250 0.187500 vt 0.531250 0.625000 vt 0.531250 0.125000 -vt 0.500000 0.250000 vt 0.500000 0.750000 +vt 0.500000 0.250000 vt 0.500000 0.687500 vt 0.500000 0.187500 vt 0.500000 0.625000 @@ -634,10 +635,13 @@ vt 0.500000 0.875000 vt 0.500000 0.375000 vt 0.500000 0.812500 vt 0.500000 0.312500 +vt 0.468750 0.562500 +vt 0.468750 0.500000 +vt 0.484375 1.000000 +vt 0.468750 0.937500 vt 0.484375 0.000000 vt 0.468750 0.062500 vt 0.468750 0.437500 -vt 0.468750 0.937500 vt 0.468750 0.875000 vt 0.468750 0.375000 vt 0.468750 0.812500 @@ -648,10 +652,8 @@ vt 0.468750 0.687500 vt 0.468750 0.187500 vt 0.468750 0.625000 vt 0.468750 0.125000 -vt 0.468750 0.562500 -vt 0.468750 0.500000 -vt 0.484375 1.000000 vt 0.437500 0.250000 +vt 0.437500 0.687500 vt 0.437500 0.187500 vt 0.437500 0.625000 vt 0.437500 0.125000 @@ -667,10 +669,11 @@ vt 0.437500 0.375000 vt 0.437500 0.812500 vt 0.437500 0.312500 vt 0.437500 0.750000 -vt 0.437500 0.687500 +vt 0.421875 0.000000 +vt 0.406250 0.062500 +vt 0.406250 0.437500 vt 0.406250 0.937500 vt 0.406250 0.875000 -vt 0.406250 0.437500 vt 0.406250 0.375000 vt 0.406250 0.812500 vt 0.406250 0.312500 @@ -681,10 +684,9 @@ vt 0.406250 0.187500 vt 0.406250 0.625000 vt 0.406250 0.125000 vt 0.406250 0.562500 -vt 0.406250 0.062500 vt 0.406250 0.500000 vt 0.421875 1.000000 -vt 0.421875 0.000000 +vt 0.375000 0.187500 vt 0.375000 0.625000 vt 0.375000 0.125000 vt 0.375000 0.562500 @@ -701,7 +703,8 @@ vt 0.375000 0.312500 vt 0.375000 0.750000 vt 0.375000 0.250000 vt 0.375000 0.687500 -vt 0.375000 0.187500 +vt 0.343750 0.937500 +vt 0.343750 0.875000 vt 0.343750 0.375000 vt 0.343750 0.812500 vt 0.343750 0.312500 @@ -715,12 +718,10 @@ vt 0.343750 0.562500 vt 0.343750 0.062500 vt 0.343750 0.500000 vt 0.359375 1.000000 -vt 0.343750 0.937500 vt 0.359375 0.000000 vt 0.343750 0.437500 -vt 0.343750 0.875000 -vt 0.312500 0.125000 vt 0.312500 0.625000 +vt 0.312500 0.125000 vt 0.312500 0.562500 vt 0.312500 0.062500 vt 0.312500 0.500000 @@ -736,6 +737,8 @@ vt 0.312500 0.750000 vt 0.312500 0.250000 vt 0.312500 0.687500 vt 0.312500 0.187500 +vt 0.281250 0.437500 +vt 0.281250 0.375000 vt 0.281250 0.875000 vt 0.281250 0.812500 vt 0.281250 0.312500 @@ -751,11 +754,9 @@ vt 0.281250 0.500000 vt 0.296875 1.000000 vt 0.281250 0.937500 vt 0.296875 0.000000 -vt 0.281250 0.437500 -vt 0.281250 0.375000 +vt 0.250000 0.125000 vt 0.250000 0.625000 vt 0.250000 0.562500 -vt 0.250000 0.125000 vt 0.250000 0.062500 vt 0.250000 0.500000 vt 0.265625 1.000000 @@ -770,6 +771,7 @@ vt 0.250000 0.750000 vt 0.250000 0.250000 vt 0.250000 0.687500 vt 0.250000 0.187500 +vt 0.218750 0.812500 vt 0.218750 0.312500 vt 0.218750 0.750000 vt 0.218750 0.250000 @@ -786,9 +788,9 @@ vt 0.234375 0.000000 vt 0.218750 0.437500 vt 0.218750 0.875000 vt 0.218750 0.375000 -vt 0.218750 0.812500 -vt 0.187500 0.062500 +vt 0.187500 0.625000 vt 0.187500 0.562500 +vt 0.187500 0.062500 vt 0.187500 0.500000 vt 0.203125 1.000000 vt 0.187500 0.937500 @@ -802,10 +804,10 @@ vt 0.187500 0.750000 vt 0.187500 0.250000 vt 0.187500 0.687500 vt 0.187500 0.187500 -vt 0.187500 0.625000 vt 0.187500 0.125000 -vt 0.156250 0.250000 +vt 0.156250 0.312500 vt 0.156250 0.750000 +vt 0.156250 0.250000 vt 0.156250 0.687500 vt 0.156250 0.187500 vt 0.156250 0.625000 @@ -820,11 +822,12 @@ vt 0.156250 0.437500 vt 0.156250 0.875000 vt 0.156250 0.375000 vt 0.156250 0.812500 -vt 0.156250 0.312500 +vt 0.125000 0.062500 +vt 0.125000 0.562500 +vt 0.125000 0.500000 vt 0.140625 1.000000 vt 0.125000 0.937500 vt 0.140625 0.000000 -vt 0.125000 0.062500 vt 0.125000 0.437500 vt 0.125000 0.875000 vt 0.125000 0.375000 @@ -836,10 +839,8 @@ vt 0.125000 0.687500 vt 0.125000 0.187500 vt 0.125000 0.625000 vt 0.125000 0.125000 -vt 0.125000 0.562500 -vt 0.125000 0.500000 -vt 0.093750 0.687500 vt 0.093750 0.250000 +vt 0.093750 0.687500 vt 0.093750 0.187500 vt 0.093750 0.625000 vt 0.093750 0.125000 @@ -855,6 +856,10 @@ vt 0.093750 0.375000 vt 0.093750 0.812500 vt 0.093750 0.312500 vt 0.093750 0.750000 +vt 0.078125 1.000000 +vt 0.062500 0.937500 +vt 0.078125 0.000000 +vt 0.062500 0.062500 vt 0.062500 0.437500 vt 0.062500 0.875000 vt 0.062500 0.375000 @@ -867,13 +872,9 @@ vt 0.062500 0.187500 vt 0.062500 0.625000 vt 0.062500 0.125000 vt 0.062500 0.562500 -vt 0.062500 0.062500 vt 0.062500 0.500000 -vt 0.078125 1.000000 -vt 0.062500 0.937500 -vt 0.078125 0.000000 -vt 0.031250 0.187500 vt 0.031250 0.687500 +vt 0.031250 0.187500 vt 0.031250 0.625000 vt 0.031250 0.125000 vt 0.031250 0.562500 @@ -889,8 +890,8 @@ vt 0.031250 0.812500 vt 0.031250 0.312500 vt 0.031250 0.750000 vt 0.031250 0.250000 -vt 0.000000 0.875000 vt 0.000000 0.437500 +vt 0.000000 0.875000 vt 0.000000 0.375000 vt 0.000000 0.812500 vt 0.000000 0.312500 @@ -906,11 +907,13 @@ vt 0.000000 0.500000 vt 0.015625 1.000000 vt 0.000000 0.937500 vt 0.015625 0.000000 +vt 1.000000 0.187500 +vt 0.968750 0.250000 +vt 0.968750 0.187500 vt 1.000000 0.625000 vt 0.968750 0.687500 vt 0.968750 0.625000 vt 1.000000 0.125000 -vt 0.968750 0.187500 vt 0.968750 0.125000 vt 1.000000 0.562500 vt 0.968750 0.562500 @@ -935,9 +938,8 @@ vt 1.000000 0.312500 vt 0.968750 0.750000 vt 1.000000 0.750000 vt 1.000000 0.250000 -vt 0.968750 0.250000 vt 1.000000 0.687500 -vt 1.000000 0.187500 +vt 0.937500 0.875000 vt 0.937500 0.437500 vt 0.937500 0.375000 vt 0.937500 0.812500 @@ -954,10 +956,10 @@ vt 0.937500 0.500000 vt 0.953125 1.000000 vt 0.937500 0.937500 vt 0.953125 0.000000 -vt 0.937500 0.875000 +vt 0.906250 0.687500 +vt 0.906250 0.625000 vt 0.906250 0.187500 vt 0.906250 0.125000 -vt 0.906250 0.625000 vt 0.906250 0.562500 vt 0.906250 0.062500 vt 0.906250 0.500000 @@ -971,7 +973,8 @@ vt 0.906250 0.812500 vt 0.906250 0.312500 vt 0.906250 0.750000 vt 0.906250 0.250000 -vt 0.906250 0.687500 +vt 0.875000 0.375000 +vt 0.875000 0.812500 vt 0.875000 0.312500 vt 0.875000 0.750000 vt 0.875000 0.250000 @@ -987,11 +990,10 @@ vt 0.875000 0.937500 vt 0.890625 0.000000 vt 0.875000 0.437500 vt 0.875000 0.875000 -vt 0.875000 0.375000 -vt 0.875000 0.812500 vt 0.843750 0.125000 -vt 0.843750 0.062500 +vt 0.843750 0.625000 vt 0.843750 0.562500 +vt 0.843750 0.062500 vt 0.843750 0.500000 vt 0.859375 1.000000 vt 0.843750 0.937500 @@ -1005,7 +1007,7 @@ vt 0.843750 0.750000 vt 0.843750 0.250000 vt 0.843750 0.687500 vt 0.843750 0.187500 -vt 0.843750 0.625000 +vt 0.812500 0.312500 vt 0.812500 0.750000 vt 0.812500 0.250000 vt 0.812500 0.687500 @@ -1022,13 +1024,12 @@ vt 0.812500 0.437500 vt 0.812500 0.875000 vt 0.812500 0.375000 vt 0.812500 0.812500 -vt 0.812500 0.312500 +vt 0.781250 0.062500 vt 0.781250 0.562500 vt 0.781250 0.500000 vt 0.796875 1.000000 vt 0.781250 0.937500 vt 0.796875 0.000000 -vt 0.781250 0.062500 vt 0.781250 0.437500 vt 0.781250 0.875000 vt 0.781250 0.375000 @@ -1042,11 +1043,13 @@ vt 0.781250 0.625000 vt 0.781250 0.125000 vt 0.765625 1.000000 vt 0.765625 0.000000 +vn 0.0000 -0.3805 -0.9247 +vn 0.1626 -0.5528 -0.8173 +vn 0.0000 -0.5528 -0.8333 vn 0.0000 0.8286 -0.5598 vn 0.1385 0.7040 -0.6965 vn 0.0000 0.7040 -0.7101 vn 0.0000 -0.7040 -0.7101 -vn 0.1626 -0.5528 -0.8173 vn 0.1385 -0.7040 -0.6965 vn 0.1626 0.5528 -0.8173 vn 0.0000 0.5528 -0.8333 @@ -1071,9 +1074,8 @@ vn 0.0000 -0.1939 -0.9810 vn 0.0757 0.9217 -0.3804 vn 0.0000 0.9217 -0.3879 vn 0.1804 -0.3805 -0.9070 -vn 0.0000 -0.3805 -0.9247 vn 0.1092 0.8286 -0.5490 -vn 0.0000 -0.5528 -0.8333 +vn 0.3539 -0.3805 -0.8544 vn 0.2142 0.8286 -0.5171 vn 0.3189 -0.5528 -0.7699 vn 0.2717 0.7040 -0.6561 @@ -1088,7 +1090,7 @@ vn 0.3827 0.0000 -0.9239 vn 0.0769 0.9796 -0.1856 vn 0.3754 -0.1939 -0.9063 vn 0.1484 0.9217 -0.3583 -vn 0.3539 -0.3805 -0.8544 +vn 0.2155 -0.9217 -0.3225 vn 0.5450 0.1939 -0.8157 vn 0.1116 -0.9796 -0.1671 vn 0.5556 0.0000 -0.8314 @@ -1103,7 +1105,8 @@ vn 0.3945 -0.7040 -0.5904 vn 0.4630 0.5528 -0.6929 vn 0.3110 -0.8286 -0.4654 vn 0.5137 0.3805 -0.7689 -vn 0.2155 -0.9217 -0.3225 +vn 0.2743 0.9217 -0.2743 +vn 0.3958 0.8286 -0.3958 vn 0.6539 -0.3805 -0.6539 vn 0.5893 -0.5528 -0.5893 vn 0.5021 0.7040 -0.5021 @@ -1117,10 +1120,8 @@ vn 0.1421 -0.9796 -0.1421 vn 0.7071 0.0000 -0.7071 vn 0.1421 0.9796 -0.1421 vn 0.6937 -0.1939 -0.6937 -vn 0.2743 0.9217 -0.2743 -vn 0.3958 0.8286 -0.3958 -vn 0.1671 -0.9796 -0.1116 vn 0.8157 0.1939 -0.5450 +vn 0.1671 -0.9796 -0.1116 vn 0.8314 0.0000 -0.5556 vn 0.1671 0.9796 -0.1116 vn 0.8157 -0.1939 -0.5450 @@ -1134,6 +1135,7 @@ vn 0.6929 0.5528 -0.4630 vn 0.4654 -0.8286 -0.3110 vn 0.7689 0.3805 -0.5137 vn 0.3225 -0.9217 -0.2155 +vn 0.7699 -0.5528 -0.3189 vn 0.6561 0.7040 -0.2717 vn 0.6561 -0.7040 -0.2717 vn 0.7699 0.5528 -0.3189 @@ -1148,11 +1150,10 @@ vn 0.9063 -0.1939 -0.3754 vn 0.3583 0.9217 -0.1484 vn 0.8544 -0.3805 -0.3539 vn 0.5171 0.8286 -0.2142 -vn 0.7699 -0.5528 -0.3189 +vn 0.1971 -0.9796 -0.0392 vn 0.9622 0.1939 -0.1914 vn 0.9808 0.0000 -0.1951 vn 0.1971 0.9796 -0.0392 -vn 0.1971 -0.9796 -0.0392 vn 0.9622 -0.1939 -0.1914 vn 0.3804 0.9217 -0.0757 vn 0.9070 -0.3805 -0.1804 @@ -1164,8 +1165,8 @@ vn 0.8173 0.5528 -0.1626 vn 0.5490 -0.8286 -0.1092 vn 0.9070 0.3805 -0.1804 vn 0.3804 -0.9217 -0.0757 -vn 0.7101 -0.7040 0.0000 vn 0.7101 0.7040 0.0000 +vn 0.7101 -0.7040 0.0000 vn 0.8333 0.5528 0.0000 vn 0.5598 -0.8286 0.0000 vn 0.9247 0.3805 0.0000 @@ -1179,9 +1180,11 @@ vn 0.3879 0.9217 0.0000 vn 0.9247 -0.3805 0.0000 vn 0.5598 0.8286 0.0000 vn 0.8333 -0.5528 0.0000 +vn 0.9622 0.1939 0.1914 +vn 0.9808 0.0000 0.1951 +vn 0.1971 0.9796 0.0392 vn 0.1971 -0.9796 0.0392 vn 0.9622 -0.1939 0.1914 -vn 0.1971 0.9796 0.0392 vn 0.3804 0.9217 0.0757 vn 0.9070 -0.3805 0.1804 vn 0.5490 0.8286 0.1092 @@ -1192,9 +1195,8 @@ vn 0.8173 0.5528 0.1626 vn 0.5490 -0.8286 0.1092 vn 0.9070 0.3805 0.1804 vn 0.3804 -0.9217 0.0757 -vn 0.9622 0.1939 0.1914 -vn 0.9808 0.0000 0.1951 vn 0.6561 -0.7040 0.2717 +vn 0.7699 0.5528 0.3189 vn 0.5171 -0.8286 0.2142 vn 0.8544 0.3805 0.3539 vn 0.3583 -0.9217 0.1484 @@ -1208,10 +1210,10 @@ vn 0.8544 -0.3805 0.3539 vn 0.5171 0.8286 0.2142 vn 0.7699 -0.5528 0.3189 vn 0.6561 0.7040 0.2717 -vn 0.7699 0.5528 0.3189 +vn 0.1671 -0.9796 0.1116 +vn 0.8157 -0.1939 0.5450 vn 0.1671 0.9796 0.1116 vn 0.3225 0.9217 0.2155 -vn 0.8157 -0.1939 0.5450 vn 0.7689 -0.3805 0.5137 vn 0.4654 0.8286 0.3110 vn 0.6929 -0.5528 0.4630 @@ -1222,8 +1224,8 @@ vn 0.4654 -0.8286 0.3110 vn 0.7689 0.3805 0.5137 vn 0.3225 -0.9217 0.2155 vn 0.8157 0.1939 0.5450 -vn 0.1671 -0.9796 0.1116 vn 0.8314 0.0000 0.5556 +vn 0.3958 -0.8286 0.3958 vn 0.6539 0.3805 0.6539 vn 0.2743 -0.9217 0.2743 vn 0.6937 0.1939 0.6937 @@ -1238,7 +1240,8 @@ vn 0.5893 -0.5528 0.5893 vn 0.5021 0.7040 0.5021 vn 0.5021 -0.7040 0.5021 vn 0.5893 0.5528 0.5893 -vn 0.3958 -0.8286 0.3958 +vn 0.1116 0.9796 0.1671 +vn 0.2155 0.9217 0.3225 vn 0.5137 -0.3805 0.7689 vn 0.3110 0.8286 0.4654 vn 0.4630 -0.5528 0.6929 @@ -1251,11 +1254,9 @@ vn 0.2155 -0.9217 0.3225 vn 0.5450 0.1939 0.8157 vn 0.1116 -0.9796 0.1671 vn 0.5556 0.0000 0.8314 -vn 0.1116 0.9796 0.1671 vn 0.5450 -0.1939 0.8157 -vn 0.2155 0.9217 0.3225 -vn 0.1484 -0.9217 0.3583 vn 0.3539 0.3805 0.8544 +vn 0.1484 -0.9217 0.3583 vn 0.3754 0.1939 0.9063 vn 0.0769 -0.9796 0.1856 vn 0.3827 0.0000 0.9239 @@ -1269,6 +1270,8 @@ vn 0.2717 0.7040 0.6561 vn 0.2717 -0.7040 0.6561 vn 0.3189 0.5528 0.7699 vn 0.2142 -0.8286 0.5171 +vn 0.1914 -0.1939 0.9622 +vn 0.1804 -0.3805 0.9070 vn 0.0757 0.9217 0.3804 vn 0.1092 0.8286 0.5490 vn 0.1626 -0.5528 0.8173 @@ -1282,11 +1285,9 @@ vn 0.1914 0.1939 0.9622 vn 0.0392 -0.9796 0.1971 vn 0.1951 0.0000 0.9808 vn 0.0392 0.9796 0.1971 -vn 0.1914 -0.1939 0.9622 -vn 0.1804 -0.3805 0.9070 +vn 0.0000 -0.9217 0.3879 vn 0.0000 0.3805 0.9247 vn 0.0000 0.1939 0.9810 -vn 0.0000 -0.9217 0.3879 vn 0.0000 -0.9796 0.2010 vn 0.0000 0.0000 1.0000 vn 0.0000 0.9796 0.2010 @@ -1299,6 +1300,7 @@ vn 0.0000 0.7040 0.7101 vn 0.0000 -0.7040 0.7101 vn 0.0000 0.5528 0.8333 vn 0.0000 -0.8286 0.5598 +vn -0.1092 0.8286 0.5490 vn -0.1626 -0.5528 0.8173 vn -0.1385 0.7040 0.6965 vn -0.1385 -0.7040 0.6965 @@ -1313,9 +1315,9 @@ vn -0.0392 0.9796 0.1971 vn -0.1914 -0.1939 0.9622 vn -0.0757 0.9217 0.3804 vn -0.1804 -0.3805 0.9070 -vn -0.1092 0.8286 0.5490 -vn -0.0769 -0.9796 0.1856 +vn -0.3539 0.3805 0.8544 vn -0.3754 0.1939 0.9063 +vn -0.0769 -0.9796 0.1856 vn -0.3827 0.0000 0.9239 vn -0.0769 0.9796 0.1856 vn -0.3754 -0.1939 0.9063 @@ -1327,10 +1329,10 @@ vn -0.2717 0.7040 0.6561 vn -0.2717 -0.7040 0.6561 vn -0.3189 0.5528 0.7699 vn -0.2142 -0.8286 0.5171 -vn -0.3539 0.3805 0.8544 vn -0.1484 -0.9217 0.3583 -vn -0.3945 -0.7040 0.5904 +vn -0.4630 -0.5528 0.6929 vn -0.3945 0.7040 0.5904 +vn -0.3945 -0.7040 0.5904 vn -0.4630 0.5528 0.6929 vn -0.3110 -0.8286 0.4654 vn -0.5137 0.3805 0.7689 @@ -1343,9 +1345,10 @@ vn -0.5450 -0.1939 0.8157 vn -0.2155 0.9217 0.3225 vn -0.5137 -0.3805 0.7689 vn -0.3110 0.8286 0.4654 -vn -0.4630 -0.5528 0.6929 -vn -0.1421 0.9796 0.1421 vn -0.1421 -0.9796 0.1421 +vn -0.6937 0.1939 0.6937 +vn -0.7071 0.0000 0.7071 +vn -0.1421 0.9796 0.1421 vn -0.6937 -0.1939 0.6937 vn -0.2743 0.9217 0.2743 vn -0.6539 -0.3805 0.6539 @@ -1357,10 +1360,8 @@ vn -0.5893 0.5528 0.5893 vn -0.3958 -0.8286 0.3958 vn -0.6539 0.3805 0.6539 vn -0.2743 -0.9217 0.2743 -vn -0.6937 0.1939 0.6937 -vn -0.7071 0.0000 0.7071 -vn -0.6929 0.5528 0.4630 vn -0.5904 -0.7040 0.3945 +vn -0.6929 0.5528 0.4630 vn -0.4654 -0.8286 0.3110 vn -0.7689 0.3805 0.5137 vn -0.3225 -0.9217 0.2155 @@ -1374,6 +1375,8 @@ vn -0.7689 -0.3805 0.5137 vn -0.4654 0.8286 0.3110 vn -0.6929 -0.5528 0.4630 vn -0.5904 0.7040 0.3945 +vn -0.1856 0.9796 0.0769 +vn -0.1856 -0.9796 0.0769 vn -0.9063 -0.1939 0.3754 vn -0.3583 0.9217 0.1484 vn -0.8544 -0.3805 0.3539 @@ -1386,11 +1389,9 @@ vn -0.5171 -0.8286 0.2142 vn -0.8544 0.3805 0.3539 vn -0.3583 -0.9217 0.1484 vn -0.9063 0.1939 0.3754 -vn -0.1856 -0.9796 0.0769 vn -0.9239 0.0000 0.3827 -vn -0.1856 0.9796 0.0769 -vn -0.5490 -0.8286 0.1092 vn -0.8173 0.5528 0.1626 +vn -0.5490 -0.8286 0.1092 vn -0.9070 0.3805 0.1804 vn -0.3804 -0.9217 0.0757 vn -0.9622 0.1939 0.1914 @@ -1404,8 +1405,8 @@ vn -0.5490 0.8286 0.1092 vn -0.8173 -0.5528 0.1626 vn -0.6965 0.7040 0.1385 vn -0.6965 -0.7040 0.1385 -vn -0.3879 0.9217 0.0000 vn -0.9810 -0.1939 0.0000 +vn -0.3879 0.9217 0.0000 vn -0.9247 -0.3805 0.0000 vn -0.5598 0.8286 0.0000 vn -0.8333 -0.5528 0.0000 @@ -1419,9 +1420,10 @@ vn -0.9810 0.1939 0.0000 vn -0.2010 -0.9796 0.0000 vn -1.0000 0.0000 0.0000 vn -0.2010 0.9796 0.0000 +vn -0.6965 -0.7040 -0.1385 +vn -0.5490 -0.8286 -0.1092 vn -0.8173 0.5528 -0.1626 vn -0.9070 0.3805 -0.1804 -vn -0.5490 -0.8286 -0.1092 vn -0.3804 -0.9217 -0.0757 vn -0.9622 0.1939 -0.1914 vn -0.1971 -0.9796 -0.0392 @@ -1433,7 +1435,7 @@ vn -0.9070 -0.3805 -0.1804 vn -0.5490 0.8286 -0.1092 vn -0.8173 -0.5528 -0.1626 vn -0.6965 0.7040 -0.1385 -vn -0.6965 -0.7040 -0.1385 +vn -0.3583 0.9217 -0.1484 vn -0.9063 -0.1939 -0.3754 vn -0.8544 -0.3805 -0.3539 vn -0.5171 0.8286 -0.2142 @@ -1448,10 +1450,10 @@ vn -0.9063 0.1939 -0.3754 vn -0.1856 -0.9796 -0.0769 vn -0.9239 0.0000 -0.3827 vn -0.1856 0.9796 -0.0769 -vn -0.3583 0.9217 -0.1484 +vn -0.6929 0.5528 -0.4630 +vn -0.7689 0.3805 -0.5137 vn -0.4654 -0.8286 -0.3110 vn -0.3225 -0.9217 -0.2155 -vn -0.7689 0.3805 -0.5137 vn -0.8157 0.1939 -0.5450 vn -0.1671 -0.9796 -0.1116 vn -0.8314 0.0000 -0.5556 @@ -1463,7 +1465,8 @@ vn -0.4654 0.8286 -0.3110 vn -0.6929 -0.5528 -0.4630 vn -0.5904 0.7040 -0.3945 vn -0.5904 -0.7040 -0.3945 -vn -0.6929 0.5528 -0.4630 +vn -0.6539 -0.3805 -0.6539 +vn -0.3958 0.8286 -0.3958 vn -0.5893 -0.5528 -0.5893 vn -0.5021 0.7040 -0.5021 vn -0.5021 -0.7040 -0.5021 @@ -1477,11 +1480,10 @@ vn -0.7071 0.0000 -0.7071 vn -0.1421 0.9796 -0.1421 vn -0.6937 -0.1939 -0.6937 vn -0.2743 0.9217 -0.2743 -vn -0.6539 -0.3805 -0.6539 -vn -0.3958 0.8286 -0.3958 vn -0.2155 -0.9217 -0.3225 -vn -0.1116 -0.9796 -0.1671 +vn -0.5137 0.3805 -0.7689 vn -0.5450 0.1939 -0.8157 +vn -0.1116 -0.9796 -0.1671 vn -0.5556 0.0000 -0.8314 vn -0.1116 0.9796 -0.1671 vn -0.5450 -0.1939 -0.8157 @@ -1493,7 +1495,7 @@ vn -0.3945 0.7040 -0.5904 vn -0.3945 -0.7040 -0.5904 vn -0.4630 0.5528 -0.6929 vn -0.3110 -0.8286 -0.4654 -vn -0.5137 0.3805 -0.7689 +vn -0.3189 -0.5528 -0.7699 vn -0.2717 0.7040 -0.6561 vn -0.2717 -0.7040 -0.6561 vn -0.3189 0.5528 -0.7699 @@ -1508,11 +1510,10 @@ vn -0.3754 -0.1939 -0.9063 vn -0.1484 0.9217 -0.3583 vn -0.3539 -0.3805 -0.8544 vn -0.2142 0.8286 -0.5171 -vn -0.3189 -0.5528 -0.7699 +vn -0.0392 -0.9796 -0.1971 vn -0.1914 0.1939 -0.9622 vn -0.1951 0.0000 -0.9808 vn -0.0392 0.9796 -0.1971 -vn -0.0392 -0.9796 -0.1971 vn -0.1914 -0.1939 -0.9622 vn -0.0757 0.9217 -0.3804 vn -0.1804 -0.3805 -0.9070 @@ -1524,964 +1525,965 @@ vn -0.1626 0.5528 -0.8173 vn -0.1092 -0.8286 -0.5490 vn -0.1804 0.3805 -0.9070 vn -0.0757 -0.9217 -0.3804 +usemtl None s 1 -f 3/1/1 14/2/2 4/3/3 -f 9/4/4 21/5/5 22/6/6 -f 4/3/3 15/7/7 5/8/8 -f 9/4/4 23/9/9 10/10/10 -f 5/8/8 16/11/11 6/12/12 -f 10/10/10 24/13/13 480/14/14 -f 6/12/12 17/15/15 7/16/16 -f 480/14/14 25/17/17 481/18/18 -f 477/19/19 17/15/15 18/20/20 -f 1/21/21 326/22/22 11/23/23 -f 482/24/24 481/18/18 25/17/17 -f 477/19/19 19/25/25 478/26/26 -f 1/21/21 12/27/27 2/28/28 -f 478/26/26 20/29/29 479/30/30 -f 2/28/28 13/31/31 3/1/1 -f 479/30/30 21/5/5 8/32/32 -f 12/27/27 28/33/33 13/31/31 -f 20/29/29 36/34/34 21/5/5 -f 13/31/31 29/35/35 14/2/2 -f 21/5/5 37/36/36 22/6/6 -f 15/7/7 29/35/35 30/37/37 -f 22/6/6 38/38/38 23/9/9 -f 15/7/7 31/39/39 16/11/11 -f 23/9/9 39/40/40 24/13/13 -f 17/15/15 31/39/39 32/41/41 -f 24/13/13 40/42/42 25/17/17 -f 18/20/20 32/41/41 33/43/43 -f 11/23/23 326/44/22 26/45/44 -f 482/46/24 25/17/17 40/42/42 -f 18/20/20 34/47/45 19/25/25 -f 11/23/23 27/48/46 12/27/27 -f 19/25/25 35/49/47 20/29/29 -f 31/39/39 47/50/48 32/41/41 -f 39/40/40 55/51/49 40/42/42 -f 32/41/41 48/52/50 33/43/43 -f 26/45/44 326/53/22 41/54/51 -f 482/55/24 40/42/42 55/51/49 -f 33/43/43 49/56/52 34/47/45 -f 26/45/44 42/57/53 27/48/46 -f 34/47/45 50/58/54 35/49/47 -f 27/48/46 43/59/55 28/33/33 -f 36/34/34 50/58/54 51/60/56 -f 28/33/33 44/61/57 29/35/35 -f 36/34/34 52/62/58 37/36/36 -f 29/35/35 45/63/59 30/37/37 -f 37/36/36 53/64/60 38/38/38 -f 30/37/37 46/65/61 31/39/39 -f 38/38/38 54/66/62 39/40/40 -f 51/60/56 65/67/63 66/68/64 -f 43/59/55 59/69/65 44/61/57 -f 52/62/58 66/68/64 67/70/66 -f 44/61/57 60/71/67 45/63/59 -f 53/64/60 67/70/66 68/72/68 -f 45/63/59 61/73/69 46/65/61 -f 53/64/60 69/74/70 54/66/62 -f 46/65/61 62/75/71 47/50/48 -f 55/51/49 69/74/70 70/76/72 -f 48/52/50 62/75/71 63/77/73 -f 41/54/51 326/78/22 56/79/74 -f 482/80/24 55/51/49 70/76/72 -f 48/52/50 64/81/75 49/56/52 -f 41/54/51 57/82/76 42/57/53 -f 50/58/54 64/81/75 65/67/63 -f 43/59/55 57/82/76 58/83/77 -f 69/74/70 85/84/78 70/76/72 -f 63/77/73 77/85/79 78/86/80 -f 56/79/74 326/87/22 71/88/81 -f 482/89/24 70/76/72 85/84/78 -f 63/77/73 79/90/82 64/81/75 -f 57/82/76 71/88/81 72/91/83 -f 65/67/63 79/90/82 80/92/84 -f 57/82/76 73/93/85 58/83/77 -f 65/67/63 81/94/86 66/68/64 -f 58/83/77 74/95/87 59/69/65 -f 66/68/64 82/96/88 67/70/66 -f 60/71/67 74/95/87 75/97/89 -f 68/72/68 82/96/88 83/98/90 -f 60/71/67 76/99/91 61/73/69 -f 69/74/70 83/98/90 84/100/92 -f 61/73/69 77/85/79 62/75/71 -f 73/93/85 89/101/93 74/95/87 -f 81/94/86 97/102/94 82/96/88 -f 74/95/87 90/103/95 75/97/89 -f 83/98/90 97/102/94 98/104/96 -f 75/97/89 91/105/97 76/99/91 -f 84/100/92 98/104/96 99/106/98 -f 77/85/79 91/105/97 92/107/99 -f 85/84/78 99/106/98 100/108/100 -f 78/86/80 92/107/99 93/109/101 -f 71/88/81 326/110/22 86/111/102 -f 482/112/24 85/84/78 100/108/100 -f 78/86/80 94/113/103 79/90/82 -f 71/88/81 87/114/104 72/91/83 -f 79/90/82 95/115/105 80/92/84 -f 72/91/83 88/116/106 73/93/85 -f 80/92/84 96/117/107 81/94/86 -f 93/109/101 107/118/108 108/119/109 -f 86/111/102 326/120/22 101/121/110 -f 482/122/24 100/108/100 115/123/111 -f 93/109/101 109/124/112 94/113/103 -f 86/111/102 102/125/113 87/114/104 -f 95/115/105 109/124/112 110/126/114 -f 87/114/104 103/127/115 88/116/106 -f 95/115/105 111/128/116 96/117/107 -f 88/116/106 104/129/117 89/101/93 -f 96/117/107 112/130/118 97/102/94 -f 90/103/95 104/129/117 105/131/119 -f 98/104/96 112/130/118 113/132/120 -f 90/103/95 106/133/121 91/105/97 -f 99/106/98 113/132/120 114/134/122 -f 92/107/99 106/133/121 107/118/108 -f 99/106/98 115/123/111 100/108/100 -f 111/128/116 127/135/123 112/130/118 -f 105/131/119 119/136/124 120/137/125 -f 113/132/120 127/135/123 128/138/126 +f 479/1/1 21/2/2 8/3/3 +f 3/4/4 14/5/5 4/6/6 +f 9/7/7 21/2/2 22/8/8 +f 4/6/6 15/9/9 5/10/10 +f 9/7/7 23/11/11 10/12/12 +f 5/10/10 16/13/13 6/14/14 +f 10/12/12 24/15/15 480/16/16 +f 6/14/14 17/17/17 7/18/18 +f 480/16/16 25/19/19 481/20/20 +f 477/21/21 17/17/17 18/22/22 +f 1/23/23 326/24/24 11/25/25 +f 482/26/26 481/20/20 25/19/19 +f 477/21/21 19/27/27 478/28/28 +f 1/23/23 12/29/29 2/30/30 +f 478/28/28 20/31/31 479/1/1 +f 2/30/30 13/32/32 3/4/4 +f 19/27/27 35/33/33 20/31/31 +f 12/29/29 28/34/34 13/32/32 +f 20/31/31 36/35/35 21/2/2 +f 13/32/32 29/36/36 14/5/5 +f 21/2/2 37/37/37 22/8/8 +f 15/9/9 29/36/36 30/38/38 +f 22/8/8 38/39/39 23/11/11 +f 15/9/9 31/40/40 16/13/13 +f 23/11/11 39/41/41 24/15/15 +f 17/17/17 31/40/40 32/42/42 +f 24/15/15 40/43/43 25/19/19 +f 18/22/22 32/42/42 33/44/44 +f 11/25/25 326/45/24 26/46/45 +f 482/47/26 25/19/19 40/43/43 +f 18/22/22 34/48/46 19/27/27 +f 11/25/25 27/49/47 12/29/29 +f 38/39/39 54/50/48 39/41/41 +f 31/40/40 47/51/49 32/42/42 +f 39/41/41 55/52/50 40/43/43 +f 32/42/42 48/53/51 33/44/44 +f 26/46/45 326/54/24 41/55/52 +f 482/56/26 40/43/43 55/52/50 +f 33/44/44 49/57/53 34/48/46 +f 26/46/45 42/58/54 27/49/47 +f 34/48/46 50/59/55 35/33/33 +f 27/49/47 43/60/56 28/34/34 +f 36/35/35 50/59/55 51/61/57 +f 28/34/34 44/62/58 29/36/36 +f 36/35/35 52/63/59 37/37/37 +f 29/36/36 45/64/60 30/38/38 +f 37/37/37 53/65/61 38/39/39 +f 30/38/38 46/66/62 31/40/40 +f 43/60/56 57/67/63 58/68/64 +f 51/61/57 65/69/65 66/70/66 +f 43/60/56 59/71/67 44/62/58 +f 52/63/59 66/70/66 67/72/68 +f 44/62/58 60/73/69 45/64/60 +f 53/65/61 67/72/68 68/74/70 +f 45/64/60 61/75/71 46/66/62 +f 53/65/61 69/76/72 54/50/48 +f 46/66/62 62/77/73 47/51/49 +f 55/52/50 69/76/72 70/78/74 +f 48/53/51 62/77/73 63/79/75 +f 41/55/52 326/80/24 56/81/76 +f 482/82/26 55/52/50 70/78/74 +f 48/53/51 64/83/77 49/57/53 +f 41/55/52 57/67/63 42/58/54 +f 50/59/55 64/83/77 65/69/65 +f 61/75/71 77/84/78 62/77/73 +f 69/76/72 85/85/79 70/78/74 +f 63/79/75 77/84/78 78/86/80 +f 56/81/76 326/87/24 71/88/81 +f 482/89/26 70/78/74 85/85/79 +f 63/79/75 79/90/82 64/83/77 +f 57/67/63 71/88/81 72/91/83 +f 65/69/65 79/90/82 80/92/84 +f 57/67/63 73/93/85 58/68/64 +f 65/69/65 81/94/86 66/70/66 +f 58/68/64 74/95/87 59/71/67 +f 66/70/66 82/96/88 67/72/68 +f 60/73/69 74/95/87 75/97/89 +f 68/74/70 82/96/88 83/98/90 +f 60/73/69 76/99/91 61/75/71 +f 69/76/72 83/98/90 84/100/92 +f 80/92/84 96/101/93 81/94/86 +f 73/93/85 89/102/94 74/95/87 +f 81/94/86 97/103/95 82/96/88 +f 74/95/87 90/104/96 75/97/89 +f 83/98/90 97/103/95 98/105/97 +f 75/97/89 91/106/98 76/99/91 +f 84/100/92 98/105/97 99/107/99 +f 77/84/78 91/106/98 92/108/100 +f 85/85/79 99/107/99 100/109/101 +f 78/86/80 92/108/100 93/110/102 +f 71/88/81 326/111/24 86/112/103 +f 482/113/26 85/85/79 100/109/101 +f 78/86/80 94/114/104 79/90/82 +f 71/88/81 87/115/105 72/91/83 +f 79/90/82 95/116/106 80/92/84 +f 72/91/83 88/117/107 73/93/85 +f 99/107/99 115/118/108 100/109/101 +f 93/110/102 107/119/109 108/120/110 +f 86/112/103 326/121/24 101/122/111 +f 482/123/26 100/109/101 115/118/108 +f 93/110/102 109/124/112 94/114/104 +f 86/112/103 102/125/113 87/115/105 +f 95/116/106 109/124/112 110/126/114 +f 87/115/105 103/127/115 88/117/107 +f 95/116/106 111/128/116 96/101/93 +f 88/117/107 104/129/117 89/102/94 +f 96/101/93 112/130/118 97/103/95 +f 90/104/96 104/129/117 105/131/119 +f 98/105/97 112/130/118 113/132/120 +f 90/104/96 106/133/121 91/106/98 +f 99/107/99 113/132/120 114/134/122 +f 92/108/100 106/133/121 107/119/109 +f 103/127/115 119/135/123 104/129/117 +f 111/128/116 127/136/124 112/130/118 +f 105/131/119 119/135/123 120/137/125 +f 113/132/120 127/136/124 128/138/126 f 105/131/119 121/139/127 106/133/121 f 113/132/120 129/140/128 114/134/122 -f 107/118/108 121/139/127 122/141/129 -f 114/134/122 130/142/130 115/123/111 -f 108/119/109 122/141/129 123/143/131 -f 101/121/110 326/144/22 116/145/132 -f 482/146/24 115/123/111 130/142/130 -f 108/119/109 124/147/133 109/124/112 +f 107/119/109 121/139/127 122/141/129 +f 114/134/122 130/142/130 115/118/108 +f 108/120/110 122/141/129 123/143/131 +f 101/122/111 326/144/24 116/145/132 +f 482/146/26 115/118/108 130/142/130 +f 108/120/110 124/147/133 109/124/112 f 102/125/113 116/145/132 117/148/134 f 110/126/114 124/147/133 125/149/135 f 102/125/113 118/150/136 103/127/115 f 110/126/114 126/151/137 111/128/116 -f 103/127/115 119/136/124 104/129/117 -f 482/152/24 130/142/130 145/153/138 -f 123/143/131 139/154/139 124/147/133 -f 117/148/134 131/155/140 132/156/141 -f 125/149/135 139/154/139 140/157/142 -f 118/150/136 132/156/141 133/158/143 -f 125/149/135 141/159/144 126/151/137 -f 118/150/136 134/160/145 119/136/124 -f 126/151/137 142/161/146 127/135/123 -f 120/137/125 134/160/145 135/162/147 -f 128/138/126 142/161/146 143/163/148 -f 120/137/125 136/164/149 121/139/127 -f 128/138/126 144/165/150 129/140/128 -f 122/141/129 136/164/149 137/166/151 -f 129/140/128 145/153/138 130/142/130 -f 123/143/131 137/166/151 138/167/152 -f 116/145/132 326/168/22 131/155/140 -f 143/163/148 157/169/153 158/170/154 -f 135/162/147 151/171/155 136/164/149 -f 144/165/150 158/170/154 159/172/156 -f 137/166/151 151/171/155 152/173/157 -f 144/165/150 160/174/158 145/153/138 -f 138/167/152 152/173/157 153/175/159 -f 131/155/140 326/176/22 146/177/160 -f 482/178/24 145/153/138 160/174/158 -f 138/167/152 154/179/161 139/154/139 -f 131/155/140 147/180/162 132/156/141 -f 140/157/142 154/179/161 155/181/163 -f 133/158/143 147/180/162 148/182/164 -f 140/157/142 156/183/165 141/159/144 -f 133/158/143 149/184/166 134/160/145 -f 141/159/144 157/169/153 142/161/146 -f 134/160/145 150/185/167 135/162/147 -f 147/180/162 161/186/168 162/187/169 -f 155/181/163 169/188/170 170/189/171 -f 147/180/162 163/190/172 148/182/164 -f 155/181/163 171/191/173 156/183/165 -f 148/182/164 164/192/174 149/184/166 -f 156/183/165 172/193/175 157/169/153 -f 149/184/166 165/194/176 150/185/167 -f 158/170/154 172/193/175 173/195/177 -f 150/185/167 166/196/178 151/171/155 -f 158/170/154 174/197/179 159/172/156 -f 152/173/157 166/196/178 167/198/180 -f 160/174/158 174/197/179 175/199/181 -f 153/175/159 167/198/180 168/200/182 -f 146/177/160 326/201/22 161/186/168 -f 482/202/24 160/174/158 175/199/181 -f 153/175/159 169/188/170 154/179/161 -f 165/194/176 181/203/183 166/196/178 -f 173/195/177 189/204/184 174/197/179 -f 166/196/178 182/205/185 167/198/180 -f 174/197/179 190/206/186 175/199/181 -f 168/200/182 182/205/185 183/207/187 -f 161/186/168 326/208/22 176/209/188 -f 482/210/24 175/199/181 190/206/186 -f 168/200/182 184/211/189 169/188/170 -f 161/186/168 177/212/190 162/187/169 -f 169/188/170 185/213/191 170/189/171 -f 162/187/169 178/214/192 163/190/172 -f 170/189/171 186/215/193 171/191/173 -f 163/190/172 179/216/194 164/192/174 -f 172/193/175 186/215/193 187/217/195 -f 165/194/176 179/216/194 180/218/196 -f 172/193/175 188/219/197 173/195/177 -f 184/211/189 200/220/198 185/213/191 -f 177/212/190 193/221/199 178/214/192 -f 185/213/191 201/222/200 186/215/193 -f 178/214/192 194/223/201 179/216/194 -f 186/215/193 202/224/202 187/217/195 -f 180/218/196 194/223/201 195/225/203 -f 188/219/197 202/224/202 203/226/204 -f 180/218/196 196/227/205 181/203/183 -f 189/204/184 203/226/204 204/228/206 -f 182/205/185 196/227/205 197/229/207 -f 189/204/184 205/230/208 190/206/186 -f 183/207/187 197/229/207 198/231/209 -f 176/209/188 326/232/22 191/233/210 -f 482/234/24 190/206/186 205/230/208 -f 183/207/187 199/235/211 184/211/189 -f 177/212/190 191/233/210 192/236/212 -f 203/226/204 219/237/213 204/228/206 -f 197/229/207 211/238/214 212/239/215 -f 205/230/208 219/237/213 220/240/216 -f 198/231/209 212/239/215 213/241/217 -f 191/233/210 326/242/22 206/243/218 -f 482/244/24 205/230/208 220/240/216 -f 198/231/209 214/245/219 199/235/211 -f 191/233/210 207/246/220 192/236/212 -f 200/220/198 214/245/219 215/247/221 -f 192/236/212 208/248/222 193/221/199 -f 200/220/198 216/249/223 201/222/200 -f 193/221/199 209/250/224 194/223/201 -f 201/222/200 217/251/225 202/224/202 -f 195/225/203 209/250/224 210/252/226 -f 203/226/204 217/251/225 218/253/227 -f 195/225/203 211/238/214 196/227/205 -f 208/248/222 222/254/228 223/255/229 -f 215/247/221 231/256/230 216/249/223 -f 208/248/222 224/257/231 209/250/224 -f 216/249/223 232/258/232 217/251/225 -f 210/252/226 224/257/231 225/259/233 -f 218/253/227 232/258/232 233/260/234 -f 210/252/226 226/261/235 211/238/214 -f 218/253/227 234/262/236 219/237/213 -f 212/239/215 226/261/235 227/263/237 -f 220/240/216 234/262/236 235/264/238 -f 213/241/217 227/263/237 228/265/239 -f 206/243/218 326/266/22 221/267/240 -f 482/268/24 220/240/216 235/264/238 -f 213/241/217 229/269/241 214/245/219 -f 206/243/218 222/254/228 207/246/220 -f 215/247/221 229/269/241 230/270/242 -f 227/263/237 241/271/243 242/272/244 -f 235/264/238 249/273/245 250/274/246 -f 228/265/239 242/272/244 243/275/247 -f 221/267/240 326/276/22 236/277/248 -f 482/278/24 235/264/238 250/274/246 -f 228/265/239 244/279/249 229/269/241 -f 221/267/240 237/280/250 222/254/228 -f 230/270/242 244/279/249 245/281/251 -f 223/255/229 237/280/250 238/282/252 -f 230/270/242 246/283/253 231/256/230 -f 223/255/229 239/284/254 224/257/231 -f 231/256/230 247/285/255 232/258/232 -f 225/259/233 239/284/254 240/286/256 -f 233/260/234 247/285/255 248/287/257 -f 225/259/233 241/271/243 226/261/235 -f 233/260/234 249/273/245 234/262/236 -f 245/281/251 261/288/258 246/283/253 -f 238/282/252 254/289/259 239/284/254 -f 247/285/255 261/288/258 262/290/260 -f 240/286/256 254/289/259 255/291/261 -f 248/287/257 262/290/260 263/292/262 -f 240/286/256 256/293/263 241/271/243 -f 248/287/257 264/294/264 249/273/245 -f 242/272/244 256/293/263 257/295/265 -f 249/273/245 265/296/266 250/274/246 -f 243/275/247 257/295/265 258/297/267 -f 236/277/248 326/298/22 251/299/268 -f 482/300/24 250/274/246 265/296/266 -f 243/275/247 259/301/269 244/279/249 -f 236/277/248 252/302/270 237/280/250 -f 245/281/251 259/301/269 260/303/271 -f 237/280/250 253/304/272 238/282/252 -f 264/294/264 280/305/273 265/296/266 -f 258/297/267 272/306/274 273/307/275 -f 251/299/268 326/308/22 266/309/276 -f 482/310/24 265/296/266 280/305/273 -f 258/297/267 274/311/277 259/301/269 -f 251/299/268 267/312/278 252/302/270 -f 260/303/271 274/311/277 275/313/279 -f 252/302/270 268/314/280 253/304/272 -f 260/303/271 276/315/281 261/288/258 -f 253/304/272 269/316/282 254/289/259 -f 261/288/258 277/317/283 262/290/260 -f 255/291/261 269/316/282 270/318/284 -f 263/292/262 277/317/283 278/319/285 -f 255/291/261 271/320/286 256/293/263 -f 263/292/262 279/321/287 264/294/264 -f 257/295/265 271/320/286 272/306/274 -f 276/315/281 292/322/288 277/317/283 -f 270/318/284 284/323/289 285/324/290 -f 278/319/285 292/322/288 293/325/291 -f 271/320/286 285/324/290 286/326/292 -f 278/319/285 294/327/293 279/321/287 -f 272/306/274 286/326/292 287/328/294 -f 280/305/273 294/327/293 295/329/295 -f 273/307/275 287/328/294 288/330/296 -f 266/309/276 326/331/22 281/332/297 -f 482/333/24 280/305/273 295/329/295 -f 273/307/275 289/334/298 274/311/277 -f 266/309/276 282/335/299 267/312/278 -f 275/313/279 289/334/298 290/336/300 -f 267/312/278 283/337/301 268/314/280 -f 275/313/279 291/338/302 276/315/281 -f 268/314/280 284/323/289 269/316/282 -f 281/332/297 326/339/22 296/340/303 -f 482/341/24 295/329/295 310/342/304 -f 288/330/296 304/343/305 289/334/298 -f 281/332/297 297/344/306 282/335/299 -f 290/336/300 304/343/305 305/345/307 -f 282/335/299 298/346/308 283/337/301 -f 290/336/300 306/347/309 291/338/302 -f 283/337/301 299/348/310 284/323/289 -f 291/338/302 307/349/311 292/322/288 -f 284/323/289 300/350/312 285/324/290 -f 293/325/291 307/349/311 308/351/313 -f 286/326/292 300/350/312 301/352/314 -f 293/325/291 309/353/315 294/327/293 -f 287/328/294 301/352/314 302/354/316 -f 294/327/293 310/342/304 295/329/295 -f 288/330/296 302/354/316 303/355/317 -f 299/348/310 315/356/318 300/350/312 -f 308/351/313 322/357/319 323/358/320 -f 301/352/314 315/356/318 316/359/321 -f 309/353/315 323/358/320 324/360/322 -f 302/354/316 316/359/321 317/361/323 -f 309/353/315 325/362/324 310/342/304 -f 303/355/317 317/361/323 318/363/325 -f 296/340/303 326/364/22 311/365/326 -f 482/366/24 310/342/304 325/362/324 -f 303/355/317 319/367/327 304/343/305 -f 297/344/306 311/365/326 312/368/328 -f 305/345/307 319/367/327 320/369/329 -f 298/346/308 312/368/328 313/370/330 -f 305/345/307 321/371/331 306/347/309 -f 298/346/308 314/372/332 299/348/310 -f 306/347/309 322/357/319 307/349/311 -f 318/363/325 335/373/333 319/367/327 -f 311/365/326 328/374/334 312/368/328 -f 320/369/329 335/373/333 336/375/335 -f 312/368/328 329/376/336 313/370/330 -f 320/369/329 337/377/337 321/371/331 -f 313/370/330 330/378/338 314/372/332 -f 321/371/331 338/379/339 322/357/319 -f 314/372/332 331/380/340 315/356/318 -f 323/358/320 338/379/339 339/381/341 -f 316/359/321 331/380/340 332/382/342 -f 323/358/320 340/383/343 324/360/322 -f 317/361/323 332/382/342 333/384/344 -f 324/360/322 341/385/345 325/362/324 -f 318/363/325 333/384/344 334/386/346 -f 311/365/326 326/387/22 327/388/347 -f 482/389/24 325/362/324 341/385/345 -f 338/379/339 354/390/348 339/381/341 -f 332/382/342 346/391/349 347/392/350 -f 339/381/341 355/393/351 340/383/343 -f 333/384/344 347/392/350 348/394/352 -f 341/385/345 355/393/351 356/395/353 -f 334/386/346 348/394/352 349/396/354 -f 327/388/347 326/397/22 342/398/355 -f 482/399/24 341/385/345 356/395/353 -f 334/386/346 350/400/356 335/373/333 -f 327/388/347 343/401/357 328/374/334 -f 336/375/335 350/400/356 351/402/358 -f 328/374/334 344/403/359 329/376/336 -f 336/375/335 352/404/360 337/377/337 -f 329/376/336 345/405/361 330/378/338 -f 337/377/337 353/406/362 338/379/339 -f 330/378/338 346/391/349 331/380/340 -f 342/398/355 358/407/363 343/401/357 -f 351/402/358 365/408/364 366/409/365 +f 123/143/131 137/152/138 138/153/139 +f 116/145/132 326/154/24 131/155/140 +f 482/156/26 130/142/130 145/157/141 +f 123/143/131 139/158/142 124/147/133 +f 117/148/134 131/155/140 132/159/143 +f 125/149/135 139/158/142 140/160/144 +f 118/150/136 132/159/143 133/161/145 +f 125/149/135 141/162/146 126/151/137 +f 118/150/136 134/163/147 119/135/123 +f 126/151/137 142/164/148 127/136/124 +f 120/137/125 134/163/147 135/165/149 +f 128/138/126 142/164/148 143/166/150 +f 120/137/125 136/167/151 121/139/127 +f 128/138/126 144/168/152 129/140/128 +f 122/141/129 136/167/151 137/152/138 +f 129/140/128 145/157/141 130/142/130 +f 141/162/146 157/169/153 142/164/148 +f 134/163/147 150/170/154 135/165/149 +f 143/166/150 157/169/153 158/171/155 +f 135/165/149 151/172/156 136/167/151 +f 144/168/152 158/171/155 159/173/157 +f 137/152/138 151/172/156 152/174/158 +f 144/168/152 160/175/159 145/157/141 +f 138/153/139 152/174/158 153/176/160 +f 131/155/140 326/177/24 146/178/161 +f 482/179/26 145/157/141 160/175/159 +f 138/153/139 154/180/162 139/158/142 +f 131/155/140 147/181/163 132/159/143 +f 140/160/144 154/180/162 155/182/164 +f 133/161/145 147/181/163 148/183/165 +f 140/160/144 156/184/166 141/162/146 +f 133/161/145 149/185/167 134/163/147 +f 482/186/26 160/175/159 175/187/168 +f 153/176/160 169/188/169 154/180/162 +f 147/181/163 161/189/170 162/190/171 +f 155/182/164 169/188/169 170/191/172 +f 147/181/163 163/192/173 148/183/165 +f 155/182/164 171/193/174 156/184/166 +f 148/183/165 164/194/175 149/185/167 +f 156/184/166 172/195/176 157/169/153 +f 149/185/167 165/196/177 150/170/154 +f 158/171/155 172/195/176 173/197/178 +f 150/170/154 166/198/179 151/172/156 +f 158/171/155 174/199/180 159/173/157 +f 152/174/158 166/198/179 167/200/181 +f 160/175/159 174/199/180 175/187/168 +f 153/176/160 167/200/181 168/201/182 +f 146/178/161 326/202/24 161/189/170 +f 172/195/176 188/203/183 173/197/178 +f 165/196/177 181/204/184 166/198/179 +f 173/197/178 189/205/185 174/199/180 +f 166/198/179 182/206/186 167/200/181 +f 174/199/180 190/207/187 175/187/168 +f 168/201/182 182/206/186 183/208/188 +f 161/189/170 326/209/24 176/210/189 +f 482/211/26 175/187/168 190/207/187 +f 168/201/182 184/212/190 169/188/169 +f 161/189/170 177/213/191 162/190/171 +f 169/188/169 185/214/192 170/191/172 +f 162/190/171 178/215/193 163/192/173 +f 170/191/172 186/216/194 171/193/174 +f 163/192/173 179/217/195 164/194/175 +f 172/195/176 186/216/194 187/218/196 +f 165/196/177 179/217/195 180/219/197 +f 177/213/191 191/220/198 192/221/199 +f 184/212/190 200/222/200 185/214/192 +f 177/213/191 193/223/201 178/215/193 +f 185/214/192 201/224/202 186/216/194 +f 178/215/193 194/225/203 179/217/195 +f 186/216/194 202/226/204 187/218/196 +f 180/219/197 194/225/203 195/227/205 +f 188/203/183 202/226/204 203/228/206 +f 180/219/197 196/229/207 181/204/184 +f 189/205/185 203/228/206 204/230/208 +f 182/206/186 196/229/207 197/231/209 +f 189/205/185 205/232/210 190/207/187 +f 183/208/188 197/231/209 198/233/211 +f 176/210/189 326/234/24 191/220/198 +f 482/235/26 190/207/187 205/232/210 +f 183/208/188 199/236/212 184/212/190 +f 195/227/205 211/237/213 196/229/207 +f 203/228/206 219/238/214 204/230/208 +f 197/231/209 211/237/213 212/239/215 +f 205/232/210 219/238/214 220/240/216 +f 198/233/211 212/239/215 213/241/217 +f 191/220/198 326/242/24 206/243/218 +f 482/244/26 205/232/210 220/240/216 +f 198/233/211 214/245/219 199/236/212 +f 191/220/198 207/246/220 192/221/199 +f 200/222/200 214/245/219 215/247/221 +f 192/221/199 208/248/222 193/223/201 +f 200/222/200 216/249/223 201/224/202 +f 193/223/201 209/250/224 194/225/203 +f 201/224/202 217/251/225 202/226/204 +f 195/227/205 209/250/224 210/252/226 +f 203/228/206 217/251/225 218/253/227 +f 215/247/221 229/254/228 230/255/229 +f 208/248/222 222/256/230 223/257/231 +f 215/247/221 231/258/232 216/249/223 +f 208/248/222 224/259/233 209/250/224 +f 216/249/223 232/260/234 217/251/225 +f 210/252/226 224/259/233 225/261/235 +f 218/253/227 232/260/234 233/262/236 +f 210/252/226 226/263/237 211/237/213 +f 218/253/227 234/264/238 219/238/214 +f 212/239/215 226/263/237 227/265/239 +f 220/240/216 234/264/238 235/266/240 +f 213/241/217 227/265/239 228/267/241 +f 206/243/218 326/268/24 221/269/242 +f 482/270/26 220/240/216 235/266/240 +f 213/241/217 229/254/228 214/245/219 +f 206/243/218 222/256/230 207/246/220 +f 233/262/236 249/271/243 234/264/238 +f 227/265/239 241/272/244 242/273/245 +f 235/266/240 249/271/243 250/274/246 +f 228/267/241 242/273/245 243/275/247 +f 221/269/242 326/276/24 236/277/248 +f 482/278/26 235/266/240 250/274/246 +f 228/267/241 244/279/249 229/254/228 +f 221/269/242 237/280/250 222/256/230 +f 230/255/229 244/279/249 245/281/251 +f 223/257/231 237/280/250 238/282/252 +f 230/255/229 246/283/253 231/258/232 +f 223/257/231 239/284/254 224/259/233 +f 231/258/232 247/285/255 232/260/234 +f 225/261/235 239/284/254 240/286/256 +f 233/262/236 247/285/255 248/287/257 +f 225/261/235 241/272/244 226/263/237 +f 237/280/250 253/288/258 238/282/252 +f 245/281/251 261/289/259 246/283/253 +f 238/282/252 254/290/260 239/284/254 +f 247/285/255 261/289/259 262/291/261 +f 240/286/256 254/290/260 255/292/262 +f 248/287/257 262/291/261 263/293/263 +f 240/286/256 256/294/264 241/272/244 +f 248/287/257 264/295/265 249/271/243 +f 242/273/245 256/294/264 257/296/266 +f 249/271/243 265/297/267 250/274/246 +f 243/275/247 257/296/266 258/298/268 +f 236/277/248 326/299/24 251/300/269 +f 482/301/26 250/274/246 265/297/267 +f 243/275/247 259/302/270 244/279/249 +f 236/277/248 252/303/271 237/280/250 +f 245/281/251 259/302/270 260/304/272 +f 257/296/266 271/305/273 272/306/274 +f 264/295/265 280/307/275 265/297/267 +f 258/298/268 272/306/274 273/308/276 +f 251/300/269 326/309/24 266/310/277 +f 482/311/26 265/297/267 280/307/275 +f 258/298/268 274/312/278 259/302/270 +f 251/300/269 267/313/279 252/303/271 +f 260/304/272 274/312/278 275/314/280 +f 252/303/271 268/315/281 253/288/258 +f 260/304/272 276/316/282 261/289/259 +f 253/288/258 269/317/283 254/290/260 +f 261/289/259 277/318/284 262/291/261 +f 255/292/262 269/317/283 270/319/285 +f 263/293/263 277/318/284 278/320/286 +f 255/292/262 271/305/273 256/294/264 +f 263/293/263 279/321/287 264/295/265 +f 275/314/280 291/322/288 276/316/282 +f 268/315/281 284/323/289 269/317/283 +f 276/316/282 292/324/290 277/318/284 +f 270/319/285 284/323/289 285/325/291 +f 278/320/286 292/324/290 293/326/292 +f 271/305/273 285/325/291 286/327/293 +f 278/320/286 294/328/294 279/321/287 +f 272/306/274 286/327/293 287/329/295 +f 280/307/275 294/328/294 295/330/296 +f 273/308/276 287/329/295 288/331/297 +f 266/310/277 326/332/24 281/333/298 +f 482/334/26 280/307/275 295/330/296 +f 273/308/276 289/335/299 274/312/278 +f 266/310/277 282/336/300 267/313/279 +f 275/314/280 289/335/299 290/337/301 +f 267/313/279 283/338/302 268/315/281 +f 294/328/294 310/339/303 295/330/296 +f 288/331/297 302/340/304 303/341/305 +f 281/333/298 326/342/24 296/343/306 +f 482/344/26 295/330/296 310/339/303 +f 288/331/297 304/345/307 289/335/299 +f 281/333/298 297/346/308 282/336/300 +f 290/337/301 304/345/307 305/347/309 +f 282/336/300 298/348/310 283/338/302 +f 290/337/301 306/349/311 291/322/288 +f 283/338/302 299/350/312 284/323/289 +f 291/322/288 307/351/313 292/324/290 +f 284/323/289 300/352/314 285/325/291 +f 293/326/292 307/351/313 308/353/315 +f 286/327/293 300/352/314 301/354/316 +f 293/326/292 309/355/317 294/328/294 +f 287/329/295 301/354/316 302/340/304 +f 306/349/311 322/356/318 307/351/313 +f 299/350/312 315/357/319 300/352/314 +f 308/353/315 322/356/318 323/358/320 +f 301/354/316 315/357/319 316/359/321 +f 309/355/317 323/358/320 324/360/322 +f 302/340/304 316/359/321 317/361/323 +f 309/355/317 325/362/324 310/339/303 +f 303/341/305 317/361/323 318/363/325 +f 296/343/306 326/364/24 311/365/326 +f 482/366/26 310/339/303 325/362/324 +f 303/341/305 319/367/327 304/345/307 +f 297/346/308 311/365/326 312/368/328 +f 305/347/309 319/367/327 320/369/329 +f 298/348/310 312/368/328 313/370/330 +f 305/347/309 321/371/331 306/349/311 +f 298/348/310 314/372/332 299/350/312 +f 311/365/326 326/373/24 327/374/333 +f 482/375/26 325/362/324 341/376/334 +f 318/363/325 335/377/335 319/367/327 +f 311/365/326 328/378/336 312/368/328 +f 320/369/329 335/377/335 336/379/337 +f 312/368/328 329/380/338 313/370/330 +f 320/369/329 337/381/339 321/371/331 +f 313/370/330 330/382/340 314/372/332 +f 321/371/331 338/383/341 322/356/318 +f 314/372/332 331/384/342 315/357/319 +f 323/358/320 338/383/341 339/385/343 +f 316/359/321 331/384/342 332/386/344 +f 323/358/320 340/387/345 324/360/322 +f 317/361/323 332/386/344 333/388/346 +f 324/360/322 341/376/334 325/362/324 +f 318/363/325 333/388/346 334/389/347 +f 330/382/340 346/390/348 331/384/342 +f 338/383/341 354/391/349 339/385/343 +f 332/386/344 346/390/348 347/392/350 +f 339/385/343 355/393/351 340/387/345 +f 333/388/346 347/392/350 348/394/352 +f 341/376/334 355/393/351 356/395/353 +f 334/389/347 348/394/352 349/396/354 +f 327/374/333 326/397/24 342/398/355 +f 482/399/26 341/376/334 356/395/353 +f 334/389/347 350/400/356 335/377/335 +f 327/374/333 343/401/357 328/378/336 +f 336/379/337 350/400/356 351/402/358 +f 328/378/336 344/403/359 329/380/338 +f 336/379/337 352/404/360 337/381/339 +f 329/380/338 345/405/361 330/382/340 +f 337/381/339 353/406/362 338/383/341 +f 349/396/354 365/407/363 350/400/356 +f 342/398/355 358/408/364 343/401/357 +f 351/402/358 365/407/363 366/409/365 f 343/401/357 359/410/366 344/403/359 f 351/402/358 367/411/367 352/404/360 f 344/403/359 360/412/368 345/405/361 f 352/404/360 368/413/369 353/406/362 -f 346/391/349 360/412/368 361/414/370 -f 354/390/348 368/413/369 369/415/371 +f 346/390/348 360/412/368 361/414/370 +f 354/391/349 368/413/369 369/415/371 f 347/392/350 361/414/370 362/416/372 f 355/393/351 369/415/371 370/417/373 f 348/394/352 362/416/372 363/418/374 f 356/395/353 370/417/373 371/419/375 f 349/396/354 363/418/374 364/420/376 -f 342/398/355 326/421/22 357/422/377 -f 482/423/24 356/395/353 371/419/375 -f 349/396/354 365/408/364 350/400/356 -f 362/424/372 376/425/378 377/426/379 -f 370/427/373 384/428/380 385/429/381 -f 363/430/374 377/426/379 378/431/382 -f 371/432/375 385/429/381 386/433/383 -f 364/434/376 378/431/382 379/435/384 -f 357/436/377 326/437/22 372/438/385 -f 482/439/24 371/432/375 386/433/383 -f 364/434/376 380/440/386 365/441/364 -f 357/436/377 373/442/387 358/443/363 -f 366/444/365 380/440/386 381/445/388 -f 358/443/363 374/446/389 359/447/366 -f 366/444/365 382/448/390 367/449/367 -f 359/447/366 375/450/391 360/451/368 -f 368/452/369 382/448/390 383/453/392 -f 360/451/368 376/425/378 361/454/370 -f 369/455/371 383/453/392 384/428/380 -f 381/445/388 395/456/393 396/457/394 -f 373/442/387 389/458/395 374/446/389 -f 381/445/388 397/459/396 382/448/390 -f 374/446/389 390/460/397 375/450/391 -f 382/448/390 398/461/398 383/453/392 -f 375/450/391 391/462/399 376/425/378 -f 384/428/380 398/461/398 399/463/400 -f 377/426/379 391/462/399 392/464/401 -f 384/428/380 400/465/402 385/429/381 -f 378/431/382 392/464/401 393/466/403 -f 385/429/381 401/467/404 386/433/383 -f 379/435/384 393/466/403 394/468/405 -f 372/438/385 326/469/22 387/470/406 -f 482/471/24 386/433/383 401/467/404 -f 379/435/384 395/456/393 380/440/386 -f 372/438/385 388/472/407 373/442/387 -f 400/465/402 414/473/408 415/474/409 -f 393/466/403 407/475/410 408/476/411 -f 400/465/402 416/477/412 401/467/404 -f 394/468/405 408/476/411 409/478/413 -f 387/470/406 326/479/22 402/480/414 -f 482/481/24 401/467/404 416/477/412 -f 394/468/405 410/482/415 395/456/393 -f 387/470/406 403/483/416 388/472/407 -f 396/457/394 410/482/415 411/484/417 -f 388/472/407 404/485/418 389/458/395 -f 396/457/394 412/486/419 397/459/396 -f 389/458/395 405/487/420 390/460/397 -f 397/459/396 413/488/421 398/461/398 -f 391/462/399 405/487/420 406/489/422 -f 399/463/400 413/488/421 414/473/408 -f 392/464/401 406/489/422 407/475/410 -f 411/484/417 427/490/423 412/486/419 -f 404/485/418 420/491/424 405/487/420 -f 412/486/419 428/492/425 413/488/421 -f 405/487/420 421/493/426 406/489/422 -f 414/473/408 428/492/425 429/494/427 -f 407/475/410 421/493/426 422/495/428 -f 414/473/408 430/496/429 415/474/409 -f 408/476/411 422/495/428 423/497/430 -f 416/477/412 430/496/429 431/498/431 -f 409/478/413 423/497/430 424/499/432 -f 402/480/414 326/500/22 417/501/433 -f 482/502/24 416/477/412 431/498/431 -f 409/478/413 425/503/434 410/482/415 -f 402/480/414 418/504/435 403/483/416 -f 410/482/415 426/505/436 411/484/417 -f 403/483/416 419/506/437 404/485/418 -f 431/498/431 445/507/438 446/508/439 -f 424/499/432 438/509/440 439/510/441 -f 417/501/433 326/511/22 432/512/442 -f 482/513/24 431/498/431 446/508/439 -f 424/499/432 440/514/443 425/503/434 -f 417/501/433 433/515/444 418/504/435 -f 425/503/434 441/516/445 426/505/436 -f 419/506/437 433/515/444 434/517/446 -f 426/505/436 442/518/447 427/490/423 -f 419/506/437 435/519/448 420/491/424 -f 427/490/423 443/520/449 428/492/425 -f 420/491/424 436/521/450 421/493/426 -f 429/494/427 443/520/449 444/522/451 -f 422/495/428 436/521/450 437/523/452 -f 429/494/427 445/507/438 430/496/429 -f 423/497/430 437/523/452 438/509/440 -f 434/517/446 450/524/453 435/519/448 -f 442/518/447 458/525/454 443/520/449 -f 436/521/450 450/524/453 451/526/455 -f 444/522/451 458/525/454 459/527/456 -f 437/523/452 451/526/455 452/528/457 -f 444/522/451 460/529/458 445/507/438 -f 438/509/440 452/528/457 453/530/459 -f 445/507/438 461/531/460 446/508/439 -f 439/510/441 453/530/459 454/532/461 -f 432/512/442 326/533/22 447/534/462 -f 482/535/24 446/508/439 461/531/460 -f 439/510/441 455/536/463 440/514/443 -f 432/512/442 448/537/464 433/515/444 -f 440/514/443 456/538/465 441/516/445 -f 433/515/444 449/539/466 434/517/446 -f 441/516/445 457/540/467 442/518/447 -f 454/532/461 468/541/468 469/542/469 -f 447/534/462 326/543/22 462/544/470 -f 482/545/24 461/531/460 476/546/471 -f 454/532/461 470/547/472 455/536/463 -f 447/534/462 463/548/473 448/537/464 -f 455/536/463 471/549/474 456/538/465 -f 448/537/464 464/550/475 449/539/466 -f 456/538/465 472/551/476 457/540/467 -f 449/539/466 465/552/477 450/524/453 -f 457/540/467 473/553/478 458/525/454 -f 450/524/453 466/554/479 451/526/455 -f 459/527/456 473/553/478 474/555/480 -f 452/528/457 466/554/479 467/556/481 -f 459/527/456 475/557/482 460/529/458 -f 453/530/459 467/556/481 468/541/468 -f 460/529/458 476/546/471 461/531/460 -f 472/551/476 9/4/4 473/553/478 -f 466/554/479 4/3/3 5/8/8 -f 473/553/478 10/10/10 474/555/480 -f 467/556/481 5/8/8 6/12/12 -f 474/555/480 480/14/14 475/557/482 -f 468/541/468 6/12/12 7/16/16 -f 475/557/482 481/18/18 476/546/471 -f 469/542/469 7/16/16 477/19/19 -f 462/544/470 326/558/22 1/21/21 -f 482/559/24 476/546/471 481/18/18 -f 469/542/469 478/26/26 470/547/472 -f 463/548/473 1/21/21 2/28/28 -f 470/547/472 479/30/30 471/549/474 -f 464/550/475 2/28/28 3/1/1 -f 471/549/474 8/32/32 472/551/476 -f 465/552/477 3/1/1 4/3/3 -f 3/1/1 13/31/31 14/2/2 -f 9/4/4 8/32/32 21/5/5 -f 4/3/3 14/2/2 15/7/7 -f 9/4/4 22/6/6 23/9/9 -f 5/8/8 15/7/7 16/11/11 -f 10/10/10 23/9/9 24/13/13 -f 6/12/12 16/11/11 17/15/15 -f 480/14/14 24/13/13 25/17/17 -f 477/19/19 7/16/16 17/15/15 -f 477/19/19 18/20/20 19/25/25 -f 1/21/21 11/23/23 12/27/27 -f 478/26/26 19/25/25 20/29/29 -f 2/28/28 12/27/27 13/31/31 -f 479/30/30 20/29/29 21/5/5 -f 12/27/27 27/48/46 28/33/33 -f 20/29/29 35/49/47 36/34/34 -f 13/31/31 28/33/33 29/35/35 -f 21/5/5 36/34/34 37/36/36 -f 15/7/7 14/2/2 29/35/35 -f 22/6/6 37/36/36 38/38/38 -f 15/7/7 30/37/37 31/39/39 -f 23/9/9 38/38/38 39/40/40 -f 17/15/15 16/11/11 31/39/39 -f 24/13/13 39/40/40 40/42/42 -f 18/20/20 17/15/15 32/41/41 -f 18/20/20 33/43/43 34/47/45 -f 11/23/23 26/45/44 27/48/46 -f 19/25/25 34/47/45 35/49/47 -f 31/39/39 46/65/61 47/50/48 -f 39/40/40 54/66/62 55/51/49 -f 32/41/41 47/50/48 48/52/50 -f 33/43/43 48/52/50 49/56/52 -f 26/45/44 41/54/51 42/57/53 -f 34/47/45 49/56/52 50/58/54 -f 27/48/46 42/57/53 43/59/55 -f 36/34/34 35/49/47 50/58/54 -f 28/33/33 43/59/55 44/61/57 -f 36/34/34 51/60/56 52/62/58 -f 29/35/35 44/61/57 45/63/59 -f 37/36/36 52/62/58 53/64/60 -f 30/37/37 45/63/59 46/65/61 -f 38/38/38 53/64/60 54/66/62 -f 51/60/56 50/58/54 65/67/63 -f 43/59/55 58/83/77 59/69/65 -f 52/62/58 51/60/56 66/68/64 -f 44/61/57 59/69/65 60/71/67 -f 53/64/60 52/62/58 67/70/66 -f 45/63/59 60/71/67 61/73/69 -f 53/64/60 68/72/68 69/74/70 -f 46/65/61 61/73/69 62/75/71 -f 55/51/49 54/66/62 69/74/70 -f 48/52/50 47/50/48 62/75/71 -f 48/52/50 63/77/73 64/81/75 -f 41/54/51 56/79/74 57/82/76 -f 50/58/54 49/56/52 64/81/75 -f 43/59/55 42/57/53 57/82/76 -f 69/74/70 84/100/92 85/84/78 -f 63/77/73 62/75/71 77/85/79 -f 63/77/73 78/86/80 79/90/82 -f 57/82/76 56/79/74 71/88/81 -f 65/67/63 64/81/75 79/90/82 -f 57/82/76 72/91/83 73/93/85 -f 65/67/63 80/92/84 81/94/86 -f 58/83/77 73/93/85 74/95/87 -f 66/68/64 81/94/86 82/96/88 -f 60/71/67 59/69/65 74/95/87 -f 68/72/68 67/70/66 82/96/88 -f 60/71/67 75/97/89 76/99/91 -f 69/74/70 68/72/68 83/98/90 -f 61/73/69 76/99/91 77/85/79 -f 73/93/85 88/116/106 89/101/93 -f 81/94/86 96/117/107 97/102/94 -f 74/95/87 89/101/93 90/103/95 -f 83/98/90 82/96/88 97/102/94 -f 75/97/89 90/103/95 91/105/97 -f 84/100/92 83/98/90 98/104/96 -f 77/85/79 76/99/91 91/105/97 -f 85/84/78 84/100/92 99/106/98 -f 78/86/80 77/85/79 92/107/99 -f 78/86/80 93/109/101 94/113/103 -f 71/88/81 86/111/102 87/114/104 -f 79/90/82 94/113/103 95/115/105 -f 72/91/83 87/114/104 88/116/106 -f 80/92/84 95/115/105 96/117/107 -f 93/109/101 92/107/99 107/118/108 -f 93/109/101 108/119/109 109/124/112 -f 86/111/102 101/121/110 102/125/113 -f 95/115/105 94/113/103 109/124/112 -f 87/114/104 102/125/113 103/127/115 -f 95/115/105 110/126/114 111/128/116 -f 88/116/106 103/127/115 104/129/117 -f 96/117/107 111/128/116 112/130/118 -f 90/103/95 89/101/93 104/129/117 -f 98/104/96 97/102/94 112/130/118 -f 90/103/95 105/131/119 106/133/121 -f 99/106/98 98/104/96 113/132/120 -f 92/107/99 91/105/97 106/133/121 -f 99/106/98 114/134/122 115/123/111 -f 111/128/116 126/151/137 127/135/123 -f 105/131/119 104/129/117 119/136/124 -f 113/132/120 112/130/118 127/135/123 +f 342/398/355 326/421/24 357/422/377 +f 482/423/26 356/395/353 371/419/375 +f 369/424/371 383/425/378 384/426/379 +f 362/427/372 376/428/380 377/429/381 +f 370/430/373 384/426/379 385/431/382 +f 363/432/374 377/429/381 378/433/383 +f 371/434/375 385/431/382 386/435/384 +f 364/436/376 378/433/383 379/437/385 +f 357/438/377 326/439/24 372/440/386 +f 482/441/26 371/434/375 386/435/384 +f 364/436/376 380/442/387 365/443/363 +f 357/438/377 373/444/388 358/445/364 +f 366/446/365 380/442/387 381/447/389 +f 358/445/364 374/448/390 359/449/366 +f 366/446/365 382/450/391 367/451/367 +f 359/449/366 375/452/392 360/453/368 +f 368/454/369 382/450/391 383/425/378 +f 360/453/368 376/428/380 361/455/370 +f 372/440/386 388/456/393 373/444/388 +f 381/447/389 395/457/394 396/458/395 +f 373/444/388 389/459/396 374/448/390 +f 381/447/389 397/460/397 382/450/391 +f 374/448/390 390/461/398 375/452/392 +f 382/450/391 398/462/399 383/425/378 +f 375/452/392 391/463/400 376/428/380 +f 384/426/379 398/462/399 399/464/401 +f 377/429/381 391/463/400 392/465/402 +f 384/426/379 400/466/403 385/431/382 +f 378/433/383 392/465/402 393/467/404 +f 385/431/382 401/468/405 386/435/384 +f 379/437/385 393/467/404 394/469/406 +f 372/440/386 326/470/24 387/471/407 +f 482/472/26 386/435/384 401/468/405 +f 379/437/385 395/457/394 380/442/387 +f 392/465/402 406/473/408 407/474/409 +f 400/466/403 414/475/410 415/476/411 +f 393/467/404 407/474/409 408/477/412 +f 400/466/403 416/478/413 401/468/405 +f 394/469/406 408/477/412 409/479/414 +f 387/471/407 326/480/24 402/481/415 +f 482/482/26 401/468/405 416/478/413 +f 394/469/406 410/483/416 395/457/394 +f 387/471/407 403/484/417 388/456/393 +f 396/458/395 410/483/416 411/485/418 +f 388/456/393 404/486/419 389/459/396 +f 396/458/395 412/487/420 397/460/397 +f 389/459/396 405/488/421 390/461/398 +f 397/460/397 413/489/422 398/462/399 +f 391/463/400 405/488/421 406/473/408 +f 399/464/401 413/489/422 414/475/410 +f 410/483/416 426/490/423 411/485/418 +f 403/484/417 419/491/424 404/486/419 +f 411/485/418 427/492/425 412/487/420 +f 404/486/419 420/493/426 405/488/421 +f 412/487/420 428/494/427 413/489/422 +f 405/488/421 421/495/428 406/473/408 +f 414/475/410 428/494/427 429/496/429 +f 407/474/409 421/495/428 422/497/430 +f 414/475/410 430/498/431 415/476/411 +f 408/477/412 422/497/430 423/499/432 +f 416/478/413 430/498/431 431/500/433 +f 409/479/414 423/499/432 424/501/434 +f 402/481/415 326/502/24 417/503/435 +f 482/504/26 416/478/413 431/500/433 +f 409/479/414 425/505/436 410/483/416 +f 402/481/415 418/506/437 403/484/417 +f 429/496/429 445/507/438 430/498/431 +f 423/499/432 437/508/439 438/509/440 +f 431/500/433 445/507/438 446/510/441 +f 424/501/434 438/509/440 439/511/442 +f 417/503/435 326/512/24 432/513/443 +f 482/514/26 431/500/433 446/510/441 +f 424/501/434 440/515/444 425/505/436 +f 417/503/435 433/516/445 418/506/437 +f 425/505/436 441/517/446 426/490/423 +f 419/491/424 433/516/445 434/518/447 +f 426/490/423 442/519/448 427/492/425 +f 419/491/424 435/520/449 420/493/426 +f 427/492/425 443/521/450 428/494/427 +f 420/493/426 436/522/451 421/495/428 +f 429/496/429 443/521/450 444/523/452 +f 422/497/430 436/522/451 437/508/439 +f 441/517/446 457/524/453 442/519/448 +f 434/518/447 450/525/454 435/520/449 +f 442/519/448 458/526/455 443/521/450 +f 436/522/451 450/525/454 451/527/456 +f 444/523/452 458/526/455 459/528/457 +f 437/508/439 451/527/456 452/529/458 +f 444/523/452 460/530/459 445/507/438 +f 438/509/440 452/529/458 453/531/460 +f 445/507/438 461/532/461 446/510/441 +f 439/511/442 453/531/460 454/533/462 +f 432/513/443 326/534/24 447/535/463 +f 482/536/26 446/510/441 461/532/461 +f 439/511/442 455/537/464 440/515/444 +f 432/513/443 448/538/465 433/516/445 +f 440/515/444 456/539/466 441/517/446 +f 433/516/445 449/540/467 434/518/447 +f 460/530/459 476/541/468 461/532/461 +f 454/533/462 468/542/469 469/543/470 +f 447/535/463 326/544/24 462/545/471 +f 482/546/26 461/532/461 476/541/468 +f 454/533/462 470/547/472 455/537/464 +f 447/535/463 463/548/473 448/538/465 +f 455/537/464 471/549/474 456/539/466 +f 448/538/465 464/550/475 449/540/467 +f 456/539/466 472/551/476 457/524/453 +f 449/540/467 465/552/477 450/525/454 +f 457/524/453 473/553/478 458/526/455 +f 450/525/454 466/554/479 451/527/456 +f 459/528/457 473/553/478 474/555/480 +f 452/529/458 466/554/479 467/556/481 +f 459/528/457 475/557/482 460/530/459 +f 453/531/460 467/556/481 468/542/469 +f 465/552/477 3/4/4 4/6/6 +f 472/551/476 9/7/7 473/553/478 +f 466/554/479 4/6/6 5/10/10 +f 473/553/478 10/12/12 474/555/480 +f 467/556/481 5/10/10 6/14/14 +f 474/555/480 480/16/16 475/557/482 +f 468/542/469 6/14/14 7/18/18 +f 475/557/482 481/20/20 476/541/468 +f 469/543/470 7/18/18 477/21/21 +f 462/545/471 326/558/24 1/23/23 +f 482/559/26 476/541/468 481/20/20 +f 469/543/470 478/28/28 470/547/472 +f 463/548/473 1/23/23 2/30/30 +f 470/547/472 479/1/1 471/549/474 +f 464/550/475 2/30/30 3/4/4 +f 471/549/474 8/3/3 472/551/476 +f 479/1/1 20/31/31 21/2/2 +f 3/4/4 13/32/32 14/5/5 +f 9/7/7 8/3/3 21/2/2 +f 4/6/6 14/5/5 15/9/9 +f 9/7/7 22/8/8 23/11/11 +f 5/10/10 15/9/9 16/13/13 +f 10/12/12 23/11/11 24/15/15 +f 6/14/14 16/13/13 17/17/17 +f 480/16/16 24/15/15 25/19/19 +f 477/21/21 7/18/18 17/17/17 +f 477/21/21 18/22/22 19/27/27 +f 1/23/23 11/25/25 12/29/29 +f 478/28/28 19/27/27 20/31/31 +f 2/30/30 12/29/29 13/32/32 +f 19/27/27 34/48/46 35/33/33 +f 12/29/29 27/49/47 28/34/34 +f 20/31/31 35/33/33 36/35/35 +f 13/32/32 28/34/34 29/36/36 +f 21/2/2 36/35/35 37/37/37 +f 15/9/9 14/5/5 29/36/36 +f 22/8/8 37/37/37 38/39/39 +f 15/9/9 30/38/38 31/40/40 +f 23/11/11 38/39/39 39/41/41 +f 17/17/17 16/13/13 31/40/40 +f 24/15/15 39/41/41 40/43/43 +f 18/22/22 17/17/17 32/42/42 +f 18/22/22 33/44/44 34/48/46 +f 11/25/25 26/46/45 27/49/47 +f 38/39/39 53/65/61 54/50/48 +f 31/40/40 46/66/62 47/51/49 +f 39/41/41 54/50/48 55/52/50 +f 32/42/42 47/51/49 48/53/51 +f 33/44/44 48/53/51 49/57/53 +f 26/46/45 41/55/52 42/58/54 +f 34/48/46 49/57/53 50/59/55 +f 27/49/47 42/58/54 43/60/56 +f 36/35/35 35/33/33 50/59/55 +f 28/34/34 43/60/56 44/62/58 +f 36/35/35 51/61/57 52/63/59 +f 29/36/36 44/62/58 45/64/60 +f 37/37/37 52/63/59 53/65/61 +f 30/38/38 45/64/60 46/66/62 +f 43/60/56 42/58/54 57/67/63 +f 51/61/57 50/59/55 65/69/65 +f 43/60/56 58/68/64 59/71/67 +f 52/63/59 51/61/57 66/70/66 +f 44/62/58 59/71/67 60/73/69 +f 53/65/61 52/63/59 67/72/68 +f 45/64/60 60/73/69 61/75/71 +f 53/65/61 68/74/70 69/76/72 +f 46/66/62 61/75/71 62/77/73 +f 55/52/50 54/50/48 69/76/72 +f 48/53/51 47/51/49 62/77/73 +f 48/53/51 63/79/75 64/83/77 +f 41/55/52 56/81/76 57/67/63 +f 50/59/55 49/57/53 64/83/77 +f 61/75/71 76/99/91 77/84/78 +f 69/76/72 84/100/92 85/85/79 +f 63/79/75 62/77/73 77/84/78 +f 63/79/75 78/86/80 79/90/82 +f 57/67/63 56/81/76 71/88/81 +f 65/69/65 64/83/77 79/90/82 +f 57/67/63 72/91/83 73/93/85 +f 65/69/65 80/92/84 81/94/86 +f 58/68/64 73/93/85 74/95/87 +f 66/70/66 81/94/86 82/96/88 +f 60/73/69 59/71/67 74/95/87 +f 68/74/70 67/72/68 82/96/88 +f 60/73/69 75/97/89 76/99/91 +f 69/76/72 68/74/70 83/98/90 +f 80/92/84 95/116/106 96/101/93 +f 73/93/85 88/117/107 89/102/94 +f 81/94/86 96/101/93 97/103/95 +f 74/95/87 89/102/94 90/104/96 +f 83/98/90 82/96/88 97/103/95 +f 75/97/89 90/104/96 91/106/98 +f 84/100/92 83/98/90 98/105/97 +f 77/84/78 76/99/91 91/106/98 +f 85/85/79 84/100/92 99/107/99 +f 78/86/80 77/84/78 92/108/100 +f 78/86/80 93/110/102 94/114/104 +f 71/88/81 86/112/103 87/115/105 +f 79/90/82 94/114/104 95/116/106 +f 72/91/83 87/115/105 88/117/107 +f 99/107/99 114/134/122 115/118/108 +f 93/110/102 92/108/100 107/119/109 +f 93/110/102 108/120/110 109/124/112 +f 86/112/103 101/122/111 102/125/113 +f 95/116/106 94/114/104 109/124/112 +f 87/115/105 102/125/113 103/127/115 +f 95/116/106 110/126/114 111/128/116 +f 88/117/107 103/127/115 104/129/117 +f 96/101/93 111/128/116 112/130/118 +f 90/104/96 89/102/94 104/129/117 +f 98/105/97 97/103/95 112/130/118 +f 90/104/96 105/131/119 106/133/121 +f 99/107/99 98/105/97 113/132/120 +f 92/108/100 91/106/98 106/133/121 +f 103/127/115 118/150/136 119/135/123 +f 111/128/116 126/151/137 127/136/124 +f 105/131/119 104/129/117 119/135/123 +f 113/132/120 112/130/118 127/136/124 f 105/131/119 120/137/125 121/139/127 f 113/132/120 128/138/126 129/140/128 -f 107/118/108 106/133/121 121/139/127 +f 107/119/109 106/133/121 121/139/127 f 114/134/122 129/140/128 130/142/130 -f 108/119/109 107/118/108 122/141/129 -f 108/119/109 123/143/131 124/147/133 -f 102/125/113 101/121/110 116/145/132 +f 108/120/110 107/119/109 122/141/129 +f 108/120/110 123/143/131 124/147/133 +f 102/125/113 101/122/111 116/145/132 f 110/126/114 109/124/112 124/147/133 f 102/125/113 117/148/134 118/150/136 f 110/126/114 125/149/135 126/151/137 -f 103/127/115 118/150/136 119/136/124 -f 123/143/131 138/167/152 139/154/139 +f 123/143/131 122/141/129 137/152/138 +f 123/143/131 138/153/139 139/158/142 f 117/148/134 116/145/132 131/155/140 -f 125/149/135 124/147/133 139/154/139 -f 118/150/136 117/148/134 132/156/141 -f 125/149/135 140/157/142 141/159/144 -f 118/150/136 133/158/143 134/160/145 -f 126/151/137 141/159/144 142/161/146 -f 120/137/125 119/136/124 134/160/145 -f 128/138/126 127/135/123 142/161/146 -f 120/137/125 135/162/147 136/164/149 -f 128/138/126 143/163/148 144/165/150 -f 122/141/129 121/139/127 136/164/149 -f 129/140/128 144/165/150 145/153/138 -f 123/143/131 122/141/129 137/166/151 -f 143/163/148 142/161/146 157/169/153 -f 135/162/147 150/185/167 151/171/155 -f 144/165/150 143/163/148 158/170/154 -f 137/166/151 136/164/149 151/171/155 -f 144/165/150 159/172/156 160/174/158 -f 138/167/152 137/166/151 152/173/157 -f 138/167/152 153/175/159 154/179/161 -f 131/155/140 146/177/160 147/180/162 -f 140/157/142 139/154/139 154/179/161 -f 133/158/143 132/156/141 147/180/162 -f 140/157/142 155/181/163 156/183/165 -f 133/158/143 148/182/164 149/184/166 -f 141/159/144 156/183/165 157/169/153 -f 134/160/145 149/184/166 150/185/167 -f 147/180/162 146/177/160 161/186/168 -f 155/181/163 154/179/161 169/188/170 -f 147/180/162 162/187/169 163/190/172 -f 155/181/163 170/189/171 171/191/173 -f 148/182/164 163/190/172 164/192/174 -f 156/183/165 171/191/173 172/193/175 -f 149/184/166 164/192/174 165/194/176 -f 158/170/154 157/169/153 172/193/175 -f 150/185/167 165/194/176 166/196/178 -f 158/170/154 173/195/177 174/197/179 -f 152/173/157 151/171/155 166/196/178 -f 160/174/158 159/172/156 174/197/179 -f 153/175/159 152/173/157 167/198/180 -f 153/175/159 168/200/182 169/188/170 -f 165/194/176 180/218/196 181/203/183 -f 173/195/177 188/219/197 189/204/184 -f 166/196/178 181/203/183 182/205/185 -f 174/197/179 189/204/184 190/206/186 -f 168/200/182 167/198/180 182/205/185 -f 168/200/182 183/207/187 184/211/189 -f 161/186/168 176/209/188 177/212/190 -f 169/188/170 184/211/189 185/213/191 -f 162/187/169 177/212/190 178/214/192 -f 170/189/171 185/213/191 186/215/193 -f 163/190/172 178/214/192 179/216/194 -f 172/193/175 171/191/173 186/215/193 -f 165/194/176 164/192/174 179/216/194 -f 172/193/175 187/217/195 188/219/197 -f 184/211/189 199/235/211 200/220/198 -f 177/212/190 192/236/212 193/221/199 -f 185/213/191 200/220/198 201/222/200 -f 178/214/192 193/221/199 194/223/201 -f 186/215/193 201/222/200 202/224/202 -f 180/218/196 179/216/194 194/223/201 -f 188/219/197 187/217/195 202/224/202 -f 180/218/196 195/225/203 196/227/205 -f 189/204/184 188/219/197 203/226/204 -f 182/205/185 181/203/183 196/227/205 -f 189/204/184 204/228/206 205/230/208 -f 183/207/187 182/205/185 197/229/207 -f 183/207/187 198/231/209 199/235/211 -f 177/212/190 176/209/188 191/233/210 -f 203/226/204 218/253/227 219/237/213 -f 197/229/207 196/227/205 211/238/214 -f 205/230/208 204/228/206 219/237/213 -f 198/231/209 197/229/207 212/239/215 -f 198/231/209 213/241/217 214/245/219 -f 191/233/210 206/243/218 207/246/220 -f 200/220/198 199/235/211 214/245/219 -f 192/236/212 207/246/220 208/248/222 -f 200/220/198 215/247/221 216/249/223 -f 193/221/199 208/248/222 209/250/224 -f 201/222/200 216/249/223 217/251/225 -f 195/225/203 194/223/201 209/250/224 -f 203/226/204 202/224/202 217/251/225 -f 195/225/203 210/252/226 211/238/214 -f 208/248/222 207/246/220 222/254/228 -f 215/247/221 230/270/242 231/256/230 -f 208/248/222 223/255/229 224/257/231 -f 216/249/223 231/256/230 232/258/232 -f 210/252/226 209/250/224 224/257/231 -f 218/253/227 217/251/225 232/258/232 -f 210/252/226 225/259/233 226/261/235 -f 218/253/227 233/260/234 234/262/236 -f 212/239/215 211/238/214 226/261/235 -f 220/240/216 219/237/213 234/262/236 -f 213/241/217 212/239/215 227/263/237 -f 213/241/217 228/265/239 229/269/241 -f 206/243/218 221/267/240 222/254/228 -f 215/247/221 214/245/219 229/269/241 -f 227/263/237 226/261/235 241/271/243 -f 235/264/238 234/262/236 249/273/245 -f 228/265/239 227/263/237 242/272/244 -f 228/265/239 243/275/247 244/279/249 -f 221/267/240 236/277/248 237/280/250 -f 230/270/242 229/269/241 244/279/249 -f 223/255/229 222/254/228 237/280/250 -f 230/270/242 245/281/251 246/283/253 -f 223/255/229 238/282/252 239/284/254 -f 231/256/230 246/283/253 247/285/255 -f 225/259/233 224/257/231 239/284/254 -f 233/260/234 232/258/232 247/285/255 -f 225/259/233 240/286/256 241/271/243 -f 233/260/234 248/287/257 249/273/245 -f 245/281/251 260/303/271 261/288/258 -f 238/282/252 253/304/272 254/289/259 -f 247/285/255 246/283/253 261/288/258 -f 240/286/256 239/284/254 254/289/259 -f 248/287/257 247/285/255 262/290/260 -f 240/286/256 255/291/261 256/293/263 -f 248/287/257 263/292/262 264/294/264 -f 242/272/244 241/271/243 256/293/263 -f 249/273/245 264/294/264 265/296/266 -f 243/275/247 242/272/244 257/295/265 -f 243/275/247 258/297/267 259/301/269 -f 236/277/248 251/299/268 252/302/270 -f 245/281/251 244/279/249 259/301/269 -f 237/280/250 252/302/270 253/304/272 -f 264/294/264 279/321/287 280/305/273 -f 258/297/267 257/295/265 272/306/274 -f 258/297/267 273/307/275 274/311/277 -f 251/299/268 266/309/276 267/312/278 -f 260/303/271 259/301/269 274/311/277 -f 252/302/270 267/312/278 268/314/280 -f 260/303/271 275/313/279 276/315/281 -f 253/304/272 268/314/280 269/316/282 -f 261/288/258 276/315/281 277/317/283 -f 255/291/261 254/289/259 269/316/282 -f 263/292/262 262/290/260 277/317/283 -f 255/291/261 270/318/284 271/320/286 -f 263/292/262 278/319/285 279/321/287 -f 257/295/265 256/293/263 271/320/286 -f 276/315/281 291/338/302 292/322/288 -f 270/318/284 269/316/282 284/323/289 -f 278/319/285 277/317/283 292/322/288 -f 271/320/286 270/318/284 285/324/290 -f 278/319/285 293/325/291 294/327/293 -f 272/306/274 271/320/286 286/326/292 -f 280/305/273 279/321/287 294/327/293 -f 273/307/275 272/306/274 287/328/294 -f 273/307/275 288/330/296 289/334/298 -f 266/309/276 281/332/297 282/335/299 -f 275/313/279 274/311/277 289/334/298 -f 267/312/278 282/335/299 283/337/301 -f 275/313/279 290/336/300 291/338/302 -f 268/314/280 283/337/301 284/323/289 -f 288/330/296 303/355/317 304/343/305 -f 281/332/297 296/340/303 297/344/306 -f 290/336/300 289/334/298 304/343/305 -f 282/335/299 297/344/306 298/346/308 -f 290/336/300 305/345/307 306/347/309 -f 283/337/301 298/346/308 299/348/310 -f 291/338/302 306/347/309 307/349/311 -f 284/323/289 299/348/310 300/350/312 -f 293/325/291 292/322/288 307/349/311 -f 286/326/292 285/324/290 300/350/312 -f 293/325/291 308/351/313 309/353/315 -f 287/328/294 286/326/292 301/352/314 -f 294/327/293 309/353/315 310/342/304 -f 288/330/296 287/328/294 302/354/316 -f 299/348/310 314/372/332 315/356/318 -f 308/351/313 307/349/311 322/357/319 -f 301/352/314 300/350/312 315/356/318 -f 309/353/315 308/351/313 323/358/320 -f 302/354/316 301/352/314 316/359/321 -f 309/353/315 324/360/322 325/362/324 -f 303/355/317 302/354/316 317/361/323 -f 303/355/317 318/363/325 319/367/327 -f 297/344/306 296/340/303 311/365/326 -f 305/345/307 304/343/305 319/367/327 -f 298/346/308 297/344/306 312/368/328 -f 305/345/307 320/369/329 321/371/331 -f 298/346/308 313/370/330 314/372/332 -f 306/347/309 321/371/331 322/357/319 -f 318/363/325 334/386/346 335/373/333 -f 311/365/326 327/388/347 328/374/334 -f 320/369/329 319/367/327 335/373/333 -f 312/368/328 328/374/334 329/376/336 -f 320/369/329 336/375/335 337/377/337 -f 313/370/330 329/376/336 330/378/338 -f 321/371/331 337/377/337 338/379/339 -f 314/372/332 330/378/338 331/380/340 -f 323/358/320 322/357/319 338/379/339 -f 316/359/321 315/356/318 331/380/340 -f 323/358/320 339/381/341 340/383/343 -f 317/361/323 316/359/321 332/382/342 -f 324/360/322 340/383/343 341/385/345 -f 318/363/325 317/361/323 333/384/344 -f 338/379/339 353/406/362 354/390/348 -f 332/382/342 331/380/340 346/391/349 -f 339/381/341 354/390/348 355/393/351 -f 333/384/344 332/382/342 347/392/350 -f 341/385/345 340/383/343 355/393/351 -f 334/386/346 333/384/344 348/394/352 -f 334/386/346 349/396/354 350/400/356 -f 327/388/347 342/398/355 343/401/357 -f 336/375/335 335/373/333 350/400/356 -f 328/374/334 343/401/357 344/403/359 -f 336/375/335 351/402/358 352/404/360 -f 329/376/336 344/403/359 345/405/361 -f 337/377/337 352/404/360 353/406/362 -f 330/378/338 345/405/361 346/391/349 -f 342/398/355 357/422/377 358/407/363 -f 351/402/358 350/400/356 365/408/364 -f 343/401/357 358/407/363 359/410/366 +f 125/149/135 124/147/133 139/158/142 +f 118/150/136 117/148/134 132/159/143 +f 125/149/135 140/160/144 141/162/146 +f 118/150/136 133/161/145 134/163/147 +f 126/151/137 141/162/146 142/164/148 +f 120/137/125 119/135/123 134/163/147 +f 128/138/126 127/136/124 142/164/148 +f 120/137/125 135/165/149 136/167/151 +f 128/138/126 143/166/150 144/168/152 +f 122/141/129 121/139/127 136/167/151 +f 129/140/128 144/168/152 145/157/141 +f 141/162/146 156/184/166 157/169/153 +f 134/163/147 149/185/167 150/170/154 +f 143/166/150 142/164/148 157/169/153 +f 135/165/149 150/170/154 151/172/156 +f 144/168/152 143/166/150 158/171/155 +f 137/152/138 136/167/151 151/172/156 +f 144/168/152 159/173/157 160/175/159 +f 138/153/139 137/152/138 152/174/158 +f 138/153/139 153/176/160 154/180/162 +f 131/155/140 146/178/161 147/181/163 +f 140/160/144 139/158/142 154/180/162 +f 133/161/145 132/159/143 147/181/163 +f 140/160/144 155/182/164 156/184/166 +f 133/161/145 148/183/165 149/185/167 +f 153/176/160 168/201/182 169/188/169 +f 147/181/163 146/178/161 161/189/170 +f 155/182/164 154/180/162 169/188/169 +f 147/181/163 162/190/171 163/192/173 +f 155/182/164 170/191/172 171/193/174 +f 148/183/165 163/192/173 164/194/175 +f 156/184/166 171/193/174 172/195/176 +f 149/185/167 164/194/175 165/196/177 +f 158/171/155 157/169/153 172/195/176 +f 150/170/154 165/196/177 166/198/179 +f 158/171/155 173/197/178 174/199/180 +f 152/174/158 151/172/156 166/198/179 +f 160/175/159 159/173/157 174/199/180 +f 153/176/160 152/174/158 167/200/181 +f 172/195/176 187/218/196 188/203/183 +f 165/196/177 180/219/197 181/204/184 +f 173/197/178 188/203/183 189/205/185 +f 166/198/179 181/204/184 182/206/186 +f 174/199/180 189/205/185 190/207/187 +f 168/201/182 167/200/181 182/206/186 +f 168/201/182 183/208/188 184/212/190 +f 161/189/170 176/210/189 177/213/191 +f 169/188/169 184/212/190 185/214/192 +f 162/190/171 177/213/191 178/215/193 +f 170/191/172 185/214/192 186/216/194 +f 163/192/173 178/215/193 179/217/195 +f 172/195/176 171/193/174 186/216/194 +f 165/196/177 164/194/175 179/217/195 +f 177/213/191 176/210/189 191/220/198 +f 184/212/190 199/236/212 200/222/200 +f 177/213/191 192/221/199 193/223/201 +f 185/214/192 200/222/200 201/224/202 +f 178/215/193 193/223/201 194/225/203 +f 186/216/194 201/224/202 202/226/204 +f 180/219/197 179/217/195 194/225/203 +f 188/203/183 187/218/196 202/226/204 +f 180/219/197 195/227/205 196/229/207 +f 189/205/185 188/203/183 203/228/206 +f 182/206/186 181/204/184 196/229/207 +f 189/205/185 204/230/208 205/232/210 +f 183/208/188 182/206/186 197/231/209 +f 183/208/188 198/233/211 199/236/212 +f 195/227/205 210/252/226 211/237/213 +f 203/228/206 218/253/227 219/238/214 +f 197/231/209 196/229/207 211/237/213 +f 205/232/210 204/230/208 219/238/214 +f 198/233/211 197/231/209 212/239/215 +f 198/233/211 213/241/217 214/245/219 +f 191/220/198 206/243/218 207/246/220 +f 200/222/200 199/236/212 214/245/219 +f 192/221/199 207/246/220 208/248/222 +f 200/222/200 215/247/221 216/249/223 +f 193/223/201 208/248/222 209/250/224 +f 201/224/202 216/249/223 217/251/225 +f 195/227/205 194/225/203 209/250/224 +f 203/228/206 202/226/204 217/251/225 +f 215/247/221 214/245/219 229/254/228 +f 208/248/222 207/246/220 222/256/230 +f 215/247/221 230/255/229 231/258/232 +f 208/248/222 223/257/231 224/259/233 +f 216/249/223 231/258/232 232/260/234 +f 210/252/226 209/250/224 224/259/233 +f 218/253/227 217/251/225 232/260/234 +f 210/252/226 225/261/235 226/263/237 +f 218/253/227 233/262/236 234/264/238 +f 212/239/215 211/237/213 226/263/237 +f 220/240/216 219/238/214 234/264/238 +f 213/241/217 212/239/215 227/265/239 +f 213/241/217 228/267/241 229/254/228 +f 206/243/218 221/269/242 222/256/230 +f 233/262/236 248/287/257 249/271/243 +f 227/265/239 226/263/237 241/272/244 +f 235/266/240 234/264/238 249/271/243 +f 228/267/241 227/265/239 242/273/245 +f 228/267/241 243/275/247 244/279/249 +f 221/269/242 236/277/248 237/280/250 +f 230/255/229 229/254/228 244/279/249 +f 223/257/231 222/256/230 237/280/250 +f 230/255/229 245/281/251 246/283/253 +f 223/257/231 238/282/252 239/284/254 +f 231/258/232 246/283/253 247/285/255 +f 225/261/235 224/259/233 239/284/254 +f 233/262/236 232/260/234 247/285/255 +f 225/261/235 240/286/256 241/272/244 +f 237/280/250 252/303/271 253/288/258 +f 245/281/251 260/304/272 261/289/259 +f 238/282/252 253/288/258 254/290/260 +f 247/285/255 246/283/253 261/289/259 +f 240/286/256 239/284/254 254/290/260 +f 248/287/257 247/285/255 262/291/261 +f 240/286/256 255/292/262 256/294/264 +f 248/287/257 263/293/263 264/295/265 +f 242/273/245 241/272/244 256/294/264 +f 249/271/243 264/295/265 265/297/267 +f 243/275/247 242/273/245 257/296/266 +f 243/275/247 258/298/268 259/302/270 +f 236/277/248 251/300/269 252/303/271 +f 245/281/251 244/279/249 259/302/270 +f 257/296/266 256/294/264 271/305/273 +f 264/295/265 279/321/287 280/307/275 +f 258/298/268 257/296/266 272/306/274 +f 258/298/268 273/308/276 274/312/278 +f 251/300/269 266/310/277 267/313/279 +f 260/304/272 259/302/270 274/312/278 +f 252/303/271 267/313/279 268/315/281 +f 260/304/272 275/314/280 276/316/282 +f 253/288/258 268/315/281 269/317/283 +f 261/289/259 276/316/282 277/318/284 +f 255/292/262 254/290/260 269/317/283 +f 263/293/263 262/291/261 277/318/284 +f 255/292/262 270/319/285 271/305/273 +f 263/293/263 278/320/286 279/321/287 +f 275/314/280 290/337/301 291/322/288 +f 268/315/281 283/338/302 284/323/289 +f 276/316/282 291/322/288 292/324/290 +f 270/319/285 269/317/283 284/323/289 +f 278/320/286 277/318/284 292/324/290 +f 271/305/273 270/319/285 285/325/291 +f 278/320/286 293/326/292 294/328/294 +f 272/306/274 271/305/273 286/327/293 +f 280/307/275 279/321/287 294/328/294 +f 273/308/276 272/306/274 287/329/295 +f 273/308/276 288/331/297 289/335/299 +f 266/310/277 281/333/298 282/336/300 +f 275/314/280 274/312/278 289/335/299 +f 267/313/279 282/336/300 283/338/302 +f 294/328/294 309/355/317 310/339/303 +f 288/331/297 287/329/295 302/340/304 +f 288/331/297 303/341/305 304/345/307 +f 281/333/298 296/343/306 297/346/308 +f 290/337/301 289/335/299 304/345/307 +f 282/336/300 297/346/308 298/348/310 +f 290/337/301 305/347/309 306/349/311 +f 283/338/302 298/348/310 299/350/312 +f 291/322/288 306/349/311 307/351/313 +f 284/323/289 299/350/312 300/352/314 +f 293/326/292 292/324/290 307/351/313 +f 286/327/293 285/325/291 300/352/314 +f 293/326/292 308/353/315 309/355/317 +f 287/329/295 286/327/293 301/354/316 +f 306/349/311 321/371/331 322/356/318 +f 299/350/312 314/372/332 315/357/319 +f 308/353/315 307/351/313 322/356/318 +f 301/354/316 300/352/314 315/357/319 +f 309/355/317 308/353/315 323/358/320 +f 302/340/304 301/354/316 316/359/321 +f 309/355/317 324/360/322 325/362/324 +f 303/341/305 302/340/304 317/361/323 +f 303/341/305 318/363/325 319/367/327 +f 297/346/308 296/343/306 311/365/326 +f 305/347/309 304/345/307 319/367/327 +f 298/348/310 297/346/308 312/368/328 +f 305/347/309 320/369/329 321/371/331 +f 298/348/310 313/370/330 314/372/332 +f 318/363/325 334/389/347 335/377/335 +f 311/365/326 327/374/333 328/378/336 +f 320/369/329 319/367/327 335/377/335 +f 312/368/328 328/378/336 329/380/338 +f 320/369/329 336/379/337 337/381/339 +f 313/370/330 329/380/338 330/382/340 +f 321/371/331 337/381/339 338/383/341 +f 314/372/332 330/382/340 331/384/342 +f 323/358/320 322/356/318 338/383/341 +f 316/359/321 315/357/319 331/384/342 +f 323/358/320 339/385/343 340/387/345 +f 317/361/323 316/359/321 332/386/344 +f 324/360/322 340/387/345 341/376/334 +f 318/363/325 317/361/323 333/388/346 +f 330/382/340 345/405/361 346/390/348 +f 338/383/341 353/406/362 354/391/349 +f 332/386/344 331/384/342 346/390/348 +f 339/385/343 354/391/349 355/393/351 +f 333/388/346 332/386/344 347/392/350 +f 341/376/334 340/387/345 355/393/351 +f 334/389/347 333/388/346 348/394/352 +f 334/389/347 349/396/354 350/400/356 +f 327/374/333 342/398/355 343/401/357 +f 336/379/337 335/377/335 350/400/356 +f 328/378/336 343/401/357 344/403/359 +f 336/379/337 351/402/358 352/404/360 +f 329/380/338 344/403/359 345/405/361 +f 337/381/339 352/404/360 353/406/362 +f 349/396/354 364/420/376 365/407/363 +f 342/398/355 357/422/377 358/408/364 +f 351/402/358 350/400/356 365/407/363 +f 343/401/357 358/408/364 359/410/366 f 351/402/358 366/409/365 367/411/367 f 344/403/359 359/410/366 360/412/368 f 352/404/360 367/411/367 368/413/369 -f 346/391/349 345/405/361 360/412/368 -f 354/390/348 353/406/362 368/413/369 -f 347/392/350 346/391/349 361/414/370 -f 355/393/351 354/390/348 369/415/371 +f 346/390/348 345/405/361 360/412/368 +f 354/391/349 353/406/362 368/413/369 +f 347/392/350 346/390/348 361/414/370 +f 355/393/351 354/391/349 369/415/371 f 348/394/352 347/392/350 362/416/372 f 356/395/353 355/393/351 370/417/373 f 349/396/354 348/394/352 363/418/374 -f 349/396/354 364/420/376 365/408/364 -f 362/424/372 361/454/370 376/425/378 -f 370/427/373 369/455/371 384/428/380 -f 363/430/374 362/424/372 377/426/379 -f 371/432/375 370/427/373 385/429/381 -f 364/434/376 363/430/374 378/431/382 -f 364/434/376 379/435/384 380/440/386 -f 357/436/377 372/438/385 373/442/387 -f 366/444/365 365/441/364 380/440/386 -f 358/443/363 373/442/387 374/446/389 -f 366/444/365 381/445/388 382/448/390 -f 359/447/366 374/446/389 375/450/391 -f 368/452/369 367/449/367 382/448/390 -f 360/451/368 375/450/391 376/425/378 -f 369/455/371 368/452/369 383/453/392 -f 381/445/388 380/440/386 395/456/393 -f 373/442/387 388/472/407 389/458/395 -f 381/445/388 396/457/394 397/459/396 -f 374/446/389 389/458/395 390/460/397 -f 382/448/390 397/459/396 398/461/398 -f 375/450/391 390/460/397 391/462/399 -f 384/428/380 383/453/392 398/461/398 -f 377/426/379 376/425/378 391/462/399 -f 384/428/380 399/463/400 400/465/402 -f 378/431/382 377/426/379 392/464/401 -f 385/429/381 400/465/402 401/467/404 -f 379/435/384 378/431/382 393/466/403 -f 379/435/384 394/468/405 395/456/393 -f 372/438/385 387/470/406 388/472/407 -f 400/465/402 399/463/400 414/473/408 -f 393/466/403 392/464/401 407/475/410 -f 400/465/402 415/474/409 416/477/412 -f 394/468/405 393/466/403 408/476/411 -f 394/468/405 409/478/413 410/482/415 -f 387/470/406 402/480/414 403/483/416 -f 396/457/394 395/456/393 410/482/415 -f 388/472/407 403/483/416 404/485/418 -f 396/457/394 411/484/417 412/486/419 -f 389/458/395 404/485/418 405/487/420 -f 397/459/396 412/486/419 413/488/421 -f 391/462/399 390/460/397 405/487/420 -f 399/463/400 398/461/398 413/488/421 -f 392/464/401 391/462/399 406/489/422 -f 411/484/417 426/505/436 427/490/423 -f 404/485/418 419/506/437 420/491/424 -f 412/486/419 427/490/423 428/492/425 -f 405/487/420 420/491/424 421/493/426 -f 414/473/408 413/488/421 428/492/425 -f 407/475/410 406/489/422 421/493/426 -f 414/473/408 429/494/427 430/496/429 -f 408/476/411 407/475/410 422/495/428 -f 416/477/412 415/474/409 430/496/429 -f 409/478/413 408/476/411 423/497/430 -f 409/478/413 424/499/432 425/503/434 -f 402/480/414 417/501/433 418/504/435 -f 410/482/415 425/503/434 426/505/436 -f 403/483/416 418/504/435 419/506/437 -f 431/498/431 430/496/429 445/507/438 -f 424/499/432 423/497/430 438/509/440 -f 424/499/432 439/510/441 440/514/443 -f 417/501/433 432/512/442 433/515/444 -f 425/503/434 440/514/443 441/516/445 -f 419/506/437 418/504/435 433/515/444 -f 426/505/436 441/516/445 442/518/447 -f 419/506/437 434/517/446 435/519/448 -f 427/490/423 442/518/447 443/520/449 -f 420/491/424 435/519/448 436/521/450 -f 429/494/427 428/492/425 443/520/449 -f 422/495/428 421/493/426 436/521/450 -f 429/494/427 444/522/451 445/507/438 -f 423/497/430 422/495/428 437/523/452 -f 434/517/446 449/539/466 450/524/453 -f 442/518/447 457/540/467 458/525/454 -f 436/521/450 435/519/448 450/524/453 -f 444/522/451 443/520/449 458/525/454 -f 437/523/452 436/521/450 451/526/455 -f 444/522/451 459/527/456 460/529/458 -f 438/509/440 437/523/452 452/528/457 -f 445/507/438 460/529/458 461/531/460 -f 439/510/441 438/509/440 453/530/459 -f 439/510/441 454/532/461 455/536/463 -f 432/512/442 447/534/462 448/537/464 -f 440/514/443 455/536/463 456/538/465 -f 433/515/444 448/537/464 449/539/466 -f 441/516/445 456/538/465 457/540/467 -f 454/532/461 453/530/459 468/541/468 -f 454/532/461 469/542/469 470/547/472 -f 447/534/462 462/544/470 463/548/473 -f 455/536/463 470/547/472 471/549/474 -f 448/537/464 463/548/473 464/550/475 -f 456/538/465 471/549/474 472/551/476 -f 449/539/466 464/550/475 465/552/477 -f 457/540/467 472/551/476 473/553/478 -f 450/524/453 465/552/477 466/554/479 -f 459/527/456 458/525/454 473/553/478 -f 452/528/457 451/526/455 466/554/479 -f 459/527/456 474/555/480 475/557/482 -f 453/530/459 452/528/457 467/556/481 -f 460/529/458 475/557/482 476/546/471 -f 472/551/476 8/32/32 9/4/4 -f 466/554/479 465/552/477 4/3/3 -f 473/553/478 9/4/4 10/10/10 -f 467/556/481 466/554/479 5/8/8 -f 474/555/480 10/10/10 480/14/14 -f 468/541/468 467/556/481 6/12/12 -f 475/557/482 480/14/14 481/18/18 -f 469/542/469 468/541/468 7/16/16 -f 469/542/469 477/19/19 478/26/26 -f 463/548/473 462/544/470 1/21/21 -f 470/547/472 478/26/26 479/30/30 -f 464/550/475 463/548/473 2/28/28 -f 471/549/474 479/30/30 8/32/32 -f 465/552/477 464/550/475 3/1/1 +f 369/424/371 368/454/369 383/425/378 +f 362/427/372 361/455/370 376/428/380 +f 370/430/373 369/424/371 384/426/379 +f 363/432/374 362/427/372 377/429/381 +f 371/434/375 370/430/373 385/431/382 +f 364/436/376 363/432/374 378/433/383 +f 364/436/376 379/437/385 380/442/387 +f 357/438/377 372/440/386 373/444/388 +f 366/446/365 365/443/363 380/442/387 +f 358/445/364 373/444/388 374/448/390 +f 366/446/365 381/447/389 382/450/391 +f 359/449/366 374/448/390 375/452/392 +f 368/454/369 367/451/367 382/450/391 +f 360/453/368 375/452/392 376/428/380 +f 372/440/386 387/471/407 388/456/393 +f 381/447/389 380/442/387 395/457/394 +f 373/444/388 388/456/393 389/459/396 +f 381/447/389 396/458/395 397/460/397 +f 374/448/390 389/459/396 390/461/398 +f 382/450/391 397/460/397 398/462/399 +f 375/452/392 390/461/398 391/463/400 +f 384/426/379 383/425/378 398/462/399 +f 377/429/381 376/428/380 391/463/400 +f 384/426/379 399/464/401 400/466/403 +f 378/433/383 377/429/381 392/465/402 +f 385/431/382 400/466/403 401/468/405 +f 379/437/385 378/433/383 393/467/404 +f 379/437/385 394/469/406 395/457/394 +f 392/465/402 391/463/400 406/473/408 +f 400/466/403 399/464/401 414/475/410 +f 393/467/404 392/465/402 407/474/409 +f 400/466/403 415/476/411 416/478/413 +f 394/469/406 393/467/404 408/477/412 +f 394/469/406 409/479/414 410/483/416 +f 387/471/407 402/481/415 403/484/417 +f 396/458/395 395/457/394 410/483/416 +f 388/456/393 403/484/417 404/486/419 +f 396/458/395 411/485/418 412/487/420 +f 389/459/396 404/486/419 405/488/421 +f 397/460/397 412/487/420 413/489/422 +f 391/463/400 390/461/398 405/488/421 +f 399/464/401 398/462/399 413/489/422 +f 410/483/416 425/505/436 426/490/423 +f 403/484/417 418/506/437 419/491/424 +f 411/485/418 426/490/423 427/492/425 +f 404/486/419 419/491/424 420/493/426 +f 412/487/420 427/492/425 428/494/427 +f 405/488/421 420/493/426 421/495/428 +f 414/475/410 413/489/422 428/494/427 +f 407/474/409 406/473/408 421/495/428 +f 414/475/410 429/496/429 430/498/431 +f 408/477/412 407/474/409 422/497/430 +f 416/478/413 415/476/411 430/498/431 +f 409/479/414 408/477/412 423/499/432 +f 409/479/414 424/501/434 425/505/436 +f 402/481/415 417/503/435 418/506/437 +f 429/496/429 444/523/452 445/507/438 +f 423/499/432 422/497/430 437/508/439 +f 431/500/433 430/498/431 445/507/438 +f 424/501/434 423/499/432 438/509/440 +f 424/501/434 439/511/442 440/515/444 +f 417/503/435 432/513/443 433/516/445 +f 425/505/436 440/515/444 441/517/446 +f 419/491/424 418/506/437 433/516/445 +f 426/490/423 441/517/446 442/519/448 +f 419/491/424 434/518/447 435/520/449 +f 427/492/425 442/519/448 443/521/450 +f 420/493/426 435/520/449 436/522/451 +f 429/496/429 428/494/427 443/521/450 +f 422/497/430 421/495/428 436/522/451 +f 441/517/446 456/539/466 457/524/453 +f 434/518/447 449/540/467 450/525/454 +f 442/519/448 457/524/453 458/526/455 +f 436/522/451 435/520/449 450/525/454 +f 444/523/452 443/521/450 458/526/455 +f 437/508/439 436/522/451 451/527/456 +f 444/523/452 459/528/457 460/530/459 +f 438/509/440 437/508/439 452/529/458 +f 445/507/438 460/530/459 461/532/461 +f 439/511/442 438/509/440 453/531/460 +f 439/511/442 454/533/462 455/537/464 +f 432/513/443 447/535/463 448/538/465 +f 440/515/444 455/537/464 456/539/466 +f 433/516/445 448/538/465 449/540/467 +f 460/530/459 475/557/482 476/541/468 +f 454/533/462 453/531/460 468/542/469 +f 454/533/462 469/543/470 470/547/472 +f 447/535/463 462/545/471 463/548/473 +f 455/537/464 470/547/472 471/549/474 +f 448/538/465 463/548/473 464/550/475 +f 456/539/466 471/549/474 472/551/476 +f 449/540/467 464/550/475 465/552/477 +f 457/524/453 472/551/476 473/553/478 +f 450/525/454 465/552/477 466/554/479 +f 459/528/457 458/526/455 473/553/478 +f 452/529/458 451/527/456 466/554/479 +f 459/528/457 474/555/480 475/557/482 +f 453/531/460 452/529/458 467/556/481 +f 465/552/477 464/550/475 3/4/4 +f 472/551/476 8/3/3 9/7/7 +f 466/554/479 465/552/477 4/6/6 +f 473/553/478 9/7/7 10/12/12 +f 467/556/481 466/554/479 5/10/10 +f 474/555/480 10/12/12 480/16/16 +f 468/542/469 467/556/481 6/14/14 +f 475/557/482 480/16/16 481/20/20 +f 469/543/470 468/542/469 7/18/18 +f 469/543/470 477/21/21 478/28/28 +f 463/548/473 462/545/471 1/23/23 +f 470/547/472 478/28/28 479/1/1 +f 464/550/475 463/548/473 2/30/30 +f 471/549/474 479/1/1 8/3/3 diff --git a/NFPackCreator/AssetBuild/base/models/torus.mtl b/NFPackCreator/AssetBuild/base/models/torus.mtl new file mode 100644 index 0000000..6e8d955 --- /dev/null +++ b/NFPackCreator/AssetBuild/base/models/torus.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 100 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/NFPackCreator/AssetBuild/base/models/torus.obj b/NFPackCreator/AssetBuild/base/models/torus.obj index 18a31f1..9151229 100644 --- a/NFPackCreator/AssetBuild/base/models/torus.obj +++ b/NFPackCreator/AssetBuild/base/models/torus.obj @@ -1,5 +1,6 @@ # Blender v2.93.3 OBJ File: '' # www.blender.org +mtllib torus.mtl o Torus v 1.250000 0.000000 0.000000 v 1.216506 0.125000 0.000000 @@ -1742,6 +1743,7 @@ vn 0.5036 -0.8614 0.0663 vn 0.8612 -0.4954 0.1134 vn -0.8559 0.5047 -0.1127 vn -0.4876 -0.8707 -0.0642 +usemtl None s 1 f 13/1/1 2/2/2 1/3/3 f 2/2/2 15/4/4 3/5/5 diff --git a/NFPackCreator/AssetBuild/base/shaders/entityFragment.shader b/NFPackCreator/AssetBuild/base/shaders/entityFragment.shader index 404dc15..2974135 100644 --- a/NFPackCreator/AssetBuild/base/shaders/entityFragment.shader +++ b/NFPackCreator/AssetBuild/base/shaders/entityFragment.shader @@ -9,8 +9,12 @@ struct Camera { }; struct Material { - float shininess; - //Do I want a specular color here? + bool hasDiffuseTex; + sampler2D diffuseTexture; + vec3 diffuseColor; + bool hasSpecTex; + sampler2D specularTexture; + float specPower; }; struct Light { @@ -21,7 +25,6 @@ struct Light { float strength; }; -uniform sampler2D modelTexture; uniform Camera camera; uniform Material material; uniform Light light[100]; @@ -30,13 +33,21 @@ uniform int numberOfLights; out vec4 outColor; void main() { - vec4 texColor = texture(modelTexture, texCoord); - vec3 color = vec3(0.0); + vec3 matDiff; + if (material.hasDiffuseTex) + matDiff = texture(material.diffuseTexture, texCoord).rgb; + else + matDiff = material.diffuseColor; + + vec3 matSpec = vec3(1.0); + if(material.hasSpecTex) + matSpec = texture(material.specularTexture, texCoord).rgb; + for (int i = 0; i < numberOfLights; i++) { float ambientStrength = 0.2f; - vec3 ambient = ambientStrength * texColor.rgb; + vec3 ambient = ambientStrength * matDiff; if (i == numberOfLights - 1 && numberOfLights == 1) { color += ambient; break; @@ -46,12 +57,12 @@ void main() { vec3 lightDir = normalize(-light[i].pos); vec3 norm = normalize(normals); float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = light[i].color * (diff * texColor.rgb) * light[i].strength; + vec3 diffuse = light[i].color * (diff * matDiff) * (light[i].strength / 2.0f); vec3 viewDir = normalize(camera.pos - fragPos); vec3 reflectDir = reflect(-lightDir, norm); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess * 32.0f); - vec3 specular = light[i].color * spec * light[i].strength; + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.specPower); + vec3 specular = light[i].color * spec * matSpec * (light[i].strength / 2.0f); color += (ambient + diffuse + specular); continue; @@ -60,12 +71,12 @@ void main() { vec3 lightDir = normalize(light[i].pos - fragPos); vec3 norm = normalize(normals); float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = light[i].color * (diff * texColor.rgb) * light[i].strength; + vec3 diffuse = light[i].color * (diff * matDiff) * (light[i].strength / 2.0f); vec3 viewDir = normalize(camera.pos - fragPos); vec3 reflectDir = reflect(-lightDir, norm); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess * 32.0f); - vec3 specular = light[i].color * spec * (light[i].strength) / 8.0f; + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.specPower); + vec3 specular = light[i].color * spec * matSpec * (light[i].strength / 2.0f); float length = length(light[i].pos - fragPos); float att = clamp(10.0 / length, 0.0, 1.0) * light[i].strength; @@ -74,5 +85,5 @@ void main() { continue; } } - outColor = vec4(color, texColor.a); + outColor = vec4(color, 1.0); } diff --git a/NFPackCreator/src/main.cpp b/NFPackCreator/src/main.cpp index 483af26..5db0850 100644 --- a/NFPackCreator/src/main.cpp +++ b/NFPackCreator/src/main.cpp @@ -64,6 +64,22 @@ void writeFile(const std::string& filename, const std::string& in, bool encrypte out.close(); } +void getNeededImages(std::string mtl, std::set& set) { + while (mtl.size()) { + unsigned int pos = mtl.find("map_"); + if (pos == std::string::npos) + break; + mtl = mtl.substr(pos + 7); + std::stringstream ss(mtl); + std::string temp; + ss >> temp; + unsigned int pos2 = temp.find_last_of("/\\"); + if (pos2 != std::string::npos) + temp = temp.substr(pos2 + 1); + set.insert(temp); + } +} + int main(int argc, char* argv[]) { Log("Starting up"); @@ -84,6 +100,7 @@ int main(int argc, char* argv[]) { continue; std::string filename = currDir.path().filename().string().append(".nfpack"); Log("Creating pack \"" + filename + (std::string)"\""); + std::string currFileExtension; std::string currFileContents; std::stringstream out; unsigned int fileCount = 0; @@ -91,11 +108,46 @@ int main(int argc, char* argv[]) { if (curr.is_directory()) continue; std::filesystem::path relative = std::filesystem::relative(curr, currDir); - if (extensions.find(relative.extension().string().substr(1)) == extensions.end()) + currFileExtension = relative.extension().string().substr(1); + if (currFileExtension == "mtl") + continue; + if (extensions.find(currFileExtension) == extensions.end()) Error("File \"" + relative.string() + (std::string)"\" is not of supported type!"); Log("Current file: " + relative.string()); currFileContents = readFile(curr.path().string()); + if (currFileExtension == "obj") { + std::filesystem::path mtlPath; + for (const auto& curr2 : std::filesystem::recursive_directory_iterator(curr.path().parent_path())) { + if (curr2.is_directory()) + continue; + if (curr2.path().extension() != ".mtl") + continue; + std::string mtlFile = relative.filename().string().substr(0, relative.filename().string().size() - 4) + (std::string)".mtl"; + if (curr2.path().filename().string() == mtlFile) { + mtlPath = curr2.path(); + break; + } + } + if (mtlPath.empty()) + Error("No mtl file found for " + relative.filename().string() + (std::string)"!"); + Log("Found mtl file for " + relative.filename().string()); + std::set neededImages; + std::string mtlContents = readFile(mtlPath.string()); + getNeededImages(mtlContents, neededImages); + if (!neededImages.empty()) { + currFileContents.insert(0, "\n"); + for(std::string curr : neededImages) { + currFileContents.insert(0, curr); + currFileContents.insert(0, " "); + } + currFileContents = currFileContents.substr(1); + } + else { + currFileContents.insert(0, "none\n"); + } + currFileContents += '\n' + mtlContents; + } if (out.rdbuf()->in_avail() != 0) out << "\n"; out << "#NFASSET " + curr.path().filename().string(); diff --git a/NothinFancy/src/Assets.cpp b/NothinFancy/src/Assets.cpp index 77e8aa5..52fcee1 100644 --- a/NothinFancy/src/Assets.cpp +++ b/NothinFancy/src/Assets.cpp @@ -1,5 +1,7 @@ #include "Assets.h" +#include + #include "Application.h" #include "Model.h" #include "Utility.h" @@ -9,11 +11,11 @@ namespace nf { delete[] data; } - AModel::~AModel() { + ATexture::~ATexture() { } - ATexture::~ATexture() { + AModel::~AModel() { } @@ -41,6 +43,7 @@ namespace nf { void AssetPack::load(const char* packName) { std::string path = "assets/" + (std::string)packName; std::string packContents = readFile(path); + std::string packContentsOBJ = packContents; std::unordered_map cubemaps; unsigned int cubemapCount = 0; while (packContents.size()) { @@ -63,18 +66,8 @@ namespace nf { } size_t assetSize = assetContents.size(); - if (extension == "obj") { - AModel* geometry = new AModel; - geometry->data = new char[assetSize + 1]; - std::memcpy(geometry->data, &assetContents[0], assetSize); - geometry->data[assetSize] = '\0'; - geometry->alreadyLoaded = false; - geometry->loadedModel = nullptr; - if (packName == "base.nfpack") - geometry->isBaseAsset = true; - m_assets[assetName] = geometry; + if (extension == "obj") continue; - } if (extension == "png") { if (assetName.find("_cmfront") != std::string::npos || assetName.find("_cmback") != std::string::npos || assetName.find("_cmtop") != std::string::npos || assetName.find("_cmbottom") != std::string::npos || assetName.find("_cmleft") != std::string::npos || assetName.find("_cmright") != std::string::npos) { std::string cmName = assetName.substr(0, assetName.find('_')); @@ -156,6 +149,48 @@ namespace nf { } if (cubemapCount % 6 != 0) Error("Could not find full cubemap in pack \"" + (std::string)packName + (std::string)"\"!"); + + while (packContentsOBJ.size()) { + unsigned int startingPos = packContentsOBJ.find_first_of("#NFASSET ") + 9; + packContentsOBJ = packContentsOBJ.substr(9); + unsigned int endAssetNamePos = packContentsOBJ.find_first_of('\n'); + std::string assetName = packContentsOBJ.substr(0, endAssetNamePos); + packContentsOBJ = packContentsOBJ.substr(endAssetNamePos + 1); + unsigned int extensionPos = assetName.find_first_of('.'); + std::string extension = assetName.substr(extensionPos + 1); + std::string assetContents; + unsigned int nextAssetPos = packContentsOBJ.find("#NFASSET "); + if (nextAssetPos != std::string::npos) { + assetContents = packContentsOBJ.substr(0, nextAssetPos - 1); + packContentsOBJ = packContentsOBJ.substr(nextAssetPos); + } + else { + assetContents = packContentsOBJ; + packContentsOBJ = ""; + } + size_t assetSize = assetContents.size(); + + if (extension == "obj") { + AModel* model = new AModel; + std::string textures = assetContents.substr(0, assetContents.find("\n")); + if (textures != "none") { + std::stringstream ss(textures); + std::string curr; + while (ss >> curr) { + model->neededTextures[curr] = (ATexture*)m_assets[curr]; + } + } + assetContents = assetContents.substr(assetContents.find("\n") + 1); + model->data = new char[assetSize + 1]; + std::memcpy(model->data, &assetContents[0], assetSize); + model->data[assetSize] = '\0'; + if (packName == "base.nfpack") + model->isBaseAsset = true; + m_assets[assetName] = model; + continue; + } + } + if (packName != "base.nfpack") Application::getApp()->getCurrentState()->m_nfObjects.push_back(this); } diff --git a/NothinFancy/src/IntroGamestate.cpp b/NothinFancy/src/IntroGamestate.cpp index bf14d4e..933535c 100644 --- a/NothinFancy/src/IntroGamestate.cpp +++ b/NothinFancy/src/IntroGamestate.cpp @@ -9,7 +9,7 @@ namespace nf { Log("Intro onEnter!"); m_logoTex.create(BaseAssets::logo, Vec2(0.0, 0.0)); m_logoTex.centered(true, true); - m_text.create("(C) Grayson Riffe 2021", Vec2(0.01, 0.025), Vec3(0.8)); + m_text.create("(c) Grayson Riffe 2021", Vec2(0.01, 0.025), Vec3(0.8)); m_text.setScale(0.6); m_start = std::chrono::steady_clock::now(); } diff --git a/NothinFancy/src/Renderer/Drawable/Entity.cpp b/NothinFancy/src/Renderer/Drawable/Entity.cpp index aef9f36..fdb6028 100644 --- a/NothinFancy/src/Renderer/Drawable/Entity.cpp +++ b/NothinFancy/src/Renderer/Drawable/Entity.cpp @@ -17,26 +17,14 @@ namespace nf { } - void Entity::create(Asset* modelAsset, Asset* textureAsset) { + void Entity::create(Asset* modelAsset) { m_constructed = true; AModel& model = *(AModel*)modelAsset; - //TODO: Change this when doing materials - if (model.alreadyLoaded && textureAsset == nullptr) { + if (model.alreadyLoaded) { m_model = model.loadedModel; } else { - if (!textureAsset) - Error("No texture given to Entity create function on new model load!"); - ATexture& texture = *(ATexture*)textureAsset; - std::string obj = model.data; - m_model = new Model; - std::vector vb; - std::vector ib; - size_t ibCount = 0; - std::vector tc; - std::vector vn; - parseOBJ(obj, vb, ib, ibCount, tc, vn); - m_model->create(&vb[0], vb.size() * sizeof(float), &ib[0], ibCount, &vn[0], vn.size() * sizeof(float), &tc[0], tc.size() * sizeof(float), &texture); + m_model = new Model(&model); model.alreadyLoaded = true; model.loadedModel = m_model; } @@ -76,10 +64,10 @@ namespace nf { m_scale = scale; } - void Entity::bind(Shader* shader) { - m_model->bind(); + void Entity::render(Shader* shader) { shader->bind(); setModelMatrix(shader); + m_model->render(shader); } Model* Entity::getModel() const { @@ -101,15 +89,9 @@ namespace nf { if(m_model && !m_model->isBaseAsset()) delete m_model; m_model = nullptr; - m_position.x = 0.0; - m_position.y = 0.0; - m_position.z = 0.0; - m_rotation.x = 0.0; - m_rotation.y = 0.0; - m_rotation.z = 0.0; - m_scale.x = 1.0; - m_scale.y = 1.0; - m_scale.z = 1.0; + m_position = Vec3(0.0); + m_rotation = Vec3(0.0); + m_scale = Vec3(1.0); } Entity::~Entity() { diff --git a/NothinFancy/src/Renderer/Drawable/Light.cpp b/NothinFancy/src/Renderer/Drawable/Light.cpp index a967f3e..0cafe58 100644 --- a/NothinFancy/src/Renderer/Drawable/Light.cpp +++ b/NothinFancy/src/Renderer/Drawable/Light.cpp @@ -12,12 +12,12 @@ namespace nf { } - void Light::create(const Vec3& position, const Vec3& color, float strength, Type type) { + void Light::create(const Vec3& position, const Vec3& color, double strength, Type type) { m_constructed = true; m_position = position; m_color = color; m_type = type; - m_strength = strength; + m_strength = (float)strength; Application::getApp()->getCurrentState()->m_nfObjects.push_back(this); } diff --git a/NothinFancy/src/Renderer/Drawable/Model.cpp b/NothinFancy/src/Renderer/Drawable/Model.cpp index 19e8063..34b4681 100644 --- a/NothinFancy/src/Renderer/Drawable/Model.cpp +++ b/NothinFancy/src/Renderer/Drawable/Model.cpp @@ -1,49 +1,284 @@ #include "Model.h" +#include #include "glm/glm.hpp" #include "glm/gtc/matrix_transform.hpp" +#include "GL/glew.h" -#include "Utility.h" #include "Texture.h" +#include "Shader.h" +#include "Utility.h" namespace nf { - Model::Model() : - m_base(false), - m_texture(nullptr) - { - - } - - void Model::create(const void* vertexBufferData, const size_t vertexBufferSize, const void* indexBufferData, size_t indexBufferCount, const void* normalsBufferData, size_t normalsBufferSize, const void* textureCoordinatesBufferData, size_t textureCoordinatesBufferSize, ATexture* texture) { - m_vao = new VertexArray; - m_vao->addBuffer(vertexBufferData, vertexBufferSize); + Material::Material(const void* vb, const size_t vbSize, const void* tc, const size_t tcSize, const void* vn, const size_t vnSize, const void* ib, const unsigned int ibCount, ATexture* diffTex, Vec3& diffColor, ATexture* specTex, float shininess) { + m_vao = new VertexArray(); + m_vao->addBuffer(vb, vbSize); m_vao->push(3); m_vao->finishBufferLayout(); - m_vao->addBuffer(textureCoordinatesBufferData, textureCoordinatesBufferSize); + m_vao->addBuffer(tc, tcSize); m_vao->push(2); m_vao->finishBufferLayout(); - m_vao->addBuffer(normalsBufferData, normalsBufferSize); + m_vao->addBuffer(vn, vnSize); m_vao->push(3); m_vao->finishBufferLayout(); - if (texture->alreadyLoaded) { - m_texture = texture->loadedTexture; + m_ib = new IndexBuffer(ib, ibCount); + if (diffTex) { + m_hasDiffuse = true; + m_diffuseTexture = new Texture(diffTex); } - else { - m_texture = new Texture; - m_texture->create(texture); - texture->alreadyLoaded = true; - texture->loadedTexture = m_texture; + m_diffColor = diffColor; + if (specTex) { + m_hasSpecular = true; + m_specularTexture = new Texture(specTex); } - m_ib = new IndexBuffer(indexBufferData, indexBufferCount); + m_shininess = shininess; } - void Model::bind() { - if (m_vao == nullptr) - Error("Tried to bind uninitialized model!"); + void Material::render(Shader* shader) { m_vao->bind(); - if (m_texture) - m_texture->bind(); m_ib->bind(); + if (m_hasDiffuse) { + shader->setUniform("material.hasDiffuseTex", true); + m_diffuseTexture->bind(); + } + else { + shader->setUniform("material.hasDiffuseTex", false); + glm::vec3 color(m_diffColor.x, m_diffColor.y, m_diffColor.z); + shader->setUniform("material.diffuseColor", color); + } + if (m_hasSpecular) { + shader->setUniform("material.hasSpecTex", true); + m_specularTexture->bind(1); + shader->setUniform("material.specularTexture", 1); + } + else + shader->setUniform("material.hasSpecTex", false); + shader->setUniform("material.specPower", m_shininess); + glDrawElements(GL_TRIANGLES, m_ib->getCount(), GL_UNSIGNED_INT, nullptr); + } + + Material::~Material() { + delete m_diffuseTexture; + delete m_specularTexture; + } + + Model::Model(AModel* model) : + m_base(false) + { + std::string obj = model->data; + unsigned int startMtlPos = obj.find("newmtl"); + if (startMtlPos == std::string::npos) + Error("No materials found in model!"); + std::string mtl = obj.substr(startMtlPos); + struct TempMaterial { + std::vector outVB; + std::vector unindexedVB; + std::vector vbIndices; + std::vector outTC; + std::vector unindexedTC; + std::vector tcIndices; + std::vector outVN; + std::vector unindexedVN; + std::vector vnIndices; + std::vector outIB; + unsigned int ibCount = 0; + + std::string diffuseTextureName; + Vec3 diffuseColor; + std::string specularTextureName; + float shininess = 1.0f; + }; + std::unordered_map mats; + std::string currMat; + while (true) { + char line[500]; + int result = sscanf_s(mtl.c_str(), "\n%s", line, (unsigned)_countof(line)); + if (result == EOF) + break; + if (std::strcmp(line, "newmtl") == 0) { + char matName[100]; + sscanf_s(mtl.c_str(), "\nnewmtl %s\n", matName, (unsigned)_countof(matName)); + currMat = matName; + mats[currMat] = new TempMaterial; + } + else if (std::strcmp(line, "Kd") == 0) { + float r = 0.0, g = 0.0, b = 0.0; + sscanf_s(mtl.c_str(), "\nKd %f %f %f\n", &r, &g, &b); + mats[currMat]->diffuseColor = Vec3(r, g, b); + } + else if (std::strcmp(line, "map_Kd") == 0) { + char texName[100]; + sscanf_s(mtl.c_str(), "\nmap_Kd %s\n", texName, (unsigned)_countof(texName)); + mats[currMat]->diffuseTextureName = (std::string)texName; + } + else if (std::strcmp(line, "map_Ks") == 0) { + char texName[100]; + sscanf_s(mtl.c_str(), "\nmap_Ks %s\n", texName, (unsigned)_countof(texName)); + mats[currMat]->specularTextureName = (std::string)texName; + } + else if (std::strcmp(line, "Ns") == 0) { + float s = 0.0; + sscanf_s(mtl.c_str(), "\nNs %f\n", &s); + mats[currMat]->shininess = s; + } + unsigned int pos = mtl.find(line) + strlen(line); + mtl = mtl.substr(pos); + } + + std::string file = obj.substr(0, startMtlPos); + std::vector vbRaw, tcRaw, vnRaw; + std::string usingMat; + + bool tcPresent = false, vnPresent = false; + while (true) { + char line[500]; + int remove = 0; + int result = sscanf_s(file.c_str(), "\n%s", line, (unsigned)_countof(line)); + if (result == EOF) + break; + if (std::strcmp(line, "v") == 0) { + float x = 0.0, y = 0.0, z = 0.0; + sscanf_s(file.c_str(), "\nv %f %f %f\n", &x, &y, &z); + remove = 28; + vbRaw.push_back(x); + vbRaw.push_back(y); + vbRaw.push_back(z); + } + else if (std::strcmp(line, "vt") == 0) { + tcPresent = true; + float u = 0.0, v = 0.0; + sscanf_s(file.c_str(), "\nvt %f %f\n", &u, &v); + remove = 18; + tcRaw.push_back(u); + tcRaw.push_back(v); + } + else if (std::strcmp(line, "vn") == 0) { + vnPresent = true; + float x = 0.0, y = 0.0, z = 0.0; + sscanf_s(file.c_str(), "\nvn %f %f %f\n", &x, &y, &z); + remove = 20; + vnRaw.push_back(x); + vnRaw.push_back(y); + vnRaw.push_back(z); + } + else if (std::strcmp(line, "usemtl") == 0) { + char matName[100]; + sscanf_s(file.c_str(), "\nusemtl %s\n", matName, (unsigned)_countof(matName)); + usingMat = matName; + remove = 5; + } + else if (std::strcmp(line, "f") == 0) { + unsigned int vertexIndex[3], uvIndex[3], vnIndex[3]; + sscanf_s(file.c_str(), "\nf %d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIndex[0], &uvIndex[0], &vnIndex[0], &vertexIndex[1], &uvIndex[1], &vnIndex[1], &vertexIndex[2], &uvIndex[2], &vnIndex[2]); + remove = 15; + mats[usingMat]->vbIndices.push_back(vertexIndex[0]); + mats[usingMat]->vbIndices.push_back(vertexIndex[1]); + mats[usingMat]->vbIndices.push_back(vertexIndex[2]); + mats[usingMat]->tcIndices.push_back(uvIndex[0]); + mats[usingMat]->tcIndices.push_back(uvIndex[1]); + mats[usingMat]->tcIndices.push_back(uvIndex[2]); + mats[usingMat]->vnIndices.push_back(vnIndex[0]); + mats[usingMat]->vnIndices.push_back(vnIndex[1]); + mats[usingMat]->vnIndices.push_back(vnIndex[2]); + } + + unsigned int pos = file.find(line) + strlen(line) + remove; + file = file.substr(pos); + } + + if (!tcPresent) + Error("No texture coordinates found in model!"); + if (!vnPresent) + Error("No normals found in model!"); + + for (auto& m : mats) { + std::string curr = m.first; + for (unsigned int i = 0; i < mats[curr]->vbIndices.size(); i++) { + unsigned int vertexIndex = mats[curr]->vbIndices[i]; + unsigned int uvIndex = mats[curr]->tcIndices[i]; + unsigned int vnIndex = mats[curr]->vnIndices[i]; + float vertexX = vbRaw[(vertexIndex - 1) * 3]; + float vertexY = vbRaw[(vertexIndex - 1) * 3 + 1]; + float vertexZ = vbRaw[(vertexIndex - 1) * 3 + 2]; + float vertexU = tcRaw[(uvIndex - 1) * 2]; + float vertexV = tcRaw[(uvIndex - 1) * 2 + 1]; + float vnX = vnRaw[(vnIndex - 1) * 3]; + float vnY = vnRaw[(vnIndex - 1) * 3 + 1]; + float vnZ = vnRaw[(vnIndex - 1) * 3 + 2]; + mats[curr]->unindexedVB.push_back(vertexX); + mats[curr]->unindexedVB.push_back(vertexY); + mats[curr]->unindexedVB.push_back(vertexZ); + mats[curr]->unindexedTC.push_back(vertexU); + mats[curr]->unindexedTC.push_back(vertexV); + mats[curr]->unindexedVN.push_back(vnX); + mats[curr]->unindexedVN.push_back(vnY); + mats[curr]->unindexedVN.push_back(vnZ); + } + } + + struct Vertex { + float x; + float y; + float z; + + float u; + float v; + + float vnX; + float vnY; + float vnZ; + + bool operator<(const Vertex other) const { + return std::memcmp((void*)this, (void*)&other, sizeof(Vertex)) > 0; + } + }; + for (auto& m : mats) { + std::string curr = m.first; + std::map vertexMap; + for (unsigned int i = 0; i * 3 < mats[curr]->unindexedVB.size(); i++) { + Vertex currVertex = { mats[curr]->unindexedVB[(i * 3)], mats[curr]->unindexedVB[(i * 3) + 1], mats[curr]->unindexedVB[(i * 3) + 2], mats[curr]->unindexedTC[(i * 2)], mats[curr]->unindexedTC[(i * 2) + 1], mats[curr]->unindexedVN[(i * 3)], mats[curr]->unindexedVN[(i * 3) + 1], mats[curr]->unindexedVN[(i * 3) + 2] }; + bool found = false; + found = vertexMap.find(currVertex) != vertexMap.end(); + if (found) { + unsigned int index = vertexMap[currVertex]; + mats[curr]->outIB.push_back(index); + mats[curr]->ibCount++; + } + else { + mats[curr]->outVB.push_back(currVertex.x); + mats[curr]->outVB.push_back(currVertex.y); + mats[curr]->outVB.push_back(currVertex.z); + mats[curr]->outTC.push_back(currVertex.u); + mats[curr]->outTC.push_back(currVertex.v); + mats[curr]->outVN.push_back(currVertex.vnX); + mats[curr]->outVN.push_back(currVertex.vnY); + mats[curr]->outVN.push_back(currVertex.vnZ); + unsigned int index = (mats[curr]->outVB.size() / 3) - 1; + mats[curr]->outIB.push_back(index); + vertexMap[currVertex] = index; + mats[curr]->ibCount++; + } + } + } + + for (auto& m : mats) { + TempMaterial& curr = *m.second; + ATexture* diff = nullptr; + if (curr.diffuseTextureName.size()) + diff = model->neededTextures[curr.diffuseTextureName]; + ATexture* spec = nullptr; + if (curr.specularTextureName.size()) + spec = model->neededTextures[curr.specularTextureName]; + m_materials.push_back(new Material(&curr.outVB[0], curr.outVB.size() * sizeof(float), &curr.outTC[0], curr.outTC.size() * sizeof(float), &curr.outVN[0], curr.outVN.size() * sizeof(float), &curr.outIB[0], curr.ibCount, diff, curr.diffuseColor, spec, curr.shininess)); + + delete m.second; + } + } + + void Model::render(Shader* shader) { + for (Material* curr : m_materials) { + curr->render(shader); + } } void Model::setBaseAsset(bool isBase) { @@ -55,6 +290,8 @@ namespace nf { } Model::~Model() { - delete m_texture; + for (Material* curr : m_materials) { + delete curr; + } } } \ No newline at end of file diff --git a/NothinFancy/src/Renderer/Drawable/Text.cpp b/NothinFancy/src/Renderer/Drawable/Text.cpp index e8b07fc..779a9a6 100644 --- a/NothinFancy/src/Renderer/Drawable/Text.cpp +++ b/NothinFancy/src/Renderer/Drawable/Text.cpp @@ -136,9 +136,11 @@ namespace nf { 1.0, 1.0, 1.0, 0.0 }; + glActiveTexture(GL_TEXTURE10); glBindTexture(GL_TEXTURE_2D, c.texID); m_vao->setBufferData(0, vb, sizeof(vb)); m_vao->setBufferData(1, tc, sizeof(tc)); + shader->setUniform("text", 10); glDrawArrays(GL_TRIANGLES, 0, 6); currX += (c.advance >> 6) * scale * m_scale; } diff --git a/NothinFancy/src/Renderer/Drawable/UITexture.cpp b/NothinFancy/src/Renderer/Drawable/UITexture.cpp index a2002ad..372bb5e 100644 --- a/NothinFancy/src/Renderer/Drawable/UITexture.cpp +++ b/NothinFancy/src/Renderer/Drawable/UITexture.cpp @@ -25,8 +25,7 @@ namespace nf { m_texture = tex->loadedTexture; } else { - m_texture = new Texture; - m_texture->create(tex); + m_texture = new Texture(tex); } m_vao = new VertexArray; diff --git a/NothinFancy/src/Renderer/Renderer.cpp b/NothinFancy/src/Renderer/Renderer.cpp index d673c91..147e017 100644 --- a/NothinFancy/src/Renderer/Renderer.cpp +++ b/NothinFancy/src/Renderer/Renderer.cpp @@ -155,15 +155,12 @@ namespace nf { m_entityShader->setUniform("proj", proj); for (Entity* draw : m_lGame) { Entity& curr = *draw; - curr.bind(m_entityShader); //TODO: Clean this up a bit m_entityShader->setUniform("numberOfLights", (int)m_lights.size() + 1); for (unsigned int i = 0; i < m_lights.size(); i++) { m_lights[i]->bind(m_entityShader, i); } - //TODO: Bind and draw every material here - m_entityShader->setUniform("material.shininess", 1.0f); - glDrawElements(GL_TRIANGLES, curr.getModel()->getIndexCount(), GL_UNSIGNED_INT, nullptr); + curr.render(m_entityShader); } m_lGame.clear(); m_lights.clear(); @@ -203,7 +200,9 @@ namespace nf { m_loadingText.setOpacity(opacity); m_loadingText.render(m_textShader, m_app->getConfig().width, m_app->getConfig().height); } - opacity -= 0.8 * dT; + if (dT > 1.0 / 60.0) + dT = 1.0 / 60.0; + opacity -= 2.5 * dT; if (opacity <= 0.0) { m_fadeIn = false; m_fadeOutComplete = false; @@ -221,7 +220,7 @@ namespace nf { m_loadingText.setOpacity(opacity); m_loadingText.render(m_textShader, m_app->getConfig().width, m_app->getConfig().height); } - opacity += 1.2 * dT; + opacity += 3.0 * dT; if (opacity >= 1.0) { m_fadeIn = false; m_fadeOutComplete = true; diff --git a/NothinFancy/src/Renderer/Texture.cpp b/NothinFancy/src/Renderer/Texture.cpp index 15b02cc..2d2b73f 100644 --- a/NothinFancy/src/Renderer/Texture.cpp +++ b/NothinFancy/src/Renderer/Texture.cpp @@ -8,16 +8,12 @@ #include "Utility.h" namespace nf { - Texture::Texture() : + Texture::Texture(ATexture* tex) : m_isBase(false), m_id(0), m_x(0), m_y(0) { - - } - - void Texture::create(ATexture* tex) { int nChannels; stbi_set_flip_vertically_on_load(true); unsigned char* texture = stbi_load_from_memory((unsigned char*)tex->data, tex->size, &m_x, &m_y, &nChannels, 0); @@ -33,8 +29,10 @@ namespace nf { m_isBase = tex->isBaseAsset; } - void Texture::bind() { + void Texture::bind(unsigned int slot) { + glActiveTexture(GL_TEXTURE0 + slot); glBindTexture(GL_TEXTURE_2D, m_id); + glActiveTexture(GL_TEXTURE0); } Vec2 Texture::getDimensions() { diff --git a/NothinFancy/src/Utility.cpp b/NothinFancy/src/Utility.cpp index 39bf2b6..a8aaa8b 100644 --- a/NothinFancy/src/Utility.cpp +++ b/NothinFancy/src/Utility.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include "glm/glm.hpp" #include "Config.h" @@ -110,133 +109,6 @@ namespace nf { } return read; } - - void parseOBJ(std::string& in, std::vector& vbOut, std::vector& ibOut, size_t& ibCountOut, std::vector& tcOut, std::vector& vnOut) { - std::string file = in; - std::vector vbRaw, tcRaw, vnRaw; - std::vector vertexIndices, uvIndices, vnIndices; - std::vector tempVertices, tempTC, tempVN; - - bool tcPresent = false, vnPresent = false; - while (true) { - char line[500]; - int remove = 0; - int result = sscanf_s(file.c_str(), "\n%s", line, (unsigned)_countof(line)); - if (result == EOF) - break; - if (std::strcmp(line, "v") == 0) { - float x = 0.0, y = 0.0, z = 0.0; - sscanf_s(file.c_str(), "\nv %f %f %f\n", &x, &y, &z); - remove = 28; - tempVertices.push_back(x); - tempVertices.push_back(y); - tempVertices.push_back(z); - } - else if (std::strcmp(line, "vt") == 0) { - tcPresent = true; - float u = 0.0, v = 0.0; - sscanf_s(file.c_str(), "\nvt %f %f\n", &u, &v); - remove = 18; - tempTC.push_back(u); - tempTC.push_back(v); - } - if (std::strcmp(line, "vn") == 0) { - vnPresent = true; - float x = 0.0, y = 0.0, z = 0.0; - sscanf_s(file.c_str(), "\nvn %f %f %f\n", &x, &y, &z); - remove = 20; - tempVN.push_back(x); - tempVN.push_back(y); - tempVN.push_back(z); - } - else if (std::strcmp(line, "f") == 0) { - unsigned int vertexIndex[3], uvIndex[3], vnIndex[3]; - sscanf_s(file.c_str(), "\nf %d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIndex[0], &uvIndex[0], &vnIndex[0], &vertexIndex[1], &uvIndex[1], &vnIndex[1], &vertexIndex[2], &uvIndex[2], &vnIndex[2]); - remove = 15; - vertexIndices.push_back(vertexIndex[0]); - vertexIndices.push_back(vertexIndex[1]); - vertexIndices.push_back(vertexIndex[2]); - uvIndices.push_back(uvIndex[0]); - uvIndices.push_back(uvIndex[1]); - uvIndices.push_back(uvIndex[2]); - vnIndices.push_back(vnIndex[0]); - vnIndices.push_back(vnIndex[1]); - vnIndices.push_back(vnIndex[2]); - } - - unsigned int pos = file.find(line) + strlen(line) + remove; - file = file.substr(pos); - } - - if (!tcPresent) - Error("No texture coordinates found in model!"); - if (!vnPresent) - Error("No normals found in model!"); - - for (unsigned int i = 0; i < vertexIndices.size(); i++) { - unsigned int vertexIndex = vertexIndices[i]; - unsigned int uvIndex = uvIndices[i]; - unsigned int vnIndex = vnIndices[i]; - float vertexX = tempVertices[(vertexIndex - 1) * 3]; - float vertexY = tempVertices[(vertexIndex - 1) * 3 + 1]; - float vertexZ = tempVertices[(vertexIndex - 1) * 3 + 2]; - float vertexU = tempTC[(uvIndex - 1) * 2]; - float vertexV = tempTC[(uvIndex - 1) * 2 + 1]; - float vnX = tempVN[(vnIndex - 1) * 3]; - float vnY = tempVN[(vnIndex - 1) * 3 + 1]; - float vnZ = tempVN[(vnIndex - 1) * 3 + 2]; - vbRaw.push_back(vertexX); - vbRaw.push_back(vertexY); - vbRaw.push_back(vertexZ); - tcRaw.push_back(vertexU); - tcRaw.push_back(vertexV); - vnRaw.push_back(vnX); - vnRaw.push_back(vnY); - vnRaw.push_back(vnZ); - } - - struct Vertex { - float x; - float y; - float z; - - float u; - float v; - - float vnX; - float vnY; - float vnZ; - - bool operator<(const Vertex other) const { - return std::memcmp((void*)this, (void*)&other, sizeof(Vertex)) > 0; - } - }; - std::map vertexMap; - for (unsigned int i = 0; i * 3 < vbRaw.size(); i++) { - Vertex curr = { vbRaw[(i * 3)], vbRaw[(i * 3) + 1], vbRaw[(i * 3) + 2], tcRaw[(i * 2)], tcRaw[(i * 2) + 1], vnRaw[(i * 3)], vnRaw[(i * 3) + 1], vnRaw[(i * 3) + 2] }; - bool found = false; - found = vertexMap.find(curr) != vertexMap.end(); - if (found) { - unsigned int index = vertexMap[curr]; - ibOut.push_back(index); - ibCountOut++; - } - else { - vbOut.push_back(curr.x); - vbOut.push_back(curr.y); - vbOut.push_back(curr.z); - tcOut.push_back(curr.u); - tcOut.push_back(curr.v); - vnOut.push_back(curr.vnX); - vnOut.push_back(curr.vnY); - vnOut.push_back(curr.vnZ); - unsigned int index = (vbOut.size() / 3) - 1; - ibOut.push_back(index); - vertexMap[curr] = index; - ibCountOut++; - } - } - } } //Nvidia Optimius support diff --git a/NothinFancy/src/include/Assets.h b/NothinFancy/src/include/Assets.h index 0297a21..bdf1d3c 100644 --- a/NothinFancy/src/include/Assets.h +++ b/NothinFancy/src/include/Assets.h @@ -1,5 +1,6 @@ #pragma once #include + #include "NFObject.h" namespace nf { @@ -14,12 +15,6 @@ namespace nf { virtual ~Asset(); }; - struct AModel : Asset { - Model* loadedModel = nullptr; - - ~AModel() override; - }; - struct ATexture : Asset { size_t size = 0; Texture* loadedTexture = nullptr; @@ -27,6 +22,14 @@ namespace nf { ~ATexture() override; }; + struct AModel : Asset { + Model* loadedModel = nullptr; + + std::unordered_map neededTextures; + + ~AModel() override; + }; + struct ACubemap : Asset { char* frontData = nullptr; size_t frontSize = 0; diff --git a/NothinFancy/src/include/Entity.h b/NothinFancy/src/include/Entity.h index dd7bc21..52178dd 100644 --- a/NothinFancy/src/include/Entity.h +++ b/NothinFancy/src/include/Entity.h @@ -11,7 +11,7 @@ namespace nf { public: Entity(); - void create(Asset* modelAsset, Asset* textureAsset = nullptr); + void create(Asset* modelAsset); bool isConstructed(); void setPosition(double x, double y, double z); @@ -22,7 +22,7 @@ namespace nf { void setScale(double x, double y, double z); void setScale(const Vec3& scale); - void bind(Shader* shader); + void render(Shader* shader); Model* getModel() const; void destroy() override; diff --git a/NothinFancy/src/include/Light.h b/NothinFancy/src/include/Light.h index 55c241f..26ea36d 100644 --- a/NothinFancy/src/include/Light.h +++ b/NothinFancy/src/include/Light.h @@ -13,7 +13,7 @@ namespace nf { }; Light(); - void create(const Vec3& position, const Vec3& color, float strength = 1.0f, Type type = Type::POINT); + void create(const Vec3& position, const Vec3& color, double strength = 1.0, Type type = Type::POINT); bool isConstructed(); void setPosition(const Vec3& position); void setColor(const Vec3& color); diff --git a/NothinFancy/src/include/Model.h b/NothinFancy/src/include/Model.h index 4cccc40..4254909 100644 --- a/NothinFancy/src/include/Model.h +++ b/NothinFancy/src/include/Model.h @@ -1,17 +1,34 @@ #pragma once #include "Drawable.h" #include "Assets.h" +#include "Utility.h" namespace nf { class Drawable; class Texture; + class Shader; - class Model : public Drawable { + class Material : public Drawable { public: - Model(); + Material(const void* vb, const size_t vbSize, const void* tc, const size_t tcSize, const void* vn, const size_t vnSize, const void* ib, const unsigned int ibCount, ATexture* diffTex, Vec3& diffColor, ATexture* specTex, float shininess); - void create(const void* vertexBufferData, const size_t vertexBufferSize, const void* indexBufferData, size_t indexBufferCount, const void* textureCoordinatesBufferData, size_t textureCoordinatesBufferSize, const void* normalsBufferData, size_t normalsBufferSize, ATexture* texture); - void bind() override; + void render(Shader* shader); + + ~Material(); + private: + bool m_hasDiffuse = false; + Texture* m_diffuseTexture = nullptr; + Vec3 m_diffColor; + bool m_hasSpecular = false; + Texture* m_specularTexture = nullptr; + float m_shininess; + }; + + class Model { + public: + Model(AModel* model); + + void render(Shader* shader); void setBaseAsset(bool isBase); bool isBaseAsset(); @@ -19,6 +36,6 @@ namespace nf { ~Model(); private: bool m_base; - Texture* m_texture; + std::vector m_materials; }; } \ No newline at end of file diff --git a/NothinFancy/src/include/Texture.h b/NothinFancy/src/include/Texture.h index 5a0cdfa..c2e67f7 100644 --- a/NothinFancy/src/include/Texture.h +++ b/NothinFancy/src/include/Texture.h @@ -6,10 +6,9 @@ namespace nf { class Texture { public: - Texture(); + Texture(ATexture* tex); - void create(ATexture* tex); - void bind(); + void bind(unsigned int slot = 0); Vec2 getDimensions(); bool isBaseAsset(); diff --git a/NothinFancy/src/include/Utility.h b/NothinFancy/src/include/Utility.h index 73ef03d..8b6792d 100644 --- a/NothinFancy/src/include/Utility.h +++ b/NothinFancy/src/include/Utility.h @@ -1,7 +1,6 @@ #pragma once #include #include -#include #include namespace nf { @@ -83,6 +82,4 @@ std::exit(-1);} const wchar_t* toWide(const std::string& in); void writeFile(const std::string& filename, const std::string& in, bool encrypted = false); std::string readFile(const std::string& filename); - - void parseOBJ(std::string& in, std::vector& vbOut, std::vector& ibOut, size_t& ibCountOut, std::vector& tcOut, std::vector& vnOut); } \ No newline at end of file