示例#1
0
void ArcballHelper::update(Arcball const & arcball)
{
    update_drag(arcball);
    update_constraints(arcball);
    update_result(arcball);
    update_rim(arcball);

    helpers = gst::Scene(eye);

    if (show_drag) {
        helpers.add(drag_node);
    }

    if (show_rim) {
        helpers.add(rim_node);
    }

    if (show_result) {
        helpers.add(result_node);
    }

    if (show_constraints) {
        for (auto node : constraint_nodes) {
            helpers.add(node);
        }
    }

    helpers.update();
}
示例#2
0
void VoxelEditor::use_tool_primary(bool click)
{
    int tool = window->get_tool();

    if ((tool == BLOCK_EDIT_TOOL || tool == BUCKET_EDIT_TOOL) && !click)
        return;

    if (tool == POINTER_EDIT_TOOL) {
        vec2 mouse(last_pos.x(), height() - last_pos.y());
        vec3 pos, dir;
        get_window_ray(mouse, inverse_mvp, viewport, pos, dir);

        if (selected_list.size() > 0) {
            if (click)
                pos_arrows.on_mouse_press(pos, dir);
            else {
                pos_arrows.on_mouse_move(pos, dir);
                vec3 add = pos_arrows.get(1.0f);
                int dx = int(add.x);
                int dy = int(add.y);
                int dz = int(add.z);
                offset_selected(dx, dy, dz);
            }
            if (pos_arrows.pan != NONE_CONE) {
                update();
                return;
            }
        }

        if (click) {
            start_drag = last_pos;
            rubberband->move(mapToGlobal(start_drag));
            rubberband->resize(0, 0);
            rubberband->show();
        } else {
            rubberband->setGeometry(
                QRect(mapToGlobal(start_drag), 
                mapToGlobal(last_pos)).normalized());
        }
        update_drag();
        return;
    }

    if (!has_hit)
        return;

    int hit_x, hit_y, hit_z;
    if (tool == BLOCK_EDIT_TOOL) {
        hit_x = hit_next.x;
        hit_y = hit_next.y;
        hit_z = hit_next.z;
    } else if (tool == PENCIL_EDIT_TOOL || tool == BUCKET_EDIT_TOOL) {
        if (hit_floor)
            return;
        hit_x = hit_block.x;
        hit_y = hit_block.y;
        hit_z = hit_block.z;
    } else
        return;

    if (tool == BUCKET_EDIT_TOOL)
        flood_fill(hit_x, hit_y, hit_z);
    else
        voxel->set(hit_x, hit_y, hit_z, window->get_palette_index());
    voxel->reset_shape();

    update_hit();
    on_changed();
}