Blender V5.0
MultiTest.c
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5/* Developers Note:
6 *
7 * This test currently only creates windows and draws a 'dot' under the cursor on LMB,
8 * quits when Q is pressed.
9 *
10 * More work is needed for logging drawing to work properly.
11 *
12 * - Use GPU_matrix API.
13 * - Replace old OpenGL calls to `glColor`, etc with `imm` API.
14 * - Investigate BLF font flushing (`UI_widgetbase_draw_cache_flush`) which is currently disabled.
15 */
16
17#ifdef _MSC_VER
18# pragma warning(disable : 4244 4305)
19#endif
20
21#include <math.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25
26#include "GL.h"
27#include <GL/glew.h>
28
29#include "MEM_guardedalloc.h"
30
31#include "GHOST_C-api.h"
32
33#include "BLF_api.hh"
34
35#include "Basic.h"
36#include "EventToBuf.h"
37#include "ScrollBar.h"
38#include "Util.h"
39
40#include "WindowData.h"
41
42/* GPU API. */
43#include "GPU_context.hh"
44#include "GPU_immediate.hh"
45#include "GPU_init_exit.hh"
46
47extern int datatoc_bfont_ttf_size;
48extern char const datatoc_bfont_ttf[];
49
52
53void loggerwindow_log(LoggerWindow *lw, char *line);
54
58GHOST_SystemHandle multitestapp_get_system(MultiTestApp *app);
60
61/**/
62
63void rect_bevel_side(int rect[2][2], int side, float *lt, float *dk, const float col[3], int width)
64{
65 int ltidx = (side / 2) % 4;
66 int dkidx = (ltidx + 1 + (side & 1)) % 4;
67 int i, corner;
68
69 glBegin(GL_LINES);
70 for (i = 0; i < width; i++) {
71 float ltf = pow(lt[i], 1.0 / 2.2), dkf = pow(dk[i], 1.0 / 2.2);
72 float stf = (dkidx > ltidx) ? dkf : ltf;
73 int lx = rect[1][0] - i - 1;
74 int ly = rect[0][1] + i;
75
76 glColor3f(col[0] * stf, col[1] * stf, col[2] * stf);
77 for (corner = 0; corner < 4; corner++) {
78 int x = (corner == 0 || corner == 1) ? (rect[0][0] + i) : (rect[1][0] - i - 1);
79 int y = (corner == 0 || corner == 3) ? (rect[0][1] + i) : (rect[1][1] - i - 1);
80
81 if (ltidx == corner) {
82 glColor3f(col[0] * ltf, col[1] * ltf, col[2] * ltf);
83 }
84 if (dkidx == corner) {
85 glColor3f(col[0] * dkf, col[1] * dkf, col[2] * dkf);
86 }
87
88 glVertex2i(lx, ly);
89 glVertex2i(lx = x, ly = y);
90 }
91 }
92 glEnd();
93
94 glColor3fv(col);
95 glRecti(rect[0][0] + width, rect[0][1] + width, rect[1][0] - width, rect[1][1] - width);
96}
97
98void rect_bevel_smooth(int rect[2][2], int width)
99{
100 float *lt = malloc(sizeof(*lt) * width);
101 float *dk = malloc(sizeof(*dk) * width);
102 float col[4];
103 int i;
104
105 for (i = 0; i < width; i++) {
106 float v = width - 1 ? ((float)i / (width - 1)) : 0;
107 lt[i] = 1.2 + (1.0 - 1.2) * v;
108 dk[i] = 0.2 + (1.0 - 0.2) * v;
109 }
110
111 glGetFloatv(GL_CURRENT_COLOR, col);
112
113 rect_bevel_side(rect, 3, lt, dk, col, width);
114
115 free(lt);
116 free(dk);
117}
118
119/*
120 * MainWindow
121 */
122
123typedef struct {
125
126 GHOST_WindowHandle win;
127 GPUContext *gpu_context;
128
129 int size[2];
130
131 int lmouse[2], lmbut[3];
132
133 int tmouse[2];
134} MainWindow;
135
136static void mainwindow_log(MainWindow *mw, char *str)
137{
139}
140
142{
146
147 if (mw->lmbut[0]) {
148 glClearColor(0.5, 0.5, 0.5, 1);
149 }
150 else {
151 glClearColor(1, 1, 1, 1);
152 }
153 glClear(GL_COLOR_BUFFER_BIT);
154
155 glColor3f(0.5, 0.6, 0.8);
156 glRecti(mw->tmouse[0] - 5, mw->tmouse[1] - 5, mw->tmouse[0] + 5, mw->tmouse[1] + 5);
157
159}
160
162{
163 GHOST_RectangleHandle bounds = GHOST_GetClientBounds(mw->win);
164
167
170
171 glViewport(0, 0, mw->size[0], mw->size[1]);
172
173 glMatrixMode(GL_PROJECTION);
174 glLoadIdentity();
175 glOrtho(0, mw->size[0], 0, mw->size[1], -1, 1);
176 glTranslatef(0.375, 0.375, 0.0);
177
178 glMatrixMode(GL_MODELVIEW);
179 glLoadIdentity();
180}
181
182static void mainwindow_do_key(MainWindow *mw, GHOST_TKey key, int press)
183{
184 switch (key) {
185 case GHOST_kKeyC:
186 if (press) {
189 }
190 break;
192 if (press) {
193 GHOST_SetCursorVisibility(mw->win, false);
194 }
195 break;
197 if (press) {
199 }
200 break;
201 case GHOST_kKeyE:
202 if (press) {
204 }
205 break;
206 case GHOST_kKeyQ:
207 if (press) {
209 }
210 break;
211 case GHOST_kKeyT:
212 if (press) {
213 mainwindow_log(mw, "TextTest~|`hello`\"world\",<>/");
214 }
215 break;
216 case GHOST_kKeyR:
217 if (press) {
218 int i;
219
220 mainwindow_log(mw, "Invalidating window 10 times");
221 for (i = 0; i < 10; i++) {
223 }
224 }
225 break;
226 case GHOST_kKeyF11:
227 if (press) {
229 }
230 break;
231 }
232}
233
234static void mainwindow_do_move(MainWindow *mw, int x, int y)
235{
236 mw->lmouse[0] = x, mw->lmouse[1] = y;
237
238 if (mw->lmbut[0]) {
239 mw->tmouse[0] = x, mw->tmouse[1] = y;
241 }
242}
243
244static void mainwindow_do_button(MainWindow *mw, int which, int press)
245{
246 if (which == GHOST_kButtonMaskLeft) {
247 mw->lmbut[0] = press;
248 mw->tmouse[0] = mw->lmouse[0], mw->tmouse[1] = mw->lmouse[1];
250 }
251 else if (which == GHOST_kButtonMaskLeft) {
252 mw->lmbut[1] = press;
253 }
254 else if (which == GHOST_kButtonMaskLeft) {
255 mw->lmbut[2] = press;
256 }
257}
258
259static void mainwindow_handle(void *priv, GHOST_EventHandle evt)
260{
261 MainWindow *mw = priv;
263 char buf[256];
264
265 event_to_buf(evt, buf);
266 mainwindow_log(mw, buf);
267
268 switch (type) {
271 int x, y;
272 GHOST_ScreenToClient(mw->win, cd->x, cd->y, &x, &y);
273 mainwindow_do_move(mw, x, mw->size[1] - y - 1);
274 break;
275 }
280 break;
281 }
283 case GHOST_kEventKeyUp: {
285 mainwindow_do_key(mw, kd->key, (type == GHOST_kEventKeyDown));
286 break;
287 }
288
291 break;
294 break;
295 }
296}
297
298/**/
299
300static void mainwindow_timer_proc(GHOST_TimerTaskHandle task, uint64_t time)
301{
303 char buf[64];
304
305 sprintf(buf, "timer: %6.2f", (double)((int64_t)time) / 1000);
306 mainwindow_log(mw, buf);
307}
308
310{
311 GHOST_SystemHandle sys = multitestapp_get_system(app);
312 GHOST_WindowHandle win;
313 GHOST_GPUSettings gpu_settings = {0};
314
315 win = GHOST_CreateWindow(sys,
316 NULL,
317 "MultiTest:Main",
318 40,
319 40,
320 400,
321 400,
323 false,
324 GHOST_kDrawingContextTypeOpenGL,
325 gpu_settings);
326
327 if (win) {
328 MainWindow *mw = MEM_callocN(sizeof(*mw), "mainwindow_new");
329
330 mw->gpu_context = GPU_context_create(win, NULL);
331 GPU_init();
332
333 mw->app = app;
334 mw->win = win;
335
337
338 GHOST_InstallTimer(sys, 1000, 10000, mainwindow_timer_proc, mw);
339
340 return mw;
341 }
342 return NULL;
343}
344
346{
347 GHOST_SystemHandle sys = multitestapp_get_system(mw->app);
348
350 GHOST_DisposeWindow(sys, mw->win);
351 MEM_freeN(mw);
352}
353
354/*
355 * LoggerWindow
356 */
357
360
361 GHOST_WindowHandle win;
362 GPUContext *gpu_context;
363
364 int font;
366
367 int size[2];
368
370 int textarea[2][2];
372
373 char **loglines;
375
376 int lmbut[3];
377 int lmouse[2];
378};
379
380#define SCROLLBAR_PAD 2
381#define SCROLLBAR_WIDTH 14
382#define TEXTAREA_PAD 2
384{
385 int nscroll[2][2];
386
387 nscroll[0][0] = SCROLLBAR_PAD;
388 nscroll[0][1] = SCROLLBAR_PAD;
389 nscroll[1][0] = nscroll[0][0] + SCROLLBAR_WIDTH;
390 nscroll[1][1] = lw->size[1] - SCROLLBAR_PAD - 1;
391
392 lw->textarea[0][0] = nscroll[1][0] + TEXTAREA_PAD;
393 lw->textarea[0][1] = TEXTAREA_PAD;
394 lw->textarea[1][0] = lw->size[0] - TEXTAREA_PAD - 1;
395 lw->textarea[1][1] = lw->size[1] - TEXTAREA_PAD - 1;
396
397 lw->ndisplines = (lw->textarea[1][1] - lw->textarea[0][1]) / lw->fontheight;
398
399 scrollbar_set_thumbpct(lw->scroll, (float)lw->ndisplines / lw->nloglines);
400 scrollbar_set_rect(lw->scroll, nscroll);
401}
402
404{
405 glViewport(0, 0, lw->size[0], lw->size[1]);
406
407 glMatrixMode(GL_PROJECTION);
408 glLoadIdentity();
409 glOrtho(0, lw->size[0], 0, lw->size[1], -1, 1);
410 glTranslatef(0.375, 0.375, 0.0);
411
412 glMatrixMode(GL_MODELVIEW);
413 glLoadIdentity();
414}
415
429
431{
432 int i, ndisplines, startline;
433 int sb_rect[2][2], sb_thumb[2][2];
434
438
439 glClearColor(1, 1, 1, 1);
440 glClear(GL_COLOR_BUFFER_BIT);
441
442 glColor3f(0.8, 0.8, 0.8);
444
445 scrollbar_get_rect(lw->scroll, sb_rect);
446 scrollbar_get_thumb(lw->scroll, sb_thumb);
447
448 glColor3f(0.6, 0.6, 0.6);
449 rect_bevel_smooth(sb_rect, 1);
450
452 glColor3f(0.6, 0.7, 0.5);
453 }
454 else {
455 glColor3f(0.9, 0.9, 0.92);
456 }
457 rect_bevel_smooth(sb_thumb, 1);
458
459 startline = scrollbar_get_thumbpos(lw->scroll) * (lw->nloglines - 1);
460 ndisplines = min_i(lw->ndisplines, lw->nloglines - startline);
461
462 glColor3f(0, 0, 0);
463 for (i = 0; i < ndisplines; i++) {
464 /* stored in reverse order */
465 char *line = lw->loglines[(lw->nloglines - 1) - (i + startline)];
466 int x_pos = lw->textarea[0][0] + 4;
467 int y_pos = lw->textarea[0][1] + 4 + i * lw->fontheight;
468
469 BLF_position(lw->font, x_pos, y_pos, 0.0);
470 BLF_draw(lw->font, line, 256); // XXX
471 }
472
474
476}
477
478static void loggerwindow_do_move(LoggerWindow *lw, int x, int y)
479{
480 lw->lmouse[0] = x, lw->lmouse[1] = y;
481
485 }
486}
487
488static void loggerwindow_do_button(LoggerWindow *lw, int which, int press)
489{
490 if (which == GHOST_kButtonMaskLeft) {
491 lw->lmbut[0] = press;
492
493 if (press) {
494 if (scrollbar_contains_pt(lw->scroll, lw->lmouse)) {
498 }
499 }
500 else {
505 }
506 }
507 }
508 else if (which == GHOST_kButtonMaskMiddle) {
509 lw->lmbut[1] = press;
510 }
511 else if (which == GHOST_kButtonMaskRight) {
512 lw->lmbut[2] = press;
513 }
514}
515
516static void loggerwindow_do_key(LoggerWindow *lw, GHOST_TKey key, int press)
517{
518 switch (key) {
519 case GHOST_kKeyQ:
520 if (press) {
522 }
523 break;
524 }
525}
526
527static void loggerwindow_handle(void *priv, GHOST_EventHandle evt)
528{
529 LoggerWindow *lw = priv;
531
532 switch (type) {
535 int x, y;
536 GHOST_ScreenToClient(lw->win, cd->x, cd->y, &x, &y);
537 loggerwindow_do_move(lw, x, lw->size[1] - y - 1);
538 break;
539 }
544 break;
545 }
547 case GHOST_kEventKeyUp: {
549 loggerwindow_do_key(lw, kd->key, (type == GHOST_kEventKeyDown));
550 break;
551 }
552
555 break;
558 break;
559 }
560}
561
562/**/
563
565{
566 GHOST_GPUSettings gpu_settings = {0};
567 GHOST_SystemHandle sys = multitestapp_get_system(app);
568 uint32_t screensize[2];
569 GHOST_WindowHandle win;
570
571 int posx = 40;
572 int posy = 0;
573 if (GHOST_GetMainDisplayDimensions(sys, &screensize[0], &screensize[1]) == GHOST_kSuccess) {
574 posy = screensize[1] - 432;
575 }
576
577 win = GHOST_CreateWindow(sys,
578 NULL,
579 "MultiTest:Logger",
580 posx,
581 posy,
582 800,
583 300,
585 false,
586 GHOST_kDrawingContextTypeOpenGL,
587 gpu_settings);
588
589 if (win) {
590 LoggerWindow *lw = MEM_callocN(sizeof(*lw), "loggerwindow_new");
591
592 lw->gpu_context = GPU_context_create(win, NULL);
593 GPU_init();
594
595 int bbox[2][2];
596 lw->app = app;
597 lw->win = win;
598
599 lw->font = BLF_load_default(false);
600 BLF_size(lw->font, 11, 72);
601 lw->fontheight = BLF_height(lw->font, "A_", 2);
602
603 lw->nloglines = lw->logsize = 0;
604 lw->loglines = MEM_mallocN(sizeof(*lw->loglines) * lw->nloglines, "loglines");
605
606 lw->scroll = scrollbar_new(2, 40);
607
609
611
612 return lw;
613 }
614 else {
615 return NULL;
616 }
617}
618
619void loggerwindow_log(LoggerWindow *lw, char *line)
620{
621 if (lw->nloglines == lw->logsize) {
622 lw->loglines = memdbl(lw->loglines, &lw->logsize, sizeof(*lw->loglines));
623 }
624
625 lw->loglines[lw->nloglines++] = string_dup(line);
626 scrollbar_set_thumbpct(lw->scroll, (float)lw->ndisplines / lw->nloglines);
627
629}
630
632{
633 GHOST_SystemHandle sys = multitestapp_get_system(lw->app);
634 int i;
635
636 for (i = 0; i < lw->nloglines; i++) {
637 MEM_freeN(lw->loglines[i]);
638 }
639 MEM_freeN(lw->loglines);
640
642 GHOST_DisposeWindow(sys, lw->win);
643 MEM_freeN(lw);
644}
645
646/*
647 * ExtraWindow
648 */
649
650typedef struct {
652
653 GHOST_WindowHandle win;
654 GPUContext *gpu_context;
655
656 int size[2];
658
660{
664
665 glClearColor(1, 1, 1, 1);
666 glClear(GL_COLOR_BUFFER_BIT);
667
668 glColor3f(0.8, 0.8, 0.8);
669 glRecti(10, 10, ew->size[0] - 10, ew->size[1] - 10);
670
672}
673
675{
676 GHOST_RectangleHandle bounds = GHOST_GetClientBounds(ew->win);
677
680
683
684 glViewport(0, 0, ew->size[0], ew->size[1]);
685
686 glMatrixMode(GL_PROJECTION);
687 glLoadIdentity();
688 glOrtho(0, ew->size[0], 0, ew->size[1], -1, 1);
689 glTranslatef(0.375, 0.375, 0.0);
690
691 glMatrixMode(GL_MODELVIEW);
692 glLoadIdentity();
693}
694
695static void extrawindow_do_key(ExtraWindow *ew, GHOST_TKey key, int press)
696{
697 switch (key) {
698 case GHOST_kKeyE:
699 if (press) {
701 }
702 break;
703 }
704}
705
707{
708 uint8_t bitmap[16][2];
709 uint8_t mask[16][2];
710 double ftime = (double)((int64_t)time) / 1000;
711 float angle = fmod(ftime, 1.0) * 3.1415 * 2;
712 int i;
713
714 memset(&bitmap, 0, sizeof(bitmap));
715 memset(&mask, 0, sizeof(mask));
716
717 bitmap[0][0] |= mask[0][0] |= 0xF;
718 bitmap[1][0] |= mask[1][0] |= 0xF;
719 bitmap[2][0] |= mask[2][0] |= 0xF;
720 bitmap[3][0] |= mask[3][0] |= 0xF;
721
722 for (i = 0; i < 7; i++) {
723 int x = 7 + cos(angle) * i;
724 int y = 7 + sin(angle) * i;
725
726 mask[y][x / 8] |= (1 << (x % 8));
727 }
728 for (i = 0; i < 64; i++) {
729 float v = (i / 63.0) * 3.1415 * 2;
730 int x = 7 + cos(v) * 7;
731 int y = 7 + sin(v) * 7;
732
733 mask[y][x / 8] |= (1 << (x % 8));
734 }
735
736 const int size[2] = {16, 16};
737 const int hot_spot[2] = {0, 0};
738
739 GHOST_SetCustomCursorShape(ew->win, &bitmap[0][0], &mask[0][0], size, hot_spot, true);
740}
741
742static void extrawindow_handle(void *priv, GHOST_EventHandle evt)
743{
744 ExtraWindow *ew = priv;
746 char buf[256];
747
748 event_to_buf(evt, buf);
750
751 switch (type) {
753 case GHOST_kEventKeyUp: {
755 extrawindow_do_key(ew, kd->key, (type == GHOST_kEventKeyDown));
756 break;
757 }
758
761 break;
762 }
763
766 break;
769 break;
772 break;
773 }
774}
775
776/**/
777
779{
780 GHOST_GPUSettings gpu_settings = {0};
781 GHOST_SystemHandle sys = multitestapp_get_system(app);
782 GHOST_WindowHandle win;
783
784 win = GHOST_CreateWindow(sys,
785 NULL,
786 "MultiTest:Extra",
787 500,
788 40,
789 400,
790 400,
792 false,
793 GHOST_kDrawingContextTypeOpenGL,
794 gpu_settings);
795
796 if (win) {
797 ExtraWindow *ew = MEM_callocN(sizeof(*ew), "mainwindow_new");
798
799 ew->gpu_context = GPU_context_create(win, NULL);
800 GPU_init();
801
802 ew->app = app;
803 ew->win = win;
804
806
807 return ew;
808 }
809 else {
810 return NULL;
811 }
812}
813
815{
816 GHOST_SystemHandle sys = multitestapp_get_system(ew->app);
817
819 GHOST_DisposeWindow(sys, ew->win);
820 MEM_freeN(ew);
821}
822
823/*
824 * MultiTestApp
825 */
826
835
836static bool multitest_event_handler(GHOST_EventHandle evt, GHOST_TUserDataPtr data)
837{
838 MultiTestApp *app = data;
839 GHOST_WindowHandle win;
840
841 win = GHOST_GetEventWindow(evt);
842 if (win && !GHOST_ValidWindow(app->sys, win)) {
843 loggerwindow_log(app->logger, "WARNING: bad event, non-valid window\n");
844 return true;
845 }
846
847 if (win) {
849
850 windowdata_handle(wb, evt);
851 }
852 else {
854
855 /* GHOST_kEventQuit are the only 'system' events,
856 * that is, events without a window.
857 */
858 switch (type) {
860 app->exit = 1;
861 break;
862
863 default:
864 fatal("Unhandled system event: %d (%s)\n", type, eventtype_to_string(type));
865 break;
866 }
867 }
868
869 return true;
870}
871
872/**/
873
875{
876 MultiTestApp *app = MEM_mallocN(sizeof(*app), "multitestapp_new");
877 GHOST_EventConsumerHandle consumer = GHOST_CreateEventConsumer(multitest_event_handler, app);
878
879 app->sys = GHOST_CreateSystem();
880 if (!app->sys) {
881 fatal("Unable to create ghost system");
882 }
884
885 if (!GHOST_AddEventConsumer(app->sys, consumer)) {
886 fatal("Unable to add multitest event consumer ");
887 }
888
889 app->main = mainwindow_new(app);
890 if (!app->main) {
891 fatal("Unable to create main window");
892 }
893
894 app->logger = loggerwindow_new(app);
895 if (!app->logger) {
896 fatal("Unable to create logger window");
897 }
898
899 app->extra = NULL;
900 app->exit = 0;
901
902 return app;
903}
904
906{
907 return app->logger;
908}
909
910GHOST_SystemHandle multitestapp_get_system(MultiTestApp *app)
911{
912 return app->sys;
913}
914
916{
918 app->extra = NULL;
919}
920
922{
923 if (app->extra) {
925 }
926 else {
927 app->extra = extrawindow_new(app);
928 }
929}
930
932{
933 app->exit = 1;
934}
935
937{
938 while (!app->exit) {
939 GHOST_ProcessEvents(app->sys, true);
941 }
942}
943
945{
946 BLF_exit();
947 GPU_exit();
948
949 mainwindow_free(app->main);
952 MEM_freeN(app);
953}
954
955/***/
956
957int main(int argc, char **argv)
958{
959 MultiTestApp *app;
960
961 BLF_init();
962
963 app = multitestapp_new();
964
965 multitestapp_run(app);
967
968 return 0;
969}
void BLF_size(int fontid, float size)
Definition blf.cc:443
float BLF_height(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
Definition blf.cc:837
int BLF_load_default(bool unique)
void BLF_draw(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_NONNULL(2)
Definition blf.cc:585
void BLF_exit()
Definition blf.cc:70
int BLF_init()
Definition blf.cc:61
void BLF_position(int fontid, float x, float y, float z)
Definition blf.cc:388
void BLI_kdtree_nd_ free(KDTree *tree)
int min_i(int a, int b)
Definition Basic.c:7
void event_to_buf(GHOST_EventHandle evt, char buf[128])
Definition EventToBuf.c:188
char * eventtype_to_string(GHOST_TEventType type)
Definition EventToBuf.c:14
GHOST C-API function and type declarations.
int32_t GHOST_GetWidthRectangle(GHOST_RectangleHandle rectanglehandle)
GHOST_TSuccess GHOST_SetWindowOrder(GHOST_WindowHandle windowhandle, GHOST_TWindowOrder order)
GHOST_TUserDataPtr GHOST_GetWindowUserData(GHOST_WindowHandle windowhandle)
GHOST_TSuccess GHOST_SwapWindowBufferRelease(GHOST_WindowHandle windowhandle)
GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback, GHOST_TUserDataPtr user_data)
GHOST_SystemHandle GHOST_CreateSystem(void)
GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, GHOST_EventConsumerHandle consumerhandle)
GHOST_TSuccess GHOST_SwapWindowBufferAcquire(GHOST_WindowHandle windowhandle)
bool GHOST_ProcessEvents(GHOST_SystemHandle systemhandle, bool waitForEvent)
void GHOST_ScreenToClient(GHOST_WindowHandle windowhandle, int32_t inX, int32_t inY, int32_t *outX, int32_t *outY)
GHOST_TSuccess GHOST_SetCursorShape(GHOST_WindowHandle windowhandle, GHOST_TStandardCursor cursorshape)
uint64_t GHOST_GetEventTime(GHOST_EventHandle eventhandle)
GHOST_TUserDataPtr GHOST_GetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle)
GHOST_TSuccess GHOST_InvalidateWindow(GHOST_WindowHandle windowhandle)
GHOST_TSuccess GHOST_DisposeWindow(GHOST_SystemHandle systemhandle, GHOST_WindowHandle windowhandle)
int32_t GHOST_GetHeightRectangle(GHOST_RectangleHandle rectanglehandle)
GHOST_TSuccess GHOST_SetCustomCursorShape(GHOST_WindowHandle windowhandle, const uint8_t *bitmap, const uint8_t *mask, const int size[2], const int hot_spot[2], bool can_invert_color)
GHOST_TEventDataPtr GHOST_GetEventData(GHOST_EventHandle eventhandle)
GHOST_TSuccess GHOST_SetCursorVisibility(GHOST_WindowHandle windowhandle, bool visible)
GHOST_TSuccess GHOST_ActivateWindowDrawingContext(GHOST_WindowHandle windowhandle)
bool GHOST_ValidWindow(GHOST_SystemHandle systemhandle, GHOST_WindowHandle windowhandle)
GHOST_TEventType GHOST_GetEventType(GHOST_EventHandle eventhandle)
void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, GHOST_TUserDataPtr user_data)
GHOST_WindowHandle GHOST_GetEventWindow(GHOST_EventHandle eventhandle)
GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, GHOST_WindowHandle parent_windowhandle, const char *title, int32_t left, int32_t top, uint32_t width, uint32_t height, GHOST_TWindowState state, bool is_dialog, GHOST_GPUSettings gpu_settings)
void GHOST_DispatchEvents(GHOST_SystemHandle systemhandle)
GHOST_TimerTaskHandle GHOST_InstallTimer(GHOST_SystemHandle systemhandle, uint64_t delay, uint64_t interval, GHOST_TimerProcPtr timer_proc, GHOST_TUserDataPtr user_data)
GHOST_RectangleHandle GHOST_GetClientBounds(GHOST_WindowHandle windowhandle)
GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle)
GHOST_TSuccess GHOST_GetMainDisplayDimensions(GHOST_SystemHandle systemhandle, uint32_t *r_width, uint32_t *r_height)
@ GHOST_kWindowStateNormal
void * GHOST_TUserDataPtr
Definition GHOST_Types.h:55
GHOST_TStandardCursor
@ GHOST_kStandardCursorUpDown
@ GHOST_kStandardCursorDefault
#define GHOST_kStandardCursorNumCursors
GHOST_TEventType
@ GHOST_kEventWindowClose
@ GHOST_kEventWindowSize
@ GHOST_kEventCursorMove
@ GHOST_kEventButtonUp
@ GHOST_kEventWindowUpdate
@ GHOST_kEventButtonDown
@ GHOST_kEventKeyDown
@ GHOST_kEventKeyUp
@ GHOST_kEventQuitRequest
GHOST_TKey
@ GHOST_kKeyT
@ GHOST_kKeyC
@ GHOST_kKeyF11
@ GHOST_kKeyR
@ GHOST_kKeyQ
@ GHOST_kKeyLeftBracket
@ GHOST_kKeyRightBracket
@ GHOST_kKeyE
@ GHOST_kWindowOrderBottom
@ GHOST_kSuccess
Definition GHOST_Types.h:57
@ GHOST_kButtonMaskRight
@ GHOST_kButtonMaskLeft
@ GHOST_kButtonMaskMiddle
GPUContext * GPU_context_create(void *ghost_window, void *ghost_context)
void GPU_context_active_set(GPUContext *)
void GPU_backend_ghost_system_set(void *ghost_system_handle)
void GPU_init()
void GPU_exit()
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
Read Guarded memory(de)allocation.
static void loggerwindow_recalc_regions(LoggerWindow *lw)
Definition MultiTest.c:383
static void loggerwindow_setup_window_gl(LoggerWindow *lw)
Definition MultiTest.c:403
void multitestapp_toggle_extra_window(MultiTestApp *app)
Definition MultiTest.c:921
static void mainwindow_do_button(MainWindow *mw, int which, int press)
Definition MultiTest.c:244
void loggerwindow_free(LoggerWindow *lw)
Definition MultiTest.c:631
static void loggerwindow_do_move(LoggerWindow *lw, int x, int y)
Definition MultiTest.c:478
static void extrawindow_spin_cursor(ExtraWindow *ew, uint64_t time)
Definition MultiTest.c:706
#define TEXTAREA_PAD
Definition MultiTest.c:382
GHOST_SystemHandle multitestapp_get_system(MultiTestApp *app)
Definition MultiTest.c:910
static void mainwindow_do_move(MainWindow *mw, int x, int y)
Definition MultiTest.c:234
static void loggerwindow_handle(void *priv, GHOST_EventHandle evt)
Definition MultiTest.c:527
static void loggerwindow_do_reshape(LoggerWindow *lw)
Definition MultiTest.c:416
struct _MultiTestApp MultiTestApp
Definition MultiTest.c:51
int datatoc_bfont_ttf_size
void multitestapp_free(MultiTestApp *app)
Definition MultiTest.c:944
MultiTestApp * multitestapp_new(void)
Definition MultiTest.c:874
static bool multitest_event_handler(GHOST_EventHandle evt, GHOST_TUserDataPtr data)
Definition MultiTest.c:836
void multitestapp_free_extrawindow(MultiTestApp *app)
Definition MultiTest.c:915
void mainwindow_free(MainWindow *mw)
Definition MultiTest.c:345
static void extrawindow_do_draw(ExtraWindow *ew)
Definition MultiTest.c:659
static void mainwindow_do_key(MainWindow *mw, GHOST_TKey key, int press)
Definition MultiTest.c:182
LoggerWindow * loggerwindow_new(MultiTestApp *app)
Definition MultiTest.c:564
static void loggerwindow_do_key(LoggerWindow *lw, GHOST_TKey key, int press)
Definition MultiTest.c:516
char const datatoc_bfont_ttf[]
static void mainwindow_timer_proc(GHOST_TimerTaskHandle task, uint64_t time)
Definition MultiTest.c:300
#define SCROLLBAR_WIDTH
Definition MultiTest.c:381
struct _LoggerWindow LoggerWindow
Definition MultiTest.c:50
void extrawindow_free(ExtraWindow *ew)
Definition MultiTest.c:814
void rect_bevel_smooth(int rect[2][2], int width)
Definition MultiTest.c:98
static void loggerwindow_do_button(LoggerWindow *lw, int which, int press)
Definition MultiTest.c:488
void rect_bevel_side(int rect[2][2], int side, float *lt, float *dk, const float col[3], int width)
Definition MultiTest.c:63
void multitestapp_exit(MultiTestApp *app)
Definition MultiTest.c:931
ExtraWindow * extrawindow_new(MultiTestApp *app)
Definition MultiTest.c:778
void multitestapp_run(MultiTestApp *app)
Definition MultiTest.c:936
MainWindow * mainwindow_new(MultiTestApp *app)
Definition MultiTest.c:309
LoggerWindow * multitestapp_get_logger(MultiTestApp *app)
Definition MultiTest.c:905
static void mainwindow_log(MainWindow *mw, char *str)
Definition MultiTest.c:136
static void extrawindow_handle(void *priv, GHOST_EventHandle evt)
Definition MultiTest.c:742
void loggerwindow_log(LoggerWindow *lw, char *line)
Definition MultiTest.c:619
static void extrawindow_do_reshape(ExtraWindow *ew)
Definition MultiTest.c:674
static void mainwindow_handle(void *priv, GHOST_EventHandle evt)
Definition MultiTest.c:259
#define SCROLLBAR_PAD
Definition MultiTest.c:380
static void mainwindow_do_reshape(MainWindow *mw)
Definition MultiTest.c:161
static void loggerwindow_do_draw(LoggerWindow *lw)
Definition MultiTest.c:430
static void mainwindow_do_draw(MainWindow *mw)
Definition MultiTest.c:141
static void extrawindow_do_key(ExtraWindow *ew, GHOST_TKey key, int press)
Definition MultiTest.c:695
void scrollbar_keep_scrolling(ScrollBar *sb, int yco)
Definition ScrollBar.c:95
void scrollbar_start_scrolling(ScrollBar *sb, int yco)
Definition ScrollBar.c:81
int scrollbar_is_scrolling(ScrollBar *sb)
Definition ScrollBar.c:72
float scrollbar_get_thumbpos(ScrollBar *sb)
Definition ScrollBar.c:124
void scrollbar_get_rect(ScrollBar *sb, int rect_r[2][2])
Definition ScrollBar.c:128
void scrollbar_get_thumb(ScrollBar *sb, int thumb_r[2][2])
Definition ScrollBar.c:60
void scrollbar_set_rect(ScrollBar *sb, int rect[2][2])
Definition ScrollBar.c:115
int scrollbar_contains_pt(ScrollBar *sb, int pt[2])
Definition ScrollBar.c:76
void scrollbar_set_thumbpct(ScrollBar *sb, float pct)
Definition ScrollBar.c:107
void scrollbar_stop_scrolling(ScrollBar *sb)
Definition ScrollBar.c:101
ScrollBar * scrollbar_new(int inset, int minthumb)
Definition ScrollBar.c:51
struct _ScrollBar ScrollBar
Definition ScrollBar.h:5
char * string_dup(char *str)
Definition Util.c:28
void fatal(char *fmt,...)
Definition Util.c:38
void * memdbl(void *mem, int *size_pr, int item_size)
Definition Util.c:15
void windowdata_free(WindowData *wb)
Definition WindowData.c:32
WindowData * windowdata_new(void *data, WindowDataHandler handler)
Definition WindowData.c:18
void windowdata_handle(WindowData *wb, GHOST_EventHandle evt)
Definition WindowData.c:27
struct _WindowData WindowData
Definition WindowData.h:6
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
long long int int64_t
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
Definition btDbvt.cpp:299
nullptr float
#define str(s)
uint col
void immDeactivate()
#define main()
#define sin
#define pow
#define cos
void * MEM_mallocN(size_t len, const char *str)
Definition mallocn.cc:128
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
ccl_device_inline float2 fmod(const float2 a, const float b)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
MultiTestApp * app
Definition MultiTest.c:651
GHOST_WindowHandle win
Definition MultiTest.c:653
int size[2]
Definition MultiTest.c:656
GPUContext * gpu_context
Definition MultiTest.c:654
GPUContext * gpu_context
Definition MultiTest.c:127
int size[2]
Definition MultiTest.c:129
int tmouse[2]
Definition MultiTest.c:133
int lmbut[3]
Definition MultiTest.c:131
int lmouse[2]
Definition MultiTest.c:131
MultiTestApp * app
Definition MultiTest.c:124
GHOST_WindowHandle win
Definition MultiTest.c:126
int lmouse[2]
Definition MultiTest.c:377
ScrollBar * scroll
Definition MultiTest.c:371
int textarea[2][2]
Definition MultiTest.c:370
GHOST_WindowHandle win
Definition MultiTest.c:361
char ** loglines
Definition MultiTest.c:373
MultiTestApp * app
Definition MultiTest.c:359
GPUContext * gpu_context
Definition MultiTest.c:362
GHOST_SystemHandle sys
Definition MultiTest.c:828
ExtraWindow * extra
Definition MultiTest.c:831
MainWindow * main
Definition MultiTest.c:829
LoggerWindow * logger
Definition MultiTest.c:830
i
Definition text_draw.cc:230