From 9fd99d3ab235d91aaf41eb372770f8db2bf6467e Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 13 Oct 2025 05:42:07 +0000 Subject: [PATCH] new demo git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@302 b9cfdab3-6d41-4d17-bbe4-086880011989 --- GNUmakefile | 2 +- examples/gltriangle.c | 2 - examples/gltripaint.c | 115 ++++++++++++++++++++++++++++++++++++++++ examples/oldglut.c | 2 - include/Mw/StringDefs.h | 1 + src/core.c | 1 + 6 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 examples/gltripaint.c diff --git a/GNUmakefile b/GNUmakefile index 86c6051..d3fafa3 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -140,7 +140,7 @@ EXAMPLES = examples/example$(EXEC) examples/rotate$(EXEC) examples/image$(EXEC) ifeq ($(OPENGL),1) L_OBJS += src/widget/opengl.o OOL_OBJS += oosrc/widget/opengl.o -EXAMPLES += examples/glclock$(EXEC) examples/gltriangle$(EXEC) examples/glgears$(EXEC) examples/glboing$(EXEC) examples/glcube$(EXEC) +EXAMPLES += examples/glclock$(EXEC) examples/gltriangle$(EXEC) examples/glgears$(EXEC) examples/glboing$(EXEC) examples/glcube$(EXEC) examples/gltripaint$(EXEC) endif ifeq ($(VULKAN),1) diff --git a/examples/gltriangle.c b/examples/gltriangle.c index ab087ab..6931938 100644 --- a/examples/gltriangle.c +++ b/examples/gltriangle.c @@ -2,8 +2,6 @@ #include #include -#include - MwWidget window, opengl, button; int ow, oh; double deg = 0; diff --git a/examples/gltripaint.c b/examples/gltripaint.c new file mode 100644 index 0000000..7bee1fd --- /dev/null +++ b/examples/gltripaint.c @@ -0,0 +1,115 @@ +/* $Id$ */ +#include +#include + +#include + +MwWidget opengl; + +typedef struct triangle { + int points[3 * 2]; + double r; + double g; + double b; +} triangle_t; + +/* who needs more? :) */ +triangle_t t[128]; +int ct = 0; +int click = 0; +int mx, my; + +static void tick(MwWidget handle, void* user, void* call) { + int i; + int w = MwGetInteger(opengl, MwNwidth); + int h = MwGetInteger(opengl, MwNheight); + + MwOpenGLMakeCurrent(opengl); + + glClear(GL_COLOR_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, w, h, 0, -1, 1); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + for(i = 0; i < ct + (click == 2 ? 1 : 0); i++) { + int j; + glBegin(GL_TRIANGLES); + glColor3d(t[i].r, t[i].g, t[i].b); + for(j = 0; j < 3; j++) { + glVertex2d(t[i].points[j * 2 + 0], t[i].points[j * 2 + 1]); + } + glEnd(); + } + + MwOpenGLSwapBuffer(opengl); +} + +static void mouse(MwWidget handle, void* user, void* call) { + MwLLMouse* mouse = call; + if(mouse->button == MwLLMouseLeft) { + t[ct].points[click * 2 + 0] = mouse->point.x; + t[ct].points[click * 2 + 1] = mouse->point.y; + click++; + if(click == 1) { + t[ct].r = rand() % 65536; + t[ct].g = rand() % 65536; + t[ct].b = rand() % 65536; + + t[ct].r /= 65535; + t[ct].g /= 65535; + t[ct].b /= 65535; + } else if(click == 2) { + t[ct].points[2 * 2 + 0] = mx; + t[ct].points[2 * 2 + 1] = my; + } else if(click == 3) { + click = 0; + ct++; + } + } else if(mouse->button == MwLLMouseRight) { + if(click > 0) { + click = 0; + } else if(ct > 0) { + ct--; + } + } +} + +static void mouse_move(MwWidget handle, void* user, void* call) { + MwPoint* point = call; + mx = point->x; + my = point->y; + if(click == 2) { + t[ct].points[2 * 2 + 0] = point->x; + t[ct].points[2 * 2 + 1] = point->y; + } +} + +int main() { + MwSizeHints hints; + MwWidget window = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, 640, 480, + MwNtitle, "tripaint", + NULL); + MwWidget viewport = MwCreateWidget(MwViewportClass, "viewport", window, 5, 5, 630, 470 - 16 - 5); + + MwVaCreateWidget(MwLabelClass, "label", window, 5, 470 - 16 + 5, 630, 16, + MwNtext, "Press left click to draw triangle, right click to undo", + NULL); + + MwViewportSetSize(viewport, 1024, 768); + + opengl = MwCreateWidget(MwOpenGLClass, "opengl", MwViewportGetViewport(viewport), 0, 0, 1024, 768); + + hints.min_width = hints.max_width = 640; + hints.min_height = hints.max_height = 480; + MwVaApply(window, MwNsizeHints, &hints, NULL); + + MwAddUserHandler(window, MwNtickHandler, tick, NULL); + MwAddUserHandler(opengl, MwNmouseDownHandler, mouse, NULL); + MwAddUserHandler(opengl, MwNmouseMoveHandler, mouse_move, NULL); + + MwLoop(window); +} diff --git a/examples/oldglut.c b/examples/oldglut.c index 7696e09..4d061d8 100644 --- a/examples/oldglut.c +++ b/examples/oldglut.c @@ -1,8 +1,6 @@ #include #include -#include - MwWidget opengl; static void draw(void); diff --git a/include/Mw/StringDefs.h b/include/Mw/StringDefs.h index 956a952..60657fe 100644 --- a/include/Mw/StringDefs.h +++ b/include/Mw/StringDefs.h @@ -35,6 +35,7 @@ #define MwNmenuHandler "Cmenu" #define MwNmouseDownHandler "CmouseDownHandler" #define MwNmouseUpHandler "CmouseUpHandler" +#define MwNmouseMoveHandler "CmouseMoveHandler" #define MwNchangedHandler "CchangedHandler" #define MwNkeyHandler "CkeyHandler" #define MwNkeyReleaseHandler "CkeyReleaseHandler" diff --git a/src/core.c b/src/core.c index d4e7fe4..fd398c9 100644 --- a/src/core.c +++ b/src/core.c @@ -71,6 +71,7 @@ static void llmovehandler(MwLL handle, void* data) { h->mouse_point.y = p->y; MwDispatch(h, mouse_move); + MwDispatchUserHandler(h, MwNmouseMoveHandler, data); } static void llkeyhandler(MwLL handle, void* data) {