| 80 | namespace mesh_resource_internal |
| 81 | { |
| 82 | void *load(File &file, Allocator &a) |
| 83 | { |
| 84 | BinaryReader br(file); |
| 85 | |
| 86 | u32 version; |
| 87 | br.read(version); |
| 88 | CE_ASSERT(version == RESOURCE_HEADER(RESOURCE_VERSION_MESH), "Wrong version"); |
| 89 | |
| 90 | u32 num_geoms; |
| 91 | br.read(num_geoms); |
| 92 | |
| 93 | MeshResource *mr = CE_NEW(a, MeshResource)(a); |
| 94 | |
| 95 | for (u32 i = 0; i < num_geoms; ++i) { |
| 96 | u32 num_names; |
| 97 | br.read(num_names); |
| 98 | |
| 99 | for (u32 j = 0; j < num_names; ++j) { |
| 100 | StringId32 name; |
| 101 | br.read(name); |
| 102 | |
| 103 | array::push_back(mr->nodes, { name, i }); |
| 104 | } |
| 105 | |
| 106 | bgfx::VertexLayout layout; |
| 107 | BgfxReader reader(br); |
| 108 | bgfx::read(&reader, layout); |
| 109 | |
| 110 | OBB obb; |
| 111 | br.read(obb); |
| 112 | |
| 113 | Sphere sphere; |
| 114 | br.read(sphere); |
| 115 | |
| 116 | u32 num_verts; |
| 117 | br.read(num_verts); |
| 118 | |
| 119 | u32 stride; |
| 120 | br.read(stride); |
| 121 | |
| 122 | u32 num_inds; |
| 123 | br.read(num_inds); |
| 124 | |
| 125 | const u32 vsize = num_verts*stride; |
| 126 | const u32 isize = num_inds*sizeof(u16); |
| 127 | |
| 128 | const u32 size = sizeof(MeshGeometry) + vsize + isize; |
| 129 | |
| 130 | MeshGeometry *mg = (MeshGeometry *)a.allocate(size); |
| 131 | mg->obb = obb; |
| 132 | mg->sphere = sphere; |
| 133 | mg->layout = layout; |
| 134 | mg->vertex_buffer = BGFX_INVALID_HANDLE; |
| 135 | mg->index_buffer = BGFX_INVALID_HANDLE; |
| 136 | mg->vertices.num = num_verts; |
| 137 | mg->vertices.stride = stride; |
| 138 | mg->vertices.data = (char *)&mg[1]; |
| 139 | mg->indices.num = num_inds; |
no test coverage detected