right click menu, now rotation is done using left click
This commit is contained in:
parent
e067a7b974
commit
57262da912
3 changed files with 96 additions and 44 deletions
|
@ -6,6 +6,11 @@ Code here is published under the [AGPL-v3](https://www.gnu.org/licenses/agpl-3.0
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
|
- Add menu - partially done
|
||||||
|
- Adjust ambient light
|
||||||
|
- help
|
||||||
|
- quit
|
||||||
|
- Allow changing the move/rotation speed(or just a multiplier)
|
||||||
- Create a cow
|
- Create a cow
|
||||||
- Head
|
- Head
|
||||||
- Tail
|
- Tail
|
||||||
|
@ -21,10 +26,6 @@ Code here is published under the [AGPL-v3](https://www.gnu.org/licenses/agpl-3.0
|
||||||
- Legs? (optional)
|
- Legs? (optional)
|
||||||
- Change camera position to be cow point of view
|
- Change camera position to be cow point of view
|
||||||
- Add popping-floating text of funny cow thoughts
|
- Add popping-floating text of funny cow thoughts
|
||||||
- Add menu
|
|
||||||
- Adjust ambient light
|
|
||||||
- help
|
|
||||||
- quit
|
|
||||||
- Add multiple objects(that is not the cow)
|
- Add multiple objects(that is not the cow)
|
||||||
- User controlled light source
|
- User controlled light source
|
||||||
- Add light source
|
- Add light source
|
||||||
|
|
9
help.h
Normal file
9
help.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
const unsigned char helpString[] =
|
||||||
|
"World of Cow by Aviv Romem\n"
|
||||||
|
"Left/Middle mouse to control camera rotation/Position.\n"
|
||||||
|
"Scroll wheel to control camera zoom.\n"
|
||||||
|
"WASD keys to control the cow.\n"
|
||||||
|
"Different parts of the cow can be controlled by select\n a different part in the right click menu(under 'Control Cow').\n"
|
||||||
|
"Left click/scroll wheel on a slider to change its value.\n"
|
||||||
|
"ESC to close this popup, ESC again to exit the program.\n"
|
||||||
|
;
|
118
mmn_17.c
118
mmn_17.c
|
@ -7,6 +7,7 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "grass_texture_color.h"
|
#include "grass_texture_color.h"
|
||||||
|
#include "help.h"
|
||||||
// close enough
|
// close enough
|
||||||
#define PI 3.14
|
#define PI 3.14
|
||||||
|
|
||||||
|
@ -17,10 +18,17 @@ vec3 camCenter = { 0.0, 0.0, 0.0 };
|
||||||
vec3 camRot = { -PI * 0.125, 0.0, 0.0 };
|
vec3 camRot = { -PI * 0.125, 0.0, 0.0 };
|
||||||
struct {
|
struct {
|
||||||
unsigned char lockYMovement: 1;
|
unsigned char lockYMovement: 1;
|
||||||
|
unsigned char showHelp: 1;
|
||||||
GLenum textureFilter;
|
GLenum textureFilter;
|
||||||
} settings = {
|
} settings = {
|
||||||
0, GL_NEAREST,
|
0, 0, GL_NEAREST,
|
||||||
};
|
};
|
||||||
|
struct {
|
||||||
|
int main;
|
||||||
|
int cowControl;
|
||||||
|
int filters;
|
||||||
|
} menus; // to simply hold the menues in a labed manner
|
||||||
|
|
||||||
|
|
||||||
vec3 rotateByCameraRotation(vec3 v) {
|
vec3 rotateByCameraRotation(vec3 v) {
|
||||||
vec3 r;
|
vec3 r;
|
||||||
|
@ -38,23 +46,7 @@ vec3 rotateByCameraRotation(vec3 v) {
|
||||||
int lastMouseButton = GLUT_LEFT_BUTTON;
|
int lastMouseButton = GLUT_LEFT_BUTTON;
|
||||||
int lastMouseX = 0, lastMouseY = 0;
|
int lastMouseX = 0, lastMouseY = 0;
|
||||||
ui_slider* draggedSlider = NULL;
|
ui_slider* draggedSlider = NULL;
|
||||||
void changeFilterButton();
|
ui_button buttons[] = {}; // TODO: maybe delete? the menu thing is easier to work with
|
||||||
void lockYButton();
|
|
||||||
ui_button buttons[] = {
|
|
||||||
{
|
|
||||||
/* pos */ { { 0.9, 0.5, 0.0 }, { -65.0, -20.0, 0.0 } },
|
|
||||||
/* size */ { 130.0, 40.0, 0.0 },
|
|
||||||
/* onclick */ changeFilterButton,
|
|
||||||
/* text */ "Cycle filter",
|
|
||||||
0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ { 0.9, 0.5, 0.0 }, { -50.0, 25.0, 0.0 } },
|
|
||||||
{ 100.0, 40.0, 0.0 },
|
|
||||||
lockYButton,
|
|
||||||
"Lock Y"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
ui_slider sliders[] = {
|
ui_slider sliders[] = {
|
||||||
{
|
{
|
||||||
/* pos */ { { 0.9, 0.7, 0.0 }, { -50.0, -5.0, 0.0 } },
|
/* pos */ { { 0.9, 0.7, 0.0 }, { -50.0, -5.0, 0.0 } },
|
||||||
|
@ -63,18 +55,6 @@ ui_slider sliders[] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void changeFilterButton() {
|
|
||||||
static int current = 0;
|
|
||||||
GLenum filters[] = { GL_NEAREST, GL_LINEAR };
|
|
||||||
current = (current + 1) % (sizeof(filters) / sizeof(GLenum));
|
|
||||||
settings.textureFilter = filters[current];
|
|
||||||
glutPostRedisplay();
|
|
||||||
}
|
|
||||||
void lockYButton() {
|
|
||||||
settings.lockYMovement ^= 1;
|
|
||||||
buttons[1].text = settings.lockYMovement ? "Unlock Y" : "Lock Y";
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawUi(void) {
|
void drawUi(void) {
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
@ -96,6 +76,16 @@ void drawUi(void) {
|
||||||
ui_slider_draw(s);
|
ui_slider_draw(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(settings.showHelp) {
|
||||||
|
glColor3f(0.3, 0.3, 0.3);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex3f(wWidth * 0.1, wHeight * 0.1, 0.0);
|
||||||
|
glVertex3f(wWidth * 0.9, wHeight * 0.1, 0.0);
|
||||||
|
glVertex3f(wWidth * 0.9, wHeight * 0.9, 0.0);
|
||||||
|
glVertex3f(wWidth * 0.1, wHeight * 0.9, 0.0);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
int err = glGetError();
|
int err = glGetError();
|
||||||
if(err != 0) {
|
if(err != 0) {
|
||||||
printf("opengl error %d: %s\n", err, gluErrorString(err));
|
printf("opengl error %d: %s\n", err, gluErrorString(err));
|
||||||
|
@ -199,6 +189,15 @@ void mouseMotionEvent(int x, int y) {
|
||||||
ui_slider_onclick(draggedSlider, x, y);
|
ui_slider_onclick(draggedSlider, x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// 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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(lastMouseButton == GLUT_MIDDLE_BUTTON) {
|
else if(lastMouseButton == GLUT_MIDDLE_BUTTON) {
|
||||||
vec3 moveX = rotateByCameraRotation(vec3_new(1.0, 0.0, 0.0));
|
vec3 moveX = rotateByCameraRotation(vec3_new(1.0, 0.0, 0.0));
|
||||||
|
@ -212,14 +211,6 @@ void mouseMotionEvent(int x, int y) {
|
||||||
camCenter = vec3_add(camCenter, vec3_mult(moveX, (lastMouseX - x)));
|
camCenter = vec3_add(camCenter, vec3_mult(moveX, (lastMouseX - x)));
|
||||||
camCenter = vec3_add(camCenter, vec3_mult(moveY, (y - lastMouseY)));
|
camCenter = vec3_add(camCenter, vec3_mult(moveY, (y - lastMouseY)));
|
||||||
}
|
}
|
||||||
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;
|
lastMouseX = x; lastMouseY = y;
|
||||||
glutPostRedisplay();
|
glutPostRedisplay();
|
||||||
}
|
}
|
||||||
|
@ -242,14 +233,64 @@ void mouseWheelEvent(int wheel, int dir, int x, int y) {
|
||||||
|
|
||||||
void keyboardEvent(unsigned char c, int x, int y) {
|
void keyboardEvent(unsigned char c, int x, int y) {
|
||||||
if(c == '\e') {
|
if(c == '\e') {
|
||||||
|
if(settings.showHelp) {
|
||||||
|
settings.showHelp = 0;
|
||||||
|
glutPostRedisplay();
|
||||||
|
}
|
||||||
|
else {
|
||||||
glutLeaveMainLoop();
|
glutLeaveMainLoop();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if(c == 'a') {
|
if(c == 'a') {
|
||||||
glutPostRedisplay();
|
glutPostRedisplay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onMenuItem(int item) {
|
||||||
|
lastMouseButton = -1; // to prevent jumps in view position/rotation
|
||||||
|
switch(item) {
|
||||||
|
case 0: // Lock y
|
||||||
|
settings.lockYMovement ^= 1;
|
||||||
|
glutChangeToMenuEntry(3, settings.lockYMovement ? "Unlock Y position" : "Lock Y position", 0);
|
||||||
|
break;
|
||||||
|
case 2: // Show help
|
||||||
|
settings.showHelp ^= 1;
|
||||||
|
glutPostRedisplay();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onControlCowMenu(int item) {
|
||||||
|
lastMouseButton = GLUT_RIGHT_BUTTON;
|
||||||
|
printf("Control cow: %d\n", item);
|
||||||
|
}
|
||||||
|
void onFilterMenu(int item) {
|
||||||
|
lastMouseButton = GLUT_RIGHT_BUTTON;
|
||||||
|
GLenum filters[] = { GL_LINEAR, GL_NEAREST };
|
||||||
|
settings.textureFilter = filters[item];
|
||||||
|
}
|
||||||
|
|
||||||
|
void menuSetup() {
|
||||||
|
// control cow sub-menu
|
||||||
|
menus.cowControl = glutCreateMenu(onControlCowMenu);
|
||||||
|
glutAddMenuEntry("Movement", 0);
|
||||||
|
glutAddMenuEntry("Head", 1);
|
||||||
|
glutAddMenuEntry("Tail", 2);
|
||||||
|
// filters
|
||||||
|
menus.filters = glutCreateMenu(onFilterMenu);
|
||||||
|
glutAddMenuEntry("Linear", 0);
|
||||||
|
glutAddMenuEntry("Nearest", 1);
|
||||||
|
|
||||||
|
menus.main = glutCreateMenu(onMenuItem);
|
||||||
|
glutAddSubMenu("Control Cow", menus.cowControl);
|
||||||
|
glutAddSubMenu("Texture filters", menus.filters);
|
||||||
|
glutAddMenuEntry("Lock Y position", 0);
|
||||||
|
glutAddMenuEntry("Change to Cow POV", 1);
|
||||||
|
glutAddMenuEntry("Help", 2);
|
||||||
|
glutAttachMenu(GLUT_RIGHT_BUTTON);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
/* initialize glut and window */
|
/* initialize glut and window */
|
||||||
glutInit(&argc, argv);
|
glutInit(&argc, argv);
|
||||||
|
@ -263,6 +304,7 @@ int main(int argc, char** argv) {
|
||||||
glutKeyboardFunc(keyboardEvent);
|
glutKeyboardFunc(keyboardEvent);
|
||||||
glutMouseWheelFunc(mouseWheelEvent);
|
glutMouseWheelFunc(mouseWheelEvent);
|
||||||
glutMotionFunc(mouseMotionEvent);
|
glutMotionFunc(mouseMotionEvent);
|
||||||
|
menuSetup();
|
||||||
// set up some rendering related stuff
|
// set up some rendering related stuff
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glCullFace(GL_BACK);
|
glCullFace(GL_BACK);
|
||||||
|
|
Loading…
Reference in a new issue