Jackalope / jrf (public) (License: GPLv3 or later version) (since 2019-11-21) (hash sha1)
Libriary for reading and writing resource files: vertices, indices, meshes, images, models and scene data.
Supports reading from filesystem as well as from zip files.
It uses unique binary container format for those resources.
It is used in tool for converting popular formats like wavefront .obj file, TARGA image to this container and also used in resource loader as part of graphics framework.

It requires jlib libriary (see my user repositories) and libzip.
It is possible to remove libzip dependency.
List of commits:
Subject Hash Author Date (UTC)
vertex attributes is separated, not inteleaved now d3e7b79c74e9fae7b8b788d1a55db2e664feb107 jp.larry 2019-12-26 01:19:17
compiled on windows with mingw 51eacaf02dd542415cea1edd615d88234fb5b344 Jackalope 2019-12-15 07:05:58
added mesh to read and write functions 173144a8516441420feb4327a66d26fa3f57376d Your Name 2019-12-07 22:09:04
warning hidden by implicit cast f49b32439aa1e8719bd340da9fc3bb7e9b906d0d Your Name 2019-12-07 21:01:08
Vertices have vertices count value cf3b63932cdcdb88b72e70df93a4dd8b478d163b jp.larry 2019-12-07 16:02:55
removed IndicesArrays, added Mesh resource and Vertices attributes is not dynamically allocated a54a61cfc285bbec4246b1affdc5fe9251c059d0 jp.larry 2019-12-06 17:04:06
new obj file error f4385161fdd1ad8038e2d0924e1d3de2a6506cc9 Your Name 2019-12-01 10:26:18
scene issues solved cef4ba84d44cbdc6690c87e553df9fbfba60059f Your Name 2019-12-01 04:19:29
changed transformation matrix to 4x4 from 3x3 5b5728dabefb471cf126bf4b524f5079a14c0735 Your Name 2019-11-30 15:16:50
added missing return 94644ed6f61207f664ac4675fa015afbe017ddea jp.larry 2019-11-29 09:03:14
scene improvements, changed shift type to unsigned, set default-value funtions, model must be path a2708b94b88eb0ede73b9aab396e7a13f13baa52 Your Name 2019-11-29 09:27:32
separate function for str reading 9127f9a18f9f4974975fa35d58f596952b6aa4e5 Your Name 2019-11-29 09:26:43
new result errors ef56e017e2e761fdf23c6a64ed33277c98569e13 Your Name 2019-11-29 09:26:12
new types for Scene e2fde0d2b66e125ba3bfd86b8f51c81ecb5ab047 Your Name 2019-11-29 00:38:27
shift scale added to Scene 974752944e73bbc2949ff399ab9d806baeeab751 Your Name 2019-11-29 00:38:06
new resource type - scene - list of models f3eea43135dad8b3e24cf6683e5abc1a5e2e57ad Your Name 2019-11-28 07:59:59
model correctly handling error returns 3df9ec0f9abed56709b8b9556a5291217ad8744d Your Name 2019-11-28 07:59:25
updated jlib 2a28ba18170dc757f7bad931a12a34ee3e7e1c46 Your Name 2019-11-27 03:44:11
replaced free with jl::deallocate ab8d6cb89f814227c280797dbe654971a85264a6 Your Name 2019-11-25 07:29:05
second initial commit fb7a7e999477c84f10b3d618f6b00347fd0a9ca7 Your Name 2019-11-23 01:38:14
Commit d3e7b79c74e9fae7b8b788d1a55db2e664feb107 - vertex attributes is separated, not inteleaved now
Author: jp.larry
Author date (UTC): 2019-12-26 01:19
Committer name: jp.larry
Committer date (UTC): 2019-12-26 01:19
Parent(s): 51eacaf02dd542415cea1edd615d88234fb5b344
Signing key:
Tree: 7bde4e37222b31e511f32d77a2ae7b0a477cd78f
File Lines added Lines deleted
include/jrf/result.h 2 2
include/jrf/vertices.h 76 77
src/result.cpp 1 1
File include/jrf/result.h changed (mode: 100644) (index 7006816..2760e92)
... ... namespace jrf
28 28
29 29 enum class ResourceMode : uint8_t { NONE, DATA, PATH }; enum class ResourceMode : uint8_t { NONE, DATA, PATH };
30 30
31 enum Result
31 enum [[nodiscard]] Result
32 32 { {
33 33 SUCCESS, SUCCESS,
34 34 SRC_MTIME_LESS_THAN_JRF, SRC_MTIME_LESS_THAN_JRF,
 
... ... namespace jrf
85 85 //indices //indices
86 86 INDEX_VALUE_OVERFLOW, INDEX_VALUE_OVERFLOW,
87 87 //vertices //vertices
88 ATTRIBUTE_VERTICES_COUNT_MISMATCH,
88 VERTICES_ATTRIBUTE_COUNT_MISMATCH,
89 89 }; };
90 90
91 91 const char* to_str(Result result); const char* to_str(Result result);
File include/jrf/vertices.h changed (mode: 100644) (index 9ec76b3..21794c0)
8 8
9 9 namespace jrf namespace jrf
10 10 { {
11 struct Vertices
12 {
13 enum Format : uint8_t {
14 F16, F32, F64,
15 I8, I16, I32, I64,
16 U8, U16, U32, U64
17 };
18
19 constexpr static const uint8_t FORMAT_SIZE[] = {
20 2, 4, 8,
21 1, 2, 4, 8,
22 1, 2, 4, 8
23 };
24
25 struct Attribute
11 struct Vertices
12 {
13 enum Format : uint16_t {
14 F16, F32, F64,
15 I8, I16, I32, I64,
16 U8, U16, U32, U64
17 };
18
19 constexpr static const uint8_t FORMAT_SIZE[] = {
20 2, 4, 8,
21 1, 2, 4, 8,
22 1, 2, 4, 8
23 };
24
25 enum AttributeType {
26 POSITION, TEXTURE_COORDINATE, NORMAL,
27 RESERVED_BEGIN,
28 RESERVED_COUNT = 16
29 };
30 static_assert (RESERVED_BEGIN < RESERVED_COUNT);
31 constexpr static const uint8_t ATTRIBUTE_COUNT = RESERVED_COUNT;
32
33 struct Attribute {
34 uint32_t offset;
35 uint16_t dimension_count;
36 Format format;
37 };
38 using Attributes = jl::array<Attribute, ATTRIBUTE_COUNT>;
39
40 Attributes attributes;
41 uint64_t vecs_count;
42 uint64_t vecs_size;
43 void *p_vecs;
44
45 void destroy() { jl::deallocate(&p_vecs); }
46
47 template<typename IO = jl::io_agent>
48 [[nodiscard]] Result read(IO *p_mediator)
49 {
50 auto *p_io = jl::io_agent_p_alt_cast(p_mediator);\
51
52 if (not p_io->read_items(&attributes))
53 return Result::MEDIATOR_ERROR;
54
55 if (not p_io->read_items(&vecs_size))
56 return Result::MEDIATOR_ERROR;
57
58 if (not p_io->read_items(&vecs_count))
59 return Result::MEDIATOR_ERROR;
60
61 if (vecs_size == 0)
62 p_vecs = nullptr;
63 else
26 64 { {
27 uint8_t dimention_count;
28 Format format;
29 };
30
31 constexpr static const uint8_t MAX_ATTR_COUNT = 8;
32
33 jl::array<Attribute, MAX_ATTR_COUNT> attributes;
34 uint16_t attr_count;
35 uint64_t vecs_count;
36 uint64_t vecs_size;
37 void *p_vecs;
38
39 void destroy() {
40 jl::deallocate(&p_vecs);
41 }
42
43 template<typename IO = jl::io_agent>
44 [[nodiscard]] Result read(IO *p_mediator)
45 {
46 auto *p_io = jl::io_agent_p_alt_cast(p_mediator);
47 if (not p_io->read_items(&attr_count))
48 return Result::MEDIATOR_ERROR;
49
50 if (attr_count != 0)
51 if (not p_io->read_items(&attributes))
52 return Result::MEDIATOR_ERROR;
53
54 if (not p_io->read_items(&vecs_size))
55 return Result::MEDIATOR_ERROR;
56
57 if (not p_io->read_items(&vecs_count))
58 return Result::MEDIATOR_ERROR;
59
60 if (vecs_size == 0)
61 p_vecs = nullptr;
62 else
63 {
64 if (not jl::allocate_bytes(&p_vecs, vecs_size))
65 return Result::MEDIATOR_ERROR;
66 if (not p_io->read_bytes(p_vecs, vecs_size))
67 return this->destroy(), Result::MEDIATOR_ERROR;
68 }
69
70 return Result::SUCCESS;
65 if (not jl::allocate_bytes(&p_vecs, vecs_size))
66 return Result::MEDIATOR_ERROR;
67 if (not p_io->read_bytes(p_vecs, vecs_size))
68 return this->destroy(), Result::MEDIATOR_ERROR;
71 69 } }
72 70
73 template<typename IO = jl::io_agent>
74 [[nodiscard]] Result write(IO *p_mediator) const
75 {
76 auto *p_io = jl::io_agent_p_alt_cast(p_mediator);
77 if (not p_io->write_items(&attr_count))
78 return Result::MEDIATOR_ERROR;
79 if (not p_io->write_items(&attributes))
80 return Result::MEDIATOR_ERROR;
81 if (not p_io->write_items(&vecs_size))
82 return Result::MEDIATOR_ERROR;
83 if (not p_io->write_items(&vecs_count))
84 return Result::MEDIATOR_ERROR;
85 if (not p_io->write_bytes(p_vecs, vecs_size))
86 return Result::MEDIATOR_ERROR;
87
88 return Result::SUCCESS;
89 }
90 };
71 return Result::SUCCESS;
72 }
73
74 template<typename IO = jl::io_agent>
75 [[nodiscard]] Result write(IO *p_mediator) const
76 {
77 auto *p_io = jl::io_agent_p_alt_cast(p_mediator);
78 if (not p_io->write_items(&attributes))
79 return Result::MEDIATOR_ERROR;
80 if (not p_io->write_items(&vecs_size))
81 return Result::MEDIATOR_ERROR;
82 if (not p_io->write_items(&vecs_count))
83 return Result::MEDIATOR_ERROR;
84 if (not p_io->write_bytes(p_vecs, vecs_size))
85 return Result::MEDIATOR_ERROR;
86
87 return Result::SUCCESS;
88 }
89 };
91 90 } }
File src/result.cpp changed (mode: 100644) (index b53df30..1ac09c8)
... ... const char* jrf::to_str(jrf::Result result)
61 61 //indices //indices
62 62 STR(INDEX_VALUE_OVERFLOW) STR(INDEX_VALUE_OVERFLOW)
63 63 //vertices //vertices
64 STR(ATTRIBUTE_VERTICES_COUNT_MISMATCH)
64 STR(VERTICES_ATTRIBUTE_COUNT_MISMATCH)
65 65 } }
66 66 return "unknown error"; return "unknown error";
67 67 #undef STR #undef STR
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/Jackalope/jrf

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/Jackalope/jrf

Clone this repository using git:
git clone git://git.rocketgit.com/user/Jackalope/jrf

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main