mdeutils/mcompass/main.c

157 lines
3.2 KiB
C
Raw Normal View History

2025-11-26 07:04:01 +09:00
#include "mcompass.h"
#include <Mw/Widget/OpenGL.h>
MwWidget window, opengl;
2025-11-26 07:13:37 +09:00
int ww, wh;
2025-11-26 07:04:01 +09:00
2025-11-26 07:13:37 +09:00
static void resize(MwWidget handle, void* user, void* client) {
2025-11-26 07:04:01 +09:00
ww = MwGetInteger(window, MwNwidth);
wh = MwGetInteger(window, MwNheight);
MwVaApply(opengl,
2025-11-26 07:13:37 +09:00
MwNwidth, ww,
MwNheight, wh,
NULL);
2025-11-26 07:04:01 +09:00
glViewport(0, 0, ww, wh);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
2025-11-26 07:13:37 +09:00
static void tick(MwWidget handle, void* user, void* client) {
int i;
double rad;
int cx, cy;
2025-11-26 07:04:01 +09:00
MwPoint p;
cx = MwGetInteger(window, MwNx) + ww / 2;
cy = MwGetInteger(window, MwNy) + wh / 2;
MwGetCursorCoord(window, &p);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0, 0, 0);
2025-11-26 07:13:37 +09:00
for(i = 0; i < 360; i += 10) {
2025-11-26 07:04:01 +09:00
rad = i / 180.0 * M_PI;
glBegin(GL_LINES);
2025-11-26 07:13:37 +09:00
glVertex2f(cos(rad), sin(rad));
glVertex2f(cos(rad) * 0.9, sin(rad) * 0.9);
2025-11-26 07:04:01 +09:00
glEnd();
}
glBegin(GL_LINES);
2025-11-26 07:13:37 +09:00
glVertex2f(-0.6, 0);
glVertex2f(0.6, 0);
glVertex2f(0, -0.6);
glVertex2f(0, 0.6);
2025-11-26 07:04:01 +09:00
glEnd();
glBegin(GL_LINE_STRIP);
2025-11-26 07:13:37 +09:00
for(i = 0; i <= 360; i += 10) {
2025-11-26 07:04:01 +09:00
rad = i / 180.0 * M_PI;
2025-11-26 07:13:37 +09:00
glVertex2f(cos(rad) * 0.2, sin(rad) * 0.2);
2025-11-26 07:04:01 +09:00
}
glEnd();
/* memo: size is 0.2x0.2 */
glLineWidth(2);
glColor3f(1, 0, 0);
glBegin(GL_LINE_STRIP); /* N */
2025-11-26 07:13:37 +09:00
glVertex2f(-0.1, 0.65);
glVertex2f(-0.1, 0.85);
glVertex2f(0.1, 0.65);
glVertex2f(0.1, 0.85);
2025-11-26 07:04:01 +09:00
glEnd();
glColor3f(0, 0, 0);
glBegin(GL_LINE_STRIP); /* W */
2025-11-26 07:13:37 +09:00
glVertex2f(-0.85, -0.1);
glVertex2f(-0.65, -0.05);
glVertex2f(-0.85, 0);
glVertex2f(-0.65, 0.05);
glVertex2f(-0.85, 0.1);
2025-11-26 07:04:01 +09:00
glEnd();
glBegin(GL_LINE_STRIP); /* S */
2025-11-26 07:13:37 +09:00
glVertex2f(-0.1, -0.85);
glVertex2f(0.1, -0.85);
glVertex2f(0.1, -0.75);
glVertex2f(-0.1, -0.75);
glVertex2f(-0.1, -0.65);
glVertex2f(0.1, -0.65);
2025-11-26 07:04:01 +09:00
glEnd();
glBegin(GL_LINE_STRIP); /* E */
2025-11-26 07:13:37 +09:00
glVertex2f(0.85, -0.1);
glVertex2f(0.85, 0.1);
glVertex2f(0.65, 0.1);
glVertex2f(0.65, -0.1);
2025-11-26 07:04:01 +09:00
glEnd();
glBegin(GL_LINES);
2025-11-26 07:13:37 +09:00
glVertex2f(0.75, -0.1);
glVertex2f(0.75, 0.1);
2025-11-26 07:04:01 +09:00
glEnd();
glLineWidth(1);
2025-11-26 07:13:37 +09:00
rad = atan2(-(p.y - cy), p.x - cx);
2025-11-26 07:04:01 +09:00
2025-11-26 07:13:37 +09:00
for(i = 0; i < 2; i++) {
2025-11-26 07:04:01 +09:00
double n = 90 / 180.0 * M_PI;
2025-11-26 07:13:37 +09:00
if(i == 0) {
2025-11-26 07:04:01 +09:00
glColor3f(1, 0, 0);
2025-11-26 07:13:37 +09:00
} else {
2025-11-26 07:04:01 +09:00
glColor3f(0.2, 0.2, 0.2);
}
glBegin(GL_TRIANGLES);
2025-11-26 07:13:37 +09:00
glVertex2f(cos(rad) * 0.95, sin(rad) * 0.95);
glVertex2f(cos(rad - n) * 0.05, sin(rad - n) * 0.05);
glVertex2f(cos(rad + n) * 0.05, sin(rad + n) * 0.05);
2025-11-26 07:04:01 +09:00
glEnd();
2025-11-26 07:13:37 +09:00
rad -= n * 2;
2025-11-26 07:04:01 +09:00
}
glColor3f(0.6, 0.6, 0.6);
glBegin(GL_TRIANGLE_FAN);
2025-11-26 07:13:37 +09:00
for(i = 0; i <= 360; i += 10) {
2025-11-26 07:04:01 +09:00
rad = i / 180.0 * M_PI;
2025-11-26 07:13:37 +09:00
glVertex2f(cos(rad) * 0.05 * 2 / 3, sin(rad) * 0.05 * 2 / 3);
2025-11-26 07:04:01 +09:00
}
glEnd();
MwOpenGLSwapBuffer(opengl);
}
2025-11-26 07:13:37 +09:00
int main() {
2025-11-26 07:04:01 +09:00
MwLLColor col;
2025-11-26 07:13:37 +09:00
int r, g, b;
2025-11-26 07:04:01 +09:00
MwLibraryInit();
window = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, 150, 150,
2025-11-26 07:13:37 +09:00
MwNtitle, "mcompass",
2025-12-19 22:13:49 +09:00
MwNmodernLook, 0,
2025-11-26 07:13:37 +09:00
NULL);
2025-11-26 07:04:01 +09:00
opengl = MwCreateWidget(MwOpenGLClass, "opengl", window, 0, 0, 150, 150);
MwOpenGLMakeCurrent(opengl);
col = MwParseColor(window, MwGetText(window, MwNbackground));
2025-12-15 07:15:34 +09:00
MwColorGet(col, &r, &g, &b);
2025-11-26 07:04:01 +09:00
MwLLFreeColor(col);
glClearColor(r / 255.0, g / 255.0, b / 255.0, 1);
resize(window, NULL, NULL);
MwAddUserHandler(window, MwNresizeHandler, resize, NULL);
MwAddUserHandler(window, MwNtickHandler, tick, NULL);
MwLoop(window);
}