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