Nebula
Loading...
Searching...
No Matches
im3d.h
Go to the documentation of this file.
1#pragma once
2
3// Define IM3D_CONFIG "myfilename.h" from your build system if you do not want to modify im3d_config.h directly.
4#ifdef IM3D_CONFIG
5 #include IM3D_CONFIG
6#else
7 #include "im3d_config.h"
8#endif
9
10#define IM3D_VERSION "1.18"
11
12#ifndef IM3D_API
13 #define IM3D_API
14#endif
15
16#ifndef IM3D_ASSERT
17 #include <cassert>
18 #define IM3D_ASSERT(e) assert(e)
19#endif
20
21#ifndef IM3D_VERTEX_ALIGNMENT
22 #define IM3D_VERTEX_ALIGNMENT 4
23#endif
24
25#include <cstdarg> // va_list
26
27namespace Im3d {
28
29typedef unsigned int U32;
30struct Vec2;
31struct Vec3;
32struct Vec4;
33struct Mat3;
34struct Mat4;
35struct Color;
36struct VertexData;
37struct AppData;
38struct DrawList;
39struct TextDrawList;
40struct Context;
41
42typedef U32 Id;
43constexpr Id Id_Invalid = 0;
44
45// Get AppData struct from the current context, fill before calling NewFrame().
47
48// Call at the start of each frame, after filling the AppData struct.
49IM3D_API void NewFrame();
50// Call after all Im3d calls have been made for the current frame, before accessing draw data.
51IM3D_API void EndFrame();
52
53// Access draw data. Draw lists are valid after calling EndFrame() and before calling NewFrame().
56
57// Access to text draw data. Draw lists are valid after calling EndFrame() and before calling NewFrame().
60
61// DEPRECATED (use EndFrame() + GetDrawLists()).
62// Call after all Im3d calls have been made for the current frame.
63IM3D_API void Draw();
64
65
66// Begin/end primitive. End() must be called before starting each new primitive type.
68IM3D_API void BeginLines();
73IM3D_API void End();
74
75// Add a vertex to the current primitive (call between Begin*() and End()).
76IM3D_API void Vertex(const Vec3& _position);
77IM3D_API void Vertex(const Vec3& _position, Color _color);
78IM3D_API void Vertex(const Vec3& _position, float _size);
79IM3D_API void Vertex(const Vec3& _position, float _size, Color _color);
80IM3D_API void Vertex(float _x, float _y, float _z);
81IM3D_API void Vertex(float _x, float _y, float _z, Color _color);
82IM3D_API void Vertex(float _x, float _y, float _z, float _size);
83IM3D_API void Vertex(float _x, float _y, float _z, float _size, Color _color);
84
85// Color draw state (per vertex).
86IM3D_API void PushColor(); // push the stack top
87IM3D_API void PushColor(Color _color);
88IM3D_API void PopColor();
89IM3D_API void SetColor(Color _color);
90IM3D_API void SetColor(float _r, float _g, float _b, float _a = 1.0f);
92
93// Alpha draw state, multiplies the alpha set by the color draw state (per vertex).
94IM3D_API void PushAlpha(); // push the stack top
95IM3D_API void PushAlpha(float _alpha);
96IM3D_API void PopAlpha();
97IM3D_API void SetAlpha(float _alpha);
98IM3D_API float GetAlpha();
99
100// Size draw state, for points/lines this is the radius/width in pixels (per vertex).
101IM3D_API void PushSize(); // push the stack top
102IM3D_API void PushSize(float _size);
103IM3D_API void PopSize();
104IM3D_API void SetSize(float _size);
105IM3D_API float GetSize();
106
107// Sorting draw state, enable depth sorting between primitives (per primitive).
108IM3D_API void PushEnableSorting(); // push the stack top
109IM3D_API void PushEnableSorting(bool _enable);
111IM3D_API void EnableSorting(bool _enable);
112
113// Push/pop all draw states (color, alpha, size, sorting).
116
117// Transform state (per vertex).
118IM3D_API void PushMatrix(); // push stack top
119IM3D_API void PushMatrix(const Mat4& _mat4);
120IM3D_API void PopMatrix();
121IM3D_API void SetMatrix(const Mat4& _mat4);
122IM3D_API void SetIdentity();
123IM3D_API void MulMatrix(const Mat4& _mat4);
124IM3D_API void Translate(float _x, float _y, float _z);
125IM3D_API void Translate(const Vec3& _vec3);
126IM3D_API void Rotate(const Vec3& _axis, float _angle);
127IM3D_API void Rotate(const Mat3& _rotation);
128IM3D_API void Scale(float _x, float _y, float _z);
129
130// High order shapes. Where _detail = -1, an automatic level of detail is chosen based on the distance to the view origin (as specified via the AppData struct).
131IM3D_API void DrawXyzAxes();
132IM3D_API void DrawPoint(const Vec3& _position, float _size, Color _color);
133IM3D_API void DrawLine(const Vec3& _a, const Vec3& _b, float _size, Color _color);
134IM3D_API void DrawQuad(const Vec3& _a, const Vec3& _b, const Vec3& _c, const Vec3& _d);
135IM3D_API void DrawQuad(const Vec3& _origin, const Vec3& _normal, const Vec2& _size);
136IM3D_API void DrawQuadFilled(const Vec3& _a, const Vec3& _b, const Vec3& _c, const Vec3& _d);
137IM3D_API void DrawQuadFilled(const Vec3& _origin, const Vec3& _normal, const Vec2& _size);
138IM3D_API void DrawCircle(const Vec3& _origin, const Vec3& _normal, float _radius, int _detail = -1);
139IM3D_API void DrawCircleFilled(const Vec3& _origin, const Vec3& _normal, float _radius, int _detail = -1);
140IM3D_API void DrawSphere(const Vec3& _origin, float _radius, int _detail = -1);
141IM3D_API void DrawSphereFilled(const Vec3& _origin, float _radius, int _detail = -1);
142IM3D_API void DrawAlignedBox(const Vec3& _min, const Vec3& _max);
143IM3D_API void DrawAlignedBoxFilled(const Vec3& _min, const Vec3& _max);
144IM3D_API void DrawCylinder(const Vec3& _start, const Vec3& _end, float _radius, int _detail = -1);
145IM3D_API void DrawCylinderFilled(const Vec3& _start, const Vec3& _end, float _radius, bool _drawCapStart = true, bool _drawCapEnd = true, int _detail = -1);
146IM3D_API void DrawCapsule(const Vec3& _start, const Vec3& _end, float _radius, int _detail = -1);
147IM3D_API void DrawPrism(const Vec3& _start, const Vec3& _end, float _radius, int _sides);
148IM3D_API void DrawArrow(const Vec3& _start, const Vec3& _end, float _headLength = -1.0f, float _headThickness = -1.0f);
149
150IM3D_API void DrawCone2(const Vec3& _start, const Vec3& _end, float _radiusStart, float _radiusEnd, int _detail = -1);
151IM3D_API void DrawConeFilled2(const Vec3& _start, const Vec3& _end, float _radiusStart, float _radiusEnd, bool _drawCapStart = true, bool _drawCapEnd = true, int _detail = -1);
152#if IM3D_USE_DEPRECATED_DRAW_CONE
153 IM3D_API void DrawCone(const Vec3& _origin, const Vec3& _normal, float height, float _radius, int _detail = -1);
154 IM3D_API void DrawConeFilled(const Vec3& _origin, const Vec3& _normal, float height, float _radius, int _detail = -1);
155#else
156 IM3D_API inline void DrawCone(const Vec3& _start, const Vec3& _end, float _radiusStart, float _radiusEnd, int _detail = -1) { DrawCone2(_start, _end, _radiusStart, _radiusEnd, _detail); }
157 IM3D_API inline void DrawConeFilled(const Vec3& _start, const Vec3& _end, float _radiusStart, float _radiusEnd, bool _drawCapStart = true, bool _drawCapEnd = true, int _detail = -1) { DrawConeFilled2(_start, _end, _radiusStart, _radiusEnd, _drawCapStart, _drawCapEnd, _detail); }
158#endif // IM3D_USE_DEPRECATED_DRAW_CONE
159
160// Add text. See TextFlags_ enum for _textFlags. _size is a hint to the application-side text rendering.
161IM3D_API void Text(const Vec3& _position, U32 _textFlags, const char* _text, ...); // use the current draw state for size/color
162IM3D_API void Text(const Vec3& _position, float _size, Color _color, U32 _textFlags, const char* _text, ...);
163
164// IDs are used to uniquely identify gizmos and layers. Gizmo should have a unique ID during a frame.
165// Note that ids are a hash of the whole ID stack, see PushId(), PopId().
166IM3D_API Id MakeId(const char* _str);
167IM3D_API Id MakeId(const void* _ptr);
168IM3D_API Id MakeId(int _i);
169
170// PushId(), PopId() affect the result of subsequent calls to MakeId(), use when creating gizmos in a loop.
171IM3D_API void PushId(); // push stack top
172IM3D_API void PushId(Id _id);
173IM3D_API void PushId(const char* _str);
174IM3D_API void PushId(const void* _ptr);
175IM3D_API void PushId(int _i);
176IM3D_API void PopId();
178
179// Layer id state, subsequent primitives are added to a separate draw list associated with the id (per primitive).
180IM3D_API void PushLayerId(Id _layer);
181IM3D_API void PushLayerId(const char* _str); // calls PushLayerId(MakeId(_str))
182IM3D_API void PopLayerId();
184
185// Manipulate translation/rotation/scale via a gizmo. Return true if the gizmo is 'active' (if it modified the output parameter).
186// If _local is true, the Gizmo* functions expect that the local matrix is on the matrix stack; in general the application should
187// push the local matrix before calling any of the following.
188IM3D_API bool GizmoTranslation(const char* _id, float _translation_[3], bool _local = false);
189IM3D_API bool GizmoRotation(const char* _id, float _rotation_[3*3], bool _local = false);
190IM3D_API bool GizmoScale(const char* _id, float _scale_[3]); // local scale only
191// Unified gizmo, selects local/global, translation/rotation/scale based on the context-global gizmo modes. Return true if the gizmo is active.
192IM3D_API bool Gizmo(const char* _id, float _translation_[3], float _rotation_[3*3], float _scale_[3]); // any of _translation_/_rotation_/_scale_ may be null.
193IM3D_API bool Gizmo(const char* _id, float _transform_[4*4]);
194
195// Gizmo* overloads which take an ID directly. In some cases the app may want to call MakeId() separately, usually to change the gizmo appearance if hot/active.
196IM3D_API bool GizmoTranslation(Id _id, float _translation_[3], bool _local = false);
197IM3D_API bool GizmoRotation(Id _id, float _rotation_[3*3], bool _local = false);
198IM3D_API bool GizmoScale(Id _id, float _scale_[3]);
199IM3D_API bool Gizmo(Id _id, float _transform_[4*4]);
200IM3D_API bool Gizmo(Id _id, float _translation_[3], float _rotation_[3*3], float _scale_[3]);
201
202// Return true once when the current gizmo is made active.
204
205// Active gizmo ID. This will match the _id parameter passed to a Gizmo* function. Return Id_Invalid if no gizmo is in use.
207// ID of the current current 'hot' gizmo (nearest intersecting gizmo along the cursor ray).
209
210// Visibility tests. The application must set a culling frustum via AppData.
211IM3D_API bool IsVisible(const Vec3& _origin, float _radius); // sphere
212IM3D_API bool IsVisible(const Vec3& _min, const Vec3& _max); // axis-aligned bounding box
213
214// Get/set the current context. All Im3d calls affect the currently bound context.
215IM3D_API Context& GetContext();
216IM3D_API void SetContext(Context& _ctx);
217
218// Merge vertex data from _src into _dst_. Layers are preserved. Call before EndFrame().
219IM3D_API void MergeContexts(Context& _dst_, const Context& _src);
220
221
223{
224 float x, y;
225
226 Vec2() {}
227 Vec2(float _xy): x(_xy), y(_xy) {}
228 Vec2(float _x, float _y): x(_x), y(_y) {}
229
230 operator float*() { return &x; }
231 operator const float*() const { return &x; }
232
233 #ifdef IM3D_VEC2_APP
235 #endif
236};
237
239{
240 float x, y, z;
241
242 Vec3() {}
243 Vec3(float _xyz): x(_xyz), y(_xyz), z(_xyz) {}
244 Vec3(float _x, float _y, float _z): x(_x), y(_y), z(_z) {}
245 Vec3(const Vec2& _xy, float _z): x(_xy.x), y(_xy.y), z(_z) {}
246 Vec3(const Vec4& _v); // discards w
247
248 operator float*() { return &x; }
249 operator const float*() const { return &x; }
250
251 #ifdef IM3D_VEC3_APP
253 #endif
254};
255
257{
258 float x, y, z, w;
259
260 Vec4() {}
261 Vec4(float _xyzw): x(_xyzw), y(_xyzw), z(_xyzw), w(_xyzw) {}
262 Vec4(float _x, float _y, float _z, float _w): x(_x), y(_y), z(_z), w(_w) {}
263 Vec4(const Vec3& _xyz, float _w): x(_xyz.x), y(_xyz.y), z(_xyz.z), w(_w) {}
264 Vec4(Color _rgba);
265
266 operator float*() { return &x; }
267 operator const float*() const { return &x; }
268
269 #ifdef IM3D_VEC4_APP
271 #endif
272};
273
275{
276 float m[3*3]; // column-major unless IM3D_MATRIX_ROW_MAJOR defined
277
278 Mat3() {}
279 Mat3(float _diagonal);
280 Mat3(
281 float m00, float m01, float m02,
282 float m10, float m11, float m12,
283 float m20, float m21, float m22
284 );
285 Mat3(const Vec3& _colX, const Vec3& _colY, const Vec3& _colZ);
286 Mat3(const Mat4& _mat4); // extract upper 3x3
287
288 operator float*() { return m; }
289 operator const float*() const { return m; }
290
291 Vec3 getCol(int _i) const;
292 Vec3 getRow(int _i) const;
293 void setCol(int _i, const Vec3& _v);
294 void setRow(int _i, const Vec3& _v);
295
296 Vec3 getScale() const;
297 void setScale(const Vec3& _scale);
298
299 float operator()(int _row, int _col) const
300 {
301 #ifdef IM3D_MATRIX_ROW_MAJOR
302 int i = _row * 3 + _col;
303 #else
304 int i = _col * 3 + _row;
305 #endif
306 return m[i];
307 }
308 float& operator()(int _row, int _col)
309 {
310 #ifdef IM3D_MATRIX_ROW_MAJOR
311 int i = _row * 3 + _col;
312 #else
313 int i = _col * 3 + _row;
314 #endif
315 return m[i];
316 }
317
318 #ifdef IM3D_MAT3_APP
320 #endif
321};
322
324{
325 float m[4*4]; // column-major unless IM3D_MATRIX_ROW_MAJOR defined
326
327 Mat4() {}
328 Mat4(float _diagonal);
329 Mat4(
330 float m00, float m01, float m02, float m03,
331 float m10, float m11, float m12, float m13,
332 float m20, float m21, float m22, float m23,
333 float m30 = 0.0f, float m31 = 0.0f, float m32 = 0.0f, float m33 = 1.0f
334 );
335 Mat4(const Mat3& _mat3);
336 Mat4(const Vec3& _translation, const Mat3& _rotation, const Vec3& _scale);
337
338 operator float*() { return m; }
339 operator const float*() const { return m; }
340
341 Vec4 getCol(int _i) const;
342 Vec4 getRow(int _i) const;
343 void setCol(int _i, const Vec4& _v);
344 void setRow(int _i, const Vec4& _v);
345
346 Vec3 getTranslation() const;
347 void setTranslation(const Vec3& _translation);
348 Mat3 getRotation() const;
349 void setRotation(const Mat3& _rotation);
350 Vec3 getScale() const;
351 void setScale(const Vec3& _scale);
352
353 float operator()(int _row, int _col) const
354 {
355 #ifdef IM3D_MATRIX_ROW_MAJOR
356 int i = _row * 4 + _col;
357 #else
358 int i = _col * 4 + _row;
359 #endif
360 return m[i];
361 }
362 float& operator()(int _row, int _col)
363 {
364 #ifdef IM3D_MATRIX_ROW_MAJOR
365 int i = _row * 4 + _col;
366 #else
367 int i = _col * 4 + _row;
368 #endif
369 return m[i];
370 }
371
372 #ifdef IM3D_MAT4_APP
374 #endif
375};
376
378{
379 U32 v; // rgba8 (MSB = r)
380
381 constexpr Color(): v(0) {}
382 constexpr Color(U32 _rgba): v(_rgba) {}
383 Color(const Vec4& _rgba);
384 Color(const Vec3& _rgb, float _alpha);
385 Color(float _r, float _g, float _b, float _a = 1.0f);
386
387 operator U32() const { return v; }
388
389 void set(int _i, float _val)
390 {
391 _i *= 8;
392 U32 mask = 0xff << _i;
393 v = (v & ~mask) | (U32(_val * 255.0f) << _i);
394 }
395 void setR(float _val) { set(3, _val); }
396 void setG(float _val) { set(2, _val); }
397 void setB(float _val) { set(1, _val); }
398 void setA(float _val) { set(0, _val); }
399
400 float get(int _i) const
401 {
402 _i *= 8;
403 U32 mask = 0xff << _i;
404 return float((v & mask) >> _i) / 255.0f;
405 }
406 float getR() const { return get(3); }
407 float getG() const { return get(2); }
408 float getB() const { return get(1); }
409 float getA() const { return get(0); }
410
411 U32 getABGR() const
412 {
413 return 0
414 | ((v & (0xff << 24)) >> 24) // r
415 | ((v & (0xff << 16)) >> 8) // g
416 | ((v & (0xff << 8)) << 8) // b
417 | ((v & (0xff )) << 24) // a
418 ;
419 }
420};
421
422constexpr Color Color_Black = Color(0x000000ff);
423constexpr Color Color_White = Color(0xffffffff);
424constexpr Color Color_Gray = Color(0x808080ff);
425constexpr Color Color_Red = Color(0xff0000ff);
426constexpr Color Color_Green = Color(0x00ff00ff);
427constexpr Color Color_Blue = Color(0x0000ffff);
428constexpr Color Color_Magenta = Color(0xff00ffff);
429constexpr Color Color_Yellow = Color(0xffff00ff);
430constexpr Color Color_Cyan = Color(0x00ffffff);
431
432constexpr Color Color_Pink = Color(0xffc0cbff);
433constexpr Color Color_Orange = Color(0xffa500ff);
434constexpr Color Color_Gold = Color(0xffd700ff);
435constexpr Color Color_Brown = Color(0x8b4513ff);
436constexpr Color Color_Purple = Color(0x800080ff);
437constexpr Color Color_Teal = Color(0x008080ff);
438constexpr Color Color_Navy = Color(0x000080ff);
439
440struct alignas(IM3D_VERTEX_ALIGNMENT) VertexData
441{
442 Vec4 m_positionSize; // xyz = position, w = size
443 Color m_color; // rgba8 (MSB = r)
444
446 VertexData(const Vec3& _position, float _size, Color _color): m_positionSize(_position, _size), m_color(_color) {}
447};
448
450{
451 // order here determines the order in which unsorted primitives are drawn
455
457};
458
466typedef void (DrawPrimitivesCallback)(const DrawList& _drawList);
467
469{
474
475 TextFlags_Default = 0 // align center
476};
477
478struct alignas(IM3D_VERTEX_ALIGNMENT) TextData
479{
480 Vec4 m_positionSize; // xyz = position, w = size
481 Color m_color; // rgba8 (MSB = r)
482 U32 m_flags; // TextFlags
483 U32 m_textLength; // # chars in the text, excluding null terminator
484 U32 m_textBufferOffset; // start of the text in the draw list's text buffer
485};
486
494
514
526
528{
529 bool m_keyDown[Key_Count] = { false }; // Key states.
530 Vec4 m_cullFrustum[FrustumPlane_Count] = { Vec4(0.0f) }; // Frustum planes for culling (if culling enabled).
531 Vec3 m_cursorRayOrigin = Vec3(0.0f); // World space cursor ray origin.
532 Vec3 m_cursorRayDirection = Vec3(0.0f); // World space cursor ray direction.
533 Vec3 m_worldUp = Vec3(0.0f, 1.0f, 0.0f); // World space 'up' vector.
534 Vec3 m_viewOrigin = Vec3(0.0f); // World space render origin (camera position).
535 Vec3 m_viewDirection = Vec3(0.0f); // World space view direction.
536 Vec2 m_viewportSize = Vec2(0.0f); // Viewport size (pixels).
537 float m_projScaleY = 1.0f; // Scale factor used to convert from pixel size -> world scale; use tan(fov) for perspective projections, far plane height for ortho.
538 bool m_projOrtho = false; // If the projection matrix is orthographic.
539 float m_deltaTime = 0.0f; // Time since previous frame (seconds).
540 float m_snapTranslation = 0.0f; // Snap value for translation gizmos (world units). 0 = disabled.
541 float m_snapRotation = 0.0f; // Snap value for rotation gizmos (radians). 0 = disabled.
542 float m_snapScale = 0.0f; // Snap value for scale gizmos. 0 = disabled.
543 bool m_flipGizmoWhenBehind = true; // Flip gizmo axes when viewed from behind.
544 void* m_appData = nullptr; // App-specific data.
545
546 DrawPrimitivesCallback* drawCallback = nullptr; // e.g. void Im3d_Draw(const DrawList& _drawList)
547
548 // Extract cull frustum planes from the view-projection matrix.
549 // Set _ndcZNegativeOneToOne = true if the proj matrix maps z from [-1,1] (OpenGL style).
550 void setCullFrustum(const Mat4& _viewProj, bool _ndcZNegativeOneToOne);
551};
552
553// Minimal vector.
554template <typename T>
555struct Vector
556{
559
560 T& operator[](U32 _i) { IM3D_ASSERT(_i < m_size); return m_data[_i]; }
561 const T& operator[](U32 _i) const { IM3D_ASSERT(_i < m_size); return m_data[_i]; }
562 T* data() { return m_data; }
563 const T* data() const { return m_data; }
564
565 T& push_back() { if (m_size == m_capacity) { reserve(m_capacity + m_capacity / 2); } return m_data[m_size++]; }
566 void push_back(const T& _v) { T tmp = _v; if (m_size == m_capacity) { reserve(m_capacity + m_capacity / 2); } m_data[m_size++] = tmp; }
567 void pop_back() { IM3D_ASSERT(m_size > 0); --m_size; }
568 void append(const T* _v, U32 _count);
569 void append(const Vector<T>& _other) { append(_other.data(), _other.size()); }
570
571 T* begin() { return m_data; }
572 const T* begin() const { return m_data; }
573 T* end() { return m_data + m_size; }
574 const T* end() const { return m_data + m_size; }
575 T& front() { IM3D_ASSERT(m_size > 0); return m_data[0]; }
576 const T& front() const { IM3D_ASSERT(m_size > 0); return m_data[0]; }
577 T& back() { IM3D_ASSERT(m_size > 0); return m_data[m_size - 1]; }
578 const T& back() const { IM3D_ASSERT(m_size > 0); return m_data[m_size - 1]; }
579
580 U32 size() const { return m_size; }
581 U32 capacity() const { return m_capacity; }
582 bool empty() const { return m_size == 0; }
583
584 void clear() { m_size = 0; }
585 void reserve(U32 _capacity);
586 void resize(U32 _size, const T& _val);
587 void resize(U32 _size);
588
589 static void swap(Vector<T>& _a_, Vector<T>& _b_);
590
591private:
592
593 T* m_data = nullptr;
596};
597
598
615
616// Context stores all relevant state - main interface affects the context currently bound via SetCurrentContext().
618{
619 Context();
620 ~Context();
621
622 void begin(PrimitiveMode _mode);
623 void end();
624
625 void vertex(const Vec3& _position, float _size, Color _color);
626 void vertex(const Vec3& _position ) { vertex(_position, getSize(), getColor()); }
627
628 void text(const Vec3& _position, float _size, Color _color, TextFlags _flags, const char* _textStart, const char* _textEnd);
629 void text(const Vec3& _position, float _size, Color _color, TextFlags _flags, const char* _text, va_list _args);
630
631 void reset();
632 void merge(const Context& _src);
633 void endFrame();
634 void draw(); // DEPRECATED (see Im3d::Draw)
635
636 const DrawList* getDrawLists() const { return m_drawLists.data(); }
637 U32 getDrawListCount() const { return m_drawLists.size(); }
638
639 const TextDrawList* getTextDrawLists() const { return m_textDrawLists.data(); }
640 U32 getTextDrawListCount() const { return m_textDrawLists.size(); }
641
642
643 void setColor(Color _color) { m_colorStack.back() = _color; }
644 Color getColor() const { return m_colorStack.back(); }
645 void pushColor(Color _color) { m_colorStack.push_back(_color); }
646 void popColor() { IM3D_ASSERT(m_colorStack.size() > 1); m_colorStack.pop_back(); }
647
648 void setAlpha(float _alpha) { m_alphaStack.back() = _alpha; }
649 float getAlpha() const { return m_alphaStack.back(); }
650 void pushAlpha(float _alpha) { m_alphaStack.push_back(_alpha); }
651 void popAlpha() { IM3D_ASSERT(m_alphaStack.size() > 1); m_alphaStack.pop_back(); }
652
653 void setSize(float _size) { m_sizeStack.back() = _size; }
654 float getSize() const { return m_sizeStack.back(); }
655 void pushSize(float _size) { m_sizeStack.push_back(_size); }
656 void popSize() { IM3D_ASSERT(m_sizeStack.size() > 1); m_sizeStack.pop_back(); }
657
658 void setEnableSorting(bool _enable);
659 bool getEnableSorting() const { return m_enableSortingStack.back(); }
660 void pushEnableSorting(bool _enable);
661 void popEnableSorting();
662
663 Id getLayerId() const { return m_layerIdStack.back(); }
664 void pushLayerId(Id _layer);
665 void popLayerId();
666
667 void setMatrix(const Mat4& _mat4) { m_matrixStack.back() = _mat4; }
668 const Mat4& getMatrix() const { return m_matrixStack.back(); }
669 void pushMatrix(const Mat4& _mat4) { m_matrixStack.push_back(_mat4); }
670 void popMatrix() { IM3D_ASSERT(m_matrixStack.size() > 1); m_matrixStack.pop_back(); }
671
672 void setId(Id _id) { m_idStack.back() = _id; }
673 Id getId() const { return m_idStack.back(); }
674 void pushId(Id _id) { m_idStack.push_back(_id); }
675 void popId() { IM3D_ASSERT(m_idStack.size() > 1); m_idStack.pop_back(); }
677
679
680 // Low-level interface for internal and app-defined gizmos. May be subject to breaking changes.
681
682 bool gizmoAxisTranslation_Behavior(Id _id, const Vec3& _origin, const Vec3& _axis, float _snap, float _worldHeight, float _worldSize, Vec3* _out_);
683 void gizmoAxisTranslation_Draw(Id _id, const Vec3& _origin, const Vec3& _axis, float _worldHeight, float _worldSize, Color _color);
684
685 bool gizmoPlaneTranslation_Behavior(Id _id, const Vec3& _origin, const Vec3& _normal, float _snap, float _worldSize, Vec3* _out_);
686 void gizmoPlaneTranslation_Draw(Id _id, const Vec3& _origin, const Vec3& _normal, float _worldSize, Color _color);
687
688 bool gizmoAxislAngle_Behavior(Id _id, const Vec3& _origin, const Vec3& _axis, float _snap, float _worldRadius, float _worldSize, float* _out_);
689 void gizmoAxislAngle_Draw(Id _id, const Vec3& _origin, const Vec3& _axis, float _worldRadius, float _angle, Color _color, float _minAlpha);
690
691 bool gizmoAxisScale_Behavior(Id _id, const Vec3& _origin, const Vec3& _axis, float _snap, float _worldHeight, float _worldSize, float *_out_);
692 void gizmoAxisScale_Draw(Id _id, const Vec3& _origin, const Vec3& _axis, float _worldHeight, float _worldSize, Color _color);
693
694 // Convert pixels -> world space size based on distance between _position and view origin.
695 float pixelsToWorldSize(const Vec3& _position, float _pixels);
696 // Convert world space size -> pixels based on distance between _position and view origin.
697 float worldSizeToPixels(const Vec3& _position, float _pixels);
698 // Blend between _min and _max based on distance betwen _position and view origin.
699 int estimateLevelOfDetail(const Vec3& _position, float _worldSize, int _min = 4, int _max = 256);
700
701 // Make _id hot if _depth < m_hotDepth && _intersects.
702 bool makeHot(Id _id, float _depth, bool _intersects);
703 // Make _id active.
704 void makeActive(Id _id);
705 // Reset the acive/hot ids and the hot depth.
706 void resetId();
707
708 // Interpret key state.
709 bool isKeyDown(Key _key) const { return m_keyDownCurr[_key]; }
710 bool wasKeyPressed(Key _key) const { return m_keyDownCurr[_key] && !m_keyDownPrev[_key]; }
711
712 // Visibiity tests for culling.
713 bool isVisible(const VertexData* _vdata, DrawPrimitiveType _prim); // per-vertex
714 bool isVisible(const Vec3& _origin, float _radius); // sphere
715 bool isVisible(const Vec3& _min, const Vec3& _max); // axis-aligned box
716
717 // Gizmo state.
718
719 bool m_gizmoLocal; // Global mode selection for gizmos.
721 Id m_activeId; // Currently active gizmo. If set, this is the same as m_hotId.
722 Id m_hotId; // ID of the current 'hot' gizmo (nearest intersecting gizmo along the cursor ray). NB this is the id of the *sub* gizmo, not the app-specified ID.
723 float m_hotDepth; // Depth of the current hot gizmo along the cursor ray, for handling occlusion.
724 Id m_appId; // Current ID *without* the hashing the ID stack (= _id arg to Gizmo* functions).
725 Id m_appActiveId; // Copied from m_appId for the current active gizmo.
726 Id m_appHotId; // Copied from m_appId for the current 'hot' gizmo.
727 Id m_appIdActivated; // True for the first frame that an ID becomes active (useful for storing old value for undo).
728 Vec3 m_gizmoStateVec3; // Stored state for the active gizmo.
731 float m_gizmoHeightPixels; // Height/radius of gizmos.
732 float m_gizmoSizePixels; // Thickness of gizmo lines.
733
734
735 // Stats, debugging.
736
737 // Return the total number of primitives (sorted + unsorted) of the given _type in all layers.
739
740 // Return the total number of text primitives in all layers.
741 U32 getTextCount() const;
742
743 // Return the number of layers.
744 U32 getLayerCount() const { return m_layerIdMap.size(); }
745
746private:
747
748 // State stacks.
756
757 // Vertex data: one list per layer, per primitive type, *2 for sorted/unsorted.
759 Vector<VertexList*> m_vertexData[2]; // Each layer is DrawPrimitive_Count consecutive lists.
760 int m_vertexDataIndex; // 0, or 1 if sorting enabled.
761 Vector<Id> m_layerIdMap; // Map Id -> vertex data index.
762 int m_layerIndex; // Index of the currently active layer in m_layerIdMap.
763 Vector<DrawList> m_drawLists; // All draw lists for the current frame, available after calling endFrame() before calling reset().
764 bool m_sortCalled; // Avoid calling sort() during every call to draw().
765 bool m_endFrameCalled; // For assert, if vertices are pushed after endFrame() was called.
766
767 // Text data: one list per layer.
772
773 // Primitive state.
776 U32 m_firstVertThisPrim; // Index of the first vertex pushed during this primitive.
777 U32 m_vertCountThisPrim; // # calls to vertex() since the last call to begin().
780
781 // App data.
783 bool m_keyDownCurr[Key_Count]; // Key state captured during reset().
784 bool m_keyDownPrev[Key_Count]; // Key state from previous frame.
785 Vec4 m_cullFrustum[FrustumPlane_Count]; // Optimized frustum planes from m_appData.m_cullFrustum.
786 int m_cullFrustumCount; // # valid frustum planes in m_cullFrustum.
787
788 // Sort primitive data.
789 void sort();
790
791 // Return -1 if _id not found.
792 int findLayerIndex(Id _id) const;
793
794 // Access the current vertex/text data based on m_layerIndex.
797};
798
799namespace internal {
800
801#if IM3D_THREAD_LOCAL_CONTEXT_PTR
802 #define IM3D_THREAD_LOCAL thread_local
803#else
804 #define IM3D_THREAD_LOCAL
805#endif
806
807extern IM3D_THREAD_LOCAL Context* g_CurrentContext;
808
809}
810
811inline AppData& GetAppData() { return GetContext().getAppData(); }
812inline void NewFrame() { GetContext().reset(); }
813inline void EndFrame() { GetContext().endFrame(); }
814inline void Draw() { GetContext().draw(); }
815
816inline const DrawList* GetDrawLists() { return GetContext().getDrawLists(); }
817inline U32 GetDrawListCount() { return GetContext().getDrawListCount(); }
818
819inline const TextDrawList* GetTextDrawLists() { return GetContext().getTextDrawLists(); }
820inline U32 GetTextDrawListCount() { return GetContext().getTextDrawListCount(); }
821
822inline void BeginPoints() { GetContext().begin(PrimitiveMode_Points); }
823inline void BeginLines() { GetContext().begin(PrimitiveMode_Lines); }
828inline void End() { GetContext().end(); }
829
830inline void Vertex(const Vec3& _position) { GetContext().vertex(_position, GetContext().getSize(), GetContext().getColor()); }
831inline void Vertex(const Vec3& _position, Color _color) { GetContext().vertex(_position, GetContext().getSize(), _color); }
832inline void Vertex(const Vec3& _position, float _size) { GetContext().vertex(_position, _size, GetContext().getColor()); }
833inline void Vertex(const Vec3& _position, float _size, Color _color) { GetContext().vertex(_position, _size, _color); }
834inline void Vertex(float _x, float _y, float _z) { Vertex(Vec3(_x, _y, _z)); }
835inline void Vertex(float _x, float _y, float _z, Color _color) { Vertex(Vec3(_x, _y, _z), _color); }
836inline void Vertex(float _x, float _y, float _z, float _size) { Vertex(Vec3(_x, _y, _z), _size); }
837inline void Vertex(float _x, float _y, float _z, float _size, Color _color) { Vertex(Vec3(_x, _y, _z), _size, _color); }
838
839inline void PushDrawState() { Context& ctx = GetContext(); ctx.pushColor(ctx.getColor()); ctx.pushAlpha(ctx.getAlpha()); ctx.pushSize(ctx.getSize()); ctx.pushEnableSorting(ctx.getEnableSorting()); }
840inline void PopDrawState() { Context& ctx = GetContext(); ctx.popColor(); ctx.popAlpha(); ctx.popSize(); ctx.popEnableSorting(); }
841
842inline void PushColor() { GetContext().pushColor(GetContext().getColor()); }
843inline void PushColor(Color _color) { GetContext().pushColor(_color); }
844inline void PopColor() { GetContext().popColor(); }
845inline void SetColor(Color _color) { GetContext().setColor(_color); }
846inline void SetColor(float _r, float _g, float _b, float _a) { GetContext().setColor(Color(_r, _g, _b, _a)); }
847inline Color GetColor() { return GetContext().getColor(); }
848
849inline void PushAlpha() { GetContext().pushAlpha(GetContext().getAlpha()); }
850inline void PushAlpha(float _alpha) { GetContext().pushAlpha(_alpha); }
851inline void PopAlpha() { GetContext().popAlpha(); }
852inline void SetAlpha(float _alpha) { GetContext().setAlpha(_alpha); }
853inline float GetAlpha() { return GetContext().getAlpha(); }
854
855inline void PushSize() { GetContext().pushSize(GetContext().getAlpha()); }
856inline void PushSize(float _size) { GetContext().pushSize(_size); }
857inline void PopSize() { GetContext().popSize(); }
858inline void SetSize(float _size) { GetContext().setSize(_size); }
859inline float GetSize() { return GetContext().getSize(); }
860
861inline void PushEnableSorting() { GetContext().pushEnableSorting(GetContext().getEnableSorting()); }
862inline void PushEnableSorting(bool _enable) { GetContext().pushEnableSorting(_enable); }
863inline void PopEnableSorting() { GetContext().popEnableSorting(); }
864inline void EnableSorting(bool _enable) { GetContext().setEnableSorting(_enable); }
865
866inline void PushMatrix() { GetContext().pushMatrix(GetContext().getMatrix()); }
867inline void PushMatrix(const Mat4& _mat4) { GetContext().pushMatrix(_mat4); }
868inline void PopMatrix() { GetContext().popMatrix(); }
869inline void SetMatrix(const Mat4& _mat4) { GetContext().setMatrix(_mat4); }
870inline void SetIdentity() { GetContext().setMatrix(Mat4(1.0f)); }
871
872inline void PushId() { GetContext().pushId(GetContext().getId()); }
873inline void PushId(Id _id) { GetContext().pushId(_id); }
874inline void PushId(const char* _str) { GetContext().pushId(MakeId(_str)); }
875inline void PushId(const void* _ptr) { GetContext().pushId(MakeId(_ptr)); }
876inline void PushId(int _i) { GetContext().pushId(MakeId(_i)); }
877inline void PopId() { GetContext().popId(); }
878inline Id GetId() { return GetContext().getId(); }
879
880inline void PushLayerId() { GetContext().pushLayerId(GetContext().getLayerId()); }
881inline void PushLayerId(Id _layer) { GetContext().pushLayerId(_layer); }
882inline void PushLayerId(const char* _str) { PushLayerId(MakeId(_str)); }
883inline void PopLayerId() { GetContext().popLayerId(); }
884inline Id GetLayerId() { return GetContext().getLayerId(); }
885
886inline bool GizmoTranslation(const char* _id, float _translation_[3], bool _local) { return GizmoTranslation(MakeId(_id), _translation_, _local); }
887inline bool GizmoRotation(const char* _id, float _rotation_[3*3], bool _local) { return GizmoRotation(MakeId(_id), _rotation_, _local);}
888inline bool GizmoScale(const char* _id, float _scale_[3]) { return GizmoScale(MakeId(_id), _scale_); }
889inline bool Gizmo(const char* _id, float _translation_[3], float _rotation_[3*3], float _scale_[3]) { return Gizmo(MakeId(_id), _translation_, _rotation_, _scale_); }
890inline bool Gizmo(const char* _id, float _transform_[4*4]) { return Gizmo(MakeId(_id), _transform_); }
891inline bool GizmoWasActivated() { return GetContext().idWasActivated(); }
892inline Id GetActiveId() { return GetContext().m_appActiveId;}
893inline Id GetHotId() { return GetContext().m_appHotId; }
894
895inline bool IsVisible(const Vec3& _origin, float _radius) { return GetContext().isVisible(_origin, _radius); }
896inline bool IsVisible(const Vec3& _min, const Vec3& _max) { return GetContext().isVisible(_min, _max);}
897
899inline void SetContext(Context& _ctx) { internal::g_CurrentContext = &_ctx; }
900inline void MergeContexts(Context& _dst_, const Context& _src) { _dst_.merge(_src); }
901
902} // namespac Im3d
#define IM3D_API
Definition im3d.h:13
#define IM3D_THREAD_LOCAL
Definition im3d.h:804
#define IM3D_VEC4_APP
Definition im3d_config.h:52
#define IM3D_VEC2_APP
Definition im3d_config.h:42
#define IM3D_VEC3_APP
Definition im3d_config.h:45
#define IM3D_ASSERT(e)
Definition im3d_config.h:15
#define IM3D_MAT3_APP
Definition im3d_config.h:57
#define IM3D_MAT4_APP
Definition im3d_config.h:60
Definition im3d.h:799
IM3D_THREAD_LOCAL Context * g_CurrentContext
Definition im3d.cpp:1603
Definition im3d.h:27
IM3D_API void PushDrawState()
Definition im3d.h:839
IM3D_API AppData & GetAppData()
Definition im3d.h:811
IM3D_API void NewFrame()
Definition im3d.h:812
IM3D_API void DrawXyzAxes()
Definition im3d.cpp:148
IM3D_API void DrawCapsule(const Vec3 &_start, const Vec3 &_end, float _radius, int _detail=-1)
Definition im3d.cpp:471
IM3D_API void Vertex(const Vec3 &_position)
Definition im3d.h:830
IM3D_API void PushLayerId(Id _layer)
Definition im3d.h:881
IM3D_API void PopEnableSorting()
Definition im3d.h:863
IM3D_API void End()
Definition im3d.h:828
IM3D_API bool GizmoWasActivated()
Definition im3d.h:891
constexpr Color Color_Red
Definition im3d.h:425
IM3D_API void DrawArrow(const Vec3 &_start, const Vec3 &_end, float _headLength=-1.0f, float _headThickness=-1.0f)
Definition im3d.cpp:565
IM3D_API void BeginLines()
Definition im3d.h:823
constexpr Color Color_White
Definition im3d.h:423
IM3D_API void EnableSorting(bool _enable)
Definition im3d.h:864
IM3D_API void SetMatrix(const Mat4 &_mat4)
Definition im3d.h:869
GizmoMode
Definition im3d.h:610
@ GizmoMode_Rotation
Definition im3d.h:612
@ GizmoMode_Translation
Definition im3d.h:611
@ GizmoMode_Scale
Definition im3d.h:613
IM3D_API float GetSize()
Definition im3d.h:859
U32 Id
Definition im3d.h:42
constexpr Color Color_Orange
Definition im3d.h:433
IM3D_API Id GetLayerId()
Definition im3d.h:884
constexpr Color Color_Magenta
Definition im3d.h:428
IM3D_API void BeginTriangles()
Definition im3d.h:826
IM3D_API void BeginLineLoop()
Definition im3d.h:824
IM3D_API Id GetId()
Definition im3d.h:878
IM3D_API void Draw()
Definition im3d.h:814
constexpr Color Color_Purple
Definition im3d.h:436
IM3D_API Id GetHotId()
Definition im3d.h:893
IM3D_API void EndFrame()
Definition im3d.h:813
IM3D_API void MulMatrix(const Mat4 &_mat4)
Definition im3d.cpp:116
IM3D_API void DrawSphereFilled(const Vec3 &_origin, float _radius, int _detail=-1)
Definition im3d.cpp:326
IM3D_API void PushMatrix()
Definition im3d.h:866
IM3D_API void PopColor()
Definition im3d.h:844
IM3D_API U32 GetDrawListCount()
Definition im3d.h:817
IM3D_API void PopDrawState()
Definition im3d.h:840
IM3D_API U32 GetTextDrawListCount()
Definition im3d.h:820
IM3D_API void BeginPoints()
Definition im3d.h:822
IM3D_API void DrawCylinder(const Vec3 &_start, const Vec3 &_end, float _radius, int _detail=-1)
Definition im3d.cpp:463
IM3D_API void SetIdentity()
Definition im3d.h:870
IM3D_API void PushColor()
Definition im3d.h:842
constexpr Id Id_Invalid
Definition im3d.h:43
IM3D_API bool IsVisible(const Vec3 &_origin, float _radius)
Definition im3d.h:895
IM3D_API void SetContext(Context &_ctx)
Definition im3d.h:899
constexpr Color Color_Teal
Definition im3d.h:437
constexpr Color Color_Gold
Definition im3d.h:434
constexpr Color Color_Brown
Definition im3d.h:435
IM3D_API void DrawQuadFilled(const Vec3 &_a, const Vec3 &_b, const Vec3 &_c, const Vec3 &_d)
Definition im3d.cpp:200
IM3D_API Context & GetContext()
Definition im3d.h:898
IM3D_API void Translate(float _x, float _y, float _z)
Definition im3d.cpp:121
IM3D_API const DrawList * GetDrawLists()
Definition im3d.h:816
IM3D_API bool GizmoRotation(const char *_id, float _rotation_[3 *3], bool _local=false)
Definition im3d.h:887
constexpr Color Color_Pink
Definition im3d.h:432
constexpr Color Color_Green
Definition im3d.h:426
IM3D_API void BeginLineStrip()
Definition im3d.h:825
constexpr Color Color_Blue
Definition im3d.h:427
IM3D_API void DrawCone2(const Vec3 &_start, const Vec3 &_end, float _radiusStart, float _radiusEnd, int _detail=-1)
Definition im3d.cpp:590
IM3D_API void DrawCylinderFilled(const Vec3 &_start, const Vec3 &_end, float _radius, bool _drawCapStart=true, bool _drawCapEnd=true, int _detail=-1)
Definition im3d.cpp:467
IM3D_API void PopAlpha()
Definition im3d.h:851
IM3D_API void PopMatrix()
Definition im3d.h:868
DrawPrimitiveType
Definition im3d.h:450
@ DrawPrimitive_Lines
Definition im3d.h:453
@ DrawPrimitive_Count
Definition im3d.h:456
@ DrawPrimitive_Points
Definition im3d.h:454
@ DrawPrimitive_Triangles
Definition im3d.h:452
IM3D_API void BeginTriangleStrip()
Definition im3d.h:827
IM3D_API void DrawCone(const Vec3 &_start, const Vec3 &_end, float _radiusStart, float _radiusEnd, int _detail=-1)
Definition im3d.h:156
IM3D_API void PushEnableSorting()
Definition im3d.h:861
constexpr Color Color_Yellow
Definition im3d.h:429
IM3D_API void SetAlpha(float _alpha)
Definition im3d.h:852
IM3D_API void DrawCircle(const Vec3 &_origin, const Vec3 &_normal, float _radius, int _detail=-1)
Definition im3d.cpp:224
IM3D_API Id GetActiveId()
Definition im3d.h:892
IM3D_API void DrawQuad(const Vec3 &_a, const Vec3 &_b, const Vec3 &_c, const Vec3 &_d)
Definition im3d.cpp:178
constexpr Color Color_Gray
Definition im3d.h:424
void PushLayerId()
Definition im3d.h:880
IM3D_API void PushId()
Definition im3d.h:872
IM3D_API void DrawLine(const Vec3 &_a, const Vec3 &_b, float _size, Color _color)
Definition im3d.cpp:170
PrimitiveMode
Definition im3d.h:600
@ PrimitiveMode_Triangles
Definition im3d.h:606
@ PrimitiveMode_None
Definition im3d.h:601
@ PrimitiveMode_LineLoop
Definition im3d.h:605
@ PrimitiveMode_Lines
Definition im3d.h:603
@ PrimitiveMode_Points
Definition im3d.h:602
@ PrimitiveMode_TriangleStrip
Definition im3d.h:607
@ PrimitiveMode_LineStrip
Definition im3d.h:604
IM3D_API bool GizmoTranslation(const char *_id, float _translation_[3], bool _local=false)
Definition im3d.h:886
constexpr Color Color_Black
Definition im3d.h:422
IM3D_API void PopSize()
Definition im3d.h:857
IM3D_API void DrawAlignedBoxFilled(const Vec3 &_min, const Vec3 &_max)
Definition im3d.cpp:408
IM3D_API void SetSize(float _size)
Definition im3d.h:858
IM3D_API void DrawPrism(const Vec3 &_start, const Vec3 &_end, float _radius, int _sides)
Definition im3d.cpp:529
constexpr Color Color_Cyan
Definition im3d.h:430
IM3D_API Id MakeId(const char *_str)
Definition im3d.cpp:831
IM3D_API void Rotate(const Vec3 &_axis, float _angle)
Definition im3d.cpp:131
IM3D_API bool GizmoScale(const char *_id, float _scale_[3])
Definition im3d.h:888
IM3D_API void PopLayerId()
Definition im3d.h:883
unsigned int U32
Definition im3d.h:29
TextFlags
Definition im3d.h:469
@ TextFlags_AlignBottom
Definition im3d.h:473
@ TextFlags_AlignRight
Definition im3d.h:471
@ TextFlags_AlignLeft
Definition im3d.h:470
@ TextFlags_AlignTop
Definition im3d.h:472
@ TextFlags_Default
Definition im3d.h:475
IM3D_API void PushAlpha()
Definition im3d.h:849
FrustumPlane
Definition im3d.h:516
@ FrustumPlane_Right
Definition im3d.h:520
@ FrustumPlane_Near
Definition im3d.h:517
@ FrustumPlane_Count
Definition im3d.h:524
@ FrustumPlane_Bottom
Definition im3d.h:521
@ FrustumPlane_Top
Definition im3d.h:519
@ FrustumPlane_Left
Definition im3d.h:522
@ FrustumPlane_Far
Definition im3d.h:518
IM3D_API void DrawConeFilled(const Vec3 &_start, const Vec3 &_end, float _radiusStart, float _radiusEnd, bool _drawCapStart=true, bool _drawCapEnd=true, int _detail=-1)
Definition im3d.h:157
Key
Definition im3d.h:496
@ Action_GizmoTranslation
Definition im3d.h:510
@ Action_GizmoLocal
Definition im3d.h:507
@ Action_Select
Definition im3d.h:506
@ Action_GizmoRotation
Definition im3d.h:508
@ Key_Count
Definition im3d.h:503
@ Action_GizmoScale
Definition im3d.h:509
@ Key_S
Definition im3d.h:500
@ Key_R
Definition im3d.h:499
@ Key_L
Definition im3d.h:498
@ Mouse_Left
Definition im3d.h:497
@ Action_Count
Definition im3d.h:512
@ Key_T
Definition im3d.h:501
IM3D_API void PopId()
Definition im3d.h:877
IM3D_API Color GetColor()
Definition im3d.h:847
IM3D_API void DrawConeFilled2(const Vec3 &_start, const Vec3 &_end, float _radiusStart, float _radiusEnd, bool _drawCapStart=true, bool _drawCapEnd=true, int _detail=-1)
Definition im3d.cpp:647
IM3D_API float GetAlpha()
Definition im3d.h:853
IM3D_API void DrawPoint(const Vec3 &_position, float _size, Color _color)
Definition im3d.cpp:163
constexpr Color Color_Navy
Definition im3d.h:438
IM3D_API void MergeContexts(Context &_dst_, const Context &_src)
Definition im3d.h:900
IM3D_API const TextDrawList * GetTextDrawLists()
Definition im3d.h:819
IM3D_API bool Gizmo(const char *_id, float _translation_[3], float _rotation_[3 *3], float _scale_[3])
Definition im3d.h:889
void DrawPrimitivesCallback(const DrawList &_drawList)
Definition im3d.h:466
IM3D_API void PushSize()
Definition im3d.h:855
IM3D_API void SetColor(Color _color)
Definition im3d.h:845
IM3D_API void DrawAlignedBox(const Vec3 &_min, const Vec3 &_max)
Definition im3d.cpp:376
IM3D_API void DrawSphere(const Vec3 &_origin, float _radius, int _detail=-1)
Definition im3d.cpp:285
IM3D_API void DrawCircleFilled(const Vec3 &_origin, const Vec3 &_normal, float _radius, int _detail=-1)
Definition im3d.cpp:251
IM3D_API void Scale(float _x, float _y, float _z)
Definition im3d.cpp:141
Definition im3d.h:528
float m_snapRotation
Definition im3d.h:541
Vec2 m_viewportSize
Definition im3d.h:536
void setCullFrustum(const Mat4 &_viewProj, bool _ndcZNegativeOneToOne)
Definition im3d.cpp:1432
float m_snapScale
Definition im3d.h:542
float m_snapTranslation
Definition im3d.h:540
bool m_flipGizmoWhenBehind
Definition im3d.h:543
bool m_projOrtho
Definition im3d.h:538
float m_deltaTime
Definition im3d.h:539
Vec3 m_viewOrigin
Definition im3d.h:534
Vec3 m_cursorRayOrigin
Definition im3d.h:531
float m_projScaleY
Definition im3d.h:537
bool m_keyDown[Key_Count]
Definition im3d.h:529
void * m_appData
Definition im3d.h:544
Vec3 m_cursorRayDirection
Definition im3d.h:532
DrawPrimitivesCallback * drawCallback
Definition im3d.h:546
Vec3 m_viewDirection
Definition im3d.h:535
Vec4 m_cullFrustum[FrustumPlane_Count]
Definition im3d.h:530
Vec3 m_worldUp
Definition im3d.h:533
Definition im3d.h:378
void set(int _i, float _val)
Definition im3d.h:389
float getB() const
Definition im3d.h:408
void setG(float _val)
Definition im3d.h:396
float getR() const
Definition im3d.h:406
void setB(float _val)
Definition im3d.h:397
constexpr Color(U32 _rgba)
Definition im3d.h:382
constexpr Color()
Definition im3d.h:381
void setR(float _val)
Definition im3d.h:395
float getA() const
Definition im3d.h:409
U32 getABGR() const
Definition im3d.h:411
U32 v
Definition im3d.h:379
float getG() const
Definition im3d.h:407
void setA(float _val)
Definition im3d.h:398
float get(int _i) const
Definition im3d.h:400
Definition im3d.h:618
bool getEnableSorting() const
Definition im3d.h:659
DrawPrimitiveType m_primType
Definition im3d.h:775
bool isKeyDown(Key _key) const
Definition im3d.h:709
Vector< char > m_textBuffer
Definition im3d.h:770
float getAlpha() const
Definition im3d.h:649
U32 getPrimitiveCount(DrawPrimitiveType _type) const
Definition im3d.cpp:2923
Vector< TextList * > m_textData
Definition im3d.h:769
bool m_sortCalled
Definition im3d.h:764
Vector< bool > m_enableSortingStack
Definition im3d.h:752
U32 m_vertCountThisPrim
Definition im3d.h:777
Vector< float > m_alphaStack
Definition im3d.h:750
Id m_appIdActivated
Definition im3d.h:727
bool idWasActivated()
Definition im3d.h:676
void setColor(Color _color)
Definition im3d.h:643
bool m_keyDownPrev[Key_Count]
Definition im3d.h:784
void popColor()
Definition im3d.h:646
void vertex(const Vec3 &_position, float _size, Color _color)
Definition im3d.cpp:1690
void popId()
Definition im3d.h:675
void setMatrix(const Mat4 &_mat4)
Definition im3d.h:667
void pushMatrix(const Mat4 &_mat4)
Definition im3d.h:669
Id m_appActiveId
Definition im3d.h:725
float m_gizmoHeightPixels
Definition im3d.h:731
Vector< Mat4 > m_matrixStack
Definition im3d.h:753
void pushSize(float _size)
Definition im3d.h:655
void begin(PrimitiveMode _mode)
Definition im3d.cpp:1605
PrimitiveMode m_primMode
Definition im3d.h:774
float m_hotDepth
Definition im3d.h:723
U32 m_firstVertThisPrim
Definition im3d.h:776
Id getLayerId() const
Definition im3d.h:663
int findLayerIndex(Id _id) const
Definition im3d.cpp:2262
Vector< VertexData > VertexList
Definition im3d.h:758
U32 getTextDrawListCount() const
Definition im3d.h:640
Context()
Definition im3d.cpp:2058
void merge(const Context &_src)
Definition im3d.cpp:1917
Id getId() const
Definition im3d.h:673
void setSize(float _size)
Definition im3d.h:653
TextList * getCurrentTextList()
Definition im3d.cpp:2375
int m_cullFrustumCount
Definition im3d.h:786
Vector< Id > m_layerIdMap
Definition im3d.h:761
bool m_keyDownCurr[Key_Count]
Definition im3d.h:783
Vec3 m_gizmoStateVec3
Definition im3d.h:728
int m_vertexDataIndex
Definition im3d.h:760
Vector< TextData > TextList
Definition im3d.h:768
void setId(Id _id)
Definition im3d.h:672
Vector< TextDrawList > m_textDrawLists
Definition im3d.h:771
Vec3 m_maxVertThisPrim
Definition im3d.h:779
void sort()
Definition im3d.cpp:2159
void end()
Definition im3d.cpp:1631
bool m_gizmoLocal
Definition im3d.h:719
Vector< VertexList * > m_vertexData[2]
Definition im3d.h:759
const Mat4 & getMatrix() const
Definition im3d.h:668
Vector< float > m_sizeStack
Definition im3d.h:751
void pushColor(Color _color)
Definition im3d.h:645
float m_gizmoSizePixels
Definition im3d.h:732
AppData & getAppData()
Definition im3d.h:678
Id m_appId
Definition im3d.h:724
GizmoMode m_gizmoMode
Definition im3d.h:720
Vector< Id > m_idStack
Definition im3d.h:754
Mat3 m_gizmoStateMat3
Definition im3d.h:729
Id m_hotId
Definition im3d.h:722
void setAlpha(float _alpha)
Definition im3d.h:648
void vertex(const Vec3 &_position)
Definition im3d.h:626
float getSize() const
Definition im3d.h:654
Id m_appHotId
Definition im3d.h:726
Vector< Color > m_colorStack
Definition im3d.h:749
void popMatrix()
Definition im3d.h:670
Vector< DrawList > m_drawLists
Definition im3d.h:763
const DrawList * getDrawLists() const
Definition im3d.h:636
U32 getTextCount() const
Definition im3d.cpp:2936
void popSize()
Definition im3d.h:656
Vec4 m_cullFrustum[FrustumPlane_Count]
Definition im3d.h:785
void pushAlpha(float _alpha)
Definition im3d.h:650
Vector< Id > m_layerIdStack
Definition im3d.h:755
void pushId(Id _id)
Definition im3d.h:674
AppData m_appData
Definition im3d.h:782
bool wasKeyPressed(Key _key) const
Definition im3d.h:710
void popAlpha()
Definition im3d.h:651
float m_gizmoStateFloat
Definition im3d.h:730
U32 getLayerCount() const
Definition im3d.h:744
VertexList * getCurrentVertexList()
Definition im3d.cpp:2370
Color getColor() const
Definition im3d.h:644
bool m_endFrameCalled
Definition im3d.h:765
const TextDrawList * getTextDrawLists() const
Definition im3d.h:639
Id m_activeId
Definition im3d.h:721
U32 getDrawListCount() const
Definition im3d.h:637
Vec3 m_minVertThisPrim
Definition im3d.h:778
int m_layerIndex
Definition im3d.h:762
Definition im3d.h:460
const VertexData * m_vertexData
Definition im3d.h:463
Id m_layerId
Definition im3d.h:461
DrawPrimitiveType m_primType
Definition im3d.h:462
U32 m_vertexCount
Definition im3d.h:464
Definition im3d.h:275
float m[3 *3]
Definition im3d.h:276
Mat3()
Definition im3d.h:278
float operator()(int _row, int _col) const
Definition im3d.h:299
float & operator()(int _row, int _col)
Definition im3d.h:308
Definition im3d.h:324
Mat4()
Definition im3d.h:327
float & operator()(int _row, int _col)
Definition im3d.h:362
float operator()(int _row, int _col) const
Definition im3d.h:353
float m[4 *4]
Definition im3d.h:325
Definition im3d.h:479
Vec4 m_positionSize
Definition im3d.h:480
U32 m_flags
Definition im3d.h:482
U32 m_textLength
Definition im3d.h:483
Color m_color
Definition im3d.h:481
U32 m_textBufferOffset
Definition im3d.h:484
Definition im3d.h:488
Id m_layerId
Definition im3d.h:489
const TextData * m_textData
Definition im3d.h:490
const char * m_textBuffer
Definition im3d.h:492
U32 m_textDataCount
Definition im3d.h:491
Definition im3d.h:223
Vec2(float _xy)
Definition im3d.h:227
Vec2(float _x, float _y)
Definition im3d.h:228
float y
Definition im3d.h:224
Vec2()
Definition im3d.h:226
float x
Definition im3d.h:224
Definition im3d.h:239
Vec3(float _xyz)
Definition im3d.h:243
float y
Definition im3d.h:240
Vec3(const Vec2 &_xy, float _z)
Definition im3d.h:245
float x
Definition im3d.h:240
float z
Definition im3d.h:240
Vec3(float _x, float _y, float _z)
Definition im3d.h:244
Vec3()
Definition im3d.h:242
Definition im3d.h:257
Vec4()
Definition im3d.h:260
float z
Definition im3d.h:258
Vec4(float _x, float _y, float _z, float _w)
Definition im3d.h:262
float y
Definition im3d.h:258
float x
Definition im3d.h:258
Vec4(const Vec3 &_xyz, float _w)
Definition im3d.h:263
Vec4(float _xyzw)
Definition im3d.h:261
float w
Definition im3d.h:258
Definition im3d.h:556
U32 size() const
Definition im3d.h:580
bool empty() const
Definition im3d.h:582
VertexData * m_data
Definition im3d.h:593
const T & front() const
Definition im3d.h:576
~Vector()
Definition im3d.cpp:1514
T * end()
Definition im3d.h:573
void append(const Vector< T > &_other)
Definition im3d.h:569
T & push_back()
Definition im3d.h:565
void push_back(const T &_v)
Definition im3d.h:566
T * begin()
Definition im3d.h:571
T & front()
Definition im3d.h:575
static void swap(Vector< T > &_a_, Vector< T > &_b_)
Definition im3d.cpp:1575
const T * begin() const
Definition im3d.h:572
Vector()
Definition im3d.h:557
void resize(U32 _size, const T &_val)
Definition im3d.cpp:1555
void pop_back()
Definition im3d.h:567
U32 capacity() const
Definition im3d.h:581
const T * data() const
Definition im3d.h:563
const T & back() const
Definition im3d.h:578
U32 m_capacity
Definition im3d.h:595
const T * end() const
Definition im3d.h:574
T & operator[](U32 _i)
Definition im3d.h:560
void resize(U32 _size)
Definition im3d.cpp:1567
T & back()
Definition im3d.h:577
void reserve(U32 _capacity)
U32 m_size
Definition im3d.h:594
void append(const T *_v, U32 _count)
Definition im3d.cpp:1524
void clear()
Definition im3d.h:584
T * data()
Definition im3d.h:562
const T & operator[](U32 _i) const
Definition im3d.h:561
Definition im3d.h:441
VertexData()
Definition im3d.h:445
Color m_color
Definition im3d.h:443
VertexData(const Vec3 &_position, float _size, Color _color)
Definition im3d.h:446
Vec4 m_positionSize
Definition im3d.h:442