|
1 #ifndef LDFORGE_GLDATA_H |
|
2 #define LDFORGE_GLDATA_H |
|
3 |
|
4 #include "types.h" |
|
5 #include "gldraw.h" |
|
6 #include <QMap> |
|
7 #include <QRgb> |
|
8 |
|
9 /* ============================================================================= |
|
10 * ----------------------------------------------------------------------------- |
|
11 * GLCompiler |
|
12 * |
|
13 * This class manages vertex arrays for the GL renderer, compiling vertices into |
|
14 * VAO-readable triangles which can be requested with getMergedBuffer. |
|
15 * |
|
16 * There are 5 main array types: |
|
17 * - the normal polygon array, for triangles |
|
18 * - edge line array, for lines |
|
19 * - BFC array, this is the same as the normal polygon array except that the |
|
20 * - polygons are listed twice, once normally and green and once reversed |
|
21 * - and red, this allows BFC red/green view. |
|
22 * - Picking array, this is the samea s the normal polygon array except the |
|
23 * - polygons are compiled with their index color, this way the picking |
|
24 * - method is capable of determining which object was selected by pixel |
|
25 * - color. |
|
26 * - Edge line picking array, the pick array version of the edge line array. |
|
27 * |
|
28 * There are also these same 5 arrays for every LDObject compiled. The main |
|
29 * arrays are generated on demand from the ones in the current file's |
|
30 * LDObjects and stored in cache for faster renmm dering. |
|
31 * |
|
32 * The nested Array class contains a vector-like buffer of the Vertex structs, |
|
33 * these structs are the VAOs that get passed to the renderer. |
|
34 */ |
|
35 |
|
36 class GLCompiler |
|
37 { |
|
38 public: |
|
39 enum ColorType |
|
40 { |
|
41 Normal, |
|
42 BFCFront, |
|
43 BFCBack, |
|
44 PickColor, |
|
45 }; |
|
46 |
|
47 struct CompiledTriangle |
|
48 { |
|
49 ::Vertex verts[3]; |
|
50 uint8 numVerts; // 2 if a line |
|
51 uint32 rgb; // Color of this poly normally |
|
52 uint32 pickrgb; // Color of this poly while picking |
|
53 bool isCondLine; // Is this a conditional line? |
|
54 LDObject* obj; // Pointer to the object this poly represents |
|
55 }; |
|
56 |
|
57 struct Vertex |
|
58 { |
|
59 float x, y, z; |
|
60 uint32 color; |
|
61 float pad[4]; |
|
62 }; |
|
63 |
|
64 using PolygonList = QList<CompiledTriangle>; |
|
65 using Array = QVector<GLCompiler::Vertex>; |
|
66 |
|
67 GLCompiler(); |
|
68 ~GLCompiler(); |
|
69 void setFile (LDDocument* file); |
|
70 void compileDocument(); |
|
71 void forgetObject (LDObject* obj); |
|
72 void initObject (LDObject* obj); |
|
73 const Array* getMergedBuffer (GL::VAOType type); |
|
74 QColor getObjectColor (LDObject* obj, ColorType list) const; |
|
75 void needMerge(); |
|
76 void stageForCompilation (LDObject* obj); |
|
77 |
|
78 static uint32 getColorRGB (const QColor& color); |
|
79 |
|
80 private: |
|
81 void compilePolygon (LDObject* drawobj, LDObject* trueobj, PolygonList& data); |
|
82 void compileObject (LDObject* obj); |
|
83 void compileSubObject (LDObject* obj, LDObject* topobj, PolygonList& data); |
|
84 Array* postprocess (const GLCompiler::CompiledTriangle& i, GLRenderer::VAOType type); |
|
85 |
|
86 QMap<LDObject*, Array*> m_objArrays; |
|
87 Array m_mainArrays[GL::ENumArrays]; |
|
88 LDDocument* m_file; |
|
89 bool m_changed[GL::ENumArrays]; |
|
90 LDObjectList m_staged; // Objects that need to be compiled |
|
91 }; |
|
92 |
|
93 extern GLCompiler g_vertexCompiler; |
|
94 |
|
95 #endif // LDFORGE_GLDATA_H |