From 3a9dbcb470e3c147d524fe8f6117cda85509ea13 Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Sun, 18 May 2025 19:23:30 +0900 Subject: [PATCH] =?UTF-8?q?FBX=ED=8C=8C=EC=9D=BC=20=EC=9D=BD=EA=B8=B0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/player.fbx | Bin 11932 -> 15164 bytes include/vulkan/graphics.h | 1 + include/vulkan/model.h | 12 ++++++++++++ src/main.cpp | 34 ++++++++++++++++++++++++---------- src/vulkan/texture.cpp | 6 +++++- 5 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 include/vulkan/model.h diff --git a/assets/player.fbx b/assets/player.fbx index 8d9bef7c90b474916a47bb9e2309f3c6703cd91b..5576d9ebe863e376709d0d454d1f9bd58e901030 100644 GIT binary patch delta 4318 zcmb6b3v5%@_1)V9J6}7&N$faZ{}O`pA#oBMKF$}C5r+hmFfkS8ga?@Vli3b!DpaSm zU16$J*qPAA7_?ex)sOZ8O&eXySgC}@HWj3`45=MuWm?%_WGWR}TVUtBkK-g=VOM_d z9pCdm_k8Z52jAGa&&&?&FZp*OUl4>UCJ6Ww((y^_jZ8%Q79!+H*_8rhtc;M92FMou1_vK8}_8n~u$@J}>g&^9p_^lICik7dt@&RrdhjQWEo|!S0L|>?oYdaPyBc z;PZ^-%mPa@S27VE&g^8b!t0qm{6Cq%vijLt7|0rChv9{+0e(IUZe}fE`QXTIXX{{F zwugNmUdrBVypl6xUPgChY$7CvxE|l{k<6!QLx9MGxiEz9x4dot&qq&RN zes~8NuIS-ru7zF1KZX2)9_n>f{H$J5vIE9-1N;pgoYD=lT*%W8u{AKJU(TL@=k%@o zO+8%HZ)Q(}JFkM5AvXLzYd+A0rcB-_C9mjVW{I%51Zb^`% z%+8jE#pc12AGJ+7ZZDQImr5mb?dT41 zEWUnnT=Zf23SNI)j0XI{w``PiP16dg0a5zFXk=WB#wXW{q46Nn`KUdu8hyk!5#8z^ z69>0P!rMMtOzBy^#xD1hB}l;rebh62+x=UxOL!wO>iX7DbB%UdSxJo9@#E*9( z7!UOOC&efXl^AQzAq93Qp;M+H!+S!3SS+wp?1}^U zFp-25;ILwk5)Cq6k#}F_T%T`FcVO$*iP&7{6>}0KzgxEFD%vAikpeg|&=jx~a};^^ zWljRwDLOs)V085OSs(R>W8?m)9HH#F2hwm_(byuh&=8zq8JnD^7EjSI{Ds1VDM)%q z<=S!oSRg)mkK-GxmJM7bGiKmtAQBDvgI@nQ>?>JXbVMOg&X?MD=R`=tm41jg3Qm*E zOvy+%*+h7}+)_5}S++=4;FW3e@Y5ZLVNHyQA=r}Tu|J6fBxIRPK>j8PFh(=NY}1~< zDZ=RR(9I(Jj9^7ZqDc-Cx!8p>pF}D)8|RbF5}cU!Jc%3>w3MRpjf-OwL4WkV(s*tb zzpYr1QdO$Fc?amD9GqKLcNGD(h(b^4TzuOD;Xqi7#lG@LUG1Hi1mu0Q%t{eYvi3YO z9torKvqY>UiqxuhwSNy~P&}y2Q9U)Ub>h|_#v1P_b0R`*r1L#RsY_;{M4w@p?=qri ztDN@0&uy-CKXVgCUK+XG#v+(rbQ8f87qqLzNJxxFC;N44Z<>its;R*swLgKWSRbXS zSB!0+a>7cx&HB6(-M}phi%um{Z(X}^b3rXUWgp|wTKI>32mfs?j5xf!t{#p$EKBa- z8K}(3tD1;RhPoL<+JHYKN>rAtRJ=)*Yt zVhNd0@xFr3LrjLMC>9_)Xr-a|2Gb~>u4-AjWSL}&sgW*@{E0@`S5w3{HiD*T_V-tQ zKuDL7iWbSv18(wp(H>-wk^mX7XV5+7%SSJKZgtfBS)oqpxc}>#g5*wPt6aS)4OJzd z*Ij5LCbl8N9Bb}`ges1lZBWllC$Qc zt)_LUY-LIm)HyM?%VHD~4j!vTYlYM6hd~~-=v{jfD^W=;;*$KkFv75BH^$+%VIa& xFjQ+;sMdVHN>kV-?WAO2cS^9eaLt<>A4Nlhn<-Z6r5x4*V delta 2102 zcmZ`)drXs86z{zPZGjdFg+4x7`lJQgQUpX0h4B!Wl&J-Din0P9S}iTo!h$*lU-J)j z=-CoBUl`rX=(5b2`P@_z=d#Q==C*9hoEnV=aGQ)QQ?s#qzw(-9H{W-^-#zDi_x|oV z=bn46ec!Tf1`X^^c(_r*`b2YfBHRb?fbrGxuV4jwzTOf$5-XJ~J?rn<7crZ)4z8*dJ7 z-BLTa<;a7sV?%p)kp98zTLus98~EhZ;DMgO4|mqKcw8N9tF7L{dK=+ZstLykpogD? zO9gO&pMkc+2)`g9Of*SYTObeJlJ zTai-rdmXd5EjVdRoeiv)okTn_<&HjrR8a={1L{N$tQNxuq8X?b?uzt^`-aK&B8u52 zx7QtT`@H_0pcTvIM+lpz)}2P|hhc#@8Qq0-Vm+QIfnKprVU2pml4B?VwL~B0VErrA z5{}8IkPuagqTzg$3^qmOqI!ZBpo0(FpNX|aRfDW&M zN@B(r4cwH&P$$X9^J1V^vWR&3FVa7O`7w*|!dQ4erW);n(U@829?Xhej0>cY7psCS zc`jNDE~y4YQU&^$L!|`$N>C0mLsXmw&XRFGhujJU+DA|hx(?-W*;pPAo8k(Q3&iny zxF2UkM+qt;?xo|k@kX33gG2Fo=vBB8UyW`+rmP0bH^}L~X>fMCei%qU8{g zsD(3$M)Wp8b4i-hahb+Q*BsNVC1@_X$c>2xhiSp5DZ=yUM-BZ%(j9~{tr1;@+1f1h z5BRm&*s6nLS}XFykJ=J)jW_-a^{d#1fM1--7nu2rB zCVGCQueI6b@i&HzEp3N2d<9%jjpN@O9sMnzF~fPAK}4xcyu>2*8HomuB!fLoja_EC zxRx%y-W>cZoZyg3S97r9RM$9MEho$zqX9EzgtsNbaN1k=UNY>mdlZN`a(wTh6|^>& zQ*wqBIx)P2LzrDDR1j>DoJEO;r8SUEfz0VixGM#0875}r|IEHjfdkWZ_#QQTE-!_| zl*W&+<%K$YjjX4_vP?*>8xlNv8BPrzr=EzME0s`^(t>*2LSu-prP3ry=nplSc%3yD zis>A*O#p+1q}D>b$^u$l0q65x3pt*4s5MCN7Z!-jQfAz-OzvOkX!8WzRj$=6=Yz*% zDthbkohx09 indices); void DestroyBuffer(BufferHandle handle); TextureHandle CreateTexture(gsl::czstring path); + TextureHandle CreateTexture(gsl::span image_file_data); void DestroyTexture(TextureHandle handle); private: diff --git a/include/vulkan/model.h b/include/vulkan/model.h new file mode 100644 index 0000000..038fe4b --- /dev/null +++ b/include/vulkan/model.h @@ -0,0 +1,12 @@ +#pragma once +#include + +#include "vertex.h" + +namespace veng { +struct Model { + std::vector vertices; + std::vector indices; + glm::mat4 transform; +}; +} // namespace veng diff --git a/src/main.cpp b/src/main.cpp index 02e1dee..82865d1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include "assimp/Importer.hpp" #include "assimp/postprocess.h" +#include "assimp/scene.h" #include "glfw/glfw_initialization.h" #include "glfw/glfw_monitor.h" #include "glfw/glfw_window.h" @@ -23,21 +24,31 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) { const struct aiScene* scene = assetImporter.ReadFile( "assets/player.fbx", aiProcess_CalcTangentSpace | aiProcess_Triangulate | - aiProcess_JoinIdenticalVertices | aiProcess_SortByPType); + aiProcess_JoinIdenticalVertices | + aiProcess_SortByPType); - if (nullptr == scene) { + if (scene == nullptr || !scene->HasMeshes()) { spdlog::error(assetImporter.GetErrorString()); return false; } - std::array vertices = { - veng::Vertex{{-.5f, -.5f, 0.f}, {0.f, 1.f}}, - veng::Vertex{{.5f, -.5f, 0.f}, {1.f, 1.f}}, - veng::Vertex{{-.5f, .5f, 0.f}, {0.f, 0.f}}, - veng::Vertex{{.5f, .5f, 0.f}, {1.f, 0.f}}}; + std::vector vertices; + aiMesh* mesh = scene->mMeshes[0]; + for (std::uint32_t i = 0; i < mesh->mNumVertices; i++) { + vertices.emplace_back( + glm::vec3{mesh->mVertices[i].x, mesh->mVertices[i].y, + mesh->mVertices[i].z}, + glm::vec2{mesh->mTextureCoords[0][i].x, mesh->mTextureCoords[0][i].y}); + } veng::BufferHandle buffer = graphics.CreateVertexBuffer(vertices); - std::array indices = {0, 3, 2, 0, 1, 3}; + std::vector indices; + for (std::uint32_t i = 0; i < mesh->mNumFaces; i++) { + aiFace face = mesh->mFaces[i]; + for (unsigned int j = 0; j < face.mNumIndices; ++j) { + indices.push_back(face.mIndices[j]); + } + } veng::BufferHandle index_buffer = graphics.CreateIndexBuffer(indices); glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), glm::radians(45.f), @@ -46,7 +57,9 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) { glm::mat4 rotation2 = glm::rotate(glm::mat4(1.0f), glm::radians(0.f), glm::vec3(0.f, 0.f, 1.f)); - glm::mat4 view = glm::translate(glm::mat4(1.f), glm::vec3(0.f, 0.f, -2.f)); + glm::mat4 view = + glm::lookAt(glm::vec3(0.f, 0.f, 10.f), glm::vec3(0.f, 0.f, 0.f), + glm::vec3(0.f, 1.f, 0.f)); glm::mat4 projection = glm::perspective(glm::radians(150.f), 800.f / 600.f, 0.1f, 100.f); graphics.SetViewProjection(view, projection); @@ -61,7 +74,8 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) { glfwPollEvents(); glm::ivec2 current_window_size = window.GetFramebufferSize(); - if (current_window_size != window_size && current_window_size.x != 0 && current_window_size.y != 0) { + if (current_window_size != window_size && current_window_size.x != 0 && + current_window_size.y != 0) { window_size = current_window_size; projection = glm::perspective( glm::radians(90.f), diff --git a/src/vulkan/texture.cpp b/src/vulkan/texture.cpp index 927a558..0fe3fab 100644 --- a/src/vulkan/texture.cpp +++ b/src/vulkan/texture.cpp @@ -31,9 +31,13 @@ void Graphics::CreateTextureSampler() { } TextureHandle Graphics::CreateTexture(gsl::czstring path) { + std::vector data = ReadFile(path); + return CreateTexture({data.data(), data.size()}); +} + +TextureHandle Graphics::CreateTexture(gsl::span image_file_data) { glm::ivec2 image_extents; std::int32_t channels; - std::vector image_file_data = ReadFile(path); stbi_uc* pixel_data = stbi_load_from_memory( image_file_data.data(), image_file_data.size(), &image_extents.x, &image_extents.y, &channels, STBI_rgb_alpha);