fixed a bug where it saved previous point with mouse click and teleported to next click, tearing cloth unintentionally
parent
7016501f03
commit
2325175281
92
cloth.c
92
cloth.c
|
@ -38,9 +38,10 @@ void update_link(Link *l);
|
||||||
void check_boundaries(Point *p);
|
void check_boundaries(Point *p);
|
||||||
void update_mouse(Point **mp, int *mouse_held);
|
void update_mouse(Point **mp, int *mouse_held);
|
||||||
void draw_barrier();
|
void draw_barrier();
|
||||||
|
int main_point(Point *p);
|
||||||
|
|
||||||
Point *point_array[NUM_POINTS];
|
Point *point_array[NUM_POINTS];
|
||||||
|
Point *barrier_array[4];
|
||||||
Link *link_array[NUM_LINKS];
|
Link *link_array[NUM_LINKS];
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,11 +138,48 @@ void init(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//make an invisible barrier for the mouse to click on
|
||||||
|
Point *p0 = malloc(sizeof(Point));
|
||||||
|
p0->x = -100;
|
||||||
|
p0->y = -100;
|
||||||
|
p0->z = 0;
|
||||||
|
|
||||||
|
Point *p1 = malloc(sizeof(Point));
|
||||||
|
p1->x = -100;
|
||||||
|
p1->y = 100;
|
||||||
|
p1->z = 0;
|
||||||
|
|
||||||
|
Point *p2 = malloc(sizeof(Point));
|
||||||
|
p2->x = 100;
|
||||||
|
p2->y = 100;
|
||||||
|
p2->z = 0;
|
||||||
|
|
||||||
|
Point *p3 = malloc(sizeof(Point));
|
||||||
|
p3->x = 100;
|
||||||
|
p3->y = -100;
|
||||||
|
p3->z = 0;
|
||||||
|
|
||||||
|
barrier_array[0] = p0;
|
||||||
|
barrier_array[1] = p1;
|
||||||
|
barrier_array[2] = p2;
|
||||||
|
barrier_array[3] = p3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shut_down(int return_code)
|
void shut_down(int return_code)
|
||||||
{
|
{
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
|
|
||||||
|
for(int i = 0; i < NUM_POINTS; i++) {
|
||||||
|
free(point_array[i]);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < NUM_LINKS; i++) {
|
||||||
|
free(link_array[i]);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 4; i++) {
|
||||||
|
free(barrier_array[i]);
|
||||||
|
}
|
||||||
|
|
||||||
exit(return_code);
|
exit(return_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +188,7 @@ void main_loop()
|
||||||
// the time of the previous frame
|
// the time of the previous frame
|
||||||
double old_time = glfwGetTime();
|
double old_time = glfwGetTime();
|
||||||
// point that the mouse grabs
|
// point that the mouse grabs
|
||||||
Point *mouse_point = point_array[NUM_POINTS-1];
|
Point *mouse_point = malloc(sizeof(Point)); // temporary
|
||||||
int mouse_held = 0; // boolean
|
int mouse_held = 0; // boolean
|
||||||
// this just loops as long as the program runs
|
// this just loops as long as the program runs
|
||||||
while(1)
|
while(1)
|
||||||
|
@ -363,12 +401,13 @@ void check_boundaries(Point *p)
|
||||||
|
|
||||||
void update_mouse(Point **mp, int *mouse_held)
|
void update_mouse(Point **mp, int *mouse_held)
|
||||||
{
|
{
|
||||||
// mp is a point to a pointer so that I can change
|
// mp is a pointer to a Point pointer so that I can change
|
||||||
// the pointer to save the point grabbed by the mouse
|
// the pointer to save the Point grabbed by the mouse
|
||||||
// between function calls
|
// between function calls...pointer!
|
||||||
Point *mouse_point = *mp;
|
Point *mouse_point = *mp;
|
||||||
if(!glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT)) {
|
if(!glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT)) {
|
||||||
*mouse_held = 0;
|
*mouse_held = 0;
|
||||||
|
*mp = malloc(sizeof(Point));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int x, y;
|
int x, y;
|
||||||
|
@ -391,6 +430,7 @@ void update_mouse(Point **mp, int *mouse_held)
|
||||||
|
|
||||||
//find nearest point to mouse click
|
//find nearest point to mouse click
|
||||||
if(!(*mouse_held)) {
|
if(!(*mouse_held)) {
|
||||||
|
free(*mp);
|
||||||
*mouse_held = 1;
|
*mouse_held = 1;
|
||||||
Point *nearest;
|
Point *nearest;
|
||||||
float d = 100000;
|
float d = 100000;
|
||||||
|
@ -407,38 +447,30 @@ void update_mouse(Point **mp, int *mouse_held)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*mp = nearest;
|
*mp = nearest;
|
||||||
|
mouse_point = nearest;
|
||||||
}
|
}
|
||||||
|
|
||||||
//drag point around
|
//drag point around
|
||||||
mouse_point->x = posX;// - (NUM_POINTS_X-1)*LINK_DIST/2.0;
|
if(*mouse_held) {
|
||||||
mouse_point->y = posY;
|
mouse_point->x = posX;
|
||||||
mouse_point->z = posZ;
|
mouse_point->y = posY;
|
||||||
|
mouse_point->z = posZ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_barrier()
|
void draw_barrier()
|
||||||
{
|
{
|
||||||
Point *p0 = malloc(sizeof(Point));
|
|
||||||
p0->x = -100;
|
|
||||||
p0->y = -100;
|
|
||||||
p0->z = 0;
|
|
||||||
|
|
||||||
Point *p1 = malloc(sizeof(Point));
|
|
||||||
p1->x = -100;
|
|
||||||
p1->y = 100;
|
|
||||||
p1->z = 0;
|
|
||||||
|
|
||||||
Point *p2 = malloc(sizeof(Point));
|
|
||||||
p2->x = 100;
|
|
||||||
p2->y = 100;
|
|
||||||
p2->z = 0;
|
|
||||||
|
|
||||||
Point *p3 = malloc(sizeof(Point));
|
|
||||||
p3->x = 100;
|
|
||||||
p3->y = -100;
|
|
||||||
p3->z = 0;
|
|
||||||
|
|
||||||
Point *array[] = {p0, p1, p2, p3};
|
|
||||||
glColor4f(0, 0, 0, 0);
|
glColor4f(0, 0, 0, 0);
|
||||||
draw_square(array);
|
draw_square(barrier_array);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main_point(Point *p)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < NUM_POINTS; i++) {
|
||||||
|
if(point_array[i] == p) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue