Blender  V3.3
obj_export_file_writer.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #pragma once
8 
9 #include "DNA_meshdata_types.h"
10 
11 #include "BLI_map.hh"
12 #include "BLI_set.hh"
13 #include "BLI_vector.hh"
14 
15 #include "IO_wavefront_obj.h"
16 #include "obj_export_io.hh"
17 #include "obj_export_mtl.hh"
18 
19 namespace blender::io::obj {
20 
21 class OBJCurve;
22 class OBJMesh;
27 struct IndexOffsets {
31 };
32 
37  private:
38  const OBJExportParams &export_params_;
39  std::string outfile_path_;
40  FILE *outfile_;
41 
42  public:
43  OBJWriter(const char *filepath, const OBJExportParams &export_params) noexcept(false)
44  : export_params_(export_params), outfile_path_(filepath), outfile_(nullptr)
45  {
46  outfile_ = BLI_fopen(filepath, "wb");
47  if (!outfile_) {
48  throw std::system_error(errno, std::system_category(), "Cannot open file " + outfile_path_);
49  }
50  }
52  {
53  if (outfile_ && std::fclose(outfile_)) {
54  std::cerr << "Error: could not close the file '" << outfile_path_
55  << "' properly, it may be corrupted." << std::endl;
56  }
57  }
58 
59  FILE *get_outfile() const
60  {
61  return outfile_;
62  }
63 
64  void write_header() const;
65 
69  void write_object_name(FormatHandler<eFileType::OBJ> &fh, const OBJMesh &obj_mesh_data) const;
73  void write_mtllib_name(const StringRefNull mtl_filepath) const;
78  const OBJMesh &obj_mesh_data,
79  bool write_colors) const;
84  void write_uv_coords(FormatHandler<eFileType::OBJ> &fh, OBJMesh &obj_mesh_data) const;
98  const IndexOffsets &offsets,
99  const OBJMesh &obj_mesh_data,
100  std::function<const char *(int)> matname_fn);
105  const IndexOffsets &offsets,
106  const OBJMesh &obj_mesh_data) const;
110  void write_nurbs_curve(FormatHandler<eFileType::OBJ> &fh, const OBJCurve &obj_nurbs_data) const;
111 
112  private:
113  using func_vert_uv_normal_indices = void (OBJWriter::*)(FormatHandler<eFileType::OBJ> &fh,
114  const IndexOffsets &offsets,
115  Span<int> vert_indices,
116  Span<int> uv_indices,
117  Span<int> normal_indices,
118  bool flip) const;
122  func_vert_uv_normal_indices get_poly_element_writer(int total_uv_vertices) const;
123 
127  void write_vert_uv_normal_indices(FormatHandler<eFileType::OBJ> &fh,
128  const IndexOffsets &offsets,
129  Span<int> vert_indices,
130  Span<int> uv_indices,
131  Span<int> normal_indices,
132  bool flip) const;
136  void write_vert_normal_indices(FormatHandler<eFileType::OBJ> &fh,
137  const IndexOffsets &offsets,
138  Span<int> vert_indices,
139  Span<int> /*uv_indices*/,
140  Span<int> normal_indices,
141  bool flip) const;
145  void write_vert_uv_indices(FormatHandler<eFileType::OBJ> &fh,
146  const IndexOffsets &offsets,
147  Span<int> vert_indices,
148  Span<int> uv_indices,
149  Span<int> /*normal_indices*/,
150  bool flip) const;
154  void write_vert_indices(FormatHandler<eFileType::OBJ> &fh,
155  const IndexOffsets &offsets,
156  Span<int> vert_indices,
157  Span<int> /*uv_indices*/,
158  Span<int> /*normal_indices*/,
159  bool flip) const;
160 };
161 
166  private:
167  FormatHandler<eFileType::MTL> fmt_handler_;
168  FILE *outfile_;
169  std::string mtl_filepath_;
170  Vector<MTLMaterial> mtlmaterials_;
171  /* Map from a Material* to an index into mtlmaterials_. */
172  Map<const Material *, int> material_map_;
173 
174  public:
175  /*
176  * Create the .MTL file.
177  */
178  MTLWriter(const char *obj_filepath) noexcept(false);
179  ~MTLWriter();
180 
181  void write_header(const char *blen_filepath);
187  void write_materials(const char *blen_filepath,
188  ePathReferenceMode path_mode,
189  const char *dest_dir);
199  Vector<int> add_materials(const OBJMesh &mesh_to_export);
200  const char *mtlmaterial_name(int index);
201 
202  private:
206  void write_bsdf_properties(const MTLMaterial &mtl_material);
210  void write_texture_map(const MTLMaterial &mtl_material,
212  const char *blen_filedir,
213  const char *dest_dir,
214  ePathReferenceMode mode,
215  Set<std::pair<std::string, std::string>> &copy_set);
216 };
217 } // namespace blender::io::obj
FILE * BLI_fopen(const char *filepath, const char *mode) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: fileops.c:906
ePathReferenceMode
MTLWriter(const char *obj_filepath) noexcept(false)
Vector< int > add_materials(const OBJMesh &mesh_to_export)
void write_header(const char *blen_filepath)
void write_materials(const char *blen_filepath, ePathReferenceMode path_mode, const char *dest_dir)
const char * mtlmaterial_name(int index)
void write_nurbs_curve(FormatHandler< eFileType::OBJ > &fh, const OBJCurve &obj_nurbs_data) const
OBJWriter(const char *filepath, const OBJExportParams &export_params) noexcept(false)
void write_poly_elements(FormatHandler< eFileType::OBJ > &fh, const IndexOffsets &offsets, const OBJMesh &obj_mesh_data, std::function< const char *(int)> matname_fn)
void write_mtllib_name(const StringRefNull mtl_filepath) const
void write_vertex_coords(FormatHandler< eFileType::OBJ > &fh, const OBJMesh &obj_mesh_data, bool write_colors) const
void write_uv_coords(FormatHandler< eFileType::OBJ > &fh, OBJMesh &obj_mesh_data) const
void write_edges_indices(FormatHandler< eFileType::OBJ > &fh, const IndexOffsets &offsets, const OBJMesh &obj_mesh_data) const
void write_object_name(FormatHandler< eFileType::OBJ > &fh, const OBJMesh &obj_mesh_data) const
void write_poly_normals(FormatHandler< eFileType::OBJ > &fh, OBJMesh &obj_mesh_data)
SyclQueue void void size_t num_bytes void