/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** \file * \ingroup obj */ #pragma once #include #include "BLI_float3.hh" #include "BLI_utility_mixins.hh" #include "BLI_vector.hh" #include "bmesh.h" #include "bmesh_tools.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "IO_wavefront_obj.h" namespace blender::io::obj { /* Denote absence for usually non-negative numbers. */ const int NOT_FOUND = -1; /* Any negative number other than `NOT_FOUND` to initialise usually non-negative numbers. */ const int NEGATIVE_INIT = -10; /** * #std::unique_ptr deleter for BMesh. */ struct CustomBMeshDeleter { void operator()(BMesh *bmesh) { if (bmesh) { BM_mesh_free(bmesh); } } }; using unique_bmesh_ptr = std::unique_ptr; class OBJMesh : NonCopyable { private: Object *export_object_eval_; Mesh *export_mesh_eval_; /** * For curves which are converted to mesh, and triangulated meshes, a new mesh is allocated. */ bool mesh_eval_needs_free_ = false; /** * Final transform of an object obtained from export settings (up_axis, forward_axis) and the * object's world transform matrix. */ float world_and_axes_transform_[4][4]; /** * Total UV vertices in a mesh's texture map. */ int tot_uv_vertices_ = 0; /** * Per-polygon-per-vertex UV vertex indices. */ Vector> uv_indices_; /** * Total smooth groups in an object. */ int tot_smooth_groups_ = NEGATIVE_INIT; /** * Polygon aligned array of their smooth groups. */ int *poly_smooth_groups_ = nullptr; public: OBJMesh(Depsgraph *depsgraph, const OBJExportParams &export_params, Object *mesh_object); ~OBJMesh(); int tot_vertices() const; int tot_polygons() const; int tot_uv_vertices() const; int tot_edges() const; int16_t tot_materials() const; const Material *get_object_material(const int16_t mat_nr) const; int16_t ith_poly_matnr(const int poly_index) const; void ensure_mesh_normals() const; void ensure_mesh_edges() const; void calc_smooth_groups(const bool use_bitflags); int ith_smooth_group(const int poly_index) const; bool is_ith_poly_smooth(const int poly_index) const; const char *get_object_name() const; const char *get_object_mesh_name() const; const char *get_object_material_name(const int16_t mat_nr) const; float3 calc_vertex_coords(const int vert_index, const float scaling_factor) const; Vector calc_poly_vertex_indices(const int poly_index) const; void store_uv_coords_and_indices(Vector> &r_uv_coords); Span calc_poly_uv_indices(const int poly_index) const; float3 calc_poly_normal(const int poly_index) const; std::pair> calc_poly_normal_indices(const int poly_index, const int object_tot_prev_normals) const; void calc_loop_normals(const int poly_index, Vector &r_loop_normals) const; int16_t get_poly_deform_group_index(const int poly_index) const; const char *get_poly_deform_group_name(const int16_t def_group_index) const; std::optional> calc_loose_edge_vert_indices(const int edge_index) const; private: void free_mesh_if_needed(); std::pair triangulate_mesh_eval(); void set_world_axes_transform(const eTransformAxisForward forward, const eTransformAxisUp up); }; } // namespace blender::io::obj