1 let create_gui_camera (os_window : OsWindow) = 2 let get_ui_camera_position (width : u32) (height : u32) = Vector3 3 x = width as f32 / 2 4 y = height as f32 / 2 5 z = -1 6 7 let camera = Camera.orthographic_flip_y 8 position = get_ui_camera_position os_window.width os_window.height 9 direction = Vector3 0 0 1 10 far = 300 11 scale = 1 12 13 os_window.sizes.subscribe { w, h -> 14 camera.position = get_ui_camera_position w h } 15 |> camera.push_token 16 17 camera 18 19 let add_lights (lighting : Lighting) = 20 let light = LocalLight.create 21 direction = Vector3 0 1 0 22 color = Vector4 1 1 1 1 23 24 lighting.local_lights.add light 25 26 object Drawer = 27 val bindings = List<Binding>.new 28 29 def add (binding : Binding) = 30 bindings.add binding 31 32 type Drawer = 33 let os_window : OsWindow 34 let instance @publish = Instance.create 35 let surface = glfw/create_surface instance.object os_window.window 36 let swapchain = Swapchain.create surface os_window.width os_window.height 37 let frame_count = swapchain.image_resources.size + 1 38 let command_buffer @publish = CommandBuffer.create frame_count 39 let buffer_pool @publish = BufferPool.create frame_count 40 let sampler = 41 let properties = SamplerProperties 42 max_lod = 1 43 f@ SamplerProperties.default 44 45 VkSampler.create instance.device properties@ref 46 47 val resources = Resources.create instance command_buffer buffer_pool 48 val materials = Materials.create sampler 49 50 val vulkan @publish = Vulkan.create 51 =instance =command_buffer =buffer_pool =sampler =swapchain 52 get_shader = resources.get_shader 53 image_changed = resources.image_changed 54 55 println "" 56 57 val ui_camera = create_gui_camera os_window 58 let pipeline_layout = PipelineLayout.create Drawer.bindings.as_slice 0 59 ShaderStageFlags@zero 60 val lighting = Lighting.create pipeline_layout 61 add_lights lighting 62 63 val renderer = 64 let camera = Camera.perspective 65 position = Vector3 40 70 0 66 direction = Vector3 0 -2 1 67 near = 1 68 far = 100 69 70 let size = Atom<Size> (Size swapchain.width swapchain.height) 71 let max_size = 72 if os_window.is_resizable then 73 let monitor = Glfw.get_primary_monitor 74 let video_mode = 75 let ptr = Glfw.get_video_mode monitor 76 ptr@to_ref 77 78 Size width = video_mode.width as u32 79 height = video_mode.height as u32 80 else 81 Size swapchain.width swapchain.height 82 83 let (token, tonemap_color, nodes) = renderer/create_for_render 84 size.as_readonly 85 max_size 86 SampleCountFlags/8 87 88 let blit_image = BlitImage 89 image = tonemap_color 90 offset = Vector2i.new 91 92 let guards = list_of<Object -> bool> 93 { not _.material.is_translucent } 94 { _.material.is_translucent } 95 96 let renderer = Renderer.create 97 size 98 camera 99 lighting 100 Field/Object 101 nodes 102 guards 103 CullModeFlags/Back 104 blit_image 105 106 renderer.push_token token 107 renderer 108 109 val renderers @mut = mut_list_of renderer 110 111 let size_token = os_window.sizes.subscribe { w, h -> 112 let size = Size w h 113 for renderer in renderers do 114 renderer.size.set size } 115 116 fun destruct = 117 size_token.discard 118 vulkan.discard 119