summaryrefslogtreecommitdiffstatsci
path: root/src/kinetics.cpp
blob: 3444e7560caf85af763978b0a516bd5bc050c23b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <kinetics.h>
void
generate_color (double *color)
{
    int i;

    for (i = 0; i <= 3; i++)
        color[i] = (int) (drand48 () * 2) / 2.0;
}

void kinetics_destroy (kinetics_t *kinetics)
{
    free(kinetics);
}
void kinetics_init (kinetics_t *kinetics)
{
    kinetics->angle = drand48 () * 2 * M_PI;
    kinetics->velocity = MAX_VELOCITY / 8.0 * 7 * drand48 () + MAX_VELOCITY / 8.0;
    kinetics->x = WIDTH / 2;
    kinetics->y = HEIGHT / 2;
    generate_color (kinetics->color);

    kinetics->x_radius = drand48 () * 10 + 5;
    kinetics->y_radius = drand48 () * 10 + 5;
    kinetics->x_offset = drand48 () * 10;
    kinetics->y_offset = drand48 () * 10;
    kinetics->width = drand48 () * 120 + 30;
    kinetics->height = drand48 () * 120 + 30;

    generate_color (kinetics->shadow_color);
    kinetics->rotation = drand48 () * 2 * M_PI;

    kinetics->line_width = 20;//drand48() * 20;

    /* inset shadow */
    kinetics->shadow_color[0] = 0;
    kinetics->shadow_color[1] = 0;
    kinetics->shadow_color[2] = 0;
    kinetics->shadow_color[3] = 1;
    kinetics->shadow_x_blur = 5;
    kinetics->shadow_y_blur = 2;

    kinetics->x_offset = 6;
    kinetics->y_offset = 1;

    /* spread */
    kinetics->spread_color[0] = 1;
    kinetics->spread_color[1] = 1;
    kinetics->spread_color[2] = 1;
    kinetics->spread_color[3] = 1;
    kinetics->spread_x_blur = 5;
    kinetics->spread_y_blur = 2;
    kinetics->spread_line_width = 3;

    /* drop shadow */
    kinetics->drop_color[0] = 0;
    kinetics->drop_color[1] = 0;
    kinetics->drop_color[2] = 0;
    kinetics->drop_color[3] = 0.5;
    kinetics->drop_x_blur = 10;
    kinetics->drop_y_blur = 8;
    kinetics->drop_x_offset = -30;
    kinetics->drop_y_offset = -5;
    kinetics->drop_line_width = kinetics->line_width;

}

void kinetics_update (kinetics_t *kinetics, double delta)
{
    double x = kinetics->x + cos (kinetics->angle) * kinetics->velocity * delta;
    double y = kinetics->y + sin (kinetics->angle) * kinetics->velocity * delta;
    double w = kinetics->width/2;
    double height = kinetics->height/2;

    if (x + w > WIDTH) {
    if (kinetics->angle >= 0 && kinetics->angle < M_PI / 2)
        kinetics->angle =  M_PI - kinetics->angle;
    else if (kinetics->angle > M_PI / 2 * 3)
        kinetics->angle -= (kinetics->angle - M_PI /2 * 3) * 2;
    x = WIDTH - w;
    }

    if (x - w < 0) {
    if (kinetics->angle > M_PI / 2 && kinetics->angle <  M_PI)
        kinetics->angle = M_PI - kinetics->angle;
    else if (kinetics->angle > M_PI && kinetics->angle < M_PI / 2 * 3)
        kinetics->angle += (M_PI / 2 * 3 - kinetics->angle) * 2;
    x = w;
    }

    if (y + w > HEIGHT) {
    if (kinetics->angle > 0 && kinetics->angle < 2 * M_PI)
        kinetics->angle = M_PI * 2 - kinetics->angle;
    y = HEIGHT - w;
    }

    if (y - w < 0) {
    if (kinetics->angle > M_PI && kinetics->angle < M_PI * 2)
        kinetics->angle = kinetics->angle - (kinetics->angle - M_PI) * 2;
    y = w;
    }

    kinetics->x = x;
    kinetics->y = y;

    kinetics->rotation += M_PI / 9;
    if (kinetics->rotation > 2 * M_PI)
    kinetics->rotation -= 2 * M_PI;
}