A straightforward clipping algorithm was implemented to eliminate vertices that are out of the interval from the near to far clipping distance defined by the active camera. Previously, objects that come behind the camera could lead to a crash. The changes in this commit is intended to address this issue. When meshes are partially clipped, new edges are added. These edges can result in visible strokes if they are within the camera view.
85 lines
2.0 KiB
C++
85 lines
2.0 KiB
C++
#ifndef BLENDER_FILE_LOADER_H
|
|
# define BLENDER_FILE_LOADER_H
|
|
|
|
# include <string.h>
|
|
# include <float.h>
|
|
|
|
# include "../system/FreestyleConfig.h"
|
|
# include "../scene_graph/NodeGroup.h"
|
|
# include "../scene_graph/NodeTransform.h"
|
|
# include "../scene_graph/NodeShape.h"
|
|
# include "../scene_graph/IndexedFaceSet.h"
|
|
# include "../geometry/BBox.h"
|
|
# include "../geometry/Geom.h"
|
|
# include "../geometry/GeomCleaner.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "DNA_material_types.h"
|
|
#include "DNA_scene_types.h"
|
|
#include "render_types.h"
|
|
#include "renderdatabase.h"
|
|
|
|
#include "BKE_mesh.h"
|
|
#include "BKE_scene.h"
|
|
#include "BLI_math.h"
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
class NodeGroup;
|
|
|
|
struct LoaderState {
|
|
float *pv;
|
|
float *pn;
|
|
unsigned *pvi;
|
|
unsigned *pni;
|
|
unsigned *pmi;
|
|
unsigned currentIndex;
|
|
unsigned currentMIndex;
|
|
float minBBox[3];
|
|
float maxBBox[3];
|
|
};
|
|
|
|
class LIB_SCENE_GRAPH_EXPORT BlenderFileLoader
|
|
{
|
|
public:
|
|
/*! Builds a MaxFileLoader */
|
|
BlenderFileLoader(Render *re, SceneRenderLayer* srl);
|
|
virtual ~BlenderFileLoader();
|
|
|
|
/*! Loads the 3D scene and returns a pointer to the scene root node */
|
|
NodeGroup * Load();
|
|
|
|
/*! Gets the number of read faces */
|
|
inline unsigned int numFacesRead() {return _numFacesRead;}
|
|
|
|
/*! Gets the smallest edge size read */
|
|
inline real minEdgeSize() {return _minEdgeSize;}
|
|
|
|
protected:
|
|
void insertShapeNode(ObjectRen *obr, int id);
|
|
int countClippedFaces(VertRen *v1, VertRen *v2, VertRen *v3, int clipped[3]);
|
|
void clipLine(VertRen *v1, VertRen *v2, float c[3], float z);
|
|
void clipTriangle(int numTris, float triCoords[][3], VertRen *v1, VertRen *v2, VertRen *v3, int clip[3]);
|
|
void addTriangle(struct LoaderState *state, float v1[3], float v2[3], float v3[3]);
|
|
|
|
protected:
|
|
Render* _re;
|
|
SceneRenderLayer* _srl;
|
|
NodeGroup* _Scene;
|
|
unsigned _numFacesRead;
|
|
real _minEdgeSize;
|
|
float _viewplane_left;
|
|
float _viewplane_right;
|
|
float _viewplane_bottom;
|
|
float _viewplane_top;
|
|
float _z_near, _z_far;
|
|
};
|
|
|
|
#endif // BLENDER_FILE_LOADER_H
|