| 472 | } |
| 473 | |
| 474 | s32 write(Mesh &m, CompileOptions &opts) |
| 475 | { |
| 476 | TempAllocator4096 ta; |
| 477 | bool calculate_tangents = true; |
| 478 | DynamicString importer_settings(ta); |
| 479 | importer_settings.set(opts.source_path(), u32(strrchr(opts.source_path(), '.') - opts.source_path())); |
| 480 | importer_settings += ".importer_settings"; |
| 481 | Buffer settings_buf = opts.read_optional(importer_settings.c_str()); |
| 482 | JsonObject settings(ta); |
| 483 | RETURN_IF_ERROR(sjson::parse(settings, settings_buf)); |
| 484 | |
| 485 | if (json_object::has(settings, "tangents")) { |
| 486 | DynamicString tangents(ta); |
| 487 | RETURN_IF_ERROR(sjson::parse_string(tangents, settings["tangents"])); |
| 488 | calculate_tangents = tangents == "calculate"; |
| 489 | } |
| 490 | |
| 491 | opts.write(RESOURCE_HEADER(RESOURCE_VERSION_MESH)); |
| 492 | opts.write(hash_map::size(m._geometries)); |
| 493 | |
| 494 | auto cur = hash_map::begin(m._geometries); |
| 495 | auto end = hash_map::end(m._geometries); |
| 496 | for (; cur != end; ++cur) { |
| 497 | HASH_MAP_SKIP_HOLE(m._geometries, cur); |
| 498 | |
| 499 | Vector<DynamicString> geo_names(default_allocator()); |
| 500 | geometry_names(geo_names, m, cur->first); |
| 501 | u32 num_geo_names = vector::size(geo_names); |
| 502 | |
| 503 | opts.write(num_geo_names); |
| 504 | for (u32 i = 0; i < num_geo_names; ++i) |
| 505 | opts.write(geo_names[i].to_string_id()._id); |
| 506 | |
| 507 | Geometry *geo = (Geometry *)&cur->second; |
| 508 | if (calculate_tangents) |
| 509 | generate_tangent_space(*geo); |
| 510 | ENSURE_OR_RETURN(MESH, mesh::generate_vertex_and_index_buffers(*geo, opts) == 0, opts); |
| 511 | |
| 512 | bgfx::VertexLayout layout = mesh::vertex_layout(*geo); |
| 513 | u32 stride = mesh::vertex_stride(*geo); |
| 514 | |
| 515 | BgfxWriter writer(opts._binary_writer); |
| 516 | bgfx::write(&writer, layout); |
| 517 | opts.write(mesh::obb(*geo)); |
| 518 | opts.write(mesh::sphere(*geo)); |
| 519 | |
| 520 | opts.write(array::size(geo->_vertex_buffer) / stride); |
| 521 | opts.write(stride); |
| 522 | opts.write(array::size(geo->_index_buffer)); |
| 523 | |
| 524 | opts.write(geo->_vertex_buffer); |
| 525 | opts.write(array::begin(geo->_index_buffer), array::size(geo->_index_buffer) * sizeof(u16)); |
| 526 | } |
| 527 | |
| 528 | return 0; |
| 529 | } |
| 530 | |
| 531 | static s32 parse_internal(Mesh &m, Buffer &buf, CompileOptions &opts) |
no test coverage detected