Cleanup: replace attrib w/ attr
[blender.git] / source / blender / gpu / GPU_vertex_format.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) 2016 by Mike Erwin.
19  * All rights reserved.
20  *
21  * Contributor(s): Blender Foundation
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file blender/gpu/GPU_vertex_format.h
27  *  \ingroup gpu
28  *
29  * GPU vertex format
30  */
31
32 #ifndef __GPU_VERTEX_FORMAT_H__
33 #define __GPU_VERTEX_FORMAT_H__
34
35 #include "GPU_common.h"
36
37 #define GPU_VERT_ATTR_MAX_LEN 16
38 #define GPU_VERT_ATTR_MAX_NAMES 3
39 #define GPU_VERT_ATTR_NAME_AVERAGE_LEN 11
40 #define GPU_VERT_ATTR_NAMES_BUF_LEN ((GPU_VERT_ATTR_NAME_AVERAGE_LEN + 1) * GPU_VERT_ATTR_MAX_LEN)
41
42 typedef enum {
43         GPU_COMP_I8,
44         GPU_COMP_U8,
45         GPU_COMP_I16,
46         GPU_COMP_U16,
47         GPU_COMP_I32,
48         GPU_COMP_U32,
49
50         GPU_COMP_F32,
51
52         GPU_COMP_I10
53 } GPUVertCompType;
54
55 typedef enum {
56         GPU_FETCH_FLOAT,
57         GPU_FETCH_INT,
58         GPU_FETCH_INT_TO_FLOAT_UNIT, /* 127 (ubyte) -> 0.5 (and so on for other int types) */
59         GPU_FETCH_INT_TO_FLOAT /* 127 (any int type) -> 127.0 */
60 } GPUVertFetchMode;
61
62 typedef struct GPUVertAttr {
63         GPUVertFetchMode fetch_mode;
64         GPUVertCompType comp_type;
65         uint gl_comp_type;
66         uint comp_len; /* 1 to 4 or 8 or 12 or 16 */
67         uint sz; /* size in bytes, 1 to 64 */
68         uint offset; /* from beginning of vertex, in bytes */
69         uint name_len; /* up to GPU_VERT_ATTR_MAX_NAMES */
70         const char *name[GPU_VERT_ATTR_MAX_NAMES];
71 } GPUVertAttr;
72
73 typedef struct GPUVertFormat {
74         /** 0 to 16 (GPU_VERT_ATTR_MAX_LEN). */
75         uint attr_len;
76         /** Total count of active vertex attribute. */
77         uint name_len;
78         /** Stride in bytes, 1 to 256. */
79         uint stride;
80         uint name_offset;
81         bool packed;
82         char names[GPU_VERT_ATTR_NAMES_BUF_LEN];
83         /** TODO: variable-size array */
84         GPUVertAttr attrs[GPU_VERT_ATTR_MAX_LEN];
85 } GPUVertFormat;
86
87 struct GPUShaderInterface;
88
89 void GPU_vertformat_clear(GPUVertFormat *);
90 void GPU_vertformat_copy(GPUVertFormat *dest, const GPUVertFormat *src);
91 void GPU_vertformat_from_interface(GPUVertFormat *format, const struct GPUShaderInterface *shaderface);
92
93 uint GPU_vertformat_attr_add(
94         GPUVertFormat *, const char *name,
95         GPUVertCompType, uint comp_len, GPUVertFetchMode);
96 void GPU_vertformat_alias_add(GPUVertFormat *, const char *alias);
97 int GPU_vertformat_attr_id_get(const GPUVertFormat *, const char *name);
98
99 /**
100  * This makes the "virtual" attributes with suffixes "0", "1", "2" to access triangle data in the vertex
101  * shader.
102  *
103  * IMPORTANT:
104  * - Call this before creating the vertex buffer and after creating all attributes
105  * - Only first vertex out of 3 has the correct information. Use flat output with GL_FIRST_VERTEX_CONVENTION.
106  **/
107 void GPU_vertformat_triple_load(GPUVertFormat *format);
108
109 /* format conversion */
110
111 typedef struct GPUPackedNormal {
112         int x : 10;
113         int y : 10;
114         int z : 10;
115         int w : 2;  /* 0 by default, can manually set to { -2, -1, 0, 1 } */
116 } GPUPackedNormal;
117
118 GPUPackedNormal GPU_normal_convert_i10_v3(const float data[3]);
119 GPUPackedNormal GPU_normal_convert_i10_s3(const short data[3]);
120
121 #endif /* __GPU_VERTEX_FORMAT_H__ */