]> git.nega.tv - josh/narcissus/commitdiff
blĂ„haj bring up 🩈🩈🩈
authorJoshua Simmons <josh@nega.tv>
Sat, 12 Nov 2022 20:46:24 +0000 (21:46 +0100)
committerJoshua Simmons <josh@nega.tv>
Sat, 12 Nov 2022 20:46:24 +0000 (21:46 +0100)
12 files changed:
narcissus-gpu/src/lib.rs
narcissus-gpu/src/vulkan.rs
narcissus/data/blÄhaj.obj
narcissus/src/main.rs
narcissus/src/shaders/basic.frag.glsl [moved from narcissus/src/shaders/triangle.frag.glsl with 91% similarity]
narcissus/src/shaders/basic.frag.spv [new file with mode: 0644]
narcissus/src/shaders/basic.vert.glsl [new file with mode: 0644]
narcissus/src/shaders/basic.vert.spv [new file with mode: 0644]
narcissus/src/shaders/build.sh [new file with mode: 0755]
narcissus/src/shaders/triangle.frag.spv [deleted file]
narcissus/src/shaders/triangle.vert.glsl [deleted file]
narcissus/src/shaders/triangle.vert.spv [deleted file]

index 86263f1213428a11ab72a19e4942e2e11b3b416c..bcd5821e4b421c7b3968cef4e161c88ac1a0a9f8 100644 (file)
@@ -5,7 +5,7 @@ use narcissus_core::{flags_def, thread_token_def, Handle, PhantomUnsend};
 
 mod vulkan;
 
-#[derive(Clone, Copy, PartialEq, Eq, Hash)]
+#[derive(Clone, Copy, PartialEq, Eq, Hash, Default)]
 pub struct Texture(Handle);
 
 #[derive(Clone, Copy, PartialEq, Eq, Hash)]
@@ -68,6 +68,7 @@ pub enum TextureFormat {
     BGRA8_UNORM,
     RGBA8_SRGB,
     RGBA8_UNORM,
+    DEPTH_F32,
 }
 
 flags_def!(TextureUsageFlags);
@@ -154,6 +155,84 @@ pub struct SamplerDesc {
     pub max_lod: f32,
 }
 
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum Topology {
+    Points = 0,
+    Lines = 1,
+    LineStrip = 2,
+    Triangles = 3,
+    TriangleStrip = 4,
+}
+
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum PolygonMode {
+    Fill,
+    Line,
+    Point,
+}
+
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum CullingMode {
+    None,
+    Front,
+    Back,
+}
+
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum FrontFace {
+    Clockwise,
+    CounterClockwise,
+}
+
+#[derive(Copy, Clone, PartialEq, Eq)]
+pub enum CompareOp {
+    Never,
+    Less,
+    Equal,
+    LessOrEqual,
+    Greater,
+    NotEqual,
+    GreaterOrEqual,
+    Always,
+}
+
+#[derive(Copy, Clone, PartialEq, Eq)]
+pub enum StencilOp {
+    Keep,
+    Zero,
+    Replace,
+    IncrementAndClamp,
+    DecrementAndClamp,
+    Invert,
+    IncrementAndWrap,
+    DecrementAndWrap,
+}
+
+#[derive(Clone, Copy)]
+pub struct StencilOpState {
+    pub fail_op: StencilOp,
+    pub pass_op: StencilOp,
+    pub depth_fail_op: StencilOp,
+    pub compare_op: CompareOp,
+    pub compare_mask: u32,
+    pub write_mask: u32,
+    pub reference: u32,
+}
+
+impl Default for StencilOpState {
+    fn default() -> Self {
+        Self {
+            fail_op: StencilOp::Keep,
+            pass_op: StencilOp::Keep,
+            depth_fail_op: StencilOp::Keep,
+            compare_op: CompareOp::Never,
+            compare_mask: 0,
+            write_mask: 0,
+            reference: 0,
+        }
+    }
+}
+
 pub struct GraphicsPipelineLayout<'a> {
     pub color_attachment_formats: &'a [TextureFormat],
     pub depth_attachment_format: Option<TextureFormat>,
@@ -165,6 +244,16 @@ pub struct GraphicsPipelineDesc<'a> {
     pub fragment_shader: ShaderDesc<'a>,
     pub bind_group_layouts: &'a [BindGroupLayout],
     pub layout: GraphicsPipelineLayout<'a>,
+    pub topology: Topology,
+    pub polygon_mode: PolygonMode,
+    pub culling_mode: CullingMode,
+    pub front_face: FrontFace,
+    pub depth_compare_op: CompareOp,
+    pub depth_test_enable: bool,
+    pub depth_write_enable: bool,
+    pub stencil_test_enable: bool,
+    pub stencil_back: StencilOpState,
+    pub stencil_front: StencilOpState,
 }
 
 pub struct ComputePipelineDesc<'a> {
@@ -208,6 +297,12 @@ pub struct RenderingDesc<'a> {
     pub stencil_attachment: Option<RenderingAttachment>,
 }
 
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub enum IndexType {
+    U16,
+    U32,
+}
+
 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
 pub enum BindingType {
     Sampler,
@@ -238,7 +333,8 @@ pub struct Bind<'a> {
 pub enum TypedBind<'a> {
     Sampler(&'a [Sampler]),
     Texture(&'a [Texture]),
-    Buffer(&'a [Buffer]),
+    UniformBuffer(&'a [Buffer]),
+    StorageBuffer(&'a [Buffer]),
 }
 
 thread_token_def!(ThreadToken, GpuConcurrent, 8);
@@ -314,6 +410,14 @@ pub trait Device {
         bindings: &[Bind],
     );
 
+    fn cmd_set_index_buffer(
+        &self,
+        command_buffer_token: &CommandBufferToken,
+        buffer: Buffer,
+        offset: u64,
+        index_type: IndexType,
+    );
+
     fn cmd_set_pipeline(&self, command_buffer_token: &CommandBufferToken, pipeline: Pipeline);
 
     fn cmd_begin_rendering(
@@ -327,6 +431,7 @@ pub trait Device {
     fn cmd_end_rendering(&self, command_buffer_token: &CommandBufferToken);
 
     fn cmd_set_viewports(&self, command_buffer_token: &CommandBufferToken, viewports: &[Viewport]);
+
     fn cmd_set_scissors(&self, command_buffer_token: &CommandBufferToken, scissors: &[Scissor]);
 
     fn cmd_draw(
@@ -338,6 +443,16 @@ pub trait Device {
         first_instance: u32,
     );
 
+    fn cmd_draw_indexed(
+        &self,
+        command_buffer_token: &CommandBufferToken,
+        index_count: u32,
+        instance_count: u32,
+        first_index: u32,
+        vertex_offset: i32,
+        first_instance: u32,
+    );
+
     fn submit(
         &self,
         frame_token: &FrameToken,
index 76413c74664538ef49a58787664b882d4f347385..3b0362822b92f1dabd6e30dbf7d12c67376c3197 100644 (file)
@@ -15,10 +15,12 @@ use vulkan_sys as vk;
 
 use crate::{
     Bind, BindGroupLayout, BindGroupLayoutDesc, BindingType, Buffer, BufferDesc, BufferUsageFlags,
-    ClearValue, CommandBufferToken, ComputePipelineDesc, Device, FrameToken, GpuConcurrent,
-    GraphicsPipelineDesc, LoadOp, MemoryLocation, Pipeline, Sampler, SamplerAddressMode,
-    SamplerCompareOp, SamplerDesc, SamplerFilter, ShaderStageFlags, Texture, TextureDesc,
-    TextureDimension, TextureFormat, TextureUsageFlags, TextureViewDesc, ThreadToken, TypedBind,
+    ClearValue, CommandBufferToken, CompareOp, ComputePipelineDesc, CullingMode, Device,
+    FrameToken, FrontFace, GpuConcurrent, GraphicsPipelineDesc, IndexType, LoadOp, MemoryLocation,
+    Pipeline, PolygonMode, Sampler, SamplerAddressMode, SamplerCompareOp, SamplerDesc,
+    SamplerFilter, ShaderStageFlags, StencilOp, StencilOpState, Texture, TextureDesc,
+    TextureDimension, TextureFormat, TextureUsageFlags, TextureViewDesc, ThreadToken, Topology,
+    TypedBind,
 };
 
 const NUM_FRAMES: usize = 2;
@@ -50,6 +52,12 @@ fn vk_vec<T, F: FnMut(&mut u32, *mut T) -> vulkan_sys::Result>(mut f: F) -> Vec<
     v
 }
 
+#[must_use]
+fn vulkan_bool32(b: bool) -> vk::Bool32 {
+    const VALUES: [vk::Bool32; 2] = [vk::Bool32::False, vk::Bool32::True];
+    VALUES[b as usize]
+}
+
 #[must_use]
 fn vulkan_format(format: TextureFormat) -> vk::Format {
     match format {
@@ -57,6 +65,7 @@ fn vulkan_format(format: TextureFormat) -> vk::Format {
         TextureFormat::RGBA8_UNORM => vk::Format::R8G8B8A8_UNORM,
         TextureFormat::BGRA8_SRGB => vk::Format::B8G8R8A8_SRGB,
         TextureFormat::BGRA8_UNORM => vk::Format::B8G8R8A8_UNORM,
+        TextureFormat::DEPTH_F32 => vk::Format::D32_SFLOAT,
     }
 }
 
@@ -67,6 +76,7 @@ fn vulkan_aspect(format: TextureFormat) -> vk::ImageAspectFlags {
         | TextureFormat::BGRA8_UNORM
         | TextureFormat::RGBA8_SRGB
         | TextureFormat::RGBA8_UNORM => vk::ImageAspectFlags::COLOR,
+        TextureFormat::DEPTH_F32 => vk::ImageAspectFlags::DEPTH,
     }
 }
 
@@ -115,6 +125,92 @@ fn vulkan_descriptor_type(binding_type: BindingType) -> vk::DescriptorType {
     }
 }
 
+#[must_use]
+fn vulkan_index_type(index_type: IndexType) -> vk::IndexType {
+    match index_type {
+        IndexType::U16 => vk::IndexType::Uint16,
+        IndexType::U32 => vk::IndexType::Uint32,
+    }
+}
+
+#[must_use]
+fn vulkan_primitive_topology(primitive_topology: Topology) -> vk::PrimitiveTopology {
+    match primitive_topology {
+        Topology::Points => vk::PrimitiveTopology::PointList,
+        Topology::Lines => vk::PrimitiveTopology::LineList,
+        Topology::LineStrip => vk::PrimitiveTopology::LineStrip,
+        Topology::Triangles => vk::PrimitiveTopology::TriangleList,
+        Topology::TriangleStrip => vk::PrimitiveTopology::TriangleStrip,
+    }
+}
+
+#[must_use]
+fn vulkan_polygon_mode(polygon_mode: PolygonMode) -> vk::PolygonMode {
+    match polygon_mode {
+        PolygonMode::Fill => vk::PolygonMode::Fill,
+        PolygonMode::Line => vk::PolygonMode::Line,
+        PolygonMode::Point => vk::PolygonMode::Point,
+    }
+}
+
+#[must_use]
+fn vulkan_cull_mode(culling_mode: CullingMode) -> vk::CullModeFlags {
+    match culling_mode {
+        CullingMode::None => vk::CullModeFlags::NONE,
+        CullingMode::Front => vk::CullModeFlags::FRONT,
+        CullingMode::Back => vk::CullModeFlags::BACK,
+    }
+}
+
+#[must_use]
+fn vulkan_front_face(front_face: FrontFace) -> vk::FrontFace {
+    match front_face {
+        FrontFace::Clockwise => vk::FrontFace::Clockwise,
+        FrontFace::CounterClockwise => vk::FrontFace::CounterClockwise,
+    }
+}
+
+#[must_use]
+fn vulkan_compare_op(compare_op: CompareOp) -> vk::CompareOp {
+    match compare_op {
+        CompareOp::Never => vk::CompareOp::Never,
+        CompareOp::Less => vk::CompareOp::Less,
+        CompareOp::Equal => vk::CompareOp::Equal,
+        CompareOp::LessOrEqual => vk::CompareOp::LessOrEqual,
+        CompareOp::Greater => vk::CompareOp::Greater,
+        CompareOp::NotEqual => vk::CompareOp::NotEqual,
+        CompareOp::GreaterOrEqual => vk::CompareOp::GreaterOrEqual,
+        CompareOp::Always => vk::CompareOp::Always,
+    }
+}
+
+#[must_use]
+fn vulkan_stencil_op(stencil_op: StencilOp) -> vk::StencilOp {
+    match stencil_op {
+        StencilOp::Keep => vk::StencilOp::Keep,
+        StencilOp::Zero => vk::StencilOp::Zero,
+        StencilOp::Replace => vk::StencilOp::Replace,
+        StencilOp::IncrementAndClamp => vk::StencilOp::IncrementAndClamp,
+        StencilOp::DecrementAndClamp => vk::StencilOp::DecrementAndClamp,
+        StencilOp::Invert => vk::StencilOp::Invert,
+        StencilOp::IncrementAndWrap => vk::StencilOp::IncrementAndWrap,
+        StencilOp::DecrementAndWrap => vk::StencilOp::DecrementAndWrap,
+    }
+}
+
+#[must_use]
+fn vulkan_stencil_op_state(stencil_op_state: StencilOpState) -> vk::StencilOpState {
+    vk::StencilOpState {
+        fail_op: vulkan_stencil_op(stencil_op_state.fail_op),
+        pass_op: vulkan_stencil_op(stencil_op_state.pass_op),
+        depth_fail_op: vulkan_stencil_op(stencil_op_state.depth_fail_op),
+        compare_op: vulkan_compare_op(stencil_op_state.compare_op),
+        compare_mask: stencil_op_state.compare_mask,
+        write_mask: stencil_op_state.write_mask,
+        reference: stencil_op_state.reference,
+    }
+}
+
 struct DelayQueue<T> {
     delay: u64,
     counter: u64,
@@ -1332,20 +1428,45 @@ impl<'driver> Device for VulkanDevice<'driver> {
             },
         ];
 
+        let topology = vulkan_primitive_topology(desc.topology);
+        let polygon_mode = vulkan_polygon_mode(desc.polygon_mode);
+        let cull_mode = vulkan_cull_mode(desc.culling_mode);
+        let front_face = vulkan_front_face(desc.front_face);
+        let depth_compare_op = vulkan_compare_op(desc.depth_compare_op);
+        let depth_test_enable = vulkan_bool32(desc.depth_test_enable);
+        let depth_write_enable = vulkan_bool32(desc.depth_write_enable);
+        let stencil_test_enable = vulkan_bool32(desc.stencil_test_enable);
+        let back = vulkan_stencil_op_state(desc.stencil_back);
+        let front = vulkan_stencil_op_state(desc.stencil_front);
+
         let vertex_input_state = vk::PipelineVertexInputStateCreateInfo::default();
         let input_assembly_state = vk::PipelineInputAssemblyStateCreateInfo {
-            topology: vk::PrimitiveTopology::TriangleList,
+            topology,
             ..default()
         };
         let viewport_state = vk::PipelineViewportStateCreateInfo::default();
         let rasterization_state = vk::PipelineRasterizationStateCreateInfo {
             line_width: 1.0,
+            polygon_mode,
+            cull_mode,
+            front_face,
             ..default()
         };
         let multisample_state = vk::PipelineMultisampleStateCreateInfo {
             rasterization_samples: vk::SampleCountFlags::SAMPLE_COUNT_1,
             ..default()
         };
+        let depth_stencil_state = vk::PipelineDepthStencilStateCreateInfo {
+            depth_compare_op,
+            depth_test_enable,
+            depth_write_enable,
+            min_depth_bounds: 0.0,
+            max_depth_bounds: 1.0,
+            stencil_test_enable,
+            back,
+            front,
+            ..default()
+        };
         let color_blend_attachments = &[vk::PipelineColorBlendAttachmentState {
             color_write_mask: vk::ColorComponentFlags::R
                 | vk::ColorComponentFlags::G
@@ -1372,7 +1493,6 @@ impl<'driver> Device for VulkanDevice<'driver> {
                 .copied()
                 .map(vulkan_format),
         );
-
         let pipeline_rendering_create_info = vk::PipelineRenderingCreateInfo {
             view_mask: 0,
             color_attachment_formats: color_attachment_formats.into(),
@@ -1398,6 +1518,7 @@ impl<'driver> Device for VulkanDevice<'driver> {
             viewport_state: Some(&viewport_state),
             rasterization_state: Some(&rasterization_state),
             multisample_state: Some(&multisample_state),
+            depth_stencil_state: Some(&depth_stencil_state),
             color_blend_state: Some(&color_blend_state),
             dynamic_state: Some(&dynamic_state),
             layout,
@@ -1992,7 +2113,7 @@ impl<'driver> Device for VulkanDevice<'driver> {
                     ..default()
                 }
             }
-            TypedBind::Buffer(buffers) => {
+            TypedBind::UniformBuffer(buffers) => {
                 let buffer_infos_iter = buffers.iter().map(|buffer| {
                     let buffer = self.buffer_pool.lock().get(buffer.0).unwrap().buffer;
                     vk::DescriptorBufferInfo {
@@ -2012,6 +2133,26 @@ impl<'driver> Device for VulkanDevice<'driver> {
                     ..default()
                 }
             }
+            TypedBind::StorageBuffer(buffers) => {
+                let buffer_infos_iter = buffers.iter().map(|buffer| {
+                    let buffer = self.buffer_pool.lock().get(buffer.0).unwrap().buffer;
+                    vk::DescriptorBufferInfo {
+                        buffer,
+                        offset: 0,
+                        range: !0,
+                    }
+                });
+                let buffer_infos = arena.alloc_slice_fill_iter(buffer_infos_iter);
+                vk::WriteDescriptorSet {
+                    dst_set: descriptor_set,
+                    dst_binding: bind.binding,
+                    dst_array_element: bind.array_element,
+                    descriptor_count: buffer_infos.len() as u32,
+                    descriptor_type: vk::DescriptorType::StorageBuffer,
+                    buffer_info: buffer_infos.as_ptr(),
+                    ..default()
+                }
+            }
         });
         let write_descriptors = arena.alloc_slice_fill_iter(write_descriptors_iter);
 
@@ -2040,6 +2181,22 @@ impl<'driver> Device for VulkanDevice<'driver> {
         }
     }
 
+    fn cmd_set_index_buffer(
+        &self,
+        command_buffer_token: &CommandBufferToken,
+        buffer: Buffer,
+        offset: u64,
+        index_type: IndexType,
+    ) {
+        let buffer = self.buffer_pool.lock().get(buffer.0).unwrap().buffer;
+        let command_buffer = vk::CommandBuffer::from_raw(command_buffer_token.raw);
+        let index_type = vulkan_index_type(index_type);
+        unsafe {
+            self.device_fn
+                .cmd_bind_index_buffer(command_buffer, buffer, offset, index_type)
+        }
+    }
+
     fn cmd_set_pipeline(&self, command_buffer_token: &CommandBufferToken, pipeline: Pipeline) {
         let command_buffer = vk::CommandBuffer::from_raw(command_buffer_token.raw);
         let VulkanPipeline {
@@ -2146,6 +2303,35 @@ impl<'driver> Device for VulkanDevice<'driver> {
             })
             .collect::<Vec<_>>();
 
+        let depth_attachment = desc.depth_attachment.as_ref().map(|attachment| {
+            let image_view = match self.texture_pool.lock().get(attachment.texture.0).unwrap() {
+                VulkanTextureHolder::Unique(texture) => texture.view,
+                VulkanTextureHolder::Shared(texture) => texture.view,
+                VulkanTextureHolder::Swapchain(_) => panic!(),
+            };
+
+            let (load_op, clear_value) = match attachment.load_op {
+                LoadOp::Load => (vk::AttachmentLoadOp::Load, vk::ClearValue::default()),
+                LoadOp::Clear(clear_value) => {
+                    (vk::AttachmentLoadOp::Clear, vulkan_clear_value(clear_value))
+                }
+                LoadOp::DontCare => (vk::AttachmentLoadOp::DontCare, vk::ClearValue::default()),
+            };
+
+            let store_op = match attachment.store_op {
+                crate::StoreOp::Store => vk::AttachmentStoreOp::Store,
+                crate::StoreOp::DontCare => vk::AttachmentStoreOp::DontCare,
+            };
+            vk::RenderingAttachmentInfo {
+                image_view,
+                image_layout: vk::ImageLayout::DepthAttachmentOptimal,
+                load_op,
+                store_op,
+                clear_value,
+                ..default()
+            }
+        });
+
         let rendering_info = vk::RenderingInfo {
             flags: vk::RenderingFlags::default(),
             render_area: vk::Rect2d {
@@ -2161,7 +2347,7 @@ impl<'driver> Device for VulkanDevice<'driver> {
             layer_count: 1,
             view_mask: 0,
             color_attachments: color_attachments.as_slice().into(),
-            depth_attachment: None,
+            depth_attachment: depth_attachment.as_ref(),
             stencil_attachment: None,
             ..default()
         };
@@ -2224,6 +2410,28 @@ impl<'driver> Device for VulkanDevice<'driver> {
         }
     }
 
+    fn cmd_draw_indexed(
+        &self,
+        command_buffer_token: &CommandBufferToken,
+        index_count: u32,
+        instance_count: u32,
+        first_index: u32,
+        vertex_offset: i32,
+        first_instance: u32,
+    ) {
+        let command_buffer = vk::CommandBuffer::from_raw(command_buffer_token.raw);
+        unsafe {
+            self.device_fn.cmd_draw_indexed(
+                command_buffer,
+                index_count,
+                instance_count,
+                first_index,
+                vertex_offset,
+                first_instance,
+            )
+        }
+    }
+
     fn submit(
         &self,
         frame_token: &FrameToken,
@@ -2512,11 +2720,13 @@ impl<'app> Drop for VulkanDevice<'app> {
         {
             let mut image_views = Vec::new();
             let mut images = Vec::new();
+            let mut memories = Vec::new();
             for texture in self.texture_pool.get_mut().values() {
                 match texture {
                     VulkanTextureHolder::Unique(texture) => {
                         image_views.push(texture.view);
-                        images.push(texture.texture.image)
+                        images.push(texture.texture.image);
+                        memories.push(texture.texture.memory.memory);
                     }
                     VulkanTextureHolder::Shared(texture) => {
                         image_views.push(texture.view);
@@ -2534,6 +2744,10 @@ impl<'app> Drop for VulkanDevice<'app> {
             for image in images {
                 unsafe { device_fn.destroy_image(device, image, None) }
             }
+
+            for memory in memories {
+                unsafe { device_fn.free_memory(device, memory, None) }
+            }
         }
 
         for sampler in self.sampler_pool.get_mut().values() {
index 0c5da9af2e12aa36b46235c682e5c16797e1b9e6..13dc6e86ad2f632e0f2d6d03c8a67014005f98a3 100644 (file)
@@ -1,4 +1,5 @@
-mtllib blĂ„haj.mtl
+# Blender 3.3.1
+# www.blender.org
 o BlĂ„haj
 v -0.513672 0.477227 -0.487855
 v 0.101348 1.145127 -0.448955
@@ -154,824 +155,1027 @@ v -0.517875 0.803125 -1.331638
 v -0.352151 0.564260 -1.388249
 v -0.442642 0.646515 -1.430377
 v -0.330108 0.609184 -1.403527
-vt 0.625330 0.143403
-vt 0.658445 0.124408
-vt 0.624013 0.200651
-vt 0.990716 0.589020
-vt 0.966159 0.581131
-vt 0.996827 0.555363
-vt 0.502189 0.954105
-vt 0.505948 0.982298
-vt 0.451646 0.945813
-vt 0.627160 0.093605
-vt 0.418993 0.937994
-vt 0.414665 0.966085
-vt 0.400551 0.934063
-vt 0.631341 0.006301
-vt 0.660360 0.000423
-vt 0.629700 0.049073
-vt 0.350544 0.282011
-vt 0.378198 0.316758
-vt 0.349109 0.330593
-vt 0.388162 0.932934
-vt 0.883200 0.931219
-vt 0.898668 0.949748
-vt 0.883312 0.949096
-vt 0.353316 0.121756
-vt 0.389800 0.142834
-vt 0.351643 0.176375
-vt 0.882784 0.973289
-vt 0.854365 0.977751
-vt 0.882572 0.920890
-vt 0.622342 0.738821
-vt 0.661532 0.816979
-vt 0.624220 0.786943
-vt 0.469432 0.845635
-vt 0.483257 0.858220
-vt 0.468829 0.855653
-vt 0.624083 0.299966
-vt 0.659898 0.307249
-vt 0.621388 0.351539
-vt 0.360989 0.041164
-vt 0.396072 0.063440
-vt 0.356102 0.078724
-vt 0.626586 0.826377
-vt 0.435967 0.838245
-vt 0.467713 0.842688
-vt 0.434196 0.862717
-vt 0.826493 0.526367
-vt 0.860094 0.526273
-vt 0.827576 0.543349
-vt 0.826493 0.452269
-vt 0.860913 0.470126
-vt 0.826041 0.482807
-vt 0.435967 0.885722
-vt 0.453973 0.891755
-vt 0.439846 0.900826
-vt 0.849666 0.170791
-vt 0.841745 0.084642
-vt 0.952907 0.078470
-vt 0.374973 0.408696
-vt 0.415398 0.443676
-vt 0.372884 0.486082
-vt 0.959580 0.720492
-vt 0.951697 0.798935
-vt 0.912973 0.747024
-vt 0.672209 0.261514
-vt 0.758163 0.309282
-vt 0.489397 0.551720
-vt 0.393171 0.556814
-vt 0.689288 0.126948
-vt 0.218719 0.718047
-vt 0.134018 0.753678
-vt 0.104744 0.541273
-vt 0.042952 0.361542
-vt 0.092956 0.374659
-vt 0.215653 0.221039
-vt 0.170309 0.250413
-vt 0.180460 0.115857
-vt 0.657475 0.667397
-vt 0.753361 0.625230
-vt 0.918403 0.548140
-vt 0.942709 0.557990
-vt 0.951524 0.600165
-vt 0.040634 0.839054
-vt 0.044556 0.837767
-vt 0.041603 0.836825
-vt 0.639862 0.935377
-vt 0.630940 0.965289
-vt 0.658907 0.932934
-vt 0.674371 0.137246
-vt 0.505948 0.982298
-vt 0.963197 0.597326
-vt 0.991519 0.631614
-vt 0.882784 0.900280
-vt 0.898403 0.881541
-vt 0.885504 0.864373
-vt 0.964629 0.448203
-vt 0.995501 0.432985
-vt 0.964842 0.422654
-vt 0.994213 0.659673
-vt 0.414665 0.966086
-vt 0.618426 0.569585
-vt 0.659918 0.508898
-vt 0.618333 0.508235
-vt 0.885504 0.957616
-vt 0.898384 0.948530
-vt 0.965556 0.410896
-vt 0.660595 -0.000060
-vt 0.378985 0.319260
-vt 0.372640 0.827080
-vt 0.401226 0.826293
-vt 0.375469 0.808152
-vt 0.619455 0.448548
-vt 0.389800 0.142834
-vt 0.471110 0.866632
-vt 0.483257 0.858220
-vt 0.565802 0.947126
-vt 0.933128 0.663956
-vt 0.920492 0.667761
-vt 0.934021 0.673637
-vt 0.661532 0.816979
-vt 0.853639 0.886837
-vt 0.882784 0.864372
-vt 0.668909 0.306138
-vt 0.396072 0.063440
-vt 0.613281 0.939128
-vt 0.467713 0.842688
-vt 0.623391 0.253481
-vt 0.965556 0.543349
-vt 0.995374 0.540892
-vt 0.963851 0.494541
-vt 0.860094 0.526273
-vt 0.369791 0.662381
-vt 0.384261 0.686618
-vt 0.365385 0.614972
-vt 0.860914 0.470126
-vt 0.453973 0.891755
-vt 0.952941 0.078441
-vt 0.961933 0.035254
-vt 0.841745 0.084642
-vt 0.415398 0.443676
-vt 0.374973 0.408696
-vt 0.372884 0.486082
-vt 0.867019 0.796088
-vt 0.937325 0.790617
-vt 0.912973 0.747024
-vt 0.489700 0.552446
-vt 0.393098 0.556884
-vt 0.134329 0.755598
-vt 0.189257 0.845380
-vt 0.220383 0.706825
-vt 0.901949 0.718982
-vt 0.961313 0.697559
-vt 0.105711 0.541948
-vt 0.757081 0.309561
-vt 0.093203 0.375171
-vt 0.042952 0.361542
-vt 0.064557 0.150736
-vt 0.116942 0.194662
-vt 0.124760 0.088981
-vt 0.170289 0.250234
-vt 0.215096 0.219436
-vt 0.180460 0.115857
-vt 0.088711 0.002435
-vt 0.146307 0.004447
-vt 0.753444 0.626844
-vt 0.657475 0.667397
-vt 0.490952 0.158111
-vt 0.220442 0.378064
-vt 0.174124 0.350301
-vt 0.202571 0.534959
-vt 0.745671 0.902251
-vt 0.741267 0.952410
-vt 0.768948 0.976605
-vt 0.951800 0.288159
-vt 0.977483 0.324616
-vt 0.988781 0.256596
-vt 0.942709 0.557990
-vt 0.918403 0.548140
-vt 0.951524 0.600165
-vt 0.630940 0.965289
-vt 0.995501 0.432985
-vt 0.995026 0.540717
-vt 0.971778 0.653302
-vt 0.424020 0.744855
-vt 0.375946 0.766544
-vt 0.373410 0.718110
-vt 0.383936 0.686491
+vn -0.4237 -0.9023 -0.0801
+vn 0.8144 -0.0584 0.5773
+vn 0.9122 -0.0427 0.4076
+vn -0.3507 -0.9300 -0.1104
+vn 0.9467 0.0527 0.3176
+vn -0.3869 -0.8910 0.2377
+vn 0.3994 0.9090 0.1190
+vn 0.8467 -0.2037 0.4915
+vn 0.0069 0.6847 0.7288
+vn 0.4080 0.9117 0.0493
+vn -0.3668 0.8849 0.2869
+vn -0.7005 -0.7125 -0.0408
+vn -0.1028 0.7783 0.6194
+vn -0.2840 -0.9571 -0.0581
+vn 0.0799 0.9967 -0.0174
+vn -0.7548 -0.6382 -0.1515
+vn -0.2180 0.8976 0.3833
+vn -0.2033 0.9784 -0.0381
+vn -0.9638 0.1202 -0.2380
+vn 0.4267 0.3986 0.8118
+vn -0.1798 0.0106 0.9837
+vn 0.5139 0.7617 0.3945
+vn -0.2383 -0.0064 0.9712
+vn -0.5983 -0.7587 0.2578
+vn 0.6986 0.4351 0.5680
+vn -0.2621 -0.8972 0.3555
+vn 0.2750 0.7823 0.5588
+vn -0.4531 -0.7983 0.3966
+vn 0.1391 -0.1594 0.9774
+vn -0.4513 -0.8446 0.2881
+vn 0.3569 0.4126 0.8380
+vn -0.5270 -0.3780 0.7612
+vn -0.7210 -0.6092 0.3301
+vn 0.3440 -0.5041 0.7922
+vn -0.1708 -0.0000 0.9853
+vn 0.6382 -0.7570 -0.1398
+vn -0.4179 -0.9016 -0.1117
+vn 0.9961 -0.0427 -0.0769
+vn -0.3591 -0.9311 -0.0647
+vn 0.7851 -0.5223 -0.3329
+vn 0.0824 0.7189 -0.6902
+vn -0.6186 -0.4547 -0.6408
+vn 0.6491 -0.7574 -0.0716
+vn 0.9984 0.0527 0.0195
+vn -0.5358 -0.8380 -0.1031
+vn 0.7167 0.2705 -0.6427
+vn -0.4366 -0.5798 -0.6879
+vn -0.2849 -0.8916 -0.3521
+vn 0.4158 0.9091 0.0248
+vn 0.9627 -0.2037 -0.1779
+vn 0.0723 0.9510 -0.3006
+vn 0.2518 0.6935 -0.6750
+vn -0.4429 -0.8924 -0.0869
+vn 0.4008 0.9117 0.0909
+vn 0.8210 0.4866 -0.2986
+vn 0.6772 -0.6972 -0.2351
+vn 0.9061 -0.1873 -0.3794
+vn -0.6734 -0.7125 -0.1972
+vn -0.3086 0.8291 -0.4663
+vn 0.1116 0.7783 -0.6179
+vn -0.2903 -0.9567 -0.0211
+vn 0.0694 0.9967 0.0433
+vn 0.5073 -0.8490 0.1478
+vn -0.7618 -0.6382 -0.1114
+vn -0.0707 0.8870 -0.4563
+vn -0.6018 -0.7963 -0.0620
+vn -0.7723 -0.3531 -0.5281
+vn -0.2043 0.9784 -0.0325
+vn 0.7669 0.5954 0.2396
+vn -0.9877 0.1202 -0.1002
+vn 0.6750 0.3986 -0.6209
+vn 0.1747 -0.0014 -0.9846
+vn 0.6946 0.7191 -0.0192
+vn 0.2345 0.0391 -0.9713
+vn 0.8489 0.4356 -0.2993
+vn 0.3175 -0.1121 -0.9416
+vn -0.4411 0.6661 0.6015
+vn 0.4279 -0.1971 -0.8820
+vn -0.3890 -0.8215 -0.4169
+vn 0.6208 0.4146 -0.6654
+vn 0.0559 0.4367 -0.8979
+vn -0.2397 -0.3769 -0.8947
+vn -0.4549 0.3624 -0.8135
+vn -0.5687 -0.6097 -0.5521
+vn 0.3118 0.8664 -0.3902
+vn -0.0881 -0.5021 -0.8603
+vn 0.3703 0.6162 -0.6952
+vn -0.3983 0.3446 -0.8501
+vn 0.5905 -0.5041 -0.6302
+vn 0.5540 -0.7570 0.3464
+vn -0.7843 -0.4849 0.3871
+vn 0.4620 0.8847 0.0628
+vn 0.7276 -0.6363 0.2564
+vn 0.9762 0.0368 0.2139
+vn 0.7083 0.6721 0.2159
+vn -0.5483 -0.8332 -0.0715
+vn -0.1547 0.7189 0.6776
+vn -0.2526 -0.9667 0.0400
+vn -0.7982 -0.4547 0.3952
+vn 0.4362 0.8987 0.0448
+vn 0.5446 -0.7322 0.4089
+vn -0.0505 0.6476 0.7603
+vn 0.2157 -0.5595 0.8003
+vn 0.1485 0.9888 0.0115
+vn -0.5393 -0.8380 -0.0832
+vn 0.4248 0.2571 0.8680
+vn -0.6427 -0.5798 0.5008
+vn 0.5078 -0.7663 0.3937
+vn -0.0426 0.9320 0.3600
+vn -0.4463 -0.8924 -0.0672
+vn 0.4817 -0.4231 0.7674
+vn -0.7150 -0.6843 -0.1436
+vn -0.2128 0.6238 0.7521
+vn -0.4215 -0.9068 -0.0045
+vn 0.2430 0.9605 0.1359
+vn 0.6726 0.4866 0.5575
+vn -0.3923 0.8986 0.1964
+vn 0.5586 -0.6972 0.4493
+vn 0.7256 -0.1872 0.6622
+vn 0.9110 0.4016 -0.0943
+vn 0.5274 -0.8490 0.0315
+vn -0.5412 -0.8389 -0.0580
+vn -0.1228 0.9912 0.0489
+vn 0.5278 -0.7825 0.3302
+vn 0.7650 0.6005 0.2328
+vn -0.9788 -0.1950 -0.0631
+vn 0.0783 0.6614 0.7459
+vn -0.8611 0.5064 -0.0464
+vn -0.4609 -0.8872 -0.0205
+vn -0.9055 -0.3535 0.2345
+vn -0.1786 -0.0037 0.9839
+vn 0.8018 0.5960 0.0432
+vn 0.6709 0.4046 0.6214
+vn -0.1815 0.0080 0.9834
+vn -0.1707 0.0040 0.9853
+vn 0.0400 -0.0758 0.9963
+vn -0.1476 0.0037 0.9890
+vn -0.8245 -0.0621 0.5625
+vn 0.7661 0.6322 0.1162
+vn -0.5565 -0.7751 0.2991
+vn -0.4349 -0.8517 0.2924
+vn 0.5790 0.5980 0.5542
+vn 0.3402 0.8179 0.4640
+vn -0.2495 0.4367 0.8643
+vn 0.1475 -0.1544 0.9769
+vn -0.2357 0.7120 0.6615
+vn -0.7021 0.3624 0.6130
+vn 0.3440 0.8002 0.4913
+vn 0.4326 0.4716 0.7684
+vn -0.1764 0.0197 0.9841
+vn 0.1623 0.8664 0.4723
+vn -0.7179 -0.6214 0.3137
+vn -0.0712 -0.1028 0.9922
+vn 0.4012 0.8000 0.4462
+vn -0.4840 0.8723 0.0694
+vn -0.4189 -0.0718 0.9052
+vn 0.0759 0.4576 0.8859
+vn -0.3719 -0.4950 0.7852
+vn -0.4631 -0.8077 -0.3648
+vn 0.1147 0.6162 0.7792
+vn -0.6612 0.3446 0.6664
+vn 0.7584 0.1148 0.6416
+vn -0.6281 -0.7708 0.1066
+vn -0.2173 -0.3641 0.9057
+vn 0.9985 -0.0316 -0.0452
+vn -0.1258 0.6090 -0.7832
+vn -0.5755 -0.4120 -0.7065
+vn 0.4858 0.8738 0.0231
+vn 0.9912 0.0368 0.1270
+vn 0.7410 0.6703 0.0405
+vn -0.5404 -0.8332 -0.1172
+vn -0.2258 -0.9656 -0.1290
+vn 0.4785 0.8769 0.0467
+vn 0.2098 0.6467 -0.7334
+vn 0.4724 -0.5595 -0.6810
+vn 0.6841 -0.7085 -0.1735
+vn 0.4284 0.8493 -0.3083
+vn 0.7226 -0.4136 -0.5539
+vn -0.7288 -0.6683 -0.1494
+vn -0.2790 0.9168 -0.2859
+vn -0.1007 0.6220 -0.7765
+vn -0.4057 -0.8831 -0.2355
+vn 0.2745 0.9605 -0.0462
+vn 0.8321 0.4234 0.3581
+vn -0.0992 0.9912 -0.0874
+vn 0.6012 -0.7866 -0.1406
+vn 0.7751 0.6257 0.0876
+vn -0.9456 -0.2275 -0.2326
+vn 0.3176 0.6614 -0.6794
+vn -0.8265 0.5064 -0.2460
+vn -0.4462 -0.8710 -0.2058
+vn 0.1671 0.0042 -0.9859
+vn 0.8524 0.4570 -0.2542
+vn 0.1655 -0.0078 -0.9862
+vn 0.1358 0.0079 -0.9907
+vn -0.5871 -0.0621 -0.8071
+vn 0.4546 -0.0134 -0.8906
+vn 0.7602 0.6320 0.1504
+vn 0.4451 0.7928 -0.4163
+vn -0.4246 -0.7741 -0.4696
+vn -0.3259 -0.8521 -0.4095
+vn 0.7312 0.5976 -0.3288
+vn 0.4734 0.8212 -0.3187
+vn 0.4660 -0.1733 -0.8677
+vn -0.0377 0.7116 -0.7016
+vn 0.4767 0.8199 -0.3170
+vn 0.6661 0.4709 -0.5784
+vn 0.1653 0.0256 -0.9859
+vn -0.5708 -0.6202 -0.5381
+vn 0.3368 -0.0783 -0.9383
+vn 0.5784 0.7093 -0.4030
+vn -0.3454 0.8636 -0.3672
+vn -0.0899 -0.0717 -0.9934
+vn 0.3716 0.4987 -0.7831
+vn -0.5588 -0.8086 0.1841
+vn 0.9270 0.0920 -0.3637
+vn -0.5288 -0.8394 -0.1255
+vn 0.1002 -0.3641 -0.9260
+vn -0.3650 0.6190 0.6954
+vn -0.7795 -0.4108 0.4729
+vn 0.4652 0.8738 0.1418
+vn 0.7222 -0.5677 0.3951
+vn 0.9415 0.0981 0.3223
+vn 0.6548 0.7146 0.2460
+vn -0.5502 -0.8307 -0.0847
+vn -0.2683 -0.9632 -0.0136
+vn 0.4676 0.8771 0.1102
+vn 0.0234 0.6818 0.7312
+vn 0.1547 -0.5982 0.7863
+vn 0.2953 0.8757 0.3821
+vn 0.5080 0.0618 0.8592
+vn -0.7365 -0.6683 -0.1046
+vn -0.3535 0.6241 0.6968
+vn -0.4621 -0.8820 0.0929
+vn 0.2755 0.9565 0.0960
+vn -0.4477 0.8389 0.3096
+vn 0.8002 0.5543 0.2292
+vn -0.5855 -0.7959 -0.1540
+vn -0.1257 0.9907 0.0517
+vn 0.5189 -0.7866 0.3347
+vn 0.7582 0.6249 0.1862
+vn -0.9687 -0.2275 -0.0991
+vn 0.0404 0.6609 0.7493
+vn -0.8159 0.5640 -0.1271
+vn -0.4824 -0.8744 -0.0527
+vn -0.1777 -0.0030 0.9841
+vn 0.1016 -0.0339 0.9942
+vn -0.8106 -0.1201 0.5732
+vn -0.5731 -0.7728 0.2727
+vn -0.4496 -0.8551 0.2581
+vn -0.2716 0.7116 0.6480
+vn 0.3403 0.8179 0.4640
+vn -0.1753 -0.0009 0.9845
+vn 0.0109 -0.0628 0.9980
+vn 0.4098 0.7094 0.5734
+vn -0.4474 0.8649 0.2275
+vn -0.4335 -0.0242 0.9008
+vn 0.0865 0.4991 0.8622
+vn -0.4654 -0.8080 -0.3614
+vn 0.9391 0.0110 0.3433
+vn -0.5401 -0.8394 -0.0598
+vn 0.9979 -0.0636 -0.0124
+vn -0.1912 0.6346 -0.7488
+vn -0.6083 -0.4849 -0.6284
+vn 0.4504 0.8861 0.1098
+vn 0.9951 0.0981 0.0133
+vn 0.6993 0.7148 -0.0099
+vn -0.5466 -0.8307 -0.1054
+vn -0.2528 -0.9622 -0.1012
+vn 0.4394 0.8943 0.0848
+vn 0.2686 0.6923 -0.6697
+vn 0.4103 -0.5982 -0.6883
+vn 0.6107 -0.7684 -0.1913
+vn 0.1522 0.9883 -0.0103
+vn 0.7745 0.0626 -0.6295
+vn -0.7216 -0.6843 -0.1053
+vn -0.2852 0.9178 -0.2761
+vn 0.0528 0.6234 -0.7802
+vn -0.4008 -0.9062 -0.1349
+vn 0.2918 0.9565 0.0023
+vn 0.8302 0.5545 0.0580
+vn -0.1009 0.9907 -0.0910
+vn 0.6082 -0.7825 -0.1334
+vn 0.7981 0.6009 0.0441
+vn -0.9429 -0.1950 -0.2699
+vn 0.2902 0.6609 -0.6921
+vn -0.8111 0.5641 -0.1549
+vn -0.4553 -0.8693 -0.1923
+vn 0.1685 0.0065 -0.9857
+vn 0.1717 -0.0027 -0.9851
+vn 0.1039 -0.0785 -0.9915
+vn -0.5704 -0.1201 -0.8125
+vn -0.4471 -0.7721 -0.4516
+vn -0.3384 -0.8538 -0.3956
+vn 0.0006 0.7120 -0.7022
+vn 0.4917 0.7990 -0.3462
+vn 0.1667 -0.0010 -0.9860
+vn 0.2797 -0.1063 -0.9542
+vn 0.5292 0.7994 -0.2845
+vn -0.4161 0.8715 -0.2594
+vn -0.1051 -0.0242 -0.9942
+vn 0.3696 0.4576 -0.8087
+vn -0.5611 -0.8053 0.1916
+vn 0.9997 -0.0238 -0.0002
+vn -0.5556 -0.7708 -0.3117
 vt 0.659918 0.508898
-vt 0.618829 0.671054
-vt 0.898403 0.881541
-vt 0.401430 0.827363
-vt 0.400129 0.967568
-vt 0.375156 0.935628
-vt 0.430174 0.831325
+vt 0.374973 0.408696
+vt 0.959580 0.720492
 vt 0.422161 0.895489
-vt 0.403002 0.873682
-vt 0.406318 0.832406
-vt 0.996827 0.682701
-vt 0.920572 0.649199
-vt 0.934021 0.646724
-vt 0.920492 0.667761
-vt 0.484351 0.838062
-vt 0.471110 0.831143
-vt 0.853639 0.886864
-vt 0.360430 0.560754
-vt 0.354112 0.501435
-vt 0.394831 0.062112
-vt 0.365846 0.017513
-vt 0.402646 0.003745
-vt 0.827533 0.426351
-vt 0.856128 0.426209
+vt 0.372884 0.486082
+vt 0.951697 0.798935
+vt 0.966159 0.581131
+vt 0.672209 0.261514
+vt 0.658445 0.124408
 vt 0.728672 0.031965
+vt 0.995501 0.432985
+vt 0.400129 0.967568
+vt 0.414665 0.966085
 vt 0.742101 0.025332
+vt 0.860913 0.470126
+vt 0.146307 0.004447
+vt 0.971778 0.653302
+vt 0.874136 0.794721
+vt 0.898668 0.949748
+vt 0.920492 0.667761
+vt 0.483257 0.858220
+vt 0.659898 0.307249
+vt 0.920572 0.649199
+vt 0.484351 0.838062
+vt 0.383936 0.686491
+vt 0.660360 0.000423
+vt 0.995026 0.540717
 vt 0.788312 0.145203
-vt 0.961933 0.035254
 vt 0.189367 0.844990
+vt 0.401430 0.827363
+vt 0.854365 0.977751
+vt 0.849666 0.170791
 vt 0.126138 0.817793
-vt 0.874136 0.794721
-vt 0.124760 0.088981
-vt 0.146307 0.004447
+vt 0.505948 0.982298
+vt 0.841745 0.084642
+vt 0.467713 0.842688
+vt 0.952907 0.078470
+vt 0.853639 0.886864
+vt 0.961933 0.035254
+vt 0.630940 0.965289
+vt 0.453973 0.891755
+vt 0.396072 0.063440
+vt 0.394831 0.062112
+vt 0.071096 0.021684
+vt 0.898403 0.881541
+vt 0.912973 0.747024
+vt 0.415398 0.443676
+vt 0.393171 0.556814
+vt 0.424020 0.744855
+vt 0.134018 0.753678
+vt 0.430174 0.831325
+vt 0.378198 0.316758
+vt 0.389800 0.142834
+vt 0.657475 0.667397
+vt 0.758163 0.309282
+vt 0.202493 0.537282
+vt 0.689288 0.126948
+vt 0.218719 0.718047
+vt 0.489397 0.551720
+vt 0.104744 0.541273
+vt 0.661532 0.816979
+vt 0.856128 0.426209
 vt 0.190873 0.034994
+vt 0.402646 0.003745
+vt 0.088711 0.002435
+vt 0.860094 0.526273
+vt 0.220442 0.378064
 vt 0.753830 0.466752
-vt 0.484938 0.364658
+vt 0.896779 0.391742
+vt 0.951524 0.646724
 vt 0.064557 0.150736
-vt 0.116942 0.194662
-vt 0.202493 0.537282
-vt 0.071096 0.021684
-vt 0.088711 0.002435
 vt 0.490952 0.158111
-vt 0.173810 0.347627
+vt 0.484938 0.364658
+vt 0.042952 0.361542
+vt 0.215653 0.221039
+vt 0.349109 0.889925
+vt 0.753361 0.625230
+vt 0.897486 0.233218
 vt 0.758611 0.731126
-vt 0.768948 0.976605
-vt 0.745671 0.902251
+vt 0.180460 0.115857
+vt 0.124760 0.088981
+vt 0.173810 0.347627
 vt 0.823832 0.890239
+vt 0.900260 0.622502
+vt 0.116942 0.194662
+vt 0.092956 0.374659
 vt 0.823829 0.978030
-vt 0.358223 0.841639
-vt 0.403002 0.831143
+vt 0.170309 0.250413
 vt 0.403002 0.883636
-vt 0.349109 0.889925
-vt 0.220442 0.378064
+vt 0.988781 0.256596
+vt 0.358223 0.841639
 vt 0.850332 0.233279
-vt 0.897486 0.233218
-vt 0.896779 0.391742
+vt 0.951524 0.600165
 vt 0.849664 0.389781
-vt 0.741267 0.952410
 vt 0.951800 0.288159
-vt 0.988781 0.256596
-vt 0.977483 0.324616
-vt 0.951524 0.646724
-vt 0.900260 0.622502
-vt 0.802328 0.288593
+vt 0.768948 0.976605
+vt 0.403002 0.831143
+vt 0.942709 0.557990
+vt 0.985658 0.360507
 vt 0.799266 0.336212
-vt 0.050734 0.938690
+vt 0.741267 0.952410
+vt 0.802328 0.288593
+vt 0.977483 0.324616
+vt 0.918403 0.548140
+vt 0.976228 0.350736
+vt 0.745671 0.902251
+vt 0.351643 0.176375
 vt 0.051791 0.954523
 vt 0.086935 0.952930
+vt 0.618829 0.671054
+vt 0.050734 0.938690
+vt 0.350544 0.282011
 vt 0.087317 0.937852
-vt 0.985658 0.360507
-vt 0.976228 0.350736
-vt 0.087419 0.928737
+vt 0.618426 0.569585
+vt 0.349109 0.330593
 vt 0.049630 0.931359
-vt 0.086480 0.919888
+vt 0.406318 0.832406
+vt 0.618333 0.508235
+vt 0.087419 0.928737
 vt 0.046587 0.924976
+vt 0.961313 0.697559
+vt 0.403002 0.873682
+vt 0.086480 0.919888
+vt 0.619455 0.448548
 vt 0.052434 0.906111
+vt 0.996827 0.555363
+vt 0.354112 0.501435
+vt 0.621388 0.351539
 vt 0.084861 0.905509
 vt 0.056455 0.897587
+vt 0.360430 0.560754
+vt 0.624083 0.299966
 vt 0.082574 0.897890
 vt 0.059586 0.889752
+vt 0.365385 0.614972
 vt 0.083183 0.890974
+vt 0.623391 0.253481
+vt 0.369791 0.662381
 vt 0.062372 0.882905
+vt 0.471110 0.831143
 vt 0.082670 0.883136
+vt 0.624013 0.200651
 vt 0.064609 0.874775
+vt 0.373410 0.718110
+vt 0.934021 0.646724
+vt 0.625330 0.143403
 vt 0.081564 0.874653
 vt 0.066147 0.867676
+vt 0.375946 0.766544
 vt 0.080015 0.867285
-vt 0.077857 0.860710
+vt 0.627160 0.093605
 vt 0.065702 0.861437
-vt 0.076469 0.854382
+vt 0.375469 0.808152
+vt 0.077857 0.860710
+vt 0.629700 0.049073
+vt 0.372640 0.827080
+vt 0.882784 0.973289
 vt 0.063762 0.858461
-vt 0.065845 0.845087
+vt 0.631341 0.006301
+vt 0.965556 0.543349
+vt 0.076469 0.854382
 vt 0.054993 0.852062
-vt 0.055918 0.842513
+vt 0.882572 0.920890
+vt 0.502189 0.954105
+vt 0.065845 0.845087
+vt 0.435967 0.838245
+vt 0.882784 0.864372
 vt 0.045615 0.846455
-vt 0.048659 0.839245
+vt 0.565802 0.947126
+vt 0.055918 0.842513
 vt 0.041882 0.842583
-vt 0.074479 0.840455
+vt 0.434196 0.862717
+vt 0.048659 0.839245
+vt 0.613281 0.939128
+vt 0.040634 0.839054
+vt 0.435967 0.885722
+vt 0.044556 0.837767
+vt 0.639862 0.935377
+vt 0.041603 0.836825
+vt 0.439846 0.900826
+vt 0.658907 0.932934
 vt 0.081958 0.847082
+vt 0.963851 0.494541
+vt 0.074479 0.840455
+vt 0.451646 0.945813
 vt 0.085125 0.840159
+vt 0.964629 0.448203
 vt 0.080191 0.836274
-vt 0.083390 0.834147
+vt 0.418993 0.937994
+vt 0.964842 0.422654
 vt 0.087056 0.836341
-vt 0.085458 0.833448
+vt 0.400551 0.934063
+vt 0.083390 0.834147
+vt 0.965556 0.410896
 vt 0.087419 0.834586
-vt 0.083903 0.963052
+vt 0.375156 0.935628
+vt 0.085458 0.833448
+vt 0.388162 0.932934
 vt 0.053072 0.962768
+vt 0.353316 0.121756
+vt 0.083903 0.963052
+vt 0.622342 0.738821
 vt 0.055058 0.969341
+vt 0.356102 0.078724
+vt 0.624220 0.786943
 vt 0.082278 0.970230
 vt 0.058426 0.975209
+vt 0.360989 0.041164
+vt 0.626586 0.826377
+vt 0.827533 0.426351
 vt 0.080238 0.976124
+vt 0.827576 0.543349
 vt 0.061730 0.978997
+vt 0.365846 0.017513
 vt 0.076334 0.979843
-vt 0.071590 0.981955
+vt 0.826493 0.452269
 vt 0.064618 0.981743
-vt 0.046679 0.909052
+vt 0.826493 0.526367
+vt 0.071590 0.981955
+vt 0.826041 0.482807
+vt 0.885504 0.864373
 vt 0.038484 0.920435
-vt 0.039889 0.908653
+vt 0.901949 0.718982
+vt 0.046679 0.909052
+vt 0.990716 0.589020
 vt 0.034184 0.914798
-vt 0.035541 0.907346
+vt 0.882784 0.900280
+vt 0.991519 0.631614
+vt 0.039889 0.908653
 vt 0.032306 0.910051
+vt 0.883200 0.931219
+vt 0.035541 0.907346
+vt 0.994213 0.659673
+vt 0.883312 0.949096
 vt 0.031137 0.907303
+vt 0.885504 0.957616
 vt 0.031995 0.906078
-vt 0.061664 0.876911
+vt 0.996827 0.682701
 vt 0.060312 0.880610
-vt 0.060049 0.877450
+vt 0.469432 0.845635
+vt 0.061664 0.876911
+vt 0.933128 0.663956
+vt 0.468829 0.855653
 vt 0.059256 0.879045
-vt 0.971065 0.567078
+vt 0.471110 0.866632
+vt 0.934021 0.673637
+vt 0.060049 0.877450
+vt 0.659918 0.508898
+vt 0.425249 0.899189
+vt 0.374973 0.408696
 vt 0.960971 0.724493
-vt 0.423568 0.746327
+vt 0.372884 0.486082
+vt 0.971065 0.567078
+vt 0.964998 0.808390
+vt 0.668909 0.306138
+vt 0.995374 0.540892
+vt 0.660595 -0.000060
+vt 0.189257 0.845380
+vt 0.788478 0.145439
+vt 0.467713 0.842688
+vt 0.952941 0.078441
+vt 0.853639 0.886837
+vt 0.728672 0.031965
+vt 0.995501 0.432985
 vt 0.400129 0.967568
-vt 0.975438 0.659444
-vt 0.432486 0.831221
-vt 0.425249 0.899189
+vt 0.414665 0.966086
+vt 0.742101 0.025332
+vt 0.860914 0.470126
+vt 0.146307 0.004447
+vt 0.963197 0.597326
+vt 0.937325 0.790617
+vt 0.898403 0.881541
+vt 0.912973 0.747024
+vt 0.920492 0.667761
+vt 0.483257 0.858220
+vt 0.393098 0.556884
+vt 0.384261 0.686618
 vt 0.920572 0.649199
-vt 0.854464 0.980908
 vt 0.484351 0.838062
+vt 0.126138 0.817793
+vt 0.401226 0.826293
+vt 0.854464 0.980908
+vt 0.846410 0.173899
+vt 0.505948 0.982298
+vt 0.841745 0.084642
+vt 0.961933 0.035254
+vt 0.630940 0.965289
+vt 0.453973 0.891755
+vt 0.396072 0.063440
 vt 0.394831 0.062111
-vt 0.402646 0.003745
+vt 0.071096 0.021684
+vt 0.867019 0.796088
+vt 0.898384 0.948530
+vt 0.975438 0.659444
+vt 0.415398 0.443676
+vt 0.134329 0.755598
+vt 0.423568 0.746327
+vt 0.432486 0.831221
+vt 0.378985 0.319260
+vt 0.389800 0.142834
+vt 0.661532 0.816979
 vt 0.856128 0.426209
-vt 0.788478 0.145439
-vt 0.846410 0.173899
-vt 0.728672 0.031965
-vt 0.742101 0.025332
-vt 0.964998 0.808390
 vt 0.190873 0.034994
-vt 0.126138 0.817793
+vt 0.657475 0.667397
+vt 0.489700 0.552446
+vt 0.105711 0.541948
+vt 0.220383 0.706825
+vt 0.674371 0.137246
+vt 0.402646 0.003745
+vt 0.860094 0.526273
+vt 0.088711 0.002435
+vt 0.220442 0.378064
 vt 0.753830 0.466720
+vt 0.896778 0.391773
+vt 0.951524 0.646724
+vt 0.490952 0.158111
+vt 0.064557 0.150736
+vt 0.757081 0.309561
+vt 0.202571 0.534959
 vt 0.484938 0.364658
-vt 0.071096 0.021684
+vt 0.042952 0.361542
+vt 0.215096 0.219436
+vt 0.753444 0.626844
+vt 0.349109 0.889925
+vt 0.897486 0.233218
 vt 0.758611 0.731126
-vt 0.823829 0.978030
+vt 0.180460 0.115857
+vt 0.124760 0.088981
+vt 0.174124 0.350301
 vt 0.823831 0.890276
-vt 0.358223 0.841639
-vt 0.349109 0.889925
+vt 0.900260 0.622502
+vt 0.116942 0.194662
+vt 0.093203 0.375171
+vt 0.170289 0.250234
+vt 0.823829 0.978030
 vt 0.403002 0.883636
-vt 0.403002 0.831143
-vt 0.896778 0.391773
-vt 0.897486 0.233218
+vt 0.988781 0.256596
+vt 0.358223 0.841639
 vt 0.850332 0.233279
 vt 0.849664 0.389781
-vt 0.900260 0.622502
-vt 0.951524 0.646724
-vt 0.802328 0.288593
+vt 0.951524 0.600165
+vt 0.951800 0.288159
+vt 0.403002 0.831143
+vt 0.768948 0.976605
+vt 0.942709 0.557990
+vt 0.985658 0.360507
 vt 0.799266 0.336212
+vt 0.741267 0.952410
+vt 0.977483 0.324616
+vt 0.802328 0.288593
+vt 0.745671 0.902251
+vt 0.918403 0.548140
 vt 0.976228 0.350736
-vt 0.985658 0.360507
-vn -0.4237 -0.9023 -0.0801
-vn 0.8144 -0.0584 0.5774
-vn 0.9122 -0.0427 0.4076
-vn -0.3507 -0.9300 -0.1104
-vn 0.9467 0.0527 0.3176
-vn -0.3869 -0.8910 0.2377
-vn 0.3994 0.9090 0.1190
-vn 0.8467 -0.2037 0.4915
-vn 0.0069 0.6847 0.7288
-vn 0.4080 0.9117 0.0493
-vn -0.3668 0.8849 0.2869
-vn -0.7005 -0.7125 -0.0408
-vn -0.1028 0.7783 0.6194
-vn -0.2840 -0.9571 -0.0581
-vn 0.0799 0.9967 -0.0174
-vn -0.7548 -0.6382 -0.1515
-vn -0.2180 0.8976 0.3833
-vn -0.2033 0.9784 -0.0381
-vn -0.9638 0.1202 -0.2380
-vn 0.4267 0.3986 0.8118
-vn -0.1798 0.0106 0.9837
-vn 0.5139 0.7617 0.3945
-vn -0.2383 -0.0064 0.9712
-vn -0.5983 -0.7587 0.2578
-vn 0.6986 0.4351 0.5680
-vn -0.2621 -0.8972 0.3555
-vn 0.2750 0.7823 0.5588
-vn -0.4531 -0.7983 0.3966
-vn 0.1391 -0.1594 0.9774
-vn -0.4513 -0.8446 0.2881
-vn 0.3569 0.4126 0.8380
-vn -0.5270 -0.3780 0.7612
-vn -0.7210 -0.6092 0.3301
-vn 0.3440 -0.5041 0.7922
-vn -0.1708 0.0000 0.9853
-vn 0.6382 -0.7570 -0.1398
-vn -0.4179 -0.9016 -0.1117
-vn 0.9961 -0.0427 -0.0769
-vn -0.3591 -0.9311 -0.0647
-vn 0.7851 -0.5223 -0.3329
-vn 0.0824 0.7189 -0.6902
-vn -0.6186 -0.4547 -0.6408
-vn 0.6491 -0.7574 -0.0716
-vn 0.9984 0.0527 0.0195
-vn -0.5358 -0.8380 -0.1031
-vn 0.7167 0.2706 -0.6427
-vn -0.4366 -0.5798 -0.6879
-vn -0.2849 -0.8916 -0.3521
-vn 0.4158 0.9091 0.0248
-vn 0.9627 -0.2037 -0.1779
-vn 0.0723 0.9510 -0.3006
-vn 0.2519 0.6935 -0.6750
-vn -0.4429 -0.8924 -0.0869
-vn 0.4008 0.9117 0.0909
-vn 0.8210 0.4866 -0.2986
-vn 0.6772 -0.6972 -0.2351
-vn 0.9061 -0.1872 -0.3794
-vn -0.6734 -0.7125 -0.1972
-vn -0.3086 0.8291 -0.4663
-vn 0.1116 0.7783 -0.6179
-vn -0.2903 -0.9567 -0.0211
-vn 0.0694 0.9967 0.0433
-vn 0.5073 -0.8490 0.1478
-vn -0.7618 -0.6382 -0.1114
-vn -0.0707 0.8870 -0.4563
-vn -0.6018 -0.7963 -0.0620
-vn -0.7723 -0.3531 -0.5281
-vn -0.2042 0.9784 -0.0325
-vn 0.7669 0.5954 0.2396
-vn -0.9877 0.1202 -0.1002
-vn 0.6750 0.3986 -0.6209
-vn 0.1747 -0.0015 -0.9846
-vn 0.6946 0.7191 -0.0192
-vn 0.2345 0.0391 -0.9713
-vn 0.8489 0.4356 -0.2993
-vn 0.3175 -0.1121 -0.9416
-vn -0.3990 0.6408 0.6558
-vn 0.4279 -0.1971 -0.8820
-vn -0.3890 -0.8215 -0.4169
-vn 0.6208 0.4146 -0.6654
-vn 0.0559 0.4367 -0.8979
-vn -0.2397 -0.3769 -0.8947
-vn -0.4549 0.3624 -0.8135
-vn -0.5687 -0.6097 -0.5521
-vn 0.3118 0.8664 -0.3902
-vn -0.0881 -0.5021 -0.8603
-vn 0.3703 0.6162 -0.6952
-vn -0.3983 0.3446 -0.8500
-vn 0.5905 -0.5041 -0.6302
-vn 0.5540 -0.7570 0.3464
-vn -0.7819 -0.4323 0.4492
-vn 0.4635 0.8813 0.0920
-vn 0.7277 -0.6130 0.3078
-vn 0.9682 0.0539 0.2445
-vn 0.6800 0.6955 0.2323
-vn -0.5491 -0.8323 -0.0765
-vn -0.1547 0.7189 0.6776
-vn -0.2575 -0.9660 0.0237
-vn -0.7982 -0.4547 0.3952
-vn 0.4497 0.8903 0.0722
-vn 0.5446 -0.7322 0.4089
-vn -0.0251 0.6599 0.7509
-vn 0.1883 -0.5773 0.7945
-vn 0.2305 0.9501 0.2104
-vn -0.5393 -0.8380 -0.0832
-vn 0.4248 0.2571 0.8680
-vn -0.6427 -0.5798 0.5008
-vn 0.5078 -0.7663 0.3937
-vn -0.0426 0.9320 0.3600
-vn -0.4463 -0.8924 -0.0672
-vn 0.5132 -0.1156 0.8505
-vn -0.7219 -0.6794 -0.1314
-vn -0.2719 0.6256 0.7312
-vn -0.4359 -0.8995 0.0288
-vn 0.2540 0.9594 0.1226
-vn 0.6726 0.4866 0.5575
-vn -0.4125 0.8798 0.2364
-vn 0.5586 -0.6972 0.4493
-vn 0.7256 -0.1872 0.6622
-vn 0.8809 0.4717 0.0379
-vn 0.5274 -0.8490 0.0315
-vn -0.5607 -0.8221 -0.0985
-vn -0.1237 0.9911 0.0498
-vn 0.5204 -0.7859 0.3340
-vn 0.7608 0.6164 0.2029
-vn -0.9753 -0.2073 -0.0767
-vn 0.0646 0.6614 0.7473
-vn -0.8433 0.5314 -0.0806
-vn -0.4677 -0.8833 -0.0307
-vn -0.9055 -0.3535 0.2345
-vn -0.1779 -0.0031 0.9840
-vn 0.8018 0.5960 0.0432
-vn 0.6709 0.4046 0.6214
-vn -0.1815 0.0080 0.9834
-vn -0.1707 0.0040 0.9853
-vn 0.0619 -0.0609 0.9962
-vn -0.1476 0.0037 0.9890
-vn -0.8181 -0.0904 0.5680
-vn 0.7661 0.6322 0.1162
-vn -0.5650 -0.7740 0.2857
-vn -0.4432 -0.8538 0.2732
-vn 0.5790 0.5980 0.5542
-vn 0.3402 0.8179 0.4640
-vn -0.2495 0.4367 0.8643
-vn 0.1475 -0.1544 0.9769
-vn -0.2552 0.7119 0.6543
-vn -0.7021 0.3624 0.6130
-vn 0.3420 0.8098 0.4767
-vn 0.4326 0.4716 0.7684
-vn -0.1757 0.0067 0.9844
-vn 0.1623 0.8664 0.4723
-vn -0.7179 -0.6214 0.3137
-vn -0.0325 -0.0840 0.9959
-vn 0.4074 0.7497 0.5216
-vn -0.4674 0.8715 0.1483
-vn -0.4248 -0.0530 0.9037
-vn 0.0807 0.4765 0.8755
-vn -0.3719 -0.4950 0.7852
-vn -0.4643 -0.8079 -0.3631
-vn 0.1147 0.6162 0.7792
-vn -0.6612 0.3446 0.6664
-vn 0.8398 0.0768 0.5375
-vn -0.5645 -0.8252 -0.0177
-vn -0.2173 -0.3641 0.9057
-vn 0.9985 -0.0473 -0.0291
-vn -0.1567 0.6215 -0.7676
-vn -0.5854 -0.4330 -0.6854
-vn 0.4641 0.8824 0.0776
-vn 0.9940 0.0539 0.0956
-vn 0.7191 0.6947 0.0134
-vn -0.5428 -0.8323 -0.1127
-vn -0.2349 -0.9646 -0.1197
-vn 0.4569 0.8869 0.0679
-vn 0.2280 0.6613 -0.7146
-vn 0.4447 -0.5773 -0.6848
-vn 0.6651 -0.7251 -0.1784
-vn 0.3116 0.9333 -0.1786
-vn 0.7772 -0.1114 -0.6193
-vn -0.7240 -0.6794 -0.1192
-vn -0.2832 0.9175 -0.2793
-vn -0.0103 0.6246 -0.7809
-vn -0.4029 -0.8994 -0.1693
-vn 0.2804 0.9594 -0.0300
-vn 0.8425 0.4942 0.2141
-vn -0.0997 0.9911 -0.0885
-vn 0.6024 -0.7859 -0.1394
-vn 0.7835 0.6171 0.0722
-vn -0.9442 -0.2073 -0.2560
-vn 0.3077 0.6613 -0.6841
-vn -0.8212 0.5314 -0.2079
-vn -0.4482 -0.8706 -0.2029
-vn 0.1676 0.0050 -0.9858
-vn 0.8524 0.4570 -0.2542
-vn 0.1705 -0.0037 -0.9854
-vn 0.1202 -0.0347 -0.9921
-vn -0.5792 -0.0904 -0.8101
-vn 0.4546 -0.0134 -0.8906
-vn 0.7602 0.6320 0.1504
-vn 0.4451 0.7928 -0.4163
-vn -0.4360 -0.7732 -0.4606
-vn -0.3331 -0.8531 -0.4015
-vn 0.7312 0.5976 -0.3288
-vn 0.4734 0.8212 -0.3187
-vn 0.4660 -0.1733 -0.8677
-vn -0.0201 0.7119 -0.7020
-vn 0.4838 0.8104 -0.3306
-vn 0.6661 0.4709 -0.5784
-vn 0.1662 0.0090 -0.9861
-vn -0.5708 -0.6202 -0.5381
-vn 0.3072 -0.0930 -0.9471
-vn 0.5592 0.7498 -0.3538
-vn -0.3820 0.8695 -0.3133
-vn -0.0960 -0.0529 -0.9940
-vn 0.3706 0.4763 -0.7974
-vn -0.5599 -0.8070 0.1878
-vn 0.9716 0.0495 -0.2316
-vn -0.5376 -0.8252 -0.1733
-vn 0.1002 -0.3641 -0.9260
-usemtl BlĂ„haj
-s off
-f 64/1/1 5/2/1 62/3/1
-f 99/4/2 3/5/2 55/6/2
-f 72/7/3 15/8/3 81/9/3
-f 66/10/4 5/2/4 64/1/4
-f 83/11/5 7/12/5 85/13/5
-f 70/14/6 13/15/6 68/16/6
-f 49/17/7 23/18/7 51/19/7
-f 85/13/8 7/12/8 87/20/8
-f 102/21/9 9/22/9 104/23/9
-f 88/24/10 24/25/10 47/26/10
-f 69/27/11 14/28/11 71/29/11
-f 89/30/12 29/31/12 91/32/12
-f 106/33/13 10/34/13 108/35/13
-f 58/36/14 11/37/14 56/38/14
-f 92/39/15 18/40/15 90/41/15
-f 91/32/16 29/31/16 93/42/16
-f 73/43/17 16/44/17 75/45/17
-f 96/46/18 30/47/18 94/48/18
-f 95/49/19 8/50/19 97/51/19
-f 77/52/20 17/53/20 79/54/20
-f 14/55/21 15/56/21 16/57/21
-f 2/58/22 20/59/22 3/60/22
-f 2/61/23 3/62/23 19/63/23
-f 11/37/24 4/64/24 26/65/24
-f 20/59/25 28/66/25 21/67/25
-f 5/2/26 13/15/26 27/68/26
-f 2/58/27 23/18/27 20/59/27
-f 4/64/28 27/68/28 26/65/28
-f 27/69/29 22/70/29 28/71/29
-f 5/2/30 27/68/30 4/64/30
-f 33/72/31 39/73/31 28/71/31
-f 34/74/32 40/75/32 35/76/32
-f 25/77/33 34/78/33 29/31/33
-f 46/79/34 44/80/34 42/81/34
-f 77/82/35 78/83/35 79/84/35
-f 78/85/36 126/86/36 79/87/36
-f 136/88/37 64/1/37 62/3/37
-f 125/89/38 72/7/38 81/9/38
-f 136/88/39 66/10/39 64/1/39
-f 99/4/40 119/90/40 101/91/40
-f 100/92/41 120/93/41 98/94/41
-f 82/95/42 116/96/42 84/97/42
-f 101/91/43 119/90/43 103/98/43
-f 117/99/44 83/11/44 85/13/44
-f 50/100/45 110/101/45 52/102/45
-f 105/103/46 128/104/46 104/23/46
-f 84/97/47 116/96/47 86/105/47
-f 114/106/48 70/14/48 68/16/48
-f 131/107/49 49/17/49 51/19/49
-f 117/99/50 85/13/50 87/20/50
-f 69/108/51 124/109/51 67/110/51
-f 128/104/52 102/21/52 104/23/52
-f 52/102/53 110/101/53 54/111/53
-f 132/112/54 88/24/54 47/26/54
-f 109/113/55 121/114/55 108/35/55
-f 72/7/56 125/89/56 74/115/56
-f 107/116/57 121/117/57 109/118/57
-f 133/119/58 89/30/58 91/32/58
-f 115/120/59 71/29/59 73/121/59
-f 121/114/60 106/33/60 108/35/60
-f 113/122/61 58/36/61 56/38/61
-f 127/123/62 92/39/62 90/41/62
-f 74/115/63 125/89/63 76/124/63
-f 133/119/64 91/32/64 93/42/64
-f 115/125/65 73/43/65 75/45/65
-f 113/122/66 60/126/66 58/36/66
-f 70/127/67 114/128/67 80/129/67
-f 137/130/68 96/46/68 94/48/68
-f 61/131/69 123/132/69 59/133/69
-f 118/134/70 95/49/70 97/51/70
-f 126/135/71 77/52/71 79/54/71
-f 115/136/72 126/137/72 125/138/72
-f 129/139/73 111/140/73 112/141/73
-f 128/142/74 119/143/74 120/144/74
-f 135/145/75 129/139/75 122/146/75
-f 130/147/76 114/148/76 136/149/76
-f 2/61/77 19/63/77 98/150/77 53/151/77
-f 130/147/78 136/149/78 135/152/78
-f 113/122/79 140/153/79 136/88/79
-f 147/154/80 141/155/80 135/152/80
-f 139/156/81 146/157/81 144/158/81
-f 148/159/82 142/160/82 143/161/82
-f 137/162/83 144/158/83 118/163/83
-f 142/164/84 134/165/84 133/119/84
-f 132/112/85 139/166/85 127/123/85
-f 138/167/86 145/168/86 140/169/86
-f 154/170/87 153/171/87 151/172/87
-f 151/173/88 153/174/88 149/175/88
-f 152/176/89 154/177/89 150/178/89
-f 78/85/90 79/87/90 17/179/90
-f 6/180/91 13/181/91 80/129/91 82/95/91
-f 23/18/92 49/17/92 47/26/92 24/25/92
-f 9/182/93 3/5/93 99/4/93 101/91/93
-f 7/12/94 83/11/94 81/9/94 15/8/94
-f 22/183/95 65/184/95 63/185/95 12/186/95
-f 1/187/96 25/77/96 48/188/96 50/100/96
-f 100/92/97 98/94/97 19/189/97
-f 5/2/98 66/10/98 68/16/98 13/15/98
-f 82/95/99 84/97/99 6/180/99
-f 14/190/100 67/110/100 65/184/100 22/183/100
-f 101/91/101 103/98/101 9/182/101
-f 9/22/102 102/21/102 100/92/102 19/189/102
-f 6/191/103 86/192/103 87/20/103 7/12/103
-f 23/193/104 2/194/104 53/195/104 51/196/104
-f 50/100/105 52/102/105 1/187/105
-f 105/103/106 104/23/106 9/22/106
-f 84/97/107 86/105/107 6/180/107
-f 103/98/108 105/197/108 9/182/108
-f 69/108/109 67/110/109 14/190/109
-f 52/102/110 54/111/110 1/187/110
-f 12/198/111 63/199/111 107/116/111 10/200/111
-f 29/31/112 89/30/112 48/188/112 25/77/112
-f 12/201/113 10/34/113 106/33/113 61/202/113
-f 1/187/114 54/111/114 56/38/114 11/37/114
-f 24/25/115 88/24/115 90/41/115 18/40/115
-f 109/113/116 108/35/116 10/34/116
-f 16/203/117 73/121/117 71/29/117 14/28/117
-f 72/7/118 74/115/118 15/8/118
-f 107/116/119 109/118/119 10/200/119
-f 21/67/120 57/204/120 55/205/120 3/60/120
-f 74/115/121 76/124/121 15/8/121
-f 11/37/122 58/36/122 60/126/122 4/64/122
-f 18/206/123 92/39/123 94/207/123 30/208/123
-f 17/179/124 15/8/124 76/124/124 78/85/124
-f 21/67/125 12/186/125 59/133/125 57/204/125
-f 8/50/126 95/49/126 93/209/126 29/210/126
-f 17/53/127 77/52/127 75/45/127 16/44/127
-f 30/47/128 96/46/128 97/51/128 8/50/128
-f 4/64/129 60/126/129 62/3/129 5/2/129
-f 70/127/130 80/129/130 13/181/130
-f 6/211/131 7/212/131 15/56/131 13/213/131
-f 61/131/132 59/133/132 12/186/132
-f 3/60/133 20/59/133 21/67/133
-f 14/55/134 13/213/134 15/56/134
-f 16/57/135 15/56/135 17/214/135
-f 13/215/136 14/216/136 22/70/136 27/69/136
-f 19/63/137 3/62/137 9/217/137
-f 36/218/138 8/219/138 29/220/138 35/76/138
-f 12/186/139 21/67/139 22/183/139
-f 34/78/140 25/77/140 1/187/140 31/221/140
-f 26/65/141 31/221/141 1/187/141 11/37/141
-f 21/67/142 28/66/142 22/183/142
-f 23/18/143 33/222/143 20/59/143
-f 32/223/144 36/218/144 38/224/144
-f 26/225/145 27/69/145 28/71/145
-f 36/218/146 32/223/146 18/226/146 30/227/146
-f 30/227/147 8/219/147 36/218/147
-f 32/228/148 33/222/148 23/18/148 24/25/148
-f 20/59/149 33/222/149 28/66/149
-f 39/73/150 38/224/150 40/75/150 37/229/150
-f 24/25/151 18/40/151 32/228/151
-f 29/31/152 34/78/152 35/230/152
-f 26/225/153 28/71/153 39/73/153 37/229/153
-f 43/231/154 46/232/154 37/233/154 40/234/154
-f 41/235/155 43/236/155 40/237/155 34/238/155
-f 38/224/156 36/218/156 35/76/156 40/75/156
-f 38/224/157 39/73/157 33/72/157 32/223/157
-f 31/239/158 26/225/158 37/229/158
-f 41/240/159 34/241/159 31/242/159 42/243/159
-f 46/232/160 43/231/160 45/244/160
-f 43/245/161 41/246/161 45/247/161
-f 42/81/162 31/248/162 37/249/162 46/79/162
-f 45/250/163 41/240/163 42/243/163 44/251/163
-f 49/252/35 47/253/35 48/254/35 50/255/35
-f 44/256/164 46/257/164 45/247/164
-f 52/258/35 51/259/35 49/252/35 50/255/35
-f 54/260/35 53/261/35 51/259/35 52/258/35
-f 55/262/35 53/261/35 54/260/35 56/263/35
-f 57/264/35 55/262/35 56/263/35 58/265/35
-f 59/266/35 57/264/35 58/265/35 60/267/35
-f 61/268/35 59/266/35 60/267/35 62/269/35
-f 63/270/35 61/268/35 62/269/35 64/271/35
-f 65/272/35 63/270/35 64/271/35 66/273/35
-f 68/274/35 67/275/35 65/272/35 66/273/35
-f 70/276/35 69/277/35 67/275/35 68/274/35
-f 72/278/35 71/279/35 69/277/35 70/276/35
-f 74/280/35 73/281/35 71/279/35 72/278/35
-f 76/282/35 75/283/35 73/281/35 74/280/35
-f 78/83/35 77/82/35 75/283/35 76/282/35
-f 81/284/35 72/278/35 70/276/35 80/285/35
-f 82/286/35 83/287/35 81/284/35 80/285/35
-f 85/288/35 83/287/35 82/286/35 84/289/35
-f 87/290/35 85/288/35 84/289/35 86/291/35
-f 89/292/35 48/254/35 47/253/35 88/293/35
-f 90/294/35 91/295/35 89/292/35 88/293/35
-f 92/296/35 93/297/35 91/295/35 90/294/35
-f 94/298/35 95/299/35 93/297/35 92/296/35
-f 97/300/35 95/299/35 94/298/35 96/301/35
-f 99/302/35 98/303/35 53/261/35 55/262/35
-f 101/304/35 100/305/35 98/303/35 99/302/35
-f 103/306/35 102/307/35 100/305/35 101/304/35
-f 104/308/35 102/307/35 103/306/35 105/309/35
-f 107/310/35 106/311/35 61/268/35 63/270/35
-f 109/312/35 108/313/35 106/311/35 107/310/35
-f 99/4/165 55/6/165 112/314/165 119/90/165
-f 111/315/166 53/151/166 98/150/166 120/144/166
-f 116/96/167 82/95/167 80/129/167 114/128/167
-f 47/26/168 49/17/168 131/107/168 132/112/168
-f 81/9/169 83/11/169 117/99/169 125/89/169
-f 63/185/170 65/184/170 130/316/170 123/132/170
-f 110/101/171 50/100/171 48/188/171 134/165/171
-f 68/16/172 66/10/172 136/88/172 114/106/172
-f 65/184/173 67/110/173 124/109/173 130/316/173
-f 100/92/174 102/21/174 128/104/174 120/93/174
-f 87/20/175 86/192/175 116/317/175 117/99/175
-f 128/318/176 105/197/176 103/98/176 119/90/176
-f 131/319/177 51/196/177 53/195/177 111/320/177
-f 107/116/178 63/199/178 123/321/178 121/117/178
-f 48/188/179 89/30/179 133/119/179 134/165/179
-f 69/27/180 71/29/180 115/120/180 124/322/180
-f 123/323/181 61/202/181 106/33/181 121/114/181
-f 56/38/182 54/111/182 110/101/182 113/122/182
-f 90/41/183 88/24/183 132/112/183 127/123/183
-f 55/205/184 57/204/184 122/146/184 112/141/184
-f 94/207/185 92/39/185 127/324/185 137/325/185
-f 126/86/186 78/85/186 76/124/186 125/89/186
-f 122/146/187 57/204/187 59/133/187 123/132/187
-f 93/209/188 95/49/188 118/134/188 133/326/188
-f 75/45/189 77/52/189 126/135/189 115/125/189
-f 97/51/190 96/46/190 137/130/190 118/134/190
-f 62/3/191 60/126/191 113/122/191 136/88/191
-f 125/138/192 114/327/192 124/328/192 115/136/192
-f 122/146/193 129/139/193 112/141/193
-f 116/329/194 114/327/194 125/138/194 117/330/194
-f 119/143/195 112/331/195 111/315/195 120/144/195
-f 133/332/196 118/163/196 144/158/196 143/161/196
-f 130/147/197 124/333/197 114/148/197
-f 130/316/198 122/146/198 123/132/198
-f 111/140/199 129/139/199 131/107/199
-f 110/101/200 134/165/200 142/164/200 138/334/200
-f 140/153/201 113/122/201 110/101/201 138/334/201
-f 130/316/202 135/145/202 122/146/202
-f 129/139/203 141/335/203 131/107/203
-f 135/152/204 136/149/204 140/169/204
-f 144/158/205 137/162/205 127/336/205 139/156/205
-f 139/166/206 132/112/206 131/107/206 141/335/206
-f 135/145/207 141/335/207 129/139/207
-f 148/159/208 146/157/208 147/154/208 145/168/208
-f 143/337/209 142/164/209 133/119/209
-f 140/169/210 145/168/210 147/154/210 135/152/210
-f 151/172/211 148/338/211 145/339/211 154/170/211
-f 149/340/212 142/341/212 148/342/212 151/343/212
-f 143/161/213 144/158/213 146/157/213 148/159/213
-f 146/157/214 139/156/214 141/155/214 147/154/214
-f 138/344/215 142/345/215 149/346/215 150/347/215
-f 145/348/216 138/349/216 150/178/216 154/177/216
-f 150/347/217 149/346/217 153/350/217 152/351/217
-f 153/174/218 154/352/218 152/353/218
+s 0
+f 64/146/1 5/9/1 62/142/1
+f 99/225/2 3/7/2 55/126/2
+f 72/164/3 15/34/3 81/185/3
+f 66/151/4 5/9/4 64/146/4
+f 83/189/5 7/13/5 85/192/5
+f 70/159/6 13/26/6 68/155/6
+f 49/112/7 23/52/7 51/115/7
+f 85/192/8 7/13/8 87/198/8
+f 102/231/9 9/19/9 104/234/9
+f 88/200/10 24/53/10 47/107/10
+f 69/157/11 14/31/11 71/163/11
+f 89/202/12 29/61/12 91/205/12
+f 106/240/13 10/21/13 108/243/13
+f 58/132/14 11/22/14 56/128/14
+f 92/208/15 18/42/15 90/204/15
+f 91/205/16 29/61/16 93/209/16
+f 73/166/17 16/36/17 75/172/17
+f 96/218/18 30/66/18 94/212/18
+f 95/216/19 8/15/19 97/220/19
+f 77/176/20 17/41/20 79/180/20
+f 14/32/21 15/35/21 16/37/21
+f 2/2/22 20/47/22 3/5/22
+f 2/3/23 3/6/23 19/46/23
+f 11/22/24 4/8/24 26/55/24
+f 20/47/25 28/59/25 21/48/25
+f 5/9/26 13/26/26 27/57/26
+f 2/2/27 23/52/27 20/47/27
+f 4/8/28 27/57/28 26/55/28
+f 27/58/29 22/50/29 28/60/29
+f 5/9/30 27/57/30 4/8/30
+f 33/74/31 39/86/31 28/60/31
+f 34/75/32 40/88/32 35/80/32
+f 25/54/33 34/77/33 29/61/33
+f 46/104/34 44/98/34 42/93/34
+f 77/175/35 78/177/35 79/179/35
+f 78/178/36 126/287/36 79/181/36
+f 136/308/37 64/146/37 62/142/37
+f 125/284/38 72/164/38 81/185/38
+f 136/308/39 66/151/39 64/146/39
+f 99/225/40 119/270/40 101/228/40
+f 100/227/41 120/272/41 98/221/41
+f 82/187/42 116/264/42 84/190/42
+f 101/228/43 119/270/43 103/233/43
+f 117/266/44 83/189/44 85/192/44
+f 50/114/45 110/248/45 52/118/45
+f 105/236/46 128/293/46 104/234/46
+f 84/190/47 116/264/47 86/194/47
+f 114/257/48 70/159/48 68/155/48
+f 131/299/49 49/112/49 51/115/49
+f 117/266/50 85/192/50 87/198/50
+f 69/156/51 124/281/51 67/153/51
+f 128/293/52 102/231/52 104/234/52
+f 52/118/53 110/248/53 54/124/53
+f 132/300/54 88/200/54 47/107/54
+f 109/245/55 121/275/55 108/243/55
+f 72/164/56 125/284/56 74/169/56
+f 107/242/57 121/274/57 109/246/57
+f 133/301/58 89/202/58 91/205/58
+f 115/262/59 71/163/59 73/167/59
+f 121/275/60 106/240/60 108/243/60
+f 113/255/61 58/132/61 56/128/61
+f 127/289/62 92/208/62 90/204/62
+f 74/169/63 125/284/63 76/174/63
+f 133/301/64 91/205/64 93/209/64
+f 115/260/65 73/166/65 75/172/65
+f 113/255/66 60/137/66 58/132/66
+f 70/160/67 114/256/67 80/183/67
+f 137/310/68 96/218/68 94/212/68
+f 61/138/69 123/277/69 59/135/69
+f 118/268/70 95/216/70 97/220/70
+f 126/288/71 77/176/71 79/180/71
+f 115/261/72 126/286/72 125/285/72
+f 129/295/73 111/250/73 112/252/73
+f 128/292/74 119/271/74 120/273/74
+f 135/305/75 129/295/75 122/276/75
+f 130/296/76 114/258/76 136/307/76
+f 2/3/77 98/223/77 53/121/77
+f 130/296/78 136/307/78 135/306/78
+f 113/255/79 140/318/79 136/308/79
+f 147/333/80 141/321/80 135/306/80
+f 139/317/81 146/332/81 144/328/81
+f 148/334/82 142/322/82 143/327/82
+f 137/311/83 144/328/83 118/269/83
+f 142/323/84 134/304/84 133/301/84
+f 132/300/85 139/316/85 127/289/85
+f 138/312/86 145/329/86 140/319/86
+f 154/351/87 153/348/87 151/344/87
+f 151/342/88 153/349/88 149/337/88
+f 152/345/89 154/352/89 150/341/89
+f 78/178/90 79/181/90 17/40/90
+f 6/11/91 80/183/91 82/187/91
+f 49/112/92 24/53/92 23/52/92
+f 3/7/93 101/228/93 9/17/93
+f 7/13/94 81/185/94 15/34/94
+f 22/49/95 63/144/95 12/25/95
+f 25/54/96 50/114/96 1/1/96
+f 100/227/97 98/221/97 19/45/97
+f 5/9/98 68/155/98 13/26/98
+f 82/187/99 84/190/99 6/11/99
+f 67/153/100 22/49/100 14/30/100
+f 101/228/101 103/233/101 9/17/101
+f 9/19/102 100/227/102 19/45/102
+f 6/12/103 87/198/103 7/13/103
+f 23/51/104 53/122/104 51/117/104
+f 50/114/105 52/118/105 1/1/105
+f 105/236/106 104/234/106 9/19/106
+f 84/190/107 86/194/107 6/11/107
+f 103/233/108 105/238/108 9/17/108
+f 69/156/109 67/153/109 14/30/109
+f 52/118/110 54/124/110 1/1/110
+f 12/23/111 107/242/111 10/20/111
+f 89/202/112 25/54/112 29/61/112
+f 12/24/113 106/240/113 61/140/113
+f 54/124/114 11/22/114 1/1/114
+f 24/53/115 90/204/115 18/42/115
+f 109/245/116 108/243/116 10/21/116
+f 16/38/117 71/163/117 14/31/117
+f 72/164/118 74/169/118 15/34/118
+f 107/242/119 109/246/119 10/20/119
+f 21/48/120 55/127/120 3/5/120
+f 74/169/121 76/174/121 15/34/121
+f 11/22/122 60/137/122 4/8/122
+f 18/43/123 94/214/123 30/64/123
+f 17/40/124 76/174/124 78/178/124
+f 21/48/125 59/135/125 57/131/125
+f 95/216/126 29/62/126 8/15/126
+f 17/41/127 75/172/127 16/36/127
+f 30/66/128 97/220/128 8/15/128
+f 4/8/129 62/142/129 5/9/129
+f 70/160/130 80/183/130 13/27/130
+f 7/14/131 13/28/131 6/10/131
+f 61/138/132 59/135/132 12/25/132
+f 3/5/133 20/47/133 21/48/133
+f 14/32/134 13/28/134 15/35/134
+f 16/37/135 15/35/135 17/39/135
+f 13/29/136 22/50/136 27/58/136
+f 19/46/137 3/6/137 9/18/137
+f 36/81/138 29/63/138 35/80/138
+f 12/25/139 21/48/139 22/49/139
+f 34/77/140 1/1/140 31/68/140
+f 31/68/141 11/22/141 26/55/141
+f 21/48/142 28/59/142 22/49/142
+f 23/52/143 33/73/143 20/47/143
+f 32/71/144 36/81/144 38/85/144
+f 26/56/145 27/58/145 28/60/145
+f 36/81/146 18/44/146 30/65/146
+f 30/65/147 8/16/147 36/81/147
+f 32/72/148 23/52/148 24/53/148
+f 20/47/149 33/73/149 28/59/149
+f 39/86/150 40/88/150 37/82/150
+f 24/53/151 18/42/151 32/72/151
+f 29/61/152 34/77/152 35/79/152
+f 26/56/153 39/86/153 37/82/153
+f 43/96/154 37/83/154 40/87/154
+f 41/91/155 40/89/155 34/76/155
+f 38/85/156 35/80/156 40/88/156
+f 38/85/157 33/74/157 32/71/157
+f 31/67/158 26/56/158 37/82/158
+f 34/78/159 42/94/159 41/92/159
+f 46/106/160 43/96/160 45/101/160
+f 43/95/161 41/90/161 45/103/161
+f 42/93/162 37/84/162 46/104/162
+f 41/92/163 44/100/163 45/102/163
+f 49/111/35 48/109/35 50/113/35
+f 44/99/164 46/105/164 45/103/164
+f 52/119/35 49/111/35 50/113/35
+f 54/123/35 51/116/35 52/119/35
+f 55/125/35 54/123/35 56/129/35
+f 57/130/35 56/129/35 58/133/35
+f 59/134/35 58/133/35 60/136/35
+f 61/139/35 60/136/35 62/141/35
+f 63/143/35 62/141/35 64/147/35
+f 65/148/35 64/147/35 66/150/35
+f 68/154/35 65/148/35 66/150/35
+f 70/161/35 67/152/35 68/154/35
+f 72/165/35 69/158/35 70/161/35
+f 74/170/35 71/162/35 72/165/35
+f 76/173/35 73/168/35 74/170/35
+f 78/177/35 75/171/35 76/173/35
+f 81/184/35 70/161/35 80/182/35
+f 82/186/35 81/184/35 80/182/35
+f 85/193/35 82/186/35 84/191/35
+f 87/197/35 84/191/35 86/195/35
+f 89/201/35 47/108/35 88/199/35
+f 90/203/35 89/201/35 88/199/35
+f 92/207/35 91/206/35 90/203/35
+f 94/213/35 93/211/35 92/207/35
+f 97/219/35 94/213/35 96/217/35
+f 99/224/35 53/120/35 55/125/35
+f 101/229/35 98/222/35 99/224/35
+f 103/232/35 100/226/35 101/229/35
+f 104/235/35 103/232/35 105/237/35
+f 107/241/35 61/139/35 63/143/35
+f 109/247/35 106/239/35 107/241/35
+f 99/225/165 112/253/165 119/270/165
+f 111/251/166 98/223/166 120/273/166
+f 116/264/167 80/183/167 114/256/167
+f 49/112/168 132/300/168 47/107/168
+f 81/185/169 117/266/169 125/284/169
+f 63/144/170 130/297/170 123/277/170
+f 50/114/171 134/304/171 110/248/171
+f 68/155/172 136/308/172 114/257/172
+f 67/153/173 130/297/173 65/149/173
+f 100/227/174 128/293/174 120/272/174
+f 87/198/175 116/265/175 117/266/175
+f 128/294/176 103/233/176 119/270/176
+f 131/298/177 53/122/177 111/249/177
+f 107/242/178 123/278/178 121/274/178
+f 89/202/179 134/304/179 48/110/179
+f 71/163/180 124/282/180 69/157/180
+f 123/279/181 106/240/181 121/275/181
+f 54/124/182 113/255/182 56/128/182
+f 90/204/183 132/300/183 127/289/183
+f 55/127/184 122/276/184 112/252/184
+f 94/214/185 127/290/185 137/309/185
+f 126/287/186 76/174/186 125/284/186
+f 122/276/187 59/135/187 123/277/187
+f 95/216/188 133/302/188 93/210/188
+f 75/172/189 126/288/189 115/260/189
+f 97/220/190 137/310/190 118/268/190
+f 62/142/191 113/255/191 136/308/191
+f 125/285/192 124/283/192 115/261/192
+f 122/276/193 129/295/193 112/252/193
+f 114/259/194 117/267/194 116/263/194
+f 119/271/195 111/251/195 120/273/195
+f 133/303/196 144/328/196 143/327/196
+f 130/296/197 124/280/197 114/258/197
+f 130/297/198 122/276/198 123/277/198
+f 111/250/199 129/295/199 131/299/199
+f 110/248/200 142/323/200 138/313/200
+f 113/255/201 138/313/201 140/318/201
+f 130/297/202 135/305/202 122/276/202
+f 129/295/203 141/320/203 131/299/203
+f 135/306/204 136/307/204 140/319/204
+f 144/328/205 127/291/205 139/317/205
+f 139/316/206 131/299/206 141/320/206
+f 135/305/207 141/320/207 129/295/207
+f 148/334/208 147/333/208 145/329/208
+f 143/326/209 142/323/209 133/301/209
+f 140/319/210 147/333/210 135/306/210
+f 151/344/211 145/330/211 154/351/211
+f 149/338/212 148/336/212 151/343/212
+f 143/327/213 146/332/213 148/334/213
+f 146/332/214 141/321/214 147/333/214
+f 138/314/215 149/339/215 150/340/215
+f 145/331/216 150/341/216 154/352/216
+f 149/339/217 152/347/217 150/340/217
+f 153/349/218 154/353/218 152/346/218
+f 2/3/219 19/46/219 98/223/219
+f 6/11/220 13/27/220 80/183/220
+f 49/112/221 47/107/221 24/53/221
+f 3/7/222 99/225/222 101/228/222
+f 7/13/223 83/189/223 81/185/223
+f 22/49/224 65/149/224 63/144/224
+f 25/54/225 48/110/225 50/114/225
+f 5/9/226 66/151/226 68/155/226
+f 67/153/227 65/149/227 22/49/227
+f 9/19/228 102/231/228 100/227/228
+f 6/12/229 86/196/229 87/198/229
+f 23/51/230 2/4/230 53/122/230
+f 12/23/231 63/145/231 107/242/231
+f 89/202/232 48/110/232 25/54/232
+f 12/24/233 10/21/233 106/240/233
+f 54/124/234 56/128/234 11/22/234
+f 24/53/235 88/200/235 90/204/235
+f 16/38/236 73/167/236 71/163/236
+f 21/48/237 57/131/237 55/127/237
+f 11/22/238 58/132/238 60/137/238
+f 18/43/239 92/208/239 94/214/239
+f 17/40/240 15/34/240 76/174/240
+f 21/48/241 12/25/241 59/135/241
+f 95/216/242 93/210/242 29/62/242
+f 17/41/243 77/176/243 75/172/243
+f 30/66/244 96/218/244 97/220/244
+f 4/8/245 60/137/245 62/142/245
+f 7/14/246 15/35/246 13/28/246
+f 13/29/247 14/33/247 22/50/247
+f 36/81/248 8/16/248 29/63/248
+f 34/77/249 25/54/249 1/1/249
+f 31/68/250 1/1/250 11/22/250
+f 36/81/251 32/71/251 18/44/251
+f 32/72/252 33/73/252 23/52/252
+f 39/86/253 38/85/253 40/88/253
+f 26/56/254 28/60/254 39/86/254
+f 43/96/255 46/106/255 37/83/255
+f 41/91/256 43/97/256 40/89/256
+f 38/85/257 36/81/257 35/80/257
+f 38/85/258 39/86/258 33/74/258
+f 34/78/259 31/69/259 42/94/259
+f 42/93/260 31/70/260 37/84/260
+f 41/92/261 42/94/261 44/100/261
+f 49/111/35 47/108/35 48/109/35
+f 52/119/35 51/116/35 49/111/35
+f 54/123/35 53/120/35 51/116/35
+f 55/125/35 53/120/35 54/123/35
+f 57/130/35 55/125/35 56/129/35
+f 59/134/35 57/130/35 58/133/35
+f 61/139/35 59/134/35 60/136/35
+f 63/143/35 61/139/35 62/141/35
+f 65/148/35 63/143/35 64/147/35
+f 68/154/35 67/152/35 65/148/35
+f 70/161/35 69/158/35 67/152/35
+f 72/165/35 71/162/35 69/158/35
+f 74/170/35 73/168/35 71/162/35
+f 76/173/35 75/171/35 73/168/35
+f 78/177/35 77/175/35 75/171/35
+f 81/184/35 72/165/35 70/161/35
+f 82/186/35 83/188/35 81/184/35
+f 85/193/35 83/188/35 82/186/35
+f 87/197/35 85/193/35 84/191/35
+f 89/201/35 48/109/35 47/108/35
+f 90/203/35 91/206/35 89/201/35
+f 92/207/35 93/211/35 91/206/35
+f 94/213/35 95/215/35 93/211/35
+f 97/219/35 95/215/35 94/213/35
+f 99/224/35 98/222/35 53/120/35
+f 101/229/35 100/226/35 98/222/35
+f 103/232/35 102/230/35 100/226/35
+f 104/235/35 102/230/35 103/232/35
+f 107/241/35 106/239/35 61/139/35
+f 109/247/35 108/244/35 106/239/35
+f 99/225/262 55/126/262 112/253/262
+f 111/251/263 53/121/263 98/223/263
+f 116/264/264 82/187/264 80/183/264
+f 49/112/265 131/299/265 132/300/265
+f 81/185/266 83/189/266 117/266/266
+f 63/144/267 65/149/267 130/297/267
+f 50/114/268 48/110/268 134/304/268
+f 68/155/269 66/151/269 136/308/269
+f 67/153/270 124/281/270 130/297/270
+f 100/227/271 102/231/271 128/293/271
+f 87/198/272 86/196/272 116/265/272
+f 128/294/273 105/238/273 103/233/273
+f 131/298/274 51/117/274 53/122/274
+f 107/242/275 63/145/275 123/278/275
+f 89/202/276 133/301/276 134/304/276
+f 71/163/277 115/262/277 124/282/277
+f 123/279/278 61/140/278 106/240/278
+f 54/124/279 110/248/279 113/255/279
+f 90/204/280 88/200/280 132/300/280
+f 55/127/281 57/131/281 122/276/281
+f 94/214/282 92/208/282 127/290/282
+f 126/287/283 78/178/283 76/174/283
+f 122/276/284 57/131/284 59/135/284
+f 95/216/285 118/268/285 133/302/285
+f 75/172/286 77/176/286 126/288/286
+f 97/220/287 96/218/287 137/310/287
+f 62/142/288 60/137/288 113/255/288
+f 125/285/289 114/259/289 124/283/289
+f 114/259/290 125/285/290 117/267/290
+f 119/271/291 112/254/291 111/251/291
+f 133/303/292 118/269/292 144/328/292
+f 110/248/293 134/304/293 142/323/293
+f 113/255/294 110/248/294 138/313/294
+f 144/328/295 137/311/295 127/291/295
+f 139/316/296 132/300/296 131/299/296
+f 148/334/297 146/332/297 147/333/297
+f 140/319/298 145/329/298 147/333/298
+f 151/344/299 148/335/299 145/330/299
+f 149/338/300 142/324/300 148/336/300
+f 143/327/301 144/328/301 146/332/301
+f 146/332/302 139/317/302 141/321/302
+f 138/314/303 142/325/303 149/339/303
+f 145/331/304 138/315/304 150/341/304
+f 149/339/305 153/350/305 152/347/305
index 52de1269a2b5c6ccf2d40d8622e89f52b6ba909d..9d4c42223df572880c37938ee06ac76920ecf062 100644 (file)
@@ -1,22 +1,45 @@
-use std::time::Instant;
+use std::{path::Path, time::Instant};
 
 use narcissus_app::{create_app, Event, WindowDesc};
-use narcissus_core::{cstr, obj, slice, Image};
+use narcissus_core::{cstr, default, obj, Image};
 use narcissus_gpu::{
     create_vulkan_device, Bind, BindGroupLayoutDesc, BindGroupLayoutEntryDesc, BindingType, Buffer,
-    BufferDesc, BufferUsageFlags, ClearValue, Device, GraphicsPipelineDesc, GraphicsPipelineLayout,
-    LoadOp, MemoryLocation, RenderingAttachment, RenderingDesc, Scissor, ShaderDesc,
-    ShaderStageFlags, StoreOp, TextureDesc, TextureDimension, TextureFormat, TextureUsageFlags,
-    TextureViewDesc, ThreadToken, TypedBind, Viewport,
+    BufferDesc, BufferUsageFlags, ClearValue, CompareOp, CullingMode, Device, FrontFace,
+    GraphicsPipelineDesc, GraphicsPipelineLayout, IndexType, LoadOp, MemoryLocation, PolygonMode,
+    RenderingAttachment, RenderingDesc, Scissor, ShaderDesc, ShaderStageFlags, StoreOp,
+    TextureDesc, TextureDimension, TextureFormat, TextureUsageFlags, ThreadToken, Topology,
+    TypedBind, Viewport,
 };
-use narcissus_maths::{Vec2, Vec3};
+use narcissus_maths::{sin_cos_pi_f32, Deg, Mat4, Point3, Vec2, Vec3, Vec4};
+
+/// Marker trait indicates it's safe to convert a given type directly to an array of bytes.
+///
+/// # Safety
+///
+/// Must not be applied to any types with padding
+unsafe trait Blittable: Sized {}
+
+#[allow(unused)]
+struct Uniform {
+    clip_from_model: Mat4,
+}
 
-pub fn main() {
-    let blĂ„haj_obj = std::fs::File::open("narcissus/data/blĂ„haj.obj").unwrap();
+unsafe impl Blittable for Uniform {}
+
+#[allow(unused)]
+struct Vertex {
+    position: [f32; 4],
+    normal: [f32; 4],
+    texcoord: [f32; 4],
+}
 
+unsafe impl Blittable for Vertex {}
+unsafe impl Blittable for u16 {}
+
+fn load_obj<P: AsRef<Path>>(path: P) -> (Vec<Vertex>, Vec<u16>) {
     #[derive(Default)]
     struct ObjVisitor {
-        position: Vec<Vec3>,
+        positions: Vec<Vec3>,
         normals: Vec<Vec3>,
         texcoords: Vec<Vec2>,
         indices: Vec<[(i32, i32, i32); 3]>,
@@ -24,7 +47,7 @@ pub fn main() {
 
     impl obj::Visitor for ObjVisitor {
         fn visit_position(&mut self, x: f32, y: f32, z: f32, _w: f32) {
-            self.position.push(Vec3::new(x, y, z))
+            self.positions.push(Vec3::new(x, y, z))
         }
 
         fn visit_texcoord(&mut self, u: f32, v: f32, _w: f32) {
@@ -36,9 +59,8 @@ pub fn main() {
         }
 
         fn visit_face(&mut self, indices: &[(i32, i32, i32)]) {
-            for triangle in slice::array_windows::<_, 3>(indices) {
-                self.indices.push(*triangle)
-            }
+            self.indices
+                .push(indices.try_into().expect("not a triangle"));
         }
 
         fn visit_object(&mut self, _name: &str) {}
@@ -46,36 +68,136 @@ pub fn main() {
         fn visit_smooth_group(&mut self, _group: i32) {}
     }
 
-    let mut obj_visitor = ObjVisitor::default();
-    let mut obj_parser = obj::Parser::new(blĂ„haj_obj);
-
     let start = std::time::Instant::now();
-    obj_parser.visit(&mut obj_visitor).unwrap();
-    let end = std::time::Instant::now();
+    let path = path.as_ref();
+    let file = std::fs::File::open(path).expect("couldn't open file");
+    let mut visitor = ObjVisitor::default();
+
+    obj::Parser::new(file)
+        .visit(&mut visitor)
+        .expect("failed to parse obj file");
+
+    let (vertices, indices): (Vec<_>, Vec<_>) = visitor
+        .indices
+        .iter()
+        .flatten()
+        .enumerate()
+        .map(|(index, &(position_index, texcoord_index, normal_index))| {
+            let position = visitor.positions[position_index as usize - 1];
+            let normal = visitor.normals[normal_index as usize - 1];
+            let texcoord = visitor.texcoords[texcoord_index as usize - 1];
+            (
+                Vertex {
+                    position: Vec4::new(position.x, position.y, position.z, 0.0).into(),
+                    normal: Vec4::new(normal.x, normal.y, normal.z, 0.0).into(),
+                    texcoord: Vec4::new(texcoord.x, texcoord.y, 0.0, 0.0).into(),
+                },
+                index as u16,
+            )
+        })
+        .unzip();
 
     println!(
-        "loaded {} vertices, {} normals, {} texcoords, and {} indices",
-        obj_visitor.position.len(),
-        obj_visitor.normals.len(),
-        obj_visitor.texcoords.len(),
-        obj_visitor.indices.len(),
+        "parsing obj {path:?} took {:?}",
+        std::time::Instant::now() - start
     );
-    println!("took {:?}", end - start);
 
-    let start = std::time::Instant::now();
-    let blĂ„haj_image = std::fs::read("narcissus/data/blĂ„haj.png").unwrap();
-    let blĂ„haj = Image::from_buffer(&blĂ„haj_image).unwrap();
-    let end = std::time::Instant::now();
+    (vertices, indices)
+}
 
+fn load_img<P: AsRef<Path>>(path: P) -> Image {
+    let start = std::time::Instant::now();
+    let path = path.as_ref();
+    let image = Image::from_buffer(std::fs::read(path).expect("failed to read file").as_slice())
+        .expect("failed to load image");
     println!(
-        "loaded blĂ„haj width: {}, height: {}, components: {}",
-        blĂ„haj.width(),
-        blĂ„haj.height(),
-        blĂ„haj.components()
+        "loading image {path:?} took {:?}",
+        std::time::Instant::now() - start
     );
-    println!("took {:?}", end - start);
+    image
+}
+
+fn create_buffer_with_data<T>(device: &dyn Device, usage: BufferUsageFlags, data: &[T]) -> Buffer
+where
+    T: Blittable,
+{
+    let len = data.len() * std::mem::size_of::<T>();
+    let buffer = device.create_buffer(&BufferDesc {
+        memory_location: MemoryLocation::PreferHost,
+        usage,
+        size: len,
+    });
+    // Safety: T: Blittable which implies it's freely convertable to a byte slice.
+    unsafe {
+        let dst = std::slice::from_raw_parts_mut(device.map_buffer(buffer), len);
+        let src = std::slice::from_raw_parts(data.as_ptr() as *const u8, len);
+        dst.copy_from_slice(src);
+        device.unmap_buffer(buffer);
+    }
+    buffer
+}
+
+struct UniformBufferMap<'a> {
+    device: &'a dyn Device,
+    buffer: Buffer,
+    slice: &'a mut [u8],
+}
+
+impl<'a> UniformBufferMap<'a> {
+    pub fn new(device: &'a dyn Device, len: usize) -> Self {
+        let buffer = device.create_buffer(&BufferDesc {
+            memory_location: MemoryLocation::PreferHost,
+            usage: BufferUsageFlags::UNIFORM,
+            size: len,
+        });
+        unsafe {
+            let ptr = device.map_buffer(buffer);
+            let slice = std::slice::from_raw_parts_mut(ptr, len);
+            Self {
+                device,
+                buffer,
+                slice,
+            }
+        }
+    }
+
+    pub fn buffer(&self) -> Buffer {
+        self.buffer
+    }
+
+    pub fn write<T>(&mut self, value: T)
+    where
+        T: Blittable,
+    {
+        unsafe {
+            let src = std::slice::from_raw_parts(
+                &value as *const T as *const u8,
+                std::mem::size_of::<T>(),
+            );
+            self.slice.copy_from_slice(src)
+        }
+    }
+}
+
+impl<'a> Drop for UniformBufferMap<'a> {
+    fn drop(&mut self) {
+        // Safety: Make sure we don't have the slice outlive the mapping.
+        unsafe {
+            self.device.unmap_buffer(self.buffer);
+        }
+    }
+}
+
+pub fn main() {
+    let _blĂ„haj_image = load_img("narcissus/data/blĂ„haj.png");
+    let (blĂ„haj_vertices, blĂ„haj_indices) = load_obj("narcissus/data/blĂ„haj.obj");
 
     let app = create_app();
+    let window = app.create_window(&WindowDesc {
+        title: "narcissus",
+        width: 800,
+        height: 600,
+    });
 
     let device = create_vulkan_device(app.as_ref());
     let mut thread_token = ThreadToken::new();
@@ -83,10 +205,10 @@ pub fn main() {
     #[repr(align(4))]
     struct Spirv<const LEN: usize>([u8; LEN]);
 
-    let vert_shader_spv = Spirv(*include_bytes!("shaders/triangle.vert.spv"));
-    let frag_shader_spv = Spirv(*include_bytes!("shaders/triangle.frag.spv"));
+    let vert_shader_spv = Spirv(*include_bytes!("shaders/basic.vert.spv"));
+    let frag_shader_spv = Spirv(*include_bytes!("shaders/basic.frag.spv"));
 
-    let bind_group_layout = device.create_bind_group_layout(&BindGroupLayoutDesc {
+    let uniform_bind_group_layout = device.create_bind_group_layout(&BindGroupLayoutDesc {
         entries: &[BindGroupLayoutEntryDesc {
             slot: 0,
             stages: ShaderStageFlags::ALL,
@@ -95,6 +217,15 @@ pub fn main() {
         }],
     });
 
+    let storage_bind_group_layout = device.create_bind_group_layout(&BindGroupLayoutDesc {
+        entries: &[BindGroupLayoutEntryDesc {
+            slot: 0,
+            stages: ShaderStageFlags::ALL,
+            binding_type: BindingType::StorageBuffer,
+            count: 1,
+        }],
+    });
+
     let pipeline = device.create_graphics_pipeline(&GraphicsPipelineDesc {
         vertex_shader: ShaderDesc {
             entrypoint_name: cstr!("main"),
@@ -104,99 +235,58 @@ pub fn main() {
             entrypoint_name: cstr!("main"),
             code: &frag_shader_spv.0,
         },
-        bind_group_layouts: &[bind_group_layout],
+        bind_group_layouts: &[uniform_bind_group_layout, storage_bind_group_layout],
         layout: GraphicsPipelineLayout {
             color_attachment_formats: &[TextureFormat::BGRA8_SRGB],
-            depth_attachment_format: None,
+            depth_attachment_format: Some(TextureFormat::DEPTH_F32),
             stencil_attachment_format: None,
         },
+        topology: Topology::Triangles,
+        polygon_mode: PolygonMode::Fill,
+        culling_mode: CullingMode::Back,
+        front_face: FrontFace::Clockwise,
+        depth_compare_op: CompareOp::GreaterOrEqual,
+        depth_test_enable: true,
+        depth_write_enable: true,
+        stencil_test_enable: false,
+        stencil_back: default(),
+        stencil_front: default(),
     });
 
-    let window = app.create_window(&WindowDesc {
-        title: "narcissus",
-        width: 800,
-        height: 600,
-    });
-
-    let texture = device.create_texture(&TextureDesc {
-        memory_location: MemoryLocation::PreferDevice,
-        usage: TextureUsageFlags::SAMPLED,
-        dimension: TextureDimension::Type2d,
-        format: TextureFormat::BGRA8_SRGB,
-        width: 800,
-        height: 600,
-        depth: 1,
-        layers: 1,
-        mip_levels: 1,
-    });
-
-    let texture2 = device.create_texture_view(&TextureViewDesc {
-        texture,
-        dimension: TextureDimension::Type2d,
-        format: TextureFormat::BGRA8_SRGB,
-        base_mip: 0,
-        mip_count: 1,
-        base_layer: 0,
-        layer_count: 1,
-    });
-
-    let frame_token = device.begin_frame();
-    device.destroy_texture(&frame_token, texture);
-    device.destroy_texture(&frame_token, texture2);
-    device.end_frame(frame_token);
-
-    struct UniformBufferMap<'a> {
-        device: &'a dyn Device,
-        buffer: Buffer,
-        slice: &'a mut [u8],
-    }
-
-    impl<'a> UniformBufferMap<'a> {
-        pub fn new(device: &'a dyn Device, len: usize) -> Self {
-            let buffer = device.create_buffer(&BufferDesc {
-                memory_location: MemoryLocation::PreferHost,
-                usage: BufferUsageFlags::UNIFORM,
-                size: len,
-            });
-            unsafe {
-                let ptr = device.map_buffer(buffer);
-                let slice = std::slice::from_raw_parts_mut(ptr, len);
-                Self {
-                    device,
-                    buffer,
-                    slice,
-                }
-            }
-        }
-
-        pub fn buffer(&self) -> Buffer {
-            self.buffer
-        }
+    let blĂ„haj_vertex_buffer = create_buffer_with_data(
+        device.as_ref(),
+        BufferUsageFlags::STORAGE,
+        blĂ„haj_vertices.as_slice(),
+    );
 
-        pub fn write_f32(&mut self, value: f32) {
-            self.slice.copy_from_slice(&value.to_le_bytes());
-        }
-    }
+    let blĂ„haj_index_buffer = create_buffer_with_data(
+        device.as_ref(),
+        BufferUsageFlags::INDEX,
+        blĂ„haj_indices.as_slice(),
+    );
 
-    impl<'a> Drop for UniformBufferMap<'a> {
-        fn drop(&mut self) {
-            // Safety: Make sure we don't have the slice outlive the mapping.
-            unsafe {
-                self.device.unmap_buffer(self.buffer);
-            }
-        }
-    }
+    let mut uniforms = UniformBufferMap::new(device.as_ref(), std::mem::size_of::<Uniform>());
 
-    let mut uniforms = UniformBufferMap::new(device.as_ref(), 4);
+    let mut depth_width = 0;
+    let mut depth_height = 0;
+    let mut depth_image = default();
 
     let start_time = Instant::now();
     'main: loop {
         let frame_token = device.begin_frame();
 
         let frame_start = Instant::now() - start_time;
-        let frame_start = frame_start.as_secs_f32();
+        let frame_start = frame_start.as_secs_f32() * 0.5;
+
+        let (s, c) = sin_cos_pi_f32(frame_start);
+        let camera_from_model =
+            Mat4::look_at(Point3::new(s * 5.0, 1.0, c * 5.0), Point3::ZERO, -Vec3::Y);
+        let clip_from_camera =
+            Mat4::perspective_rev_inf_zo(Deg::new(90.0).into(), 800.0 / 600.0, 0.01);
+
+        let clip_from_model = clip_from_camera * camera_from_model;
 
-        uniforms.write_f32(frame_start);
+        uniforms.write(Uniform { clip_from_model });
 
         while let Some(event) = app.poll_event() {
             use Event::*;
@@ -216,8 +306,60 @@ pub fn main() {
         let (width, height, swapchain_image) =
             device.acquire_swapchain(&frame_token, window, TextureFormat::BGRA8_SRGB);
 
+        if width != depth_width || height != depth_height {
+            device.destroy_texture(&frame_token, depth_image);
+            depth_image = device.create_texture(&TextureDesc {
+                memory_location: MemoryLocation::PreferDevice,
+                usage: TextureUsageFlags::DEPTH_STENCIL,
+                dimension: TextureDimension::Type2d,
+                format: TextureFormat::DEPTH_F32,
+                width,
+                height,
+                depth: 1,
+                layers: 1,
+                mip_levels: 1,
+            });
+            depth_width = width;
+            depth_height = height;
+        }
+
         let command_buffer_token = device.create_command_buffer(&frame_token, &mut thread_token);
 
+        device.cmd_set_bind_group(
+            &frame_token,
+            &mut thread_token,
+            &command_buffer_token,
+            pipeline,
+            uniform_bind_group_layout,
+            0,
+            &[Bind {
+                binding: 0,
+                array_element: 0,
+                typed: TypedBind::UniformBuffer(&[uniforms.buffer()]),
+            }],
+        );
+
+        device.cmd_set_bind_group(
+            &frame_token,
+            &mut thread_token,
+            &command_buffer_token,
+            pipeline,
+            storage_bind_group_layout,
+            1,
+            &[Bind {
+                binding: 0,
+                array_element: 0,
+                typed: TypedBind::StorageBuffer(&[blĂ„haj_vertex_buffer]),
+            }],
+        );
+
+        device.cmd_set_index_buffer(
+            &command_buffer_token,
+            blĂ„haj_index_buffer,
+            0,
+            IndexType::U16,
+        );
+
         device.cmd_begin_rendering(
             &frame_token,
             &mut thread_token,
@@ -234,25 +376,19 @@ pub fn main() {
                     ])),
                     store_op: StoreOp::Store,
                 }],
-                depth_attachment: None,
+                depth_attachment: Some(RenderingAttachment {
+                    texture: depth_image,
+                    load_op: LoadOp::Clear(ClearValue::DepthStencil {
+                        depth: 0.0,
+                        stencil: 0,
+                    }),
+                    store_op: StoreOp::DontCare,
+                }),
                 stencil_attachment: None,
             },
         );
 
         device.cmd_set_pipeline(&command_buffer_token, pipeline);
-        device.cmd_set_bind_group(
-            &frame_token,
-            &mut thread_token,
-            &command_buffer_token,
-            pipeline,
-            bind_group_layout,
-            0,
-            &[Bind {
-                binding: 0,
-                array_element: 0,
-                typed: TypedBind::Buffer(&[uniforms.buffer()]),
-            }],
-        );
 
         device.cmd_set_scissors(
             &command_buffer_token,
@@ -263,6 +399,7 @@ pub fn main() {
                 height,
             }],
         );
+
         device.cmd_set_viewports(
             &command_buffer_token,
             &[Viewport {
@@ -274,7 +411,16 @@ pub fn main() {
                 max_depth: 1.0,
             }],
         );
-        device.cmd_draw(&command_buffer_token, 3, 1, 0, 0);
+
+        device.cmd_draw_indexed(
+            &command_buffer_token,
+            blĂ„haj_indices.len() as u32,
+            1,
+            0,
+            0,
+            0,
+        );
+
         device.cmd_end_rendering(&command_buffer_token);
 
         device.submit(&frame_token, &mut thread_token, command_buffer_token);
similarity index 91%
rename from narcissus/src/shaders/triangle.frag.glsl
rename to narcissus/src/shaders/basic.frag.glsl
index e948fd6e8b8c238bfae1663747bb7d82dee33d85..ad841f7de8469f227ec5690287b859df73099861 100644 (file)
@@ -1,4 +1,4 @@
-#version 450
+#version 460
 
 layout(location = 0) in vec3 fragColor;
 layout(location = 0) out vec4 outColor;
diff --git a/narcissus/src/shaders/basic.frag.spv b/narcissus/src/shaders/basic.frag.spv
new file mode 100644 (file)
index 0000000..869b211
Binary files /dev/null and b/narcissus/src/shaders/basic.frag.spv differ
diff --git a/narcissus/src/shaders/basic.vert.glsl b/narcissus/src/shaders/basic.vert.glsl
new file mode 100644 (file)
index 0000000..aaad3a8
--- /dev/null
@@ -0,0 +1,24 @@
+#version 460
+
+layout(set = 0, binding = 0) uniform uniformBuffer {
+    mat4 viewProj;
+};
+
+struct Vertex {
+    vec4 position;
+    vec4 normal;
+    vec4 texcoord;
+};
+
+layout(std430, set = 1, binding = 0) readonly buffer vertexBuffer {
+    Vertex vertices[];
+};
+
+layout(location = 0) out vec3 fragColor;
+
+void main() {
+    Vertex vertex = vertices[gl_VertexIndex];
+    vec3 pos = vertex.position.xyz;
+    gl_Position = vec4(pos, 1.0) * viewProj;
+    fragColor = vertex.normal.xyz * 0.5 + 0.5;
+}
diff --git a/narcissus/src/shaders/basic.vert.spv b/narcissus/src/shaders/basic.vert.spv
new file mode 100644 (file)
index 0000000..c0b9e88
Binary files /dev/null and b/narcissus/src/shaders/basic.vert.spv differ
diff --git a/narcissus/src/shaders/build.sh b/narcissus/src/shaders/build.sh
new file mode 100755 (executable)
index 0000000..66595df
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+glslc --target-env=vulkan1.3 -O -fshader-stage=vert -o basic.vert.spv basic.vert.glsl
+glslc --target-env=vulkan1.3 -O -fshader-stage=frag -o basic.frag.spv basic.frag.glsl
\ No newline at end of file
diff --git a/narcissus/src/shaders/triangle.frag.spv b/narcissus/src/shaders/triangle.frag.spv
deleted file mode 100644 (file)
index 8a4cc40..0000000
Binary files a/narcissus/src/shaders/triangle.frag.spv and /dev/null differ
diff --git a/narcissus/src/shaders/triangle.vert.glsl b/narcissus/src/shaders/triangle.vert.glsl
deleted file mode 100644 (file)
index 062e2a3..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#version 450
-
-layout(set = 0, binding = 0) uniform uniformBuffer {
-    float someValue;
-};
-
-layout(location = 0) out vec3 fragColor;
-
-vec2 positions[3] = vec2[](
-    vec2(0.0, -0.5),
-    vec2(0.5, 0.5),
-    vec2(-0.5, 0.5)
-);
-
-vec3 colors[3] = vec3[](
-    vec3(1.0, 0.0, 0.0),
-    vec3(0.0, 1.0, 0.0),
-    vec3(0.0, 0.0, 1.0)
-);
-
-void main() {
-    vec2 pos = positions[gl_VertexIndex];
-    pos.y += sin(someValue);
-    gl_Position = vec4(pos, 0.0, 1.0);
-    fragColor = colors[gl_VertexIndex];
-}
\ No newline at end of file
diff --git a/narcissus/src/shaders/triangle.vert.spv b/narcissus/src/shaders/triangle.vert.spv
deleted file mode 100644 (file)
index 2ed69c3..0000000
Binary files a/narcissus/src/shaders/triangle.vert.spv and /dev/null differ