#ifndef UTILS #define UTILS typedef enum { MMNoOperation, MMPickAndTranslateObject, MMPickAndRotateObject, MMPickAndZTranslateObject, MMTranslateObject, MMRotateObject, MMZTranslateObject,
MOUSEMOVEOPERATIONFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
} MouseMoveOperation;
HandleLeftButtonDown() function in win/events.c, test to see if the mouseStatus->control field is set, and if so enter the MMPickAndZTranslateObject state. (You might want to add this after the test for the shift key, but before the default MMPickAndTranslateObject action.)
static RsEventStatus HandleLeftButtonDown(RsMouseStatus *mouseStatus) { /* Left mouse button down event handling... */ if (mouseStatus->shift) { MouseMoveAction = MMPickAndRotateObject; }
else if (mouseStatus->control) { MouseMoveAction = MMPickAndZTranslateObject; }
else
{
MouseMoveAction = MMPickAndTranslateObject;
}
return rsEVENTPROCESSED;
}
Idle() function. All of the picking code is identical, except for the mode to enter after the pick is performed. You will write the PickAtomic() and ZTranslateAtomic() functions next.
switch(MouseMoveAction) { case MMPickAndTranslateObject : PickAtomic(MMTranslateObject); break; case MMTranslateObject : TranslateAtomic(); break; case MMPickAndRotateObject : PickAtomic(MMRotateObject); break; case MMRotateObject : RotateAtomic(); break; case MMPickAndZTranslateObject : PickAtomic(MMZTranslateObject); break; case MMZTranslateObject : ZTranslateAtomic(); break; default: PickedAtomic = NULL; break; }
PickAtomic() and ZTranslateAtomic() functions:
static void PickAtomic(MouseMoveOperation nextOp) { PickedAtomic = RwCameraPickAtomicOnPixel(Camera, &MousePos); if (PickedAtomic) { AtomicGetBBox(PickedAtomic, &PickBox); OldPos = MousePos; MouseMoveAction = nextOp; }
else
{
MouseMoveAction = MMNoOperation;
}
}
static void ZTranslateAtomic(void) { RwReal dy; RwFrame *f; RwV3d at; f = RwCameraGetFrame(Camera); dy = OldPos.y - MousePos.y; at = *RwMatrixGetAt(RwFrameGetMatrix(f)); RwV3dScale(&at, &at, dy*0.01f); f = RpAtomicGetFrame(PickedAtomic); RwFrameTranslate(f, &at, rwCOMBINEPOSTCONCAT); OldPos = MousePos; }

© 1993-2004 Criterion Software Limited. All rights reserved. Built Thu Feb 12 13:46:58 2004.
Send Feedback