From f95fd2efc2fc3094d5a1e807afbc59f9f35fb962 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 2 Feb 2024 14:37:58 -0500 Subject: [PATCH] Add a dedicated skinned shader This is to prevent trying to use bone transforms on terrain. --- armoury/src/gearview.cpp | 9 ++--- mapeditor/src/mapview.cpp | 7 +++- mdlviewer/src/mainwindow.cpp | 2 +- parts/mdl/mdlpart.cpp | 2 ++ parts/mdl/mdlpart.h | 1 + renderer/CMakeLists.txt | 3 +- renderer/include/renderer.hpp | 2 ++ renderer/shaders/compile_shaders.sh | 1 + renderer/shaders/mesh.frag | 7 +++- renderer/shaders/mesh.frag.spv | Bin 2608 -> 2844 bytes renderer/shaders/mesh.vert | 11 ++----- renderer/shaders/mesh.vert.spv | Bin 5256 -> 3256 bytes renderer/shaders/skinned.vert | 49 ++++++++++++++++++++++++++++ renderer/shaders/skinned.vert.spv | Bin 0 -> 5256 bytes renderer/src/renderer.cpp | 18 ++++++++-- sagasu/src/mainwindow.cpp | 2 +- 16 files changed, 94 insertions(+), 20 deletions(-) create mode 100644 renderer/shaders/skinned.vert create mode 100644 renderer/shaders/skinned.vert.spv diff --git a/armoury/src/gearview.cpp b/armoury/src/gearview.cpp index d898f4f..7c9a471 100644 --- a/armoury/src/gearview.cpp +++ b/armoury/src/gearview.cpp @@ -339,6 +339,7 @@ void GearView::updatePart() gearAddition.bodyId = physis_get_race_code(fallbackRace, fallbackSubrace, currentGender); mdlPart->addModel(mdl, + true, glm::vec3(), sanitizeMdlPath(mdlPath), materials, @@ -390,7 +391,7 @@ void GearView::updatePart() } } - mdlPart->addModel(mdl, glm::vec3(), sanitizeMdlPath(mdlPath), materials, currentLod); + mdlPart->addModel(mdl, true, glm::vec3(), sanitizeMdlPath(mdlPath), materials, currentLod); } } @@ -413,7 +414,7 @@ void GearView::updatePart() } } - mdlPart->addModel(mdl, glm::vec3(), sanitizeMdlPath(mdlPath), materials, currentLod); + mdlPart->addModel(mdl, true, glm::vec3(), sanitizeMdlPath(mdlPath), materials, currentLod); } } @@ -436,7 +437,7 @@ void GearView::updatePart() } } - mdlPart->addModel(mdl, glm::vec3(), sanitizeMdlPath(mdlPath), materials, currentLod); + mdlPart->addModel(mdl, true, glm::vec3(), sanitizeMdlPath(mdlPath), materials, currentLod); } } @@ -453,7 +454,7 @@ void GearView::updatePart() if (cache.fileExists(QLatin1String(skinmtrl_path.c_str()))) { auto mat = physis_material_parse(cache.lookupFile(QLatin1String(skinmtrl_path.c_str()))); - mdlPart->addModel(mdl, glm::vec3(), sanitizeMdlPath(mdlPath), {mat}, currentLod); + mdlPart->addModel(mdl, true, glm::vec3(), sanitizeMdlPath(mdlPath), {mat}, currentLod); } } } diff --git a/mapeditor/src/mapview.cpp b/mapeditor/src/mapview.cpp index 0eed3bf..352b818 100644 --- a/mapeditor/src/mapview.cpp +++ b/mapeditor/src/mapview.cpp @@ -38,7 +38,12 @@ void MapView::addTerrain(QString basePath, physis_Terrain terrain) auto plateMdlFile = physis_gamedata_extract_file(data, mdlPathStd.c_str()); auto plateMdl = physis_mdl_parse(plateMdlFile); - mdlPart->addModel(plateMdl, glm::vec3(terrain.plates[i].position[0], 0.0f, terrain.plates[i].position[1]), QStringLiteral("terapart%1").arg(i), {}, 0); + mdlPart->addModel(plateMdl, + false, + glm::vec3(terrain.plates[i].position[0], 0.0f, terrain.plates[i].position[1]), + QStringLiteral("terapart%1").arg(i), + {}, + 0); } } diff --git a/mdlviewer/src/mainwindow.cpp b/mdlviewer/src/mainwindow.cpp index e297cf7..866a396 100644 --- a/mdlviewer/src/mainwindow.cpp +++ b/mdlviewer/src/mainwindow.cpp @@ -58,7 +58,7 @@ void MainWindow::setupFileMenu(QMenu *menu) auto buffer = physis_read_file(fileName.toStdString().c_str()); - part->addModel(physis_mdl_parse(buffer), glm::vec3(), QStringLiteral("mdl"), {}, 0); + part->addModel(physis_mdl_parse(buffer), false, glm::vec3(), QStringLiteral("mdl"), {}, 0); }); } diff --git a/parts/mdl/mdlpart.cpp b/parts/mdl/mdlpart.cpp index 92953f8..c31dd33 100644 --- a/parts/mdl/mdlpart.cpp +++ b/parts/mdl/mdlpart.cpp @@ -72,6 +72,7 @@ void MDLPart::clear() } void MDLPart::addModel(physis_MDL mdl, + bool skinned, glm::vec3 position, const QString &name, std::vector materials, @@ -86,6 +87,7 @@ void MDLPart::addModel(physis_MDL mdl, model.from_body_id = fromBodyId; model.to_body_id = toBodyId; model.position = position; + model.skinned = skinned; std::transform(materials.begin(), materials.end(), std::back_inserter(model.materials), [this](const physis_Material &mat) { return createMaterial(mat); diff --git a/parts/mdl/mdlpart.h b/parts/mdl/mdlpart.h index 2ba6f4a..81a4245 100644 --- a/parts/mdl/mdlpart.h +++ b/parts/mdl/mdlpart.h @@ -53,6 +53,7 @@ public Q_SLOTS: /// Adds a new MDL with a list of materials used. void addModel(physis_MDL mdl, + bool skinned, glm::vec3 position, const QString &name, std::vector materials, diff --git a/renderer/CMakeLists.txt b/renderer/CMakeLists.txt index d835b0d..8831e92 100644 --- a/renderer/CMakeLists.txt +++ b/renderer/CMakeLists.txt @@ -16,7 +16,8 @@ qt_add_resources(renderer shaders/imgui.frag.spv shaders/imgui.vert.spv shaders/mesh.frag.spv - shaders/mesh.vert.spv) + shaders/mesh.vert.spv + shaders/skinned.vert.spv) target_include_directories(renderer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) target_link_libraries(renderer PUBLIC diff --git a/renderer/include/renderer.hpp b/renderer/include/renderer.hpp index 17694fb..d905dae 100644 --- a/renderer/include/renderer.hpp +++ b/renderer/include/renderer.hpp @@ -47,6 +47,7 @@ struct RenderModel { std::array boneData; std::vector materials; glm::vec3 position; + bool skinned = false; uint16_t from_body_id = 101; uint16_t to_body_id = 101; @@ -109,6 +110,7 @@ public: std::map cachedDescriptors; VkPipeline pipeline; + VkPipeline skinnedPipeline; VkPipelineLayout pipelineLayout; std::tuple createBuffer(size_t size, VkBufferUsageFlags usageFlags); diff --git a/renderer/shaders/compile_shaders.sh b/renderer/shaders/compile_shaders.sh index 95271ea..702826f 100755 --- a/renderer/shaders/compile_shaders.sh +++ b/renderer/shaders/compile_shaders.sh @@ -3,6 +3,7 @@ # SPDX-License-Identifier: CC0-1.0 glslc mesh.vert -o mesh.vert.spv && +glslc skinned.vert -o skinned.vert.spv && glslc mesh.frag -o mesh.frag.spv && glslc imgui.vert -o imgui.vert.spv && glslc imgui.frag -o imgui.frag.spv \ No newline at end of file diff --git a/renderer/shaders/mesh.frag b/renderer/shaders/mesh.frag index 0ea859d..ea01613 100644 --- a/renderer/shaders/mesh.frag +++ b/renderer/shaders/mesh.frag @@ -23,7 +23,12 @@ layout(std430, push_constant) uniform PushConstant { void main() { const vec3 lightPos = vec3(3); - vec3 diffuse = texture(diffuseTexture, inUV).rgb; + vec3 diffuse; + if (textureSize(diffuseTexture, 0).x == 1) { + diffuse = vec3(1); + } else { + diffuse = texture(diffuseTexture, inUV).rgb; + } if(type == 1) { const float skinInfluence = texture(specularTexture, inUV).r; vec3 skinColor = vec3(250 / 255.0, 199 / 255.0, 166 / 255.0); diff --git a/renderer/shaders/mesh.frag.spv b/renderer/shaders/mesh.frag.spv index 0d0b9713d492dc4f663d6e1808df14a710a5b2c7..050b402a607b2bf353cd70cfde2cfcd7b8a3d355 100644 GIT binary patch literal 2844 zcmZ9M+j0{}5QfLLqyRRja1MmXc0vv&4oQGO2v}gu8loUM9CMTxX=S#uUa6!N6}X}b zu5*=VNUC@YZjv`j0!3B+Z+F|?Vyar*|KB}5-94k77@vK^xiL5Cw!3>STf5!380XNR zNl&^;ioN=c`us5I%%41Ug2)|i0+sr9x~;Ax8(H_m7=A|LNxqTXmF!YHejO-lLfM^r zu7gT$oAc@|uhH=8ORaXl-x?+lqo5UqanS07gP@&+4+7%06yn0T9gRB0fU+Wr=a*IY zHl5K4yWP<+xEcJKj0Va>+~G|=#nc+cw{A-bSKJ5E&C&4wVlN&hew@Hpv=5&3pbsvm zm|3m&Izc2|$@kLRy4~$!{0HcX1!mS@&IU8rqJLGmm=8=o-Zt^RbkPsS zUyYoG9xbXCIs zxg2ko%{m~wQ<@lRA%3@XRl*`3{AP+a_wN-Z-(Kz7CrzG1($q~~)b*A$HNukz-w}y( zj~9*$!M`nmGa*k^m{{r|&$RSdYG?g{XL64CcV!dL{158)eQ7xGQF(X^a0q>7^C-Cw zWivbc%ni){9nR)7C)@ftp8IS+-(LFTY@0i8jb;6QDf{J%M+=6}3IF|C6kv?D(D<#((xTy!0C8yJ+$3=lcgf zuYA1yNeS=1BMiSI=hjpOZ=7!r9B+R`9QU|K0?&FTj<>vD0?!-&N1Ys$X1!2ed?@5S(Z>SsY`j`YBVR3KF*v`XW zJdblPDj)CkV+n70PQsb=Ixm5@K0nDh>+@4#7JcG7A%UY8Z0qHeY~H!`a$0t=moJ2g zfoIMY=`#{|7WH%YaM;{C@80rXkX@YBf^ac^O_&&Xo7F|xwOph&W<^eBc}c=KO;rP4 zl-M^1J(bV=vTWwetjNheVr}O5nYqmcZD%aY_9RpJ8CPYKi+7BV9N6%-=elhElTS1! z>S{>%@4{Q2rfkcDpFG#3;VsX%vdL}uhHPSf&*y(rHZky1`gd?AwE?LS*Zs52;4eZ?*b8&*gQG)l2$A?`72Q zDla&C^}|Px#bVr6@oK;Ke6}6-qIwu%F9?U7v)Dn;$2#|4Xg9q;yr4fY-0f*Q^eU}Z z&r`HvnOO9yqpH*yblVYh=W|Jn2Cx=&ba=n$3q!K6V>Cv(5U^@fSoJG`WFT=L<{bxLFduqG*fa zxi32YqVyHw*r09tVpfXdUna^P(|0Ixl^o!RA5KBoE~h&0%%R?hIQi%cJa0rU?BLOP zcWmG{h=b?8TlKqH92@#3{caI2ioov{lD7Z@;Y<8E-NnV z&eTV|`S(bs&PH`#6sQ0F;x?b-qxL(BmJy93jX`=`X_KG?p*Cr8mh{J5S$2Hx6 ze(_H$o*mjHV$awuYOqgy-`GD3QxxAT!p44mSB_C}&M)Ed?Gs^RHptfdLCNfz^?pcl zw)ex*!C=3qTI|*_5q1v!GEZ#C%#z)*{HG;nXLCk+HvfclFxYK2XC-5YI5rz{GP`pk z>QvKRz95;sH5yK5d{H)H*>iFd2i9hc|EK0*bAelptCHFE;k3pz$>h2r!bcAF1iQt| zN}dtD)tu<_x@cO2-SQA`dGM2m{YvsC_bW*!x8{Z`-sHB3yu1^B zzAtjKtN1L}UCBeKPFzI<=6%|8RWcat_TKj-W9OLdzGQ6FG~0vJ#vWJI7rXy3_B#h2 QKW{`|cf|4iQHBemzfI=6r2qf` diff --git a/renderer/shaders/mesh.vert b/renderer/shaders/mesh.vert index d81e5e2..06f0032 100644 --- a/renderer/shaders/mesh.vert +++ b/renderer/shaders/mesh.vert @@ -32,15 +32,8 @@ layout(std430, binding = 2) buffer readonly BoneInformation { }; void main() { - mat4 BoneTransform = bones[boneOffset + inBoneIds[0]] * inBoneWeights[0]; - BoneTransform += bones[boneOffset + inBoneIds[1]] * inBoneWeights[1]; - BoneTransform += bones[boneOffset + inBoneIds[2]] * inBoneWeights[2]; - BoneTransform += bones[boneOffset + inBoneIds[3]] * inBoneWeights[3]; - - BoneTransform = model * BoneTransform; - - vec4 bPos = BoneTransform * vec4(inPosition, 1.0); - vec4 bNor = BoneTransform * vec4(inNormal, 0.0); + vec4 bPos = model * vec4(inPosition, 1.0); + vec4 bNor = vec4(inNormal, 0.0); gl_Position = vp * bPos; outNormal = bNor.xyz; diff --git a/renderer/shaders/mesh.vert.spv b/renderer/shaders/mesh.vert.spv index 3f02e37564408625281797c213622a9e293f99ab..1b155714fe09dfdb8fcffae0e3e3304c64e717d1 100644 GIT binary patch literal 3256 zcmZ9O+j0{}5QfK=B?u%Tgm4PPk#WeuBo2f_NC;psX6;xY5g*90RI;=(TeV)Pq!k6Z z@ggb=25s zEROTu;*FbE@p#u&ydyp*+(|#5(eGX-$pEJ%vyuhLb;&KsiX@V(N!BF|$rDLSQqjL@ z>3l ztIe0{$ul&9hh}X5{m_QxUPuBo#VGJF+c7a?k`ECJ0=hO zBIRiBSkPno5@8MNt@n-#GmK+zIJ9xZgbUX)hvS{HH}Pz5`is37NK&h6hfJG~Iv>zFk- z$7Sg{K!f$*PbK(Y6#h(_m~fnvKDSz7L&)n3X>!EQzTkzDvvXb%X5fES8h>JezbUbu z3(Pyhhj?J#5tzCxOOqFO$@)jq*x>O8uaq42$C^(`%npu94u9}kiShrjoRc4R@OsG^ zZoGkchwMRqPo=4)^;5I7!LuIBJH`LJZv2@v=K+Vq@CBXjCmHY~zm3ufj(A|+Im0mT zm|>WA%P`D4W!Sy{togo#d*{v4gK)Fjo3{qX-oHsxcQ|5!d2evH^j6WFo57v@E2b)q zFYk)}wz`7(8v^`5Ui3eImGMS+7k9OWJl>bUgXxho68ip`)=)RT9dHce&T9@w4UPM- zcT$smv$%T1* zB98U=W3Nltllow@`h2N5_2E5PeZJBh9!%bg5^}Y3e62Y?@WkQ$U6U+Gh{HZ${4B-| z&Dp!DTchSTC2$CX^N>GluS;XM9KY54%{#m;4&G|_o#x>kelHBiu-e_x94@Tg4<#4Y z?yfl2uQ@!!xFyZu!o41pT(MWp*WsZ!)-Op4d&Pg7;5i%Lm{mz6 Op*DPn!2c=oZOQ*f1M{c= literal 5256 zcmZ9O`FmYe6^2inp%nxKgciY?wn$O1hytPrv=m5-fdo6?9Bz}7^ytmG@eZ{uC<#ze z5NmM&5k;$Y9udJ2TmCA4@p*jTbM{J)*?Cs>`o1;nz4qGsBtvVruFJAD+4=7o*-+)E&qdkAl|Ibxg;r4t-id5Ojw2_K7m-uQ zY2;PpHRP|z-;lo}L;S2|ev^d5*?HOc#Ps;&$b|?T&KGLmcKCZdrHYxzvz^(BNdM+ zJ4j5g@*T?FCc!Z7Qs${a@6fJJ+3UB;zWgYw$~z7(ibpE!SuJ#C^EUHninV5QPtMKt za-zf6)9oK!q)OKr$}Ur3jPT>x7Nu3}nXUIUTAg*xJ(L&ohx#=?oGs&faH=D$V(mv! zLKIbraKqWN`aIC-hL8O!N{EG)Tg7KIdx3erJw26o59Hl`enj3H`~>1ejD;;pyh zi?YABI9AmXHtWW=t6ePKU3hXcIoawsYu7etw^wYQfp^H^8F-gEgZ|1Udgi#Nct z#oXMWm+#Au^aouklm9n-S)JMnUGZn&dyDzZpxx?*MgOz#3xjsQ2ogNbdKWN{B0G@X zVDF}51Zm=p6+U-Ix9Y^$jc3I0u&etz&iToCwyxnF-hwy+Z$`H-t`YaQUbDWx`Zm`H zpI9T}?0Yj#Y}^jSy%{HWF0STWTfZeF{M@hHlZZ7KtDk%J9c)6(Bi@#I0A1*caLK4X45X#9{J9!vWvAx{V(p&wrBq=Zn_12E z)GtTVHim3q6?-Ihy^Z`{&nzb%k@t|`Vw*#*f*lD+$PrYZp)eL zB4+m>cU!{VcR6$W*J=z|gP2=<3F6qqF1=&sR-KTc*iv2FjMV`yiUB`WF zNH*g=gDaWizG%M+>>lLJC-zRqzVx-n4*lQ7tgSwq;p$zumiyFxO|pBg<`erSjM08= z((OZ>=?#esya#N~z%%IfH0nEs9{CwSXRwTyTDCz*|vcYk8vsGRxr zeG194r8~p!n{C=pR`&W1JdbXSHP|=bpKHr$Q(X7^%-`0N4H9;-?_W-TvF|_dHR!(oCiZWV_zF7k z4`$aFH%H(rS^1wB^s~NyB_}!86Z`#e1or#j2z;hO=kVEtZ{Z7J-M(XoHU0<2?}oA7 z5C7-#Y{g5=%d4>ee`w!Hly7Du;=A%K-A;_}=L$srQLy*_9f>o>cQJ;<-veXx*_`+# ze8gK2x1Y~m-eXZCUk94*UjkG z75S~}7DPVk`VhKt@{#9ObnAPN+U?zk5jjV2A3-~@v2qc6H@d#srl{6l--B3- zdos5^(Q|D(sdoeOy~ygGk0(BQz8frOjCc7y#Gda#qURq=eDr(*Y@B@b{C@Q4x%TMQ z1L)e!e=YMQV$UPLJ)cT^^!!1vaq^Mp_;{5hidPS|A-+rLJwXMD{2f)TQ zd;SpEb(=l^1X$nNR>yu4Y^?o_bw5?<|KIaZ!|7Yw>e$bKjcxY)vtZY4_WW~TeYHi; zr_rs&J(*jd=()D&`NQa|d)|VRkDebymy4dyqTBNsBzm5s%SX@W(2bLip3kF4&$UOd z4xwv{o)_r$Jo4M~&m;2D^Dm$qCm(s*=*^xlfaM%<_9eQpj^*^uJLvjq3%^BlW1Bty zBG}kw&%0oKwMA?X-PmT&`(R_`V%-6{zS<)8FuJk!H@GjM8!H#FN6_`v7Ck?TZY}P~ z-1t#N337u_$j(;PtryE@-swEaaf}@8GDLZd+hP&=&SF^ zFW}_OZ@yn5%|8DsaZD@c`Rl|r&+|8lYo6zC;f&W`d$Z5K1G~09(Wl>|%R7Sm1G-#u otv@ENUTd`4_n+X5*I&E!pJtY~wpW;6M_xm;y_)cU$$TsFKYPx)LjV8( diff --git a/renderer/shaders/skinned.vert b/renderer/shaders/skinned.vert new file mode 100644 index 0000000..d81e5e2 --- /dev/null +++ b/renderer/shaders/skinned.vert @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2023 Joshua Goins +// SPDX-License-Identifier: CC0-1.0 + +#version 450 + +layout(location = 0) in vec3 inPosition; +layout(location = 1) in vec2 inUV0; +layout(location = 2) in vec2 inUV1; +layout(location = 3) in vec3 inNormal; +layout(location = 4) in vec4 inBiTangent; +layout(location = 5) in vec4 inColor; +layout(location = 6) in vec4 inBoneWeights; +layout(location = 7) in uvec4 inBoneIds; + +layout(location = 0) out vec3 outNormal; +layout(location = 1) out vec3 outFragPos; +layout(location = 2) out vec2 outUV; + +layout(binding = 3) uniform sampler2D diffuseTexture; +layout(binding = 4) uniform sampler2D normalTexture; +layout(binding = 5) uniform sampler2D specularTexture; +layout(binding = 6) uniform sampler2D multiTexture; + +layout(std430, push_constant) uniform PushConstant { + mat4 vp, model; + int boneOffset; + int type; +}; + +layout(std430, binding = 2) buffer readonly BoneInformation { + mat4 bones[128]; +}; + +void main() { + mat4 BoneTransform = bones[boneOffset + inBoneIds[0]] * inBoneWeights[0]; + BoneTransform += bones[boneOffset + inBoneIds[1]] * inBoneWeights[1]; + BoneTransform += bones[boneOffset + inBoneIds[2]] * inBoneWeights[2]; + BoneTransform += bones[boneOffset + inBoneIds[3]] * inBoneWeights[3]; + + BoneTransform = model * BoneTransform; + + vec4 bPos = BoneTransform * vec4(inPosition, 1.0); + vec4 bNor = BoneTransform * vec4(inNormal, 0.0); + + gl_Position = vp * bPos; + outNormal = bNor.xyz; + outFragPos = vec3(model * vec4(inPosition, 1.0)); + outUV = inUV0; +} diff --git a/renderer/shaders/skinned.vert.spv b/renderer/shaders/skinned.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..3f02e37564408625281797c213622a9e293f99ab GIT binary patch literal 5256 zcmZ9O`FmYe6^2inp%nxKgciY?wn$O1hytPrv=m5-fdo6?9Bz}7^ytmG@eZ{uC<#ze z5NmM&5k;$Y9udJ2TmCA4@p*jTbM{J)*?Cs>`o1;nz4qGsBtvVruFJAD+4=7o*-+)E&qdkAl|Ibxg;r4t-id5Ojw2_K7m-uQ zY2;PpHRP|z-;lo}L;S2|ev^d5*?HOc#Ps;&$b|?T&KGLmcKCZdrHYxzvz^(BNdM+ zJ4j5g@*T?FCc!Z7Qs${a@6fJJ+3UB;zWgYw$~z7(ibpE!SuJ#C^EUHninV5QPtMKt za-zf6)9oK!q)OKr$}Ur3jPT>x7Nu3}nXUIUTAg*xJ(L&ohx#=?oGs&faH=D$V(mv! zLKIbraKqWN`aIC-hL8O!N{EG)Tg7KIdx3erJw26o59Hl`enj3H`~>1ejD;;pyh zi?YABI9AmXHtWW=t6ePKU3hXcIoawsYu7etw^wYQfp^H^8F-gEgZ|1Udgi#Nct z#oXMWm+#Au^aouklm9n-S)JMnUGZn&dyDzZpxx?*MgOz#3xjsQ2ogNbdKWN{B0G@X zVDF}51Zm=p6+U-Ix9Y^$jc3I0u&etz&iToCwyxnF-hwy+Z$`H-t`YaQUbDWx`Zm`H zpI9T}?0Yj#Y}^jSy%{HWF0STWTfZeF{M@hHlZZ7KtDk%J9c)6(Bi@#I0A1*caLK4X45X#9{J9!vWvAx{V(p&wrBq=Zn_12E z)GtTVHim3q6?-Ihy^Z`{&nzb%k@t|`Vw*#*f*lD+$PrYZp)eL zB4+m>cU!{VcR6$W*J=z|gP2=<3F6qqF1=&sR-KTc*iv2FjMV`yiUB`WF zNH*g=gDaWizG%M+>>lLJC-zRqzVx-n4*lQ7tgSwq;p$zumiyFxO|pBg<`erSjM08= z((OZ>=?#esya#N~z%%IfH0nEs9{CwSXRwTyTDCz*|vcYk8vsGRxr zeG194r8~p!n{C=pR`&W1JdbXSHP|=bpKHr$Q(X7^%-`0N4H9;-?_W-TvF|_dHR!(oCiZWV_zF7k z4`$aFH%H(rS^1wB^s~NyB_}!86Z`#e1or#j2z;hO=kVEtZ{Z7J-M(XoHU0<2?}oA7 z5C7-#Y{g5=%d4>ee`w!Hly7Du;=A%K-A;_}=L$srQLy*_9f>o>cQJ;<-veXx*_`+# ze8gK2x1Y~m-eXZCUk94*UjkG z75S~}7DPVk`VhKt@{#9ObnAPN+U?zk5jjV2A3-~@v2qc6H@d#srl{6l--B3- zdos5^(Q|D(sdoeOy~ygGk0(BQz8frOjCc7y#Gda#qURq=eDr(*Y@B@b{C@Q4x%TMQ z1L)e!e=YMQV$UPLJ)cT^^!!1vaq^Mp_;{5hidPS|A-+rLJwXMD{2f)TQ zd;SpEb(=l^1X$nNR>yu4Y^?o_bw5?<|KIaZ!|7Yw>e$bKjcxY)vtZY4_WW~TeYHi; zr_rs&J(*jd=()D&`NQa|d)|VRkDebymy4dyqTBNsBzm5s%SX@W(2bLip3kF4&$UOd z4xwv{o)_r$Jo4M~&m;2D^Dm$qCm(s*=*^xlfaM%<_9eQpj^*^uJLvjq3%^BlW1Bty zBG}kw&%0oKwMA?X-PmT&`(R_`V%-6{zS<)8FuJk!H@GjM8!H#FN6_`v7Ck?TZY}P~ z-1t#N337u_$j(;PtryE@-swEaaf}@8GDLZd+hP&=&SF^ zFW}_OZ@yn5%|8DsaZD@c`Rl|r&+|8lYo6zC;f&W`d$Z5K1G~09(Wl>|%R7Sm1G-#u otv@ENUTd`4_n+X5*I&E!pJtY~wpW;6M_xm;y_)cU$$TsFKYPx)LjV8( literal 0 HcmV?d00001 diff --git a/renderer/src/renderer.cpp b/renderer/src/renderer.cpp index 5337895..f603e48 100644 --- a/renderer/src/renderer.cpp +++ b/renderer/src/renderer.cpp @@ -472,9 +472,13 @@ void Renderer::render(const std::vector &models) vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); - vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); - for (auto model : models) { + if (model.skinned) { + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedPipeline); + } else { + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + } + // copy bone data { const size_t bufferSize = sizeof(glm::mat4) * 128; @@ -731,6 +735,12 @@ void Renderer::initPipeline() vertexShaderStageInfo.module = loadShaderFromDisk(":/shaders/mesh.vert.spv"); vertexShaderStageInfo.pName = "main"; + VkPipelineShaderStageCreateInfo skinnedVertexShaderStageInfo = {}; + skinnedVertexShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + skinnedVertexShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; + skinnedVertexShaderStageInfo.module = loadShaderFromDisk(":/shaders/skinned.vert.spv"); + skinnedVertexShaderStageInfo.pName = "main"; + VkPipelineShaderStageCreateInfo fragmentShaderStageInfo = {}; fragmentShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; fragmentShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; @@ -867,6 +877,10 @@ void Renderer::initPipeline() createInfo.renderPass = renderPass; vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &createInfo, nullptr, &pipeline); + + shaderStages[0] = skinnedVertexShaderStageInfo; + + vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &createInfo, nullptr, &skinnedPipeline); } VkShaderModule Renderer::createShaderModule(const uint32_t *code, const int length) diff --git a/sagasu/src/mainwindow.cpp b/sagasu/src/mainwindow.cpp index 613d48b..e3e4852 100644 --- a/sagasu/src/mainwindow.cpp +++ b/sagasu/src/mainwindow.cpp @@ -89,7 +89,7 @@ void MainWindow::refreshParts(const QString &path) partHolder->addTab(exdWidget, QStringLiteral("Note")); } else if (info.completeSuffix() == QStringLiteral("mdl")) { auto mdlWidget = new MDLPart(data, fileCache); - mdlWidget->addModel(physis_mdl_parse(file), glm::vec3(), QStringLiteral("mdl"), {}, 0); + mdlWidget->addModel(physis_mdl_parse(file), false, glm::vec3(), QStringLiteral("mdl"), {}, 0); partHolder->addTab(mdlWidget, QStringLiteral("Model")); } else if (info.completeSuffix() == QStringLiteral("tex") || info.completeSuffix() == QStringLiteral("atex")) { auto texWidget = new TexPart(data);