From 5a08c9c8e230fd952311f29bc02b22c7635d0178 Mon Sep 17 00:00:00 2001 From: tylermurphy534 Date: Mon, 26 Sep 2022 20:57:53 -0400 Subject: [PATCH] vertex buffer is not a byte vector, multi texture loading --- engine/xe_engine.cpp | 8 +- engine/xe_engine.hpp | 4 +- engine/xe_image.cpp | 4 +- engine/xe_model.cpp | 26 +- engine/xe_model.hpp | 15 +- engine/xe_render_system.hpp | 12 +- engine/xe_vertex_array.cpp | 0 engine/xe_vertex_array.hpp | 0 res/image/dirt.jpg | Bin 5956 -> 0 bytes res/image/dirt.png | Bin 0 -> 916 bytes res/image/grass.png | Bin 6160 -> 1003 bytes res/image/grass_top.png | Bin 0 -> 1110 bytes res/models/stanford-dragon.obj | 249866 ------------------------------ res/shaders/simple_shader.frag | 6 +- res/shaders/simple_shader.vert | 4 +- src/chunk.cpp | 84 +- src/chunk.hpp | 32 +- src/first_app.cpp | 15 +- src/simple_renderer.cpp | 8 +- 19 files changed, 140 insertions(+), 249944 deletions(-) create mode 100644 engine/xe_vertex_array.cpp create mode 100644 engine/xe_vertex_array.hpp delete mode 100644 res/image/dirt.jpg create mode 100644 res/image/dirt.png create mode 100644 res/image/grass_top.png delete mode 100644 res/models/stanford-dragon.obj diff --git a/engine/xe_engine.cpp b/engine/xe_engine.cpp index b138942..2044c58 100644 --- a/engine/xe_engine.cpp +++ b/engine/xe_engine.cpp @@ -36,9 +36,9 @@ std::shared_ptr Engine::loadModelFromFile(const std::string &filename) { return Model::createModelFromFile(xeDevice, filename); } -std::shared_ptr Engine::loadModelFromData(std::vector vertexData, uint32_t vertexSize, std::vector indices) { +std::shared_ptr Engine::loadModelFromData(std::vector vertexData, uint32_t vertexSize, std::vector indices) { Model::Builder builder{}; - builder.vertexData = vertexData; + builder.vertexData.data = vertexData; builder.vertexSize = vertexSize; if(indices.size() > 0) { builder.indices = indices; @@ -46,8 +46,8 @@ std::shared_ptr Engine::loadModelFromData(std::vector vertexData, return std::make_shared(xeDevice, builder); } -std::shared_ptr Engine::loadImageFromFile(const std::string &filename) { - return std::make_shared(xeDevice, filename); +Image* Engine::loadImageFromFile(const std::string &filename) { + return new Image(xeDevice, filename); } bool Engine::poll() { diff --git a/engine/xe_engine.hpp b/engine/xe_engine.hpp index dc534ea..83824e2 100644 --- a/engine/xe_engine.hpp +++ b/engine/xe_engine.hpp @@ -32,8 +32,8 @@ class Engine { Device& getDevice() {return xeDevice;} std::shared_ptr loadModelFromFile(const std::string &filename); - std::shared_ptr loadModelFromData(std::vector vertexData, uint32_t vertexSize, std::vector indices); - std::shared_ptr loadImageFromFile(const std::string &filename); + std::shared_ptr loadModelFromData(std::vector vertexData, uint32_t vertexSize, std::vector indices); + Image* loadImageFromFile(const std::string &filename); bool beginFrame() { return xeRenderer.beginFrame(); } void endFrame() { xeRenderer.endFrame(); } diff --git a/engine/xe_image.cpp b/engine/xe_image.cpp index 7be2b3b..2580384 100644 --- a/engine/xe_image.cpp +++ b/engine/xe_image.cpp @@ -221,8 +221,8 @@ void Image::createTextureSampler() { VkSamplerCreateInfo samplerInfo{}; samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - samplerInfo.magFilter = VK_FILTER_LINEAR; - samplerInfo.minFilter = VK_FILTER_LINEAR; + samplerInfo.magFilter = VK_FILTER_NEAREST; + samplerInfo.minFilter = VK_FILTER_NEAREST; samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; diff --git a/engine/xe_model.cpp b/engine/xe_model.cpp index 6720c13..fd97f44 100644 --- a/engine/xe_model.cpp +++ b/engine/xe_model.cpp @@ -14,7 +14,7 @@ namespace xe { Model::Model(Device &device, const Model::Builder &builder) : xeDevice{device} { - createVertexBuffers(builder.vertexData, builder.vertexSize); + createVertexBuffers(builder.vertexData.data, builder.vertexSize); createIndexBuffers(builder.indices); } @@ -26,10 +26,10 @@ std::unique_ptr Model::createModelFromFile(Device &device, const std::str return std::make_unique(device, builder); } -void Model::createVertexBuffers(const std::vector &vertexData, uint32_t vertexSize) { - vertexCount = static_cast(vertexData.size()) / (vertexSize / 4); +void Model::createVertexBuffers(const std::vector &vertexData, uint32_t vertexSize) { + vertexCount = static_cast(vertexData.size()) / vertexSize; assert(vertexCount >= 3 && "Vertex count must be atleast 3"); - VkDeviceSize bufferSize = vertexData.size() * 4; + VkDeviceSize bufferSize = vertexData.size(); Buffer stagingBuffer { xeDevice, @@ -113,7 +113,7 @@ void Model::Builder::loadModel(const std::string &filepath) { throw std::runtime_error(warn + err); } - vertexData.clear(); + vertexData.data.clear(); indices.clear(); vertexSize = 0; @@ -123,22 +123,22 @@ void Model::Builder::loadModel(const std::string &filepath) { for (const auto &index : shape.mesh.indices) { if(index.vertex_index >= 0) { - vertexData.push_back(attrib.vertices[3 * index.vertex_index + 0]); - vertexData.push_back(attrib.vertices[3 * index.vertex_index + 1]); - vertexData.push_back(attrib.vertices[3 * index.vertex_index + 2]); + vertexData.write(attrib.vertices[3 * index.vertex_index + 0]); + vertexData.write(attrib.vertices[3 * index.vertex_index + 1]); + vertexData.write(attrib.vertices[3 * index.vertex_index + 2]); vertex = true; } if(index.normal_index >= 0) { - vertexData.push_back(attrib.normals[3 * index.normal_index + 0]); - vertexData.push_back(attrib.normals[3 * index.normal_index + 1]); - vertexData.push_back(attrib.normals[3 * index.normal_index + 2]); + vertexData.write(attrib.normals[3 * index.normal_index + 0]); + vertexData.write(attrib.normals[3 * index.normal_index + 1]); + vertexData.write(attrib.normals[3 * index.normal_index + 2]); normal = true; } if(index.texcoord_index >= 0) { - vertexData.push_back(attrib.texcoords[2 * index.texcoord_index + 0]); - vertexData.push_back(attrib.texcoords[2 * index.texcoord_index + 1]); + vertexData.write(attrib.texcoords[2 * index.texcoord_index + 0]); + vertexData.write(attrib.texcoords[2 * index.texcoord_index + 1]); uvs = true; } diff --git a/engine/xe_model.hpp b/engine/xe_model.hpp index 09c5913..41dccd5 100644 --- a/engine/xe_model.hpp +++ b/engine/xe_model.hpp @@ -14,8 +14,19 @@ namespace xe { class Model { public: + struct Data { + std::vector data{}; + template + void write(T d) { + unsigned char const * p = reinterpret_cast(&d); + for(std::size_t i = 0; i < sizeof(T); i++){ + data.push_back(p[i]); + } + } + }; + struct Builder { - std::vector vertexData{}; + Model::Data vertexData{}; uint32_t vertexSize; std::vector indices{}; @@ -35,7 +46,7 @@ class Model { void draw(VkCommandBuffer commandBuffer); private: - void createVertexBuffers(const std::vector &vertexData, uint32_t vertexSize); + void createVertexBuffers(const std::vector &vertexData, uint32_t vertexSize); void createIndexBuffers(const std::vector &indexData); Device &xeDevice; diff --git a/engine/xe_render_system.hpp b/engine/xe_render_system.hpp index b82d6e7..e0915dd 100644 --- a/engine/xe_render_system.hpp +++ b/engine/xe_render_system.hpp @@ -24,7 +24,7 @@ class RenderSystem { public: Builder(Engine &xeEngine, std::string vert, std::string frag) : xeEngine{xeEngine}, vert{vert}, frag{frag} {} - Builder& addVertexBinding(uint32_t binding, uint32_t dimension, uint32_t offset){ + Builder& addVertexBindingf(uint32_t binding, uint32_t dimension, uint32_t offset){ if(dimension == 1) attributeDescptions.push_back({binding, 0, VK_FORMAT_R32_SFLOAT, offset}); if(dimension == 2) @@ -34,6 +34,16 @@ class RenderSystem { return *this; } + Builder& addVertexBindingi(uint32_t binding, uint32_t dimension, uint32_t offset){ + if(dimension == 1) + attributeDescptions.push_back({binding, 0, VK_FORMAT_R32_SINT, offset}); + if(dimension == 2) + attributeDescptions.push_back({binding, 0, VK_FORMAT_R32G32_SINT, offset}); + if(dimension == 3) + attributeDescptions.push_back({binding, 0, VK_FORMAT_R32G32B32_SINT, offset}); + return *this; + } + Builder& setVertexSize(uint32_t size) { vertexSize = size; return *this; diff --git a/engine/xe_vertex_array.cpp b/engine/xe_vertex_array.cpp new file mode 100644 index 0000000..e69de29 diff --git a/engine/xe_vertex_array.hpp b/engine/xe_vertex_array.hpp new file mode 100644 index 0000000..e69de29 diff --git a/res/image/dirt.jpg b/res/image/dirt.jpg deleted file mode 100644 index c3a679dd706a222b396c4e470985ff5991025b4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5956 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 Eg1*nvdjJ3c literal 6160 zcmeHKc{r5o`=7E8MT@PJF`NjqFPKb;u}m7tUZQ4YFpHV7j6-R$D6rA-08dnGWxn zd{NWLEZU#%x`=pIL?m|)U-F+Qy;51+Rv(BqX^GaX9f(--(t>ixRcK-F=H<9^EHV6L zj=H_ID#m=-+v=qalAEtb3M3H9#fr4WqwoQIb2TyJgL^;qS()_A|nx$_#jMg8QoV5k6Zn%qrr^mbfJhsi4b08MdM_&@Dd zu^mD3+p<%_gD1OeJ1aJ8hqbKAy|kEgxFFSG+th^Dx)pan`G84V7kZVYh+`LE6ovgN zD5P!7?jd;W`)Tn4{{=cCxo77{(AXAt`|ycd@`KPvHg^m2gVSyOz@SCP!;$f7I-p=5 z%>lB~pp864LH@Vg)<%J%+<>09PSb-OnhIJg-RVvR&WBbMZ7E#Qq_)wrp8~S*iGVb3 zO_)^i(y(jN4fs>ot6&VT9@u}eS3I^?pNvviQUZogYV6skb5Q48-*sn=43pIYtWzHR zqt3DGI__8VRq~cN7%TsE$m)-fa`%VN(|@~>559V$t1lT*=#=!EXX$b1E|2YYS<8Zh z+BG(`;5(yLDO*EM8Maq%?g{UVQTK})d0BQLa9S`Mi`!Z<-q5b0mVm2>FY~+MMt{rZ z5C?U-GEy zdnRzy!gvMGPZbW!77};&yp6AD<*LIuF5NYwNtA|c;^R{jK9tov!@7&RNB#N9HeGkc zz5ZRCb6_;e_d@%0`1+@Pc$+}M_6BUm{`y9VXOVm%?nHx2W{$E}5ZIT#&q4leXpOIP zbE;o_dPn`S3ZFn{N2i2=(Fbw4qcwlGS|laO&#b;8w!9oRHWNI)=|D}y=An{g`wdm6 zv#%V@UGT8$(9u+RebwxLqfjWv!`ClG>bo2S1fY_bIEK z9wGbcxSo!CHjnT(C|mnut@rU>(rDr9MnMlEv9NqLti0;Z1>LvF`+OlK9He)^26U*~ z5mh`dI+cD`ma3ocf;G9Ed3LJ}l-W!1*6 zIn|!_v}}P`_iQq8(NyfDl7?ymw{x+^)!9;x8&~Hc&u~~-&2Fg|%$)En~-jMW-`u21gUpUY>7Fp5*VM(~4fIt=qSJ;nv{+ zn!<9ra3(Y@T1V_vx76*9+k1W^Iby20Z+qvC?SrqDmu&)p=Ebq?>|Duqc3%z!;3&wC z$sjsiv(anV?k+LaOz_I+OD`mB(a;QSH(gq2ds1_281mADUEuxniYiNRse;lvt>T67 z)@ni(c+V51#G=g1V=0FwYyY|nZQR?x^UCG-Rlh4Kzg^r`asXx1X2vpIq>Xu~iF%#P zC23p*ePpt9%MTvf_k6NCA?<7g>d3R0(L48w2h9~HNqxGkT+P0)zEds9_2Q$Jx0BCr zh<33Ky04I=f2p);s`1j3vO3H)76Ip|w@OQuQ&NF4%Ud>X6zb6-x}}YV7w2EJ43?M% z_h!~2bK7!qs$7K1D&{*DEhd?qq{;o}p;6>%++dshu7BlBVt>v}NqVqcs@@wDyS*cm z^|MbRE_&^x{X+pa?rzoYp3za9f7zyp)&2O!g&xa!Q+MjJdjHKCuA4A^S(&Xxod5B{ z?v&x|<0JEO*3>=8H2CAZ;RiPOgZ1m34v!Bh*j}``bGqACsDDD;Ca-!!FGwk&&T04g zPV3&Dj^6ItfV}Bx5Oq*cAkaSy1y1isHgHP&P&N|iJPw@7;L(`yNDd!3#X%tJb&-53 zJ(wwi(3k;iE)hC*xfTjxGl)=c90f_?+c5*#PEi7;dz6a@Jt~-P#el9`3$~6V00bPS zhzg11gm8s~NFr3mO91YrW&{)>gNTBOP#=mb#EvImLa=Zw90{|JWQU`nYrzm}0fR+w zBRPDg09r(7ph(0gAP^A|5%35MoF@oCpscK{5J)rvjfMdTm{80WQ6phop`nywj)TM$ z(gke3h|S|dq?}Y5FHA&)LVfAdkO~qt3N+X5F$&5K}Rq{m>d8q1V%;uFr*`y z;`-G?DnS67!^8SGSlDiBHpePgqiAN8UhDRn5 zq0;dQ3?7}$AjodfScVlEX~}@mkXRZFYl%d{Xe<;8#$d8oI1H7}WMGlsQIWYq5tU14 zN~r*HI2+)>TQC_I3lH~k4j3# z0H~~xG^C{!4h^HCtxzzm1)dJGq~ho>8iR>rT2PT#9D^pKV$cZ=JOPIaOedQ|4PYYp z+yGgJRB*z2S27WbhR+2qv$%#(MJ&L92;Io$hDCmZdayZ6cM(;pCJK+oqR~hc5HcQ* z!C=0DyqE$ZP>E7b6cUa>%X*~KLI9Ehgr!RB6d;h_`I5O1}j)Co%zx3g2mq5Cl?PBE9B;^73^6 zqmqbBu~!;YS++!5&D_Mz00f#ZB$L*AST=_pytAo|uhY2hF1&&AI<<9La6Ji%+dQz%{$hUFq~k z;W)8I{P_9wxb>LXkzLiZzKdUXDza)-u zCK)-RO1`|d>1D90{bpoLLcjkKd815n)Y#69JI~qi93yhy;DB}gC%mz-asJVxZBcZ? zm8HEyo8V`Y+J+V?-#yYo=dD=uu=0j3eC^~$;-8WaL%CN|H(m>$XA+3+dzJb7v|;y> z>O6X=!_)rfh!Qwr2Vtd+nquxYf5YLCqGGFeK?zH-hxf66$A)P8wNQOv;Jm3#RK4O? z=^c!XH;M|HJT}-b&RUbA_V=>!>*HAqZco3`0hRfl**+eIOL!TnAfP)Ro;lo>{dsE!?=EN9AsZ9_V1{v%c2&j%16Zz}y2jhW?#j zm-UbTD~+~sI4+T->#|U&51;xY8Eft#@i01e{*u3gw-6g*alj%(`&tmy=Zy0iy|fI+ z;EUVy4j6;3)`L37&Yj0Lb1Pd(tH_RKnXl7Ar&k`-(9_Yfz#h&VQvxy?@2l^bDSVau z;$4Pi3I=?+gD_j3m@L0doFDZDx^{EB`LRXQ4ib;lQ%=?4;x=XMvT*v__dy9j&iKye z5wGEKT)c%dsdX^w!>x88dGM!h9WOIQb@$ZxnR$Du4rGL_R~Jx`AhNv+snmAIp8o;y CR;Y#m diff --git a/res/image/grass_top.png b/res/image/grass_top.png new file mode 100644 index 0000000000000000000000000000000000000000..71579bfb4180111f8ef9bee71cad8dc741e9767b GIT binary patch literal 1110 zcmV-c1gZOpP)J>Z9utnOdA8y$;dUdV zCxs7%!;TzK_)6)C5CpoH^r)W4Efs>aKw=&Bi^v6dFg6OO^I&Gm!+U` z|C^_q8XhWjZ;e9zlkdOvLBkGwZ~Ok&k?(&WL+vA6N9 ziCs9~gsul$cl4rED>INv!Rsjm7ohD1nwLshmDf4BhuL*`qHEaOhkn@~TK)mo3TO8Q zRL(;H000SaNLh0L01FZT01FZU(%pXi0007wNkl9r1VIOrpvPs#ngxmgiNos5Z?_VmNu zU~AVEMLQl91){G3N-3D8Ddg+Fs~DSzW3SQ@b%G=jyJRlK3?S*m5FbqdQH48~XR!KZ z6UnrV%BG8E(}y0CtB4-521uNUficWZU0cWrTXMt{5A2wR&p+3Y&KUB3aW*T8m0xYS zkLpMMFw@a-6Y5<4lrXKW)=`|y$l2{H7;zid&z2v^<%*g8na!*5j--lwW2r3bW-JWDb*BQ(oX&!@^9q%c& zvr!W<#XhrjL?P>7B(9_51~_Q6qFO)7Z13*@6cwJo_;_4`+w8z_ zwBsOVwi~K5nBWYMlqZGM{Pd*sldQ~uZj+sU&^%^G<5&V8qFk=Yd~gyY=G9;+Gj5}{ z*FripN_WB%ye`ayiJs?UyWT)zOb=%OXwlbzgRX(E0;83C;%7XRFo9yB!%2P16vu47_~(2@5kNG41iA8`6zvD9;7rehf=s z*?MGfv, Chunk*> chunks{}; @@ -46,28 +44,58 @@ uint8_t Chunk::getBlock(int32_t x, int32_t y, int32_t z) { z = (z+16)%16; if(chunkX == gridX && chunkZ == gridZ) { int index = x + (z * 16) + (y * 256); - return blocks[index]; + return cubes[index]; } else { Chunk* chunk = getChunk(chunkX, chunkZ); if(chunk == NULL) { return INVALID; } else { int index = x + (z * 16) + (y * 256); - return chunk->blocks[index]; + return chunk->cubes[index]; } } } -void Chunk::setBlock(int32_t x, int32_t y, int32_t z, uint8_t block) { - int index = x + (z * 16) + (y * 256); - blocks[index] = block; +static std::map blocks{}; +static std::map texturesIds{}; +static std::vector textures{}; + +void loadTexture(const std::string& filePath) { + xe::Image* image = xe::Engine::getInstance()->loadImageFromFile(filePath); + texturesIds[filePath] = static_cast(textures.size()); + textures.push_back(image); } -void Chunk::reset() { +uint32_t getTexture(const std::string& filePath) { + return texturesIds[filePath]; +} + +std::vector& Chunk::getTextures() { + return textures; +} + +void Chunk::load() { + loadTexture(DIRT_TEXTURE); + loadTexture(GRASS_TEXTURE); + loadTexture(GRASS_TOP_TEXTURE); + blocks[DIRT] = {{getTexture(DIRT_TEXTURE), getTexture(DIRT_TEXTURE), getTexture(DIRT_TEXTURE), getTexture(DIRT_TEXTURE), getTexture(DIRT_TEXTURE), getTexture(DIRT_TEXTURE)}}; + blocks[GRASS] = {{getTexture(GRASS_TEXTURE), getTexture(GRASS_TEXTURE), getTexture(GRASS_TOP_TEXTURE), getTexture(DIRT_TEXTURE), getTexture(GRASS_TEXTURE), getTexture(GRASS_TEXTURE)}}; +} + +void Chunk::unload() { + for(const auto &image: textures) { + delete image; + } for(const auto &[key, chunk]: chunks) { delete chunk; } chunks.clear(); + textures.clear(); +} + +void Chunk::setBlock(int32_t x, int32_t y, int32_t z, uint8_t block) { + int index = x + (z * 16) + (y * 256); + cubes[index] = block; } std::shared_ptr Chunk::getMesh() { @@ -88,29 +116,29 @@ void Chunk::createMeshAsync() { void Chunk::createMesh() { working = true; - vertexData.clear(); + vertexData.data.clear(); for(int32_t x=0;x<16;x++) { for(int32_t y=0; y<256; y++) { for(int32_t z=0; z<16; z++) { uint8_t block = getBlock(x,y,z); if(block == AIR) continue; if(getBlock(x+1,y,z) == AIR) { - addVerticies(0, x, y, z); + addVerticies(0, x, y, z, block); } if(getBlock(x-1,y,z) == AIR) { - addVerticies(1, x, y, z); + addVerticies(1, x, y, z, block); } if(getBlock(x,y+1,z) == AIR) { - addVerticies(2, x, y, z); + addVerticies(2, x, y, z, block); } if(getBlock(x,y-1,z) == AIR) { - addVerticies(3, x, y, z); + addVerticies(3, x, y, z, block); } if(getBlock(x,y,z+1) == AIR) { - addVerticies(4, x, y, z); + addVerticies(4, x, y, z, block); } if(getBlock(x,y,z-1) == AIR) { - addVerticies(5, x, y, z); + addVerticies(5, x, y, z, block); } } } @@ -119,22 +147,22 @@ void Chunk::createMesh() { reloadRequired = true; } -void Chunk::addVerticies(uint8_t side, int32_t x, int32_t y, int32_t z) { +void Chunk::addVerticies(uint8_t side, int32_t x, int32_t y, int32_t z, uint8_t block) { for(int i = 0; i < 6; i ++) { - vertexData.push_back(px[side * 6 + i][0] + x); - vertexData.push_back(px[side * 6 + i][1] + y); - vertexData.push_back(px[side * 6 + i][2] + z); - vertexData.push_back(nm[side][0]); - vertexData.push_back(nm[side][1]); - vertexData.push_back(nm[side][2]); - vertexData.push_back(uv[i][0]); - vertexData.push_back(uv[i][1]); - vertexData.push_back(0.f); + vertexData.write(px[side * 6 + i][0] + x); + vertexData.write(px[side * 6 + i][1] + y); + vertexData.write(px[side * 6 + i][2] + z); + vertexData.write(nm[side][0]); + vertexData.write(nm[side][1]); + vertexData.write(nm[side][2]); + vertexData.write(uv[i][0]); + vertexData.write(uv[i][1]); + vertexData.write(static_cast(blocks[block].textures[side])); } } void Chunk::generate() { - blocks.resize(16*16*256); + cubes.resize(16*16*256); const PerlinNoise perlin{world_seed}; @@ -142,7 +170,9 @@ void Chunk::generate() { for(int z = 0; z < 16; z++) { int height = perlin.octave2D_01((( x + gridX * 16) * 0.01), ((z + gridZ * 16) * 0.01), 4) * 10; for(int y = 0; y < 256; y++) { - if(y <= height) + if(y == height){ + setBlock(x, y, z, GRASS); + } else if(y < height) setBlock(x, y, z, DIRT); else setBlock(x, y, z, AIR); diff --git a/src/chunk.hpp b/src/chunk.hpp index d10adc9..e2cfab5 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -1,6 +1,9 @@ #pragma once #include "xe_model.hpp" +#include "xe_engine.hpp" +#include "xe_image.hpp" + #include "PerlinNoise.hpp" #include @@ -11,19 +14,30 @@ #include #include -#define INVALID 0 -#define AIR 1 -#define DIRT 2 -#define GRASS 3 +#define INVALID -1 +#define AIR 0 +#define DIRT 1 +#define GRASS 2 + +#define DIRT_TEXTURE "res/image/dirt.png" +#define GRASS_TEXTURE "res/image/grass.png" +#define GRASS_TOP_TEXTURE "res/image/grass_top.png" namespace app { +struct Block { + uint32_t textures[6]; +}; + class Chunk { public: + static void load(); + static void unload(); + static std::vector& getTextures(); + static Chunk* newChunk(int32_t gridX, int32_t gridZ, uint32_t world_seed); - static void reset(); Chunk(int32_t gridX, int32_t gridZ, uint32_t world_seed); ~Chunk() {}; @@ -43,16 +57,16 @@ class Chunk { private: void generate(); - void addVerticies(uint8_t side, int32_t x, int32_t y, int32_t z); + void addVerticies(uint8_t side, int32_t x, int32_t y, int32_t z, uint8_t block); bool reloadRequired{false}; bool working{false}; std::shared_ptr chunkMesh; - std::vector vertexData; - std::vector blocks; + xe::Model::Data vertexData; + std::vector cubes; std::thread worker; - + }; const float px[36][3] = { diff --git a/src/first_app.cpp b/src/first_app.cpp index 04272ba..2319670 100755 --- a/src/first_app.cpp +++ b/src/first_app.cpp @@ -3,20 +3,17 @@ namespace app { -FirstApp::FirstApp() : xeEngine{WIDTH, HEIGHT, "Xenon Vulkan Engine"} { - loadGameObjects(); -} +FirstApp::FirstApp() : xeEngine{WIDTH, HEIGHT, "Xenon Vulkan Engine"} {}; FirstApp::~FirstApp() {} void FirstApp::run() { - std::shared_ptr dirt = xeEngine.loadImageFromFile("res/image/dirt.jpg"); - std::shared_ptr grass = xeEngine.loadImageFromFile("res/image/grass.png"); + Chunk::load(); - std::vector images = {dirt.get(), grass.get()}; + loadGameObjects(); - SimpleRenderer renderer{xeEngine, images}; + SimpleRenderer renderer{xeEngine, Chunk::getTextures()}; xe::Sound sound{"res/sound/when_the_world_ends.wav"}; sound.setLooping(true); @@ -41,10 +38,10 @@ void FirstApp::run() { } - Chunk::reset(); - xeEngine.close(); + Chunk::unload(); + } void FirstApp::loadGameObjects() { diff --git a/src/simple_renderer.cpp b/src/simple_renderer.cpp index c68f2ab..17f7b57 100644 --- a/src/simple_renderer.cpp +++ b/src/simple_renderer.cpp @@ -4,10 +4,10 @@ namespace app { SimpleRenderer::SimpleRenderer(xe::Engine &xeEngine, std::vector &images) { xeRenderSystem = xe::RenderSystem::Builder(xeEngine, "res/shaders/simple_shader.vert.spv", "res/shaders/simple_shader.frag.spv") - .addVertexBinding(0, 3, 0) // position - .addVertexBinding(1, 3, 12) // normal - .addVertexBinding(2, 2, 24) // uvs - .addVertexBinding(3, 1, 32) // texture + .addVertexBindingf(0, 3, 0) // position + .addVertexBindingf(1, 3, 12) // normal + .addVertexBindingf(2, 2, 24) // uvs + .addVertexBindingi(3, 1, 32) // texture .setVertexSize(36) .addPushConstant(sizeof(PushConstant)) .addUniformBinding(0, sizeof(UniformBuffer))