Cycles: svn merge -r41225:41232 ^/trunk/blender
[blender.git] / intern / cycles / subd / subd_face.h
1 /*
2  * Original code in the public domain -- castanyo@yahoo.es
3  * 
4  * Modifications copyright (c) 2011, Blender Foundation.
5  * All rights reserved.
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are
9  * met:
10  * * Redistributions of source code must retain the above copyright
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in the
14  *   documentation and/or other materials provided with the distribution.
15  * 
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef __SUBD_FACE_H__
30 #define __SUBD_FACE_H__
31
32 #include "subd_edge.h"
33 #include "subd_mesh.h"
34
35 CCL_NAMESPACE_BEGIN
36
37 /* Subd Face */
38
39 class SubdFace
40 {
41 public:
42         int id;
43         SubdEdge *edge;
44
45         SubdFace(int id_)
46         {
47                 id = id_;
48                 edge = NULL;
49         }
50
51         bool contains(SubdEdge *e)
52         {
53                 for(EdgeIterator it(edges()); !it.isDone(); it.advance())
54                         if(it.current() == e)
55                                 return true;
56
57                 return false;
58         }
59
60         int num_edges()
61         {
62                 int num = 0;
63
64                 for(EdgeIterator it(edges()); !it.isDone(); it.advance())
65                         num++;
66
67                 return num;
68         }
69
70         bool is_boundary()
71         {
72                 for(EdgeIterator it(edges()); !it.isDone(); it.advance()) {
73                         SubdEdge *edge = it.current();
74
75                         if(edge->pair->face == NULL)
76                                 return true;
77                 }
78
79                 return false;
80         }
81         
82         /* iterate over edges in clockwise order */
83         class EdgeIterator
84         {
85         public:
86                 EdgeIterator(SubdEdge *e) : end(NULL), cur(e) { }
87
88                 virtual void advance()
89                 {
90                         if (end == NULL) end = cur;
91                         cur = cur->next;
92                 }
93
94                 virtual bool isDone() { return end == cur; }
95                 virtual SubdEdge *current() { return cur; }
96
97         private:
98                 SubdEdge *end;
99                 SubdEdge *cur;
100         };
101
102         EdgeIterator edges() { return EdgeIterator(edge); }
103         EdgeIterator edges(SubdEdge *edge) {  return EdgeIterator(edge);  }
104 };
105
106 CCL_NAMESPACE_END
107
108 #endif /* __SUBD_FACE_H__ */
109