-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathPrimitiveMan.h
More file actions
474 lines (408 loc) · 30.2 KB
/
PrimitiveMan.h
File metadata and controls
474 lines (408 loc) · 30.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
#pragma once
#include "Singleton.h"
#include "GraphicalPrimitive.h"
#define g_PrimitiveMan PrimitiveMan::Instance()
namespace RTE {
class Entity;
/// Singleton manager responsible for all primitive drawing.
class PrimitiveMan : public Singleton<PrimitiveMan> {
public:
#pragma region Creation
/// Constructor method used to instantiate a PrimitiveMan object in system memory.
PrimitiveMan() { ClearPrimitivesQueue(); }
#pragma endregion
#pragma region Destruction
/// Delete all scheduled primitives, called on every FrameMan sim update.
void ClearPrimitivesQueue() { m_ScheduledPrimitives.clear(); }
#pragma endregion
#pragma region Primitive Drawing
/// Draws all stored primitives on the screen for specified player.
/// @param player Player to draw for.
/// @param targetBitmap Bitmap to draw on.
/// @param targetPos Position to draw.
void DrawPrimitives(int player, BITMAP* targetBitmap, const Vector& targetPos) const;
#pragma endregion
#pragma region Primitive Draw Scheduling
/// Schedule to draw multiple primitives of varying type with blending enabled.
/// @param blendMode The blending mode to use when drawing each primitive.
/// @param blendAmountR The blending amount for the Red channel. 0-100.
/// @param blendAmountG The blending amount for the Green channel. 0-100.
/// @param blendAmountB The blending amount for the Blue channel. 0-100.
/// @param blendAmountA The blending amount for the Alpha channel. 0-100.
/// @param primitives A vector of primitives to schedule drawing for.
void SchedulePrimitivesForBlendedDrawing(DrawBlendMode blendMode, int blendAmountR, int blendAmountG, int blendAmountB, int blendAmountA, const std::vector<GraphicalPrimitive*>& primitives);
/// Schedule to draw a line primitive.
/// @param startPos Start position of primitive in scene coordinates.
/// @param endPos End position of primitive in scene coordinates.
/// @param color Color to draw primitive with.
void DrawLinePrimitive(const Vector& startPos, const Vector& endPos, unsigned char color) { DrawLinePrimitive(-1, startPos, endPos, color, 1); }
/// Schedule to draw a line primitive with the option to change thickness.
/// @param startPos Start position of primitive in scene coordinates.
/// @param endPos End position of primitive in scene coordinates.
/// @param color Color to draw primitive with.
/// @param thickness Thickness of the line in pixels.
void DrawLinePrimitive(const Vector& startPos, const Vector& endPos, unsigned char color, int thickness) { DrawLinePrimitive(-1, startPos, endPos, color, thickness); }
/// Schedule to draw a line primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param startPos Start position of primitive in scene coordinates.
/// @param endPos End position of primitive in scene coordinates.
/// @param color Color to draw primitive with.
void DrawLinePrimitive(int player, const Vector& startPos, const Vector& endPos, unsigned char color) { DrawLinePrimitive(player, startPos, endPos, color, 1); }
/// Schedule to draw a line primitive visible only to a specified player with the option to change thickness.
/// @param player Player screen to draw primitive on.
/// @param startPos Start position of primitive in scene coordinates.
/// @param endPos End position of primitive in scene coordinates.
/// @param color Color to draw primitive with.
/// @param thickness Thickness of the line in pixels.
void DrawLinePrimitive(int player, const Vector& startPos, const Vector& endPos, unsigned char color, int thickness);
/// Schedule to draw an arc primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param startAngle The angle from which the arc drawing begins.
/// @param endAngle The angle at which the arc drawing ends.
/// @param radius Radius of the arc primitive.
/// @param color Color to draw primitive with.
void DrawArcPrimitive(const Vector& centerPos, float startAngle, float endAngle, int radius, unsigned char color);
/// Schedule to draw an arc primitive with the option to change thickness.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param startAngle The angle from which the arc drawing begins.
/// @param endAngle The angle at which the arc drawing ends.
/// @param radius Radius of the arc primitive.
/// @param color Color to draw primitive with.
/// @param thickness Thickness of the arc in pixels.
void DrawArcPrimitive(const Vector& centerPos, float startAngle, float endAngle, int radius, unsigned char color, int thickness);
/// Schedule to draw an arc primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param startAngle The angle from which the arc drawing begins.
/// @param endAngle The angle at which the arc drawing ends.
/// @param radius Radius of the arc primitive.
/// @param color Color to draw primitive with.
void DrawArcPrimitive(int player, const Vector& centerPos, float startAngle, float endAngle, int radius, unsigned char color);
/// Schedule to draw an arc primitive visible only to a specified player with the option to change thickness.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param startAngle The angle from which the arc drawing begins.
/// @param endAngle The angle at which the arc drawing ends.
/// @param radius Radius of the arc primitive.
/// @param color Color to draw primitive with.
/// @param thickness Thickness of the arc in pixels.
void DrawArcPrimitive(int player, const Vector& centerPos, float startAngle, float endAngle, int radius, unsigned char color, int thickness);
/// Schedule to draw a Bezier spline primitive.
/// @param startPos Start position of primitive in scene coordinates.
/// @param guideA The first guide point that controls the curve of the spline. The spline won't necessarily pass through this point, but it will affect it's shape.
/// @param guideB The second guide point that controls the curve of the spline. The spline won't necessarily pass through this point, but it will affect it's shape.
/// @param endPos End position of primitive in scene coordinates.
/// @param color Color to draw primitive with.
void DrawSplinePrimitive(const Vector& startPos, const Vector& guideA, const Vector& guideB, const Vector& endPos, unsigned char color);
/// Schedule to draw a Bezier spline primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param startPos Start position of primitive in scene coordinates.
/// @param guideA The first guide point that controls the curve of the spline. The spline won't necessarily pass through this point, but it will affect it's shape.
/// @param guideB The second guide point that controls the curve of the spline. The spline won't necessarily pass through this point, but it will affect it's shape.
/// @param endPos End position of primitive in scene coordinates.
/// @param color Color to draw primitive with.
void DrawSplinePrimitive(int player, const Vector& startPos, const Vector& guideA, const Vector& guideB, const Vector& endPos, unsigned char color);
/// Schedule to draw a box primitive.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param color Color to draw primitive with.
void DrawBoxPrimitive(const Vector& topLeftPos, const Vector& bottomRightPos, unsigned char color);
/// Schedule to draw a box primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param color Color to draw primitive with.
void DrawBoxPrimitive(int player, const Vector& topLeftPos, const Vector& bottomRightPos, unsigned char color);
/// Schedule to draw a filled box primitive.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param color Color to draw primitive with.
void DrawBoxFillPrimitive(const Vector& topLeftPos, const Vector& bottomRightPos, unsigned char color);
/// Schedule to draw a filled box primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param color Color to draw primitive with.
void DrawBoxFillPrimitive(int player, const Vector& topLeftPos, const Vector& bottomRightPos, unsigned char color);
/// Schedule to draw a rounded box primitive.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param cornerRadius The radius of the corners of the box. Smaller radius equals sharper corners.
/// @param color Color to draw primitive with.
void DrawRoundedBoxPrimitive(const Vector& topLeftPos, const Vector& bottomRightPos, int cornerRadius, unsigned char color);
/// Schedule to draw a rounded box primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param cornerRadius The radius of the corners of the box. Smaller radius equals sharper corners.
/// @param color Color to draw primitive with.
void DrawRoundedBoxPrimitive(int player, const Vector& topLeftPos, const Vector& bottomRightPos, int cornerRadius, unsigned char color);
/// Schedule to draw a filled rounded box primitive.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param cornerRadius The radius of the corners of the box. Smaller radius equals sharper corners.
/// @param color Color to draw primitive with.
void DrawRoundedBoxFillPrimitive(const Vector& topLeftPos, const Vector& bottomRightPos, int cornerRadius, unsigned char color);
/// Schedule to draw a filled rounded box primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param topLeftPos Start position of primitive in scene coordinates. Top left corner.
/// @param bottomRightPos End position of primitive in scene coordinates. Bottom right corner.
/// @param cornerRadius The radius of the corners of the box. Smaller radius equals sharper corners.
/// @param color Color to draw primitive with.
void DrawRoundedBoxFillPrimitive(int player, const Vector& topLeftPos, const Vector& bottomRightPos, int cornerRadius, unsigned char color);
/// Schedule to draw a circle primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param radius Radius of circle primitive.
/// @param color Color to draw primitive with.
void DrawCirclePrimitive(const Vector& centerPos, int radius, unsigned char color);
/// Schedule to draw a circle primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param radius Radius of circle primitive.
/// @param color Color to draw primitive with.
void DrawCirclePrimitive(int player, const Vector& centerPos, int radius, unsigned char color);
/// Schedule to draw a filled circle primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param radius Radius of circle primitive.
/// @param color Color to fill primitive with.
void DrawCircleFillPrimitive(const Vector& centerPos, int radius, unsigned char color);
/// Schedule to draw a filled circle primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param radius Radius of circle primitive.
/// @param color Color to fill primitive with.
void DrawCircleFillPrimitive(int player, const Vector& centerPos, int radius, unsigned char color);
/// Schedule to draw an ellipse primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param horizRadius Horizontal radius of the ellipse primitive.
/// @param vertRadius Vertical radius of the ellipse primitive.
/// @param color Color to draw primitive with.
void DrawEllipsePrimitive(const Vector& centerPos, int horizRadius, int vertRadius, unsigned char color);
/// Schedule to draw an ellipse primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param horizRadius Horizontal radius of the ellipse primitive.
/// @param vertRadius Vertical radius of the ellipse primitive.
/// @param color Color to draw primitive with.
void DrawEllipsePrimitive(int player, const Vector& centerPos, int horizRadius, int vertRadius, unsigned char color);
/// Schedule to draw a filled ellipse primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param horizRadius Horizontal radius of the ellipse primitive.
/// @param vertRadius Vertical radius of the ellipse primitive.
/// @param color Color to fill primitive with.
void DrawEllipseFillPrimitive(const Vector& centerPos, int horizRadius, int vertRadius, unsigned char color);
/// Schedule to draw a filled ellipse primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param horizRadius Horizontal radius of the ellipse primitive.
/// @param vertRadius Vertical radius of the ellipse primitive.
/// @param color Color to fill primitive with.
void DrawEllipseFillPrimitive(int player, const Vector& centerPos, int horizRadius, int vertRadius, unsigned char color);
/// Schedule to draw a triangle primitive.
/// @param pointA Position of the first point of the triangle in scene coordinates.
/// @param pointB Position of the second point of the triangle in scene coordinates.
/// @param pointC Position of the third point of the triangle in scene coordinates.
/// @param color Color to fill primitive with.
void DrawTrianglePrimitive(const Vector& pointA, const Vector& pointB, const Vector& pointC, unsigned char color);
/// Schedule to draw a triangle primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param pointA Position of the first point of the triangle in scene coordinates.
/// @param pointB Position of the second point of the triangle in scene coordinates.
/// @param pointC Position of the third point of the triangle in scene coordinates.
/// @param color Color to fill primitive with.
void DrawTrianglePrimitive(int player, const Vector& pointA, const Vector& pointB, const Vector& pointC, unsigned char color);
/// Schedule to draw a filled triangle primitive.
/// @param pointA Position of the first point of the triangle in scene coordinates.
/// @param pointB Position of the second point of the triangle in scene coordinates.
/// @param pointC Position of the third point of the triangle in scene coordinates.
/// @param color Color to fill primitive with.
void DrawTriangleFillPrimitive(const Vector& pointA, const Vector& pointB, const Vector& pointC, unsigned char color);
/// Schedule to draw a filled triangle primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param pointA Position of the first point of the triangle in scene coordinates.
/// @param pointB Position of the second point of the triangle in scene coordinates.
/// @param pointC Position of the third point of the triangle in scene coordinates.
/// @param color Color to fill primitive with.
void DrawTriangleFillPrimitive(int player, const Vector& pointA, const Vector& pointB, const Vector& pointC, unsigned char color);
/// Schedule to draw a polygon primitive visible only to a specified player.
/// @param player Player screen to draw primitive on, or -1 for all players.
/// @param startPos Start position of the primitive in scene coordinates.
/// @param color Color to draw primitive with.
/// @param vertices A vector containing the positions of the vertices of the polygon, relative to the center position.
/// @param filled Whether a PolygonFillPrimitive should be scheduled instead of PolygonPrimitive.
void DrawPolygonOrPolygonFillPrimitive(int player, const Vector& startPos, unsigned char color, const std::vector<Vector*>& vertices, bool filled);
/// Schedule to draw a text primitive.
/// @param start Start position of primitive in scene coordinates.
/// @param text Text string to draw.
/// @param isSmall Use small or large font. True for small font.
/// @param alignment Alignment of text.
void DrawTextPrimitive(const Vector& start, const std::string& text, bool isSmall, int alignment);
/// Schedule to draw a text primitive.
/// @param start Start position of primitive in scene coordinates.
/// @param text Text string to draw.
/// @param isSmall Use small or large font. True for small font.
/// @param alignment Alignment of text.
/// @param rotAngle Angle to rotate text in radians.
void DrawTextPrimitive(const Vector& start, const std::string& text, bool isSmall, int alignment, float rotAngle);
/// Schedule to draw a text primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param start Start position of primitive in scene coordinates.
/// @param text Text string to draw.
/// @param isSmall Use small or large font. True for small font.
/// @param alignment Alignment of text.
void DrawTextPrimitive(int player, const Vector& start, const std::string& text, bool isSmall, int alignment);
/// Schedule to draw a text primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param start Start position of primitive in scene coordinates.
/// @param text Text string to draw.
/// @param isSmall Use small or large font. True for small font.
/// @param alignment Alignment of text.
/// @param rotAngle Angle to rotate text in radians.
void DrawTextPrimitive(int player, const Vector& start, const std::string& text, bool isSmall, int alignment, float rotAngle);
/// Schedule to draw a bitmap primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
void DrawBitmapPrimitive(const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame) { DrawBitmapPrimitive(-1, centerPos, moSprite, rotAngle, frame, false, false); }
/// Schedule to draw a bitmap primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
/// @param scale Drawing scale.
void DrawBitmapPrimitive(const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame, float scale) { DrawBitmapPrimitive(-1, centerPos, moSprite, rotAngle, scale, frame, false, false); }
/// Schedule to draw a bitmap primitive with the option to flip the primitive horizontally and vertically.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame, bool hFlipped, bool vFlipped) { DrawBitmapPrimitive(-1, centerPos, moSprite, rotAngle, frame, hFlipped, vFlipped); }
/// Schedule to draw a bitmap primitive with the option to flip the primitive horizontally and vertically.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
/// @param scale Drawing scale.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame, float scale, bool hFlipped, bool vFlipped) { DrawBitmapPrimitive(-1, centerPos, moSprite, rotAngle, frame, scale, hFlipped, vFlipped); }
/// Schedule to draw a bitmap primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame) { DrawBitmapPrimitive(player, centerPos, moSprite, rotAngle, frame, false, false); }
/// Schedule to draw a bitmap primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
/// @param scale Drawing scale.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame, float scale) { DrawBitmapPrimitive(player, centerPos, moSprite, rotAngle, frame, scale, false, false); }
/// Schedule to draw a bitmap primitive visible only to a specified player with the option to flip the primitive horizontally or vertically.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame, bool hFlipped, bool vFlipped) { DrawBitmapPrimitive(player, centerPos, moSprite, rotAngle, frame, 1.0f, false, false); }
/// Schedule to draw a bitmap primitive visible only to a specified player with the option to flip the primitive horizontally or vertically.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param moSprite A MOSprite to draw BITMAP from.
/// @param rotAngle Rotation angle in radians.
/// @param frame Frame to draw.
/// @param scale Drawing scale.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const MOSprite* moSprite, float rotAngle, unsigned int frame, float scale, bool hFlipped, bool vFlipped);
/// Schedule to draw a bitmap primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath Path to the bitmap to draw.
/// @param rotAngle Rotation angle in radians.
void DrawBitmapPrimitive(const Vector& centerPos, const std::string& filePath, float rotAngle) { DrawBitmapPrimitive(-1, centerPos, filePath, rotAngle, false, false); }
/// Schedule to draw a bitmap primitive.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath Path to the bitmap to draw.
/// @param rotAngle Rotation angle in radians.
/// @param scale Drawing scale.
void DrawBitmapPrimitive(const Vector& centerPos, const std::string& filePath, float rotAngle, float scale) { DrawBitmapPrimitive(-1, centerPos, filePath, rotAngle, scale, false, false); }
/// Schedule to draw a bitmap primitive with the option to flip the primitive horizontally and vertically.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath An entity to draw sprite from.
/// @param rotAngle Rotation angle in radians.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(const Vector& centerPos, const std::string& filePath, float rotAngle, bool hFlipped, bool vFlipped) { DrawBitmapPrimitive(-1, centerPos, filePath, rotAngle, hFlipped, vFlipped); }
/// Schedule to draw a bitmap primitive with the option to flip the primitive horizontally and vertically.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath An entity to draw sprite from.
/// @param rotAngle Rotation angle in radians.
/// @param scale Drawing scale.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(const Vector& centerPos, const std::string& filePath, float rotAngle, float scale, bool hFlipped, bool vFlipped) { DrawBitmapPrimitive(-1, centerPos, filePath, rotAngle, scale, hFlipped, vFlipped); }
/// Schedule to draw a bitmap primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath Path to the bitmap to draw.
/// @param rotAngle Rotation angle in radians.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const std::string& filePath, float rotAngle) { DrawBitmapPrimitive(player, centerPos, filePath, rotAngle, false, false); }
/// Schedule to draw a bitmap primitive visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath Path to the bitmap to draw.
/// @param rotAngle Rotation angle in radians.
/// @param scale Drawing scale.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const std::string& filePath, float rotAngle, float scale) { DrawBitmapPrimitive(player, centerPos, filePath, rotAngle, scale, false, false); }
/// Schedule to draw a bitmap primitive visible only to a specified player with the option to flip the primitive horizontally or vertically.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath Path to the bitmap to draw.
/// @param rotAngle Rotation angle in radians.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const std::string& filePath, float rotAngle, bool hFlipped, bool vFlipped) { DrawBitmapPrimitive(player, centerPos, filePath, rotAngle, 1.0f, false, false); }
/// Schedule to draw a bitmap primitive visible only to a specified player with the option to flip the primitive horizontally or vertically.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param filePath Path to the bitmap to draw.
/// @param rotAngle Rotation angle in radians.
/// @param scale Drawing scale.
/// @param hFlipped Whether to flip the sprite horizontally.
/// @param vFlipped Whether to flip the sprite vertically.
void DrawBitmapPrimitive(int player, const Vector& centerPos, const std::string& filePath, float rotAngle, float scale, bool hFlipped, bool vFlipped);
/// Schedule to draw the GUI icon of an object.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param entity An entity to draw sprite from.
void DrawIconPrimitive(const Vector& centerPos, Entity* entity) { DrawIconPrimitive(-1, centerPos, entity); }
/// Schedule to draw the GUI icon of an object, visible only to a specified player.
/// @param player Player screen to draw primitive on.
/// @param centerPos Position of primitive's center in scene coordinates.
/// @param entity An entity to draw sprite from.
void DrawIconPrimitive(int player, const Vector& centerPos, Entity* entity);
#pragma endregion
protected:
std::mutex m_Mutex; //!< Mutex so that mutiple threads (i.e multithreaded scripts) can safely queue up draws
std::deque<std::unique_ptr<GraphicalPrimitive>> m_ScheduledPrimitives; //!< List of graphical primitives scheduled to draw this frame, cleared every frame during FrameMan::Draw().
private:
/// Constructs a unique_ptr of the appropriate derived type from the passed in GraphicalPrimitive raw pointer.
/// This is used for preparing primitives constructed in Lua for scheduling.
/// @param primitive Raw pointer to the GraphicalPrimitive object to make unique.
/// @return A unique_ptr of the appropriate derived GraphicalPrimitive type. Ownership is transferred!
std::unique_ptr<GraphicalPrimitive> MakeUniqueOfAppropriateTypeFromPrimitiveRawPtr(GraphicalPrimitive* primitive);
/// Safely schedules a primite to draw in a thread-safe manner.
/// @param primitive A unique ptr of the primitive to schedule for drawing.
void SchedulePrimitive(std::unique_ptr<GraphicalPrimitive>&& primitive);
// Disallow the use of some implicit methods.
PrimitiveMan(const PrimitiveMan& reference) = delete;
PrimitiveMan& operator=(const PrimitiveMan& rhs) = delete;
};
} // namespace RTE