fcebaec8772a8407f713f77061f06a1a86a039de
[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 = GL_BYTE,
26         COMP_U8 = GL_UNSIGNED_BYTE,
27         COMP_I16 = GL_SHORT,
28         COMP_U16 = GL_UNSIGNED_SHORT,
29         COMP_I32 = GL_INT,
30         COMP_U32 = GL_UNSIGNED_INT,
31
32         COMP_F32 = GL_FLOAT, // TODO: drop the GL_ equivalence here, use a private lookup table
33
34 #if USE_10_10_10
35         COMP_I10 = GL_INT_2_10_10_10_REV
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 comp_ct; // 1 to 4
49         unsigned sz; // size in bytes, 1 to 16
50         unsigned offset; // from beginning of vertex, in bytes
51         VertexFetchMode fetch_mode;
52         const char* name;
53 } Attrib;
54
55 typedef struct {
56         unsigned attrib_ct; // 0 to 16 (MAX_VERTEX_ATTRIBS)
57         unsigned stride; // stride in bytes, 1 to 256
58         bool packed;
59         Attrib attribs[MAX_VERTEX_ATTRIBS]; // TODO: variable-size attribs array
60         char names[VERTEX_ATTRIB_NAMES_BUFFER_LEN];
61         unsigned name_offset;
62 } VertexFormat;
63
64 void VertexFormat_clear(VertexFormat*);
65 void VertexFormat_copy(VertexFormat* dest, const VertexFormat* src);
66
67 unsigned VertexFormat_add_attrib(VertexFormat*, const char* name, VertexCompType, unsigned comp_ct, VertexFetchMode);
68
69 // format conversion
70
71 #if USE_10_10_10
72
73 typedef struct {
74         int x : 10;
75         int y : 10;
76         int z : 10;
77         int w : 2;      // 0 by default, can manually set to { -2, -1, 0, 1 }
78 } PackedNormal;
79
80 PackedNormal convert_i10_v3(const float data[3]);
81
82 #endif // USE_10_10_10
83
84 // for internal use
85 void VertexFormat_pack(VertexFormat*);
86 unsigned padding(unsigned offset, unsigned alignment);
87 unsigned vertex_buffer_size(const VertexFormat*, unsigned vertex_ct);