diff --git a/Cargo.lock b/Cargo.lock index 1ff9632..7a09e3c 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -1091,6 +1091,12 @@ dependencies = [ "hashbrown 0.14.0", ] +[[package]] +name = "infer" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" + [[package]] name = "inflections" version = "1.1.1" @@ -1302,6 +1308,8 @@ dependencies = [ "glam", "gltf", "image", + "infer", + "mime", "percent-encoding", "thiserror", "tracing", @@ -1373,6 +1381,12 @@ dependencies = [ "objc", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" diff --git a/examples/testbed/Cargo.lock b/examples/testbed/Cargo.lock index 16d56f0..3893931 100644 --- a/examples/testbed/Cargo.lock +++ b/examples/testbed/Cargo.lock @@ -1124,6 +1124,12 @@ dependencies = [ "hashbrown 0.14.1", ] +[[package]] +name = "infer" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" + [[package]] name = "inflections" version = "1.1.1" @@ -1341,6 +1347,8 @@ dependencies = [ "glam", "gltf", "image", + "infer", + "mime", "percent-encoding", "thiserror", "tracing", @@ -1412,6 +1420,12 @@ dependencies = [ "objc", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" diff --git a/examples/testbed/assets/cube-texture-embedded.gltf b/examples/testbed/assets/cube-texture-embedded.gltf new file mode 100644 index 0000000..5309758 --- /dev/null +++ b/examples/testbed/assets/cube-texture-embedded.gltf @@ -0,0 +1,142 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v3.6.6", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "TEXCOORD_0":1, + "NORMAL":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "bufferView":4, + "mimeType":"image/png", + "name":"uvgrid" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":480, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + }, + { + "buffer":0, + "byteLength":40222, + "byteOffset":840 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":41064, + "uri":"data:application/octet-stream;base64,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xn/zf/P/8f/oF5M6zvfN/9fN//0EID5ZXhMgQIAAAQIECBAgQIAAgW8qYAHgmzas2yJAgAABAgQIECBAgAABAlFg9QJA3A4cK856nb39v7+v7O0/ffzs7X99/Oztv338uB2o/yyjHLcDZsTrY8TtwP1nGWX5P/43f7faUf5Pt3iGfyb/x//Nn1uNaPwf/zd/bvkb/3N//tO3hfG/+PlP+JtffZvHsvF/ihzpr7/6+L96ASBdXEACBAgQIECAAAECBAgQIEBgtoAFgNlkTiBAgAABAgQIECBAgAABAl9PwALA12szV0yAAAECBAgQIECAAAECBGYLWACYTeYEAgQIECBAgAABAgQIECDw9QQsAHy9NnPFBAgQIECAAAECBAgQIEBgtoAFgNlkTiBAgAABAgQIECBAgAABAl9PwALA12szV0yAAAECBAgQIECAAAECBGYLWACYTeYEAgQIECBAgAABAgQIECDw9QQsAHy9NnPFBAgQIECAAAECBAgQIEBgtoAFgNlkTiBAgAABAgQIECBAgAABAl9PwALA12szV0yAAAECBAgQIECAAAECBGYLWACYTeYEAgQIECBAgAABAgQIECDw9QR+PT4+ll71y8tLaXz3r/0rH0DPv/yvfP70f/q/yudP/6f/q3z+9H/6v8rnT/+n/6t8/uwAqNQXmwABAgQIECBAgAABAgQIJAlYAEiCFoYAAQIECBAgQIAAAQIECFQKWACo1BebAAECBAgQIECAAAECBAgkCVgASIIWhgABAgQIECBAgAABAgQIVApYAKjUF5sAAQIECBAgQIAAAQIECCQJWABIghaGAAECBAgQIECAAAECBAhUClgAqNQXmwABAgQIECBAgAABAgQIJAlYAEiCFoYAAQIECBAgQIAAAQIECFQKWACo1BebAAECBAgQIECAAAECBAgkCVgASIIWhgABAgQIECBAgAABAgQIVApYAKjUF5sAAQIECBAgQIAAAQIECCQJrF4AeJ32SZd6Pcz57nj9g6R3p33x/R/vku70epjX/XT9g6R3j0/npEjXw+yn6foHSe8ez09Jka6Hkf/y//qTkfOu/Jf/OU/a9SjG/+k6TNK78l/+Jz1qV8PI/+mqS9abPz7/V37/Wb0AkNXQ4hAgQIAAAQIECBAgQIAAAQLLBSwALLdzJgECBAgQIECAAAECBAgQ+DICv5Zc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xn/j//gv/TH/4nhv/Df/N/+fYnoMfx37u4rvP7G9K77/xe+7a7//+gnA8MdVAAIECBAgQIAAAQIECBAgUC9gAaC+DVwBAQIECBAgQIAAAQIECBAYLrB6ASBuBx5+tVcCxO0QVz4e/lbcDjI82JUAcTvMlY+Hv5W9/be/oezt/338uB2w/yyjHLcDZ8TrY8j/qSdJLcv/3O2/fePK/9yfP/T+xv/xf/OnN49l43/x85/wN39ie/evjf9TT5Ja/vHjf8LfPLvVoNXf/9aOf6sXAG7h+IwAAQIECBAgQIAAAQIECBDYhoAFgG20g6sgQIAAAQIECBAgQIAAAQJDBSwADOVVOQECBAgQIECAAAECBAgQ2IaABYBttIOrIECAAAECBAgQIECAAAECQwUsAAzlVTkBAgQIECBAgAABAgQIENiGgAWAbbSDqyBAgAABAgQIECBAgAABAkMFLAAM5VU5AQIECBAgQIAAAQIECBDYhoAFgG20g6sgQIAAAQIECBAgQIAAAQJDBSwADOVVOQECBAgQIECAAAECBAgQ2IaABYBttIOrIECAAAECBAgQIECAAAECQwUsAAzlVTkBAgQIECBAgAABAgQIENiGgAWAbbSDqyBAgAABAgQIECBAgAABAkMF/np4ePh7aIR3Kn98fHzniLEfv7y8jA3wTu3uX/u/84gM/djzL/+HPmDvVK7/0/+984gM/Vj/p/8b+oC9U7n+T//3ziMy9GP938/u/+wAGJpeKidAgAABAgQIECBAgAABAtsQsACwjXZwFQQIECBAgAABAgQIECBAYKiABYChvConQIAAAQIECBAgQIAAAQLbELAAsI12cBUECBAgQIAAAQIECBAgQGCogAWAobwqJ0CAAAECBAgQIECAAAEC2xCwALCNdnAVBAgQIECAAAECBAgQIEBgqIAFgKG8KidAgAABAgQIECBAgAABAtsQsACwjXZwFQQIECBAgAABAgQIECBAYKiABYChvConQIAAAQIECBAgQIAAAQLbELAAsI12cBUECBAgQIAAAQIECBAgQGCogAWAobwqJ0CAAAECBAgQIECAAAEC2xBYvQBwPt6V3snrfiqNf3w6l8bfT8X3f34qvf/XaV8a/3x3LI0/7YvvX/6Xtr/8L37+5X/p82/8n0r9j8b/Un/jf/Hz/9Pn/8X3X93/V3//XZv/qxcASns/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AAECBAjkClgAyPUWjQABAgQIECBAgAABAgQIlAhYAChhF5QAAQIECBAgQIAAAQIECOQKWADI9RaNAAECBAgQIECAAAECBAiUCFgAKGEXlAABAgQIECBAgAABAgQI5ApYAMj1Fo0AAQIECBAgQIAAAQIECJQIWAAoYReUAAECBAgQIECAAAECBAjkClgAyPUWjQABAgQIECBAgAABAgQIlAhYAChhF5QAAQIECBAgQIAAAQIECOQKWADI9RaNAAECBAgQIECAAAECBAiUCPz18PDwd0nk/wV9fHysDP+fl5eX0vjuX/tXPoCef/lf+fzp//R/lc+f/k//V/n86f/0f5XPn/7vZ/d/dgBUZp/YBAgQIECAAAECBAgQIEAgScACQBK0MAQIECBAgAABAgQIECBAoFLAAkClvtgECBAgQIAAAQIECBAgQCBJwAJAErQwBAgQIECAAAECBAgQIECgUsACQKW+2AQIECBAgAABAgQIECBAIEnAAkAStDAECBAgQIAAAQIECBAgQKBSwAJApb7YBAgQIECAAAECBAgQIEAgScACQBK0MAQIECBAgAABAgQIECBAoFLAAkClvtgECBAgQIAAAQIECBAgQCBJwAJAErQwBAgQIECAAAECBAgQIECgUsACQKW+2AQIECBAgAABAgQIECBAIElg9QLA8emcdKnXw+yn6foHSe8ez09Jka6HeZ321z9Ievd8d0yKdD3MtC++/+Pd9QtLevd1PyVFuh5G/sv/609Gzrvyf8qB/kMU+S////BopLwt/6cU5z8F+fH5X/z9p3r+dy6e/5bnf/H3n7Xf/1YvAPypY/A+AQIECBAgQIAAAQIECBAgsB0BCwDbaQtXQoAAAQIECBAgQIAAAQIEhgn8WlJzv+0nlg/PuyVVzjqn3/Yfy6eEnwT02/5j+bB7nnUvSw7ut33E8v10WlLlrHP6bf+xvHs7zKprycH9tp9Ynk4J999te4rboHaHtyW3NOucfttXLN+fpll1LTk45ns7P5blv/xf8kzNOSfmezsvluX/NIdy0bEx31sFsSz/5f+ih2rGSTHf22mxLP+nGZLLDo353mqI5R+R/922/+z7j/O95h/LGfO/ON9t8WM5Y/4b873Fj+WU/O+2/Wd//4nf99r9x/Lc73+LFgBikreHP5bbBY3+L37Jb1/+Y3l07FZ//JLfvvzHckb8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fN+2dWcECBAgQIAAAQIECBAgQOAisHoBIG4Hu9Sa+CJ7+39/a3E7UP9ZRjluh8qI18eI28H6zzLK2dv/+3uK24H6zzLKcTtkRrw+hvyfepLUsvyf95u3z24c+V/8/IftsJ/dth+pr3z8L77/6v6/evwrz//wc4CPPK+ffUz1/K96/JP/02c/UrPqk//r5j+rFwBmtZaDCRAgQIAAAQIECBAgQIAAgRIBCwAl7IISIECAAAECBAgQIECAAIFcAQsAud6iESBAgAABAgQIECBAgACBEgELACXsghIgQIAAAQIECBAgQIAAgVwBCwC53qIRIECAAAECBAgQIECAAIESAQsAJeyCEiBAgAABAgQIECBAgACBXAELALneohEgQIAAAQIECBAgQIAAgRIBCwAl7IISIECAAAECBAgQIECAAIFcAQsAud6iESBAgAABAgQIECBAgACBEgELACXsghIgQIAAAQIECBAgQIAAgVwBCwC53qIRIECAAAECBAgQIECAAIESAQsAJeyCEiBAgAABAgQIECBAgACBXIG/Hh4e/s4N+e9oj4+P/34jufTy8pIc8d/h3L/2//cTkVvy/Mv/3Cfu39H0f/q/fz8RuSX9n/4v94n7dzT9n/7v309Ebkn/97P7PzsAcvNNNAIECBAgQIAAAQIECBAgUCJgAaCEXVACBAgQIECAAAECBAgQIJArYAEg11s0AgQIECBAgAABAgQIECBQImABoIRdUAIECBAgQIAAAQIECBAgkCtgASDXWzQCBAgQIECAAAECBAgQIFAiYAGghF1QAgQIECBAgAABAgQIECCQK2ABINdbNAIECBAgQIAAAQIECBAgUCJgAaCEXVACBAgQIECAAAECBAgQIJArYAEg11s0AgQIECBAgAABAgQIECBQImABoIRdUAIECBAgQIAAAQIECBAgkCtgASDXWzQCBAgQIECAAAECBAgQIFAisHoB4Ph0Lrnwf4Lup+mflyX/P56fSuL+E/R12v/zsuT/57tjSdx/gk774vs/3v1zKSX/f91PJXH/CSr/5f8/z0LF/+X/VMF+ifnj8794/lPd/5+Lx7/y/C+e/1TP/6rnv+Xzf/l/GQsqXsj/dd9/Vi8AVDS6mAQIECBAgAABAgQIECBAgMA8AQsA87wcTYAAAQIECBAgQIAAAQIEvqTAryVX3W/7i+XD825JlbPO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+R/x//uG+G//3zz7yN/+P3b+j37+uXf/vzsB8NHk9B4BAgQIECBAgAABAgQIECAwh4AEwBzjoBcECBAgQIAAAQIECBAgQKCpgARAU16VEyBAgAABAgQIECBAgACBOQQkAOYYB70gQIAAAQIECBAgQIAAAQJNBSQAmvKqnAABAgQIECBAgAABAgQIzCEgATDHOOgFAQIECBAgQIAAAQIECBBoKiAB0JRX5QQIECBAgAABAgQIECBAYA4BCYA5xkEvCBAgQIAAAQIECBAgQIBAUwEJgKa8KidAgAABAgQIECBAgAABAnMISADMMQ56QYAAAQIECBAgQIAAAQIEmgpIADTlVTkBAgQIECBAgAABAgQIEJhDQAJgjnHQCwIECBAgQIAAAQIECBAg0FTg29PTU9MGPqv85eXls480fd/1G/+mE+yTys1/8f/JFGn6tvXP+td0gn1SufXP+vfJFGn6tvXP+td0gn1SufXP+vfJFGn6thMATXlVToAAAQIECBAgQIAAAQIE5hCQAJhjHPSCAAECBAgQIECAAAECBAg0FZAAaMqrcgIECBAgQIAAAQIECBAgMIeABMAc46AXBAgQIECAAAECBAgQIECgqYAEQFNelRMgQIAAAQIECBAgQIAAgTkEJADmGAe9IECAAAECBAgQIECAAAECTQUkAJryqpwAAQIECBAgQIAAAQIECMwhIAEwxzjoBQECBAgQIECAAAECBAgQaCogAdCUV+UECBAgQIAAAQIECBAgQGAOAQmAOcZBLwgQIECAAAECBAgQIECAQFMBCYCmvConQIAAAQIECBAgQIAAAQJzCNydADguy9ArOV+fh7b/uhyHtn99OA9tfzkOvv7zw9Drfz0uQ9s/P1+Htj88/gdf/+jxvw6e/8Pjf/D6N3r9H73/if+x67/4H3v/I/7Hzv/R9z/2/8H3//b/u+7/704A3NW6LxMgQIAAAQIECBAgQIAAAQJdBCQAujBrhAABAgQIECBAgAABAgQIjBX4tqX5+thfli8dfhJQH3vM8unwY8slrfpOfewry4/LZVVdWz5cH/vP8uHttKXKVd+pj/1mebl0uP7q2HMegzyc3lZdy5YP18e+svx4WbZUueo79bG3LJ9+HFbVteXDGe/l+1nuEv/Vsf/e15/jXa4/yz3GP+d7aT/LPeZ/xntpP8td4r869td7/cv1vlx/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XO9HrP+5yZebgSz3iL+Md/Hff/0X/+8P+eJf/Of9QI/1z/7//pBr/+///Jf7vf3/vucfPwHosWJqgwABAgQIECBAgAABAgQIDBaQABg8AJonQIAAAQIECBAgQIAAAQI9BO5OAORx0B4drtvoffy/bj+PA9fv9Sjnccge7dVt5HGw+r0e5d7H3+pryuPA9Xs9yqOvf/T4j57/w+M/fg7QY77VbYxe//M4YN23HmXxv/Rg/sc2xP/7zwH+EanhG+J/aaj7edX2//a/+f9oFOz/7z+H+Mip1Xv2/3W/+a/H4e4EQF2hMgECBAgQIECAAAECBAgQIDCfgATAfGOiRwQIECBAgAABAgQIECBAYHcBCYDdSVVIgAABAgQIECBAgAABAgTmE5AAmG9M9IgAAQIECBAgQIAAAQIECOwuIAGwO6kKCRAgQIAAAQIECBAgQIDAfAISAPONiR4RIECAAAECBAgQIECAAIHdBSQAdidVIQECBAgQIECAAAECBAgQmE9AAmC+MdEjAgQIECBAgAABAgQIECCwu4AEwO6kKiRAgAABAgQIECBAgAABAvMJSADMNyZ6RIAAAQIECBAgQIAAAQIEdheQANidVIUECBAgQIAAAQIECBAgQGA+AQmA+cZEjwgQIECAAAECBAgQICBcDOoAABxJSURBVECAwO4C//7+/ft/dq91RYVPT08rPr3/R19eXvavdEWNrt/4r5guu3/U/Bf/u0+qFRVa/6x/K6bL7h+1/ln/dp9UKyq0/ln/VkyX3T9q/fuz1z8nAHYPKRUSIECAAAECBAgQIECAAIH5BCQA5hsTPSJAgAABAgQIECBAgAABArsLSADsTqpCAgQIECBAgAABAgQIECAwn4AEwHxjokcECBAgQIAAAQIECBAgQGB3AQmA3UlVSIAAAQIECBAgQIAAAQIE5hOQAJhvTPSIAAECBAgQIECAAAECBAjsLiABsDupCgkQIECAAAECBAgQIECAwHwCEgDzjYkeESBAgAABAgQIECBAgACB3QUkAHYnVSEBAgQIECBAgAABAgQIEJhPQAJgvjHRIwIECBAgQIAAAQIECBAgsLuABMDupCokQIAAAQIECBAgQIAAAQLzCdydALg+nIde1XI8Dm3/en4Y2v7rcRna/vn5OrT94/JnX//o8R89/4fH/+D173UZu/6dr8/if6CA+B87/0ff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/+vufzclAPImpyx+WW49+KX+HOQy+Fnu0X4+5JaH3yz3aD83+bL5Z7lH+3m9I64/x3vE+Od8HzH/8yG/PPxnucf45yZfHv6z3KP9fMgvD/9Z7tF+PuSXh/8s92g/413891//xf/7Q774F/95P9Bj/bP/v9/k2//t/3k/0CP+Mt7d//d//s37/Xvj308AekSMNggQIECAAAECBAgQIECAwGABCYDBA6B5AgQIECBAgAABAgQIECDQQ+DuBEAeh+zR4bqNPA5Wv9ejnMdherRXt9H7+E/d/ujrHz3+o+d/Hgeqx6ZHuffx//qaeh//r9vvffy/bl/8LzVJ17L4f/85QFf4vxoT/8sI9lub9v/2/82rG/ZPXtj/338O8ROe5v9k/2//3zz7aBDd/983/+9OAHw0ON4jQIAAAQIECBAgQIAAAQIE5hCQAJhjHPSCAAECBAgQIECAAAECBAg0FZAAaMqrcgIECBAgQIAAAQIECBAgMIeABMAc46AXBAgQIECAAAECBAgQIECgqYAEQFNelRMgQIAAAQIECBAgQIAAgTkEJADmGAe9IECAAAECBAgQIECAAAECTQUkAJryqpwAAQIECBAgQIAAAQIECMwhIAEwxzjoBQECBAgQIECAAAECBAgQaCogAdCUV+UECBAgQIAAAQIECBAgQGAOAQmAOcZBLwgQIECAAAECBAgQIECAQFMBCYCmvConQIAAAQIECBAgQIAAAQJzCEgAzDEOekGAAAECBAgQIECAAAECBJoKfHt6emrawGeVv7y8fPaRpu+7fuPfdIJ9Urn5L/4/mSJN37b+Wf+aTrBPKrf+Wf8+mSJN37b+Wf+aTrBPKrf+Wf8+mSJN33YCoCmvygkQIECAAAECBAgQIECAwBwCEgBzjINeECBAgAABAgQIECBAgACBpgISAE15VU6AAAECBAgQIECAAAECBOYQkACYYxz0ggABAgQIECBAgAABAgQINBWQAGjKq3ICBAgQIECAAAECBAgQIDCHgATAHOOgFwQIECBAgAABAgQIECBAoKmABEBTXpUTIECAAAECBAgQIECAAIE5BCQA5hgHvSBAgAABAgQIECBAgAABAk0FJACa8qqcAAECBAgQIECAAAECBAjMISABMMc46AUBAgQIECBAgAABAgQIEGgqIAHQlFflBAgQIECAAAECBAgQIEBgDoG7EwCv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" + } + ] +} diff --git a/examples/testbed/src/main.rs b/examples/testbed/src/main.rs index f845d71..16ef3ac 100644 --- a/examples/testbed/src/main.rs +++ b/examples/testbed/src/main.rs @@ -75,7 +75,8 @@ async fn main() { let mut resman = world.get_resource_mut::().unwrap(); let diffuse_texture = resman.request::("assets/happy-tree.png").unwrap(); - let cube_model = resman.request::("assets/cube-embedded.gltf").unwrap(); + //let cube_model = resman.request::("assets/cube-embedded.gltf").unwrap(); + let cube_model = resman.request::("assets/cube-texture-embedded.gltf").unwrap(); drop(resman); /* world.spawn((MeshComponent::new( @@ -132,18 +133,18 @@ async fn main() { }; let jiggle_system = |world: &mut World| -> anyhow::Result<()> { - let keys = world.get_resource(); + let keys = world.get_resource::>(); if keys.is_none() { return Ok(()); } + let keys = keys.unwrap(); - let keys: Ref> = keys.unwrap(); - - let speed = 0.001; + let speed = 0.01; let rot_speed = 1.0; let mut dir_x = 0.0; let mut dir_y = 0.0; + let mut dir_z = 0.0; let mut rot_x = 0.0; let mut rot_y = 0.0; @@ -164,6 +165,14 @@ async fn main() { dir_y -= speed; } + if keys.is_pressed(KeyCode::E) { + dir_z += speed; + } + + if keys.is_pressed(KeyCode::Q) { + dir_z -= speed; + } + if keys.is_pressed(KeyCode::Left) { rot_y -= rot_speed; } @@ -182,7 +191,7 @@ async fn main() { drop(keys); - if dir_x == 0.0 && dir_y == 0.0 && rot_x == 0.0 && rot_y == 0.0 { + if dir_x == 0.0 && dir_y == 0.0 && dir_z == 0.0 && rot_x == 0.0 && rot_y == 0.0 { return Ok(()); } @@ -197,6 +206,7 @@ async fn main() { t.translation.x *= -1.0; */ t.translation.x += dir_x; t.translation.y += dir_y; + t.translation.z += dir_z; t.rotate_x(math::Angle::Degrees(rot_x)); t.rotate_y(math::Angle::Degrees(rot_y)); } diff --git a/lyra-resource/Cargo.toml b/lyra-resource/Cargo.toml index 1dda54f..ae214bf 100644 --- a/lyra-resource/Cargo.toml +++ b/lyra-resource/Cargo.toml @@ -12,6 +12,9 @@ edict = "0.5.0" glam = "0.24.1" gltf = { version = "1.3.0", features = ["KHR_materials_pbrSpecularGlossiness"] } image = "0.24.7" +# not using custom matcher, or file type from file path +infer = { version = "0.15.0", default-features = false } +mime = "0.3.17" percent-encoding = "2.3.0" thiserror = "1.0.48" tracing = "0.1.37" diff --git a/lyra-resource/src/lib.rs b/lyra-resource/src/lib.rs index ccdbdc1..f78b8ab 100644 --- a/lyra-resource/src/lib.rs +++ b/lyra-resource/src/lib.rs @@ -14,4 +14,6 @@ pub mod model; pub use model::*; pub mod material; -pub use material::*; \ No newline at end of file +pub use material::*; + +pub(crate) mod util; \ No newline at end of file diff --git a/lyra-resource/src/loader/texture.rs b/lyra-resource/src/loader/image.rs similarity index 53% rename from lyra-resource/src/loader/texture.rs rename to lyra-resource/src/loader/image.rs index 66e5c17..8a1940b 100644 --- a/lyra-resource/src/loader/texture.rs +++ b/lyra-resource/src/loader/image.rs @@ -2,7 +2,7 @@ use std::{fs::File, sync::Arc, io::Read}; use image::ImageError; -use crate::{resource_manager::ResourceStorage, texture::Texture, resource::Resource}; +use crate::{resource_manager::ResourceStorage, texture::Texture, resource::Resource, ResourceManager}; use super::{LoaderError, ResourceLoader}; @@ -14,9 +14,9 @@ impl From for LoaderError { /// A struct that implements the `ResourceLoader` trait used for loading textures. #[derive(Default)] -pub struct TextureLoader; +pub struct ImageLoader; -impl ResourceLoader for TextureLoader { +impl ResourceLoader for ImageLoader { fn extensions(&self) -> &[&str] { &[ // the extensions of these are the names of the formats @@ -26,11 +26,23 @@ impl ResourceLoader for TextureLoader { "ff", // pnm - "pnm", "pbm", "pgm", "ppm", "pam", + "pnm", "pbm", "pgm", "ppm", ] } - fn load(&self, path: &str) -> Result, LoaderError> { + fn mime_types(&self) -> &[&str] { + &[ + "image/bmp", "image/vnd.ms-dds", "image/gif", "image/x-icon", "image/jpeg", + "image/png", "image/qoi", "image/tga", "image/tiff", "image/webp", + + // no known mime for farbfeld + + // pnm, pbm, pgm, ppm + "image/x-portable-anymap", "image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-pixmap", + ] + } + + fn load(&self, _resource_manager: &mut ResourceManager, path: &str) -> Result, LoaderError> { // check if the file is supported by this loader if !self.does_support_file(path) { return Err(LoaderError::UnsupportedExtension(path.to_string())); @@ -54,6 +66,20 @@ impl ResourceLoader for TextureLoader { Ok(Arc::new(res)) } + + fn load_bytes(&self, _resource_manager: &mut ResourceManager, bytes: Vec, offset: usize, length: usize) -> Result, LoaderError> { + let image = image::load_from_memory(&bytes[offset..(length-offset)]) + .map_err(|e| match e { + ImageError::IoError(e) => LoaderError::IoError(e), + _ => LoaderError::DecodingError(e.into()), + })?; + let texture = Texture { + image, + }; + let res = Resource::with_data(&uuid::Uuid::new_v4().to_string(), texture); + + Ok(Arc::new(res)) + } } #[cfg(test)] @@ -68,20 +94,22 @@ mod tests { #[test] fn check_unsupport() { - let loader = TextureLoader::default(); + let loader = ImageLoader::default(); assert_eq!(loader.does_support_file("test.gltf"), false); } /// Tests loading an image #[test] fn image_load() { - let loader = TextureLoader::default(); - loader.load(&get_image("squiggles.png")).unwrap(); + let mut manager = ResourceManager::new(); + let loader = ImageLoader::default(); + loader.load(&mut manager, &get_image("squiggles.png")).unwrap(); } #[test] fn image_load_unsupported() { - let loader = TextureLoader::default(); - assert!(loader.load(&get_image("squiggles.gltf")).is_err()); + let mut manager = ResourceManager::new(); + let loader = ImageLoader::default(); + assert!(loader.load(&mut manager, &get_image("squiggles.gltf")).is_err()); } } \ No newline at end of file diff --git a/lyra-resource/src/loader/mod.rs b/lyra-resource/src/loader/mod.rs index 1b26c7b..06d13df 100644 --- a/lyra-resource/src/loader/mod.rs +++ b/lyra-resource/src/loader/mod.rs @@ -1,11 +1,11 @@ -pub mod texture; +pub mod image; pub mod model; use std::{io, sync::Arc, path::Path, ffi::OsStr}; use thiserror::Error; -use crate::resource_manager::ResourceStorage; +use crate::{resource_manager::ResourceStorage, ResourceManager}; #[derive(Error, Debug)] pub enum LoaderError { @@ -30,8 +30,12 @@ impl From for LoaderError { } pub trait ResourceLoader: Send + Sync { + /// Returns the extensions that this loader supports. fn extensions(&self) -> &[&str]; + /// Returns the mime types that this loader supports. + fn mime_types(&self) -> &[&str]; + /// Returns true if this loader supports the file. fn does_support_file(&self, path: &str) -> bool { match Path::new(path).extension().and_then(OsStr::to_str) { Some(ext) => { @@ -41,18 +45,26 @@ pub trait ResourceLoader: Send + Sync { } } - fn load(&self, path: &str) -> Result, LoaderError>; + /// Returns true if this loader supports the mime type. + fn does_support_mime(&self, mime: &str) -> bool { + self.mime_types().contains(&mime) + } + + /// Load a resource from a path. + fn load(&self, resource_manager: &mut ResourceManager, path: &str) -> Result, LoaderError>; + /// Load a resource from bytes. + fn load_bytes(&self, resource_manager: &mut ResourceManager, bytes: Vec, offset: usize, length: usize) -> Result, LoaderError>; } #[cfg(test)] mod tests { - use super::{*, texture::TextureLoader}; + use super::{*, image::ImageLoader}; /// Ensure that `does_support_file` works #[test] fn check_support() { - let loader = TextureLoader::default(); + let loader = ImageLoader::default(); let extensions = loader.extensions(); let fake_paths: Vec = extensions.iter().map(|e| format!("a.{}", e)).collect(); for path in fake_paths.iter() { diff --git a/lyra-resource/src/loader/model.rs b/lyra-resource/src/loader/model.rs index a1cb9e0..e2d2b6d 100644 --- a/lyra-resource/src/loader/model.rs +++ b/lyra-resource/src/loader/model.rs @@ -1,8 +1,9 @@ -use std::sync::Arc; +use std::{sync::Arc, path::{Path, PathBuf}}; use base64::Engine; +use thiserror::Error; -use crate::{ResourceLoader, LoaderError, Mesh, Model, MeshVertexAttribute, VertexAttributeData, Resource, Material, MeshIndices}; +use crate::{ResourceLoader, LoaderError, Mesh, Model, MeshVertexAttribute, VertexAttributeData, Resource, Material, MeshIndices, ResourceManager, util}; use tracing::debug; @@ -12,11 +13,25 @@ impl From for LoaderError { } } +#[derive(Error, Debug)] +enum ModelLoaderError { + #[error("The model ({0}) is missing the BIN section in the gltf file")] + MissingBin(String), + #[error("There was an error with decoding a uri defined in the model: '{0}'")] + UriDecodingError(util::UriReadError), +} + +impl From for LoaderError { + fn from(value: ModelLoaderError) -> Self { + LoaderError::DecodingError(value.into()) + } +} + #[derive(Default)] pub struct ModelLoader; impl ModelLoader { - fn parse_uri(uri: &str) -> Option> { + /* fn parse_uri(containing_path: &str, uri: &str) -> Option> { let uri = uri.strip_prefix("data")?; let (mime, data) = uri.split_once(",")?; @@ -26,11 +41,13 @@ impl ModelLoader { }; if is_base64 { - base64::engine::general_purpose::STANDARD.decode(data).ok() + Some(base64::engine::general_purpose::STANDARD.decode(data).unwrap()) } else { - Some(data.as_bytes().to_vec()) + let full_path = format!("{containing_path}/{data}"); + let buf = std::fs::read(&full_path).unwrap(); + Some(buf) } - } + } */ fn process_node(&self, buffers: &Vec>, materials: &Vec, node: gltf::Node<'_>) -> Vec { let mut meshes = vec![]; @@ -61,7 +78,7 @@ impl ModelLoader { // read tex coords if let Some(tex_coords) = reader.read_tex_coords(0) { - let tex_coords: Vec = tex_coords.into_f32().map(|t| t.into()).collect(); // TODO: u16, u8 + let tex_coords: Vec = tex_coords.into_f32().map(|t| t.into()).collect(); new_mesh.add_attribute(MeshVertexAttribute::TexCoords, VertexAttributeData::Vec2(tex_coords)); } @@ -101,17 +118,27 @@ impl ResourceLoader for ModelLoader { ] } - fn load(&self, path: &str) -> Result, crate::LoaderError> { + fn mime_types(&self) -> &[&str] { + &[] + } + + fn load(&self, resource_manager: &mut ResourceManager, path: &str) -> Result, crate::LoaderError> { // check if the file is supported by this loader if !self.does_support_file(path) { return Err(LoaderError::UnsupportedExtension(path.to_string())); } + let mut parent_path = PathBuf::from(path); + parent_path.pop(); + let parent_path = parent_path.display().to_string(); + let gltf = gltf::Gltf::open(path)?; let buffers: Vec> = gltf.buffers().map(|b| match b.source() { - gltf::buffer::Source::Bin => gltf.blob.as_deref().map(|v| v.to_vec()), - gltf::buffer::Source::Uri(uri) => ModelLoader::parse_uri(uri), + gltf::buffer::Source::Bin => gltf.blob.as_deref().map(|v| v.to_vec()) + .ok_or(ModelLoaderError::MissingBin(path.to_string())), + gltf::buffer::Source::Uri(uri) => util::gltf_read_buffer_uri(&parent_path, uri) + .map_err(|e| ModelLoaderError::UriDecodingError(e)), }).flatten().collect(); // TODO: Read in multiple scenes @@ -119,7 +146,7 @@ impl ResourceLoader for ModelLoader { // Load the materials let materials: Vec = gltf.materials() - .map(|mat| Material::from(mat)).collect(); + .map(|mat| Material::from_gltf(resource_manager, &parent_path, mat)).collect(); let meshes: Vec = scene.nodes() .map(|node| self.process_node(&buffers, &materials, node)) @@ -127,6 +154,10 @@ impl ResourceLoader for ModelLoader { Ok(Arc::new(Resource::with_data(path, Model::new(meshes)))) } + + fn load_bytes(&self, resource_manager: &mut ResourceManager, bytes: Vec, offset: usize, length: usize) -> Result, LoaderError> { + todo!() + } } #[cfg(test)] @@ -142,10 +173,11 @@ mod tests { #[test] fn test_loading() { - let path = test_file_path("test-embedded.gltf"); + let path = test_file_path("texture-embedded.gltf"); + let mut manager = ResourceManager::new(); let loader = ModelLoader::default(); - let model = loader.load(&path).unwrap(); + let model = loader.load(&mut manager, &path).unwrap(); let model = Arc::downcast::>(model.as_arc_any()).unwrap(); let model = model.data.as_ref().unwrap(); assert_eq!(model.meshes.len(), 1); // There should only be 1 mesh @@ -154,6 +186,7 @@ mod tests { assert!(mesh.normals().unwrap().len() > 0); assert!(mesh.tex_coords().unwrap().len() > 0); assert!(mesh.indices.clone().unwrap().len() > 0); + assert!(mesh.material().base_color_texture.is_some()); let _mesh_mat = mesh.material(); // inner panic if material was not loaded } } \ No newline at end of file diff --git a/lyra-resource/src/material.rs b/lyra-resource/src/material.rs index 7ef227d..252b2e1 100644 --- a/lyra-resource/src/material.rs +++ b/lyra-resource/src/material.rs @@ -1,4 +1,6 @@ -use crate::{Texture, ResHandle}; +use std::{fs::File, io::{BufReader, Read}, collections::hash_map::DefaultHasher, hash::{Hash, Hasher}}; + +use crate::{Texture, ResHandle, ResourceManager, util}; /// PBR metallic roughness #[derive(Clone, Debug, Default)] @@ -27,10 +29,10 @@ impl From> for PbrRoughness { #[derive(Clone, Debug, Default)] pub struct PbrGlossiness { /// The rgba diffuse color of the material - pub diffuse_color: [f32; 4], + pub diffuse_color: glam::Vec4, // The base color texture // pub diffuse_texture // TODO - pub specular: [f32; 3], + pub specular: glam::Vec3, /// The glossiness factor of the material. /// From 0.0 (no glossiness) to 1.0 (full glossiness) pub glossiness: f32, @@ -40,39 +42,201 @@ pub struct PbrGlossiness { impl From> for PbrGlossiness { fn from(value: gltf::material::PbrSpecularGlossiness) -> Self { PbrGlossiness { - diffuse_color: value.diffuse_factor(), - specular: value.specular_factor(), + diffuse_color: value.diffuse_factor().into(), + specular: value.specular_factor().into(), glossiness: value.glossiness_factor() } } } +/// The alpha rendering mode of a material. +/// This is essentially a re-export of gltf::material::AlphaMode +#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)] +pub enum AlphaMode { + /// The alpha value is ignored and the rendered output is fully opaque. + #[default] + Opaque = 1, + + /// The rendered output is either fully opaque or fully transparent depending on + /// the alpha value and the specified alpha cutoff value. + Mask, + + /// The alpha value is used, to determine the transparency of the rendered output. + /// The alpha cutoff value is ignored. + Blend, +} + +impl From for AlphaMode { + fn from(value: gltf::material::AlphaMode) -> Self { + match value { + gltf::material::AlphaMode::Opaque => AlphaMode::Opaque, + gltf::material::AlphaMode::Mask => AlphaMode::Mask, + gltf::material::AlphaMode::Blend => AlphaMode::Blend, + } + } +} + #[derive(Clone, Default)] pub struct Material { pub shader_uuid: Option, pub name: Option, pub double_sided: bool, - pub pbr_roughness: PbrRoughness, - pub pbr_glossiness: Option, - pub alpha_cutoff: Option, - pub alpha_mode: gltf::material::AlphaMode, + + //pub pbr_roughness: PbrRoughness, + /// The RGBA base color of the model. If a texture is supplied with `base_color_texture`, this value + /// will tint the texture. If a texture is not provided, this value would be the color of the Material. + pub base_color: glam::Vec4, + /// The metalness of the material + /// From 0.0 (non-metal) to 1.0 (metal) + pub metallic: f32, + /// The roughness of the material + /// From 0.0 (smooth) to 1.0 (rough) + pub roughness: f32, + /// The base color texture of the model. + pub base_color_texture: Option>, - pub texture: Option>, + /// The metallic-roughness texture. + /// + /// The metalness values are sampled from the B channel. The roughness values are sampled from + /// the G channel. These values are linear. If other channels are present (R or A), they are + /// ignored for metallic-roughness calculations. + pub metallic_roughness_texture: Option>, + + /// A set of parameter values that are used to define the specular-glossiness material model + /// from Physically-Based Rendering (PBR) methodology. + /// GLTF extension: [KHR_materials_pbrSpecularGlossiness](https://kcoley.github.io/glTF/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness) + pub pbr_glossiness: Option, + + /// The optional alpha cutoff value of the material. + pub alpha_cutoff: Option, + + /// The alpha rendering mode of the material. The material's alpha rendering + /// mode enumeration specifying the interpretation of the alpha value of the main + /// factor and texture. + /// + /// * In `Opaque` mode (default) the alpha value is ignored + /// and the rendered output is fully opaque. + /// * In `Mask` mode, the rendered + /// output is either fully opaque or fully transparent depending on the alpha + /// value and the specified alpha cutoff value. + /// * In `Blend` mode, the alpha value is used to composite the source and + /// destination areas and the rendered output is combined with the background + /// using the normal painting operation (i.e. the Porter and Duff over + /// operator). + pub alpha_mode: AlphaMode, + + //pub texture: Option>, } -impl From> for Material { - fn from(value: gltf::Material) -> Self { +impl Material { + /// Get a uri's identifier + /// + /// I'm not actually sure how identifiable this would be + fn uri_ident(gltf_rel_path: &str, uri: &str) -> String { + let mut hasher = DefaultHasher::new(); + uri.hash(&mut hasher); + let hash = hasher.finish(); + + format!("{gltf_rel_path};{hash}") + } + + fn source_ident(gltf_rel_path: &str, src: &gltf::image::Source) -> Option { + match src { + gltf::image::Source::View { view, mime_type } => { + let buf = view.buffer(); + let src = buf.source(); + + match src { + gltf::buffer::Source::Bin => None, + gltf::buffer::Source::Uri(uri) => { + Some(Material::uri_ident(gltf_rel_path, uri)) + } + } + }, + gltf::image::Source::Uri { uri, mime_type } => { + Some(Material::uri_ident(gltf_rel_path, uri)) + }, + } + } + + fn read_source(resource_manager: &mut ResourceManager, gltf_rel_path: &str, src: gltf::image::Source) -> Result, util::UriReadError> { + // TODO: Don't copy sources + match src { + gltf::image::Source::View { view, mime_type } => { + let buf = view.buffer(); + let src = buf.source(); + + let offset = view.offset(); + let len = view.length(); + + match src { + gltf::buffer::Source::Bin => todo!("Read material source from gltf Bin"), + gltf::buffer::Source::Uri(uri) => { + util::gltf_read_buffer_uri(gltf_rel_path, uri) + .map(|mut buf| { + buf.drain(0..offset); + buf.truncate(len); + buf + }) + } + } + }, + gltf::image::Source::Uri { uri, mime_type } => { + util::gltf_read_buffer_uri(gltf_rel_path, uri) + }, + } + } + + fn load_texture(resource_manager: &mut ResourceManager, gltf_rel_path: &str, texture_info: gltf::texture::Info<'_>) -> ResHandle { + // TODO: texture_info.tex_coord() + let tex = texture_info.texture(); + let img = tex.source(); + let src = img.source(); + + let buf = Material::read_source(resource_manager, gltf_rel_path, src).unwrap(); + let buflen = buf.len(); + let mime_type = infer::get(&buf).expect("Failed to get file type").mime_type(); + + resource_manager.load_bytes::(&uuid::Uuid::new_v4().to_string(), mime_type, + buf, 0, buflen).unwrap() + } + + /// Load the Material from a gltf::Material. + /// + /// `gltf_rel_path`: The relative path of the gltf file, + /// e.g. gltf model path is "resource/models/player.gltf", the relative path would be "resource/models/" + pub fn from_gltf(resource_manager: &mut ResourceManager, gltf_rel_path: &str, gltf_mat: gltf::Material) -> Self { + let pbr_rough = gltf_mat.pbr_metallic_roughness(); + let base_color = pbr_rough.base_color_factor().into(); + let metallic = pbr_rough.metallic_factor(); + let roughness = pbr_rough.roughness_factor(); + + let base_color_texture = pbr_rough.base_color_texture() + .map(|info| Material::load_texture(resource_manager, gltf_rel_path, info)); + + let metallic_roughness_texture = pbr_rough.metallic_roughness_texture() + .map(|info| Material::load_texture(resource_manager, gltf_rel_path, info)); + + /* let base_color_texture = if let Some(base_tex_info) = pbr_rough.base_color_texture() { + Some(Material::load_texture(resource_manager, gltf_rel_path, base_tex_info)) + } else { None }; */ + Material { - name: value.name() + name: gltf_mat.name() .map(|s| s.to_string()), - double_sided: value.double_sided(), - pbr_roughness: value.pbr_metallic_roughness().into(), - pbr_glossiness: value.pbr_specular_glossiness() + double_sided: gltf_mat.double_sided(), + base_color, + metallic, + roughness, + pbr_glossiness: gltf_mat.pbr_specular_glossiness() .map(|o| o.into()), - alpha_cutoff: value.alpha_cutoff(), - alpha_mode: value.alpha_mode(), + alpha_cutoff: gltf_mat.alpha_cutoff(), + alpha_mode: gltf_mat.alpha_mode().into(), shader_uuid: None, - texture: None, + + // TODO + base_color_texture, + metallic_roughness_texture, } } } \ No newline at end of file diff --git a/lyra-resource/src/model.rs b/lyra-resource/src/model.rs index 652cef2..9484232 100644 --- a/lyra-resource/src/model.rs +++ b/lyra-resource/src/model.rs @@ -10,6 +10,15 @@ pub enum MeshIndices { U32(Vec), } +impl MeshIndices { + pub fn len(&self) -> usize { + match self { + MeshIndices::U16(v) => v.len(), + MeshIndices::U32(v) => v.len(), + } + } +} + /* impl From> for MeshIndices { fn from(value: Vec) -> Self { MeshIndices::U8(value) diff --git a/lyra-resource/src/resource_manager.rs b/lyra-resource/src/resource_manager.rs index 0204dee..b334429 100644 --- a/lyra-resource/src/resource_manager.rs +++ b/lyra-resource/src/resource_manager.rs @@ -2,7 +2,7 @@ use std::{sync::Arc, collections::{HashMap, hash_map::DefaultHasher}, hash::{Has use thiserror::Error; -use crate::{resource::Resource, loader::{ResourceLoader, LoaderError, texture::TextureLoader, model::ModelLoader}}; +use crate::{resource::Resource, loader::{ResourceLoader, LoaderError, image::ImageLoader, model::ModelLoader}}; pub trait ResourceStorage: Send + Sync + Any + 'static { fn as_any(&self) -> &dyn Any; @@ -31,6 +31,10 @@ pub enum RequestError { Loader(LoaderError), #[error("The file extension is unsupported: '{0}'")] UnsupportedFileExtension(String), + #[error("The mimetype is unsupported: '{0}'")] + UnsupportedMime(String), + #[error("The identifier is not found: '{0}'")] + IdentNotFound(String), } impl From for RequestError { @@ -39,16 +43,19 @@ impl From for RequestError { } } +/// A struct that stores all Manager data. This is requried for sending +//struct ManagerStorage + pub struct ResourceManager { resources: HashMap>, - loaders: Vec>, + loaders: Vec>, } impl ResourceManager { pub fn new() -> Self { Self { resources: HashMap::new(), - loaders: vec![ Box::new(TextureLoader::default()), Box::new(ModelLoader::default()) ], + loaders: vec![ Arc::new(ImageLoader::default()), Arc::new(ModelLoader::default()) ], } } @@ -65,10 +72,11 @@ impl ResourceManager { .find(|l| l.does_support_file(path)) { // Load the resource and store it - let res = loader.load(path)?; + let loader = Arc::clone(&loader); // stop borrowing from self + let res = loader.load(self, path)?; self.resources.insert(path.to_string(), res.clone()); - // convert Arc to Arc + // cast Arc to Arc let res = res.as_arc_any(); let res = res.downcast::>() .expect("Failure to downcast resource! Does the loader return an `Arc>`?"); @@ -80,6 +88,49 @@ impl ResourceManager { } } } + + /// Store bytes in the manager. If there is already an entry with the same identifier it will be updated. + /// + /// Panics: If there is already an entry with the same `ident`, and the entry is not bytes, this function will panic. + /// + /// Parameters: + /// * `ident` - The identifier to store along with these bytes. Make sure its unique to avoid overriding something. + /// * `bytes` - The bytes to store. + /// + /// Returns: The `Arc` to the now stored resource + pub fn load_bytes(&mut self, ident: &str, mime_type: &str, bytes: Vec, offset: usize, length: usize) -> Result>, RequestError> { + if let Some(loader) = self.loaders.iter() + .find(|l| l.does_support_mime(mime_type)) { + let loader = loader.clone(); + let res = loader.load_bytes(self, bytes, offset, length)?; + self.resources.insert(ident.to_string(), res.clone()); + // code here... + + // cast Arc to Arc + let res = res.as_arc_any(); + let res = res.downcast::>() + .expect("Failure to downcast resource! Does the loader return an `Arc>`?"); + + Ok(res) + } else { + Err(RequestError::UnsupportedMime(mime_type.to_string())) + } + } + + /// Requests bytes from the manager. + pub fn request_loaded_bytes(&mut self, ident: &str) -> Result>, RequestError> { + match self.resources.get(&ident.to_string()) { + Some(res) => { + let res = res.clone().as_arc_any(); + let res = res.downcast::>().expect("Failure to downcast resource"); + + Ok(res) + }, + None => { + Err(RequestError::IdentNotFound(ident.to_string())) + } + } + } } #[cfg(test)] diff --git a/lyra-resource/src/util.rs b/lyra-resource/src/util.rs new file mode 100644 index 0000000..e7202df --- /dev/null +++ b/lyra-resource/src/util.rs @@ -0,0 +1,38 @@ +use base64::Engine; +use thiserror::Error; +use std::io; + +#[derive(Error, Debug)] +pub enum UriReadError { + #[error("IOError: '{0}'")] + IoError(io::Error), + + // From is implemented for this field in each loader module + #[error("Base64 decoding error: '{0}'")] + Base64Decode(base64::DecodeError), + + #[error("Some data was missing from the uri")] + None +} + +/// Read a buffer's uri string into a byte buffer. +/// +/// * `containing_path`: The path of the containing folder of the buffers "parent", +/// the parent being where this buffer is defined in, +/// i.e. parent="resources/models/player.gltf", containing="reousrce/models" +pub(crate) fn gltf_read_buffer_uri(containing_path: &str, uri: &str) -> Result, UriReadError> { + let uri = uri.strip_prefix("data").ok_or(UriReadError::None)?; + let (mime, data) = uri.split_once(",").ok_or(UriReadError::None)?; + + let (_mime, is_base64) = match mime.strip_suffix(";base64") { + Some(mime) => (mime, true), + None => (mime, false), + }; + + if is_base64 { + base64::engine::general_purpose::STANDARD.decode(data).map_err(|e| UriReadError::Base64Decode(e)) + } else { + let full_path = format!("{containing_path}/{data}"); + std::fs::read(&full_path).map_err(|e| UriReadError::IoError(e)) + } +} \ No newline at end of file diff --git a/lyra-resource/test_files/gltf/texture-bin.glb b/lyra-resource/test_files/gltf/texture-bin.glb new file mode 100644 index 0000000..9a3965b Binary files /dev/null and b/lyra-resource/test_files/gltf/texture-bin.glb differ diff --git a/lyra-resource/test_files/gltf/texture-embedded.gltf b/lyra-resource/test_files/gltf/texture-embedded.gltf new file mode 100644 index 0000000..5309758 --- /dev/null +++ b/lyra-resource/test_files/gltf/texture-embedded.gltf @@ -0,0 +1,142 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v3.6.6", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "TEXCOORD_0":1, + "NORMAL":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "bufferView":4, + "mimeType":"image/png", + "name":"uvgrid" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":480, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + }, + { + "buffer":0, + "byteLength":40222, + "byteOffset":840 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":41064, + "uri":"data:application/octet-stream;base64,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xn/zf/P/8f/oF5M6zvfN/9fN//0EID5ZXhMgQIAAAQIECBAgQIAAgW8qYAHgmzas2yJAgAABAgQIECBAgAABAlFg9QJA3A4cK856nb39v7+v7O0/ffzs7X99/Oztv338uB2o/yyjHLcDZsTrY8TtwP1nGWX5P/43f7faUf5Pt3iGfyb/x//Nn1uNaPwf/zd/bvkb/3N//tO3hfG/+PlP+JtffZvHsvF/ihzpr7/6+L96ASBdXEACBAgQIECAAAECBAgQIEBgtoAFgNlkTiBAgAABAgQIECBAgAABAl9PwALA12szV0yAAAECBAgQIECAAAECBGYLWACYTeYEAgQIECBAgAABAgQIECDw9QQsAHy9NnPFBAgQIECAAAECBAgQIEBgtoAFgNlkTiBAgAABAgQIECBAgAABAl9PwALA12szV0yAAAECBAgQIECAAAECBGYLWACYTeYEAgQIECBAgAABAgQIECDw9QQsAHy9NnPFBAgQIECAAAECBAgQIEBgtoAFgNlkTiBAgAABAgQIECBAgAABAl9PwALA12szV0yAAAECBAgQIECAAAECBGYLWACYTeYEAgQIECBAgAABAgQIECDw9QR+PT4+ll71y8tLaXz3r/0rH0DPv/yvfP70f/q/yudP/6f/q3z+9H/6v8rnT/+n/6t8/uwAqNQXmwABAgQIECBAgAABAgQIJAlYAEiCFoYAAQIECBAgQIAAAQIECFQKWACo1BebAAECBAgQIECAAAECBAgkCVgASIIWhgABAgQIECBAgAABAgQIVApYAKjUF5sAAQIECBAgQIAAAQIECCQJWABIghaGAAECBAgQIECAAAECBAhUClgAqNQXmwABAgQIECBAgAABAgQIJAlYAEiCFoYAAQIECBAgQIAAAQIECFQKWACo1BebAAECBAgQIECAAAECBAgkCVgASIIWhgABAgQIECBAgAABAgQIVApYAKjUF5sAAQIECBAgQIAAAQIECCQJrF4AeJ32SZd6Pcz57nj9g6R3p33x/R/vku70epjX/XT9g6R3j0/npEjXw+yn6foHSe8ez09Jka6Hkf/y//qTkfOu/Jf/OU/a9SjG/+k6TNK78l/+Jz1qV8PI/+mqS9abPz7/V37/Wb0AkNXQ4hAgQIAAAQIECBAgQIAAAQLLBSwALLdzJgECBAgQIECAAAECBAgQ+DICv5Zc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xn/j//gv/TH/4nhv/Df/N/+fYnoMfx37u4rvP7G9K77/xe+7a7//+gnA8MdVAAIECBAgQIAAAQIECBAgUC9gAaC+DVwBAQIECBAgQIAAAQIECBAYLrB6ASBuBx5+tVcCxO0QVz4e/lbcDjI82JUAcTvMlY+Hv5W9/be/oezt/338uB2w/yyjHLcDZ8TrY8j/qSdJLcv/3O2/fePK/9yfP/T+xv/xf/OnN49l43/x85/wN39ie/evjf9TT5Ja/vHjf8LfPLvVoNXf/9aOf6sXAG7h+IwAAQIECBAgQIAAAQIECBDYhoAFgG20g6sgQIAAAQIECBAgQIAAAQJDBSwADOVVOQECBAgQIECAAAECBAgQ2IaABYBttIOrIECAAAECBAgQIECAAAECQwUsAAzlVTkBAgQIECBAgAABAgQIENiGgAWAbbSDqyBAgAABAgQIECBAgAABAkMFLAAM5VU5AQIECBAgQIAAAQIECBDYhoAFgG20g6sgQIAAAQIECBAgQIAAAQJDBSwADOVVOQECBAgQIECAAAECBAgQ2IaABYBttIOrIECAAAECBAgQIECAAAECQwUsAAzlVTkBAgQIECBAgAABAgQIENiGgAWAbbSDqyBAgAABAgQIECBAgAABAkMF/np4ePh7aIR3Kn98fHzniLEfv7y8jA3wTu3uX/u/84gM/djzL/+HPmDvVK7/0/+984gM/Vj/p/8b+oC9U7n+T//3ziMy9GP938/u/+wAGJpeKidAgAABAgQIECBAgAABAtsQsACwjXZwFQQIECBAgAABAgQIECBAYKiABYChvConQIAAAQIECBAgQIAAAQLbELAAsI12cBUECBAgQIAAAQIECBAgQGCogAWAobwqJ0CAAAECBAgQIECAAAEC2xCwALCNdnAVBAgQIECAAAECBAgQIEBgqIAFgKG8KidAgAABAgQIECBAgAABAtsQsACwjXZwFQQIECBAgAABAgQIECBAYKiABYChvConQIAAAQIECBAgQIAAAQLbELAAsI12cBUECBAgQIAAAQIECBAgQGCogAWAobwqJ0CAAAECBAgQIECAAAEC2xBYvQBwPt6V3snrfiqNf3w6l8bfT8X3f34qvf/XaV8a/3x3LI0/7YvvX/6Xtr/8L37+5X/p82/8n0r9j8b/Un/jf/Hz/9Pn/8X3X93/V3//XZv/qxcASns/wQkQIECAAAECBAgQIECAAIEPCVgA+BCTgwgQIECAAAECBAgQIECAwNcW+LXk8vttD7G8O7wtqXLWOf22j1i+P02z6lpycL/tP5YPz7slVc46p9/2G8unhJ8E9Nv+Yvmwe551L0sO7rf9x/L9dFpS5axz+m3/sbx7O8yqa8nB/bafWJ5OCfffbfuX/79/BiT/5f+SnJ5zTsz3dl4sy/9pDuWiY+N43yqIZfkv/xc9VDNOivneTotl+T/NkFx2aMz3VkMs/4j877b9Z99//L7X/GM54/tfnO+2+LGc8f035nuLH8tz83/RAkC8yXbzsdwuaPR/sZFb48fy6Nit/pjk7eGP5Yz48Ut++/Ifyxnx45f89uU/ljPixy/57ct/LGfEj1/y25f/WM6IH5O8JX8sZ8SP+S7/5b/8H7/oF/M65rv8N/4b/8cvesf8i+O98d/8/8fN/8M/clZ8/4nf9yq+/1XPfz9z/PcTgNize02AAAECBAgQIECAAAECBL6pgAWAb9qwbosAAQIECBAgQIAAAQIECESB1QsAcTtErDjrddwOkhUzxsne/hNjt9fZ2//6+Nnbf/v42dv/+/hxO2D/WUY5bgfKiNfHkP/j/+ZHbx7L8j93+2+0b6/l//i/+dObx7Lxf4oc6a+N/7k//+kb2Phf/PyH7fB922SUy8f/4vuv7v+r579r83/1AkDGQy4GAQIECBAgQIAAAQIECBAgsE7AAsA6P2cTIECAAAECBAgQIECAAIEvIWAB4Es0k4skQIAAAQIECBAgQIAAAQLrBCwArPNzNgECBAgQIECAAAECBAgQ+BICFgC+RDO5SAIECBAgQIAAAQIECBAgsE7AAsA6P2cTIECAAAECBAgQIECAAIEvIWAB4Es0k4skQIAAAQIECBAgQIAAAQLrBCwArPNzNgECBAgQIECAAAECBAgQ+BICFgC+RDO5SAIECBAgQIAAAQIECBAgsE7AAsA6P2cTIECAAAECBAgQIECAAIEvIWAB4Es0k4skQIAAAQIECBAgQIAAAQLrBCwArPNzNgECBAgQIECAAAECBAgQ+BICvx4fH0sv9OXlpTS++9f+lQ+g51/+Vz5/+j/9X+Xzp//T/1U+f/o//V/l86f/0/9VPn92AFTqi02AAAECBAgQIECAAAECBJIELAAkQQtDgAABAgQIECBAgAABAgQqBSwAVOqLTYAAAQIECBAgQIAAAQIEkgQsACRBC0OAAAECBAgQIECAAAECBCoFLABU6otNgAABAgQIECBAgAABAgSSBCwAJEELQ4AAAQIECBAgQIAAAQIEKgUsAFTqi02AAAECBAgQIECAAAECBJIELAAkQQtDgAABAgQIECBAgAABAgQqBSwAVOqLTYAAAQIECBAgQIAAAQIEkgQsACRBC0OAAAECBAgQIECAAAECBCoFLABU6otNgAABAgQIECBAgAABAgSSBFYvALzup6RLvR7m+HS+/kHSu/tpSop0Pczx/HT9g6R3X6d9UqTrYc53x+sfJL077Yvv/3iXdKfXw8j/6TpM0rvyX/4nPWpXw8j/6apL1pvyX/5nPWvX4sj/6RpL2nvV33+q2/9cPP8tn/+v/P6zegEg7UkXiAABAgQIECBAgAABAgQIEFgsYAFgMZ0TCRAgQIAAAQIECBAgQIDA1xH4teRS+20fsXx/mpZUOeucfttLLB+ed7PqWnJwv+0/lk8JPwnot/3F8mH3vOSWZp3Tb/uP5fvpNKuuJQf32/5jefd2WFLlrHP6bT+xPJ0S7r/b9hS3Qe0Ob7PuZcnBMd/b+bEs/6clpLPOifneToxl+S//Zz1MCw6O+d5Oj2X5Py0QnXdKzPd2ZizLf/k/72maf3TM93Z2LMv/aT7ozDPi9512aixnfP+J7d3ix3JG+8f5bosfyxnz3zjfb/FjOWX+3237X/P9Z9ECQGzk1vix3EBG/xcf8vbwx/Lo2K3++CW/ffmP5Yz4cZBvg38sZ8SPX/Lbl/9Yzogfv+S3hz+WM+LHJG/JH8sZ8WMn1zq/WM6IH/Nd/st/+T9+0S/mdcx3+W/8N/6P/9If8y+O98Z/8//0+X/4R86K7z/V87/q8a88/8M/cq79/uMnALFn95oAAQIECBAgQIAAAQIECHxTAQsA37Rh3RYBAgQIECBAgAABAgQIEIgCqxcA4naQWHHW6+zt//19ZW//6eNnb//r42dv/+3jZ2//7+PH7UD9ZxnluB0qI14fQ/5PPUlqWf7nbv/tG1f+Fz//YTts3zYZZeN/7s9f+jY1/o//mz+9eSwb/6fIkf66+vtPdftXz3/Lx//wc4AlD9/qBYAlQZ1DgAABAgQIECBAgAABAgQI5ApYAMj1Fo0AAQIECBAgQIAAAQIECJQIWAAoYReUAAECBAgQIECAAAECBAjkClgAyPUWjQABAgQIECBAgAABAgQIlAhYAChhF5QAAQIECBAgQIAAAQIECOQKWADI9RaNAAECBAgQIECAAAECBAiUCFgAKGEXlAABAgQIECBAgAABAgQI5ApYAMj1Fo0AAQIECBAgQIAAAQIECJQIWAAoYReUAAECBAgQIECAAAECBAjkClgAyPUWjQABAgQIECBAgAABAgQIlAhYAChhF5QAAQIECBAgQIAAAQIECOQKWADI9RaNAAECBAgQIECAAAECBAiUCPz18PDwd0nk/wV9fHysDP+fl5eX0vjuX/tXPoCef/lf+fzp//R/lc+f/k//V/n86f/0f5XPn/7vZ/d/dgBUZp/YBAgQIECAAAECBAgQIEAgScACQBK0MAQIECBAgAABAgQIECBAoFLAAkClvtgECBAgQIAAAQIECBAgQCBJwAJAErQwBAgQIECAAAECBAgQIECgUsACQKW+2AQIECBAgAABAgQIECBAIEnAAkAStDAECBAgQIAAAQIECBAgQKBSwAJApb7YBAgQIECAAAECBAgQIEAgScACQBK0MAQIECBAgAABAgQIECBAoFLAAkClvtgECBAgQIAAAQIECBAgQCBJwAJAErQwBAgQIECAAAECBAgQIECgUsACQKW+2AQIECBAgAABAgQIECBAIElg9QLA8emcdKnXw+yn6foHSe8ez09Jka6HeZ321z9Ievd8d0yKdD3MtC++/+Pd9QtLevd1PyVFuh5G/sv/609Gzrvyf8qB/kMU+S////BopLwt/6cU5z8F+fH5X/z9p3r+dy6e/5bnf/H3n7Xf/1YvAPypY/A+AQIECBAgQIAAAQIECBAgsB0BCwDbaQtXQoAAAQIECBAgQIAAAQIEhgn8WlJzv+0nlg/PuyVVzjqn3/Yfy6eEnwT02/5j+bB7nnUvSw7ut33E8v10WlLlrHP6bf+xvHs7zKprycH9tp9Ynk4J999te4rboHaHtyW3NOucfttXLN+fpll1LTk45ns7P5blv/xf8kzNOSfmezsvluX/NIdy0bEx31sFsSz/5f+ih2rGSTHf22mxLP+nGZLLDo353mqI5R+R/922/+z7j/O95h/LGfO/ON9t8WM5Y/4b873Fj+WU/O+2/Wd//4nf99r9x/Lc73+LFgBikreHP5bbBY3+L37Jb1/+Y3l07FZ//JLfvvzHckb8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fN+2dWcECBAgQIAAAQIECBAgQOAisHoBIG4Hu9Sa+CJ7+39/a3E7UP9ZRjluh8qI18eI28H6zzLK2dv/+3uK24H6zzLKcTtkRrw+hvyfepLUsvyf95u3z24c+V/8/IftsJ/dth+pr3z8L77/6v6/evwrz//wc4CPPK+ffUz1/K96/JP/02c/UrPqk//r5j+rFwBmtZaDCRAgQIAAAQIECBAgQIAAgRIBCwAl7IISIECAAAECBAgQIECAAIFcAQsAud6iESBAgAABAgQIECBAgACBEgELACXsghIgQIAAAQIECBAgQIAAgVwBCwC53qIRIECAAAECBAgQIECAAIESAQsAJeyCEiBAgAABAgQIECBAgACBXAELALneohEgQIAAAQIECBAgQIAAgRIBCwAl7IISIECAAAECBAgQIECAAIFcAQsAud6iESBAgAABAgQIECBAgACBEgELACXsghIgQIAAAQIECBAgQIAAgVwBCwC53qIRIECAAAECBAgQIECAAIESAQsAJeyCEiBAgAABAgQIECBAgACBXIG/Hh4e/s4N+e9oj4+P/34jufTy8pIc8d/h3L/2//cTkVvy/Mv/3Cfu39H0f/q/fz8RuSX9n/4v94n7dzT9n/7v309Ebkn/97P7PzsAcvNNNAIECBAgQIAAAQIECBAgUCJgAaCEXVACBAgQIECAAAECBAgQIJArYAEg11s0AgQIECBAgAABAgQIECBQImABoIRdUAIECBAgQIAAAQIECBAgkCtgASDXWzQCBAgQIECAAAECBAgQIFAiYAGghF1QAgQIECBAgAABAgQIECCQK2ABINdbNAIECBAgQIAAAQIECBAgUCJgAaCEXVACBAgQIECAAAECBAgQIJArYAEg11s0AgQIECBAgAABAgQIECBQImABoIRdUAIECBAgQIAAAQIECBAgkCtgASDXWzQCBAgQIECAAAECBAgQIFAisHoB4Ph0Lrnwf4Lup+mflyX/P56fSuL+E/R12v/zsuT/57tjSdx/gk774vs/3v1zKSX/f91PJXH/CSr/5f8/z0LF/+X/VMF+ifnj8794/lPd/5+Lx7/y/C+e/1TP/6rnv+Xzf/l/GQsqXsj/dd9/Vi8AVDS6mAQIECBAgAABAgQIECBAgMA8AQsA87wcTYAAAQIECBAgQIAAAQIEvqTAryVX3W/7i+XD825JlbPO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+R/x//uG+G//3zz7yN/+P3b+j37+uXf/vzsB8NHk9B4BAgQIECBAgAABAgQIECAwh4AEwBzjoBcECBAgQIAAAQIECBAgQKCpgARAU16VEyBAgAABAgQIECBAgACBOQQkAOYYB70gQIAAAQIECBAgQIAAAQJNBSQAmvKqnAABAgQIECBAgAABAgQIzCEgATDHOOgFAQIECBAgQIAAAQIECBBoKiAB0JRX5QQIECBAgAABAgQIECBAYA4BCYA5xkEvCBAgQIAAAQIECBAgQIBAUwEJgKa8KidAgAABAgQIECBAgAABAnMISADMMQ56QYAAAQIECBAgQIAAAQIEmgpIADTlVTkBAgQIECBAgAABAgQIEJhDQAJgjnHQCwIECBAgQIAAAQIECBAg0FTg29PTU9MGPqv85eXls480fd/1G/+mE+yTys1/8f/JFGn6tvXP+td0gn1SufXP+vfJFGn6tvXP+td0gn1SufXP+vfJFGn6thMATXlVToAAAQIECBAgQIAAAQIE5hCQAJhjHPSCAAECBAgQIECAAAECBAg0FZAAaMqrcgIECBAgQIAAAQIECBAgMIeABMAc46AXBAgQIECAAAECBAgQIECgqYAEQFNelRMgQIAAAQIECBAgQIAAgTkEJADmGAe9IECAAAECBAgQIECAAAECTQUkAJryqpwAAQIECBAgQIAAAQIECMwhIAEwxzjoBQECBAgQIECAAAECBAgQaCogAdCUV+UECBAgQIAAAQIECBAgQGAOAQmAOcZBLwgQIECAAAECBAgQIECAQFMBCYCmvConQIAAAQIECBAgQIAAAQJzCNydADguy9ArOV+fh7b/uhyHtn99OA9tfzkOvv7zw9Drfz0uQ9s/P1+Htj88/gdf/+jxvw6e/8Pjf/D6N3r9H73/if+x67/4H3v/I/7Hzv/R9z/2/8H3//b/u+7/704A3NW6LxMgQIAAAQIECBAgQIAAAQJdBCQAujBrhAABAgQIECBAgAABAgQIjBX4tqX5+thfli8dfhJQH3vM8unwY8slrfpOfewry4/LZVVdWz5cH/vP8uHttKXKVd+pj/1mebl0uP7q2HMegzyc3lZdy5YP18e+svx4WbZUueo79bG3LJ9+HFbVteXDGe/l+1nuEv/Vsf/e15/jXa4/yz3GP+d7aT/LPeZ/xntpP8td4r869td7/cv1vlx/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XO9HrP+5yZebgSz3iL+Md/Hff/0X/+8P+eJf/Of9QI/1z/7//pBr/+///Jf7vf3/vucfPwHosWJqgwABAgQIECBAgAABAgQIDBaQABg8AJonQIAAAQIECBAgQIAAAQI9BO5OAORx0B4drtvoffy/bj+PA9fv9Sjnccge7dVt5HGw+r0e5d7H3+pryuPA9Xs9yqOvf/T4j57/w+M/fg7QY77VbYxe//M4YN23HmXxv/Rg/sc2xP/7zwH+EanhG+J/aaj7edX2//a/+f9oFOz/7z+H+Mip1Xv2/3W/+a/H4e4EQF2hMgECBAgQIECAAAECBAgQIDCfgATAfGOiRwQIECBAgAABAgQIECBAYHcBCYDdSVVIgAABAgQIECBAgAABAgTmE5AAmG9M9IgAAQIECBAgQIAAAQIECOwuIAGwO6kKCRAgQIAAAQIECBAgQIDAfAISAPONiR4RIECAAAECBAgQIECAAIHdBSQAdidVIQECBAgQIECAAAECBAgQmE9AAmC+MdEjAgQIECBAgAABAgQIECCwu4AEwO6kKiRAgAABAgQIECBAgAABAvMJSADMNyZ6RIAAAQIECBAgQIAAAQIEdheQANidVIUECBAgQIAAAQIECBAgQGA+AQmA+cZEjwgQIECAAAECBAgQICBcDOoAABxJSURBVECAwO4C//7+/ft/dq91RYVPT08rPr3/R19eXvavdEWNrt/4r5guu3/U/Bf/u0+qFRVa/6x/K6bL7h+1/ln/dp9UKyq0/ln/VkyX3T9q/fuz1z8nAHYPKRUSIECAAAECBAgQIECAAIH5BCQA5hsTPSJAgAABAgQIECBAgAABArsLSADsTqpCAgQIECBAgAABAgQIECAwn4AEwHxjokcECBAgQIAAAQIECBAgQGB3AQmA3UlVSIAAAQIECBAgQIAAAQIE5hOQAJhvTPSIAAECBAgQIECAAAECBAjsLiABsDupCgkQIECAAAECBAgQIECAwHwCEgDzjYkeESBAgAABAgQIECBAgACB3QUkAHYnVSEBAgQIECBAgAABAgQIEJhPQAJgvjHRIwIECBAgQIAAAQIECBAgsLuABMDupCokQIAAAQIECBAgQIAAAQLzCdydALg+nIde1XI8Dm3/en4Y2v7rcRna/vn5OrT94/JnX//o8R89/4fH/+D173UZu/6dr8/if6CA+B87/0ff/4h/+//A5edf9v+xzz/iX/zfE/93JwDuadx3CRAgQIAAAQIECBAgQIAAgT4CEgB9nLVCgAABAgQIECBAgAABAgSGCnzb0np97C3Lh7fTlipXfac+9pvl5XJZVdeWD9fHnrJ8OL1tqXLVd+pjn1l+vCyr6try4frYf5ZPPw5bqlz1nfrYf5YvHX4SkNdbOp7lHtef413az3KP8c/5XtrPco/5n/Fe2s9yl/ivjv33Xv/qY39Zflzar3/1sf8snw4/ypA0/ct4Lw1lWfwvTe1L5RnvdVn8t7//yXgv/lkW/0shafqX+31pKMv2//b3v7nfF/8s2//t/2VOtPzLeC/tZPmrxf+mBEA+5Jeb3yy3hP+77gzyEvxZ/vszLf83b3LKzVCWW7b7d935kFce/rL892da/m9O8jL5s9yy3b/rzpv8cvOf5b8/0/J/83pHXH+O94jxz/k+Yv5nvA+J/0hyjlj/8ia/3PxnueW8/7vufMgvD/9Z/vszLf83413891//xf/7Q774F/95P9By3fu7bvv/+0Ou/d/+n/cDf8dIy//NeP/q9/9+AtBypqibAAECBAgQIECAAAECBAhMIiABMMlA6AYBAgQIECBAgAABAgQIEGgpcHcCoPfx/xojjwPX7/Uo53HIHu3VbeRxsPq9HuU8DtOjvbqN3sd/6vZHX//o8R89/4fHf/wcoJ4bPcq9j//X19T7+H/dvvhfapKuZfH//nOArvB/NSb+lxHstzbt/+1/83/D/skL+//7zyF+wtP8n+z/7f+bZx8N4r33/3cnAD7qnPcIECBAgAABAgQIECBAgACBOQQkAOYYB70gQIAAAQIECBAgQIAAAQJNBSQAmvKqnAABAgQIECBAgAABAgQIzCEgATDHOOgFAQIECBAgQIAAAQIECBBoKiAB0JRX5QQIECBAgAABAgQIECBAYA4BCYA5xkEvCBAgQIAAAQIECBAgQIBAUwEJgKa8KidAgAABAgQIECBAgAABAnMISADMMQ56QYAAAQIECBAgQIAAAQIEmgpIADTlVTkBAgQIECBAgAABAgQIEJhDQAJgjnHQCwIECBAgQIAAAQIECBAg0FRAAqApr8oJECBAgAABAgQIECBAgMAcAhIAc4yDXhAgQIAAAQIECBAgQIAAgaYC356enpo28FnlLy8vn32k6fuu3/g3nWCfVG7+i/9PpkjTt61/1r+mE+yTyq1/1r9PpkjTt61/1r+mE+yTyq1/1r9PpkjTt50AaMqrcgIECBAgQIAAAQIECBAgMIeABMAc46AXBAgQIECAAAECBAgQIECgqYAEQFNelRMgQIAAAQIECBAgQIAAgTkEJADmGAe9IECAAAECBAgQIECAAAECTQUkAJryqpwAAQIECBAgQIAAAQIECMwhIAEwxzjoBQECBAgQIECAAAECBAgQaCogAdCUV+UECBAgQIAAAQIECBAgQGAOAQmAOcZBLwgQIECAAAECBAgQIECAQFMBCYCmvConQIAAAQIECBAgQIAAAQJzCEgAzDEOekGAAAECBAgQIECAAAECBJoKSAA05VU5AQIECBAgQIAAAQIECBCYQ+DuBMByPA69kuv5YWj7r8dlaPvn5+vQ9o/Ln339o8d/9PwfHv8P56Hz/3UZu/6dr89Dr1/8j13/xL/4H7kAiH/xP3L+Xe3/I/n/Jf6/dvzfnQAYOvs0ToAAAQIECBAgQIAAAQIECPySgATALzH5EAECBAgQIECAAAECBAgQ+NoC37Z0vz72m+XlctlS5arv1Mces3w4va2qa8uH62PfWX68LFuqXPWd+th/lk8/Dqvq2vLh+thPli8dfhKQ11v6n+Ue15/jXdrPco/xz/le2s9yj/mf8V7az3KX+K+O/eUxwMPbqXSp6V997D/Lj0v79a8+9p/l0+FH02svlWe812XxvxSSpn8Z76WhLIt/8d908v23cvG//A+x/f/9Z3D2f/v//wRHg0Le75fqs+z+f93z77YEQDzkl5v/HkGf8yhvcsrNT5bzc61e50NeWfyz3KrNrDcneZn8Wc7PtXqdN/nlZiDLrdrMevN6R1x/jveI8c/5PmL+Z7wPif94yC8P/z0e+nP+5UN+efjPcn6u1et8yC8P/1lu1WbWm/Eu/vuv/+L//SFf/Iv/vB/IdarVa/v/+0Ou/d/+n/cDrWIu6814d/9/3/OvnwDkzPKaAAECBAgQIECAAAECBAj8pgISAL/pwLosAgQIECBAgAABAgQIECCQAncnAPI4cFbc63Ueh+zVZraTx8Hy33u9zuMwvdrMdnof/8m2y+vR1z96/EfP/+HxHz8HqOdGj3Lv4//1NfU+/l+3L/6XmqRrWfy//xygK/xfjYn/ZQT7rU37/7rf/N7gdnph/3//OcROpKuqsf+3/2+efTQgX/3+/+4EwEc43iNAgAABAgQIECBAgAABAgTmEJAAmGMc9IIAAQIECBAgQIAAAQIECDQVkABoyqtyAgQIECBAgAABAgQIECAwh4AEwBzjoBcECBAgQIAAAQIECBAgQKCpgARAU16VEyBAgAABAgQIECBAgACBOQQkAOYYB70gQIAAAQIECBAgQIAAAQJNBSQAmvKqnAABAgQIECBAgAABAgQIzCEgATDHOOgFAQIECBAgQIAAAQIECBBoKiAB0JRX5QQIECBAgAABAgQIECBAYA4BCYA5xkEvCBAgQIAAAQIECBAgQIBAUwEJgKa8KidAgAABAgQIECBAgAABAnMISADMMQ56QYAAAQIECBAgQIAAAQIEmgr8+/v37/9p2sInlT89PX3yibZvv7y8tG3gk9pdv/H/ZIo0fdv8F/9NJ9gnlVv/rH+fTJGmb1v/rH9NJ9gnlVv/rH+fTJGmb1v//uz1zwmApuGlcgIECBAgQIAAAQIECBAgMIeABMAc46AXBAgQIECAAAECBAgQIECgqYAEQFNelRMgQIAAAQIECBAgQIAAgTkEJADmGAe9IECAAAECBAgQIECAAAECTQUkAJryqpwAAQIECBAgQIAAAQIECMwhIAEwxzjoBQECBAgQIECAAAECBAgQaCogAdCUV+UECBAgQIAAAQIECBAgQGAOAQmAOcZBLwgQIECAAAECBAgQIECAQFMBCYCmvConQIAAAQIECBAgQIAAAQJzCEgAzDEOekGAAAECBAgQIECAAAECBJoKSAA05VU5AQIECBAgQIAAAQIECBCYQ+DuBMD1/DD0Sl6Py9D2z8/Xoe0flz/7+keP/+j5vxyPQ+ff9eE8tP3XZez1n6/PQ69f/I9d/8S/+B+5AIh/8T9y/tn/7f8j55/7//vuf+9OAIwcfG0TIECAAAECBAgQIECAAAECvyYgAfBrTj5FgAABAgQIECBAgAABAgS+tMC3Lb2vjz1m+XB621Llqu/Uxz6y/HhZVtW15cP1sf8sn34ctlS56jv1sb8sXzr8JCCvt3Q8yz2uP8e7tJ/lHuOf8720n+Ue878+9p/l5XIpXWr6Vx/7y/Lh7dS07VJ5few/y49L++uvj/1n+XT40fz6M95LY1kW/0tz/4z30liWxb/4bz0BM95LW1kW/0tr/v+J99KY+H//GZD93/7fOgDzfr+0lWX3/+vufzclAPImpyx+WW49+KX+HOQy+Fnu0X4+5JaH3yz3aD83+bL5Z7lH+3m9I64/x3vE+Od8HzH/8yG/PPxnucf45yZfHv6z3KP9fMgvD/9Z7tF+PuSXh/8s92g/413891//xf/7Q774F/95P9Bj/bP/v9/k2//t/3k/0CP+Mt7d//d//s37/Xvj308AekSMNggQIECAAAECBAgQIECAwGABCYDBA6B5AgQIECBAgAABAgQIECDQQ+DuBEAeh+zR4bqNPA5Wv9ejnMdherRXt9H7+E/d/ujrHz3+o+d/Hgeqx6ZHuffx//qaeh//r9vvffy/bl/8LzVJ17L4f/85QFf4vxoT/8sI9lub9v/2/82rG/ZPXtj/338O8ROe5v9k/2//3zz7aBDd/983/+9OAHw0ON4jQIAAAQIECBAgQIAAAQIE5hCQAJhjHPSCAAECBAgQIECAAAECBAg0FZAAaMqrcgIECBAgQIAAAQIECBAgMIeABMAc46AXBAgQIECAAAECBAgQIECgqYAEQFNelRMgQIAAAQIECBAgQIAAgTkEJADmGAe9IECAAAECBAgQIECAAAECTQUkAJryqpwAAQIECBAgQIAAAQIECMwhIAEwxzjoBQECBAgQIECAAAECBAgQaCogAdCUV+UECBAgQIAAAQIECBAgQGAOAQmAOcZBLwgQIECAAAECBAgQIECAQFMBCYCmvConQIAAAQIECBAgQIAAAQJzCEgAzDEOekGAAAECBAgQIECAAAECBJoKfHt6emrawGeVv7y8fPaRpu+7fuPfdIJ9Urn5L/4/mSJN37b+Wf+aTrBPKrf+Wf8+mSJN37b+Wf+aTrBPKrf+Wf8+mSJN33YCoCmvygkQIECAAAECBAgQIECAwBwCEgBzjINeECBAgAABAgQIECBAgACBpgISAE15VU6AAAECBAgQIECAAAECBOYQkACYYxz0ggABAgQIECBAgAABAgQINBWQAGjKq3ICBAgQIECAAAECBAgQIDCHgATAHOOgFwQIECBAgAABAgQIECBAoKmABEBTXpUTIECAAAECBAgQIECAAIE5BCQA5hgHvSBAgAABAgQIECBAgAABAk0FJACa8qqcAAECBAgQIECAAAECBAjMISABMMc46AUBAgQIECBAgAABAgQIEGgqIAHQlFflBAgQIECAAAECBAgQIEBgDoG7EwCv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" + } + ] +} diff --git a/lyra-resource/test_files/gltf/texture-sep/Green.png b/lyra-resource/test_files/gltf/texture-sep/Green.png new file mode 100644 index 0000000..fd1076e Binary files /dev/null and b/lyra-resource/test_files/gltf/texture-sep/Green.png differ diff --git a/lyra-resource/test_files/gltf/texture-sep/texture-sep.bin b/lyra-resource/test_files/gltf/texture-sep/texture-sep.bin new file mode 100644 index 0000000..9322438 Binary files /dev/null and b/lyra-resource/test_files/gltf/texture-sep/texture-sep.bin differ diff --git a/lyra-resource/test_files/gltf/texture-sep/texture-sep.gltf b/lyra-resource/test_files/gltf/texture-sep/texture-sep.gltf new file mode 100644 index 0000000..8e9d366 --- /dev/null +++ b/lyra-resource/test_files/gltf/texture-sep/texture-sep.gltf @@ -0,0 +1,137 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v3.6.6", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "TEXCOORD_0":1, + "NORMAL":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"uvgrid", + "uri":"uvgrid.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":480, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"texture-sep.bin" + } + ] +} diff --git a/lyra-resource/test_files/gltf/texture-sep/uvgrid.png b/lyra-resource/test_files/gltf/texture-sep/uvgrid.png new file mode 100644 index 0000000..06aad7c Binary files /dev/null and b/lyra-resource/test_files/gltf/texture-sep/uvgrid.png differ diff --git a/src/render/renderer.rs b/src/render/renderer.rs index f51bde1..345a303 100755 --- a/src/render/renderer.rs +++ b/src/render/renderer.rs @@ -21,6 +21,7 @@ use crate::ecs::components::transform::TransformComponent; use super::camera::RenderCamera; use super::desc_buf_lay::DescVertexBufferLayout; use super::texture::RenderTexture; +use super::vertex::Vertex; use super::{render_pipeline::FullRenderPipeline, render_buffer::BufferStorage, render_job::RenderJob}; use lyra_resource::Mesh; @@ -443,15 +444,26 @@ impl BasicRenderer { } fn create_vertex_index_buffers(&mut self, mesh: &Mesh) -> (BufferStorage, Option<(wgpu::IndexFormat, BufferStorage)>) { - let vertices = mesh.position().unwrap(); + let positions = mesh.position().unwrap(); + let tex_coords: Vec = mesh.tex_coords().cloned() + .unwrap_or_else(|| vec![glam::Vec2::new(0.0, 0.0); positions.len()]); + + debug!("Pos count: {}, tex coords count: {}", positions.len(), tex_coords.len()); + assert!(positions.len() == tex_coords.len()); + + let vertex_inputs: Vec = std::iter::zip(positions, tex_coords.into_iter()) + .map(|(v, t)| Vertex::new(v.clone(), t)) + .collect(); + println!("Vertex inputs: {:?}", vertex_inputs.as_slice()); + let vertex_buffer = self.device.create_buffer_init( &wgpu::util::BufferInitDescriptor { label: Some("Vertex Buffer"), - contents: bytemuck::cast_slice(vertices.as_slice()), + contents: bytemuck::cast_slice(vertex_inputs.as_slice()),//vertex_combined.as_slice(), usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages:: COPY_DST, } ); - let vertex_buffer = BufferStorage::new(vertex_buffer, 0, vertices.len()); + let vertex_buffer = BufferStorage::new(vertex_buffer, 0, vertex_inputs.len()); let indices = match mesh.indices.as_ref() { Some(indices) => { @@ -483,7 +495,7 @@ impl BasicRenderer { fn create_mesh_buffers(&mut self, mesh: &Mesh, transform_indices: TransformBufferIndices) -> RenderBufferStorage { let (vertex_buffer, buffer_indices) = self.create_vertex_index_buffers(mesh); - let diffuse_bindgroup = if let Some(model_texture) = &mesh.material().texture { + let diffuse_bindgroup = if let Some(model_texture) = &mesh.material().base_color_texture { let image = &model_texture.data.as_ref().unwrap().image; let diffuse_texture = RenderTexture::from_image(&self.device, &self.queue, image, None).unwrap(); diff --git a/src/render/shaders/base.wgsl b/src/render/shaders/base.wgsl index 6361232..c8e6ce1 100755 --- a/src/render/shaders/base.wgsl +++ b/src/render/shaders/base.wgsl @@ -2,7 +2,7 @@ struct VertexInput { @location(0) position: vec3, - //@location(1) tex_coords: vec2, + @location(1) tex_coords: vec2, } struct VertexOutput { @@ -25,7 +25,7 @@ fn vs_main( model: VertexInput, ) -> VertexOutput { var out: VertexOutput; - out.tex_coords = vec2(1.0, 1.0); + out.tex_coords = model.tex_coords; out.clip_position = camera.view_proj * u_model_transform * vec4(model.position, 1.0); return out; } diff --git a/src/render/vertex.rs b/src/render/vertex.rs index 0f18f77..2b53e9d 100755 --- a/src/render/vertex.rs +++ b/src/render/vertex.rs @@ -1,31 +1,37 @@ -use glam::Vec3; - use super::desc_buf_lay::DescVertexBufferLayout; #[repr(C)] #[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] pub struct Vertex { - pub position: [f32; 3], + pub position: glam::Vec3, + pub tex_coords: glam::Vec2 //pub color: [f32; 3], // TODO: add color again - //pub tex_coords: [f32; 2] +} + +impl Vertex { + pub fn new(position: glam::Vec3, tex_coords: glam::Vec2) -> Self { + Self { + position, tex_coords + } + } } impl DescVertexBufferLayout for Vertex { fn desc<'a>() -> wgpu::VertexBufferLayout<'a> { wgpu::VertexBufferLayout { - array_stride: std::mem::size_of::() as wgpu::BufferAddress, + array_stride: std::mem::size_of::() as wgpu::BufferAddress, step_mode: wgpu::VertexStepMode::Vertex, attributes: &[ wgpu::VertexAttribute { offset: 0, shader_location: 0, - format: wgpu::VertexFormat::Float32x3, + format: wgpu::VertexFormat::Float32x3, // Vec3 }, - /* wgpu::VertexAttribute { + wgpu::VertexAttribute { offset: std::mem::size_of::<[f32; 3]>() as wgpu::BufferAddress, shader_location: 1, - format: wgpu::VertexFormat::Float32x2, - } */ + format: wgpu::VertexFormat::Float32x2, // Vec2 + } ] } }