OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CC_OUTPUT_BSP_TREE_H_ | |
6 #define CC_OUTPUT_BSP_TREE_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/memory/scoped_ptr.h" | |
11 #include "cc/base/scoped_ptr_deque.h" | |
12 #include "cc/base/scoped_ptr_vector.h" | |
13 #include "cc/output/bsp_compare_result.h" | |
14 #include "cc/quads/draw_polygon.h" | |
15 | |
16 namespace cc { | |
17 | |
18 struct BspNode { | |
19 // This represents the splitting plane. | |
20 scoped_ptr<DrawPolygon> node_data; | |
21 // This represents any coplanar geometry we found while building the BSP. | |
22 ScopedPtrVector<DrawPolygon> coplanars_front; | |
23 ScopedPtrVector<DrawPolygon> coplanars_back; | |
24 | |
25 scoped_ptr<BspNode> back_child; | |
26 scoped_ptr<BspNode> front_child; | |
27 | |
28 explicit BspNode(scoped_ptr<DrawPolygon> data); | |
29 ~BspNode(); | |
30 }; | |
31 | |
32 class BspTree { | |
33 public: | |
34 explicit BspTree(ScopedPtrDeque<DrawPolygon>* list); | |
35 scoped_ptr<BspNode>& root() { return root_; } | |
36 | |
37 template <typename ActionHandlerType> | |
38 void TraverseWithActionHandler(ActionHandlerType* action_handler) const { | |
39 if (root_) { | |
40 WalkInOrderRecursion<ActionHandlerType>(action_handler, root_.get()); | |
41 } | |
42 } | |
43 | |
44 ~BspTree(); | |
45 | |
46 private: | |
47 scoped_ptr<BspNode> root_; | |
48 | |
49 void FromList(ScopedPtrVector<DrawPolygon>* list); | |
50 void BuildTree(BspNode* node, ScopedPtrDeque<DrawPolygon>* data); | |
51 | |
52 template <typename ActionHandlerType> | |
53 void WalkInOrderAction(ActionHandlerType* action_handler, | |
54 DrawPolygon* item) const { | |
55 (*action_handler)(item); | |
56 } | |
57 | |
58 template <typename ActionHandlerType> | |
59 void WalkInOrderVisitNodes( | |
60 ActionHandlerType* action_handler, | |
61 const BspNode* node, | |
62 const BspNode* first_child, | |
63 const BspNode* second_child, | |
64 const ScopedPtrVector<DrawPolygon>& first_coplanars, | |
65 const ScopedPtrVector<DrawPolygon>& second_coplanars) const { | |
66 if (first_child) { | |
67 WalkInOrderRecursion(action_handler, first_child); | |
68 } | |
69 for (size_t i = 0; i < first_coplanars.size(); i++) { | |
70 WalkInOrderAction(action_handler, first_coplanars[i]); | |
71 } | |
72 WalkInOrderAction(action_handler, node->node_data.get()); | |
73 for (size_t i = 0; i < second_coplanars.size(); i++) { | |
74 WalkInOrderAction(action_handler, second_coplanars[i]); | |
75 } | |
76 if (second_child) { | |
77 WalkInOrderRecursion(action_handler, second_child); | |
78 } | |
79 } | |
80 | |
81 template <typename ActionHandlerType> | |
82 void WalkInOrderRecursion(ActionHandlerType* action_handler, | |
83 const BspNode* node) const { | |
84 // If our view is in front of the the polygon | |
85 // in this node then walk back then front. | |
86 if (GetCameraPositionRelative(*(node->node_data)) == BSP_FRONT) { | |
87 WalkInOrderVisitNodes<ActionHandlerType>(action_handler, | |
88 node, | |
89 node->back_child.get(), | |
90 node->front_child.get(), | |
91 node->coplanars_front, | |
92 node->coplanars_back); | |
93 } else { | |
94 WalkInOrderVisitNodes<ActionHandlerType>(action_handler, | |
95 node, | |
96 node->front_child.get(), | |
97 node->back_child.get(), | |
98 node->coplanars_back, | |
99 node->coplanars_front); | |
100 } | |
101 } | |
102 | |
103 // Returns whether or not nodeA is on one or the other side of nodeB, | |
104 // coplanar, or whether it crosses nodeB's plane and needs to be split | |
105 static BspCompareResult GetNodePositionRelative(const DrawPolygon& node_a, | |
106 const DrawPolygon& node_b); | |
107 // Returns whether or not our viewer is in front of or behind the plane | |
108 // defined by this polygon/node | |
109 static BspCompareResult GetCameraPositionRelative(const DrawPolygon& node); | |
110 }; | |
111 | |
112 } // namespace cc | |
113 | |
114 #endif // CC_OUTPUT_BSP_TREE_H_ | |
OLD | NEW |