adding the initial patch updated to 2.44 in ndof branch
notes : it compiles but is non functional lacks the platform specific changes in ghost ( i cant test windows) lacks the code for plug-in. the platform specific code will be added when we sync with Ettore work the plug-in itself cannot be added here
This commit is contained in:
parent
9fec189e7a
commit
16340dfe12
@ -1,4 +1,4 @@
|
|||||||
LCGDIR = '#../lib/darwin-6.1-powerpc'
|
LCGDIR = '#../../trunk/lib/darwin-6.1-powerpc'
|
||||||
LIBDIR = '${LCGDIR}'
|
LIBDIR = '${LCGDIR}'
|
||||||
|
|
||||||
# enable ffmpeg support
|
# enable ffmpeg support
|
||||||
@ -15,16 +15,17 @@ BF_VERSE_INCLUDE = BF_VERSE
|
|||||||
BF_VERSE_LIBS = "libverse"
|
BF_VERSE_LIBS = "libverse"
|
||||||
|
|
||||||
# python.org libs install in /library
|
# python.org libs install in /library
|
||||||
BF_PYTHON_VERSION = '2.3'
|
BF_PYTHON_VERSION = '2.5'
|
||||||
if BF_PYTHON_VERSION=='2.3':
|
if BF_PYTHON_VERSION=='2.3':
|
||||||
BF_PYTHON = '/System/Library/Frameworks/Python.framework/Versions/'
|
BF_PYTHON = '/System/Library/Frameworks/Python.framework/Versions/'
|
||||||
else:
|
else:
|
||||||
BF_PYTHON = '/Library/Frameworks/Python.framework/Versions/'
|
BF_PYTHON = '/Library/Frameworks/Python.framework'
|
||||||
|
|
||||||
BF_PYTHON_INC = '${BF_PYTHON}${BF_PYTHON_VERSION}/include/python${BF_PYTHON_VERSION}'
|
BF_PYTHON_INC = '${BF_PYTHON}/Headers'
|
||||||
BF_PYTHON_BINARY = '${BF_PYTHON}${BF_PYTHON_VERSION}/bin/python${BF_PYTHON_VERSION}'
|
BF_PYTHON_BINARY = '${BF_PYTHON}/python'
|
||||||
BF_PYTHON_LIB = ''
|
BF_PYTHON_LIB = ''
|
||||||
BF_PYTHON_LIBPATH = '${BF_PYTHON}${BF_PYTHON_VERSION}/lib/python${BF_PYTHON_VERSION}/config'
|
BF_PYTHON_LIBPATH = '${BF_PYTHON}/Versions/${BF_PYTHON_VERSION}/lib/python${BF_PYTHON_VERSION}/config'
|
||||||
|
#BF_PYTHON_LIBPATH = '${BF_PYTHON}${BF_PYTHON_VERSION}/lib/python${BF_PYTHON_VERSION}/config'
|
||||||
BF_PYTHON_LINKFLAGS = '-u __dummy -u _PyMac_Error -framework System -framework Python'
|
BF_PYTHON_LINKFLAGS = '-u __dummy -u _PyMac_Error -framework System -framework Python'
|
||||||
|
|
||||||
WITH_BF_OPENAL = 'true'
|
WITH_BF_OPENAL = 'true'
|
||||||
@ -32,7 +33,7 @@ WITH_BF_OPENAL = 'true'
|
|||||||
# for gcc 3.3
|
# for gcc 3.3
|
||||||
#BF_OPENAL = LIBDIR + '/openal'
|
#BF_OPENAL = LIBDIR + '/openal'
|
||||||
# for gcc 3.4
|
# for gcc 3.4
|
||||||
BF_OPENAL = '#../lib/darwin-8.0.0-powerpc/openal'
|
BF_OPENAL = '#../../trunk/lib/darwin-8.0.0-powerpc/openal'
|
||||||
|
|
||||||
BF_OPENAL_INC = '${BF_OPENAL}/include'
|
BF_OPENAL_INC = '${BF_OPENAL}/include'
|
||||||
BF_OPENAL_LIB = 'openal'
|
BF_OPENAL_LIB = 'openal'
|
||||||
@ -86,7 +87,7 @@ BF_FTGL_INC = '${BF_FTGL}/include'
|
|||||||
BF_FTGL_LIB = 'extern_ftgl'
|
BF_FTGL_LIB = 'extern_ftgl'
|
||||||
|
|
||||||
WITH_BF_GAMEENGINE='true'
|
WITH_BF_GAMEENGINE='true'
|
||||||
WITH_BF_PLAYER='true'
|
WITH_BF_PLAYER='false'
|
||||||
|
|
||||||
WITH_BF_ODE = 'false'
|
WITH_BF_ODE = 'false'
|
||||||
BF_ODE = LIBDIR + '/ode'
|
BF_ODE = LIBDIR + '/ode'
|
||||||
|
@ -265,6 +265,19 @@ extern GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle,
|
|||||||
GHOST_EventConsumerHandle consumerhandle);
|
GHOST_EventConsumerHandle consumerhandle);
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************************
|
||||||
|
** N-degree of freedom device management functionality
|
||||||
|
***************************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open N-degree of freedom devices
|
||||||
|
*/
|
||||||
|
extern void GHOST_OpenNDOF(GHOST_SystemHandle systemhandle,
|
||||||
|
GHOST_WindowHandle windowhandle,
|
||||||
|
GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
|
||||||
|
GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
|
||||||
|
GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen,
|
||||||
|
GHOST_NDOFEventHandler_fp setNdofEventHandler);
|
||||||
|
|
||||||
/***************************************************************************************
|
/***************************************************************************************
|
||||||
** Cursor management functionality
|
** Cursor management functionality
|
||||||
|
@ -295,6 +295,20 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer) = 0;
|
virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer) = 0;
|
||||||
|
|
||||||
|
/***************************************************************************************
|
||||||
|
** N-degree of freedom device management functionality
|
||||||
|
***************************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the N-degree of freedom device manager
|
||||||
|
*/
|
||||||
|
virtual void openNDOF(GHOST_IWindow*,
|
||||||
|
GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
|
||||||
|
GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
|
||||||
|
GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen,
|
||||||
|
GHOST_NDOFEventHandler_fp setNdofEventHandler) = 0;
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************************
|
/***************************************************************************************
|
||||||
** Cursor management functionality
|
** Cursor management functionality
|
||||||
***************************************************************************************/
|
***************************************************************************************/
|
||||||
|
@ -133,6 +133,8 @@ typedef enum {
|
|||||||
GHOST_kEventButtonUp, /// Mouse button event
|
GHOST_kEventButtonUp, /// Mouse button event
|
||||||
GHOST_kEventWheel, /// Mouse wheel event
|
GHOST_kEventWheel, /// Mouse wheel event
|
||||||
|
|
||||||
|
GHOST_kEventNDOFMotion, /// N degree of freedom device motion event
|
||||||
|
|
||||||
GHOST_kEventKeyDown,
|
GHOST_kEventKeyDown,
|
||||||
GHOST_kEventKeyUp,
|
GHOST_kEventKeyUp,
|
||||||
// GHOST_kEventKeyAuto,
|
// GHOST_kEventKeyAuto,
|
||||||
@ -336,6 +338,18 @@ typedef struct {
|
|||||||
GHOST_TInt32 z;
|
GHOST_TInt32 z;
|
||||||
} GHOST_TEventWheelData;
|
} GHOST_TEventWheelData;
|
||||||
|
|
||||||
|
typedef int (*GHOST_NDOFLibraryInit_fp)();
|
||||||
|
typedef void (*GHOST_NDOFLibraryShutdown_fp)(void* deviceHandle);
|
||||||
|
typedef void* (*GHOST_NDOFDeviceOpen_fp)(void* platformData);
|
||||||
|
typedef int (*GHOST_NDOFEventHandler_fp)(float* result7, void* deviceHandle, unsigned int message, unsigned int* wParam, unsigned long* lParam);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/** N-degree of freedom device data */
|
||||||
|
float tx, ty, tz; /** -x left, +y up, +z forward */
|
||||||
|
float rx, ry, rz;
|
||||||
|
float dt;
|
||||||
|
} GHOST_TEventNDOFData;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/** The key code. */
|
/** The key code. */
|
||||||
GHOST_TKey key;
|
GHOST_TKey key;
|
||||||
|
@ -259,6 +259,18 @@ GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, GHOST_Eve
|
|||||||
return system->addEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle);
|
return system->addEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GHOST_OpenNDOF(GHOST_SystemHandle systemhandle, GHOST_WindowHandle windowhandle,
|
||||||
|
GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
|
||||||
|
GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
|
||||||
|
GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen,
|
||||||
|
GHOST_NDOFEventHandler_fp setNdofEventHandler)
|
||||||
|
{
|
||||||
|
GHOST_ISystem* system = (GHOST_ISystem*) systemhandle;
|
||||||
|
|
||||||
|
system->openNDOF((GHOST_IWindow*) windowhandle,
|
||||||
|
setNdofLibraryInit, setNdofLibraryShutdown, setNdofDeviceOpen, setNdofEventHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GHOST_TStandardCursor GHOST_GetCursorShape(GHOST_WindowHandle windowhandle)
|
GHOST_TStandardCursor GHOST_GetCursorShape(GHOST_WindowHandle windowhandle)
|
||||||
|
69
intern/ghost/intern/GHOST_EventNDOF.h
Normal file
69
intern/ghost/intern/GHOST_EventNDOF.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
* $Id: GHOST_EventNdof.h,v 1.6 2002/12/28 22:26:45 maarten Exp $
|
||||||
|
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version. The Blender
|
||||||
|
* Foundation also sells licenses for use in proprietary software under
|
||||||
|
* the Blender License. See http://www.blender.org/BL/ for information
|
||||||
|
* about this.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The Original Code is: all of this file.
|
||||||
|
*
|
||||||
|
* Contributor(s): none yet.
|
||||||
|
*
|
||||||
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @file GHOST_EventNdof.h
|
||||||
|
* Declaration of GHOST_EventNdof class.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _GHOST_EVENT_NDOF_H_
|
||||||
|
#define _GHOST_EVENT_NDOF_H_
|
||||||
|
|
||||||
|
#include "GHOST_Event.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* N-degree of freedom device event.
|
||||||
|
*/
|
||||||
|
class GHOST_EventNDOF : public GHOST_Event
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* @param msec The time this event was generated.
|
||||||
|
* @param type The type of this event.
|
||||||
|
* @param x The x-coordinate of the location the cursor was at at the time of the event.
|
||||||
|
* @param y The y-coordinate of the location the cursor was at at the time of the event.
|
||||||
|
*/
|
||||||
|
GHOST_EventNDOF(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow* window,
|
||||||
|
GHOST_TEventNDOFData data)
|
||||||
|
: GHOST_Event(msec, type, window)
|
||||||
|
{
|
||||||
|
m_ndofEventData = data;
|
||||||
|
m_data = &m_ndofEventData;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** translation & rotation from the device. */
|
||||||
|
GHOST_TEventNDOFData m_ndofEventData;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _GHOST_EVENT_NDOF_H_
|
||||||
|
|
107
intern/ghost/intern/GHOST_NDOFManager.cpp
Normal file
107
intern/ghost/intern/GHOST_NDOFManager.cpp
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
|
||||||
|
// Insert Blender compatible license here :-)
|
||||||
|
|
||||||
|
// note: an implementation is currently only provided for Windows, but designed to be easy to move to Linux, etc.
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
To use this implemenation, you must specify the #define WITH_SPACEBALL for the ghost library.
|
||||||
|
Only this cpp file is affected by the macro, the header file and everything else are independent
|
||||||
|
of the spaceball libraries.
|
||||||
|
|
||||||
|
The 3dXWare SDK is available from the tab on the left side of -
|
||||||
|
http://www.3dconnexion.com/support/4a.php
|
||||||
|
|
||||||
|
The SDK is necessary to build this file with WITH_SPACEBALL defined.
|
||||||
|
|
||||||
|
For this stuff to work, siappdll.dll and spwini.dll must be in the executable path of blender
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GHOST_NDOFManager.h"
|
||||||
|
//#include "GHOST_WindowWin32.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
GHOST_NDOFLibraryInit_fp ndofLibraryInit = 0;
|
||||||
|
GHOST_NDOFLibraryShutdown_fp ndofLibraryShutdown = 0;
|
||||||
|
GHOST_NDOFDeviceOpen_fp ndofDeviceOpen = 0;
|
||||||
|
GHOST_NDOFEventHandler_fp ndofEventHandler = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//typedef enum SpwRetVal (WINAPI *PFNSI_INIT) (void);
|
||||||
|
|
||||||
|
GHOST_NDOFManager::GHOST_NDOFManager()
|
||||||
|
{
|
||||||
|
m_DeviceHandle = 0;
|
||||||
|
|
||||||
|
// discover the API from the plugin
|
||||||
|
ndofLibraryInit = 0;
|
||||||
|
ndofLibraryShutdown = 0;
|
||||||
|
ndofDeviceOpen = 0;
|
||||||
|
ndofEventHandler = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GHOST_NDOFManager::~GHOST_NDOFManager()
|
||||||
|
{
|
||||||
|
if (ndofLibraryShutdown)
|
||||||
|
ndofLibraryShutdown(m_DeviceHandle);
|
||||||
|
|
||||||
|
m_DeviceHandle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
GHOST_NDOFManager::deviceOpen(GHOST_IWindow* window,
|
||||||
|
GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
|
||||||
|
GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
|
||||||
|
GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen,
|
||||||
|
GHOST_NDOFEventHandler_fp setNdofEventHandler)
|
||||||
|
{
|
||||||
|
ndofLibraryInit = setNdofLibraryInit;
|
||||||
|
ndofLibraryShutdown = setNdofLibraryShutdown;
|
||||||
|
ndofDeviceOpen = setNdofDeviceOpen;
|
||||||
|
ndofEventHandler = setNdofEventHandler;
|
||||||
|
|
||||||
|
if (ndofLibraryInit)
|
||||||
|
{
|
||||||
|
ndofLibraryInit();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (ndofDeviceOpen)
|
||||||
|
{
|
||||||
|
GHOST_WindowWin32* win32 = (GHOST_WindowWin32*) window; // GHOST_IWindow doesn't have RTTI...
|
||||||
|
if (win32 != 0)
|
||||||
|
{
|
||||||
|
m_DeviceHandle = ndofDeviceOpen(win32->getHWND());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GHOST_TEventNDOFData*
|
||||||
|
GHOST_NDOFManager::handle(unsigned int message, unsigned int* wParam, unsigned long* lParam)
|
||||||
|
{
|
||||||
|
static GHOST_TEventNDOFData sbdata;
|
||||||
|
int handled = 0;
|
||||||
|
if (ndofEventHandler && m_DeviceHandle != 0)
|
||||||
|
{
|
||||||
|
handled = ndofEventHandler(&sbdata.tx, m_DeviceHandle, message, wParam, lParam);
|
||||||
|
}
|
||||||
|
return handled ? &sbdata : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
GHOST_NDOFManager::available()
|
||||||
|
{
|
||||||
|
return m_DeviceHandle != 0;
|
||||||
|
}
|
39
intern/ghost/intern/GHOST_NDOFManager.h
Normal file
39
intern/ghost/intern/GHOST_NDOFManager.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
#ifndef _GHOST_NDOFMANAGER_H_
|
||||||
|
#define _GHOST_NDOFMANAGER_H_
|
||||||
|
|
||||||
|
#include "GHOST_System.h"
|
||||||
|
#include "GHOST_IWindow.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class GHOST_NDOFManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
GHOST_NDOFManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor.
|
||||||
|
*/
|
||||||
|
virtual ~GHOST_NDOFManager();
|
||||||
|
|
||||||
|
void deviceOpen(GHOST_IWindow* window,
|
||||||
|
GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
|
||||||
|
GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
|
||||||
|
GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen,
|
||||||
|
GHOST_NDOFEventHandler_fp setNdofEventHandler);
|
||||||
|
|
||||||
|
bool available();
|
||||||
|
|
||||||
|
/* to do: abstract for Linux, MacOS, etc. */
|
||||||
|
GHOST_TEventNDOFData* handle(unsigned int message, unsigned int* wparam, unsigned long* lparam);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void* m_DeviceHandle;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -47,13 +47,14 @@
|
|||||||
|
|
||||||
#include "GHOST_DisplayManager.h"
|
#include "GHOST_DisplayManager.h"
|
||||||
#include "GHOST_EventManager.h"
|
#include "GHOST_EventManager.h"
|
||||||
|
#include "GHOST_NDOFManager.h"
|
||||||
#include "GHOST_TimerTask.h"
|
#include "GHOST_TimerTask.h"
|
||||||
#include "GHOST_TimerManager.h"
|
#include "GHOST_TimerManager.h"
|
||||||
#include "GHOST_WindowManager.h"
|
#include "GHOST_WindowManager.h"
|
||||||
|
|
||||||
|
|
||||||
GHOST_System::GHOST_System()
|
GHOST_System::GHOST_System()
|
||||||
: m_displayManager(0), m_timerManager(0), m_windowManager(0), m_eventManager(0)
|
: m_displayManager(0), m_timerManager(0), m_windowManager(0), m_eventManager(0), m_ndofManager(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,6 +240,19 @@ GHOST_TSuccess GHOST_System::pushEvent(GHOST_IEvent* event)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GHOST_System::openNDOF(GHOST_IWindow* w,
|
||||||
|
GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
|
||||||
|
GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
|
||||||
|
GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen,
|
||||||
|
GHOST_NDOFEventHandler_fp setNdofEventHandler)
|
||||||
|
{
|
||||||
|
m_ndofManager->deviceOpen(w,
|
||||||
|
setNdofLibraryInit,
|
||||||
|
setNdofLibraryShutdown,
|
||||||
|
setNdofDeviceOpen,
|
||||||
|
setNdofEventHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GHOST_TSuccess GHOST_System::getModifierKeyState(GHOST_TModifierKeyMask mask, bool& isDown) const
|
GHOST_TSuccess GHOST_System::getModifierKeyState(GHOST_TModifierKeyMask mask, bool& isDown) const
|
||||||
{
|
{
|
||||||
@ -271,6 +285,11 @@ GHOST_TSuccess GHOST_System::init()
|
|||||||
m_timerManager = new GHOST_TimerManager ();
|
m_timerManager = new GHOST_TimerManager ();
|
||||||
m_windowManager = new GHOST_WindowManager ();
|
m_windowManager = new GHOST_WindowManager ();
|
||||||
m_eventManager = new GHOST_EventManager ();
|
m_eventManager = new GHOST_EventManager ();
|
||||||
|
m_ndofManager = new GHOST_NDOFManager();
|
||||||
|
|
||||||
|
if(m_ndofManager)
|
||||||
|
printf("ndof manager \n");
|
||||||
|
|
||||||
#ifdef GHOST_DEBUG
|
#ifdef GHOST_DEBUG
|
||||||
if (m_eventManager) {
|
if (m_eventManager) {
|
||||||
m_eventManager->addConsumer(&m_eventPrinter);
|
m_eventManager->addConsumer(&m_eventPrinter);
|
||||||
@ -306,6 +325,10 @@ GHOST_TSuccess GHOST_System::exit()
|
|||||||
delete m_eventManager;
|
delete m_eventManager;
|
||||||
m_eventManager = 0;
|
m_eventManager = 0;
|
||||||
}
|
}
|
||||||
|
if (m_ndofManager) {
|
||||||
|
delete m_ndofManager;
|
||||||
|
m_ndofManager = 0;
|
||||||
|
}
|
||||||
return GHOST_kSuccess;
|
return GHOST_kSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +51,7 @@ class GHOST_Event;
|
|||||||
class GHOST_TimerManager;
|
class GHOST_TimerManager;
|
||||||
class GHOST_Window;
|
class GHOST_Window;
|
||||||
class GHOST_WindowManager;
|
class GHOST_WindowManager;
|
||||||
|
class GHOST_NDOFManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of platform independent functionality of the GHOST_ISystem
|
* Implementation of platform independent functionality of the GHOST_ISystem
|
||||||
@ -184,6 +185,24 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer);
|
virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************************
|
||||||
|
** N-degree of freedom devcice management functionality
|
||||||
|
***************************************************************************************/
|
||||||
|
|
||||||
|
/** Inherited from GHOST_ISystem
|
||||||
|
* Opens the N-degree of freedom device manager
|
||||||
|
*/
|
||||||
|
virtual void openNDOF(GHOST_IWindow* w,
|
||||||
|
GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
|
||||||
|
GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
|
||||||
|
GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen,
|
||||||
|
GHOST_NDOFEventHandler_fp setNdofEventHandler);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************************
|
/***************************************************************************************
|
||||||
** Cursor management functionality
|
** Cursor management functionality
|
||||||
***************************************************************************************/
|
***************************************************************************************/
|
||||||
@ -243,6 +262,12 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual inline GHOST_WindowManager* getWindowManager() const;
|
virtual inline GHOST_WindowManager* getWindowManager() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a pointer to our n-degree of freedeom manager.
|
||||||
|
* @return A pointer to our n-degree of freedeom manager.
|
||||||
|
*/
|
||||||
|
virtual inline GHOST_NDOFManager* getNDOFManager() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the state of all modifier keys.
|
* Returns the state of all modifier keys.
|
||||||
* @param keys The state of all modifier keys (true == pressed).
|
* @param keys The state of all modifier keys (true == pressed).
|
||||||
@ -290,6 +315,9 @@ protected:
|
|||||||
/** The event manager. */
|
/** The event manager. */
|
||||||
GHOST_EventManager* m_eventManager;
|
GHOST_EventManager* m_eventManager;
|
||||||
|
|
||||||
|
/** The N-degree of freedom device manager */
|
||||||
|
GHOST_NDOFManager* m_ndofManager;
|
||||||
|
|
||||||
/** Prints all the events. */
|
/** Prints all the events. */
|
||||||
#ifdef GHOST_DEBUG
|
#ifdef GHOST_DEBUG
|
||||||
GHOST_EventPrinter m_eventPrinter;
|
GHOST_EventPrinter m_eventPrinter;
|
||||||
@ -314,5 +342,10 @@ inline GHOST_WindowManager* GHOST_System::getWindowManager() const
|
|||||||
return m_windowManager;
|
return m_windowManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline GHOST_NDOFManager* GHOST_System::getNDOFManager() const
|
||||||
|
{
|
||||||
|
return m_ndofManager;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // _GHOST_SYSTEM_H_
|
#endif // _GHOST_SYSTEM_H_
|
||||||
|
|
||||||
|
@ -76,6 +76,7 @@ void sdrawbox(short x1, short y1, short x2, short y2);
|
|||||||
void calctrackballvecfirst(struct rcti *area, short *mval, float *vec);
|
void calctrackballvecfirst(struct rcti *area, short *mval, float *vec);
|
||||||
void calctrackballvec(struct rcti *area, short *mval, float *vec);
|
void calctrackballvec(struct rcti *area, short *mval, float *vec);
|
||||||
void viewmove(int mode);
|
void viewmove(int mode);
|
||||||
|
void viewmoveNDOF(int mode);
|
||||||
|
|
||||||
int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
|
int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
|
||||||
void setwinmatrixview3d(int winx, int winy, struct rctf *rect);
|
void setwinmatrixview3d(int winx, int winy, struct rctf *rect);
|
||||||
|
@ -70,6 +70,9 @@
|
|||||||
#define WINQUIT 0x018 /* signal from user that app is to go away */
|
#define WINQUIT 0x018 /* signal from user that app is to go away */
|
||||||
#define Q_FIRSTTIME 0x019 /* on startup */
|
#define Q_FIRSTTIME 0x019 /* on startup */
|
||||||
|
|
||||||
|
/* N-degre of freedom device : 500 */
|
||||||
|
#define NDOFMOTION 500
|
||||||
|
|
||||||
/* standard keyboard */
|
/* standard keyboard */
|
||||||
|
|
||||||
#define AKEY 'a'
|
#define AKEY 'a'
|
||||||
|
@ -181,7 +181,9 @@ typedef struct UserDef {
|
|||||||
short recent_files; /* maximum number of recently used files to remember */
|
short recent_files; /* maximum number of recently used files to remember */
|
||||||
short smooth_viewtx; /* miliseconds to spend spinning the view */
|
short smooth_viewtx; /* miliseconds to spend spinning the view */
|
||||||
short glreslimit;
|
short glreslimit;
|
||||||
char pad[4];
|
short ndof_pan, ndof_rotate;
|
||||||
|
// short pads[4];
|
||||||
|
// char pad[8];
|
||||||
} UserDef;
|
} UserDef;
|
||||||
|
|
||||||
extern UserDef U; /* from usiblender.c !!!! */
|
extern UserDef U; /* from usiblender.c !!!! */
|
||||||
|
@ -2163,6 +2163,12 @@ short get_activedevice(void)
|
|||||||
return window_get_activedevice(mainwin);
|
return window_get_activedevice(mainwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
short getndof(short *sbval)
|
||||||
|
{
|
||||||
|
winlay_process_events(0);
|
||||||
|
return window_get_ndof(mainwin, sbval);
|
||||||
|
}
|
||||||
|
|
||||||
void add_to_mainqueue(Window *win, void *user_data, short evt, short val, char ascii)
|
void add_to_mainqueue(Window *win, void *user_data, short evt, short val, char ascii)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -2227,6 +2233,7 @@ static bScreen *addscreen(char *name) /* use setprefsize() if you want somethin
|
|||||||
}
|
}
|
||||||
|
|
||||||
window_set_handler(mainwin, add_to_mainqueue, NULL);
|
window_set_handler(mainwin, add_to_mainqueue, NULL);
|
||||||
|
window_open_ndof(mainwin); /* needs to occur once the mainwin handler is set */
|
||||||
init_mainwin();
|
init_mainwin();
|
||||||
mywinset(1);
|
mywinset(1);
|
||||||
|
|
||||||
|
@ -55,11 +55,16 @@
|
|||||||
#include "BIF_usiblender.h"
|
#include "BIF_usiblender.h"
|
||||||
#include "BIF_cursors.h"
|
#include "BIF_cursors.h"
|
||||||
|
|
||||||
|
#include "PIL_dynlib.h"
|
||||||
|
|
||||||
#include "mydevice.h"
|
#include "mydevice.h"
|
||||||
#include "blendef.h"
|
#include "blendef.h"
|
||||||
|
|
||||||
#include "winlay.h"
|
#include "winlay.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <OpenGL/OpenGL.h>
|
#include <OpenGL/OpenGL.h>
|
||||||
#define __CARBONSOUND__
|
#define __CARBONSOUND__
|
||||||
@ -107,6 +112,12 @@ struct _Window {
|
|||||||
*/
|
*/
|
||||||
int faked_mbut;
|
int faked_mbut;
|
||||||
|
|
||||||
|
/* Last known ndof device state
|
||||||
|
* note that the ghost device manager
|
||||||
|
* can handle any number of devices, but ghostwinlay can't
|
||||||
|
*/
|
||||||
|
float ndof[7]; /* tx, ty, tz, rx, ry, rz, dt */
|
||||||
|
|
||||||
GHOST_TimerTaskHandle timer;
|
GHOST_TimerTaskHandle timer;
|
||||||
int timer_event;
|
int timer_event;
|
||||||
};
|
};
|
||||||
@ -334,6 +345,7 @@ Window *window_open(char *title, int posx, int posy, int sizex, int sizey, int s
|
|||||||
GHOST_WindowHandle ghostwin;
|
GHOST_WindowHandle ghostwin;
|
||||||
GHOST_TWindowState inital_state;
|
GHOST_TWindowState inital_state;
|
||||||
int scr_w, scr_h;
|
int scr_w, scr_h;
|
||||||
|
int i;
|
||||||
|
|
||||||
winlay_get_screensize(&scr_w, &scr_h);
|
winlay_get_screensize(&scr_w, &scr_h);
|
||||||
posy= (scr_h-posy-sizey);
|
posy= (scr_h-posy-sizey);
|
||||||
@ -367,6 +379,9 @@ Window *window_open(char *title, int posx, int posy, int sizex, int sizey, int s
|
|||||||
win->lmouse[0]= win->size[0]/2;
|
win->lmouse[0]= win->size[0]/2;
|
||||||
win->lmouse[1]= win->size[1]/2;
|
win->lmouse[1]= win->size[1]/2;
|
||||||
|
|
||||||
|
for (i = 0; i < 7; ++i)
|
||||||
|
win->ndof[i] = 0;
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
GHOST_DisposeWindow(g_system, ghostwin);
|
GHOST_DisposeWindow(g_system, ghostwin);
|
||||||
@ -538,6 +553,31 @@ static int event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|
||||||
|
case GHOST_kEventNDOFMotion: {
|
||||||
|
// update ndof device data, and dispatch motion event
|
||||||
|
GHOST_TEventNDOFData *sb= data;
|
||||||
|
|
||||||
|
win->ndof[0] = sb->tx;
|
||||||
|
win->ndof[1] = sb->ty;
|
||||||
|
win->ndof[2] = sb->tz;
|
||||||
|
win->ndof[3] = sb->rx;
|
||||||
|
win->ndof[4] = sb->ry;
|
||||||
|
win->ndof[5] = sb->rz;
|
||||||
|
win->ndof[6] = sb->dt;
|
||||||
|
|
||||||
|
// start interaction for larger than teeny-tiny motions
|
||||||
|
if ((fabsf(sb->tx) > 0.03f) ||
|
||||||
|
(fabsf(sb->ty) > 0.03f) ||
|
||||||
|
(fabsf(sb->tz) > 0.03f) ||
|
||||||
|
(fabsf(sb->rx) > 0.03f) ||
|
||||||
|
(fabsf(sb->ry) > 0.03f) ||
|
||||||
|
(fabsf(sb->rz) > 0.03f)) {
|
||||||
|
window_handle(win, NDOFMOTION, sb->dt * 255);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case GHOST_kEventCursorMove: {
|
case GHOST_kEventCursorMove: {
|
||||||
if(win->active == 1) {
|
if(win->active == 1) {
|
||||||
GHOST_TEventCursorData *cd= data;
|
GHOST_TEventCursorData *cd= data;
|
||||||
@ -705,6 +745,13 @@ static int event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void window_get_ndof(Window* win, float* sbval) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 7; ++i) {
|
||||||
|
*sbval++ = win->ndof[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char *window_get_title(Window *win) {
|
char *window_get_title(Window *win) {
|
||||||
char *title= GHOST_GetTitle(win->ghostwin);
|
char *title= GHOST_GetTitle(win->ghostwin);
|
||||||
char *mem_title= BLI_strdup(title);
|
char *mem_title= BLI_strdup(title);
|
||||||
@ -831,3 +878,21 @@ void winlay_get_screensize(int *width_r, int *height_r) {
|
|||||||
Window *winlay_get_active_window(void) {
|
Window *winlay_get_active_window(void) {
|
||||||
return active_gl_window;
|
return active_gl_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void window_open_ndof(Window* win)
|
||||||
|
{
|
||||||
|
PILdynlib* ndofLib = PIL_dynlib_open("NDOFPlugin.plug");
|
||||||
|
printf("passing here \n");
|
||||||
|
if (ndofLib) {
|
||||||
|
printf("and here \n");
|
||||||
|
|
||||||
|
GHOST_OpenNDOF(g_system, win->ghostwin,
|
||||||
|
PIL_dynlib_find_symbol(ndofLib, "ndofInit"),
|
||||||
|
PIL_dynlib_find_symbol(ndofLib, "ndofShutdown"),
|
||||||
|
PIL_dynlib_find_symbol(ndofLib, "ndofOpen"),
|
||||||
|
PIL_dynlib_find_symbol(ndofLib, "ndofEventHandler"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GHOST_OpenNDOF(g_system, win->ghostwin, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1566,6 +1566,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
|||||||
doredraw= 1;
|
doredraw= 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NDOFMOTION:
|
||||||
|
viewmoveNDOF(0);
|
||||||
|
break;
|
||||||
|
|
||||||
case ONEKEY:
|
case ONEKEY:
|
||||||
if(G.qual==LR_CTRLKEY) {
|
if(G.qual==LR_CTRLKEY) {
|
||||||
flip_subdivison(1);
|
flip_subdivison(1);
|
||||||
@ -3330,9 +3334,11 @@ void drawinfospace(ScrArea *sa, void *spacedata)
|
|||||||
(xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y2,(mpref/2),buth,
|
(xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y2,(mpref/2),buth,
|
||||||
&(U.uiflag), 0, 0, 0, 0,
|
&(U.uiflag), 0, 0, 0, 0,
|
||||||
"Use selection as the orbiting center");
|
"Use selection as the orbiting center");
|
||||||
|
|
||||||
uiBlockEndAlign(block);
|
uiBlockEndAlign(block);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uiBlockBeginAlign(block);
|
uiBlockBeginAlign(block);
|
||||||
uiDefButBitI(block, TOG, USER_SHOW_ROTVIEWICON, B_DRAWINFO, "Mini Axis",
|
uiDefButBitI(block, TOG, USER_SHOW_ROTVIEWICON, B_DRAWINFO, "Mini Axis",
|
||||||
(xpos+edgsp+(2*mpref)+(2*midsp)),y1,(mpref/3),buth,
|
(xpos+edgsp+(2*mpref)+(2*midsp)),y1,(mpref/3),buth,
|
||||||
@ -3442,6 +3448,18 @@ void drawinfospace(ScrArea *sa, void *spacedata)
|
|||||||
&(U.obcenter_dia), 4, 10, 0, 0,
|
&(U.obcenter_dia), 4, 10, 0, 0,
|
||||||
"Diameter in Pixels for Object/Lamp center display");
|
"Diameter in Pixels for Object/Lamp center display");
|
||||||
|
|
||||||
|
uiDefBut(block, LABEL,0,"6DOF devices speeds :",
|
||||||
|
(xpos+edgsp+(5*mpref)+(6*midsp)),y2label,mpref,buth,
|
||||||
|
0, 0, 0, 0, 0, "");
|
||||||
|
//FIXME NDOF BAD ETIQUETTES
|
||||||
|
uiDefButS(block, NUM, USER_AUTOPERSP, "ndPan",
|
||||||
|
(xpos+edgsp+(5*mpref)+(6*midsp)),y1,(mpref/2),buth,
|
||||||
|
&(U.ndof_pan), 0, 200, 0, 0,
|
||||||
|
"The overall panning speed of an NDOF device, as percent of standard");
|
||||||
|
uiDefButS(block, NUM, USER_ORBIT_SELECTION, "ndRot",
|
||||||
|
(xpos+edgsp+(5*mpref)+(6*midsp)+(mpref/2)),y1,(mpref/2),buth,
|
||||||
|
&(U.ndof_rotate), 0, 200, 0, 0,
|
||||||
|
"The overall rotation speed of an NDOF device, as percent of standard");
|
||||||
|
|
||||||
} else if (U.userpref == 1) { /* edit methods */
|
} else if (U.userpref == 1) { /* edit methods */
|
||||||
|
|
||||||
|
@ -726,6 +726,9 @@ static void transformEvent(unsigned short event, short val) {
|
|||||||
else view_editmove(event);
|
else view_editmove(event);
|
||||||
Trans.redraw= 1;
|
Trans.redraw= 1;
|
||||||
break;
|
break;
|
||||||
|
case NDOFMOTION:
|
||||||
|
viewmoveNDOF(0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
Trans.redraw |= handleNumInput(&(Trans.num), event);
|
Trans.redraw |= handleNumInput(&(Trans.num), event);
|
||||||
Trans.redraw |= handleSnapping(&Trans, event);
|
Trans.redraw |= handleSnapping(&Trans, event);
|
||||||
@ -1072,6 +1075,9 @@ void ManipulatorTransform()
|
|||||||
case RETKEY:
|
case RETKEY:
|
||||||
Trans.state = TRANS_CONFIRM;
|
Trans.state = TRANS_CONFIRM;
|
||||||
break;
|
break;
|
||||||
|
case NDOFMOTION:
|
||||||
|
viewmoveNDOF(0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if(val) {
|
if(val) {
|
||||||
switch(event) {
|
switch(event) {
|
||||||
|
@ -190,6 +190,13 @@ static void init_userdef_file(void)
|
|||||||
if(U.pad_rot_angle==0)
|
if(U.pad_rot_angle==0)
|
||||||
U.pad_rot_angle= 15;
|
U.pad_rot_angle= 15;
|
||||||
|
|
||||||
|
if (U.ndof_pan==0) {
|
||||||
|
U.ndof_pan = 100;
|
||||||
|
}
|
||||||
|
if (U.ndof_rotate==0) {
|
||||||
|
U.ndof_rotate = 100;
|
||||||
|
}
|
||||||
|
|
||||||
if (G.main->versionfile <= 191) {
|
if (G.main->versionfile <= 191) {
|
||||||
strcpy(U.plugtexdir, U.textudir);
|
strcpy(U.plugtexdir, U.textudir);
|
||||||
strcpy(U.sounddir, "/");
|
strcpy(U.sounddir, "/");
|
||||||
|
@ -88,6 +88,7 @@
|
|||||||
#include "blendef.h"
|
#include "blendef.h"
|
||||||
|
|
||||||
#include "PIL_time.h" /* smoothview */
|
#include "PIL_time.h" /* smoothview */
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
#define TRACKBALLSIZE (1.1)
|
#define TRACKBALLSIZE (1.1)
|
||||||
#define BL_NEAR_CLIP 0.001
|
#define BL_NEAR_CLIP 0.001
|
||||||
@ -800,6 +801,169 @@ void viewmove(int mode)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void viewmoveNDOF(int mode)
|
||||||
|
{
|
||||||
|
static double prevTime = 0.0;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
float fval[7];
|
||||||
|
float dvec[3];
|
||||||
|
float sbadjust = 1.0f;
|
||||||
|
float len;
|
||||||
|
double now, frametime;
|
||||||
|
short use_sel = 0;
|
||||||
|
Object *ob = OBACT;
|
||||||
|
float m[3][3];
|
||||||
|
float m_inv[3][3];
|
||||||
|
float xvec[3] = {1,0,0};
|
||||||
|
float phi, si;
|
||||||
|
float q1[4];
|
||||||
|
float obofs[3];
|
||||||
|
float reverse;
|
||||||
|
float diff[4];
|
||||||
|
float d, curareaX, curareaY;
|
||||||
|
|
||||||
|
/* Sensitivity will control how fast the view rotates. The value was
|
||||||
|
* obtained experimentally by tweaking until the author didn't get dizzy watching.
|
||||||
|
* Perhaps this should be a configurable user parameter.
|
||||||
|
*/
|
||||||
|
float psens = 0.005f * (float) U.ndof_pan; /* pan sensitivity */
|
||||||
|
const float rsens = 0.005f * (float) U.ndof_rotate; /* rotate sensitivity */
|
||||||
|
const float zsens = 0.1f; /* zoom sensitivity */
|
||||||
|
|
||||||
|
const float minZoom = -30.0f;
|
||||||
|
const float maxZoom = 300.0f;
|
||||||
|
|
||||||
|
if (G.obedit==NULL && ob && !(ob->flag & OB_POSEMODE)) {
|
||||||
|
use_sel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------
|
||||||
|
* sometimes this routine is called from headerbuttons
|
||||||
|
* viewmove needs to refresh the screen
|
||||||
|
*/
|
||||||
|
areawinset(curarea->win);
|
||||||
|
|
||||||
|
/*----------------------------------------------------
|
||||||
|
* record how much time has passed. clamp at 10 Hz
|
||||||
|
* pretend the previous frame occured at the clamped time
|
||||||
|
*/
|
||||||
|
now = PIL_check_seconds_timer();
|
||||||
|
frametime = (now - prevTime);
|
||||||
|
if (frametime > 0.1f){ /* if more than 1/10s */
|
||||||
|
frametime = 1.0f/60.0; /* clamp at 1/60s so no jumps when starting to move */
|
||||||
|
}
|
||||||
|
prevTime = now;
|
||||||
|
sbadjust *= 60 * frametime; /* normalize ndof device adjustments to 100Hz for framerate independence */
|
||||||
|
|
||||||
|
/* fetch the current state of the ndof device */
|
||||||
|
getndof(fval);
|
||||||
|
|
||||||
|
/* set object offset */
|
||||||
|
if (ob) {
|
||||||
|
obofs[0] = -ob->obmat[3][0];
|
||||||
|
obofs[1] = -ob->obmat[3][1];
|
||||||
|
obofs[2] = -ob->obmat[3][2];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
VECCOPY(obofs, G.vd->ofs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calc an adjustment based on distance from camera */
|
||||||
|
if (ob) {
|
||||||
|
VecSubf(diff, obofs, G.vd->ofs);
|
||||||
|
d = VecLength(diff);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
d = 1.0f;
|
||||||
|
}
|
||||||
|
reverse = (G.vd->persmat[2][1] < 0.0f) ? -1.0f : 1.0f;
|
||||||
|
|
||||||
|
/*----------------------------------------------------
|
||||||
|
* ndof device pan
|
||||||
|
*/
|
||||||
|
psens *= 1.0f + d;
|
||||||
|
curareaX = sbadjust * psens * fval[0];
|
||||||
|
curareaY = sbadjust * psens * fval[1];
|
||||||
|
dvec[0] = curareaX * G.vd->persinv[0][0] + curareaY * G.vd->persinv[1][0];
|
||||||
|
dvec[1] = curareaX * G.vd->persinv[0][1] + curareaY * G.vd->persinv[1][1];
|
||||||
|
dvec[2] = curareaX * G.vd->persinv[0][2] + curareaY * G.vd->persinv[1][2];
|
||||||
|
VecAddf(G.vd->ofs, G.vd->ofs, dvec);
|
||||||
|
|
||||||
|
/*----------------------------------------------------
|
||||||
|
* ndof device dolly
|
||||||
|
*/
|
||||||
|
len = zsens * sbadjust * fval[2];
|
||||||
|
|
||||||
|
if (G.vd->persp==2) {
|
||||||
|
if(G.vd->persp==2) {
|
||||||
|
G.vd->camzoom+= 10.0f * -len;
|
||||||
|
}
|
||||||
|
if (G.vd->camzoom < minZoom) G.vd->camzoom = minZoom;
|
||||||
|
else if (G.vd->camzoom > maxZoom) G.vd->camzoom = maxZoom;
|
||||||
|
}
|
||||||
|
else if ((G.vd->dist> 0.001*G.vd->grid) && (G.vd->dist<10.0*G.vd->far)) {
|
||||||
|
G.vd->dist*=(1.0 + len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------
|
||||||
|
* ndof device turntable
|
||||||
|
* derived from the turntable code in viewmove
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Get the 3x3 matrix and its inverse from the quaternion */
|
||||||
|
QuatToMat3(G.vd->viewquat, m);
|
||||||
|
Mat3Inv(m_inv,m);
|
||||||
|
|
||||||
|
/* Determine the direction of the x vector (for rotating up and down) */
|
||||||
|
/* This can likely be compuated directly from the quaternion. */
|
||||||
|
Mat3MulVecfl(m_inv,xvec);
|
||||||
|
|
||||||
|
/* Perform the up/down rotation */
|
||||||
|
phi = sbadjust * rsens * /*0.5f * */ fval[3]; /* spin vertically half as fast as horizontally */
|
||||||
|
si = sin(phi);
|
||||||
|
q1[0] = cos(phi);
|
||||||
|
q1[1] = si * xvec[0];
|
||||||
|
q1[2] = si * xvec[1];
|
||||||
|
q1[3] = si * xvec[2];
|
||||||
|
QuatMul(G.vd->viewquat, G.vd->viewquat, q1);
|
||||||
|
|
||||||
|
if (use_sel) {
|
||||||
|
QuatConj(q1); /* conj == inv for unit quat */
|
||||||
|
VecSubf(G.vd->ofs, G.vd->ofs, obofs);
|
||||||
|
QuatMulVecf(q1, G.vd->ofs);
|
||||||
|
VecAddf(G.vd->ofs, G.vd->ofs, obofs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform the orbital rotation */
|
||||||
|
phi = sbadjust * rsens * reverse * fval[4]; /* twist the knob, y axis */
|
||||||
|
q1[0] = cos(phi);
|
||||||
|
q1[1] = q1[2] = 0.0;
|
||||||
|
q1[3] = sin(phi);
|
||||||
|
QuatMul(G.vd->viewquat, G.vd->viewquat, q1);
|
||||||
|
|
||||||
|
if (use_sel) {
|
||||||
|
QuatConj(q1);
|
||||||
|
VecSubf(G.vd->ofs, G.vd->ofs, obofs);
|
||||||
|
QuatMulVecf(q1, G.vd->ofs);
|
||||||
|
VecAddf(G.vd->ofs, G.vd->ofs, obofs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------
|
||||||
|
* refresh the screen
|
||||||
|
*/
|
||||||
|
scrarea_do_windraw(curarea);
|
||||||
|
screen_swapbuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Gets the lens and clipping values from a camera of lamp type object */
|
/* Gets the lens and clipping values from a camera of lamp type object */
|
||||||
void object_view_settings(Object *ob, float *lens, float *clipsta, float *clipend)
|
void object_view_settings(Object *ob, float *lens, float *clipsta, float *clipend)
|
||||||
{
|
{
|
||||||
|
@ -79,6 +79,8 @@ void window_warp_pointer (Window *win, int x, int y);
|
|||||||
|
|
||||||
void window_queue_redraw (Window *win);
|
void window_queue_redraw (Window *win);
|
||||||
|
|
||||||
|
void window_open_ndof(Window* win);
|
||||||
|
|
||||||
/* Global windowing operations */
|
/* Global windowing operations */
|
||||||
|
|
||||||
Window* winlay_get_active_window(void);
|
Window* winlay_get_active_window(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user