


# KEYBOARD
sub keyboard {
    if (($options{time}!=0) and (!$time_real)) {
        $time_real=$options{time};
        $options{time}=0;
    }
    $time{key} = [gettimeofday];

    my ($key) = @_; 
    $key = chr($key);
    
    # Misc
    if   ($key=~/q/){ exit(); }
    elsif($key=~/m/){ screenshot(); }
    elsif($key=~/3/){
        $options{cfact}=$options{cfact}*0.98;
        if (glIsList($tsize+1)) { reset_all(17); }
        else {
            reset_all(16);
            glutPostRedisplay();
        }
    }
    elsif($key=~/4/){
        $options{cfact}=$options{cfact}*1.02;
        reset_all(17);
        if (glIsList($tsize+1)) { reset_all(17); }
        else {
            reset_all(16);
            glutPostRedisplay();
        }
    }

    # Preview
    elsif($key=~/p/){ reset_all(16); preview(2); }
    
    # Function change
    elsif($key=~/n/){ $n++; reset_all(17); }
    elsif(($key=~/b/) and ($n > 0)){ $n--; reset_all(17); }

    # Mode change
    elsif(($key=~/1/) and ($options{mode}>0)){ $options{mode}--; reset_all(17); }
    elsif(($key=~/2/) and ($options{mode}<3)){ $options{mode}++; reset_all(17); }
    elsif($key=~/c/) { 
        $options{color}++;
        if ($options{color} >=3) { $options{color}=0; }
        reset_all(17);
        #if (glIsList($tsize+1)) { reset_all(17); }
        #else {
        #    reset_all(16);
        #    glutPostRedisplay();
        #}
    }
    elsif($key=~/t/) { 
        if (!$time_real) { $options{time}=1; }
        else { $options{time}=0; $time_real=""; }
    }

    # Extend : BUGGY
    elsif($key=~/R/) { $options{xmin}*=0.9; $options{xmax}*=0.9; $options{ymin}*=0.9; $options{ymax}*=0.9; $options{zmin}*=0.9; $options{zmax}*=0.9; reset_all(31); }
    elsif($key=~/E/) { $options{xmin}*=1.1; $options{xmax}*=1.1; $options{ymin}*=1.1; $options{ymax}*=1.1; $options{zmin}*=1.1; $options{zmax}*=1.1; reset_all(31); }
    elsif($key=~/D/) { $options{xmin}-=($options{xmax}-$options{xmin})*0.1; $options{xmax}-=($options{xmax}-$options{xmin})*0.1; reset_all(31); }
    elsif($key=~/A/) { $options{xmin}+=($options{xmax}-$options{xmin})*0.1; $options{xmax}+=($options{xmax}-$options{xmin})*0.1; reset_all(31); }
    elsif($key=~/X/) { $options{ymin}-=($options{ymax}-$options{ymin})*0.1; $options{ymax}-=($options{ymax}-$options{ymin})*0.1; reset_all(31); }
    elsif($key=~/Y/) { $options{ymin}+=($options{ymax}-$options{ymin})*0.1; $options{ymax}+=($options{ymax}-$options{ymin})*0.1; reset_all(31); }
    elsif($key=~/S/) { $options{zmin}-=($options{zmax}-$options{zmin})*0.1; $options{zmax}-=($options{zmax}-$options{zmin})*0.1; reset_all(31); }
    elsif($key=~/W/) { $options{zmin}+=($options{zmax}-$options{zmin})*0.1; $options{zmax}+=($options{zmax}-$options{zmin})*0.1; reset_all(31); }

    # Seeking
    elsif($key=~/x/) { 
        reset_all(1);
        if (($options{time} > 0) and (($tsize+1) <= ($options{tres}-5))) { $t += 5*($options{tmax}-$options{tmin})/($options{tres}-1); $tsize=$tsize+5; }
        elsif (($tsize+1) < $options{tres}) { $t += ($options{tmax}-$options{tmin})/($options{tres}-1); $tsize++; }
        if (glIsList($tsize+1)) {
            glCallList($tsize+1);
            glFlush();
        }
    }
    elsif($key=~/y/) { 
        reset_all(1);
        if (($options{time} > 0) and ($tsize >= 5)) { $t -= 5*($options{tmax}-$options{tmin})/($options{tres}-1); $tsize=$tsize-5; }
        elsif ($tsize > 0) { $t -= ($options{tmax}-$options{tmin})/($options{tres}-1); $tsize--; }
        if (glIsList($tsize+1)) {
            glCallList($tsize+1);
            glFlush();
        }
    }

    # Resolution
    elsif($key=~/u/){ 
        if (preview(3)) { $xres_real+=1; $zres_real+=1; }
        else { $options{xres}+=1; $options{zres}+=1; reset_all(17); }
        # if (preview(3)) { $xres_real=int($xres_real*1.1+0.9); $zres_real=int($zres_real*1.1+0.9); }
        # else { $options{xres}=int($options{xres}*1.1+0.9); $options{zres}=int($options{zres}*1.1+0.9); reset_all(17); }
    }
    elsif($key=~/z/){
        if (preview(3) and (($xres_real>=3) and ($zres_real>=3))) { $xres_real-=1; $zres_real-=1; }
        elsif (($options{xres}>=3) and ($options{zres}>=3)) { $options{xres}-=1; $options{zres}-=1; reset_all(17); }
        # if (preview(3)) { $xres_real=int($xres_real*0.91+0.2); $zres_real=int($zres_real*0.91+0.2); }
        # else { $options{xres}=int($options{xres}*0.91+0.2); $options{zres}=int($options{zres}*0.91+0.2); reset_all(17); }
    }
    elsif($key=~/j/){ $options{tres}=int($options{tres}*1.1+0.9); reset_all(19); }
    elsif($key=~/h/){ $options{tres}=int($options{tres}*0.91+0.2); reset_all(19); }
    # elsif($key=~/j/){ $options{tres}+=1; reset_all(19); }
    # elsif($key=~/h/){ if ($options{tres}>=2) { $options{tres}-=1; reset_all(19); } }

    # Rotation
    elsif($key=~/w/){ glRotatef(-3, 1, 0, 0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/s/){ glRotatef(3, 1, 0, 0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/a/){ glRotatef(-3, 0, 1, 0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/d/){ glRotatef(3, 0, 1, 0); glCallList($tsize+1); glFlush(); }

    # Translation
    elsif($key=~/\ü/){ glTranslatef(0, 0.5, 0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/\ä/){ glTranslatef(0, -0.5, 0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/\ö/){ glTranslatef(-0.5, 0, 0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/\$/){ glTranslatef(0.5, 0, 0); glCallList($tsize+1); glFlush(); }

    # Scaling
    elsif($key=~/e/){ glScalef(0.91,0.91,0.91); glCallList($tsize+1); glFlush(); }
    elsif($key=~/r/){ glScalef(1.1,1.1,1.1); glCallList($tsize+1); glFlush(); }
    elsif($key=~/Z/){ glScalef(1,0.91,1); glCallList($tsize+1); glFlush(); }
    elsif($key=~/U/){ glScalef(1,1.1,1); glCallList($tsize+1); glFlush(); }
    elsif($key=~/H/){ glScalef(0.91,1,1); glCallList($tsize+1); glFlush(); }
    elsif($key=~/J/){ glScalef(1.1,1,1); glCallList($tsize+1); glFlush(); }
    elsif($key=~/N/){ glScalef(1,1,0.91); glCallList($tsize+1); glFlush(); }
    elsif($key=~/M/){ glScalef(1,1,1.1); glCallList($tsize+1); glFlush(); }

    # Position
    elsif($key=~/0/){ reset_all(4); }
    elsif($key=~/_/){ reset_all(12); }
    elsif($key=~/'/){ reset_all(31); }
    elsif($key=~/9/){ glRotatef(90,1,0,0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/8/){ glRotatef(90,0,1,0); glCallList($tsize+1); glFlush(); }
    elsif($key=~/7/){ glRotatef(90,0,0,1); glCallList($tsize+1); glFlush(); }
}
1;