Ejemplo n.º 1
0
/*
 * Handle dragging of mouse for transformations
 */
void
mouseMotion(int x, int y) {
    GLint dx = (x - start_pos[0]);
    GLint dy = (start_pos[1] - y);

    vec4 world_vec = inverse(ss->mv) * vec4(dx, dy, 0.0, 0.0);

    for (unsigned int i = 0; i < objects.size(); ++i) {
        if (wireframe_vao == i && new_axis != -1) {
            switch (mode) {
            case Translate:
                switch (axis) {
                case X:
                    objects[i].translate *= Angel::Translate(
                        0.01f * world_vec * vec3(1.0, 0.0, 0.0) // X-mask
                    );
                    break;
                case Y:
                    objects[i].translate *= Angel::Translate(
                        0.01f * world_vec * vec3(0.0, 1.0, 0.0) // Y-mask
                    );
                    break;
                case Z:
                    objects[i].translate *= Angel::Translate(
                        0.01f * world_vec * vec3(0.0, 0.0, -1.0) // Z-mask
                    );
                    break;
                }
                for (unsigned int j = 0; j < manipulator.size(); ++j) {
                    manipulator[j].translate = objects[i].translate;
                }
                break;
            case Rotate:
                switch (axis) {
                case X:
                    objects[i].rotate = Angel::RotateX(
                        world_vec[0]
                    ) * objects[i].rotate;
                    break;
                case Y:
                    objects[i].rotate = Angel::RotateY(
                        world_vec[1]
                    ) * objects[i].rotate;
                    break;
                case Z:
                    objects[i].rotate = Angel::RotateZ(
                        world_vec[2]
                    ) * objects[i].rotate;
                    break;
                }
                break;
            case Scale:
                vec4 scale = world_vec * 0.005f;
                vec3 scale_vec = vec3(scale.x, scale.y, scale.z);
                switch (axis) {
                case X: objects[i].scale[0][0] += scale_vec[0]; break;
                case Y: objects[i].scale[1][1] += scale_vec[1]; break;
                case Z: objects[i].scale[2][2] -= scale_vec[2]; break;
                }
                for (short j = 0; j < 3; ++j) {
                    if (objects[i].scale[j][j] < 1.0f) {
                        objects[i].scale[j][j] = 1.0f;
                    }
                }
                break;
            }
        }
    }
    if (mode != Scale) {
        start_pos[0] = x;
        start_pos[1] = y;
    }

    glutPostRedisplay();
}