Compare commits

..

2 commits

Author SHA1 Message Date
ac1ed354ce camera movement(wip) 2023-07-06 13:11:08 +03:00
901b509991 fix handle drawing to properly be a square now 2023-07-06 13:10:45 +03:00
2 changed files with 56 additions and 14 deletions

View file

@ -6,11 +6,19 @@
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
#include "ui.h" #include "ui.h"
// close enough
#define PI 3.14
int lastMouseButton = GLUT_LEFT_BUTTON;
ui_slider* draggedSlider = NULL; // Camera rotation and stuff
float camRadius = 10.0;
vec3 camCenter = { 0.0, 0.0, 0.0 };
vec3 camRot = { PI * 0.125, 0.0, 0.0 };
// Ui stuff // Ui stuff
int lastMouseButton = GLUT_LEFT_BUTTON;
int lastMouseX = 0, lastMouseY = 0;
ui_slider* draggedSlider = NULL;
void testButtonClick(); void testButtonClick();
ui_button buttons[] = { ui_button buttons[] = {
{ {
@ -24,7 +32,7 @@ ui_button buttons[] = {
ui_slider sliders[] = { ui_slider sliders[] = {
{ {
/* pos */ { { 0.5, 0.7, 0.0 }, {-50.0, -5.0, 0.0 } }, /* pos */ { { 0.5, 0.7, 0.0 }, {-50.0, -5.0, 0.0 } },
/* size */ { 100.0, 10.0, 10.0 }, /* size */ { 100.0, 10.0, 8.0 },
0.1 0.1
} }
}; };
@ -32,6 +40,7 @@ ui_slider sliders[] = {
void testButtonClick() { void testButtonClick() {
printf("Clicked!\n"); printf("Clicked!\n");
sliders[0].value = 0.5; sliders[0].value = 0.5;
camCenter = vec3_new(0.0, 1.0, 0.0);
glutPostRedisplay(); glutPostRedisplay();
} }
@ -65,15 +74,27 @@ void drawWorld(void) {
// set perspective camera // set perspective camera
GLdouble wWidth = (GLdouble) glutGet(GLUT_WINDOW_WIDTH); GLdouble wWidth = (GLdouble) glutGet(GLUT_WINDOW_WIDTH);
GLdouble wHeight = (GLdouble) glutGet(GLUT_WINDOW_HEIGHT); GLdouble wHeight = (GLdouble) glutGet(GLUT_WINDOW_HEIGHT);
// Calculate current camera position from rotation
vec3 cp = vec3_new(0.0, 0.0, 0.0);
// rotate along the x axis(yz plane)
cp.z = cosf(camRot.x);
cp.y = sinf(camRot.x);
// rotate along the y axis(xy plane)
cp.x = cp.z * sinf(camRot.y);
cp.z *= cosf(camRot.y);
cp = vec3_mult(cp, camRadius);
cp = vec3_add(cp, camCenter);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
gluLookAt(0.0, 10.0, 20.0, (0.5 - sliders[0].value) * 10.0, 0.0, 0.0, 0.0, 1.0, 0.0); gluLookAt(cp.x, cp.y, cp.z, camCenter.x, camCenter.y, camCenter.z, 0.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
gluPerspective(90, wWidth / wHeight , 1.0, 100.0); gluPerspective(90, wWidth / wHeight , 1.0, 100.0);
// Lights // Lights
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); glEnable(GL_LIGHT0);
// Directional light - aka light
GLfloat light1[] = { 0.0, 1.0, 0.0, 0.0 }; GLfloat light1[] = { 0.0, 1.0, 0.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light1); glLightfv(GL_LIGHT0, GL_POSITION, light1);
// World // World
@ -100,6 +121,7 @@ void display(void) {
} }
void mouseEvent(int button, int state, int x, int y) { void mouseEvent(int button, int state, int x, int y) {
lastMouseX = x; lastMouseY = y;
if(state == 0) lastMouseButton = button; if(state == 0) lastMouseButton = button;
if(state == 0 && button == GLUT_LEFT_BUTTON) { if(state == 0 && button == GLUT_LEFT_BUTTON) {
for(ui_button* b = buttons; b < buttons + sizeof buttons / sizeof(ui_button); b += 1) { for(ui_button* b = buttons; b < buttons + sizeof buttons / sizeof(ui_button); b += 1) {
@ -134,18 +156,44 @@ void mouseMotionEvent(int x, int y) {
} }
} }
} }
// TODO: replace with wasd/space/ctrl movement instead
else if(lastMouseButton == GLUT_MIDDLE_BUTTON) {
// get xz plane rotation
float mx = cosf(camRot.y);
float mz = -sinf(camRot.y);
float m = (x - lastMouseX);
camCenter.y += (y - lastMouseY) * 0.5;
camCenter.x -= m * mx;
camCenter.z -= m * mz;
printf("new cam center %f %f %f\n", camCenter.x, camCenter.y, camCenter.z);
}
else if(lastMouseButton == GLUT_RIGHT_BUTTON) {
// rotate the camera
camRot.y -= (x - lastMouseX) * PI * 0.01;
if(camRot.y > 2 * PI) camRot.y -= 2 * PI;
else if(camRot.y < 0.0) camRot.y += 2 * PI;
camRot.x = fmin(PI * 0.5, fmax(-PI * 0.5, camRot.x + (y - lastMouseY) * 0.01 * PI));
}
lastMouseX = x; lastMouseY = y;
glutPostRedisplay(); glutPostRedisplay();
} }
void mouseWheelEvent(int wheel, int dir, int x, int y) { void mouseWheelEvent(int wheel, int dir, int x, int y) {
char slided = 0;
for(ui_slider* s = sliders; s < sliders + sizeof sliders / sizeof(ui_slider); s += 1) { for(ui_slider* s = sliders; s < sliders + sizeof sliders / sizeof(ui_slider); s += 1) {
if(ui_slider_mouse_over(s, x, y)) { if(ui_slider_mouse_over(s, x, y)) {
s->value += dir * 0.05; s->value += dir * 0.05;
if(s->value < 0.0) s->value = 0.0; if(s->value < 0.0) s->value = 0.0;
if(s->value > 1.0) s->value = 1.0; if(s->value > 1.0) s->value = 1.0;
printf("Updated %p value to %f\n", s, s->value); printf("Updated %p value to %f\n", s, s->value);
slided = 1;
} }
} }
if(!slided) {
camRadius *= 1.0 + (dir * 0.1);
}
glutPostRedisplay(); glutPostRedisplay();
} }
@ -173,11 +221,6 @@ int main(int argc, char** argv) {
glutMouseWheelFunc(mouseWheelEvent); glutMouseWheelFunc(mouseWheelEvent);
glutMotionFunc(mouseMotionEvent); glutMotionFunc(mouseMotionEvent);
/* set projection and camera */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 800.0, 0.0, 500.0);
glutMainLoop(); glutMainLoop();
return 0; return 0;

9
ui.c
View file

@ -72,11 +72,10 @@ void ui_slider_draw(ui_slider* s) {
glVertex3f(pos.x, pos.y + ext.y, pos.z); glVertex3f(pos.x, pos.y + ext.y, pos.z);
// Draw slider button thing // Draw slider button thing
glColor3f(1.0, 1.0, 1.0); glColor3f(1.0, 1.0, 1.0);
glVertex3f(slider.x - ext.z, slider.y - ext.y, 0.0); glVertex3f(slider.x - ext.z, slider.y - ext.z, 0.0);
glVertex3f(slider.x + ext.z, slider.y - ext.y, 0.0); glVertex3f(slider.x + ext.z, slider.y - ext.z, 0.0);
glVertex3f(slider.x + ext.z, slider.y + ext.y, 0.0); glVertex3f(slider.x + ext.z, slider.y + ext.z, 0.0);
glVertex3f(slider.x - ext.z, slider.y + ext.y, 0.0); glVertex3f(slider.x - ext.z, slider.y + ext.z, 0.0);
glEnd(); glEnd();
} }