Merge branch 'blender2.7'
[blender.git] / source / blender / freestyle / intern / blender_interface / BlenderFileLoader.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 #ifndef __BLENDER_FILE_LOADER_H__
22 #define __BLENDER_FILE_LOADER_H__
23
24 /** \file blender/freestyle/intern/blender_interface/BlenderFileLoader.h
25  *  \ingroup freestyle
26  */
27
28 #include <string.h>
29 #include <float.h>
30
31 #include "../geometry/BBox.h"
32 #include "../geometry/Geom.h"
33 #include "../geometry/GeomCleaner.h"
34 #include "../geometry/GeomUtils.h"
35 #include "../scene_graph/IndexedFaceSet.h"
36 #include "../scene_graph/NodeGroup.h"
37 #include "../scene_graph/NodeTransform.h"
38 #include "../scene_graph/NodeShape.h"
39 #include "../system/FreestyleConfig.h"
40 #include "../system/RenderMonitor.h"
41
42 extern "C" {
43 #include "MEM_guardedalloc.h"
44
45 #include "DNA_material_types.h"
46 #include "DNA_mesh_types.h"
47 #include "DNA_meshdata_types.h"
48 #include "DNA_modifier_types.h"
49 #include "DNA_object_types.h"
50 #include "DNA_scene_types.h"
51
52 #include "render_types.h"
53
54 #include "BKE_customdata.h"
55 #include "BKE_library.h"
56 #include "BKE_material.h"
57 #include "BKE_mesh.h"
58 #include "BKE_scene.h"
59
60 #include "BLI_iterator.h"
61 #include "BLI_listbase.h"
62 #include "BLI_math.h"
63 }
64
65 #include "DEG_depsgraph_query.h"
66
67 #ifdef WITH_CXX_GUARDEDALLOC
68 #include "MEM_guardedalloc.h"
69 #endif
70
71 namespace Freestyle {
72
73 class NodeGroup;
74
75 struct LoaderState {
76         float *pv;
77         float *pn;
78         IndexedFaceSet::FaceEdgeMark *pm;
79         unsigned *pvi;
80         unsigned *pni;
81         unsigned *pmi;
82         unsigned currentIndex;
83         unsigned currentMIndex;
84         float minBBox[3];
85         float maxBBox[3];
86 };
87
88 class BlenderFileLoader
89 {
90 public:
91         /*! Builds a MaxFileLoader */
92         BlenderFileLoader(Render *re, ViewLayer *view_layer);
93         virtual ~BlenderFileLoader();
94
95         /*! Loads the 3D scene and returns a pointer to the scene root node */
96         NodeGroup *Load();
97
98         /*! Gets the number of read faces */
99         inline unsigned int numFacesRead() {return _numFacesRead;}
100
101 #if 0
102         /*! Gets the smallest edge size read */
103         inline real minEdgeSize() {return _minEdgeSize;}
104 #endif
105
106         /*! Modifiers */
107         inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;}
108
109 protected:
110         void insertShapeNode(Object *ob, Mesh *mesh, int id);
111         int testDegenerateTriangle(float v1[3], float v2[3], float v3[3]);
112         int countClippedFaces(float v1[3], float v2[3], float v3[3], int clip[3]);
113         void clipLine(float v1[3], float v2[3], float c[3], float z);
114         void clipTriangle(int numTris, float triCoords[][3], float v1[3], float v2[3], float v3[3],
115                           float triNormals[][3], float n1[3], float n2[3], float n3[3],
116                           bool edgeMarks[5], bool em1, bool em2, bool em3, int clip[3]);
117         void addTriangle(struct LoaderState *ls, float v1[3], float v2[3], float v3[3],
118                          float n1[3], float n2[3], float n3[3], bool fm, bool em1, bool em2, bool em3);
119
120 protected:
121         struct detri_t {
122                 unsigned viA, viB, viP; // 0 <= viA, viB, viP < viSize
123                 Vec3r v;
124                 unsigned n;
125         };
126         Render *_re;
127         ViewLayer *_view_layer;
128         NodeGroup *_Scene;
129         unsigned _numFacesRead;
130 #if 0
131         real _minEdgeSize;
132 #endif
133         bool _smooth; /* if true, face smoothness is taken into account */
134         float _viewplane_left;
135         float _viewplane_right;
136         float _viewplane_bottom;
137         float _viewplane_top;
138         float _z_near, _z_far;
139         float _z_offset;
140
141         RenderMonitor *_pRenderMonitor;
142
143 #ifdef WITH_CXX_GUARDEDALLOC
144         MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:BlenderFileLoader")
145 #endif
146 };
147
148 } /* namespace Freestyle */
149
150 #endif // __BLENDER_FILE_LOADER_H__