static void Main(string[] args) { uint hHD = HDAPI.hdInitDevice(null); Console.WriteLine(HLAPI.hlGetString(HLGetStringParameters.HL_VENDOR)); HDAPI.hdMakeCurrentDevice(hHD); IntPtr hHLRC = HLAPI.hlCreateContext(hHD); HLAPI.hlMakeCurrent(hHLRC); //禁用GL HLAPI.hlDisable(HLCapabilityParameters.HL_USE_GL_MODELVIEW); uint spring = HLAPI.hlGenEffects(1); Console.WriteLine("spring:{0}", spring); //添加回调处理按扭按下 HLAPI.hlAddEventCallback(HLCallbackEvents.HL_EVENT_1BUTTONDOWN, HLAPI.HL_OBJECT_ANY, HLCallbackThreads.HL_CLIENT_THREAD, ButtonCB, new IntPtr(spring)); HLAPI.hlAddEventCallback(HLCallbackEvents.HL_EVENT_1BUTTONUP, HLAPI.HL_OBJECT_ANY, HLCallbackThreads.HL_CLIENT_THREAD, ButtonCB, new IntPtr(spring)); HLAPI.hlAddEventCallback(HLCallbackEvents.HL_EVENT_2BUTTONDOWN, HLAPI.HL_OBJECT_ANY, HLCallbackThreads.HL_CLIENT_THREAD, ButtonCB, new IntPtr(0)); uint friction = HLAPI.hlGenEffects(1); HLAPI.hlBeginFrame(); HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_GAIN, 0.2); HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_MAGNITUDE, 0.5); HLAPI.hlStartEffect(HLStartEffectTypes.HL_EFFECT_FRICTION, friction); HLAPI.hlEndFrame(); HLError error; while (true) { HLAPI.hlBeginFrame(); //轮询事件。请注意,客户端线程事件回调是从这里的一个框架内分派的,因此我们可以安全地直接启动/停止事件回调的效果 HLAPI.hlCheckEvents(); HLAPI.hlEndFrame(); error = HLAPI.hlGetError(); if (error.CheckedError()) { Console.WriteLine("HL Error:{0}", error.GetErrorCodeString()); } } //Stop the friction effect. HLAPI.hlBeginFrame(); HLAPI.hlStopEffect(friction); HLAPI.hlEndFrame(); HLAPI.hlDeleteEffects(friction, 1); HLAPI.hlDeleteEffects(spring, 1); HLAPI.hlDeleteContext(hHLRC); HDAPI.hdDisableDevice(hHD); Console.ReadKey(); }
static void Main(string[] args) { #region /* * hHD = HDAPI.hdInitDevice(null); * Console.WriteLine("Test..{0}", HDAPI.hdGetString(HDGetStringParameters.HD_DEVICE_SERIAL_NUMBER)); * Console.WriteLine("Test..{0}", Marshal.PtrToStringAnsi(HDAPI.hdGetString(HDGetStringParameters.HD_DEVICE_MODEL_TYPE))); * * IntPtr hHLRC = HLAPI.hlContextDevice(hHD); * HLAPI.hlEnable(HLCapabilityParameters.HL_PROXY_RESOLUTION); * error = HLAPI.hlGetError(); * Console.WriteLine("ErrorCode:{0}", error.GetErrorCodeStr()); * * String ver = "HL_VENDOR"; * IntPtr ps = HLAPI.GetVariables(ver); // Marshal.StringToHGlobalAnsi(ver); * * IntPtr ptr = HLAPI.hlGetString(ref ps); * if(ptr == IntPtr.Zero) * Console.WriteLine("Zero IntPtr.."); * * Console.WriteLine("BOOl::{0}", ptr); * Console.WriteLine(Marshal.PtrToStringAnsi(ptr)); * * error = HLAPI.hlGetError(); * Console.WriteLine("ErrorCode:{0}", error.GetErrorCodeStr()); * * HDAPI.hdDisableDevice(hHD); */ #endregion //IntPtr ptr = HLAPI.GetVariables("HL_VENDOR"); //IntPtr p2 = Marshal.ReadIntPtr(ptr); //这才是我要的常数 //Console.WriteLine(Marshal.PtrToStringAnsi(HL_VENDOR)); //IntPtr tr = HLAPI._hlGetString(p2); //IntPtr tr = HLAPI._hlGetString(HL_VENDOR); //Console.WriteLine(Marshal.PtrToStringAnsi(tr)); Console.WriteLine(HLAPI.hlGetString(HLGetStringParameters.HL_VERSION)); Console.ReadKey(); }
static void ButtonCB(String evt, uint obj, String thread, IntPtr cache, IntPtr pUserData) { uint spring = (uint)pUserData; HLCallbackEvents cEvent = (HLCallbackEvents)Enum.Parse(typeof(HLCallbackEvents), evt); if (cEvent == HLCallbackEvents.HL_EVENT_1BUTTONDOWN) { double[] anchor = new double[3]; HLAPI.hlCacheGetDoublev(cache, HLCacheGetParameters.HL_PROXY_POSITION, anchor); HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_GAIN, 0.8); HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_MAGNITUDE, 1.0); HLAPI.hlEffectdv(HLEffectParams.HL_EFFECT_PROPERTY_POSITION, anchor); HLAPI.hlStartEffect(HLStartEffectTypes.HL_EFFECT_SPRING, spring); //弹力 //HLAPI.hlStartEffect(HLStartEffectTypes.HL_EFFECT_FRICTION, friction); //摩擦力 //HLAPI.hlStartEffect(HLStartEffectTypes.HL_EFFECT_VISCOUS, viscous); //粘滞效果 } else if (cEvent == HLCallbackEvents.HL_EVENT_1BUTTONUP) { HLAPI.hlStopEffect(spring); } }
static void ButtonCB(String evt, uint obj, String thread, IntPtr cache, IntPtr pUserData) { //Console.WriteLine(Marshal.PtrToStringAnsi(evt)); Console.WriteLine("{0} {1} {2}", obj, (uint)pUserData, evt); Console.WriteLine("{0} {1}", evt, thread); uint spring = (uint)pUserData; HLCallbackEvents cb_event = (HLCallbackEvents)Enum.Parse(typeof(HLCallbackEvents), evt); HLCallbackThreads cb_thread = (HLCallbackThreads)Enum.Parse(typeof(HLCallbackThreads), thread); if (cb_event == HLCallbackEvents.HL_EVENT_1BUTTONDOWN) { double[] anchor = new double[3]; HLAPI.hlCacheGetDoublev(cache, HLCacheGetParameters.HL_PROXY_POSITION, anchor); HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_GAIN, 0.8); HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_MAGNITUDE, 1.0); HLAPI.hlEffectdv(HLEffectParams.HL_EFFECT_PROPERTY_POSITION, anchor); HLAPI.hlStartEffect(HLStartEffectTypes.HL_EFFECT_SPRING, spring); } else if (cb_event == HLCallbackEvents.HL_EVENT_1BUTTONUP) { HLAPI.hlStopEffect(spring); } else if (cb_event == HLCallbackEvents.HL_EVENT_2BUTTONDOWN) { double[] direction = new double[3] { 0.0, 0.0, 1.0 }; double duration = 100; //持续 100ms //通过在短时间内指挥具有方向和大小的力来触发脉冲。 HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_DURATION, duration); HLAPI.hlEffectd(HLEffectParams.HL_EFFECT_PROPERTY_MAGNITUDE, 0.8); HLAPI.hlEffectdv(HLEffectParams.HL_EFFECT_PROPERTY_DIRECTION, direction); HLAPI.hlTriggerEffect(HLTriggerEffectTypes.HL_EFFECT_CONSTANT); } }
static void Main(string[] args) { uint hHD = HDAPI.hdInitDevice(null); HDErrorInfo error = HDAPI.hdGetError(); if (error.CheckedError()) { Console.WriteLine("Initialize Device Failed."); Console.ReadKey(); return; } HDAPI.hdMakeCurrentDevice(hHD); IntPtr hHLRC = HLAPI.hlCreateContext(hHD); HLAPI.hlMakeCurrent(hHLRC); HLAPI.hlDisable(HLCapabilityParameters.HL_USE_GL_MODELVIEW); uint spring = HLAPI.hlGenEffects(1); IntPtr ptr = new IntPtr(spring); HLAPI.hlAddEventCallback(HLCallbackEvents.HL_EVENT_1BUTTONDOWN, HLAPI.HL_OBJECT_ANY, HLCallbackThreads.HL_CLIENT_THREAD, ButtonCB, ptr); HLAPI.hlAddEventCallback(HLCallbackEvents.HL_EVENT_1BUTTONUP, HLAPI.HL_OBJECT_ANY, HLCallbackThreads.HL_CLIENT_THREAD, ButtonCB, ptr); while (true) { HLAPI.hlBeginFrame(); //轮询事件。请注意,客户端线程事件回调是从这里的一个框架内分派的,因此我们可以安全地直接启动/停止事件回调的效果。 HLAPI.hlCheckEvents(); HLAPI.hlEndFrame(); } HLAPI.hlDeleteEffects(spring, 1); HLAPI.hlDeleteContext(hHLRC); HDAPI.hdDisableDevice(hHD); }