From a7e6209791c25eff9ba2374de005dbeb3fe7379c Mon Sep 17 00:00:00 2001 From: utkumaden Date: Thu, 7 Dec 2023 19:09:25 +0300 Subject: [PATCH] patterns: Added gITF pattern(#205) * Create gltf.hexpat Added glTF binary file pattern. * Add a test file for the glTF pattern. * Renamed the test file to fit the pattern file name. * Fixed typo in documentation. --- patterns/gltf.hexpat | 66 +++++++++++++++++++++++ tests/patterns/test_data/gltf.hexpat.glb | Bin 0 -> 1732 bytes 2 files changed, 66 insertions(+) create mode 100644 patterns/gltf.hexpat create mode 100644 tests/patterns/test_data/gltf.hexpat.glb diff --git a/patterns/gltf.hexpat b/patterns/gltf.hexpat new file mode 100644 index 0000000..bcd3fd0 --- /dev/null +++ b/patterns/gltf.hexpat @@ -0,0 +1,66 @@ +/** + * @file ImHex Pattern for glTF binary files. + * + * Copyright (c) 2023 H. Utku Maden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include + +/** + * @brief The glTF magic section. + */ +struct gltf_magic_t { + char magic[4]; /**< The magic value. Must be "glTF" */ + u32 version; /**< The version. Must be 2 for glTF 2.0. */ + u32 length; /**< Length of the file in bytes, including magic section. */ +}; + +/** + * @brief Enumeration of well defined glTF chunks. + */ +enum gltf_chunk_type_t : u32 { + JSON = 1313821514 /* "JSON" */, /**< JSON chunk. */ + BIN = 5130562 /* "BIN\0" */, /**< Binary data chunk. Could be an image or model data. */ +}; + +/** + * @brief A glTF chunk. + */ +struct gltf_chunk_t { + u32 length; /**< Length of this chunk. */ + gltf_chunk_type_t type [[format("gltf_format")]]; /**< Type of the chunk. JSON or BIN expected. */ + u8 string[length]; /**< The chunk data. */ +}; + +fn gltf_format(gltf_chunk_type_t x) +{ + if (x == gltf_chunk_type_t::JSON) return "JSON"; + else if (x == gltf_chunk_type_t::BIN) return "BIN"; + + return ""; +}; + +gltf_magic_t magic @ 0x00; +gltf_chunk_t chunks[while(!std::mem::eof())] @ $; + +if (magic.magic != "glTF") + std::error("This file might not be a glTF file, expected \"glTF\", got %s", magic.magic); diff --git a/tests/patterns/test_data/gltf.hexpat.glb b/tests/patterns/test_data/gltf.hexpat.glb new file mode 100644 index 0000000000000000000000000000000000000000..f1d3b1d035e53e4ba56359c74402a0c6e220729e GIT binary patch literal 1732 zcmb7DTXWJt6h8K*)q1H~eP#AJViM?$2bE$SQ6vs9oz8SR5@4a3DM=>@Xoq2je})hK zFwZ&NZ6i>q3pv;CJA3wI(>bqwS^|JSYXJ3SfG<_2JP>Xa$ynqDq9c77x^WPSocMYc z27VBwI!H+!oJ+qY!&LFDlj>*FW;&Y@hUm*M@&X^hcG?s}Lqtt1AabU%B9S{82;c2u zOjJ2%2tQ~^N|>j^(;IIfx-vRrs=^m~4Jimh31(cEqEy;6Eo|W;^txW`^%cO41Jj<1&^d z>33p$t@hrYAt>Oq+kDsXio|Z%p=+1P?(g7R(4$z)bdWply*okP z-NADt$#`S1Jl_yCfW)cyvL;@r&-k4k6wCP4jmGMEzrd!v#@uF)6E$wLbq&hTvUQB~ zJX`1I>9OiZ*CBt>);{T3_85mmYs8Z0rELx?4rdic$FDWUY0kXRrp5ksJ!MSHQ~vh)KpLNlA3VjPwHh@$HY3U!2@^*TPU~S1-yjUu!(XL gp1@;x3M(jAU