/* Ċ * ĠVulkan ĠExample Ġ- ĠModel Ġloading Ġand Ġrendering Ċ * Ċ * ĠCopyright Ġ( C ) Ġ 2 0 1 6 Ġby ĠS as cha ĠWil lems Ġ- Ġwww . sas ch aw il lems . de Ċ * Ċ * ĠThis Ġcode Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense Ġ( MIT ) Ġ( http :// opensource . org / licenses / MIT ) Ċ */ Ċ Ċ package Ġv ulkan . basics Ċ Ċ import Ġass imp . Ai Post Process Steps Flags Ċ import Ġass imp . Importer Ċ import Ġass imp . or Ċ import Ġglm _. L Ċ import Ġglm _. func . rad Ċ import Ġglm _. glm Ċ import Ġglm _. mat 4 x 4 . Mat 4 Ċ import Ġglm _. size Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġglm _. vec 3 . Vec 3 Ċ import Ġglm _. vec 4 . Vec 4 Ċ import Ġk ool . adr Ċ import Ġorg . lwjgl . system . Memory Util . NULL Ċ import Ġorg . lwjgl . v ulkan . VkDevice Ċ import Ġorg . lwjgl . v ulkan . Vk Pipeline Vertex Input State CreateInfo Ċ import Ġorg . lwjgl . v ulkan . Vk Vertex Input Attribute Description Ċ import Ġorg . lwjgl . v ulkan . Vk Vertex Input Binding Description Ċ import Ġvk k .* Ċ import Ġv ulkan . use Staging Ċ import Ġv ulkan . VERTEX _ BUFFER _ BIND _ ID Ċ import Ġv ulkan . asset Path Ċ import Ġv ulkan . base . Buffer Ċ import Ġv ulkan . base . Texture 2 D Ċ import Ġv ulkan . base . Vulkan Example Base Ċ import Ġv ulkan . base . tools Ċ import Ġass imp . Ai Post Process Step Ġas ĠP p ĊĊ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ ĠModel Rendering (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Window () ĊĠĠĠĠĠĠĠ Ġinit Vulkan () ĊĠĠĠĠĠĠĠ Ġprepare () ĊĠĠĠĠĠĠĠ Ġrender Loop () ĊĠĠĠĠĠĠĠ Ġdestroy () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġclass ĠModel Rendering Ġ: ĠVulkan Example Base () Ġ{ ĊĊĠĠĠ Ġvar Ġwire frame Ġ= Ġfalse ĊĊĠĠĠ Ġobject Ġtextures Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolor Map Ġ= ĠTexture 2 D () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject Ġvertices Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġinput State : ĠVk Pipeline Vertex Input State CreateInfo ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġbinding Descriptions : ĠVk Vertex Input Binding Description ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġattribute Descriptions : ĠVk Vertex Input Attribute Description . Buffer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠVertex Ġlayout Ġused Ġin Ġthis Ġexample ĊĠĠĠ Ġ// ĠThis Ġmust Ġfit Ġinput Ġlocations Ġof Ġthe Ġvertex Ġshader Ġused Ġto Ġrender Ġthe Ġmodel ĊĠĠĠ Ġclass ĠVertex Ġ: ĠBuffer izable () Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġpos : ĠVec 3 ĊĠĠĠĠĠĠĠ Ġ@ Order ( 1 ) ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġnormal : ĠVec 3 ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġuv : ĠVec 2 ĊĠĠĠĠĠĠĠ Ġ@ Order ( 3 ) ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcolor : ĠVec 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠContains Ġall ĠVulkan Ġresources Ġrequired Ġto Ġrepresent Ġvertex Ġand Ġindex Ġbuffers Ġfor Ġa Ġmodel ĊĠĠĠ Ġ// ĠThis Ġis Ġfor Ġdemonstr ation Ġand Ġlearning Ġpurposes , Ġthe Ġother Ġexamples Ġuse Ġa Ġmodel Ġloader Ġclass Ġfor Ġeasy Ġaccess ĊĠĠĠ Ġobject Ġmodel Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġvertices Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer Ġ= ĠVk Buffer ( NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmemory Ġ= ĠVk Device Memory ( NULL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobject Ġindices Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer Ġ= ĠVk Buffer ( NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmemory Ġ= ĠVk Device Memory ( NULL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDest ro ys Ġall ĠVulkan Ġresources Ġcreated Ġfor Ġthis Ġmodel ĊĠĠĠĠĠĠĠ Ġfun Ġdestroy ( device : ĠVk Device ) Ġ= Ġdevice . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Buffer ( vertices . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Memory ( vertices . memory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Buffer ( indices . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Memory ( indices . memory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject Ġuniform Buffers Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscene Ġ= ĠBuffer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject Ġub o VS Ġ: ĠBuffer izable () Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġprojection : ĠMat 4 ĊĠĠĠĠĠĠĠ Ġ@ Order ( 1 ) ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġmodel : ĠMat 4 ĊĠĠĠĠĠĠĠ Ġ@ Order ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġlight Pos Ġ= ĠVec 4 ( 2 5 f , Ġ 5 f , Ġ 5 f , Ġ 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject Ġpipelines Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsolid Ġ= ĠVk Pipeline ( NULL ) ĊĠĠĠĠĠĠĠ Ġvar Ġwire frame Ġ= ĠVk Pipeline ( NULL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġpipeline Layout Ġ= ĠVk Pipeline Layout ( NULL ) ĊĠĠĠ Ġvar Ġdescriptor Set Ġ= ĠVk DescriptorSet ( NULL ) ĊĠĠĠ Ġvar Ġdescriptor Set Layout Ġ= ĠVk DescriptorSet Layout ( NULL ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġzoom Ġ= Ġ- 5 . 5 f ĊĠĠĠĠĠĠĠ Ġzoom Speed Ġ= Ġ 2 . 5 f ĊĠĠĠĠĠĠĠ Ġrotation Speed Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠ Ġrotation (- 0 . 5 f , Ġ- 1 1 2 . 7 5 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġcamera Pos ( 0 . 1 f , Ġ 1 . 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Model Ġrendering " ĊĠĠĠĠĠĠĠ Ġsettings . overlay Ġ= Ġfalse Ġ// ĠTODO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠClean Ġup Ġused ĠVulkan Ġresources ĊĠĠĠĠĠĠĠ Ġ// ĠNote Ġ: ĠInherit ed Ġdestructor Ġcle ans Ġup Ġresources Ġstored Ġin Ġbase Ġclass ĊĠĠĠĠĠĠĠ Ġdevice . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Pipeline ( pipelines . solid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pipelines . wire frame . L Ġ!= ĠNULL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Pipeline ( pipelines . wire frame ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Pipeline Layout ( pipeline Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy DescriptorSet Layout ( descriptor Set Layout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmodel . destroy ( device ) ĊĊĠĠĠĠĠĠĠ Ġtextures . color Map . destroy () ĊĠĠĠĠĠĠĠ Ġuniform Buffers . scene . destroy () ĊĊĠĠĠĠĠĠĠ Ġsuper . destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Enabled Features () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFill Ġmode Ġnon Ġsolid Ġis Ġrequired Ġfor Ġwire frame Ġdisplay ĊĠĠĠĠĠĠĠ Ġif Ġ( device Features . fill Mode Non Solid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Features . fill Mode Non Solid Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Command Buffers () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Buf Info Ġ= Ġvk . CommandBuffer Begin Info () ĊĊĠĠĠĠĠĠĠ Ġval Ġclear Values Ġ= Ġvk . Clear Value ( 2 ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 0 ]. color ( default Clear Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 1 ]. depth Stencil ( 1 f , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrender Pass Begin Info Ġ= Ġvk . RenderPass Begin Info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Pass Ġ= Ġthis @ Model Rendering . render Pass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Area . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextent ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . clear Values Ġ= Ġclear Values ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdraw Cmd Buffers . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġtarget Ġframe Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Pass Begin Info . framebuffer ( frame Buffers [ i ]. L ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Cmd Buffers [ i ]. apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin ( cmd Buf Info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin RenderPass ( render Pass Begin Info , ĠVk Sub pass Contents . INLINE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Viewport ( size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Sc issor ( size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Descriptor Sets ( Vk Pipeline Bind Point . GRAPH ICS , Ġpipeline Layout , Ġdescriptor Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Pipeline ( Vk Pipeline Bind Point . GRAPH ICS , Ġif Ġ( wire frame ) Ġpipelines . wire frame Ġelse Ġpipelines . solid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBind Ġmesh Ġvertex Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Vertex Buffers ( VERTEX _ BUFFER _ BIND _ ID , Ġmodel . vertices . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBind Ġmesh Ġindex Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Index Buffer ( model . indices . buffer , ĠVk Device Size ( 0 ), ĠVk Index Type . UINT 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRender Ġmesh Ġvertex Ġbuffer Ġusing Ġit 's Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Indexed ( model . indices . count , Ġ 1 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw UI () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend RenderPass () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLoad Ġa Ġmodel Ġfrom Ġfile Ġusing Ġthe ĠASS IMP Ġmodel Ġloader Ġand Ġgenerate Ġall Ġresources Ġrequired Ġto Ġrender Ġthe Ġmodel Ġ*/ ĊĠĠĠ Ġfun Ġload Model ( filename : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġmodel Ġfrom Ġfile Ġusing ĠASS IMP ĊĊĠĠĠĠĠĠĠ Ġ// ĠFlags Ġfor Ġloading Ġthe Ġmesh ĊĠĠĠĠĠĠĠ Ġval Ġass imp Flags : ĠA i Post Process Steps Flags Ġ= ĠP p . Flip Wind ing Order Ġor ĠP p . Tri ang ulate Ġor ĠP p . Pre Transform Vertices ĊĊĠĠĠĠĠĠĠ Ġval Ġscene Ġ= ĠImport er (). readFile ( filename , Ġass imp Flags ) !! ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġvertex Ġbuffer Ġfrom ĠASS IMP Ġscene Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= ĠArrayList < Vertex >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠIterate Ġthrough Ġall Ġmeshes Ġin Ġthe Ġfile Ġand Ġextract Ġthe Ġvertex Ġcomponents ĊĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġ 0 Ġuntil Ġscene . num Mes hes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġ 0 Ġuntil Ġscene . meshes [ m ]. num Vertices ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Ġ= ĠVertex (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġglm Ġmake _* Ġfunctions Ġto Ġconvert ĠASS IMP Ġvectors Ġto Ġglm Ġvectors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= Ġscene . meshes [ m ]. vertices [ v ] Ġ* Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Ġ= Ġscene . meshes [ m ]. normals [ v ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTexture Ġcoordinates Ġand Ġcolors Ġmay Ġhave Ġmultiple Ġchannels , Ġwe Ġonly Ġuse Ġthe Ġfirst Ġ[ 0 ] Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuv Ġ= ĠVec 2 ( scene . meshes [ m ]. texture Coords [ 0 ][ v ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMesh Ġmay Ġnot Ġhave Ġvertex Ġcolors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġscene . meshes [ m ]. colors . get OrNull ( 0 )?. let Ġ{ ĠVec 3 ( it [ v ]) Ġ} Ġ?: ĠVec 3 ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVulkan Ġuses Ġa Ġright - h anded ĠN DC Ġ( contr ary Ġto ĠOpenGL ), Ġso Ġsimply Ġflip ĠY - Axis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos . y Ġ*= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices Ġ+= Ġvertex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvertex Buffer Ġ= Ġbuffer Of ( vertices ) ĊĠĠĠĠĠĠĠ Ġval Ġvertex BufferSize Ġ= ĠVk Device Size ( vertex Buffer . size . L ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġindex Ġbuffer Ġfrom ĠASS IMP Ġscene Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġindices Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġ 0 Ġuntil Ġscene . num Mes hes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Base Ġ= Ġindices . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġ 0 Ġuntil Ġscene . meshes [ m ]. num Faces ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġassume Ġthat Ġall Ġfaces Ġare Ġtri ang ulated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices Ġ+= Ġscene . meshes [ m ]. faces [ f ][ i ] Ġ+ Ġindex Base ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġindex Buffer Ġ= Ġint ArrayOf ( indices ) ĊĠĠĠĠĠĠĠ Ġval Ġindex BufferSize Ġ= ĠVk Device Size ( index Buffer . size . L ) ĊĠĠĠĠĠĠĠ Ġmodel . indices . count Ġ= Ġindices . size ĊĊĠĠĠĠĠĠĠ Ġ// ĠStatic Ġmesh Ġshould Ġalways Ġbe Ġdevice Ġlocal ĊĊĠĠĠĠĠĠĠ Ġif Ġ( use Staging ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Staging Ġ= Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer Ġ= ĠVk Buffer ( NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmemory Ġ= ĠVk Device Memory ( NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Staging Ġ= Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer Ġ= ĠVk Buffer ( NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmemory = ĠVk Device Memory Ġ( NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġstaging Ġbuffers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVertex Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ulkan Device . create Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Buffer Usage . TRANSFER _ SRC _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Memory Property . HOST _ VISIBLE _ BIT Ġor ĠVk Memory Property . HOST _ CO HER ENT _ BIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex BufferSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Staging :: buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Staging :: memory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Buffer . adr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndex Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ulkan Device . create Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Buffer Usage . TRANSFER _ SRC _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Memory Property . HOST _ VISIBLE _ BIT Ġor ĠVk Memory Property . HOST _ CO HER ENT _ BIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex BufferSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Staging :: buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Staging :: memory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Buffer . adr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġdevice Ġlocal Ġbuffers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVertex Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ulkan Device . create Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Buffer Usage . VERTEX _ BUFFER _ BIT Ġor ĠVk Buffer Usage . TRANSFER _ DST _ BIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Memory Property . DEVICE _ LOCAL _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex BufferSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . vertices :: buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . vertices :: memory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndex Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ulkan Device . create Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Buffer Usage . INDEX _ BUFFER _ BIT Ġor ĠVk Buffer Usage . TRANSFER _ DST _ BIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Memory Property . DEVICE _ LOCAL _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex BufferSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . indices :: buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . indices :: memory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCopy Ġfrom Ġstaging Ġbuffers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Cmd Ġ= Ġsuper . create CommandBuffer ( Vk CommandBuffer Level . PRIMARY , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Region Ġ= Ġvk . Buffer Copy Ġ{ Ġsize Ġ= Ġvertex BufferSize Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Cmd . copy Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Staging . buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . vertices . buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Region ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Region . size Ġ= Ġindex BufferSize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Cmd . copy Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Staging . buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . indices . buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Region ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . flush CommandBuffer ( copy Cmd , Ġqueue , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Buffer ( vertex Staging . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree Memory ( vertex Staging . memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Buffer ( index Staging . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree Memory ( index Staging . memory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVertex Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ulkan Device . create Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Buffer Usage . VERTEX _ BUFFER _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Memory Property . HOST _ VISIBLE _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex BufferSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . vertices :: buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . vertices :: memory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Buffer . adr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndex Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ulkan Device . create Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Buffer Usage . INDEX _ BUFFER _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Memory Property . HOST _ VISIBLE _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex BufferSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . indices :: buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . indices :: memory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Buffer . adr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Assets () Ġ{ ĊĠĠĠĠĠĠĠ Ġload Model ("$ asset Path / models / voy ager / voy ager . dae ") ĊĠĠĠĠĠĠĠ Ġval Ġ( texture , Ġformat ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Features . texture Compression BC Ġ-> Ġ" voy ager _ bc 3 _ un orm . k tx " Ġto ĠVk Format . BC 3 _ UN ORM _ BLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Features . texture Compression AST C _ L DR Ġ-> Ġ" voy ager _ ast c _ 8 x 8 _ un orm . k tx " Ġto ĠVk Format . AST C _ 8 x 8 _ UN ORM _ BLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Features . texture Compression ET C 2 Ġ-> Ġ" voy ager _ etc 2 _ un orm . k tx " Ġto ĠVk Format . ET C 2 _ R 8 G 8 B 8 A 8 _ UN ORM _ BLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtools . exit Fatal (" Device Ġdoes Ġnot Ġsupport Ġany Ġcompressed Ġtexture Ġformat !", ĠERROR _ FEATURE _ NOT _ PRESENT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtextures . color Map . load FromFile ("$ asset Path / models / voy ager /$ texture ", Ġformat , Ġv ulkan Device , Ġqueue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Vertex Descriptions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvertex Ġ= ĠVertex () ĊĠĠĠĠĠĠĠ Ġ// ĠBinding Ġdescription ĊĠĠĠĠĠĠĠ Ġvertices . binding Descriptions Ġ= Ġvk . Vertex Input Binding Description ( VERTEX _ BUFFER _ BIND _ ID , Ġvertex . size , ĠVk Vertex Input Rate . VERTEX ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAttribute Ġdescriptions ĊĠĠĠĠĠĠĠ Ġ// ĠDescri bes Ġmemory Ġlayout Ġand Ġshader Ġpositions ĊĠĠĠĠĠĠĠ Ġvertices . attribute Descriptions Ġ= Ġvk . Vertex Input Attribute Description ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLocation Ġ 0 Ġ: ĠPosition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT EX _ BUFFER _ BIND _ ID , Ġ 0 , ĠVk Format . R 3 2 G 3 2 B 3 2 _ S FLOAT , Ġvertex . offset Of (" pos "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLocation Ġ 1 Ġ: ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT EX _ BUFFER _ BIND _ ID , Ġ 1 , ĠVk Format . R 3 2 G 3 2 B 3 2 _ S FLOAT , Ġvertex . offset Of (" normal "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLocation Ġ 2 Ġ: ĠTexture Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT EX _ BUFFER _ BIND _ ID , Ġ 2 , ĠVk Format . R 3 2 G 3 2 _ S FLOAT , Ġvertex . offset Of (" uv "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLocation Ġ 3 Ġ: ĠColor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT EX _ BUFFER _ BIND _ ID , Ġ 3 , ĠVk Format . R 3 2 G 3 2 B 3 2 _ S FLOAT , Ġvertex . offset Of (" color ")) ĊĊĠĠĠĠĠĠĠ Ġvertices . input State Ġ= Ġvk . Pipeline Vertex Input State CreateInfo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Binding Description Ġ= Ġvertices . binding Descriptions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Attribute Descriptions Ġ= Ġvertices . attribute Descriptions ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Descriptor Pool () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠExample Ġuses Ġone Ġub o Ġand Ġone Ġcombined Ġimage Ġsampler ĊĠĠĠĠĠĠĠ Ġval Ġpool Sizes Ġ= Ġvk . Descriptor PoolSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Descriptor Type . UNIFORM _ BUFFER , Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Descriptor Type . COMB IN ED _ IMAGE _ SAMPLER , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Pool Info Ġ= Ġvk . Descriptor Pool CreateInfo ( pool Sizes , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġdescriptor Pool Ġ= Ġdevice Ġcreate Descriptor Pool Ġdescriptor Pool Info ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup DescriptorSet Layout () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġset Layout Bindings Ġ= Ġvk . DescriptorSet Layout Binding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBinding Ġ 0 Ġ: ĠVertex Ġshader Ġuniform Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Descriptor Type . UNIFORM _ BUFFER , ĠVk Shader Stage . VERTEX _ BIT . i , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBinding Ġ 1 Ġ: ĠFragment Ġshader Ġcombined Ġsampler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Descriptor Type . COMB IN ED _ IMAGE _ SAMPLER , ĠVk Shader Stage . FRAGMENT _ BIT . i , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Layout Ġ= Ġvk . DescriptorSet Layout CreateInfo ( setLayout Bindings ) ĊĊĠĠĠĠĠĠĠ Ġdescriptor Set Layout Ġ= Ġdevice Ġcreate DescriptorSet Layout Ġdescriptor Layout ĊĊĠĠĠĠĠĠĠ Ġval Ġpipeline Layout CreateInfo Ġ= Ġvk . Pipeline Layout CreateInfo ( descriptor Set Layout ) ĊĊĠĠĠĠĠĠĠ Ġpipeline Layout Ġ= Ġdevice Ġcreate Pipeline Layout Ġpipeline Layout CreateInfo ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup DescriptorSet () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġalloc Info Ġ= Ġvk . DescriptorSet Allocate Info ( descriptor Pool , Ġdescriptor Set Layout ) ĊĊĠĠĠĠĠĠĠ Ġdescriptor Set Ġ= Ġdevice Ġallocate Descriptor Sets Ġalloc Info ĊĊĠĠĠĠĠĠĠ Ġval Ġtex Descriptor Ġ= Ġvk . Descriptor Image Info ( textures . color Map . sampler , Ġtextures . color Map . view , ĠVk Image Layout . GENERAL ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwrite Descriptor Sets Ġ= Ġvk . Write DescriptorSet ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBinding Ġ 0 Ġ: ĠVertex Ġshader Ġuniform Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Set , ĠVk Descriptor Type . UNIFORM _ BUFFER , Ġ 0 , Ġuniform Buffers . scene . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBinding Ġ 1 Ġ: ĠColor Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Set , ĠVk Descriptor Type . COMB IN ED _ IMAGE _ SAMPLER , Ġ 1 , Ġtex Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġdevice Ġupdate Descriptor Sets Ġwrite Descriptor Sets ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprepare P ipelines () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Assembly State Ġ= Ġvk . Pipeline Input Assembly State CreateInfo ( Vk Primitive Topology . TRI ANGLE _ LIST , Ġ 0 , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġraster ization State Ġ= Ġvk . Pipeline Raster ization State CreateInfo ( Vk Polygon Mode . FILL , ĠVk Cull Mode . BACK _ BIT . i , ĠVk Front Face . CLOCK WISE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġblend Attachment State Ġ= Ġvk . Pipeline Color Blend Attachment State ( 0 xf , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcolor Blend State Ġ= Ġvk . Pipeline Color Blend State CreateInfo ( blend Attachment State ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdepth Stencil State Ġ= Ġvk . Pipeline Depth Stencil State CreateInfo ( true , Ġtrue , ĠVk Compare Op . LESS _ OR _ EQUAL ) ĊĊĠĠĠĠĠĠĠ Ġval Ġviewport State Ġ= Ġvk . Pipeline Viewport State CreateInfo ( 1 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmultis ample State Ġ= Ġvk . Pipeline Mult is ample State CreateInfo ( Vk Sample Count .` 1 _ BIT `) ĊĊĠĠĠĠĠĠĠ Ġval Ġdynamic State Enable s Ġ= ĠlistOf ( Vk Dynamic State . VIEW PORT , ĠVk Dynamic State . SC IS SOR ) ĊĠĠĠĠĠĠĠ Ġval Ġdynamic State Ġ= Ġvk . Pipeline Dynamic State CreateInfo ( dynamic State Enable s ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSolid Ġrendering Ġpipeline ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġshaders ĊĠĠĠĠĠĠĠ Ġval Ġshader Stages Ġ= Ġvk . Pipeline Shader Stage CreateInfo ( 2 ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 0 ]. load Shader ("$ asset Path / shaders / mesh / mesh . vert . sp v ", ĠVk Shader Stage . VERTEX _ BIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 1 ]. load Shader ("$ asset Path / shaders / mesh / mesh . frag . sp v ", ĠVk Shader Stage . FRAGMENT _ BIT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpipeline CreateInfo Ġ= Ġvk . Graphics Pipeline CreateInfo ( pipeline Layout , Ġrender Pass ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . vertex Input State Ġ= Ġvertices . input State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . input Assembly State Ġ= Ġinput Assembly State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . raster ization State Ġ= Ġraster ization State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . color Blend State Ġ= Ġcolor Blend State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . multis ample State Ġ= Ġmultis ample State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . viewport State Ġ= Ġviewport State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . depth Stencil State Ġ= Ġdepth Stencil State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . dynamic State Ġ= Ġdynamic State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stages Ġ= Ġshader Stages ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpipelines . solid Ġ= Ġdevice . create Graphics P ipelines ( pipeline Cache , Ġpipeline CreateInfo ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWire Ġframe Ġrendering Ġpipeline ĊĠĠĠĠĠĠĠ Ġif Ġ( device Features . fill Mode Non Solid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraster ization State . polygon Mode Ġ= ĠVk Polygon Mode . LINE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraster ization State . lineWidth Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipelines . wire frame Ġ= Ġdevice . create Graphics P ipelines ( pipeline Cache , Ġpipeline CreateInfo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠPrepare Ġand Ġinitialize Ġuniform Ġbuffer Ġcontaining Ġshader Ġuniform s Ġ*/ ĊĠĠĠ Ġfun Ġprepare Uniform Buffers () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠVertex Ġshader Ġuniform Ġbuffer Ġblock ĊĠĠĠĠĠĠĠ Ġv ulkan Device . create Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Buffer Usage . UNIFORM _ BUFFER _ BIT . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Memory Property . HOST _ VISIBLE _ BIT Ġor ĠVk Memory Property . HOST _ CO HER ENT _ BIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Buffers . scene , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Device Size ( ub o VS . size . L )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMap Ġpersistent ĊĠĠĠĠĠĠĠ Ġuniform Buffers . scene . map () ĊĊĠĠĠĠĠĠĠ Ġupdate Uniform Buffers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Uniform Buffers () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġub o VS . projection Ġ= Ġglm . perspective ( 6 0 f . rad , Ġsize . aspect , Ġ 0 . 1 f , Ġ 2 5 6 f ) ĊĠĠĠĠĠĠĠ Ġval Ġview Matrix Ġ= Ġglm . translate ( Mat 4 ( 1 f ), ĠVec 3 ( 0 f , Ġ 0 f , Ġzoom )) ĊĊĠĠĠĠĠĠĠ Ġub o VS . model Ġ= Ġview Matrix Ġ* Ġglm . translate ( Mat 4 ( 1 f ), Ġcamera Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotate Assign ( rotation . x . rad , Ġ 1 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotate Assign ( rotation . y . rad , Ġ 0 f , Ġ 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotate Assign ( rotation . z . rad , Ġ 0 f , Ġ 0 f , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġub o VS Ġto Ġuniform Buffers . scene . mapped ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġsuper . prepare Frame () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCommand Ġbuffer Ġto Ġbe Ġsum it ted Ġto Ġthe Ġqueue ĊĠĠĠĠĠĠĠ Ġsubmit Info . commandBuffer Ġ= Ġdraw Cmd Buffers [ current Buffer ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠSubmit Ġto Ġqueue ĊĠĠĠĠĠĠĠ Ġqueue Ġsubmit Ġsubmit Info ĊĊĠĠĠĠĠĠĠ Ġsuper . submit Frame () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprepare () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . prepare () ĊĠĠĠĠĠĠĠ Ġload Assets () ĊĠĠĠĠĠĠĠ Ġsetup Vertex Descriptions () ĊĠĠĠĠĠĠĠ Ġprepare Uniform Buffers () ĊĠĠĠĠĠĠĠ Ġsetup DescriptorSet Layout () ĊĠĠĠĠĠĠĠ Ġprepare P ipelines () ĊĠĠĠĠĠĠĠ Ġsetup Descriptor Pool () ĊĠĠĠĠĠĠĠ Ġsetup DescriptorSet () ĊĠĠĠĠĠĠĠ Ġbuild Command Buffers () ĊĠĠĠĠĠĠĠ Ġprepared Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwindow . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! prepared ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġdraw () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġview Changed () Ġ= Ġupdate Uniform Buffers () Ċ Ċ // ĠĠĠ Ġvirtual Ġvoid ĠOn Update UI Overlay ( v ks :: UI Overlay Ġ* overlay ) Ċ // ĠĠĠ Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( overlay -> header (" Settings ")) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( overlay -> checkBox (" Wire frame ", Ġ& wire frame )) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġbuild Command Buffers () Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ }