void JediTool::frame(void) { if(active) { /* Update the light saber billboard: */ origin=getButtonDevicePosition(0); axis=getButtonDeviceRayDirection(0); /* Scale the lightsaber during activation: */ length=factory->lightsaberLength; double activeTime=getApplicationTime()-activationTime; if(activeTime<1.5) { length*=activeTime/1.5; /* Request another frame: */ scheduleUpdate(getNextAnimationTime()); } } }
void WandNavigationTool::buttonCallback(int buttonSlotIndex,InputDevice::ButtonCallbackData* cbData) { /* Process based on which button was pressed: */ switch(buttonSlotIndex) { case 0: if(cbData->newButtonState) // Button has just been pressed { /* Act depending on this tool's current state: */ switch(navigationMode) { case IDLE: /* Try activating this tool: */ if(activate()) { /* Initialize the navigation transformations: */ preScale=Geometry::invert(getButtonDeviceTransformation(0)); preScale*=getNavigationTransformation(); /* Go from IDLE to MOVING mode: */ navigationMode=MOVING; } break; case PASSTHROUGH: /* Remember that the main button is pressed: */ navigationMode=PASSTHROUGH_MOVING; break; case SCALING_PAUSED: /* Determine the scaling center and direction: */ scalingCenter=getButtonDevicePosition(0); scalingDirection=getButtonDeviceRayDirection(0); initialScale=scalingCenter*scalingDirection; /* Initialize the transformation parts: */ preScale=NavTrackerState::translateFromOriginTo(scalingCenter); postScale=NavTrackerState::translateToOriginFrom(scalingCenter); postScale*=getNavigationTransformation(); /* Go from SCALING_PAUSED to SCALING mode: */ navigationMode=SCALING; break; default: /* This shouldn't happen; just ignore the event */ break; } } else // Button has just been released { /* Act depending on this tool's current state: */ switch(navigationMode) { case PASSTHROUGH_MOVING: /* Remember that the main button is released: */ navigationMode=PASSTHROUGH; break; case SCALING: /* Pause scaling until button is pressed again: */ /* Go from SCALING to SCALING_PAUSED mode: */ navigationMode=SCALING_PAUSED; break; case MOVING: /* Deactivate this tool: */ deactivate(); /* Go from MOVING to IDLE mode: */ navigationMode=IDLE; break; default: /* This shouldn't happen; just ignore the event */ break; } } break; case 1: if(cbData->newButtonState) // Button has just been pressed { /* Act depending on this tool's current state: */ switch(navigationMode) { case IDLE: /* Pass the button event to the virtual input device: */ buttonDevice->setButtonState(0,true); /* Go to pass-through mode: */ navigationMode=PASSTHROUGH; break; case MOVING: /* Determine the scaling center and direction: */ scalingCenter=getButtonDevicePosition(0); scalingDirection=getButtonDeviceRayDirection(0); initialScale=scalingCenter*scalingDirection; /* Initialize the transformation parts: */ preScale=NavTrackerState::translateFromOriginTo(scalingCenter); postScale=NavTrackerState::translateToOriginFrom(scalingCenter); postScale*=getNavigationTransformation(); /* Go from MOVING to SCALING mode: */ navigationMode=SCALING; break; default: /* This shouldn't happen; just ignore the event */ break; } } else // Button has just been released { /* Act depending on this tool's current state: */ switch(navigationMode) { case PASSTHROUGH: /* Pass the button event to the virtual input device: */ buttonDevice->setButtonState(0,false); /* Go to idle mode: */ navigationMode=IDLE; break; case PASSTHROUGH_MOVING: /* Pass the button event to the virtual input device: */ buttonDevice->setButtonState(0,false); /* Try activating this tool: */ if(activate()) { /* Initialize the navigation transformations: */ preScale=Geometry::invert(getButtonDeviceTransformation(0)); preScale*=getNavigationTransformation(); /* Go to MOVING mode: */ navigationMode=MOVING; } else { /* Go to idle mode: */ navigationMode=IDLE; } break; case SCALING: /* Initialize the transformation parts: */ preScale=Geometry::invert(getButtonDeviceTransformation(0)); preScale*=getNavigationTransformation(); /* Go from SCALING to MOVING mode: */ navigationMode=MOVING; break; case SCALING_PAUSED: /* Deactivate this tool: */ deactivate(); /* Go from SCALING_PAUSED to IDLE mode: */ navigationMode=IDLE; break; default: /* This shouldn't happen; just ignore the event */ break; } } break; } }