16 #include <QApplication>
37 #include <QAbstractNativeEventFilter>
50 MSG* messageStruct =
static_cast<MSG*
>(msg);
51 SiGetEventWinInit(&eData, messageStruct->message, messageStruct->wParam,
52 messageStruct->lParam);
60 : QObject(parent), m_siHandle(SI_NO_HANDLE) {
82 if (SiInitialize() == SPW_DLL_LOAD_ERROR) {
83 CVLog::Warning(tr(
"[3D Mouse] Could not load SiAppDll dll files"));
89 SiOpenWinInitEx(&oData, (HWND)mainWidget->winId());
90 SiOpenWinAddHintBoolEnum(&oData, SI_HINT_USESV3DCMDS, SPW_TRUE);
92 m_siHandle = SiOpenEx(qUtf16Printable(appName), SI_ANY_DEVICE, SI_NO_MASK,
103 if (SiGetDeviceInfo(
m_siHandle, &info) == SPW_NO_ERROR) {
115 CVLog::Print(tr(
"[3D Mouse] Device: %1 (%2 buttons) - firmware v%3.%4")
117 .arg(info.numButtons)
118 .arg(info.majorVersion)
119 .arg(info.minorVersion));
121 if (info.numButtons == 0 && info.majorVersion == 0 &&
122 info.minorVersion == 0) {
126 tr(
"[3D Mouse] Notification-only device will be ignored"));
155 if (
m_siHandle == SI_NO_HANDLE || !siGetEventData) {
160 if (SiGetEvent(
m_siHandle, 0,
static_cast<SiGetEventData*
>(siGetEventData),
161 &siEvent) != SI_IS_EVENT) {
164 switch (siEvent.type) {
165 case SI_MOTION_EVENT: {
166 const SiSpwData& eventData = siEvent.u.spwData;
168 if (eventData.mData[SI_TX] != 0 || eventData.mData[SI_TY] != 0 ||
169 eventData.mData[SI_TZ] != 0 || eventData.mData[SI_RX] != 0 ||
170 eventData.mData[SI_RY] != 0 || eventData.mData[SI_RZ] != 0) {
171 std::vector<float> axes(6);
172 double ds = eventData.period *
175 axes[0] = -
static_cast<float>(eventData.mData[SI_TX] * ds);
176 axes[1] =
static_cast<float>(eventData.mData[SI_TY] * ds);
177 axes[2] =
static_cast<float>(eventData.mData[SI_TZ] * ds);
179 axes[3] = -
static_cast<float>(eventData.mData[SI_RX] * ds);
180 axes[4] =
static_cast<float>(eventData.mData[SI_RY] * ds);
181 axes[5] =
static_cast<float>(eventData.mData[SI_RZ] * ds);
192 case SI_BUTTON_EVENT: {
194 SPWuint32 buttonNumber = siEvent.u.hwButtonEvent.buttonNumber;
195 if (buttonNumber != 0) {
196 if (SiButtonPressed(&siEvent) > 0)
198 else if (SiButtonReleased(&siEvent) > 0)
203 case SI_BUTTON_PRESS_EVENT:
208 case SI_BUTTON_RELEASE_EVENT:
214 if (siEvent.u.cmdEventData.pressed) {
215 if (siEvent.u.cmdEventData.functionNumber ==
254 assert(vec.size() == 6);
256 float axis[3] = {-vec[3], vec[4], -vec[5]};
259 SPW_ArbitraryAxisToMatrix(Rd, axis, 1.0f);
261 for (
unsigned i = 0; i < 3; ++i) {
270 assert(motionData.size() >= 6);
278 std::vector<float> vec = motionData;
282 bool bubbleViewMode = win->bubbleViewModeEnabled();
285 if (!bubbleViewMode) {
299 win->setViewportParameters(viewParams);
309 double distanceToWidthRatio =
310 win->getViewportParameters()
311 .computeDistanceToWidthRatio();
312 X *= distanceToWidthRatio;
313 Y *= distanceToWidthRatio;
318 screenWidth3D = -screenWidth3D;
320 CCVector3d v(-
X * screenWidth3D, Y * screenWidth3D,
335 if (!bubbleViewMode) {
337 win->rotateBaseViewMat(
344 const ccGLMatrixd& viewMat = win->getViewportParameters().viewMat;
352 rotMat = rotX * rotMat;
353 win->rotateBaseViewMat(rotMat);
356 win->showPivotSymbol(
true);
358 win->showPivotSymbol(
false);
Vector3Tpl< double > CCVector3d
Double 3D Vector.
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
static bool Print(const char *format,...)
Prints out a formatted message in console.
ccGLMatrixTpl< T > inverse() const
Returns inverse transformation.
Vector3Tpl< T > getColumnAsVec3D(unsigned index) const
Returns a copy of a given column as a CCVector3.
void initFromParameters(T alpha_rad, const Vector3Tpl< T > &axis3D, const Vector3Tpl< T > &t3D)
Inits transformation from a rotation axis, an angle and a translation.
T * getColumn(unsigned index)
Returns a pointer to a given column.
Double version of ccGLMatrixTpl.
Standard parameters for GL displays/viewports.
bool perspectiveView
Perspective view state.
double computeWidthAtFocalDist() const
Computes the object 'width' at the 'focal' distance.
double getFocalDistance() const
Computes the 'focal' distance.
void setFocalDistance(double distance)
Sets the 'focal' distance.
bool GreaterThanEpsilon(float x)
Test a floating point number against our epsilon (a very small number).