Industry Compat keymap: Fix paint mode context menus
[blender.git] / intern / cycles / subd / subd_split.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_SPLIT_H__
18 #define __SUBD_SPLIT_H__
19
20 /* DiagSplit: Parallel, Crack-free, Adaptive Tessellation for Micropolygon Rendering
21  * Splits up patches and determines edge tessellation factors for dicing. Patch
22  * evaluation at arbitrary points is required for this to work. See the paper
23  * for more details. */
24
25 #include "subd/subd_dice.h"
26 #include "subd/subd_subpatch.h"
27
28 #include "util/util_deque.h"
29 #include "util/util_types.h"
30 #include "util/util_vector.h"
31
32 #include <deque>
33
34 CCL_NAMESPACE_BEGIN
35
36 class Mesh;
37 class Patch;
38
39 class DiagSplit {
40   SubdParams params;
41
42   vector<Subpatch> subpatches;
43   /* deque is used so that element pointers remain vaild when size is changed. */
44   deque<Edge> edges;
45
46   float3 to_world(Patch *patch, float2 uv);
47   int T(Patch *patch, float2 Pstart, float2 Pend, bool recursive_resolve = false);
48
49   void limit_edge_factor(int &T, Patch *patch, float2 Pstart, float2 Pend);
50   void resolve_edge_factors(Subpatch &sub);
51
52   void partition_edge(
53       Patch *patch, float2 *P, int *t0, int *t1, float2 Pstart, float2 Pend, int t);
54
55   void split(Subpatch &sub, int depth = 0);
56
57   int num_alloced_verts = 0;
58   int alloc_verts(int n); /* Returns start index of new verts. */
59
60  public:
61   Edge *alloc_edge();
62
63   explicit DiagSplit(const SubdParams &params);
64
65   void split_patches(Patch *patches, size_t patches_byte_stride);
66
67   void split_quad(const Mesh::SubdFace &face, Patch *patch);
68   void split_ngon(const Mesh::SubdFace &face, Patch *patches, size_t patches_byte_stride);
69
70   void post_split();
71 };
72
73 CCL_NAMESPACE_END
74
75 #endif /* __SUBD_SPLIT_H__ */