From dfd39257c07586b1a32b1694bae2a2892f8930f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Con=C3=A1l?= Date: Fri, 16 Feb 2024 20:38:33 -0500 Subject: [PATCH] Fixed model 'vanilla' pipeline and shaders to work with updated uniform buffer --- README.md | 1 + Renderer/Renderer.cpp | 6 +- Scene/BSP.cpp | 62 ++++++++++ Scene/BSP.hpp | 194 ++++++++++++++++++++++++++++++ Scene/Terrain.cpp | 31 +++-- assets/shaders/explode.geom | 13 +- assets/shaders/explode.geom.spv | Bin 3908 -> 4432 bytes assets/shaders/fraglight.geom | 11 +- assets/shaders/fraglight.geom.spv | Bin 2436 -> 2904 bytes assets/shaders/fraglight.vert | 9 +- assets/shaders/fraglight.vert.spv | Bin 1752 -> 2164 bytes assets/shaders/gol.geom | 13 +- assets/shaders/gol.geom.spv | Bin 4056 -> 4580 bytes assets/shaders/terrain.tese | 2 +- assets/shaders/terrain.tese.spv | Bin 4672 -> 4616 bytes 15 files changed, 318 insertions(+), 24 deletions(-) create mode 100644 Scene/BSP.cpp create mode 100644 Scene/BSP.hpp diff --git a/README.md b/README.md index 24b91de..771e8b6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Pléascach ###### Check out the raymarching branch (pléascach-dronuilleog)! + Small Vulkan 3D renderer. ![really cool wireframe tessellated terrain)](capture.png "Terrain Capture") ## Features diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index bc8a47a..56b4102 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -222,7 +222,6 @@ Renderer::Renderer(Window& win) : win(win) { pipeline->update(0, *uniform_buffer); pipeline->update(1, textures[1]); - /* create Terrain */ terrain = std::make_unique(phys_dev, dev, textures[1]); @@ -364,6 +363,11 @@ void Renderer::draw() { command_buffer->bind(terrain.get()); command_buffer->command_buffer.drawIndexed(terrain->indices.size(), 1, 0, 0, 0); + command_buffer->bind(*pipeline); + command_buffer->bind(pipeline->layout, pipeline->desc_set); + command_buffer->bind(models[0]); + command_buffer->command_buffer.drawIndexed(models[0]->indices.size(), 10, 0, 0, 0); + /* draw User Interface stuff */ ui->newFrame(); diff --git a/Scene/BSP.cpp b/Scene/BSP.cpp new file mode 100644 index 0000000..0f00088 --- /dev/null +++ b/Scene/BSP.cpp @@ -0,0 +1,62 @@ +#include + +#include +#include + +#include + +using namespace Q3BSP; + +static inline void copy_data(void* file_data, std::string& dst, Lump& lump) { + dst.resize(lump.len); + std::memcpy(dst.data(), (u8*)file_data + (size_t)lump.offset, lump.len); +} + +template +static inline void copy_data(void* file_data, std::vector& dst, Lump& lump) { + Log::debug("Size: %zu (%zu)\n", lump.len/sizeof(T), lump.len); + dst.resize(lump.len / sizeof(T)); + puts("ALLOC'D"); + //Log::debug("%p %p\n", dst.data(), (u8*)file_data + lump.offset); + std::memcpy(dst.data(), ((u8*)file_data) + lump.offset, lump.len); +} + +BSP::BSP(const std::string& fname) : filename(fname) { + file_data = file::slurpb(fname); + Log::debug("File size: %zu\n", file_data.size()); + header = reinterpret_cast(file_data.data()); + + Log::info("Loading BSP: %s\n", fname.c_str()); + + if(header->magic != BSP_MAGIC) { + Log::error("BSP file missing magic!\n"); + } + + for (size_t i = 0; i < std::size(header->lumps); i++) { + Log::debug("%i: Offset: %u | Length: %u\n", i, header->lumps[i].offset, header->lumps[i].len); + Log::debug("\tPointer: 0x%p\n", (u8*)file_data.data() + (size_t)header->lumps[i].offset); + } + + copy_data(file_data.data(), entities, header->entities); + copy_data(file_data.data(), textures, header->textures); + copy_data(file_data.data(), planes, header->planes); + copy_data(file_data.data(), nodes, header->nodes); + copy_data(file_data.data(), leafs, header->leafs); + copy_data(file_data.data(), leaf_faces, header->leaf_faces); + copy_data(file_data.data(), leaf_brushes, header->leaf_brushes); + copy_data(file_data.data(), models, header->models); + copy_data(file_data.data(), brushes, header->brushes); + copy_data(file_data.data(), brush_sides, header->brush_sides); + copy_data(file_data.data(), vertices, header->vertices); + copy_data(file_data.data(), mesh_vertices, header->mesh_vertices); + copy_data(file_data.data(), effects, header->effects); + copy_data(file_data.data(), faces, header->faces); + copy_data(file_data.data(), lightmaps, header->lightmaps); + copy_data(file_data.data(), lightvols, header->lightvols); + + vis_info.sz_vectors = reinterpret_cast(file_data.data() + header->vis_info.offset)[1]; + auto sz = header->vis_info.len; + Log::debug("Size: %u\n", sz); + vis_info.vectors.resize(sz); + std::memcpy(vis_info.vectors.data(), file_data.data() + header->vis_info.offset + 2*sizeof(u32), sz); +} \ No newline at end of file diff --git a/Scene/BSP.hpp b/Scene/BSP.hpp new file mode 100644 index 0000000..7595592 --- /dev/null +++ b/Scene/BSP.hpp @@ -0,0 +1,194 @@ +#pragma once + +#include +#include + +#include +#include + +/* contains loading functions for Quake III-style BSPs */ +namespace Q3BSP { + struct Lump { + u32 offset; + u32 len; + }; + using rgb = glm::u8vec3; + using rgba = glm::u8vec4; + + /* "IBSP" */ + const uint32_t BSP_MAGIC = 0x50534249U; + struct Header { + u32 magic; + u32 version; + + union { + Lump lumps[17]; + struct { + Lump entities, + textures, + planes, + nodes, + leafs, + leaf_faces, + leaf_brushes, + models, + brushes, + brush_sides, + vertices, + mesh_vertices, + effects, + faces, + lightmaps, + lightvols, + vis_info; + }; + }; + }; + + struct Texture { + char name[64]; + /* values of unknown meaning - TODO: check darkplaces or some other 3rd party loader */ + i32 flags; + i32 contents; + }; + + struct Plane { + glm::vec3 norm; + float dist; + }; + + struct Node { + u32 plane; + /* negative numbers are leaf indices */ + i32 children[2]; + + /* bounding box coords (integer) */ + glm::ivec3 bb_mins; + glm::ivec3 bb_maxes; + }; + + struct Leaf { + i32 cluster_idx; + u32 area; + glm::ivec3 bb_mins; + glm::ivec3 bb_maxes; + i32 first_leaf_face_idx; + u32 n_leaf_faces; + i32 first_leaf_brush_idx; + u32 n_leaf_brushes; + }; + + + struct LeafFaces { + /* list of face indices (one list per leaf) */ + i32 face_idx; + }; + + struct LeafBrush { + /* list of brush indices (one list leaf) */ + i32 brush_idx; + }; + + struct Model { + glm::vec3 bb_mins; + glm::vec3 bb_maxes; + i32 first_face_idx; + u32 n_faces; + i32 first_brush_idx; + u32 n_brushes; + }; + + struct Brush { + i32 first_brushside_idx; + u32 n_brushsides; + i32 texture_idx; + }; + + struct BrushSide { + i32 plane_idx; + i32 texture_idx; + }; + + struct Vertex { + glm::vec3 position; + glm::vec2 tex_coords; + glm::vec2 lightmap_coords; + glm::vec3 normal; + glm::u8vec4 color; + }; + + struct MeshVertex { + i32 idx; + }; + + struct Effect { + char name[64]; + i32 brush_idx; + /* almost always 5 for some reason */ + i32 unknown; + }; + + struct Face { + i32 texture_idx; + /* -1 if no effect */ + i32 effect_idx; + enum FaceType { + ePOLYGON = 1, + ePATCH = 2, + eMESH = 3, + eBILLBOARD = 4, + } type; + i32 first_vertex_idx; + u32 n_vertices; + i32 first_mesh_vertex_idx; + u32 n_mesh_vertices; + i32 lightmap_idx; + glm::vec2 lightmap_start; + glm::vec2 lightmap_end; + + glm::vec3 lightmap_origin; + glm::vec3 lightmap_unit_vectors[2]; + glm::vec3 norm; + glm::ivec2 patch_dimensions; + }; + + struct Lightmap { + u8 map[128][128][3]; + }; + + struct Lightvol { + rgb ambient; + rgb directional; + /* spherical coordinates */ + glm::u8vec2 direction; + }; + + struct VisibilityInfo { + u32 sz_vectors; + std::vector vectors; + }; + + struct BSP { + Header* header; + BSP(const std::string& fname); + std::string filename; + std::vector file_data; + std::string entities; + std::vector textures; + std::vector planes; + std::vector nodes; + std::vector leafs; + std::vector leaf_brushes; + std::vector leaf_faces; + std::vector models; + std::vector brushes; + std::vector brush_sides; + std::vector vertices; + std::vector mesh_vertices; + std::vector effects; + std::vector faces; + std::vector lightmaps; + std::vector lightvols; + VisibilityInfo vis_info; + }; +} \ No newline at end of file diff --git a/Scene/Terrain.cpp b/Scene/Terrain.cpp index 8895be7..052cb91 100644 --- a/Scene/Terrain.cpp +++ b/Scene/Terrain.cpp @@ -3,7 +3,6 @@ #include - float Terrain::getHeight(int32_t x, int32_t y) { if (x < 0) x += 64; @@ -20,7 +19,7 @@ float Terrain::getHeight(int32_t x, int32_t y) { yf /= 64.0; yf *= heightmap_tex->extent.height; - return static_cast(heightmap_tex->image_data[static_cast(static_cast(yf) * heightmap_tex->extent.width + xf) * 4]) / 256.0f; + return static_cast(heightmap_tex->image_data[static_cast(static_cast(yf) * heightmap_tex->extent.width + xf) * 4]) / 256.0f * 15.0f; } Terrain::Terrain(vk::PhysicalDevice phys_dev, vk::Device dev, Texture& tex) : phys_dev(phys_dev), dev(dev) { @@ -70,20 +69,26 @@ Terrain::Terrain(vk::PhysicalDevice phys_dev, vk::Device dev, Texture& tex) : ph { getHeight(x + 1, y - 1), getHeight(x + 1, y), getHeight(x + 1, y + 1) }, }; - auto normal = glm::vec3( - /* x gets X sobel filter */ - moores_heights[0][0] + 2.0f * moores_heights[0][1] + moores_heights[0][2] - - moores_heights[2][0] - 2.0f * moores_heights[2][1] - moores_heights[2][2], - 0.0, - /* z gets Y sobel filter */ - moores_heights[0][0] + 2.0f * moores_heights[1][0] + moores_heights[2][0] - - moores_heights[0][2] - 2.0f * moores_heights[1][2] - moores_heights[2][2] - ); + // auto normal = glm::vec3( + // /* x gets X sobel filter */ + // moores_heights[0][0] + 2.0f * moores_heights[0][1] + moores_heights[0][2] + // - moores_heights[2][0] - 2.0f * moores_heights[2][1] - moores_heights[2][2], + // 0.0, + // /* z gets Y sobel filter */ + // moores_heights[0][0] + 2.0f * moores_heights[1][0] + moores_heights[2][0] + // - moores_heights[0][2] - 2.0f * moores_heights[1][2] - moores_heights[2][2] + // ); + + auto relx = glm::vec3(2.0, getHeight(x + 1, y)-getHeight(x, y), 0.0); + auto relz = glm::vec3(0.0, getHeight(x, y + 1)-getHeight(x, y), 2.0); + auto normal = glm::normalize(glm::cross(relz, relx)); + + /* fill in missing component, first scalar scales bump */ - normal.y = 0.25 * glm::sqrt(glm::abs(1.0 - normal.x*normal.x - normal.z*normal.z)); + //normal.y = 0.25 * glm::sqrt(glm::abs(1.0 - normal.x*normal.x - normal.z*normal.z)); //vertices[x + y * patch_size].norm = glm::vec3(getHeight(x, y)); - vertices[x + y * patch_size].norm = glm::normalize(normal * glm::vec3(2.0f, 1.0f, 2.0f)); + vertices[x + y * patch_size].norm = normal; } vertex_buffer = std::make_unique(phys_dev, dev, vertices.size()); diff --git a/assets/shaders/explode.geom b/assets/shaders/explode.geom index a9291ad..e59d442 100644 --- a/assets/shaders/explode.geom +++ b/assets/shaders/explode.geom @@ -11,8 +11,15 @@ layout (location = 0) out vec3 _norm; layout (location = 1) out vec2 _texCoord; layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; + vec3 cam_pos; + vec3 cam_dir; + vec4 frustum[6]; + vec2 viewport; + float tess_factor; + float tess_edge_size; }; vec4 explode(vec4 pos, vec3 n) { @@ -24,7 +31,7 @@ vec4 explode(vec4 pos, vec3 n) { void main(void) { if (time < 3.0) { for(int i = 0; i < gl_in.length(); i++) { - gl_Position = mvp * gl_in[i].gl_Position; + gl_Position = proj * view * gl_in[i].gl_Position; _norm = norm[i]; _texCoord = texCoord[i]; EmitVertex(); @@ -35,7 +42,7 @@ void main(void) { vec3 n = norm[0] + norm[1] + norm[2]; n/=3; for(int i = 0; i < gl_in.length(); i++) { - gl_Position = mvp * explode(gl_in[i].gl_Position, n); + gl_Position = proj * view * explode(gl_in[i].gl_Position, n); _texCoord = texCoord[i]; _norm = n; EmitVertex(); diff --git a/assets/shaders/explode.geom.spv b/assets/shaders/explode.geom.spv index 2f5eb55d555c3500251ecb386983e56b27c3034a..d6543eae75938ac4db67ddc7b3146bd244119415 100644 GIT binary patch literal 4432 zcmZQ(Qf6mhU}WHC;ANP_00DvwObkp63=G^1Yz&MH3=Hl*!9IG$B`JC)rUoDtd<@JW z3M|LZzzycHFfcIWCT8Y=Bs>`y7(y8s7~&Wh7!ny67}6OS7_t}`7z7xY89?g9z-$&U z8>Aj&2TV>DNluD^0cK~8>3szzCwiFH|; zu{FqjtPIQyJPZsB1^LAcAT}=p0|UsTAhsab-|1j+VFm_!y>Q3_ZMD>&aE34!CF2r2#5F)%Pd;(&#r z2b4w=ixOex_apJ$8CV!37(n3*%7+XL9tBS>8Xk~&cMfy5>tiGk8JNNfR;7|1@5*ajpq zP`U<*2{0nu3$ha=CV?adO3xrM8Ab*McLrv#-$8Bxg$pQ6D}g)-D(e_n7(jeQC?6Cq zptK6&a)St{-5@cL|3G3O8m10pCP)nACzu$B4H5(S31l}&FGw9o9+ZAS#)9NQG)xR+ zCP)lK!^A*(Kw=>CU}7LPNDO8+$UKlbkiS6bO%7xz)L)>o7?}@BZy-L%4v>0K0R-a< zL+b!V22knC04{&U7?>GA;jO^Hz#z`R!T<_q5Fcc>0s{*JD2zd3APkb{gr+x;8$t41 z3=CjBAaO+oRtAu}L25zzKyn~8pfm;&1DUJMzyh{U2;v6^2?iDhQK%UpJ4G2-7(jIi z$UPt>AoU==IMiMlXqpF^2NDChNfIgt3L`lNZg4sPnF+!mJ3(#(VNhOysRfCH+$PNc z2?tQwZq2~L0OEtv3dk&wTR?Re$St7o1i1yo2Zbj{9;9C$svl$?NFGE((w&0?jIRpv z2!nznjIRUcGcbrSFfo`hFff43v4VyH$b67G5N!ih2je?K>rN0K6eg|=pjw`R0Td=~ z&@cdr$uU66ZcrG3+yjyWVURr@P%}X3735zKA5_MI;uB;p$X+j~xgho4Q2&9#5@aqY zEuxzX(g$)+5Y%jtdx9Alz~wba3}j9S)J%{#$X*a1)Sdu^D@Z;ZDi1On#E*uW1>?s; z`Ji|N=?C#ac>&~ZkbUtC3=AMSn0*OQ^FZPt^&mbdufXg}hRTEVfb2_ynh#1JAoUGG-<*BN*4?a zptNcW&2y#<3=AOg9Sp4CbZ5@MzyJ~hrPuEa%nX(w$1yN4{9<5X0LfV}Fo4BCZUwRJ z7?>GA?gXXFpA1Y4whRmmAUP2Ije&*1o`Hb@R9AqE0m(Z;tPXVuSnyN{2pBKY`LG$UIP*^kraR0ExrY_(9cx+z3`H>$#mWFmhoE)=C~bnoL25v0 z64XcpiG%cm(m99^k^{Ll8%aMXoq^g0ptJ`P2dM$2IZ#^`Bo5LKO2;7nEe1vgP`rTR z2o$y;8l)a%WAl;-?teU8U8Xbg3|#g z{eZ#%| zhC874*D^3LfYgHIVdj9uKx|N+1o;mXCiT#?4x&MMp^<@sp$U``7#P4|-VBuo(I7W~ z!nlQjfdOO&EHAV&Fff3`V0i(=2eqj{W`V*R#0G@{C@-`@(>W~cKzX5^fq?-e4pY+s zRReM($WD-&P6h@BkT@(abTKe6fb@aHL25wm>V~=tmKS=Vc>yF2GYga#`WP4(Kysk4 z0F_4|KFADEe1O`0pzsCBfyyQj-xA!~XJDAfzyR)-f%JgnV0md00|NudJs^3IA3%9& zGFn~&@j>c9_JG_v1@2Z>22fs@3hkGI#6fC6d0`p@0|Q7Lz-DJY46+DzsQ%;2^bs80%FgUWPJpA=+2KR9o)Fo4=og3xvXteyb%PeEpZ>;}n! z+EpO8g8U}Jz`y`90~D5^Isw#<0kv&l`3BTB0JVuh;>`@89u@-ws67o51LcE0XdX~u z0JT*haTX-5@`J z#6apne$irJ0Qb#7e2_o185kHqY678d)Ma2`0EvOZ4ko4t6$913Ffo0o7^tllz`zb} mr-BAMK>9)ILGqxs7^utu*=xwazyPuvq~;$369b43iZ1}lJ#(c1 literal 3908 zcmZQ(Qf6mhU}WHC;ANP^00DvwObkp63=G^1Yz&MH3=Hl*!9IG$B`JC)rUoDtd<@JW z3M|LZzzycHFfcIWCT8Y=B-|Jn82lI*7{VDC7@`;$7!ny67*ZG*7z7xY89?g9z-$&U z8>Aj&2TV>DNluD^0cK~8>3szzCwiFH|; zu{FqjtPIQyJPZsB1^LAcAT}=p0|UsTAhsab-|1j+VURyFix^lLSQ$Wm^i3=&%1llz z2ARRezycNnv2)7`7}%g{Kz=XD%uNM}gUpivF&G%Y=9x1vFl2(+Yz!_83=HWx@d2qt zVW~wWsTCk)Yzz=_5E~?yUz}NznV-kN#=s6%4>B7po|#t?oLL37111NG-}Ib#=bX#} zm(1dl#JuEGxIR$qg5*kba^P|xw}IjnWEU#~8-o`P_khGfYQXj)xd$YU%RL}DTI=NEa0>U<$~h`ln&!dQY)PE^NT>~5fo1#8c7Ho z?m0;DTM3T?7KRp38b~Zkgqh!t#P>joUseVN1`lZbg2F->M4*YWgVQ-e9Vl!->Ks7% zje!}QRzP9m&cMO|N)t*@Ghlp0C?8}GC~bha+#mvK4@eATCP)lK!_ds>%!7%6*dQ^O*&y>k>OlSg z#g`n&P_UmN@rBF>#TSSVvIC?Z6jw05Ftm(PWB`>84B+xXjDeYfje&tdfq{WRoPmV_ z6viMv$ZiD&76uLm2Cx`N93;=lzyMYcawABd3n~v1S7cyi0J$5a7Nid(2T~&dRRc0t zn}G$aUkKs{2MGoi22rRy$WA$EngEG`)PwYkGr-)+z+lb5!T{of;ujPqq6{nyl2G@9 z{0uT5#0QmwAU;UHG*myxJdiwy289U&gM$N%4@nyejxfFk#C;4R3``70VDniR%%JWB znGaG2qAj56V0?RM`3rKFBUm3q0Z1OicVYn591ILH3@i-J(69uF$wA8{P}qUo2a*F} zko#SsW`fcu$p0Wds9b@?fjiWHpfCfO14=LG=D_UthMEPk--m$#Tqc3UK=$}T-3Af| z*#qK(>Lge=20-OOW`op+K+S^j!=QXnS^((>@j>YoOp)^ z{(#w+29*ct0fiSRev6=CYsSC|&M%-e3W`yX9X}YD7(nF~$ShFW0M$L9umJHvX&+Q3 z!uTM0P`L=>gYpNcY=rSa>Oo~Ai0{b2$^c5UpoRk|orBV{Ei~U4GB7ZJ#CI^Tg43lj z0|Ns{43wU~GcYrlf*i-d!0?NKg#jdI!oUC)1GyE%wqsys0J#&CZhtZ`F<3G%Fo5Jh z^fv|;22kZ~12qFAZwr+N(I7W~!o-e&0c^%bs2f1#FGviO_CfZ7_*M*{yb3WJ#0L2Z zlukVu7{FyS$bOJ{pfu|VE`J#qKzxw-{!sHB8Q2&=X)X}jHUf#m^nt=Dh=G9tBsY-( z)DmG}2xeel0GS062iXTopP>v444}LM(g*T8h!0W+vnv{I7b^oOy~RS?Um$Ui8c^Dc zV_;waiG%cm(ldw;k^{LF)Ib1*C&)ff`bh`1XFzQt28e$^X(>^{+z-kZATgNwG6n_)kXQf%8`z$51_lOD zdWPW+sQsV@97rul9%c?m48#WIEs*~}VNwN6vmhFjrfV1&7;2HybRAS4M1$M_ipP2e z1_qEBur%Gkz`y_!gQaN@znX!80b~{^yg_VG7=Y4rBbGGX#K6D+5{H@J3^gB?rdy$D z8YB*KH%J{QO}8;HFo5Jhegc&bAU;SA6lWdKa01DJ$_fzQ65Il1VCZCE0Jp_KdO&ip zJkiC#zyNX!NFL-~P@d>U%M&0zNFB%?P+0W9-O9=UO4Gg2Gz}65sR5_>7ZD8GRCu=Ea!2T=HdXpnl4eG{Pe!P5Ig1_lO@7$_}*%m>8_NDMh{ zLGb`f?-mS<450EE6n>!o2q>yS?GSSYW^nrj)DHo%L1iqc9|E$UA6!1MFo4=7g3x*$ zR&Im(Bp|auc7xTX-5@`J#6apneoOu0Lwi77tgY4C1U|;~*4N~)ufr$ac2gMfvz_vm6 diff --git a/assets/shaders/fraglight.geom b/assets/shaders/fraglight.geom index 2a304a3..676dd93 100644 --- a/assets/shaders/fraglight.geom +++ b/assets/shaders/fraglight.geom @@ -13,14 +13,21 @@ layout (location = 1) out vec2 _texCoord; layout (location = 2) out vec3 _pos; layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; + vec3 cam_pos; + vec3 cam_dir; + vec4 frustum[6]; + vec2 viewport; + float tess_factor; + float tess_edge_size; }; void main(void) { for(int i = 0; i < gl_in.length(); i++) { - gl_Position = mvp * gl_in[i].gl_Position; + gl_Position = proj * view * gl_in[i].gl_Position; _norm = norm[i]; _texCoord = texCoord[i]; _pos = pos[i]; diff --git a/assets/shaders/fraglight.geom.spv b/assets/shaders/fraglight.geom.spv index d212b9e2b4b51d604bacbb6f8f6337ab556f133c..12a95a475c54d4944401c6ec3ef550abf3e479b3 100644 GIT binary patch literal 2904 zcmZQ(Qf6mhU}WHC;AQYrp1_pPZU?08Wk`z4?Qv;9+J_cqG z1(xGy;05zo7#J9G6EpKb5>gBd40;R<4CV|B3|0&b3=Rwo49*M;3?2*&44w=O3<3JGuT~+7#SE?7`PbRed68y{oQ?BDS(2Hb$H2zG4ptBH2Ut8auOv9LDix#- zCI<@F^qhF-oXi53%;J*7yyR54K9Ci1r!OFnOpuoVu;G0-dl$o4b z3=(65ihf$U9A%#AO|FJ^%01;r0YEG4rD zF2>5hz>ro{T3k|^%K!=kkXzUo7#KkI7UUO|K=z#pF1kwx*b1fWU4iX0`1BWeAn1jSYeg%u8g*iwLP+SRs&1C_{1;`puoPzX&;u6GH1`%L2khB5fg5nZc zAIKfZ`apb;K2R9I%mRra^g+x5xdo)I0m*!jn?Yg|ki65D_z2J#O` zOn?zowm|Fv*$EPpKoSF`IgpqPBLf2{TtI#Wxdjw1pmYbqAb-O6iXaZu9#9$qaY5k< zqCx%xiGlnF5(CjNF_4)cF_52NVjwn14CE(}-5|Xnbs)PyX$llCAag-{P+5u02Zbky z53&O!4=O{E`Jl7};={}Xm8~$oFtiL;WB`?#4B&E8lz|1D20;D?nW@0Q!T<^{5C(;% zHdLMy!p1i3|mfrUYu zfdOnc$X<{;WT57PJgCNK=y*d24oLN45VHjsvZ=6atz#H|A5Q{VUYho=7BIs zA51Ms9OO1o8Ug78g(b*sAU-G^fy6*|gX{#QIgp=0>QxvZaR4$K~8S z4AKV*D{ZL1L2lMzU|;~L1&M*o(PaSD)(i|Fagew!%gRR&c%$VqjnZiGlLVF9sF{5FeEHL1ux>2C*F( zSQ$WRL6w1l0hC@qX#`{*C|#&AFff3`VQSQ&YCvv;snK9yU;v3vVqgWQe@zAk29Q3G zI7kgB-RVQ!<;cLs07?&r(DoQe9A*|MJs2@CFo5JHGO&X4kud`U1IRp(ILHm4v}4M^ zzyQi~Abp@P1MxxXV0KxP+EiVA!U&Zl73KJ zyFuHEAaRg>P`tY{Fff3`LHa>y3B(7rp1_pPZU?08Wk`z4?Qv;9+J_cqG z1(xGy;05zo7#J9G6EpKb5>gBd3~CGv3?RkE3=9lb3=9mm3=9lT3=9m;3=9kc49pB5 z^Nt?pW#%R4l%^mnU}b>V4|6*!12Y2$0|P@Q0|Nsq0~><` z0|P^PPJBRWQCMnGNoobioorBX5E~?yUz}NznV-kN#=s6%5Ap|CJTtE(II}7hqz)zr z3fJ_Uc;}qV0+-C2bsajz{()Qz`)>}SW=XkoLUSL zV`E?ei-Fj=Wd#guP&FVolw{_D?FN}42T}m_lM)U;fy6<|z-~wK6G$9n9#|aBParv5 zeges1_Y(^^eWd5agA)uW4nS!oJ}0O1th1%wY3C>O7F*fE8*kD4sypD1!(zF?Mj;hS(2M2eKEW&H9@RkQm4xFfkAtBnI;nNH0ho z$SzQvfb0jE3*v*~1ep(t6A&L{2S^^2$C3GNqL*+r@AoD7`PZ17(i-4^fv|;1|9|m240XM3=9k)c|NE-h_;2Mb$$j0aDB9qffby# zg%}tZKw_XY|BHcz0mKL8UyxZKvq5Y}237`8+5zPwPAvwjzDDxNF2lm`AZ#Y zz9R!011KG6LhEjjI7}ZX9cVEyFo5JHGO&Wvv^E0+1IR3pILJOwn$cxoU;w3mkUo&# zL41%pm|Z4tyI2`Oac;)I050c2;vhAk_%~-@U;v4O^n=nAh!2tjxz!FyKPV1C~~{eU;v4O^n=m_h<}TL z5gb3DxB`VShz6+#nduHSvjN;%U|{eBm*JqYoq+*l1}H6n#6a;2ig%EHP+Z++U}X5q Lz{p_1z{mgqZhW-v diff --git a/assets/shaders/fraglight.vert b/assets/shaders/fraglight.vert index 4e94796..3b3dc62 100644 --- a/assets/shaders/fraglight.vert +++ b/assets/shaders/fraglight.vert @@ -8,8 +8,15 @@ layout (location = 1) out vec2 texCoord; layout (location = 2) out vec3 pos; layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; + vec3 cam_pos; + vec3 cam_dir; + vec4 frustum[6]; + vec2 viewport; + float tess_factor; + float tess_edge_size; }; void main() { diff --git a/assets/shaders/fraglight.vert.spv b/assets/shaders/fraglight.vert.spv index 2b08c4a5f83c58dda84b257ff3b239765196cfa3..aaafbc1c673cfea4135dd0e3de0bfc3b85ce8db2 100644 GIT binary patch delta 661 zcmcb?`$d44nMs+Qfq{{Mn}L_XbR+M5#(Ev&D_0=R0fmeS0|SE+)YoAC=2Yh2jH%iT zEDYid3=9U)fRlj+q8L<6j)5C&j6MSc0|tFc0L1x Y0s{+!Ap-+Q0oXumDBozaD!V@;0PkoQ^#A|> diff --git a/assets/shaders/gol.geom b/assets/shaders/gol.geom index 890f2a5..6dd178a 100644 --- a/assets/shaders/gol.geom +++ b/assets/shaders/gol.geom @@ -11,8 +11,15 @@ layout (location = 0) out vec3 _norm; layout (location = 1) out vec2 _texCoord; layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; + vec3 cam_pos; + vec3 cam_dir; + vec4 frustum[6]; + vec2 viewport; + float tess_factor; + float tess_edge_size; }; vec4 explode(vec4 pos, vec3 n) { @@ -26,7 +33,7 @@ void main(void) { if (time < 3.0) { for(int i = 0; i < gl_in.length(); i++) { - gl_Position = mvp * gl_in[i].gl_Position; + gl_Position = proj * view * gl_in[i].gl_Position; _norm = norm[i]; _texCoord = texCoord[i]; EmitVertex(); @@ -35,7 +42,7 @@ void main(void) { vec3 n = norm[0] + norm[1] + norm[2]; n/=3; for(int i = 0; i < gl_in.length(); i++) { - gl_Position = mvp * explode(gl_in[i].gl_Position*abs(cos(time)), n); + gl_Position = proj * view * explode(gl_in[i].gl_Position*abs(cos(time)), n); _texCoord = texCoord[i]; _norm = n; EmitVertex(); diff --git a/assets/shaders/gol.geom.spv b/assets/shaders/gol.geom.spv index af5672d7abc00307a27b2cf68f2990766fa5d8d9..0818235c72bbc6c770af5d8dd9333bed3174facd 100644 GIT binary patch literal 4580 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 diff --git a/assets/shaders/terrain.tese b/assets/shaders/terrain.tese index cda3c84..deddd35 100644 --- a/assets/shaders/terrain.tese +++ b/assets/shaders/terrain.tese @@ -42,7 +42,7 @@ void main() { vec4 pos2 = mix(gl_in[3].gl_Position, gl_in[2].gl_Position, gl_TessCoord.x); vec4 fpos = mix(pos1, pos2, gl_TessCoord.y); - fpos.y += 15.0 * texture(heightmap, _texCoord).r; + fpos.y = 15.0 * texture(heightmap, _texCoord).r; _pos = fpos.xyz; gl_Position = proj * view * fpos; diff --git a/assets/shaders/terrain.tese.spv b/assets/shaders/terrain.tese.spv index 3dca69767e4034ae7976b962e9755da483c7aa51..053dc85fd797c589cf000259e7a8bd65102a7297 100644 GIT binary patch delta 1076 zcmX@0(xJl3%%sfDz`)4B&A`hreIjo>X9EKRLn{LV!?ca1{}}~Ay!e9rVg?2V237_( zhUUp@8O0f!C(mU9k#`xT8Jj0xWCD?InWQ~I`XDM<89Esl7<>~;iZYW^!MfQPAYvf- zvdq+S5DgP!WME(@D9X=*i%kw>7PbYMz|6qFkerwcb^=T_3sfv6vxosE#>&9JkXBS$ zTvD3Lz{bGF&^dV_v$!P41a<}nhLY6c;`p@0Ny zfrX)ifq{XIfq_8)Y#s|ZOhA@`Tno|xavzAV3?jg4SQ$De7qSZbf@DCUf~*q62dQ*` zsf4-*G`N=hIx2?iF1HU?n{P5C(ZgoPmJ>gh9~(3M`Nq2rDqKFmy36=z-%KA+uU1qDdV_;^eXJBBcWnf^iWncljvXOy-A%}s1!JmNxY-V;Y^0yPh0X&(av14taErXQ+CfPtY9Y$-_5 z1O^5Mki;YgR&a1lWME(bX#|PG95xB+u!#(;V24g-U|;~L1BrtSpTfYvFcq5nLFozP RKoB3K?k@u)g9QU40{|a-g2ey; delta 1133 zcmeBBIiSMJ%%sfDz`)4B&A`hrYa(wvXEOr>Lk9x`!_1AP{}}~Ay!e9rVg?2V237_( zhPKIT8O0gfCeLL8k#`xT8QUgbWCD?InWQ~I`XDM<8G0BP7<>~;iZYW^!MfQPAYvf- zvdq+S5DgP!WME(@D9X=*i%kw>7PbYMz|6qFkerwcb^=T_3sfv6vxosE#>&9JkXBS$ zTvD3Lz{bGF&@*`Ny zfrX))fq{XIfq_8)Y#s|ZOhA@`Tno|xavzAV3?jg4SQ&aI7qSZbf@DCUf~*q62dQ*` zsf4-*2jIW5qpSih|?KKlGC`o~WOb(o!ayiB8 z+Zh-bKq8=^vu0pn0P#Ud2_z=Lz{1eUz`zj1z`y`r$&1=0h;Ag_osFff2HC^|ra1rh^c1qK#|UIqp|aD0P&2eQ1Efq?>DuZ1uJbEZ_(R1$8|G14AP?lYnRj29Q`S0|SF211m!v0|P@7 z0|P@20|SFT0|SE{12dT4$iTn=G6UrL7O1>G0|(f(tqcqdATbaIg(4{WL5>3H1%+WN z14BL7aF7cpKwT{YH4x<5i3|)3AaRfbKx!sI)qv6p$WoA+$qWn(An{2Itl(gt!oa`) z(gzX;sR21`D%4>U8Cb#5FpYtM0i