Welcome to mirror list, hosted at ThFree Co, Russian Federation.

GeometryExporter.h « collada « io « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 70e39f5bcd48ca0e41f9bc7fc836c3c0e8492e7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* SPDX-License-Identifier: GPL-2.0-or-later */

/** \file
 * \ingroup collada
 */

#pragma once

#include <set>
#include <string>
#include <vector>

#include "COLLADASWInputList.h"
#include "COLLADASWLibraryGeometries.h"
#include "COLLADASWStreamWriter.h"

#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"

#include "BKE_key.h"
#include "BlenderContext.h"
#include "ExportSettings.h"
#include "collada_utils.h"

class Normal {
 public:
  float x;
  float y;
  float z;

  friend bool operator<(const Normal &, const Normal &);
};

bool operator<(const Normal &, const Normal &);

/* TODO: optimize UV sets by making indexed list with duplicates removed */
class GeometryExporter : COLLADASW::LibraryGeometries {
  struct Face {
    unsigned int v1, v2, v3, v4;
  };

 public:
  /* TODO: optimize UV sets by making indexed list with duplicates removed */
  GeometryExporter(BlenderContext &blender_context,
                   COLLADASW::StreamWriter *sw,
                   BCExportSettings &export_settings)
      : COLLADASW::LibraryGeometries(sw),
        blender_context(blender_context),
        export_settings(export_settings)
  {
  }

  void exportGeom();

  void operator()(Object *ob);

  void createLooseEdgeList(Object *ob, Mesh *me, std::string &geom_id);

  /** Powerful because it handles both cases when there is material and when there's not. */
  void create_mesh_primitive_list(short material_index,
                                  bool has_uvs,
                                  bool has_color,
                                  Object *ob,
                                  Mesh *me,
                                  std::string &geom_id,
                                  std::vector<BCPolygonNormalsIndices> &norind);

  /** Creates <source> for positions. */
  void createVertsSource(std::string geom_id, Mesh *me);

  void createVertexColorSource(std::string geom_id, Mesh *me);

  std::string makeTexcoordSourceId(std::string &geom_id, int layer_index, bool is_single_layer);

  /** Creates <source> for texcoords. */
  void createTexcoordsSource(std::string geom_id, Mesh *me);

  /** Creates <source> for normals. */
  void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal> &nor);

  void create_normals(std::vector<Normal> &nor,
                      std::vector<BCPolygonNormalsIndices> &polygons_normals,
                      Mesh *me);

  std::string getIdBySemantics(std::string geom_id,
                               COLLADASW::InputSemantic::Semantics type,
                               std::string other_suffix = "");
  std::string makeVertexColorSourceId(std::string &geom_id, char *layer_name);

  COLLADASW::URI getUrlBySemantics(std::string geom_id,
                                   COLLADASW::InputSemantic::Semantics type,
                                   std::string other_suffix = "");

  COLLADASW::URI makeUrl(std::string id);

  void export_key_mesh(Object *ob, Mesh *me, KeyBlock *kb);

 private:
  std::set<std::string> exportedGeometry;
  BlenderContext &blender_context;
  BCExportSettings &export_settings;

  Mesh *get_mesh(Scene *sce, Object *ob, int apply_modifiers);
};

struct GeometryFunctor {
  /* f should have
   * void operator()(Object *ob) */
  template<class Functor>
  void forEachMeshObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set)
  {
    LinkNode *node;
    for (node = export_set; node; node = node->next) {
      Object *ob = (Object *)node->link;
      if (ob->type == OB_MESH) {
        f(ob);
      }
    }
  }
};