diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-03-14 03:36:27 +0300 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-03-14 03:36:27 +0300 |
commit | 4569f9ae4e6cf60beadd082128629763bbae7462 (patch) | |
tree | f8761b8f23b0efe8628dfbf92a918893347035b5 /source/blender/freestyle/intern/view_map/ViewMap.h | |
parent | c8deda32763d68b59d28f00734785dc0c7a91571 (diff) |
Optimized view map calculation by Alexander Beels.
* View map calculation has been intensively optimized for speed by
means of:
1) new spatial grid data structures (SphericalGrid for perspective
cameras and BoxGrid for orthographic cameras; automatically switched
based on the camera type);
2) a heuristic grid density calculation algorithm; and
3) new line visibility computation algorithms: A "traditional"
algorithm for emulating old visibility algorithms, and a "cumulative"
algorithm for improved, more consistent line visibility, both exploiting
the new spatial grid data structures for fast ray casting.
A new option "Raycasting Algorithm" was added to allow users to choose
a ray casting (line visibility) algorithm. Available choices are:
- Normal Ray Casting
- Fast Ray Casting
- Very Fast Ray Casting
- Culled Traditional Visibility Detection
- Unculled Traditional Visibility Detection
- Culled Cumulative Visibility Detection
- Unculled Cumulative Visibility Detection
The first three algorithms are those available in the original
Freestyle (the "normal" ray casting was used unconditionally, though).
The "fast" and "very fast" ray casting algorithms achieve a faster
calculation at the cost of less visibility accuracy.
The last four are newly introduced optimized options. The culled
versions of the new algorithms will exclude from visibility
calculation those faces that lay outside the camera, which leads to a
faster view map construction. The unculled counterparts will take all
faces into account. The unculled visibility algorithms are useful
when culling affects stroke chaining.
The recommended options for users are the culled/unculled cumulative
visibility algorithms. These options are meant to replace the old
algorithms in the future.
Performance improvements over the old algorithms depend on the scenes
to be rendered.
* Silhouette detection has also been considerably optimized for speed.
Performance gains by this optimization do not depend on scenes.
* Improper handling of error conditions in the view map construction
was fixed.
Diffstat (limited to 'source/blender/freestyle/intern/view_map/ViewMap.h')
-rwxr-xr-x | source/blender/freestyle/intern/view_map/ViewMap.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/source/blender/freestyle/intern/view_map/ViewMap.h b/source/blender/freestyle/intern/view_map/ViewMap.h index a0e60ff7bd7..d2d7a9a5341 100755 --- a/source/blender/freestyle/intern/view_map/ViewMap.h +++ b/source/blender/freestyle/intern/view_map/ViewMap.h @@ -801,6 +801,7 @@ private: // and _aShape is the one on its right // NON GERE PAR LE COPY CONSTRUCTEUR int _qi; vector<ViewShape*> _Occluders; + bool _isInImage; // tmp Id * _splittingId; @@ -821,6 +822,7 @@ public: _aShape=0; userdata = 0; _splittingId = 0; + _isInImage = true; } inline ViewEdge(ViewVertex* iA, ViewVertex *iB) { @@ -834,6 +836,7 @@ public: _qi = 0; userdata = 0; _splittingId = 0; + _isInImage = true; } inline ViewEdge(ViewVertex* iA, ViewVertex *iB, FEdge *iFEdgeA) { @@ -847,6 +850,7 @@ public: _qi = 0; userdata = 0; _splittingId = 0; + _isInImage = true; } inline ViewEdge(ViewVertex* iA, ViewVertex *iB, FEdge *iFEdgeA, FEdge *iFEdgeB, ViewShape *iShape) { @@ -860,6 +864,7 @@ public: _qi = 0; userdata = 0; _splittingId = 0; + _isInImage = true; UpdateFEdges(); // tells every FEdge between iFEdgeA and iFEdgeB that this is theit ViewEdge } @@ -879,6 +884,7 @@ public: _aShape = iBrother._aShape; _qi = iBrother._qi; _splittingId = 0; + _isInImage = iBrother._isInImage; iBrother.userdata = this; userdata = 0; } @@ -937,6 +943,7 @@ public: inline const ViewShape * bShape() const {return _Shape;} inline vector<ViewShape*>& occluders() {return _Occluders;} inline Id * splittingId() {return _splittingId;} + inline bool isInImage() const { return _isInImage; } /* modifiers */ /*! Sets the first ViewVertex of the ViewEdge. */ @@ -966,6 +973,7 @@ public: inline void setChainingTimeStamp(unsigned ts) {_ChainingTimeStamp = ts;} inline void AddOccluder(ViewShape *iShape) {_Occluders.push_back(iShape);} inline void setSplittingId(Id * id) {_splittingId = id;} + inline void setIsInImage(bool iFlag) { _isInImage = iFlag; } /* stroke interface definition */ inline bool intersect_2d_area(const Vec2r& iMin, const Vec2r& iMax) const |