Merge branch 'master' into blender2.8
[blender.git] / source / blender / gpu / GPU_buffers.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Brecht Van Lommel.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file GPU_buffers.h
29  *  \ingroup gpu
30  */
31
32 #ifndef __GPU_BUFFERS_H__
33 #define __GPU_BUFFERS_H__
34
35 #include <stddef.h>
36
37 struct BMesh;
38 struct CCGElem;
39 struct CCGKey;
40 struct DMFlagMat;
41 struct GridCommonGPUBuffer;
42 struct GSet;
43 struct MLoop;
44 struct MLoopTri;
45 struct MPoly;
46 struct MVert;
47 struct PBVH;
48
49 /* Buffers for non-DerivedMesh drawing */
50 typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
51
52 /* build */
53 GPU_PBVH_Buffers *GPU_pbvh_mesh_buffers_build(
54         const int (*face_vert_indices)[3],
55         const struct MPoly *mpoly, const struct MLoop *mloop, const struct MLoopTri *looptri,
56         const struct MVert *verts,
57         const int *face_indices,
58         const int  face_indices_len);
59
60 GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build(
61         int *grid_indices, int totgrid, unsigned int **grid_hidden, int gridsize, const struct CCGKey *key,
62         struct GridCommonGPUBuffer **grid_common_gpu_buffer);
63
64 GPU_PBVH_Buffers *GPU_pbvh_bmesh_buffers_build(bool smooth_shading);
65
66 /* update */
67
68 enum {
69         GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR = (1 << 0),
70         GPU_PBVH_BUFFERS_SHOW_MASK = (1 << 1),
71 };
72
73 void GPU_pbvh_mesh_buffers_update(
74         GPU_PBVH_Buffers *buffers, const struct MVert *mvert,
75         const int *vert_indices, int totvert, const float *vmask,
76         const int (*face_vert_indices)[3],
77         const int update_flags);
78
79 void GPU_pbvh_bmesh_buffers_update(
80         GPU_PBVH_Buffers *buffers,
81         struct BMesh *bm,
82         struct GSet *bm_faces,
83         struct GSet *bm_unique_verts,
84         struct GSet *bm_other_verts,
85         const int update_flags);
86
87 void GPU_pbvh_grid_buffers_update(
88         GPU_PBVH_Buffers *buffers, struct CCGElem **grids,
89         const struct DMFlagMat *grid_flag_mats,
90         int *grid_indices, int totgrid, const struct CCGKey *key,
91         const int update_flags);
92
93 /* draw */
94 struct Gwn_Batch *GPU_pbvh_buffers_batch_get(GPU_PBVH_Buffers *buffers, bool fast);
95
96 /* debug PBVH draw */
97 void GPU_pbvh_BB_draw(float min[3], float max[3], bool leaf, unsigned int pos);
98
99 bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, struct GSet *bm_faces, bool show_diffuse_color);
100 bool GPU_pbvh_buffers_mask_changed(GPU_PBVH_Buffers *buffers, bool show_mask);
101
102 void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers);
103 void GPU_pbvh_multires_buffers_free(struct GridCommonGPUBuffer **grid_common_gpu_buffer);
104
105 void GPU_pbvh_fix_linking(void);
106
107 #endif