Cycles: Make all #include statements relative to cycles source directory
[blender.git] / intern / cycles / subd / subd_dice.h
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __SUBD_DICE_H__
18 #define __SUBD_DICE_H__
19
20 /* DX11 like EdgeDice implementation, with different tessellation factors for
21  * each edge for watertight tessellation, with subpatch remapping to work with
22  * DiagSplit. For more algorithm details, see the DiagSplit paper or the
23  * ARB_tessellation_shader OpenGL extension, Section 2.X.2. */
24
25 #include "util/util_types.h"
26 #include "util/util_vector.h"
27
28 CCL_NAMESPACE_BEGIN
29
30 class Camera;
31 class Mesh;
32 class Patch;
33
34 struct SubdParams {
35         Mesh *mesh;
36         bool ptex;
37
38         int test_steps;
39         int split_threshold;
40         float dicing_rate;
41         int max_level;
42         Camera *camera;
43         Transform objecttoworld;
44
45         SubdParams(Mesh *mesh_, bool ptex_ = false)
46         {
47                 mesh = mesh_;
48                 ptex = ptex_;
49
50                 test_steps = 3;
51                 split_threshold = 1;
52                 dicing_rate = 1.0f;
53                 max_level = 12;
54                 camera = NULL;
55         }
56
57 };
58
59 /* EdgeDice Base */
60
61 class EdgeDice {
62 public:
63         SubdParams params;
64         float3 *mesh_P;
65         float3 *mesh_N;
66         size_t vert_offset;
67         size_t tri_offset;
68
69         explicit EdgeDice(const SubdParams& params);
70
71         void reserve(int num_verts);
72
73         int add_vert(Patch *patch, float2 uv);
74         void add_triangle(Patch *patch, int v0, int v1, int v2);
75
76         void stitch_triangles(Patch *patch, vector<int>& outer, vector<int>& inner);
77 };
78
79 /* Quad EdgeDice
80  *
81  * Edge tessellation factors and subpatch coordinates are as follows:
82  *
83  *            tu1
84  *     P01 --------- P11 
85  *     |               |
86  * tv0 |               | tv1
87  *     |               |
88  *     P00 --------- P10
89  *            tu0
90  */
91
92 class QuadDice : public EdgeDice {
93 public:
94         struct SubPatch {
95                 Patch *patch;
96
97                 float2 P00;
98                 float2 P10;
99                 float2 P01;
100                 float2 P11;
101         };
102
103         struct EdgeFactors {
104                 int tu0;
105                 int tu1;
106                 int tv0;
107                 int tv1;
108         };
109
110         explicit QuadDice(const SubdParams& params);
111
112         void reserve(EdgeFactors& ef, int Mu, int Mv);
113         float3 eval_projected(SubPatch& sub, float u, float v);
114
115         float2 map_uv(SubPatch& sub, float u, float v);
116         int add_vert(SubPatch& sub, float u, float v);
117
118         void add_corners(SubPatch& sub);
119         void add_grid(SubPatch& sub, int Mu, int Mv, int offset);
120
121         void add_side_u(SubPatch& sub,
122                 vector<int>& outer, vector<int>& inner,
123                 int Mu, int Mv, int tu, int side, int offset);
124
125         void add_side_v(SubPatch& sub,
126                 vector<int>& outer, vector<int>& inner,
127                 int Mu, int Mv, int tv, int side, int offset);
128
129         float quad_area(const float3& a, const float3& b, const float3& c, const float3& d);
130         float scale_factor(SubPatch& sub, EdgeFactors& ef, int Mu, int Mv);
131
132         void dice(SubPatch& sub, EdgeFactors& ef);
133 };
134
135 CCL_NAMESPACE_END
136
137 #endif /* __SUBD_DICE_H__ */
138