Gawain: remove GL enum from vertex format API
[blender.git] / intern / gawain / gawain / vertex_format.h
1
2 // Gawain vertex format
3 //
4 // This code is part of the Gawain library, with modifications
5 // specific to integration with Blender.
6 //
7 // Copyright 2016 Mike Erwin
8 //
9 // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of
10 // the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
11
12 #pragma once
13
14 #include "common.h"
15
16 #define MAX_VERTEX_ATTRIBS 16
17 #define AVG_VERTEX_ATTRIB_NAME_LEN 5
18 #define VERTEX_ATTRIB_NAMES_BUFFER_LEN ((AVG_VERTEX_ATTRIB_NAME_LEN + 1) * MAX_VERTEX_ATTRIBS)
19
20 #define USE_10_10_10 defined(_WIN32)
21 // (GLEW_VERSION_3_3 || GLEW_ARB_vertex_type_2_10_10_10_rev)
22 //   ^-- this is only guaranteed on Windows right now, will be true on all platforms soon
23
24 typedef enum {
25         COMP_I8,
26         COMP_U8,
27         COMP_I16,
28         COMP_U16,
29         COMP_I32,
30         COMP_U32,
31
32         COMP_F32,
33
34 #if USE_10_10_10
35         COMP_I10
36 #endif
37 } VertexCompType;
38
39 typedef enum {
40         KEEP_FLOAT,
41         KEEP_INT,
42         NORMALIZE_INT_TO_FLOAT, // 127 (ubyte) -> 0.5 (and so on for other int types)
43         CONVERT_INT_TO_FLOAT // 127 (any int type) -> 127.0
44 } VertexFetchMode;
45
46 typedef struct {
47         VertexCompType comp_type;
48         unsigned gl_comp_type;
49         unsigned comp_ct; // 1 to 4
50         unsigned sz; // size in bytes, 1 to 16
51         unsigned offset; // from beginning of vertex, in bytes
52         VertexFetchMode fetch_mode;
53         const char* name;
54 } Attrib;
55
56 typedef struct {
57         unsigned attrib_ct; // 0 to 16 (MAX_VERTEX_ATTRIBS)
58         unsigned stride; // stride in bytes, 1 to 256
59         bool packed;
60         Attrib attribs[MAX_VERTEX_ATTRIBS]; // TODO: variable-size attribs array
61         char names[VERTEX_ATTRIB_NAMES_BUFFER_LEN];
62         unsigned name_offset;
63 } VertexFormat;
64
65 void VertexFormat_clear(VertexFormat*);
66 void VertexFormat_copy(VertexFormat* dest, const VertexFormat* src);
67
68 unsigned VertexFormat_add_attrib(VertexFormat*, const char* name, VertexCompType, unsigned comp_ct, VertexFetchMode);
69
70 // format conversion
71
72 #if USE_10_10_10
73
74 typedef struct {
75         int x : 10;
76         int y : 10;
77         int z : 10;
78         int w : 2;      // 0 by default, can manually set to { -2, -1, 0, 1 }
79 } PackedNormal;
80
81 PackedNormal convert_i10_v3(const float data[3]);
82
83 #endif // USE_10_10_10
84
85 // for internal use
86 void VertexFormat_pack(VertexFormat*);
87 unsigned padding(unsigned offset, unsigned alignment);
88 unsigned vertex_buffer_size(const VertexFormat*, unsigned vertex_ct);