From 03ffced8b3ac2c7c4249d02bbc01c75ecb93fc75 Mon Sep 17 00:00:00 2001 From: James Monroe Date: Fri, 5 Apr 2013 15:47:36 -0500 Subject: [PATCH] remove 3rd party libs --- code/win32/FeelIt/FEELitIFR.h | 247 ----- code/win32/FeelIt/FFC.h | 78 -- code/win32/FeelIt/FFC10.dll | Bin 126976 -> 0 bytes code/win32/FeelIt/FFC10.lib | Bin 232332 -> 0 bytes code/win32/FeelIt/FFC10d.dll | Bin 405591 -> 0 bytes code/win32/FeelIt/FFC10d.lib | Bin 232598 -> 0 bytes code/win32/FeelIt/FFCErrors.h | 171 ---- code/win32/FeelIt/FeelBaseTypes.h | 265 ----- code/win32/FeelIt/FeelBox.h | 178 ---- code/win32/FeelIt/FeelCompoundEffect.h | 184 ---- code/win32/FeelIt/FeelCondition.h | 345 ------- code/win32/FeelIt/FeelConstant.h | 193 ---- code/win32/FeelIt/FeelDXDevice.h | 126 --- code/win32/FeelIt/FeelDamper.h | 177 ---- code/win32/FeelIt/FeelDevice.h | 196 ---- code/win32/FeelIt/FeelEffect.h | 344 ------- code/win32/FeelIt/FeelEllipse.h | 253 ----- code/win32/FeelIt/FeelEnclosure.h | 268 ----- code/win32/FeelIt/FeelFriction.h | 172 ---- code/win32/FeelIt/FeelGrid.h | 171 ---- code/win32/FeelIt/FeelInertia.h | 178 ---- code/win32/FeelIt/FeelMouse.h | 143 --- code/win32/FeelIt/FeelPeriodic.h | 227 ----- code/win32/FeelIt/FeelProjects.h | 302 ------ code/win32/FeelIt/FeelRamp.h | 194 ---- code/win32/FeelIt/FeelSpring.h | 191 ---- code/win32/FeelIt/FeelTexture.h | 287 ------ code/win32/FeelIt/FeelitAPI.h | 1252 ------------------------ code/win32/FeelIt/fffx.cpp | 680 ------------- code/win32/FeelIt/fffx_feel.cpp | 689 ------------- code/win32/FeelIt/fffx_feel.h | 29 - code/win32/bink.h | 620 ------------ 32 files changed, 8160 deletions(-) delete mode 100644 code/win32/FeelIt/FEELitIFR.h delete mode 100644 code/win32/FeelIt/FFC.h delete mode 100644 code/win32/FeelIt/FFC10.dll delete mode 100644 code/win32/FeelIt/FFC10.lib delete mode 100644 code/win32/FeelIt/FFC10d.dll delete mode 100644 code/win32/FeelIt/FFC10d.lib delete mode 100644 code/win32/FeelIt/FFCErrors.h delete mode 100644 code/win32/FeelIt/FeelBaseTypes.h delete mode 100644 code/win32/FeelIt/FeelBox.h delete mode 100644 code/win32/FeelIt/FeelCompoundEffect.h delete mode 100644 code/win32/FeelIt/FeelCondition.h delete mode 100644 code/win32/FeelIt/FeelConstant.h delete mode 100644 code/win32/FeelIt/FeelDXDevice.h delete mode 100644 code/win32/FeelIt/FeelDamper.h delete mode 100644 code/win32/FeelIt/FeelDevice.h delete mode 100644 code/win32/FeelIt/FeelEffect.h delete mode 100644 code/win32/FeelIt/FeelEllipse.h delete mode 100644 code/win32/FeelIt/FeelEnclosure.h delete mode 100644 code/win32/FeelIt/FeelFriction.h delete mode 100644 code/win32/FeelIt/FeelGrid.h delete mode 100644 code/win32/FeelIt/FeelInertia.h delete mode 100644 code/win32/FeelIt/FeelMouse.h delete mode 100644 code/win32/FeelIt/FeelPeriodic.h delete mode 100644 code/win32/FeelIt/FeelProjects.h delete mode 100644 code/win32/FeelIt/FeelRamp.h delete mode 100644 code/win32/FeelIt/FeelSpring.h delete mode 100644 code/win32/FeelIt/FeelTexture.h delete mode 100644 code/win32/FeelIt/FeelitAPI.h delete mode 100644 code/win32/FeelIt/fffx.cpp delete mode 100644 code/win32/FeelIt/fffx_feel.cpp delete mode 100644 code/win32/FeelIt/fffx_feel.h delete mode 100644 code/win32/bink.h diff --git a/code/win32/FeelIt/FEELitIFR.h b/code/win32/FeelIt/FEELitIFR.h deleted file mode 100644 index bbc39fe..0000000 --- a/code/win32/FeelIt/FEELitIFR.h +++ /dev/null @@ -1,247 +0,0 @@ -/********************************************************************** - Copyright (c) 1999 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FEELitIFR.h - - PURPOSE: Input/Output for IFR Files, FEELit version - - STARTED: - - NOTES/REVISIONS: - -**********************************************************************/ - -#if !defined( _FEELIT2_H_) -#define _FEELIT2_H_ - -#ifndef __FEELITAPI_INCLUDED__ - #error include 'dinput.h' before including this file for structures. -#endif /* !__DINPUT_INCLUDED__ */ - -#define IFRAPI __stdcall - -#if !defined(_FFCDLL_) -#define DLLAPI __declspec(dllimport) -#else -#define DLLAPI __declspec(dllexport) -#endif - -#if defined __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* -** CONSTANTS -*/ - -/* -** RT_FEELIT - Resource type for IFR projects stored as resources. -** This is the resource type looked for by IFLoadProjectResource(). -*/ -#define RT_FEELIT ((LPCSTR)"FEELIT") - - -/* -** TYPES/STRUCTURES -*/ - -/* -** HIFRPROJECT - used to identify a loaded project as a whole. -** individual objects within a project are uniquely referenced by name. -** Created by the IFLoadProject*() functions and released by IFReleaseProject(). -*/ -typedef LPVOID HIFRPROJECT; - -/* -** IFREffect - contains the information needed to create a DI effect -** using IDirectInputEffect::CreateEffect(). An array of pointers to these -** structures is allocated and returned by IFCreateEffectStructs(). -*/ -typedef struct { - GUID guid; - LPFEELIT_EFFECT lpDIEffect; -} IFREffect; - - -/* -** FUNCTION DECLARATIONS -*/ - -/* -** IFLoadProjectResource() - Load a project from a resource. -** hRsrcModule - handle of the module containing the project definition resource. -** pRsrcName - name or MAKEINTRESOURCE(id) identifier of resource to load. -** pDevice - device for which the project is being loaded. If NULL, -** effects will be created generically, and IFCreateEffects() will fail. -** Returns an identifier for the loaded project, or NULL if unsuccessful. -*/ -DLLAPI -HIFRPROJECT -IFRAPI -IFRLoadProjectResource( - HMODULE hRsrcModule, - LPCSTR pRsrcName, - LPIFEELIT_DEVICE pDevice ); - -/* -** IFLoadProjectPointer() - Load a project from a pointer. -** pProject - points to a project definition. -** pDevice - device for which the project is being loaded. If NULL, -** effects will be created generically, and IFCreateEffects() will fail. -** Returns an identifier for the loaded project, or NULL if unsuccessful. -*/ -DLLAPI -HIFRPROJECT -IFRAPI -IFRLoadProjectPointer( - LPVOID pProject, - LPIFEELIT_DEVICE pDevice ); - -/* -** IFLoadProjectFile() - Load a project from a file. -** pProjectFileName - points to a project file name. -** pDevice - device for which the project is being loaded. If NULL, -** effects will be created generically, and IFCreateEffects() will fail. -** Returns an identifier for the loaded project, or NULL if unsuccessful. -*/ -DLLAPI -HIFRPROJECT -IFRAPI -IFRLoadProjectFile( - LPCSTR pProjectFileName, - LPIFEELIT_DEVICE pDevice ); - -/* -** IFLoadProjectObjectPointer() - Load a project from a pointer to a single -** object definition (usually used only by the editor). -** pObject - points to an object definition. -** pDevice - device for which the project is being loaded. If NULL, -** effects will be created generically, and IFCreateEffects() will fail. -** Returns an identifier for the loaded project, or NULL if unsuccessful. -*/ -DLLAPI -HIFRPROJECT -IFRAPI -IFRLoadProjectObjectPointer( - LPVOID pObject, - LPIFEELIT_DEVICE pDevice ); - -/* -** IFReleaseProject() - Release a loaded project. -** hProject - identifies the project to be released. -** Returns TRUE if the project is released, FALSE if it is an invalid project. -*/ -DLLAPI -BOOL -IFRAPI -IFRReleaseProject( - HIFRPROJECT hProject ); - -/* -** IFCreateEffectStructs() - Create IFREffects for a named effect. -** hProject - identifies the project containing the object. -** pObjectName - name of the object for which to create structures. -** pNumEffects - if not NULL will be set to a count of the IFREffect -** structures in the array (not including the terminating NULL pointer.) -** Returns a pointer to the allocated array of pointers to IFREffect -** structures. The array is terminated with a NULL pointer. If the -** function fails, a NULL pointer is returned. -*/ -DLLAPI -IFREffect ** -IFRAPI -IFRCreateEffectStructs( - HIFRPROJECT hProject, - LPCSTR pObjectName, - int *pNumEffects ); - -DLLAPI -IFREffect ** -IFRAPI -IFRCreateEffectStructsByIndex( - HIFRPROJECT hProject, - int nObjectIndex, - int *pNumEffects ); - -DLLAPI -LPCSTR -IFRAPI -IFRGetObjectNameByIndex( - HIFRPROJECT hProject, - int nObjectIndex ); - -/* -** IFReleaseEffectStructs() - Release an array of IFREffects. -** hProject - identifies the project for which the effects were created. -** pEffects - points to the array of IFREffect pointers to be released. -** Returns TRUE if the array is released, FALSE if it is an invalid array. -*/ -DLLAPI -BOOL -IFRAPI -IFRReleaseEffectStructs( - HIFRPROJECT hProject, - IFREffect **pEffects ); - -/* -** IFCreateEffects() - Creates the DirectInput effects using -** IDirectInput::CreateEffect(). -** hProject - identifies the project containing the object. -** pObjectName - name of the object for which to create effects. -** pNumEffects - if not NULL will be set to a count of the IDirectInputEffect -** pointers in the array (not including the terminating NULL pointer.) -** Returns a pointer to the allocated array of pointers to IDirectInputEffects. -** The array is terminated with a NULL pointer. If the function fails, -** a NULL pointer is returned. -*/ -DLLAPI -LPIFEELIT_EFFECT * -IFRAPI -IFRCreateEffects( - HIFRPROJECT hProject, - LPCSTR pObjectName, - int *pNumEffects ); - -/* -** IFReleaseEffects() - Releases an array of IDirectInputEffect structures. -** hProject - identifies the project for which the effects were created. -** pEffects - points to the array if IDirectInputEffect pointers to be released. -** Returns TRUE if the array is released, FALSE if it is an invalid array. -*/ -DLLAPI -BOOL -IFRAPI -IFRReleaseEffects( - HIFRPROJECT hProject, - LPIFEELIT_EFFECT *pEffects ); - -DLLAPI -BOOL -IFRAPI -DllMain( - HINSTANCE hInstDLL, - DWORD fdwReason, - LPVOID lpvReserved ); - - -#if defined __cplusplus -} -#endif /* __cplusplus */ - -#endif /* !IForce2_h */ diff --git a/code/win32/FeelIt/FFC.h b/code/win32/FeelIt/FFC.h deleted file mode 100644 index 07cfeea..0000000 --- a/code/win32/FeelIt/FFC.h +++ /dev/null @@ -1,78 +0,0 @@ -/********************************************************************** - Copyright (c) 1997,8,9 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FFC.h - - PURPOSE: Class Types for the Force Foundation Classes - - STARTED: 10/29/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - -**********************************************************************/ - - -#if !defined(AFX_FFC_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FFC_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - - -#include "FeelBox.h" -#include "FeelCondition.h" -#include "FeelConstant.h" -#include "FeelDamper.h" -#include "FeelDevice.h" -#include "FeelDXDevice.h" -#include "FeelEffect.h" -#include "FeelEllipse.h" -#include "FeelEnclosure.h" -#include "FeelMouse.h" -#include "FeelFriction.h" -#include "FeelGrid.h" -#include "FeelInertia.h" -#include "FeelPeriodic.h" -#include "FeelProjects.h" -#include "FeelRamp.h" -#include "FeelSpring.h" -#include "FeelTexture.h" -#include "FFCErrors.h" - - -#endif // !defined(AFX_FFC_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) - - - - - - - - - - - - - - - - - diff --git a/code/win32/FeelIt/FFC10.dll b/code/win32/FeelIt/FFC10.dll deleted file mode 100644 index 0536f23bd32a58b9a7eed9c85fc223026b60f629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126976 zcmeFa4}4U`)jxbUxk)atAq#A9)u@ZE8YS9jVhslDhWsHQ#7#mrAdt|CHm0Z%cNJ?$ zLzgI*aV@pB)z-F9wY87^L#urrY%5I&vcx|KXj`aYu~j>Cv5kd7(8#{uGjs3VyG!7) z)%SgWzt2Z>bMKuybLPyMGv}O{Idkru>((lnilV6aB@&9V5m)->7k^LvXFpz#J?B?r zm8VC&G-;z__DhrIw%v5Qw`19@pI`Rbo4wb6_Lf_24S7FzgLhf@7Vk~Bc&n~$^xk~y zk{d3~%^mGCKsP;;ecQO*ZReW52e#aJu4+6_5Z9Z|t-|&8*xlz&#PwM0bLV!5>-Fb4 zasAQjx18$|&r8L%;il``2$qR?pjuI8JF=Aaoxi`*Oxv%FoixUgtteiHqU?~VvUAE-2q0cJHy3Zq>+TLMY zli7$D{FlmXO53OKVjc2%jVmtZKfj{%Ub^h|W!ED?v=wa@b@t+F`{yTk%WhbDD>9bm z_;u=A6w<{w-k&P=vlfKjl0PYk3tU^nnAnOaV z**>i~+TmpNsvb~Ty`~4WXuXr&<juyR=r;;M9XoHnTvlEr=;oLHCx; zY6|qVYyVStCZxtS3w;_o{YZaCXfmrAZjN>hx9$J5;tI5TgZzs>P?RJ6j?k!Pz67_C zEh>w(wk!Y^Y&-wC&v+T+GmMv8#k*v00>6sosqL@wsgb^gLAHZkreDr(Q}tykyG_%V zX)SD~Q=jEbYvD#(09Pyu~4s_&1MDk+5nq1SFfGR zX3f)U=S62NWM5ne!rmnadzU0EYN~UxSxfcWrEFG*UfaQDh4k7Go3&i8UCtUh^+0D# znKu%_8yV;&5V+lrz$?+(*^_r{q7@)Eb+kSu(x=vi{}rvBYb1@clCD`84J>RuN#j}L zQa!MgT_aFx4C#RoyGEeYNGK8A?frGB*O`2Ym)6ZUZ%A_$U+#M&!~X)+jUnsTqV7Se%RWQ_h7HVga4<|horGN zmTBC5Jp5_&VA=?cKGhAf$YFX4P8Hn=c12$@(U&dyYPu5pt{t)eyjWf}`!DDFR{y=b zKE40CjwKR89tHWU#>=$+YitUZyw=Q)HS+1-0j?om0XU%iklw24t?BV84&>N`qLZ^#wk zbBpjgk07WI$49rT{FO%pz{>L1JNH-sOM1%>b&X-C`OCNJ3%@+v`7i5@DI+0zS&a&q z{^pWIPj8o(Wi#i-o`Fyv8`thgjAz*~m58Sx*NpO^&i!m`J>R`f)D^>$HO5E{F{{$b zYBY)3uhz-8H5#R-DR8JU)Yh3>UZJkg*eIs1M6UpSw?x0hgd#1`H8Whu8cr9G2BW6#@dUR(!??n^Y4l27#4{9i$!5hJpmNiN{;ANP)*mOhq^8&G2m$;{*{o`rm|n22#?MCrb**IIdk6>y&n1zrj?D0dEY}aoAFWxa*DYlERk$ZREw`3# zYBiQWTckLdz@s)YlzHc*gs3PEHj2exH6FGb#kV3ctd{qMo(hieZ0U2DJ&Kf7YhJM#A&TOXzt;UVzWA z*CcreecPVJFSWl|do?g_!|%)Zy@nqVOz=OEEE8ERl1%`~{`pNiOFI?zpHVHciF!{B zO#nr{mkyG~*FsDvI(?pYrKzzw+1M)ViJ|Xu#CURoCsvX@-wn$ADU`L*kNe06iBM+u zi;e(DaR;O`NHIRZr>0er9HvgeAf`NWBcIjW@n~*lvLFrVkJ#Gr)c@bG2q+*f#1QPH zNkwD3(%kM9vm4-k9e5rs%_ixjSq(KC`F^sIU!5!(IWEAPQz5suSdvKgC&{xCZK|ha zn)dku^$m?dvp-+vPrF1bWqXU|32COro5kkj4AZVNGa+4 zNc34~qYv@8NuNeZpFn+6yAm{6;AQ^JJR5PmN#dAGAGDLj zt0c*C;`~=5n>RTX4>Tn2)9(2FA0!f_MUwv@#Wcti7VtOs>|*bR-ED8KbGQ=uTCu~0 zN=tf)$)j}(qg`6bYq2Vy2YjKhi}X*in^gT)mEEN2w`yc^Uh8DFMZcxlVEN18%b35I z(I`>b%kc$~AvHXP{qY%^eUew#41?r)W|VU_*~XjDvbLhez%LQP(oR(T8*Dc z6?>_4Z#*w@tT;UNnM^!Iuk)}N>HJ3GU@yB_3p6*>v+epV9sFsHNEtdC?Q^s30lwt| zm|)V1Z1bO3y+shxZ5WM@KY&(tLI8k+p@-NEs13cQBXl{mN%#_$Zz`amZRq6-1r#t9 z(ET)A^?(x~XvM@0!z{mNS9lyusTqJSv>Vi-OX(TdNUaHHZ6pFAOO_B14Td@)dHHsZ zV7M%izZnVtI-i<@!Un$o`l^Mm_oLzqa|1m`czzF1O+4LXU_uy*B^#(Z7@5FhP7*P< zLWnJth*^s)27XOR{5~>0llUdpCh>DA61M_e+Pwm~4Y0q_k|foB>ocfkb@y5Wzh459 z(ce=)I{k`3szPE(K`fFXUcsT(V=X;mA*9OZuWx8~Q5RQ^v5+kmlpHUSEw+!=wS;e{ z&xuLNY+vz5;z}&~0ftZs7Fuao`Wpi6O1(kMM@L)u6$<>8!Gr?~7N+7CIjEKN!l;{4 zvph^%Y~fdoE^3Kv(I85u2(vJBDGXdParMamdI(v))_TaA4R~tRSJQ>95k~K7`YRVo%ykm7ddUWk z9P|)lG_tcELCVH0qZFkn2ts)AD=2wqBQ1cI9BF3L9wL4EJ4(gR0|Dq>0-*X*pDS9iPJP(%5`wq)&_VYVpYuYWzIbVN?+Jur~8H*IrcM&`Ym?Lvhcpyq;hpkw8B} zwuFfDiULhMaVU`>p&Z%b>2E7qpQ?8#vFDx81j-w1;)ni~%xka%QL-S|*i8IeOrxx< z0Sq$RH=A!gYRjBB{{qETieDvu4fuT)zb^bbj4R#WgWp&2dj!9vbb!6RCb|A^Wg zkz5Zs3dvzC!M=f85*}EtFqUA)qJhSG$QI*e+Ik33$9zhzXBA`K!Ujur9r|JDHkm?d z#z<+EDS>3l9GS8>nNluOI+7_D$&~J7%4uv+rmaO9t)7KQKB|f_mzA@|Bn2V|-DDoT z+bpJDZZ^#czHC<#e`t3wp7;aX9oJw{N((dSVKr6kdE(c|8{W`atY$8Zyqv5+jiSVz z)9BKrWo>vSkeRv;?{>hv1qKIA~S=Q>LTIn6GMYtC3Lq)p>_Ac=i z?s;QR-|px4W^JR&-h2JnzCCzXxEBjsdofn`p4E%=KkYxV#SzNbv%e=1%I+Chfjj;_ z1S6X00srd`i~zT^%bM81$eTlvgGG%&7WTm69&BcNLK+*3=6T~JGQDg?LHQ7pP7|Y> zl6>WZ;nT~9!uinIaoy613)owWHhUEI0{=9039ELN>~dz54Cs}f$hL%DS*TYQuxd?j z^iBf}yJM9;5?#D^^LahsZlSUTfUPDre)p z607ukaAC1{8D5Yh=sXiI!Tr-!9F)~*%E(DxfDUo z(Ae@UF$(}8yJcPv8@2KnZoBa=m!?Z-AA5+3e2qvQc~1?W&Z=Fqc&1)CmsPvvLvCCX zCLz-F%6U-%Fnaq!^t?;2tdhf-ga-}ha4Cz>z`#Jdm_VK{%tA zBSQ|P6^CnBWoe{L31`zth^zQp%$-rdzzAi7%n?<)t^fP>XFYuM_$7k#9HNmBo|11P zcl(Qh6A|e4(#X}R@P32N6!3;dfR`}fiIv+FGD_Z2?e*+QpoN}2eS2Y&VcZw)IkY!-KZv#W3KBznJgTG&QWT&Ir8F2V z3hgHVd-E+Jk+(r`!HJ2U-G=Z(C3}}{KF-iCvVOq z0qLeb*qy%{l~NV{(D`j`(5d@&%h}w%EUJZOQUI>tTA(O{pNU^hUAdjC_p#BTsUQ)5LA7K6FxL4wb2WP89N zvq854B-PSt>k`r_cOPB*0!k z+X8y0Z!RpcLfn_(ek!kdFM-X0@Mvkw6mKq49$D zl?ZZI+t!yhBLUV*Nw1g|V|r)E1apB86mkdZ8=J8x#9rcCAn(yaxgO-EWiKhBbLBdp zvGTFHo|gO~ojzXzsoeoU`XcyGuKoDaFaRQgNDFLx^aB4qz<&ba zUunZXBc-&9@b{vN#p0yEy{TC&+CakP*pYW7k(UdTMhgh(59}y=4U}KtvC~YHqhGcY z&4u1GQ8pYML!MA!$<{5xAWUj8Az(OkdB561KZxf&zgw2 z4W2Cyknko-cm*g?%d8kqyw zw9#ukgqu(`de9rIk#;~`p&l#>O~A^w(-_{)?!GrN^*S0&9;ukJb-|HHa0v2EdT^><=hthhM7N7}BakbfQ*V?I)kTX2ePKJq$d z)y90J)OeXTAF=PRliW$)UnhA)a}a*$Elkj}J(pvGVwXWN2PGZIe>;&76eP|I=d%|=)EN9T4!5cNbM|qIe-6ViqnD@PAL5gA{$YJ31JYMY zuT`;I2iK{T{m7Vu{HT&i?TNOU$qv_&^Vb83>snB zgvPLKyru;bZZMuvas+DK2aV?KIYJq*1d#|$ZdaQdAs)xIlKc(1X?Jn~B&)hahmNII zx%yc)=C|7uuJ&SXG!(V?WGzr8im0VK)2zh?{gQSpL<;zC;Ppx2PZaRSqgq%5SY@}> zZAcz@f#y5CQ&3vS$jx$BESUw&sxn7IB4F(IBL9KAZTZvv(FBwvdDnu$)nK$%#ns6! ziw2xJ9N%nSUs&3Y`RPm=v?jd2$eSQpIqq0Rp$!^67o|S``~GzG1$w~nr(^Zr7Cqo) z^*%k|WA%l4ppeZh(rb%iN*Nd${QMvI*9rK5JR;yU@t-1ZE&n@zImSzSage{)Wet`$ zahp0=z6z=t!Zv2SOdBkMe%@4iRrpe$>wP7?SU&rDuT1_=+bhSMNza)+z19~~=1Lmc zJM=$=Z_rZ!w$soqZ!G$)`#RCDFvx$k!lK_}xJ{+s&#$xScdzmCMEa3E^8~b7NpCEh zSVFHU)N6|L8lPSROGd*GOtq0APv)H{PXGnByedIJP`FS`;ob}s-cFAsH~42!4aTe1 zVjrvZ!a$`hqh-sHJDZxYJrVG9UyNa6I7FVKiS|Blw?FKPm5V*+k z<+T+P8u`U16v}B^yb%n;v_yRo08a|=Y~*1%L~D?wL5t;3f58@qAf?vArv^H_eH0J^ zGNmXpCct;yA!ri6faQql&>l+uwUM01CZgjS;NO$i(*ZR{xlrK=uuA!DP6vBo~YA{6xk@fs|bX~+p$x+unjKW!pXHz^e>Wg(Wh?osXmQ5T<`MgT|T%N zw;J<0lJBUaq_;ViO%AVm%~HK4q}MEGS7BFH?}GQNs^29%lCe?`hvb@09lpxgPXZ6y z{BBINV-A9HpvRma0ycQ}zr)CE_rG}@2_P@|-(b&zyl!$ar_z`f1VMfAG2+36hXyam zm>=LFSwOnH$zq04pQ?dmeKqOzU6HKMOTIEa*kPx!hUPml*A&ZUVQuAm=;rRwd923c zbjd_aUW9iE<{5Q!jrW;)a2^U9IYMWWhfWseE%CglQ;A+Yc3B^r!hRv{4_6KakaQ56}Ot zmfr&M+k72P%*&s|*tKn9VE+O|#7+?`I5Kl+r_G6FAF9@e9W*5X39q_|hL~z_Y{P={ z-M0C~i1h`MRf{`*9-%1hkr0-XlFskZT6mOe=?>+FmoC`50ru(z*r~=Y3~Z~UJ~?-p z=yI{9fuRUYY5NoFC!a(5P)`EFcntpliwJmW3VL{bAsg0VLs;vFB>Vd2$Yy7JE<1;1 z!{SW@$h}T&&xu#ES0FuDhVEd~RlP!G(>1+9BjP}W^z=f4gfp=6LgP zDCRo)$1`_D{_LFIz*ow;*-Op*0^nqdUnh2lU*c|=A~+o~*)m&=@sFY@{CI>qTiF%J5PFeQ+q7n#3Dl6f?-C=`27TeIjLxP}FOFyey zioK^IA=DtyAkVzATKa~DML`Vu%A4 zM=t@deBa3%*>M71x23}(dna$zBNEoANhgQ3_5{4nPlu%mSOE!Z-zi{q+wt0hQhX0Y z6u3RvMyNaBrAk43pu zO6Xg$u}s}Cadv5YH6i- z1)^ZPzYzY>w4Xw%Gc+pFTTHZyYsgeUb0$_-#Dc}FrWAR+tgZ~%d<=`eaOq%mRmh92 zd_P~hcHu?s{ncz-J5`o zD{RP*yr1-M`v;P`vHSxc_%WVvUXm_2FKMj9n`nMK`%53~JRqTKoCg%R;yfT-<#|B1 zvnd!|HoK&kZI50zH;T1$Od39*Il~LO0~dM3_sQt=h0$3!CR`e;R%%h0mFd@&=~LKp zu{yC_)9=E0X}_~YufVz9&PDpH;sv6s?CXP;e_inc+K(Vr9^~J=$yy>@iCbtp+kV#B zPHTy9iSaURiO{~EwE_Hm!hXd6AN&EVll<}F{73II_+~_U`9DweBHJ4Ke{B}M>T#P& zujANWHuwLGm#3f?Nsj+p>Gk7N(Q9#Al3rJS-lEqe+@{j&?@4;8#>-RCYwiEV^xAeR zdSOS);;)<=Eqc9sLpr@$PP6#yRpaF;=tVm1W8klqo4djJY|2T32pkka1O`PAfx{w* zzz_uym^F;^?S>P;<^Q3eFgjl&SrY=VL9T7hk&s@JQmQPb-+*63Vd;%VuZH6!>hE8n92q?t&N zU%ABU&q=sV<^TJut^QPvmudZJw@;H6U&!!HPFjy4!#7z$pBo;{hHtVfnPT}SdkxMw z(Kng)k9F)C%e`Y~KO2{_JtpjB=orI#hW*?ZLo*e{v{@TuykP$tioS?E&YutT8Y@uG&|0?emwkka!xx{JPW)33Hw?SSJM}TP#jSo zZTJE4*J?B?$p7$Ji@*ACo629WUu*H#W5&xg{<7Ou6M_+vO z{&#^GN&CJRPq6Rl5>sl8el~~k|55#|0Y&O>Z(4s7>R7(lSJRDsbf08=@Axn3-z~@- zTI_1ufEWCqe@-N#-{?lA&(MSg6O#90*)*M^ zhyy=H3U)hV8AZ6UPXc2O%5os~|#tzg-Mwfcvix zLhA>itTTHfyWu5_g{KGsVNX$h_R`J+ncLXrojh}E{3_`++?Fi%!?2sZgtrG`5o#iq z#gv^qJ|0?EoZgeENL1LrcK&_xcJ>tI!Z3D4XJ14Ma~}5m&I6MvCIqdvxubJkbOx(d zEJV%q`2%?HlT)gnHe39GdaOgiSq?6|MuXk$q-E40WyBI? z#1dtKCA@+q-T+C^IitkBlnbuw$mFF1ByI4=v=U9hXIue|;=OsW&O_M=dI3Q%NV-{) zTm5z(kxtBlbD9Q-LV?axwyiK03I4P59zKV9OAj>AqlQPWTk{hWJ1zQ z`Z1XxPg+rqbuz(;1+8-%nJ4-U5()Zuges1ko~B=?Vaa5HKHUjqjH5sm<$d8R z***7B@%u&YZ>+{WhWPy?g#44AM~>Sw5Ju;v7hinw=o@{1%b2cz<3YTNqgJ{CmQNy@ zkIKie+U5HFPssP1=qhEb-ZfkAnyYus)4Qe`4&AXDd5WvXUxaLWu*y6#Xy4Bl@_HS~ z>*@O}c@5_UQ(nXQgygl@)**RahF59wn*39mP+0W3C9fwm0`(OCeqP(V5`e({(dLB_;2W;|st|6~y)9{&1!)G=PpA#NQd?R!thGag0 zeTsma;=5FiBI#d%fFn4!;^v!Zv&j_Vv@`S*Bv?XxKC~btjz>yy3-c=9RA5jB1WHLo z(v~;&p@hqHDd8r0CN2b0@#gHi$&$T!-eHM?3)6u zh5#ba5{Q(6mO#!|`AQ+@A(0^GQEw>g8KNoG;^vpZ$6W6F9EF*Yg0&^;sWzMRkoze~ z>HHz?0(`*kQIae{0zy225FQm91B2gYr|SbEsEy+S#3wOv z7!WUTzL3n4Q|W_Rn?4|xBYjXsELTMYuOgN^;gMLbNU&T6s7Xf2ltTA*?L@0e{qOILd&x&XNIB zcZ>(XSdG{cg_oJ3KVmh7v|k7pDx1nM&dDS-gdwYuKqLUzq?RGAhlHe3*&q`NEj{#v zOwbx}ipP6OEhCkTp|CE&E+;~P6Xc#iwPxDQ^4kw7_>UHzrPZzzv8!0DfqB4=qJU@i7j?QoE zAobJu6rE3@W%IQ2DU@^|jJJYqfCL#_&cOOrkm5L>(v1tTA>gngh9 zdP+qsfRJx445P?P2@2%c=?lm%RLlFrKI15zTK<06V;m4faL2IIaLn|UzY;3Ie!d&d z)@~>u500=FK+t$`^+EU)qN>@bY6K$elvt$Ck}QZ&J{qH;YxO{Uxd2y z@cUqOOO;qE3`?9BE!hQYTePbRTao2QLq$+&0mLn%Nyb6@@@f4;Ne6z3w?=f3X?Kz>#%DA@W(`7xz<4n-v+Xz)L%X2TdlJs$p$t764Rpb`vPK1OxFY>3SjdH= z=+T1izQ1HP@&p-OLj)&*DAM7vSR;jfWY))Cz{iiPh@EknDbxrzT;`eRn`wF- zb)Q>ypWD`beuA0ozRafh%>T8|+~~9Ki@u>gdnu*Qz6d8nVus$P@M-*30LMd+Zvl^@ z&5{TCJef@X{DSmi=!-vMe*paZTG-;)b|-%X>*{8^Psyt7g$PeeHY2}@iX@u_{;3cs zNDQ7KZ#*nxJt=uvBWVa*b~{#(1s@W>jkDz!XX=RGD1Kung8n2-{NR-~LuGd&njE6G z&Su%52ZG4niQ3U_5Jo$uyCCynA0V36nIJ95QqVJyw<-_!IBmCzA_hQHw9u>FM9kOn zRviKgtkN4T73_eW)7f@%6y&YiMH!$G*n1`KNCCcGGDM}9-7Xno1`d|OKfcxlCrgCJ z8i$Zsw0#>8+qZrvdB;oyh91`7BDZ(p+1PmzY9(ITs#cft&Syz~B9B+_%QY6ikdyti zvz46gFP$GMm^Rm;BF@Y-M~2!RE@->&F^4NYsckM@&S>+}Wx}*( zA%~O)VT_N|H`3^j^IKpEi zeHoFh8LM`M_m>RBv(6ld>`8$A^Qt2;EFpA0Cz0)!VZ3S27x;>CLG@5f?a^$eCc+u? z^_S3*O1VEHVv<*@Yz5U{2br>|7c^SqTJ!u>6M?}1FbFvC5F`wG1qK7apcfd(Mg8zt zD6nEsi+H6sl+UUmmVnak&R+l}x$N9;AeYj9%vYuDSy1v?$vbeiZDw7N1c)<^UT6+* zI(jQ%W@gUw;yqgGLQD6<6&DpjH2#;=`3M!YTONDNTScMZqD9{!snx{S&IDJQg55`A znAY>Pe)bX>8kp|7kxfZ8I0{%D+2gQUARP4;FD!p=SDUbFfEEnb9uzSKM(7H#C%fBM z@($3xh~**tIVwh8A4VZcXN0CwhUbAeg@Y^S1g!H9XrC}#S)Iop+3YIsBO8kbWamQ` z#RQr)z5w4U^bGc9WDCtE$o_>qFWH4KbXYNkB7BDo_O1&f{Ti%9k8s9h@6)a^_FXXR zm=0w@=F;zAkGnhf8eKxj5YT>c{)P%R8yb%thaH9ii5U;`uuPZ(5w5cLi8wOY`Al}8 zx`|J&MUxHHFp;c7EOhl7A<;AUQBd@>DCdCbf^eAp+@Z$=p_AdzCBQ$<06-AR1X{0t z7^oy}9wU7_`GZiPyIcuh0~iJDb_WIU`@32n>CbB056%uY@>i$_F<*){Vcz(nO#2F$ zO|LG9swFUe%AUb_*Tm%Qku6?5GxHeYyg_T}XRtr6--wf_&(a?-V2!8%UrHgB2D<$l zV+KmAT8lh~@e+QHWo9C3o}Ot870?cR7VYo`aqJODDQrxAqDch?g~A-wr~AS$A|zA@ zg~Xvx)4hZAJ31zEa7oE7-O<=Yeu_(d9l>T8=pg0ZnBi9 z|7W&e-q4E7{{KxQ%IEqzZy)Slf$f#Q*_uC71p38vwsQ>{6b)VESOx#k(737PVaJR$ z6^@Ekz2QUj+GwCYrSGq5GtYuMk;%{xik62SOtYcb--OCslg*B=>J8n<&Jtt-iP^SV zgy6+ZSN)otk|TJTJGDGCYE9LZjvA_sXb2MHBo#DN0bGhc_}-S zRYyCobVQzWq3k+z8VoMcX|hA=`P)@OcgZ=0>D%|>Xw|Vc;r+du%0)2XcdGFPyd(C?v28?-Ms8266 z?~C;5Mdtlfefm_oufQ4WJLcdBL(i^I4U8RBi;37Q!u1*#kkc!Q35PEh!=?wyUl0n) zL>ckxusgYvbrj35IfxnTV|K8mDPRvxPl7EKU`r)fvUih|u)vn4fJJ4sWl;ZDqDOvY zgH$FUl}Sj?1OF6A&tSrZ@PTD;f~a* zvIBgw%mPt*re!<*wVB_D<^XGB>eAneBh^C2iTNJpFRwL=SX`K$^`mCcG{mO+0R*k6 z9jO(EO5TAA{2Z%w8?7J`O)r)v#IXud8DZ|nX?e0L-ZqkO0<@w`CcR=LHM$yjOx`#0 zP4dRTlgKg)4h6HOf+U)-Tf*NE!$S-n{DBaoh}fh|R0LGxMGmSOD-2;rKf|d3^6`OL zoL@>;SjPEf;s$S~iksB0SDXlMuOMdv)Y92$I3ShEO zmMZOz_(i-4GXqH$R}(M9j+SkNA@V`g?eF_Dj^R&@Z1q$9M_iPhBrvicqj-~B5aEC{ zcfSmJVb|Z}AK{XAdC4wVbOU$X3Cp73-%{4>gV5xYC~J?Utbc@xyn;KetTTmz=2eh( z5=D7R!Q@_RzR(<<`V&~WSQNPIY7iPTW~>U5Noi^WS{c~MjvHpRSQ+Sf=g@z3eF>uK zIF_|hK&Q2jJ4yziF_I3gdaaAUj`wUL<(Tfm=Z2PJ^(6GUq%s(b1rN1+AFFr8GK5m7 z8ODS%Rv{e%gTrjP3n6=eoWkmcDc5u_h1cxtA^TS@A(46I4)9xH;h`Es-H<@5=L=HO z#CSakzrBm?FoWOBR)gV;5xiauU|3(~0A4S~FHA6tDJ$T{mBN&?zh*GyTbRTXEj}J_OiaQ_lo&>wO7_&nX(BuVB6ss1ZCQcc~ zAw#anU?h@dUCek)fdNBur?I)7?-b*l*3L2T^Hwb;@id15j}{VdVzuS|YlXy$s{|h0 zS17bd`L@tRtgvfH@IVibHfN|J__3QcDeK8kP|skwtLQpQUB8;H(>0cRpGa^b4_oF6 zf(Wl`_AWufcfj3vL2~cQc*pA8?P_Ge6{``=)a%^*vsY0MA%YNeqZFeEsytgHs(KAL zF>jSlZ6vz^M_acY-GfDlH&lHztHaBfgN7Pd(~CTz(P)EMs=?%mmhwQ&dhlz2P|Fk& z)D01E0d!$8-WB>I!Q=v7$Wmv`S^i5)>Z5>SyXZW^*!sQ(Qjn_E01l4(zaKc1d! zN-UI0(YFghaw)i_zNIszq<^;1mGtd4aRYt(qPQ7J-=1Xryn#`7qCAias0oV{DPzNp z%*NO_hRHpR^`E0dtg-$o&Q@FP><2+f+8SfM78=V^K2N4(B=(>tVJ-;<5sd1 zf&PJAX!g%Cs7Nd0?@}@v{qxg%71yiy9mVeqP-e&Ogi|PEl6Vy$%2F$w_ z{A%=P81JY*FG0Ur{TWC>){wDdM7s?!a%oBqTe|`3++@3(cvebAo4kRWcgW`wd!z^| zy?>1m7)0!_)aS^=S31Ku<7T+jx!sx=sQ(&eb z!nofIcwbnQtvsgCJ%w5cLX=;mvD7mJBG+!`GDR+=h(=Yl+OHt1cr#!6Jg0 z6sm!Vbdi|=VT~;T3`>C4fK&jLVJqo8sw`NHx{mI~rpbO43c9AWC8m(UBr&5k4iqF? z2{A8Fl;)%;%E4V|rjHG=8n+W6@Z4D8O=RGszkY;IjJkVh+%)hXV*dpekwmEx0r>j% zX9W0HMXEI2Lep4X@wG?)bY>#**WpM^#rgDLX)J>VNBx+S4kgD(ua)S$bgsVbB0+h(Wepahoj5{qR(_x1FMhvY#zuHqXwWtvI1QV z0aQx}@If#Qu%Pa708v4tme_Q9r(pL=EC`KIzv!QDeahB94X9r?6R7@*4^@8$)qh86 zv`(!L2KX<8DlU*%nAIouORyM$Aj~EUUV)-`dPFc9AHefIvc*rc5fl%JWX_Q&3okJX7xP!hM<22Gu|3iA8XF8{PXPkqvG7%1 ziaS^6#-4Y=pTlJPtCxbZg2`z!%30fj*2aOpQ z(b>Ksfp9Bu#UCXopx@?_dpz)7gAj{R*Go3W#*d9ZNNl?!A2@<}U%rM+?+-Ha?wyXC zXw}V1-~P-1fAp#bY*{@rwL;_TMP5)>X4j1DPQF@XM@_>ZFD6G7E*>`WdVxCDn)B{ih2|m0 zVUdFeZ56y}6!LJtC?ui3DpRKy@QZDEw-|Z7+-+1~AoH}5-N)a5hnk71o-pzja!yHD z55bCdQR@Qv@ytd2@XuP*zqTpZ?%_Wvk~A!N2UIM7PR|Z!iML5IHknj>M1XHqY(to5NVn1be<*dE5B zA4V|ZN4G7Phz?NLxUm9JGKa`7fZn#rw@=br5Dzotg4PAb=uILJ1j@IZSU=zh`JEh| zki&~DP#G4SW{8$csXWk<_~(Q(TKfg%rOA>6(b&Y#0toc&YT$+yzCoT#Ah&_^@;gt1 zEJrV9IoOVIEy&zSqcV>_BO^Ombv&8q((2bwLp1sU>mduwY z^64{-74-g;{8lRDce{(1P0T5Xivc*BQYIp0olL>#n<6r` z`KRY8Z4b#*jK1?kMvOiZBFTQB`u~2>De6a0z9@k3H~wZ+{fLj@|Nnu7t2`=#jrjIM#DJ>;X(W8T!bgiTlF9WQQKamCqq$RN@zvz z^uiIeEfcTJP}KNh6CB?bm{qmnh=iM*+Gcp!wVH@L-OOAf_B6#_gSko}+=@=j4tE$4 zczWE4uTZTI5#sReSsB0$EI~m2iq&sHC#y~@F0yQK&V<1OIMDzjs1tHIKp~z1pJGb? z0)=G!ZW&V=<_=6h3=#uv5kwE7H|#OWX)@TcElW0h+bQ;)Ms@|!-slVAVPoqPkC5iB z`u04af<9RRHZGAkGdhhzFleg<2U;h#X9TT0c`{FIhH%+5%uBO?c) zGH~3Bzk;_IBho1c@Kve+SCd}^pWs=rX6THd{NNY1(tqFXAahK7>8qe6euglnjyaZH z3TO!b=U8?=){ouD;$bs<#F!23xxyEW8ir%I*I8&qws_G0LSVGYdojL5{4Za5EHqve z^MaoPA|5y*VZ%!jFGiWczP#&+3z3qHnoSAzc-a+RurMUUJXYbur5+ejGli)~%{IEk zY_1TP)NG;FF-&sgFrnDR>&{4yl74|UXx$Hmd9VG29QWp5^53T!IInyR#~<(S29Zg0 zPz)K)+bXyM2hbn;1ejnINpvAWQhE1t3J9#x+P=5lAKrZ58rnp|NkqHTU1H@ z2#mh(bciBk+Q0AgXCxSd06xQB>ilB#9i6@^q#XljY#*!+`;pw_=bqjIhl15}Xnu~e z;s`c<{yQ|P{FwQb>pk?HCw$teSbQf5-}iQlgV~;xgW2+n?=SIHKQ)hK&q~7!RS4Qr zJ+!}u_R#tK^Qb-c^Pb~V%He!DoR^3Ni67A>586{e?P&@iwE%~T#pj<~I1EX{&1y`6 ztugZZPiPS}1fQqRaCWCP!za#{7aAWfe}O;y6SEl+jGrWV3zTFt?8jl(0vE!r0DVk| z5^ly?pQlcPSD5@L)HxO~ zbU#EBovHrylLX84jVedkz>n7$=HEhVY9cI^SI z0^2=MN!fwhZUBq0J5|gcCy`-s1coC_jP3k`yRbyWH7UYGhVY+Q4g@fupr6R!_>7%6 zsFOp_WF`szC4GH8LWhAx#k}qvdv;==V0y+N`(KkXaRx6DKh%LcLD4x@TYWA z-VR6nyXD}LAK3Q|Kj z|1S2#P&$*Ex{U`=#NJk_0_`R0zXg?xhPyy-G^w#0-ZphW4vszeuz5D$ir2>A-K;6( zNI0&2EZ>lls@G}E0WTJ`G4>)1zyaE?&-;2`E9;{`D-RM*TO)`o)we5xNrR ze8foyuuFV9o$DfYF~af!Ehi>dB}j+QqNrnYE88prq1OoKNFba)LRF$d*qh}i*qf1q zV)+zm0jJMAd^eU@;+I@~4Bddy*eU>PzvYB4Ns1ObCbQusWU>&FxP<8rI$ z3KzNDT5*Gv+2V%wmR*&R%__X9pGBv-iEA-!S|BAbSso&oIxKiBpW{=pFyq;_2CVOf zY4$;1ffCaNDw4Wl^FU_QJi=~7U=|H+=dw~D#4j~=QhT-hqc7DNf z!G~v4qB&<`H20e$iH6Qeta zaPsEEbmz;w1=!FTEIP<2y7Spn7B#zb#)#edyN{zgu{wq>rS7~>ipP_6XA|$c{UqHv z1e=b!^W`S~9Y~{*I|EEq$nr4Ip2uLOJ{(Wnk!&H%hV8r#eGQ_X-Go3g4JQRfk!s!q zuTd`Y8#q%Tk){mR!7k z9_(JAIvVUeBz#3wnuq`u+h@#ZG{auN$xF0t7m*MC2xJ6I3_+~{d(0^bd)T8^xbX;r zAKA`mU@##FHXTyIvIU7Ae*n4>4oOBLI}N@*qxCDT1ERB>!U`vk8@AKWW|6Dw z5q+6cqGr*U<~Ov%&#(WceSV|iV6T|pBxg3VNX$X64)h?mNU-KBm2l!nnXg=q1mGy0 z(d0>Y)3)~-^A$Q_fN#>m)j@ug_Gi-ekh2tz&9EO~mQrY%_xK1CjC`MA(!a$2hGiEy zQ{4cP+A&C)^vMshTJw_#GN;T>mZg-&mn@gU@+WJZe1IV02=}Hyz4cMrf1(>PfF<&7 z8}cL1N(uzpUTY>&VxfHuCT$XJH{_o=p~A;1fdQT0rbQ$|gytU}ns9hz*Z|BGTwt9W zB`%nCU|vNd9D478@6kjdWio>vr1F60lJG>_0rRW2?Ml7)6fNdy#uO&`UE68_3}mGF z#uJYV$@`J!8`KyvC%{*sj-kTtkW+q(R+mwc{>_<#*FJNg0hXLOq*8$RpUfA2sDtdd zLNIp<%f}p)bRhq>kID2eTR@Fbxpo<2jB z3xsKH7#R|wN(l7b=+I~7{OqM5IXJS7d*q5cg0^%+* z^V^k1oRw|&wxOBbq~9dwI9x{nOvFv3-%ld#kw{~m`*mnegDzC2Rqoo+tx0q1dt2nZ z&3}sg7StAYI1y4qPB!znZt5K7q<2XSBi`|!Et2M`$xG7pilu-ZOC1VrjF za4=j%Pye>)GpvLEN%&sbu(vwRii?%jeiTS;e<}nYaTXo@Eyf@zLUls+fF7jX%9=!6 z6Kg#SuZz%w*x{6o|GDfxaR7Bbmb0wJn+uB5M8mc6OQ_Lk@}3Xfy0S>>JBvZu0;0r*P1D7=@DGjTAM1fLLvt#~NZr^b4v2*`yPk6<~{ zMPj`&`IwA9SJe<`chSUx;s;3Z#TITe1^8k)Eyc-CvM zSn2m7iMTi>)A1#r}B9Q&dz@d<)* zmphs3K`WOn@oACEnap*cmCKg+W0A{~%=M6!%a*uNl*t+jI55;urk1<72GSh;M8 zzoA?+Rl|lu;ICC?t_IbJ8kMbo<1r*oK^KKD2P>N2siZG{;?ev{<+%tHCO2I4x++W3 zd*ptTUNcv(F-;M&=1~N3g(}O`8gT% z6d8|>O*oO(CeP#I4SnzlMsdj31_tcFYq5q#eAs~{c{TDx}T!EP`gY2DxW*5VFJ zb<=2RAaB)qcsi1`5cipRt0v-sou%RwY%`sVZQJ$)?clx=oq;`fXJlyXowvh~TKG%F zwP_>X9Owp4n;yem{H{%F>9TB7H(kE4DMXhgo0iaJ(Wbd{32vH7muolq=u*4MMVE?A zgFnROs!e<8QnIO+E=8Ljqs#f5?xV}u>}8O~x$=!f0=0D@slK@_fJ;N-mB<#C#N83P zfEFX8_xXrn1HraZ$|o{J9~5agH?3iZT4v7(eJVA(nw}l1cnI6q4Ri!s13h3(tlUC0 z>|eY1X~or!-);CU$L~w{-Gg5gzX$RAHh$m7???D;!0&(X+l1e9_z|y&f0YihewEBb zqMOXab$BLOVLorbvu1nl#k14)yaUe!z|6lN&$J$7J`ds<>z*mk*cG;(y;TmE7tb!L zAOGmtm-bwk_FQCp#;sC}pVKH$&+zO_dA>aDxg_nmH0}9{wC7K!JztsjT$c7cCG8o9 zaZ>OpPkWx4_DmAp-X5ITOL_iG+Ot3Hxgza(dfIbk+H+Ofb9LHtP1^H}wCCEi=b35G zv(lcgNqe51_Bz71yK{Qf3( z5X+m3>m07OgIg4r{4}chO;qebKq^IUcvE3vtS{#MtlH&3xQ82tmBbv^@-Y|TfY%%? z(d3Q~#;V_>+9Gp?6C#Ebn=@!EkYj8Pz^I9=cvA_F!v}A1;5-p_B9s(;MN={A?-;rM z`g&Ba-@wfp&qQ^T=Qwp)={t$=LH;b(T@h&lc~JEUwYEFZRE=Mc(K~;BKgYtH!e{0x z%A-plQu#kXjMx6$-@oy(=V1Y4sXubK>fp=#sDhhVmWIDi<1v=y#NFYobmzj|Bb3FB z8^S%Zea)0ZXW*Aio<(uKF+ESv!Fst8gJ z6E*ug0J7T2{HpH*1{zhUGB;Z^q-QSCMU@6{!uuda%o_$aCB1<_AQ1)(Ti1lZJ`wn8 zR>Sdp0jqYiw-$-k;zP`6#SI5>+(pyTylQu>dT{iw6_;P1Gek{WPc71`4@P?qVwqAl zFcJ3Dqt|&g_!4Iss}CCO?h~XL21J;)i4Iqy1Fq)89vy-`2E~fF*QmG@=tgeXt;DML zzJ>Z&wMVbskD_|@o2#Ae#6K<_&><5-*8yJdC0_WceDro zhX!`B>KBO-vE8Lt@1S4;)vrdYcLea9DCXA#`o_Z#nP4@M%#uv zr$mn9kO_a3)@A0n>Z0m@PnjK2qiSSDR(Y+~l|`?e)NXK3^)Lz%oE6Wr>R~p=U87&d z=6G~R`3&csYWd(DS$qND07h#IAfUa7R4$v`MBxP627d$f1-2}@1^(B>MBpG8dg{>% z74vgx(19RwCWn)tV&c^giXq7rXg}UI1OQ7Cq;`}g`uTLh8!zGmu?{CN4P9D}(*&Wy zXz3ly`4qgDaQxaC>3m96!sCTs8moFr<9-xN%za9W_b>Sh#2qm;Er!GMeF=jYP?VK- zsZ>$e#p<1i=rN^UGv<8#jrG6gWCV>iZiwTr(ez4H|AKQqZT%;%=!6gv@`WaikT39~ zQTN|@u8^*z&wG03hbO}1)k2g_MfnfY(g|-RuGZ8xoWNZ{Hrgifq9i zXp6~iU^Qpn&sMnDB8|Na+jYe-1avs3r1!v&P>O}!Hy*8VIvpXz6~mx)$DOfiH|eK% zCTMEByI49>oL9b$9b1;chME(fZsZTb=(%Wxc2Sq=xEi#`{1aO-9KWV~j(gdqkrh~+ z?+cA8*>x0H^-bO!XiVJU;uFu6RO=0Wn$`xdyr^2s+#UA>`6R-6C^0`&xH=PPR3=D% zxg#qyC9enjg$WFNF=``qPFGyTUoVT5?3!Gy9Su9LZ{o!e!o#C!i(v zi-breWr<-|@*2C-HKkS6!-rR7>aA+KqcO-IxJYC!@28R23a{B4kM?Pfur_&ydO!rP z%VEtL+dcV@NBT1LMMH?m_Bz|%_kLF7jdNJRcf6bM5fbOXkt&9Wa2K)X%eUQrUiXyI z;mkz!P(}RRBYoZB2|V{gOkfr4z$%y$AJ|G)NG#~+>Y)Q0@pNQ{(~-C82e@O`!t*q& zO`0=w;G1}yyg9Q^hn(8lHCc=k#47MlQ zU0yvLJ`3?0(TSPc@V$aD-DLtH%@2fTca9^!m1gTR!#O4fV_KA*>T@ZOWaiqrS4`oMgbSm-Fg8Xsp zekOb50G`Yqu@{JhO2Go~5T_`oz32(zmEE!#*fz=nSbUGA22P}iOUZwR-Mq++14GU-m_KDt(twlIzhS{MB=Z@wackmf82{VchXySQ%LC8pVGP00;)SERkOdu#YZ=c;#b? zVJa@AZ2jlKa{SpP`13BB&9?*fL{=N##IG(Hz~?-QrsUF7*Ru(6oswJl43uXC{{!^fafe>*3}Xi+d}VW>k@r)cBLpTh zd;w+ph2exX35Er-Xb8kJ_JNS_E0Xsjg3rOjzVCf9JZdPuJv zX16=p-5P24&qkehL^{8sDxvCNQ}he2#N4l_i&_9-OmC=U`Bda;kKGW`x{p71Rvdb-%oTRjt{LaAShZ`l zD}01RjJi+RdseS(>N05Wd1xt-slJ}<1<3!{jCy+~UM!AabxUTD?0Mh*l5MF z?MohRIeJ`iu>OaS9%p|<@@SDfIwe_|?;yP+r!FTU(ITR=L89uznOl<-%B+SnW(-SL zk}|1eDKf|cijZmA3=6Zi8)jqZjB<#^d?-$$3N`Ho*0)tD?q2MG7wIMJeGn$|lIYzI zVUm6c8m5_l2IF@A)|}$`GvXPULnJY~swn+Jq^~2^o4+~-p1CvT_Z(Rm4|vMLrI=X)kW(4}+4>xvi`}+4jaD7^FF!L0Zu~T1i;sigqL{-ayOQ z5HSr7sc*$v9&$vs6x5av<~`CE85-`qpuB&@xnTOyYjS2FI^r?!jN?Qj2h3!!&RdZF zSe=dM%QSG5Nd6z#BZQPOeT}Se-4MDQf2%`9_+i%_vjlA4_ z$Azr60KtOcRq+3?_wI2~RqOxw9%jH124_Yg$sor>vx5~yCODddFo-6KqTpC6BoLAU z!QNg9ba0@A`@2JGMkAh9&%3$eEPzp-`g8l=_-&cfdjkWB` z@EVg=xF=~%gs{-H2Gr+B1NA_@Y8hv&8I3+9T^fKkEL$d>qo=K`Sd;Cxo0{!sG*TBN ztF)2Bg4+%~u_R!me&iyICc+rTFa}GX_(G5SLXEYpctZ?h?OwcyRUIC?gx=MYnZt@3 zB^_WFwIjr%*y3C5lF=nn0_)mJ>w~(rD`82H*zy!G5fJsP$p?RoFPV8(=|nJ0Sh&{= zmsdo~&gg=?mK`Cn@{~3037~H>5Ay!4x+}^*Iw*JIMh1kJrsk>s9^^VFE z>l)qKJ23r;Gr>&iw2fl=1$43y=W0DCj4sx=8bBCPh#huje-bG>3#+ZMRM6%K?<0iNz$rRO}EdR*{_RS9t>sjtA$xE_WUQy_I`ec`&!kRa@y2I%qa2y7rk z4qF9)8h+r`Abw!yfFQ;WLSlffOFb8?N(W~0-xcvf#!9>Q3cXu61^&}2MDX*#hOG&< zuB5JAMtl!g4chIcb`X&Uc1tiTQ!0aKl^7TAFp|dJj1Cl##wsEKU_`RpI)K{ylDh%} zroU*IEx0153|d}`m9~9TCu=%al?8X`7t%p+l>rhIbR2YCT!ClRhi)|%lc`?N=6JQT zFjhKB_h?b)w=2~RL$&BZn8KNY4^+l&?x}jY0_}~qH!(yc4R-Ari_#2$k?w4y_b)`K zE^gNER97^3Syo+9?uDPb3QjQ5cp4X=B1!2F?6nLsN@+N~R_WcVmPrxx zngIp*GDSAY*g@8hqcH(TWJ^zh2+Y8cK~e<95Yj=3X#ZSQYgE~gtobUt;ByXUiLn|; zA3*Hta9}HNkR z=lXmO!$)2bfoM5W%1vyZbFGQc8Ebb^!{Ad8#+rBV=4#ewd!KZzfx4s*t1v;b_F-A? z!)y2X@N0mR(opu75a@8An*W6jCgxFZp``K0%O+}!ekh$v9zzg%t+g{m$43`yJZZ4n z4>W&Q&>%{V)bu@8;^F>~r~8GxKq0}>bLY|1{^Q7`iMU-HrnJW(SeZA*{B|4qk7lqo zgOqF7I!hn1FjGs-mdm1~BxLj(IV3bB+6~4h8dx^l$)F7OSZsG7YQ)((ZFBA6%5d?v zTd{15hC$l>+QvmBTkih@VRU{mo48+gq5>l3VN_FhTHYf~!63@ckq^Pf?>`s9Z=UFd zY699_2xi}6oh?}qW1$1*QU(Z*=3wcOBh#^i!IHk&0)Z?)p_qp)R>v)9;0~~K4*rI0 zc^rkvk*Uf~2O>ox_DnufMypAQ%$8okRM(FbcZgRH zJ@izVW^n*>CgH;6fF?gl#+pZwE30!z8t59XKRbRIF7DEVm?^!2@3uO`v@r_wi~_|g zkVkrM!#VEZiHenq5hnea6BnyE~3p7ZzM7I zn$%760byO4ln>BTW+>upkYLcEDVC3~iZ~}G0ro1d&=HYL*8T-n>l7AE z>Rw9352@~@L=aKRU&*&idVHbK0V}fAy>y6BxknyHu@IzWg(qPlm{Q4KDVzX?O15ia zEoH{RFgQJhJ91!u zOK>Xw(bC-frcD%p8>XzyJcc?*n(2C?E-sUOkWU{%TkOs-SP!nyx~pJBWr)r?V~Acz$HA)WqNO5w7f5p+`Pnl=qwD%=MCG>B-ho0K zavhQ6jdeA)`GOJK7vsZidyoQ=LMYN|9Wd&}${{*8d)47puf;j-YCVV%FE`4%SuT0< z3T^S^#SkmN)T=w=jInkjP{cuumeIo~bkFOaw!pd{WUdHyqs;rY3w!WUi-i{`x%JYD zAn}s*Ab%f(6PQ-5IN0i={(T^F9{GXMc6h|x0QF`@y)W2L{oxUhUqL+#j1o#cG`?`L zT|tk@8Xw-mX}7ED3?~ds!hw)tVKt+}W4P##N$-e8CQ4yQ9~h?Vtkdmhq><_(j)7QwY1)DqHafv_qPCWT@jEn9WX;~g{;}~S4ucb z;;Wp2nR*8LQrb+e7wf2r6}+O&)SI57L`XL|SEry(T)Dbl=Hpt0Biv9-R{gR>Zw5V%%QO4D*@Up7aRtH2;8D8KVshgB(tS#2QRxTA_7G z5n?zcb%)bn!ZDj&znOyE~)AtVtqMU1-jZabor`5 zt^@LspIjN(^$Hif*pIZ~kSU?_hy)Ou!A+Etc+~o>d!fGKYVl5;XdRi+J+e3KAoizC z5!Qu02q^y^PhqwAHNJ9#XpvV$3q~~WX?#Z5fk+i**Mrze>EVZ%-XAI5Xn(qJ7RKWL zg!qG`L=0&0Xzg)Cr}HS9}KxF8G_AFV-r?A;KEFX4#2Ba_0u;@d@x z%l!$mGP(FCmW&JH4B$NgGs{Xg#TI0;xOQJ$ zTl$X+7T2?$_0X;(Bd+c>BAF28i+raJT?FYcfFFP|KsQIT5=Qm|dQ3>L7DM#|N-NLm zJchIG2j~-f>LHw8KO;ov>ctQatGc1L(Fv2^b?_0w*iaM?9Qk>mweJbYF3Yy94*T@8*0t1Dx4e6)af z($lf=W2kMHH#4qpYQQZH{jDL&`omXKcC9EKYX4BUwv9i{odY2 ze0|2QubY`7Xa}y+v1wNPY|Ll}W$M)x=hlh$7mpf4UKjrup3n1p>hI=}*nk(9)(GrJlr7}b-? zUI$0@L&CoIxmOW*R%~qS4aR}Ec-ueNNxZH>)ICJJJ@&4G))gwdc3YCGFXbX~Wh?mq z!B8x7PKw15Ajb!{KaZ>#*Z&@6Wo;}UIw=$QSDNA)ap3N1h|ZLjK;!}akp>I+T4JSG zbXRvoRTv9SWx?$9^U5f{kFmTTMqOoF*Xu_w5k$kXgs-Q9n=hq`Di*U1ox9fw z;~_B1p$lF^#fyzH({7mfkx#q9Gw~5`@UEkDk~~Yd*m-iD^Wr)o#CgEt&NftIV~u_d zU5}YebHD)20p&~_9ZnpSj;xH^HOcNli<%VEr1;Q_X<(YcRj4Cv2%m13DJk=K6G9XJe4D z){V%Wjp=+$y)AfRD1Q}HEuphAz>}qEvD0AUnp5M0Lp}Bj5G}&QmjG4k+v4TOIy5qR zW0JCyEDl~|ZH6MxMO`1EU3hiJW9jZ*Ze#{3Go>PUIcU@mB?1SC^Db!Sb$e#S>*`bE zbz7arnr>u=%L)UX)=)ub(0PMmFV~UM8s=Wer%CMttCrFA38LW~x1O6g%vkdVfQjLJ zSe-USwwu~%t2r$x!&DK47&g)o331s?LEc5p+VB)0@m45BL0pd=yJ#v?zw%()K|5oV zY$^$oAru|Z3F6ZEA@z0{)iV@mL}N-_>Mg|ZrLYT8k4i$o%wV__9#TCO^gkE|e zg!M-X;dPWR=m$y0byKmu@tRP%Jjxuh)rLX_)rG_@G(ZIh>L)Ne(ZFV&{?Z4g=avIO zKWf25BDO}cRoiUsU7@#j8`rHuO?I_F#)iI%?=`r-)4DF|%WpWpMUH(!|8FQRw!BY) zu6A9y!PTbK?uE|28P-kDS6&!c)TY44!B3?7*`F&kJ~7z_T0AZajPN?D6P4C^o0<(02Q4 zLZ$*+;Kst);4nlME#B9(flAx|T`9TG2Q*$$8>k9@Tn~Q>IGv;(U;W1h>OcI~^ILk5 z@5a-}MeaI=TF%5PaQWNgqS795)E-+w3t~{@4Lk6D6pjN>pQatzS~pcY6NqO~&28_8 zmgw?@2ioYTAlJ{V_Sg4|xuIV?P><62+Uh5*>t||FL%h4_XoW9kjw) z_55{UOwuONoL_m?b#X}fb*_uCD`TW7h}y!1;~%Rjj!HSv@C%O=i`@FA>Wd%3qdc7MV}mK&`;EuG18eu= zn5qh0RX=dXnpPx+t}|^ho9Q*tGar?0h5FwPq7~ozhMHs2B+92MduJ?=DKu^Qg4B7S z$mCLJaEEy67zvFP(av0upqE{_Ai)+K3WKo?vDJ-?fHp{i6l|66dP78p7dCTbe4ZJa zbb4BH6YI4&Cc1U2UciSKBRMv!@*{t1E%fNB!6b_V-TL~lx^$h(-lI!Pv36Cy1J%ZG zWxYJ^npiD^#}zVak2k03s)gX<&iP(^B`=+=zYV{jHgw1W#_eUS_TVyo85)>QmirE} z)E(lSsk3>Fqz@H}SG`wDb%H6)?66e8pIGaf(892RlR^(?InYI-U7-Fz6yf%}v^g zZ~m~tvlUrsH$}%X1{#uAgYT5O56g04b)lgPUy60OL)>6V({w(@FIyUkF-XHI7&W-4 zsWUCy1~D^O)t5n7*HH&P*U3cp%#^<&;W)HKV1Ejqv2#Ze3kfZC02o0ty%*Tu&}*BnZC zFjo*w5?X47m=y0Y@`c4#@R2xnkTkv^AtIY2BBPl;1;c)xacz1s0Y&YXs^dd?QejJxw^wMGU z4Kj*tvVKxUs+q%ZS4Iw&aKPa%Gq~sL+)*%9@17rxZ^ij%H(#H~fm}bKGbx6)tq$YE z&!I5>eqn9m$5X!$Mxb9DJ4@{-hAVyME!JNm;6DUsYJv9M<6SIHe9N0!oQO?^lztFl zN)oqjkPmGL&`wbHo+RP-`v!KSiqFIl>t$5jERzhKcK2d~d$Ha<+`Tv&9VnQNA_Dye z90HWdlruM6L1D_l#&>neURV@Fk0N#7MsPXXTRT&;HO@u+AZI}@SC`RKXaBW0$UD$k z@GDnm@4?ZHCj;6abe&{2)5yR8n$G51Qq>6B*JOOx9y-!)V0TaYbLg~D2BTpL+lzmL zFp!R|yH4T~T2|LdD7zrED?c_utGu1m9=Quan@%WNltJ>LqNt5njP>}Fen90H=?LTq zqz;TGZ30PjvCP0Olwk(I&?YJ+Z~`O9pyvVng`PG{b%bqic<08qM}%$ zE1Kv^L2eF5Q9OB!ArG7o)8Y8>yZ8YTIwH52uKelUj2by|6$n_|R2(jyArT0@q@Jc1 zWz|5rD#H6RY}R>yT%;VK8HgYl9hXjDhrT_I^r92w`j81t{NRa`c+J#oX~|$@>)}H* zUdf~Th-xEK`r=c@V_DC;#~G-IdR#tv^$7KsNrWMBIG;2xN4fziMaf}zPM*YHH&5D# zMAjzE;w<`u6dgB0qzZ6^w1hjfza|bB_ASH_7f?vOi0yF4(7XFueDxt%4@xl>xx0MR z7##riQ9lOM?~Dg2MLNWRCUxXi)W@b=3^(_x5M3XWE>XuH$cjQPEMx?T0(pX+FZG zWZod-8-RRBy{Yc1G#h*Wg1y5+B?ai5qq#IfkY@9yFrQ!+TyL@&w}0K~>W?J2KC158 zG~{C82O^h&&PxM@Piqbf+H@~WzXMgFj4O3foHG&JZ5v8fZ=$%t6b~A;XPN(A`1dDX zoEISnwb)7Pf=f8=OuSpr*&wMTlE!v6X@pS;a#B?kbaPi}uJdGS1f96siz7EZEjWjh z=0zDF-|e0k)#??G+zC0vpcEpcIppp%S#zgwzTN~nr@N}6IIxc(Wim*?Oa>)g{w74c zx?d4Pl=@NX23HpPDo~4BlQp*X`Ix}{6((!ihY|>DG_LE>fTR&Aa|@eh&)#$!Rzuhe zxbZ`D8OV!|Cv-w)+$1E(Ux*#n^Sq%Ym|{?Ay<_Ca9f&1%TQ3`HXd+Rt}q`72D8g8-PMFA>E7V+1CcH!x+(k=uy8CT|w8 z;xnw5K}8?M{KUlJVhbN?ON8UFktxU-z~aA7 z2%8nD$-=v!Fm%P$fj{`K4vZ-3K{2H${B24^b&)a)&AT%BQvEQk^lE(O7Q<&AG?8~$ zwqdu3lW%P1k|%8gPPwWXvF0rP zJ+*g3ft5`Fnc%(I41fefeEx?ZINp5|F0h?NS>=&tSA~FTSAczp&mk#AD;UuL*`< zUqT6ruafqIEQbR|n{I>3C^353xWkN#T0PPP)D0;*8oCaR#6yqOHLN3B`UkunxD(mmiU=mmdz>Ay`BB2s}{1rZkh(hs`_Zc1gcQQI+6i$X8Y&`(e>HCFnT=e$pouBH73Z3{#^+~!^!5a__bO<3~ z7y)6s7ZE-kY}q1`Nm)Rh=<5P~&I`)J$(86t3)apBmxXQU&Ql+tzhFr2MO!7sv;h() z?ZG=gC|mxjc!)IR8`N;I<}Nml(R^I(aR*r|fqLu^=^+aAY7rB-iJfH2o@)~2M`lHE zO%KP!-O0xFuOcO~H9oS5UK%Xzq#1^@zg-|4{EGG4MOCAc#_7@h)`a0w&CPU5;P8g} zZfMOP*^EJ=!<11VMiLh%HZ^vGkK5asI$h)Bjn0Blt~jU;r#K4-&L=)@AXkTT#bzkM zdNO*7wZz526tg^z2$QsIa9A+*-+-t(#JJtw;|<6Eug2}raA?zqDHs2!x?q0lX-C(^ z;^F90RW5^0 zEf?5)P>O>RRO#=+vH#QJC)kW(U~*j-*`lP=(std(IcZpradIvTl)^96~C;=|+Hj6qF&fUBu@O8y% zxH};kU(Ku_P$$NhFW`^5HNKl3Djvf~bK(#q1E!2a+&Gd>4>G z3hi!eGgV*K;Qk`&Prw9uA)ymja!{eDUPUV&ewmVl+0aoOG{3zOMI#^5kC)zsue?&v zVhqQ-i#~bIYf_+`E$)q*rMDidGO)l`D7kl{_2}BkaZO@}qFfKOE8vd^xOV+UKUAMX z;v-Hq*pLb0JkAhX5<1%}k(+gRCGG~nJDVjiI5WDO3|NZcFB;Rl#5u#xhCzoxwm}IY1HGo(eZS6a z_TomWMF@tE`xe%9ifB>A_$Mh9hG5F3UwU@GaI#lh9KWE>WW!Z%0s0pvrv;N@t+QouA3!R;G8-M&FPOhv_koj>aE2p7N~6q{*K^laHuxJ4Rt z9VSeunpWW(g?i&o``7r~+b&YF)_LqFpu&3yNpWe!y@uIiX62s^jWl%OLUBsSE_ncw z?;SFECMF&KJn{D z@9?l=9>ZXKuYSI+x`pgEiJy4CMOO$rSct=U)*brqra%3ZO&;E2&x^4jkrPQ{SC`Y( zNHYR&tk)#hKo?m7g|njOeYv-HjrNeMLr&O@v-DRuji#EH#N-}C8(DLTANC4b9=hdt zKi7)xUbRp4C0HZTI27y55Ydd3=7|(5b#Ge)0yphhlDF`G^`{ zPNKOluak&>TTLf_eb;W5(_nhCtXkYdX^vdnRH(c(PX)u^2NpNg`9h&y2%W!J9d;a3 z6B_D~0`{L>mvrSfb{&IAkk`kx)(x0CO}HfPWjBfGVZt4d{W$HzQ4Sw+{xu}UA=cFC zh{H0(zphV>83XA5(fMJz221X5oFC?L7`w5a`3R=-!xI2El;Q7LxCXesGr|9Men`l1 z&eRvzcP6DeKcrZ{eSYXmKN%6m!o|Wx!$rUu;B;_3pathnr*Q7{e|Ub#YC@(0=fW+6 zbHbs^|9^ab*cOCbl=H(4c>SI8LkYB?9VqgKZoEg~#Rlg;_xq3YLyGyocYerl`tkIg zvi-O7Lm%$Pk;SucFT%YJ_YT~LaC_jsf!vB{I%OZeH_uYGScC6OP5 zoj-!H@X5-=5Z`6P2zD1{kpC`BaQis_67#AXt3zr7bd9t1sGv z>X9Qq1*gB6{F~%)^iX`7aQ9=8e@&Jn4{Ua6HNk#!XEmRRq?M&3D7L zGR|Y9e;y)+Pz$Lo$==s2%vJ>7U0_&6T?pzvnF-m$VI%qjV4y=6O^Qp7sJ!7ynfWph z!F=S~LZm!wjv3%^#fETGtqgbNmPP1E2Pi-2w%ygFoD49fJn6-E$(NR&258Lj;jU>0 zeM@o_oo0B=0Cb+@2n4{3Y8e`Ut~{JEX&{{` zJ_-O&HBK@mJMKWmDyQLFa852Z$Jx2!SO@kBVz(BjOE?D>mQzeuYHWnX^|3Cc`d2!5 zB_fUM7l8-#&fMw5hCf@{v|VYiJA7y09)n^5X9ESp2G#D0DD_b|H1}e)UwTh9{wr9# zoFmObuXGd-mhNK*9=Ku7#8FhM+17B%HK$@8wEAH0W};&6rqO5bW&j%7H8EZmZubd~ zNT?AZT@z9*%s}=oLp+8hveyT) z54j?HFd$Z@QBZ*$sZS3LdW^~eGCK~&sXvVIa81&lZ~BU`8?Qp+w<#KI z(LP1ChQ{xMv|W8Y>Cw-Aw>1;wJ$NYR-q`(SN%sJa17giV(rbYLYSaH)`U4*!b4=zctwP$B_URAI=tD0}$E#BB z?EY@`8M-=(O$3R{P4230cU1>dYcE7U$MQ-w5v_D&Y@_>IZi?4g_(8=%Or}urEoEj9 zwXBmljWvxlf!Ga%5{klAdgDVRr-to5oVG&&Bn~%VptyGfUZL<_KhSwGR2U%JJDRz0 zTbPNt}3Dt#n~#4MTuV+9&}x3#4*43djD zJ1j|=%Ioo|GV(LlZU6~MFko>HbQqIx!FPsq+X;VrNVnn@N{q>has=+Dds{pi7jnqH zAYJB;SEQZD1gI~dM7WyZeK`>MS(3DrA4hwVBE?v;ITf$7@g(tZCPH`dRWy?HF~VE8 zXpkW_;nkh!g(0vGwl88^-)QWWaHlLAR=09s_Yz`D?7Sp?Aav@R?Xt-m<}8qLe0_!% z#vPm!EB{`>-1)Ih&?f~yi`5-RDH*b}Sc`9vjckr#b;rY`RJTpw-9m>q5;hKLB_O+M9h4^yP!@K)&ta#zgPLXJ zekR?s?p=Ee{|DCf_#tBW87#+Lts^rc z$XXdK^jmFwX!QYvqdqz{oqHf14(r-#;q}Z@?+x8*;zQWGNg57GwRjXuoAp~^m^6}6 zK<5Y22)tsTh%N1Z00ppAFAL~=ry!WzHt#^vO``VFLmc`M5z*uzC6)RN*}rl$IrnKWFfsWJysGSm78C(n4p?S<(}IsQG`;1q}2# zyFrhEFu(~~EFSc9@jQ&`U1GDDzdPfWc0A51e$z5Q6eb+p(%zJcPRk?@cTmlu<+6*$ zAPuVPlro}qm>pv%EW0R{0>Bouu@GYowJ&6Bn+XS1Yb>mFLWU8%iDbacfCv7`3Ipb4 zO4I&VBw#ka9>+`4!YDz%X#=9V?NK<(Vxt_EJ{28ry)Bcj^GC)a9d6n~jbRByAfAcn z4Xy@lY>zY&b%X+l7u>>$92nsn*}-bE&*~DL-_aFioZQ_Y3vK8-L<~f|eyl)AL}nrc z9f?XyoV%ysQ`L2RMO2CEf{EQHn=z+jnt1~KQ9SAZ2McMw1Hvmz*q!ZV@U1;=tjWeR z;qZ>Kw;=D2;(1p?{FF(#Z_~jR2@+9(5;8+oTbqrwBdBNFT%&Y2*5)AU+r{DRH%XAr zzxJw|VK+YHMP)gwe!}tAhj{a3{7iB(W6hfYjN6lC9C%uH8~;dE>a1gjzBcbqB&ja8 z`SE#fn{)oP#?!i2JyLR^oPLPyL^Y5JA6z@Yt*^ zD}G5%b|!Jc=ge{kjE45;${VpJwFLK|;2@pL+)PyypWXXB~Fb&n&QP_P|{m!Y)}lx(NhQ5^=cF zNBC=BkLeu435~Mk<3O(`S&VBGi|y*}6`<@%??k9Psspv|>i+dg&oj)kM=-LU7>Lez zmK$Hh1PVP?NyiU$N#VR9omsKip~E!Vv|}*)*Wvi8X@{BKa{@Jv=JOSR)z4-s5~~p= zrAL>-s*m~9V?UFPyGT@pO0Qs}gN(r^H0-2vo4T6dGbpId+FX92-hQsRmLLnHZR4|Y zJoC;Qw}%?HH&`22#^AuxJ@^DNt@E!=nNmMRhN+-Ki|@j5P3;*> z6Y@A}A0=yA%Yil&~ezZz#<5SFtZZ>rzxY_!zXF-*f<-Ff9hT-^_>9OOs0*V%6Iw)v3()lQsq zx+am@2u#Wr|0+cxHwTPC!-M*Ya-=r{JqHJDQ;L>h-cvraP6z({z4-JtdQDL-ymRC) zao?F@@|i`Mibv5zdT!2yr~KvSxp-`%cQ7tj$%p7JBR^;p`NAU@w*JJUe%6tmm>mck zF`%@2{S;dZLk_OSJ&>Ix9)r=Ch^}VTD*JY-FaT{VlzKrcv%k+ zX1o5S<-?T-2)!Aa6&NC>yI_w=(WK`GQ&MA1J&^iz>wi*`ES=@dZVhpBVjb&2H_1^;Z29HsgkTW zp=N%`;5>~^?X^bT>j zH%5$^PciAQ7`Jm2>wZr{K7`W?hwHLNxQZ;W8f!jBX|kkmNpRG@7w<3`c}$2%%IM)? zfJAB`f1Jj@1YUrO(XA)$E)1%w-8$hKF?%k2aM>GQ$`GcB+4Eb{=C7yPnRfyH!gyTu z#f-Y?Zv1H*t$VA+cy!a~!fT&|&0KJXx`FdTl9 z2l1KP!MbPkEeA)jcV#gKgw1|rJEI#z4I@SGj-fc->vD3k6h;JL7g(6FhBQ@M zf+?IB-K46BHMFv0#h0E(2yDaHBQ{YeF)1-H62=S#1x%tVh}yqFS~mY4VMr`}+=(Rz zTP%t$+GG21Cl-Y}5pm)9l=WL<&9l^UxL&QhM&VGZ!vKRr+2gjKAWp;!mXBFrNq`+? z<|8gVl~i?tF9h>*Ldk*n6CYj_Is=7eLBvEURUyLG(ot&{e`}{bT*upzs-lfGZzE%? z5WV(VrD*CTxTa7`N=d}r>{T&0zK-qD-LBC5S*Swu3HQP_M)Tl4nqlD;g%FYZxBNR` z1BFv6(m?RDpeH9s(B5|YIF1fj#NACK+oWEIBS(+nR_p$9o%KKkseT{;*GEDXB}Y2Z z0{=Q53N!e+slr|JLp^CaEN?LT4hfvkPYdA}dCMzx@c*mIA57~?G86wt#h;`+AOo_I zcoAmO4rn{w@t)fzH?|KCJBx2Ai(k3Rbd5g@Z#@~dANOJPeX()D6`xE#hZ~Wnhqtze z9l(j5sBiop@2x+C9bD|r)VmRx&2#8p2Aq$Y62Q-8qhV&+&=y17Svq%?e#Pt@+@}-I zd#XCNY{}Xpm4T`(sTlvvP@ojV;05?+lci!L-?$S-SaEm_OM=o#Eby=*DBEEI-Xv^K zIJ`J1OD~L}Yx<242)k2Yq*?4}{K?dK(iC= zfC`~Bp*y@@d>x@@QK35}R8f3%ow*yVGS2Ni_7|ZNf%Ex>1+bsxo+ptQ0+t%=C&13b z2o@~z!dC@ z`}}aQu$OPCG&nCOtsPLTZI6Nfgc!p%Od$h`gWJ;p8h1944*IoNECyknFxGw!Po|nz z43)*BRGRtTm+7Me*uZ$72Riq>j>=$QT=Ry4O5wJhm*e^^K+b+Q;ZM0 zfy#N=zGkrV@)G024>G90_((ZkibLA>V#b+O9M;}|Cs8>NIE@cyqhf> zMcmyU0~om{Me0$4HD=@XCg>MzAgxoVtt{{k@+nzwZ-NnK($e9t#q@r41-i=xu;or~ zyllTv7X?dc_HNXa_g!CA+$%P>@1|DAG6nSRc_*OVbU7XqNd}8|{>lu8|CbD-S%&8R z83IXN6lM1ws>oOq%F1-3v4-v?w10tY73|2>U!t85>ir#SLZ=?*0u>+tvxC!i8A$lUvngu@99(8WFO zea-&{MA(9G-bh!~A?ynKc{4IH^kMd+i{1B!xE(=-?&MI>eg-p?857jK*Jw=J;liUe zrtxrpf*Tm4F-?YZ!xh2(2=^7-W;ix4N25f{SfRLgC(}h@no1*^3v2h~G}}*o+HC(f z+-bP);Uu_rxF6uWaA)9tg!}1ov;F7EzV%i-#D_Ge1l{P>;UBtKhC+Oh@LC*g4TE%4 zh%9uC$f#(8Kk!>$V2Hze z()jLfd<(Cmu{~;OgDC?lE5D9|QD>N0=$?1!zI_?)s!q>48pDqtp1~^A*bBkU zIpeP8uA^vN*e`q#8(uVMVRh9dd2%@xh*N1wz!dCg9F9(Vl%~*~fUoCOMIe?$lMr!xn^*G?hZ2sg&+L z3&vPyE0ndp+#j08YU@(8xGd$&kJ52|1wX`xoI0LV@-HCru`Bw3Cf>Ou7*##rdjwr_ zhYsh35;475*$JJnp-S7Aa;W>@UK%QxeTTwWL-S#A5DUwuFbXi%oPaM~M__l|1bjXR zwO32FKC-are0zedh&zd0(@W_XVkjfDn5>t@rYhVW%T!{r-BQZ;3?+n=P?@27bHltx zrLsNnObiynq=k4>F8M-6qX+?|F4oN6^r|$dWiz>;^pQ`VHUXDaps@uxVGrXGyS}-m zv+J9g&_o|54empwh(P zz28WGwHoGMaVBoBxTjVlo)qa*KABDQottb${SBW^%7k_o>23t!jC;To<7>KD?|E$h zT>In=$@L-RnP%Lqi>){(HbO59G6kRgfGk)K_}6Ic*KygQE1}`s8(qg>h`JYM1+_y8l%4Wsb5*Qg!LCre6Ps!-6MC8++Y1YwRPbnd95cx?ltEd_(gyecV0 zCzzA8Lb!5o(;d=IhCmr>3Qn-6#csgNfPv7Vg?V(C-=3yz_TY0o^!)&Q59|W_02DqK zasdjV#&-uA-)zL8m8-F5cBXubB%Nn%53UIN)*iaXg3}Jy@(V$7h9vC8?dBjHYT>I# zgm~?<)pmVQ1I-Vkb zakSHZLPK9PIl~Zy1HqjR;RiC3#^X@oga-563C_6^ABH*s%|8t{iE~1Oe4MN58<@0p z6?_9bBHzhEjH}=~RC(2DjFK=^SYeC(H0SgVDwOS~y?WXH9r1PFU^=B{s<@_5%=jj( zrO-V{%xH7Z3=(1Yb!JGRJ1x|EO<~u!*Wd=bjzhCzk*IFrobp=Si*~P3^!`}?Fl2pD z_6{We`&{1KqznVU1a^Gwh7S(?1LrqKG1Qs2iDUr!Lbsk`B!ioWf74tjCTm@717NZE zdJm?u>WMDS>AB5SZtzrH*s^7doY4u5N@Xeniv+dReMl}S)_vI4sox1O+fMi|IM1!t z)z5%y9EIMy(f4TZTew)ROQv?RwKQU9dbDNK|#Of4G^M(b~BFTXu(N1z5)4M zPx%a=ns}5yht1bCFmX8H+M|;u;|TiF<_bX~I{q|G&pr^9-=Phk+~`*KNRS*Rggt9=}oAt9|5&$B4YY^_5rr1dQ2n z5%&bc8tRAhBg2mK!_%hDMuF!;HA5-zOwu~pqjTU~Xy7#A3rNSB_<=0f@}RC`R}_8_ z!~X>EQ}JQA|B8vxr{DzLqSV+Z)L9fHqp*Mxi|umPS$6Z&faei!vbdMDI!GjdPy_ba z$6J4BJsO5DMs%GQJ8(NR3NfIj(sf$fT0Y2%cq{eg1FVR)PU*>oj*0y`}iU1w!d;yswq49zbnlS7YJh#tk%d5_Qo zU$3e@jo#oC_AFX_7nH)pDLv@Sw?l^fbK(j9dg$4G53vEfBH?ucULo-M-23N6ixrBe z^deo8XUeb2qlX^ys4-aG{WYsRG3#ea=^jiNO_*~srAh2{N7Psfw=UX;<%UKb|I zJJQMLTKK5bgNfDq(&P2l^$IGyo(sHwA9y_xcx?^5HV0lm2)u3!ylx4+{w47GNZ_@G zz3wO@GFLv_M<&s~7rWyf-4w7W5a26@Qhp_^WgenfuZ+UN$0*_H6n@QbgzJ5IQ}|`n z1sd*ue*aSg|5F41|JT6V4h{DLTuF|GtAYD7+)Hrp!0mzi9PSj{CAg6J8g4M$wQ%up zcfieoD}q}Aw+?PS+_P}6!o3f-7w${AQ*ije4i^O%50?&?4Oa-q!_~lTfE#_6hHJp{ zFx)A)b8sOGG~6(_c)00s`EU=w{R!@MxE*kZ;3T*Zq`wO8cDU(q^Wlo&D&gwj{si|t z+#7H^;pjI3Wg80@1*eCj-yGjF_bP0^B01B>WX{wE*DwWk!cyQ0I8%oi-}Q!R4{{yj z;g<;8VQ>U*90G$~ga0$#M*7_3@8F|+iNEpv*5bJ~>c-T$mq!e=m0i!74#8zw6goD> zDs)hqz^`NStv5ZopxzQbIpBx4$6IaOZJa3=PF;?Tw}5syf2RI)w%ZXGPMx1=9Q@$Q zl2AUBbt7E=vTwjXb=w5citskL_@@y51ZaI4et17L6MnP)lMZe%>Ln92!m0CYxEEni zNRFS4JmJ*gnM;vw4%!Az9adHhdf?*cA}yS{{M()Z?q?B}4Lae};qhBx_YQ8ue1yZP z@ta(HnF?O6f=g6zsS4)i ze(?0;ae?}{Ulm@if-6)ouYv^?yg~)9RKcrMuuBE6R>2Rb;0IN3r3$W6!E06UIu*P| z1+#ur*VN#9+H4blE?Uqwda}P?wGDdrD_hDz^R^}EPrE-Gw{d8qL{^2s0W+A#IRduOKu z-wXv`-JZAI7y7|zAEvYo%|dvF65g}cP%*V1eC_b7XUEM#coVmAU&swx*G!$*aCHIT zIZFH*HGL|$ZO~uuToZoC{7eYaYd7z>Bf4?veeblI|MmdV?|x=x?)9qrcx?F<_2GQ_ z{M_8H5B8-uY9(xKfH1D=AQm=?v^=2^7`S+Jv%m`KWu5t_UMZP z^ln@zKEJcrDWOQ5GIc|4c+ zkTc}I0R1-MRe9?J0oXbGRMlh89WuLLLwf`#-{5@ep~nv1-fDj48lrc{8-==h>(X)*pak={I?|M)4mC1NC9M z^|}w@zDN1rQOa+*Pk-*OqXO}B?=F0?Vsrp*n{>M7)wF}=>Qd-hTOvy~O}o18{Fj09 zrxZSx**>Jz?0!|LkL$j@_m7{x4|u6UFIQ*EuX-X7UlTdzvF`N&IM@2xwy)41Ua3ZX zef1XKcI?F1js55eQpKOrI5hQd2?2UiRj^hS|3ccc`#(O?YJPVC>TAy52isNg(^N30 zN}s2qZ{E1f2V5BcTaKfA+Izbn&fYw0@;wL5uTMw)B#zqjhzj1If*)1Ee^SAZso=*| z@DnQd&noyy75tP6ep&_pMFl^jf;aup9$sTb|6h*st-7Y^1r@wm1;3<%Usl0eRj}>M zRd&lG0sJ?9f7{%`<*nuqpzPBvJhXuO7e>sADbRUTKl?4bFPIh-wF+~b?mRN={!&vibuA`m`B1>00` ziV99u!FClqOO;=y3f`LbPt#p11NpzAf^AXBnuq#@C#&EoD%e?a^2oSV0emT{@HSO_ zRIB2*ZMgnLQ@`{lRq%Hz*s>%3sww^Ak5Iw6Z`7ts{lYiCRFyS;e_;GJe0=SXTN?uK z5>OCKa69w4}c3=|K567Mq`X z|D#s(x(3YWOUv(X8(~~~67#noKBFFIuYvJ>rT%=!Ah_S-W?{p)~v zSEHVbJE@IYrh-dV@W!DF_#^xw^Y&gPeM1)?H}}zl=2t$$d{FezznsBo&t13mp!v@R z&e@VRbDgdCjv*&*J!F3NGUA7(e3Gn!<3D~Y)IPP<{PHI7Q`*;hZc)LO<=)njD9>|G zD(SgBcNL9&E|6c_qW0TY)&}y+Es8N7t2=0Zb|&HnPg#`v@(-y+p9J8I?Q`cA96w=bP_b(;wat z`|gcnv7di=t3v;yD%jL5-Mr=PL*|$NsDy9&Z0w4wjvX?;pG5neAMf30S^7)V;Q)Ny zW4F8$-Vf$%tJ1IT2j~70HDv6gs1Mq2p*|a~IyT_Vwm|u8+3z{-{WJ2bQu5pAKC`NS zc-aFB-rt4&>$8nYdAQvtI(uITl&|eiziQ-u@WzZSd-|u}cV7GdTNbe!uSKkeA(Qzh^xkA0}jZ_WWDwta^7glWf(`$m0smFv=9uCJaJkmuB@ z;2IVDkP5C=;ajJIT`D;K^`CFKdp7pJuTuN&eC)}ht=XT49xy{D40+PaWv0L0x1`F@ zYJTEvz$f?-+b$T>-yYLy-r0rr+V#lKhu+ye|NAuTZ(pbSOTJ-&`SyYvA3SV+A2)2f zh1UnK8uR+$Xa3%5{-X~3=3{StwD0IS{qFIH&F``O!s~;-&uTpoa(e)NKo$Q%6BSZ6>&>wRZdPb?>(JFY;Yk$t)mUr0v=1ZuL*rVHDP{G%$;-{{9C3NLp zl+U1)&#r0DE)`s(f@@XqLn`=>D!5Js*Q;Pr1+Q1Z9u@qs z3VuWdZ&1PI53M=-4%+vRVM_h{NfrLM3g(`FfAvq>Tg?ycRQm6qRpC#m;Kx+((<=Dm zySl0u&OB`Xum%19y3^jjsKTF7!OyDT=Tz|XD)_G|c#{f#Q3Y>N!LO^}zp3CiRq)Fy zc&iG&?~S)&Zfb8eZ~Ykcx4FFJ6;=4FD)==OEST;I>7V|=vL5?8F{nS9KTv;_D!57o zuTjC$C*Iur6Xa_jdKCPdRN>l5pAQ&WfcP;={P$J(R_^{e?#a2J?-M2c zN2>6hDtMO)ZcxFsX}^s5HRQ1Q?FR_oEq~6vesoMu`$6-TFUK6$HFDgC-Rp*llMkEU zC3!%?RWLoJsCQi0fpa$e2u^>GGtGhX!}PQ?E3g4i6P!QY3ZMTycor(}4Qn)+$w=aq z<*CWjDl*GUmlRY~l$NIzz zrT7rYWlftowI9f(&dNxhHZ$Ne=l1wp6T?Gqv&NIH$io{uWk00&?`lSuQN& zm-0pB1$p_Xp(XdJC^_j7BNqK2SX(4aPURps-l@b?cnd9rAGnU>{o>#t_`fn&YrQh35{dPoXC`Jwy zY67}2chgNbaTEQeEXhOf7E10bDP37|2c-`DXk4r_YD^EoO)cPOhM!*ryRy@CeyJh6; znaMLb?v|0$W~L!qdZw~x7V}S^uzdN1iV7|tzp<7K{4Dgc8b2=M=KP!S;4*RDBN;BW zU`fI9dkV^l`kAFG`rc>myuV# zqzKQnf_usZU!6|RD`Bt5hwyX2OE@{;B0O*afr_$9)~y_!pY$kJ_tZKq9I4*g}gxm zC;>sB3*>=H5DS_?I!ZtV@%=2pk6lfdpAw-4==baYq&AC>Q`*joC&kwwLeYPTpXrMi zj(8jXOT024-Uofp3%=(=zUQO9=d-@&%f9E^zUN22=U(6Qi0}E0@7a#0pWZ0wAoeep z|DDPQv{Fi%$0&MSX!Q0T7hw?0i3nE0uw|=0bjm!3H)|y`p;&s z2d%8Y~s7xTL_mjBWqe}T6yX6EF>(sm&3Z|3;abhOW?}{KDFQ;3_BK@ z%yD;6Uc|;E=jVfYK~B3hGcd>drfpzaXUuv(e2#bNFTRN>(B&_p~M*97pmptd`tg**oRO zar;@VlrCSMR|0BE3X(Z|Tc?1}E-0@6H^6bD3CbwV7nT*IBg!&F;4b-UvK(vKT($^L z%jdW)L35W?WFcwZGR#yj5TszweU)4?K(2 z)!tmAW=28YivNhtRdIH3I@E~NfFJnt_m%MlM%|nO1>B*TRxu?nKL?}~Wb)-)RL~r- zDrrlXf%4^42TEP0lwujjs!iq2;`0?xj*BFiBF|l2R={N{p?Tob%BGbRmL}s49WYRM zCNT`O`d!1NEGw<>wGj7w&|DuA16Elfm+R`+W`56D!mP9{VVen_0ImBr>xuRNU!(Nm zie&EZzY~(f9S-t$y1Au&J&_9`{QrrF)Bm=A4##~P#Hx%{)ZfsiC>*hO1^HOF$_t2h z;<#=7{il`m`HNI5^Gb?XFU_~FT7tD7?GId3MgLG*gqndGgnL_oQ%dt$196p%Z8mT%ML0g`Qie{=`3jy6@H9jsKYAjsvIOLnq`YrKxhz8v59Oga6z+Gq6F^s%lFkNN zJK!j68|buP9o|Z7FU1`afm?Z=L5;qc_piw@a92kIoA9O`2m>cV+9%8Gih-Gg|!pb>RZhPp7J zE=+#`K9qkO%HM(bZHT`C;WmV|A;01v@8}5I#_a*RA6xshZ8V~_>xD*80;Sxl|zUMxYOdts%2{|Al7y=nWmXO38 z5)d_9g4|#b4^|^`L_|46%_2fnKtvP}6&68JqvC<0qKk_1|5o?(bkAglWBu*te@%xk z)lUu^#yY z4Y)S}4MxPFyqJ(Ti#(t=*t<+>A;aS%k?s!A8-sZ0o3Ou_U=K0DUSTroA%s1KeCrUO z$^r4QKbm0AGX}Q^LmccECfE~9uY}s{Xv3`q z(&0yODhV_xeP9F9lSG^vQg0w50PIUA*n>?P5FdNA$^I1JVbH-`%h(b50Vc>@#;qv# zO`yZUA3W89r*xFL0c9?I9&t7z40)Y`EIcJZDR3v~P#2RWBSr@4mLgnxAz_<>(* z*q>g26(|Je1M7f2z-NGA9QOGG5-=Dj1ge22fmeVdz>h$iLIb%ONCHL!Q-H<5bHFa( z6X4&#^?yfu1cm^Gz%*bvun~A0Xao#+wYL*+3y=bg1?~eL2G#?+fMdYVz%@l^uYeQC z2F3$3faSmoz#iZe;8&pI1OpL)kw7)D0@wjG0x>wXpeK+3j05HXb-OUCJb?NG)&h+{*Ex^}umv~=#LmUb*uWa#2yn$b1Gx#v0;+&jz#iZnV44rz0!o2L zfnC5iK&u7NUmyX<2bKaa0SAEZfmRE_Col?_4;%p6EP^b6M}cEN*Tv9FU?T7+@F~!C z33vh0fO6m=;2>}cX!Ri4Jdg@32DSj716S6d-hi3F4xr^yv?*X2a1glaA-ul>Oaf*C zwZLn@A>c=##WDlw4S0atfxCdY0R8OQW#n=aLzFO;wByvOX5g8@sb2GfDD8QP9n)<5J@3}Nh(Rh zD=tGw2FWB@B%2H+!$=OfjSMHZlM!SjxdR=*D3V7;lQATp_{dmNfG(#HLz?lVh)f{G zq=b}`J4qQSCl#cU+(jmmDl&;oCU=u5n1S3&?jzM?Dw#&6lNn?txu47;v&jQw4w*~l zk@;i+Sx6R<#bgP2kkpW+{){$q)b7Vc)KsI6y@H}RuFOV0>OE}i~pJWSpnQSGm;Mkn)q=CFjUL&uQ9b_lj zMcyF0$(xu(zD4$ux5+zXAK6b1kax*J@*a7gd_WG7!{lG&2>Fm4CCA7|@+~<@z9Zk0Q{)HoBl(G(CO?y3FmE|Se#MOQcXF2eLH@+I zeCWHtml-ZM#2A_xnj5Y#v@l$0XlZC=Xl=O4aJ2!8mWDQlwuW|w_J$6IYYo>KIvNHH zh-Vpj!0dK2@dJFmA}m&VJVRm=Jh5>@8INZ;X%dj5`Nfw^D8)oAKLOK#F%=$964Ir| zrpIO{4aiXal65rVv5?E&8pHGuG!E7M7ydtj{nT2CAI8?`}H^(b4 zu7^(+9I8*2H=)#579o)?OrPX@`RKxQNmNlOB?=>x;0VD2Nhm5REG_qi=P@WypJVYD z%!=`pBSNy^U|mA2r^;&w;nM|&>XHq_N^kfiT8J)sQn9ZLkAuRe2ny6C8eD=k_V7t` zLAnI#zOurS{K7G6nlOS7jS?*S;7~o~vXZ~c4T9EaQ~z=$M_oV$bV+3+I1epE7d?}% zy%mH{pbyg}$?{dv2ZZ6%1O>{8Sj`w@t7TC9Lfd?xh-z@4i8o28w%m{at@VWl_*+=0 zx4#vIc&m*h)LU&Iq5hhVhlFTa91@`DYKUh*9Yg&6Iv3)rsZ3}<6O~cqi4`fTN_v%1 z0u;pvp`uoPhT{B=qVSHb%f;g$-2|G!g>=O>G(>*Q_a}6z9Rf#P6dUF@*a2)hfta)1_c`)W!Nw)cePIHga=W4B8I+t|kyntOmXw<1@g&PbU_}mrsOL$a9;XT;J}uRo zl$Dg0>hUm|DE?y_=V3%A)ByPirHRN$WEx>hq?3xbunc`1ofkA!4lTR$#nKUzC5xw8 zWqwstXEcf60+o`H5Krp_+M=kjs)<@Y5eew)6v}z=6d+QqgQNP998TdQbD-x7y!EA7?Lg%4<}h-0fgV@ZtV>iawJ)H#>%>V-SlBid+{pD>eep`IqY`bM&M9V6f22NHVd(&M}?%1s3~WdSm;zM@(PQ6K?BuLUZAQfH)=;O zR}*qkb}R&?*4LPtER-UKxl}?R5L8!z^~InfsS@xPOrIiL+0GMPV=XRFqOj5B5o?hC z42eq^e(N35k9U4s5NXyPgnDTN}%aP4>s3o4^zbp(X(h3|2vn zR!O&Ar;QCUPyWeBn4~IwwS~*g&HqE`A5>GM#_%Nin^0y2c2kF$QK!es{eB`g>kTNu zHc7?4Di%j3?>9cQBd2WBErMEem1Af>>4TOgCS9K626z85QqvF8UG{&HSaNbx zYPxa3#gtS(&iO0E!WLFzPgP>M2Gk$n<*&@c^nA(v8kN7A@WNCyb^_xtma5iYrlO3; zbYyh$R@pmGx%9;f;pburg(+G+YNtvCtm8v%gKEE_vUO3kz{~|! z9;m4Fq;yJ24Vs#}%3N$q|pvoNpN-lpSrvrWk`9h7QP-1(~E` zZ0e4c$D?{5g;fp#;aJo6*rANk$+f0Hda0 zixN&ap-U!BHB;s@X!`X(KsSh2e-0NzHh8q6rchNiVr6RMm8MB(_oB>QLp3pI(9$$v zB+b!vcN|07O9kmPCf)KN!jL|>YJ#fq`Ia}{ZvKsuUrIA{pd)X?${5Pi}nafuY+MzC`04q2x^O01LE;c1orNP z8_nt@K}!)5ImnT!5H10i<1LcyhsUni9mDBEBNLDy$Snl`f^Hno0Rph)9tl z*({ofz788^(vu^%05yXA`VHN25qRleZ^Rj%dG5X!oa zJ6v$U)+#0TYNG+Ywr5t9ltwNMovvvy^sEMlgyyAis#5lcDs4!f0%lGutQa#ct0Z=` zyqxUA%TIoFQ+cB$lFdfssM?yA5;MEpSB`g~c}@<<^p(-~+x_!Zl`NHoOg66+h9N)K zC+{W9ttiPYDlGR`YoIXLV3?zJgQ0azOE{(kEv2jiNsE2C@=N2CP>D`GbpvZkEJQ)E zqKPhtNHaFhY26EHe;}KpC$r>sc2&IIz8<~!;xN<^n zzP$UOJhv3DswqsULK`#?Qv!7$;!PNu6rZ3j4by>m4rN6lfj1syp+_X*O$tsgkK|FYyM))C8-GQrKiZ)MTe=lSxsi zEU6Ge>8K3`>^DhI<4?$iMTD%i1t2ClmU`z;M1X1s2NdNMP_@v-8iZJ-Wxmq9GM~TR zf@^FrGNdguTpWM1QKOXMrA%y>xS$rI0CX0nZMCHZD8m6D{wmNWZJ;baW6%Za1Q8mf zv7?0qGoutOlms%)MFUh8<^2hin4wKoFMXAYtoD=yJ%Hgn$&}@HIbvjGQ_KV_Pd$U9 zYT6bW2UUlhwS5D@mO_5)OQ$9JogGx*l>9{`MW^MTH|UnR562R8$xTMjld! zOCA`($b!~&t@5-=HK3~GBb7qen>C?xp6OvYhO|+$S{}N*qM0yl*H0v7lwq=(I`RZ6 zT<(D(iJTnLq}3QScZ!s2layLD23E|%R3eUm2{Hnzq>+Cz9W&*6i;4#0*_DUoNG=+% z@+eA)h4)?MPA77Z`amvBjB=GC9#1I)bGmA+Ca}nv=|=tXFuaLx@LZrtusTU-5}>|x zukw(g*sZJ`3*XNg`>2}C6jl|WPiQ3*sP5S74xPXd;YapXZe zgRy0d0jDP@*Kzo%_nmeAs-OI9-85!2-ExzO^Y;qJ7LHLi%*jX9u_l~S$l+*1Q}7z3 z&897bcWVh^$_S}q@bY#LosG0rsES5_j&)jd;GM#VTgBEOJ6V${xcse8&`Y?y-MIQ;Iz zaEiY{a9Jr+yz_)X_q)L%a0hn~TR z`=RtmMY_`z_v(y}#=-H2B)O!hg5D36Yt|%_qrd$#C=y#-fDURR zd7+fX^*@y%$^#*sBTCo2;jcW`0FUx3B7~HUCjRq=6zw*R%>&cX+oDvi8aM12NsCe*XH%te7NMGZ}_GLSu2x zCk@N+m16l*K3nRpJk(QGSz$qeuPm;zqC&27Z)KqRQCDN>+L}-AN9&c+3B0I*`vEwv zQy+)^PVwPM1;PgB6@Wx#KCR=}ii*53EOHkp&5-h} zv|LJ|*jH4J^ET<0+JFfqbTPNkZ$q(eX_6oOARWC&HaL5>0xg%C@^SQdU7Uu8!|@7~ zreJH?vU{)c?k#(jwNe%P2ei)NHliC(ciYLw_ z_1~4l7U75j%3pk5aqkL~A`^e8i9WbAVeuhCxIc~7VVjgCcz>TQbE*X*m!x7eox*$* zeHcn?FpQFE@n64*1i!@;RXXM6>I)agj<# z@79Ne?+^K18}eJ9_P>39=5i$m&vvB@)HTrKQq(Ij%2PdXUL0=qQM3@{j)qf2uc!nr zRsvL?t_4)xp=wF*V*ngMhEscRo;uJRxDvPmXbrURyVQ^VrpA_r;WLJTFiMxErS3HV zrAyVC`n3Vt`a%7>0o0!!>qdXa`hUm!f2YHxX{b@8@iP4`j{KA9-v*cFP5W>fJ^?TR zr2svu52j4!pO%C2Qw>m_r~2J#aA{el12lXFKnvfh$GZ;I=t%Xb5N)_BH zxZ~hXf|~<(GTcPCXW@F`;$$Zxz@>)5aQ56e+HR@7dw_E=BGquGLg#6IlvfjQ9{_vO zK;zNt2HYdLd_APQpO1T*hF%MF_X~CRi*)yBqk;HKboUSH?x|g)_KB8@%F1wAjGVd$#hv=Zaav^Jxwl$&>k$9dr;a>jQi7ZOKlM+=%j0)nxXAdi z{`fB<{=OBBE3PM>uQ;&+hlqw;0s8koDW@0$fetxx#}O0BJ@WS>Tu5xx!NJ2H9sd=l z*xsw8j7JQL|J~RB2|Q34R6VbZzxHPujC+CIzz(1R*b3AG8-O~X7N`Mc1JytUPzn?Q zfIff;pz%8bMxX_7Hp5^%4V(au0*8V3fW1IHumPZa zQ`ldVT z`ewT4&W8>yjla6t{F~N4?)i0lt@q^AwhO0D`=@8Sa~NOl3mB=eO3MD zz%38f#crKBKD)Pd{=Z9)Pl?-lY{5sr{^R#=?p-@1{>d-y`fTryH{Cj8>W$t$#_QIe zdCvIR&K0BUhh#($tW(YMwdoz#nsm&pq60~K znV))ZU$J}SvFhTKHy>MOnsZsks2#m3QC{-)-naKE*YEB-oh=VNRZ9Om;~t)G|2S>_ zvf{SWe|Eoqu%EBfr#aWXbl?Z~{%d;77}$B>x}9sjb9+|5SXi{a*(>Jzzj5=N-wwk41yy;%DBhy~#eY^d(N7uVQD%etE zO?bBJ#(g#Jo;`Mbx^;`4&6_*fotJ&vtM_iqoYMB?T=${xZk^wJ+me|be)qb2x>tQ= zUDf;R`|A3-?^*X`|heL8Man>86vcyD{j*soVo<1LbqmigQ}<9jWnh)-o$ zA;&ESwIW@q1|Z*f#8u?j260mmuRxAPC0Ys@P_F6e|Tenm->}`;8J1~gv#LrO*X!*fDe&gn>7 z0>4VgxI$ODOP4Pv%Qu)_sFXDsQ>o!wd^mre>TW4YI0mw!+{b|zs=xUN*Z4L;9}B_Z zIJvGXAU7|57b9h*EM2URA-(~vi^@rrfYt)&XHw8eapFAHwqnSUYKNwESci_;KqEx2 zs05-Ch)N(Tfv5zc5{OD5DuJj3q7wLjT>?hzEk_w!GToU+*=AfT{ssPSVUh5H&{}*< z+#ps;23rT)KWwkrn%mpjJKKBOZT4^Nr|hTgXY39~qGO0-xTCLAa=M*~&epDuu5PZr zuKBJab@cdR?vz1qFWjVTMh8%4-yW*oDVd5iI~$?PolL3TO2iZyfbTnd-X9pXOY zzU6-ACi2tydHhoT2H_@w6YRnvVXjy&?h(HdyGci+p)1*=tTTr_z` z2=gfOO!HCmclaDvTT4%iWJ$J6wcKd!XMM!F(K^kx&c55;$zgF6I3_!$I%hf8IG=TH zb$;ON?&|N7Tn<-}Yr3n2yS3ZsZts51ecDYYw&TEWGst8RKaB4n6bUngg~AG9i}0%O zh48J=MeHFC74HyRNfs$vS|{z2K9zowzP4OxooTh%2HSSpy4d6Gx%Q{+>+SXSukF9t z4UTNb8;)Nbdz|k(KXjgT#<`GzM|r050Kbku!+V9{LaA`Suw2+A{3#3)mx-T=w@P(L1+Ujku+Vb=cf-jiaNZn}c(B97&E0 z$L)?HNNKubo@1$Fg=4MbdB;}AGtLI*=Prl)E%zBWCeN5j;uD@s5%W9KhfP2&-pu82 zmE2w~oiFDT!2feXgYYio^s;zFTqT{A=9=rxt1M?NbFH=3nYN?0pKaIJIs3ErM*C^! z&2)ihltObAvz_^r8OheLF~WGUr}ixp}Yopt-r_YKzyBW*Kd1w0>{B z%yzx4n{9wC#Wuw@-S(nwo2?}@w7Z?P4{?BIsX|lYoSc`-;BMn`xp91)G*p@)Js|Bd zA2a`8FEq}AzXt~v5 zw!~SIEE$&JmP$yESYxa$tgWqa)+B3&b-1!j;X*H2XDi5i`Xp;#1;wae`DXO_pX#^P~gP zc<|WD+Qz!l`jYia)DNju)&|?5)gNR&WEz>1%x7#3w}M;CJ*a4OovLpCWd_F&p?R9VVp(QsYrW1o-MZMi%=#EK zd9`(|b%S-Yb&GYI^>u54ZJ*6;FSa*2dN~(3>zo^%yPd6E39dn|1+E&ZI}OU-K#qBW zspk%IXE`IE$fxml@MHNq`HB2Jkna=xO8z;1H~#_u5#Px77OW`G29)DNVUM^^ycxWt zNlT^2rGH9$rFW$dVRKrUZ!}A=fh)~VSe~)$vsSt$yH>iNruDlY`v47ue8qgnJj-q3 zYWU^+i~LspZT<`XM_8L?LIOSoL()}xy#c_h~17e>f)0K&31~FMoDf1v>WN%>aW*4x{xvS9s z*}(I~bTCyO(oF>Azi z(3;KS0r7VcTMN)5IG{6LDN#y+TppEbrIk`0`iK~F8%W@B)YUHY5p!!xJ4+w5?0m~i z%cGWUmJ^m=EWNF_SZ&tZt<})6mDbL-KCtqIux`KGn%TSA+c~ax@QzByEXT8s-<&tP zI9IBxz%|wNfa_7$6RvfxjjmI!bFQWCTK6jVdiQ4cx3Jdd-1uN3ZR+G2rUTQ3xsh=* z1DO;i2km__Q_Z}@>|)L^E!aWqFgA~^WT&%>*rn`a>@VyeYyvljo50`Czs$eRALGB` zf8{O0Y~eAqsc(eepedZ_hMwezMe|Q*1AlNzX_P(%Vu?b3e0St~M_;*O}je z9d2d0*)rHN*|Na0+p^E{v*jvlZ!2eYSyNFvbF2rfjn*978C!yVq`l1kyZskOiSusf zBIjeyH=PU7-Z!{jckOWx*2ymMnd)O@7?mo36#GT(~;@LSfG!CVR;ub zwalx`8z}pa%pc5UY)iHqE3ppNi}DX+XR?b?C#%^FkV6A|IrOzHcOBP-6CsDS+y?F) z?qlvp?h3va&+{HW9rolNej)!4j4EE?-{RlnkD$$e!~e{mh3#%B%cZvvFU*3?s}UbT z-K`eig3U{lvZOnuiP8rcZ*(-9F~S;xafi=5!F;#*5%Y_X%6H}gmJybPmVaBiSjX5W z+jpXeabR3C6B@b8(aPD|dB$mU#kq#N9!CpY?Ouz~)F$_f?k(9C|j0YBQh4iA--@L&50mg7&o2`~Y%MQyP%VCRT?TWF>ZTPrqC*(82F@^T) zbfXIXnb@9eAGROMumWp=q&$$7sx3L}2zC^k&yHh@*iyEFtzxIJ)$9y*He1K8gA_Nj z_3T#mgkPJ^uxIf}*BGuNBx>S%a(%dd9K#8mg>!Hoj2#j&K27JcFvc0djpFjTaa<8s z+C=+mxQDsrTrIbftK-(8PBx?0+{!g@JGk8#8SUrZ;|_C20~&gYJI$RzA3*pRz6Hh& zMvNRf@?Cfn-;?jd_v0B}z&OHz+VrBANI{)u@j3hm9_9DoyUlRMxhh;$uGz4BHR#*x z(Ed-m&R`Tv$FN=8CU-yR97(57RIqOrWuYyFwiA=!5WGSScvI<%PBDMIIG@RCqk!jDEn0^eEVFSB^-OcW0_p|S@ zhuNcOqm51E+JbA%8M*dNdjltU@Uq?B@mTBR02^6L?sZFKvV)z2}C6j al|WPiQ3*sP5S2hw0#OM>CGa0g;C}%#h?dC! diff --git a/code/win32/FeelIt/FFC10.lib b/code/win32/FeelIt/FFC10.lib deleted file mode 100644 index 54ca7f42b1b7ef4c754983a64208c51b6a21e0bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232332 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 diff --git a/code/win32/FeelIt/FFC10d.dll b/code/win32/FeelIt/FFC10d.dll deleted file mode 100644 index 1f546c2e40fcf999183299c764142ae734442d7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405591 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 GlK%#D>d=b- diff --git a/code/win32/FeelIt/FFC10d.lib b/code/win32/FeelIt/FFC10d.lib deleted file mode 100644 index 786d23d7632545867c573a8195ff70cda9fe5739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232598 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
dLm8Ij_W`}aFQ*0V97E{Uyb=(Ix3E#5Li84yc zOWB3k*^=@KVGVy8cA+9D=76rZ4p5=Je?Co-OO~l+I8bgVUsJp0>fHNBXaWV$%K=+& zj@w(IeV^}7!EJ_n+IU%c>(!El;wu|C0Q4%#^2=*vZWuk7s**A1KZ1e@TZ zPd~6@qwYffrzvR6n(AP1EaSYp9gVuSI%AXc1dVxUp;RU~37w8r@_QxKbB5Tu**ly*ndme)8Fta{R^P?T0@wbN&yf6vnFTx1H}d-x_? z7&^5yzqp3$?)Y|zv5{2xH4j@1rDYsF>Ek3hQ<}QkY27q(z|(&ewX-@W!TuHWPd085 zxMU{k-MD&L08?7@_YWW>yXpf22WI#~wrshKi0rdkm#)$7GCO``xo?3gg<^1rx!dkJ zZ8)>kgA{8L8nU0hGfSU^es%=v$oxXIBb3e)t&>M(L?EM;yp(-Yw=*$ck_ds`G$|B+ z6*|%GuT$_R&a)feK(m*29+-L_yA^>>syHC%JNoY3VXmz>s|`6|C-&H;?AFn@F9-Y_ z^zU!14K|coNVXwjiXj=bly!E8(Mev4`|Xgo@H+%HyB={rA9@stx(c16_%{aXv?Z^l z-Th;$hABDrxI(+TI~8dr4IJ?DA6xX9J1LymhFonM(x*u%#(w&8wa>fpwE=hi8q#!XI3VXOM=P`r;%`mF>C2x>%hNp9K_sN-u!RZ^i1~B13h8PO zWMNG2$)&WFtWQ@KxmHuh=~8nU0hDEvEt!j+Y!mBFPs#_UE0 zhuJ?gJ?$SjR9gR5`?&Nugjykt;6H*m7Y&L;S8sJB=@%8cMrRl27Uma^B@tF7Ny-rB zqC=4=tB~#E?>Wl$9zD9+SQGQ9+5u9!PF%_{g1_w}Cp8L1oH>)fr46MfvrRUM9AH0v zrRJA7;`X6`Ni=`2ZNEv5B`N9ry>7piR$YBgm7VgSq-Q=_IN;`Q2kF~ktOwbs*4=+d z;!U?P(aqROia0xm)8|mxDUMdeIjK=7<|?GSJ&2fFn_Y=G+~Csj<)ssgbGjX*Dprsj zba24T+ty~;KRIkeNqPzP$0i1P`AX9Nl|b3z93Bs_v?$I=;AXZmdLJ>$$V*w-E|<6P zJA`5Ul-!Ks%cOt~=SkUC8a^zy}4Q^S_zTx{2b^4f1Z2tgFGo~7O0 zh5t-s8TEI-%9~?V2vuL!Q6)8h4y&@t!*!r4S^pwYWm(ak;~YRF2ud#eK|kOK#TBE8yp(>gqm9j*$6QR}DpB`h@no)#+Nfj3uTeZD z1w%<~s~r+h_^mLddjheYpA1Y{>R&9b%pG(d!*aA6pSlps)Wkq9Uq1D93$DcKp3#zW zDn=D~DOBmcvjZ3*4OOc4g<`5g^WNV;Ox-fScI3wCrGdk%OA9B~8rKRRobHde2jU)3YvP;Y3JpKQD=;45! zFPH129`E)ih(92g>`xoe+UB*ok=4Kj4kD`yy%-Yh-!u)D96CNwYV*|s7 z z21+Z*8SUhy&^aM*;dcl}@l&F6oiuX5(_6ZCn`4;E+Yp_sr#CUs%NLywr=WA@@U1iR zi*t>WLbr6mbX0(}j2u+wm2!lmpR{ot$?L+XKcyT{^_TKp=K7h9s)_y|=x;2ZI6gDi z;G>?I<&~u)`p{=$_o!MBH#B^3Y;bsNa{u(ejgerr%{3E?A>AV&$HW5)^}s?Zj%1ae)`J# zZ$tl4w1u;A(a@OKQj>24EA>q_D$+LFEamDjMk#qIz4JxZaL{AI5@5|UOw*7Edy`-~$o|f|5v~a-9TT|@qHOJhiwIQdw6#Hfq1HF7X z-FK6CQ{xu}v{G_6Mjd%6?)F@H3%^4c#m|Vl=}5Ct!2vOEO|L@Z=I=rO{30&SnO&HF zWwa?y(&~-k6h|ZCKuS3`lQi*^)H3clZZ3#Y4ygKb!yV=f&PLVyzHefcsC))SONvRm z-glM884oDVn8aiTMT*2;PZ!`1b?oKR$z7;h_4aw#4ZiAHb3v!Nssx|%G>#r}sf6?ZQP@s6G<0A`(wa^^Lu@i?q5@)B{_ zzl-H9{0@Qba~{bnj6$dMIBJZTne#|4*uInIEHX+x{zS+qqk?b>(&}BMY;~ z*aQV>>WP7$a!a$C$xF4g?k~V*7vh%AQ6opg`%9Dx?RNSI^e?Y8mS`!(NM; zPf15|cKurSyc<&}%Rz-=F;<;1-2b&>Eb=9bAZFu9WIczFK1_m1nWKJfj+jXR9ZLFe zXG&B0s8mvBu{gTS67q;jIx#+@GK)Q}1$K<3j^S(=)2ZNqn6Lcm>+Cl6k?BC(pYHBu4Yfoqmr!8&6jm1sZI!{><7EGyNB^#Bt_Rlp8`?YTcH*8 z|BsmZ{ZGg7!cTokU@5sAqnf;weRo*i!tW4nz|Uxu!LZjFbsUiNA9t9uS{rpW z;HKP&#BJB1~&0M9;1_4?|eUi~nUJ9R6 z@)mxF@N)cg;M1E<4w!mtoPFC(`M#|UamuW(O$_w%#p&rOI8_@s8%X6)wSu*jXk}EC zmqIJ^yp>l7%lOlU)|RN{fULhpYR=Ba1)uY7)DFf+8Ua4mZF)VsP%If`afkeA|a=gM379YPm=3W-Z=>wt{^IAeQtJfzPI zW^nJtLB0*4U`+d?jT#X`rNoe*hqR;i4oG>+zY3l9^rSRI?Yec0Z>?BT-n3QYLUJxo z_vd1ISj3y`y^7Gl0WW`!)oprAKZ0dxHz{`>mZ^z>UcOT9ECXMwOx%@{S223XOUb*7 z#^VYMFeel renaming - 3/6/99 jrm: Added user error handling control - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(FFCERRORS_H__INCLUDED_) -#define FFCERRORS_H__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include -#include "FeelBaseTypes.h" - - -/**************************************************************************** - * - * Error Codes - * - ****************************************************************************/ - -typedef enum { - FFC_ERR_OK = 0, - - FFC_ERR_UNKNOWN_ERROR = 1, - - FFC_ERR_ALLOCATION_FAILED = 2, - FFC_ERR_INVALID_PARAMETER = 3, - FFC_ERR_NULL_PARAMETER = 4, - FFC_ERR_WRONG_FORM = 5, - - FFC_ERR_DEVICE_IS_NULL = 6, - FFC_ERR_INVALID_GUID = 7, - FFC_ERR_EFFECT_NOT_INITIALIZED = 8, - - FFC_ERR_CANT_INITIALIZE_DEVICE = 9, - - FFC_ERR_CANT_CREATE_EFFECT = 10, - FFC_ERR_CANT_CREATE_EFFECT_FROM_IFR = 11, - FFC_ERR_NO_EFFECTS_FOUND = 12, - FFC_ERR_EFFECT_IS_COMPOUND = 13, - - FFC_ERR_PROJECT_ALREADY_OPEN = 14, - FFC_ERR_PROJECT_NOT_OPEN = 15 -} FFC_ERROR_CODE; - -typedef enum { - FFC_OUTPUT_ERR_TO_DEBUG = 0x0001, - FFC_OUTPUT_ERR_TO_DIALOG = 0x0002 -} FFC_ERROR_HANDLING_FLAGS; - - -/**************************************************************************** - * - * Macros - * - ****************************************************************************/ - -// -// ------ PUBLIC MACROS ------ -// -#define FFC_GET_LAST_ERROR CFFCErrors::GetLastErrorCode() -#define FFC_SET_ERROR_HANDLING CFFCErrors::SetErrorHandling - - -// -// ------ PRIVATE MACROS ------ -// -#if (FFC_VERSION >= 0x0110) - #define FFC_SET_ERROR(err) CFFCErrors::SetErrorCode(err, __FILE__, __LINE__) -#else - #define FFC_SET_ERROR(err) CFFCErrors::SetErrorCode(err) -#endif -#define FFC_CLEAR_ERROR FFC_SET_ERROR(FFC_ERR_OK) - - - -/**************************************************************************** - * - * CFFCErrors - * - ****************************************************************************/ -// All members are static. Don't bother instantiating an object of this class. - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFFCErrors -{ - // - // ATTRIBUTES - // - - public: - - static HRESULT - GetLastErrorCode() - { return m_Err; } - - static void - SetErrorHandling(unsigned long dwFlags) - { m_dwErrHandlingFlags = dwFlags; } - - -// -// ------ PRIVATE INTERFACE ------ -// - - // Internally used by FFC classes - static void - SetErrorCode( - HRESULT err -#if (FFC_VERSION >= 0x0110) - , const char *sFile, int nLine -#endif - ); - - // - // HELPERS - // - - protected: - - // - // INTERNAL DATA - // - - private: - - static HRESULT m_Err; - static unsigned long m_dwErrHandlingFlags; -}; - - -#endif // FFCERRORS_H__INCLUDED_ diff --git a/code/win32/FeelIt/FeelBaseTypes.h b/code/win32/FeelIt/FeelBaseTypes.h deleted file mode 100644 index e2a8c4f..0000000 --- a/code/win32/FeelIt/FeelBaseTypes.h +++ /dev/null @@ -1,265 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelBaseTypes.h - - PURPOSE: Base Types for Feelit API Foundation Classes - - STARTED: 10/29/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - -**********************************************************************/ - - -#if !defined(AFX_FEELBASETYPES_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELBASETYPES_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -//#include -#include "FeelitApi.h" - -#ifndef FFC_VERSION - #define FFC_VERSION 0x0100 -#endif - -#if (FFC_VERSION >= 0x0110) - #define FFC_START_DELAY - #define FFC_EFFECT_CACHING -#endif - -// These are defined in FEELitAPI.h -// -// #define FEELIT_DEVICETYPE_DEVICE 1 -// #define FEELIT_DEVICETYPE_MOUSE 2 -// #define FEELIT_DEVICETYPE_HID 0x00010000 -// -// Add define for DirectInput Device emulating FEELit Device -#define FEELIT_DEVICETYPE_DIRECTINPUT 3 - - -//================================================================ -// TYPE WRAPPERS -//================================================================ - -// -// FEEL --> FEELIT Wrappers -// -#define FEEL_DEVICETYPE_DEVICE FEELIT_DEVICETYPE_DEVICE -#define FEEL_DEVICETYPE_MOUSE FEELIT_DEVICETYPE_MOUSE -#define FEEL_DEVICETYPE_DIRECTINPUT FEELIT_DEVICETYPE_DIRECTINPUT - -#define FEEL_EFFECT FEELIT_EFFECT -#define LPFEEL_EFFECT LPFEELIT_EFFECT -#define LPCFEEL_EFFECT LPCFEELIT_EFFECT - -#define FEEL_CONDITION FEELIT_CONDITION -#define LPFEEL_CONDITION LPFEELIT_CONDITION -#define LPCFEEL_CONDITION LPCFEELIT_CONDITION - -#define FEEL_TEXTURE FEELIT_TEXTURE -#define LPFEEL_TEXTURE LPFEELIT_TEXTURE -#define LPCFEEL_TEXTURE LPCFEELIT_TEXTURE - -#define FEEL_PERIODIC FEELIT_PERIODIC -#define LPFEEL_PERIODIC LPFEELIT_PERIODIC -#define LPCFEEL_PERIODIC LPCFEELIT_PERIODIC - -#define FEEL_CONSTANTFORCE FEELIT_CONSTANTFORCE -#define LPFEEL_CONSTANTFORCE LPFEELIT_CONSTANTFORCE -#define LPCFEEL_CONSTANTFORCE LPCFEELIT_CONSTANTFORCE - -#define FEEL_RAMPFORCE FEELIT_RAMPFORCE -#define LPFEEL_RAMPFORCE LPFEELIT_RAMPFORCE -#define LPCFEEL_RAMPFORCE LPCFEELIT_RAMPFORCE - -#define FEEL_ENVELOPE FEELIT_ENVELOPE -#define LPFEEL_ENVELOPE LPFEELIT_ENVELOPE -#define LPCFEEL_ENVELOPE LPCFEELIT_ENVELOPE - -#define LPIFEEL_API LPIFEELIT -#define LPIFEEL_EFFECT LPIFEELIT_EFFECT -#define LPIFEEL_DEVICE LPIFEELIT_DEVICE - -#define LPFEEL_DEVICEINSTANCE LPFEELIT_DEVICEINSTANCE -#define LPCFEEL_DEVICEOBJECTINSTANCE LPCFEELIT_DEVICEOBJECTINSTANCE -#define LPCFEEL_EFFECTINFO LPCFEELIT_EFFECTINFO - - -#define FEEL_FPARAM_DURATION FEELIT_FPARAM_DURATION -#define FEEL_FPARAM_SAMPLEPERIOD FEELIT_FPARAM_SAMPLEPERIOD -#define FEEL_FPARAM_GAIN FEELIT_FPARAM_GAIN -#define FEEL_FPARAM_TRIGGERBUTTON FEELIT_FPARAM_TRIGGERBUTTON -#define FEEL_FPARAM_TRIGGERREPEATINTERVAL FEELIT_FPARAM_TRIGGERREPEATINTERVAL -#define FEEL_FPARAM_AXES FEELIT_FPARAM_AXES -#define FEEL_FPARAM_DIRECTION FEELIT_FPARAM_DIRECTION -#define FEEL_FPARAM_ENVELOPE FEELIT_FPARAM_ENVELOPE -#define FEEL_FPARAM_TYPESPECIFICPARAMS FEELIT_FPARAM_TYPESPECIFICPARAMS -#define FEEL_FPARAM_ALLPARAMS FEELIT_FPARAM_ALLPARAMS -#define FEEL_FPARAM_START FEELIT_FPARAM_START -#define FEEL_FPARAM_NORESTART FEELIT_FPARAM_NORESTART -#define FEEL_FPARAM_NODOWNLOAD FEELIT_FPARAM_NODOWNLOAD - -#define FEEL_FEFFECT_OBJECTIDS FEELIT_FEFFECT_OBJECTIDS -#define FEEL_FEFFECT_OBJECTOFFSETS FEELIT_FEFFECT_OBJECTOFFSETS -#define FEEL_FEFFECT_CARTESIAN FEELIT_FEFFECT_CARTESIAN -#define FEEL_FEFFECT_POLAR FEELIT_FEFFECT_POLAR -#define FEEL_FEFFECT_SPHERICAL FEELIT_FEFFECT_SPHERICAL - -#define FEEL_PARAM_NOTRIGGER FEELIT_PARAM_NOTRIGGER - -#define FEEL_MOUSEOFFSET_XAXIS FEELIT_MOUSEOFFSET_XAXIS -#define FEEL_MOUSEOFFSET_YAXIS FEELIT_MOUSEOFFSET_YAXIS -#define FEEL_MOUSEOFFSET_ZAXIS FEELIT_MOUSEOFFSET_ZAXIS - -// -// FORCE --> FEELIT Wrappers -// -#define FORCE_EFFECT FEELIT_EFFECT -#define LPFORCE_EFFECT LPFEELIT_EFFECT -#define LPCFORCE_EFFECT LPCFEELIT_EFFECT - -#define FORCE_CONDITION FEELIT_CONDITION -#define LPFORCE_CONDITION LPFEELIT_CONDITION -#define LPCFORCE_CONDITION LPCFEELIT_CONDITION - -#define FORCE_TEXTURE FEELIT_TEXTURE -#define LPFORCE_TEXTURE LPFEELIT_TEXTURE -#define LPCFORCE_TEXTURE LPCFEELIT_TEXTURE - -#define FORCE_PERIODIC FEELIT_PERIODIC -#define LPFORCE_PERIODIC LPFEELIT_PERIODIC -#define LPCFORCE_PERIODIC LPCFEELIT_PERIODIC - -#define FORCE_CONSTANTFORCE FEELIT_CONSTANTFORCE -#define LPFORCE_CONSTANTFORCE LPFEELIT_CONSTANTFORCE -#define LPCFORCE_CONSTANTFORCE LPCFEELIT_CONSTANTFORCE - -#define FORCE_RAMPFORCE FEELIT_RAMPFORCE -#define LPFORCE_RAMPFORCE LPFEELIT_RAMPFORCE -#define LPCFORCE_RAMPFORCE LPCFEELIT_RAMPFORCE - -#define FORCE_ENVELOPE FEELIT_ENVELOPE -#define LPFORCE_ENVELOPE LPFEELIT_ENVELOPE -#define LPCFORCE_ENVELOPE LPCFEELIT_ENVELOPE - -#define LPIFORCE_API LPIFEELIT -#define LPIFORCE_EFFECT LPIFEELIT_EFFECT -#define LPIFORCE_DEVICE LPIFEELIT_DEVICE - -#define LPFORCE_DEVICEINSTANCE LPFEELIT_DEVICEINSTANCE -#define LPCFORCE_DEVICEOBJECTINSTANCE LPCFEELIT_DEVICEOBJECTINSTANCE -#define LPCFORCE_EFFECTINFO LPCFEELIT_EFFECTINFO - - -#define FORCE_FPARAM_DURATION FEELIT_FPARAM_DURATION -#define FORCE_FPARAM_SAMPLEPERIOD FEELIT_FPARAM_SAMPLEPERIOD -#define FORCE_FPARAM_GAIN FEELIT_FPARAM_GAIN -#define FORCE_FPARAM_TRIGGERBUTTON FEELIT_FPARAM_TRIGGERBUTTON -#define FORCE_FPARAM_TRIGGERREPEATINTERVAL FEELIT_FPARAM_TRIGGERREPEATINTERVAL -#define FORCE_FPARAM_AXES FEELIT_FPARAM_AXES -#define FORCE_FPARAM_DIRECTION FEELIT_FPARAM_DIRECTION -#define FORCE_FPARAM_ENVELOPE FEELIT_FPARAM_ENVELOPE -#define FORCE_FPARAM_TYPESPECIFICPARAMS FEELIT_FPARAM_TYPESPECIFICPARAMS -#define FORCE_FPARAM_ALLPARAMS FEELIT_FPARAM_ALLPARAMS -#define FORCE_FPARAM_START FEELIT_FPARAM_START -#define FORCE_FPARAM_NORESTART FEELIT_FPARAM_NORESTART -#define FORCE_FPARAM_NODOWNLOAD FEELIT_FPARAM_NODOWNLOAD - -#define FORCE_FEFFECT_OBJECTIDS FEELIT_FEFFECT_OBJECTIDS -#define FORCE_FEFFECT_OBJECTOFFSETS FEELIT_FEFFECT_OBJECTOFFSETS -#define FORCE_FEFFECT_CARTESIAN FEELIT_FEFFECT_CARTESIAN -#define FORCE_FEFFECT_POLAR FEELIT_FEFFECT_POLAR -#define FORCE_FEFFECT_SPHERICAL FEELIT_FEFFECT_SPHERICAL - -#define FORCE_PARAM_NOTRIGGER FEELIT_PARAM_NOTRIGGER - -#define FORCE_MOUSEOFFSET_XAXIS FEELIT_MOUSEOFFSET_XAXIS -#define FORCE_MOUSEOFFSET_YAXIS FEELIT_MOUSEOFFSET_YAXIS -#define FORCE_MOUSEOFFSET_ZAXIS FEELIT_MOUSEOFFSET_ZAXIS - - -//================================================================ -// GUID WRAPPERS -//================================================================ - -// -// Feel --> Feelit Wrappers -// -#define GUID_Feel_ConstantForce GUID_Feelit_ConstantForce -#define GUID_Feel_RampForce GUID_Feelit_RampForce -#define GUID_Feel_Square GUID_Feelit_Square -#define GUID_Feel_Sine GUID_Feelit_Sine -#define GUID_Feel_Triangle GUID_Feelit_Triangle -#define GUID_Feel_SawtoothUp GUID_Feelit_SawtoothUp -#define GUID_Feel_SawtoothDown GUID_Feelit_SawtoothDown -#define GUID_Feel_Spring GUID_Feelit_Spring -#define GUID_Feel_DeviceSpring GUID_Feelit_DeviceSpring -#define GUID_Feel_Damper GUID_Feelit_Damper -#define GUID_Feel_Inertia GUID_Feelit_Inertia -#define GUID_Feel_Friction GUID_Feelit_Friction -#define GUID_Feel_Texture GUID_Feelit_Texture -#define GUID_Feel_Grid GUID_Feelit_Grid -#define GUID_Feel_Enclosure GUID_Feelit_Enclosure -#define GUID_Feel_Ellipse GUID_Feelit_Ellipse -#define GUID_Feel_CustomForce GUID_Feelit_CustomForce - -// -// Force --> Feelit Wrappers -// -#define GUID_Force_ConstantForce GUID_Feelit_ConstantForce -#define GUID_Force_RampForce GUID_Feelit_RampForce -#define GUID_Force_Square GUID_Feelit_Square -#define GUID_Force_Sine GUID_Feelit_Sine -#define GUID_Force_Triangle GUID_Feelit_Triangle -#define GUID_Force_SawtoothUp GUID_Feelit_SawtoothUp -#define GUID_Force_SawtoothDown GUID_Feelit_SawtoothDown -#define GUID_Force_Spring GUID_Feelit_Spring -#define GUID_Force_Damper GUID_Feelit_Damper -#define GUID_Force_Inertia GUID_Feelit_Inertia -#define GUID_Force_Friction GUID_Feelit_Friction -#define GUID_Force_Texture GUID_Feelit_Texture -#define GUID_Force_Grid GUID_Feelit_Grid -#define GUID_Force_Enclosure GUID_Feelit_Enclosure -#define GUID_Force_Ellipse GUID_Feelit_Ellipse -#define GUID_Force_CustomForce GUID_Feelit_CustomForce - - -#endif // !defined(AFX_FEELBASETYPES_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) - - - - - - - - - - - - - - - - - diff --git a/code/win32/FeelIt/FeelBox.h b/code/win32/FeelIt/FeelBox.h deleted file mode 100644 index d3e459c..0000000 --- a/code/win32/FeelIt/FeelBox.h +++ /dev/null @@ -1,178 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelBox.h - - PURPOSE: Box Class for Feelit API Foundation Classes - - STARTED: 11/04/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELBOX_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELBOX_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" -#include "FeelEnclosure.h" - - - -//================================================================ -// Constants -//================================================================ - -const POINT FEEL_BOX_MOUSE_POS_AT_START = { MAXLONG, MAXLONG }; - -#define FEEL_BOX_DEFAULT_STIFFNESS 5000 -#define FEEL_BOX_DEFAULT_WIDTH 10 -#define FEEL_BOX_DEFAULT_HEIGHT FEEL_ENCLOSURE_HEIGHT_AUTO -#define FEEL_BOX_DEFAULT_WALL_WIDTH FEEL_ENCLOSURE_WALL_WIDTH_AUTO - -#define FEEL_BOX_DEFAULT_CENTER_POINT FEEL_BOX_MOUSE_POS_AT_START - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_BOX_MOUSE_POS_AT_START FEEL_BOX_DEFAULT_STIFFNESS - -#define FORCE_BOX_DEFAULT_STIFFNESS FEEL_BOX_DEFAULT_STIFFNESS -#define FORCE_BOX_DEFAULT_WIDTH FEEL_BOX_DEFAULT_WIDTH -#define FORCE_BOX_DEFAULT_HEIGHT FEEL_BOX_DEFAULT_HEIGHT -#define FORCE_BOX_DEFAULT_WALL_WIDTH FEEL_BOX_DEFAULT_WALL_WIDTH - -#define FORCE_BOX_DEFAULT_CENTER_POINT FEEL_BOX_DEFAULT_CENTER_POINT - - - -//================================================================ -// CFeelBox -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelBox : public CFeelEnclosure -{ - // - // CONSTRUCTOR/DESCTRUCTOR - // - - public: - - // Constructor - CFeelBox(); - - // Destructor - virtual - ~CFeelBox(); - - - // - // ATTRIBUTES - // - - public: - - - BOOL - ChangeParameters( - POINT pntCenter, - LONG lStiffness = FEEL_EFFECT_DONT_CHANGE, - DWORD dwWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwHeight = FEEL_EFFECT_DONT_CHANGE, - DWORD dwWallWidth = FEEL_EFFECT_DONT_CHANGE, - CFeelEffect* pInsideEffect = (CFeelEffect*) FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - ChangeParameters( - LPCRECT pRectOutside, - LONG lStiffness = FEEL_EFFECT_DONT_CHANGE, - DWORD dwWallWidth = FEEL_EFFECT_DONT_CHANGE, - CFeelEffect* pInsideEffect = (CFeelEffect*) FEEL_EFFECT_DONT_CHANGE - ); - - - // - // OPERATIONS - // - - public: - - - BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwWidth = FEEL_ENCLOSURE_DEFAULT_WIDTH, - DWORD dwHeight = FEEL_ENCLOSURE_DEFAULT_HEIGHT, - LONG lStiffness = FEEL_BOX_DEFAULT_STIFFNESS, - DWORD dwWallWidth = FEEL_BOX_DEFAULT_WALL_WIDTH, - POINT pntCenter = FEEL_BOX_DEFAULT_CENTER_POINT, - CFeelEffect* pInsideEffect = NULL - ); - - - BOOL - Initialize( - CFeelDevice* pDevice, - LPCRECT pRectOutside, - LONG lStiffness = FEEL_BOX_DEFAULT_STIFFNESS, - DWORD dwWallWidth = FEEL_BOX_DEFAULT_WALL_WIDTH, - CFeelEffect* pInsideEffect = NULL - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - - // - // INTERNAL DATA - // - - protected: - -}; - - -#endif // !defined(AFX_FEELBOX_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelCompoundEffect.h b/code/win32/FeelIt/FeelCompoundEffect.h deleted file mode 100644 index e2f688e..0000000 --- a/code/win32/FeelIt/FeelCompoundEffect.h +++ /dev/null @@ -1,184 +0,0 @@ -/********************************************************************** - Copyright (c) 1999 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelCompoundEffect.h - - PURPOSE: Manages Compound Effects for Force Foundation Classes - - STARTED: 2/24/99 by Jeff Mallett - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(__FEELCOMPOUNDEFFECT_H) -#define __FEELCOMPOUNDEFFECT_H - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - -#include "FeelitIFR.h" - - -//================================================================ -// CFeelCompoundEffect -//================================================================ -// Represents a compound effect, such as might be created in -// I-FORCE Studio. Contains an array of effect objects. -// Methods iterate over component effects, passing the message -// to each one. -// Also, has stuff for being used by CFeelProject: -// * next pointer so can be put on a linked list -// * force name - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelCompoundEffect -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - protected: - // Constructs a CFeelCompoundEffect - // Don't try to construct a CFeelCompoundEffect yourself. - // Instead let CFeelProject construct it for you. - CFeelCompoundEffect( - IFREffect **hEffects, - long nEffects - ); - - public: - - ~CFeelCompoundEffect(); - - - // - // ATTRIBUTES - // - - public: - - long - GetNumberOfContainedEffects() const - { return m_nEffects; } - - const char * - GetName() const - { return m_lpszName; } - - GENERIC_EFFECT_PTR - GetContainedEffect( - long index - ); - - - // - // OPERATIONS - // - - public: - - // Start all the contained effects - BOOL Start( - DWORD dwIterations = 1, - DWORD dwFlags = 0 - ); - - // Stop all the contained effects - BOOL Stop(); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - BOOL initialize( - CFeelDevice* pDevice, - IFREffect **hEffects - ); - - BOOL - set_contained_effect( - GENERIC_EFFECT_PTR pObject, - int index = 0 - ); - - BOOL - set_name( - const char *lpszName - ); - - void - set_next( - CFeelCompoundEffect *pNext - ) - { m_pNext = pNext; } - - CFeelCompoundEffect * - get_next() const - { return m_pNext; } - - - // - // FRIENDS - // - - public: - - friend class CFeelProject; - - - // - // INTERNAL DATA - // - - protected: - - GENERIC_EFFECT_PTR *m_paEffects; // Array of force class object pointers - long m_nEffects; // Number of effects in m_paEffects - - private: - - char *m_lpszName; // Name of the compound effect - CFeelCompoundEffect *m_pNext; // Next compound effect in the project -}; - -#endif diff --git a/code/win32/FeelIt/FeelCondition.h b/code/win32/FeelIt/FeelCondition.h deleted file mode 100644 index 8218812..0000000 --- a/code/win32/FeelIt/FeelCondition.h +++ /dev/null @@ -1,345 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelCondition.h - - PURPOSE: Base Condition Class for Feelit API Foundation Classes - - STARTED: 10/10/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELCONDITION_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELCONDITION_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - - - -//================================================================ -// Constants -//================================================================ - -const POINT FEEL_CONDITION_PT_NULL = { 0, 0 }; - -#define FEEL_CONDITION_DEFAULT_COEFFICIENT 2500 -#define FEEL_CONDITION_DEFAULT_SATURATION 10000 -#define FEEL_CONDITION_DEFAULT_DEADBAND 100 -#define FEEL_CONDITION_DEFAULT_CENTER_POINT FEEL_EFFECT_MOUSE_POS_AT_START -#define FEEL_CONDITION_DEFAULT_DURATION INFINITE - -typedef enum { - FC_NULL = 0, - FC_POSITIVE_COEFFICIENT, - FC_NEGATIVE_COEFFICIENT, - FC_POSITIVE_SATURATION, - FC_NEGATIVE_SATURATION, - FC_DEAD_BAND, - FC_AXIS, - FC_CENTER, - FC_DIRECTION_X, - FC_DIRECTION_Y, - FC_ANGLE, - FC_CONDITION_X, - FC_CONDITION_Y -} FC_ArgumentType; - -#define FC_CONDITION FC_CONDITION_X - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_CONDITION_PT_NULL FEEL_CONDITION_PT_NULL - -#define FORCE_CONDITION_DEFAULT_COEFFICIENT FEEL_CONDITION_DEFAULT_COEFFICIENT -#define FORCE_CONDITION_DEFAULT_SATURATION FEEL_CONDITION_DEFAULT_SATURATION -#define FORCE_CONDITION_DEFAULT_DEADBAND FEEL_CONDITION_DEFAULT_DEADBAND -#define FORCE_CONDITION_DEFAULT_CENTER_POINT FEEL_CONDITION_DEFAULT_CENTER_POINT -#define FORCE_CONDITION_DEFAULT_DURATION FEEL_CONDITION_DEFAULT_DURATION - - - -//================================================================ -// CFeelCondition -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelCondition : public CFeelEffect -{ - // - // CONSTRUCTOR/DESCTRUCTOR - // - - public: - - // Constructor - CFeelCondition( - const GUID& rguidEffect - ); - - // Destructor - virtual - ~CFeelCondition(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - // Use this form for single-axis and dual-axis effects - BOOL - ChangeConditionParams( - LPCFEELIT_CONDITION pConditionX, - LPCFEELIT_CONDITION pConditionY - ); - - // Use this form for directional effects - BOOL - ChangeConditionParams( - LPCFEELIT_CONDITION pCondition, - LONG lDirectionX, - LONG lDirectionY - ); - - // Use this form for directional effects - BOOL - ChangeConditionParamsPolar( - LPCFEELIT_CONDITION pCondition, - LONG lAngle - ); - - // Use this form for single-axis, dual-axis symetrical, or directional effects - BOOL - ChangeConditionParams( - LONG lPositiveCoefficient, - LONG lNegativeCoefficient = FEEL_EFFECT_DONT_CHANGE, - DWORD dwPositiveSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwNegativeSaturation = FEEL_EFFECT_DONT_CHANGE, - LONG lDeadBand = FEEL_EFFECT_DONT_CHANGE, - POINT pntCenter = FEEL_EFFECT_DONT_CHANGE_POINT, - LONG lDirectionX = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionY = FEEL_EFFECT_DONT_CHANGE - ); - - // Use this form for single-axis, dual-axis symetrical, or directional effects - BOOL - ChangeConditionParamsPolar( - LONG lPositiveCoefficient, - LONG lNegativeCoefficient, - DWORD dwPositiveSaturation, - DWORD dwNegativeSaturation, - LONG lDeadBand, - POINT pntCenter, - LONG lAngle - ); - - - BOOL - SetCenter( - POINT pntCenter - ); - - BOOL - ChangeConditionParams2( - FC_ArgumentType type, - ... - ); - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - const FEEL_EFFECT &effect - ); - - // Use this form for single-axis and dual-axis effects - BOOL - InitCondition( - CFeelDevice* pDevice, - LPCFEELIT_CONDITION pConditionX, - LPCFEELIT_CONDITION pConditionY, - BOOL bUseDeviceCoordinates = FALSE - ); - - - // Use this form for directional effects - BOOL - InitCondition( - CFeelDevice* pDevice, - LPCFEELIT_CONDITION pCondition, - LONG lDirectionX, - LONG lDirectionY, - BOOL bUseDeviceCoordinates = FALSE - ); - - - // Use this form for directional effects - BOOL - InitConditionPolar( - CFeelDevice* pDevice, - LPCFEELIT_CONDITION pCondition, - LONG lAngle, - BOOL bUseDeviceCoordinates = FALSE - ); - - - // Use this form for single-axis, dual-axis symetrical, or directional effects - BOOL - InitCondition( - CFeelDevice* pDevice, - LONG lPositiveCoefficient = FEEL_CONDITION_DEFAULT_COEFFICIENT, - LONG lNegativeCoefficient = FEEL_CONDITION_DEFAULT_COEFFICIENT, - DWORD dwPositiveSaturation = FEEL_CONDITION_DEFAULT_SATURATION, - DWORD dwNegativeSaturation = FEEL_CONDITION_DEFAULT_SATURATION, - LONG lDeadBand = FEEL_CONDITION_DEFAULT_DEADBAND, - DWORD dwfAxis = FEEL_EFFECT_AXIS_BOTH, - POINT pntCenter = FEEL_CONDITION_DEFAULT_CENTER_POINT, - LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y, - BOOL bUseDeviceCoordinates = FALSE - ); - - // Use this form for directional effects - BOOL - InitConditionPolar( - CFeelDevice* pDevice, - LONG lPositiveCoefficient = FEEL_CONDITION_DEFAULT_COEFFICIENT, - LONG lNegativeCoefficient = FEEL_CONDITION_DEFAULT_COEFFICIENT, - DWORD dwPositiveSaturation = FEEL_CONDITION_DEFAULT_SATURATION, - DWORD dwNegativeSaturation = FEEL_CONDITION_DEFAULT_SATURATION, - LONG lDeadBand = FEEL_CONDITION_DEFAULT_DEADBAND, - POINT pntCenter = FEEL_CONDITION_DEFAULT_CENTER_POINT, - LONG lAngle = FEEL_EFFECT_DEFAULT_ANGLE, - BOOL bUseDeviceCoordinates = FALSE - ); - - - virtual BOOL -#ifdef FFC_START_DELAY - StartNow( -#else - Start( -#endif - DWORD dwIterations = 1, - DWORD dwFlags = 0 - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - void - convert_line_point_to_offset( - POINT pntOnLine - ); - - BOOL - set_parameters( - DWORD dwfAxis, - DWORD dwfCoordinates, - LONG lDirection0, - LONG lDirection1, - LPCFEELIT_CONDITION pConditionX, - LPCFEELIT_CONDITION pConditionY - ); - - BOOL - set_parameters( - DWORD dwfAxis, - DWORD dwfCoordinates, - LONG lDirection0, - LONG lDirection1, - LONG lPositiveCoefficient, - LONG lNegativeCoefficient, - DWORD dwPositiveSaturation, - DWORD dwNegativeSaturation, - LONG lDeadBand, - POINT pntCenter - ); - - // - // INTERNAL DATA - // - - FEEL_CONDITION m_aCondition[2]; - DWORD m_dwfAxis; - BOOL m_bUseMousePosAtStart; - - protected: - BOOL m_bUseDeviceCoordinates; - -}; - - -// -// INLINES -// - -inline BOOL -CFeelCondition::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Spring) || - IsEqualGUID(guid, GUID_Feel_DeviceSpring) || - IsEqualGUID(guid, GUID_Feel_Damper) || - IsEqualGUID(guid, GUID_Feel_Inertia) || - IsEqualGUID(guid, GUID_Feel_Friction) || - IsEqualGUID(guid, GUID_Feel_Texture) || - IsEqualGUID(guid, GUID_Feel_Grid); -} - -#endif // !defined(AFX_FEELCONDITION_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelConstant.h b/code/win32/FeelIt/FeelConstant.h deleted file mode 100644 index 5b586f4..0000000 --- a/code/win32/FeelIt/FeelConstant.h +++ /dev/null @@ -1,193 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelConstant.h - - PURPOSE: Base Constant Class for Feelit API Foundation Classes - - STARTED: 11/03/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELCONSTANT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELCONSTANT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - - - -//================================================================ -// Constants -//================================================================ - -const POINT FEEL_CONSTANT_DEFAULT_DIRECTION = { 1, 0 }; -#define FEEL_CONSTANT_DEFAULT_DURATION 1000 // Milliseconds -#define FEEL_CONSTANT_DEFAULT_MAGNITUDE 5000 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_CONSTANT_DEFAULT_DIRECTION FEEL_CONSTANT_DEFAULT_DIRECTION -#define FORCE_CONSTANT_DEFAULT_DURATION FEEL_CONSTANT_DEFAULT_DURATION -#define FORCE_CONSTANT_DEFAULT_MAGNITUDE FEEL_CONSTANT_DEFAULT_MAGNITUDE - - -//================================================================ -// CFeelConstant -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelConstant : public CFeelEffect -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelConstant(); - - // Destructor - virtual - ~CFeelConstant(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - LONG lDirectionX, - LONG lDirectionY, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LONG lMagnitude = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR - ); - - BOOL - ChangeParametersPolar( - LONG lAngle, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LONG lMagnitude = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR - ); - - - // - // OPERATIONS - // - - public: - - virtual - BOOL - Initialize( - CFeelDevice* pDevice, - LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y, - DWORD dwDuration = FEEL_CONSTANT_DEFAULT_DURATION, - LONG lMagnitude = FEEL_CONSTANT_DEFAULT_MAGNITUDE, - LPFEEL_ENVELOPE pEnvelope = NULL - ); - - virtual - BOOL - InitializePolar( - CFeelDevice* pDevice, - LONG lArray = FEEL_EFFECT_DEFAULT_ANGLE, - DWORD dwDuration = FEEL_CONSTANT_DEFAULT_DURATION, - LONG lMagnitude = FEEL_CONSTANT_DEFAULT_MAGNITUDE, - LPFEEL_ENVELOPE pEnvelope = NULL - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - BOOL - set_parameters( - DWORD dwfCoordinates, - LONG lDirection0, - LONG lDirection1, - DWORD dwDuration, - LONG lMagnitude, - LPFEEL_ENVELOPE pEnvelope - ); - - - // - // INTERNAL DATA - // - - FEEL_CONSTANTFORCE m_ConstantForce; - - protected: - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelConstant::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_ConstantForce); -} - - -#endif // !defined(AFX_FEELCONSTANT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelDXDevice.h b/code/win32/FeelIt/FeelDXDevice.h deleted file mode 100644 index 302fe1f..0000000 --- a/code/win32/FeelIt/FeelDXDevice.h +++ /dev/null @@ -1,126 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelDXDevice.h - - PURPOSE: Abstraction of DirectX Force Feedback device - - STARTED: 10/10/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - -#ifndef FeelDXDevice_h -#define FeelDXDevice_h - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelDevice.h" - - -//================================================================ -// CFeelDXDevice -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelDXDevice : public CFeelDevice -{ - - // - // CONSTRUCTOR/DESCTRUCTOR - // - - public: - - // Constructor - CFeelDXDevice(); - - // Destructor - virtual - ~CFeelDXDevice(); - - - // - // ATTRIBUTES - // - - public: - - virtual LPIFEEL_API - GetAPI() - { return (LPIFEEL_API) m_piApi; } // actually LPDIRECTINPUT - - virtual LPIFEEL_DEVICE - GetDevice() - { return (LPIFEEL_DEVICE) m_piDevice; } // actually LPDIRECTINPUTDEVICE2 - - - // - // OPERATIONS - // - - public: - - BOOL - Initialize( - HANDLE hinstApp, - HANDLE hwndApp, - LPDIRECTINPUT pDI = NULL, - LPDIRECTINPUTDEVICE2 piDevice = NULL - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - virtual void - reset(); - - - // - // INTERNAL DATA - // - - protected: - - BOOL m_bpDIPreExist; - BOOL m_bpDIDevicePreExist; - - LPDIRECTINPUT m_piApi; - LPDIRECTINPUTDEVICE2 m_piDevice; -}; - -#endif // ForceDXDevice_h diff --git a/code/win32/FeelIt/FeelDamper.h b/code/win32/FeelIt/FeelDamper.h deleted file mode 100644 index 1034b9d..0000000 --- a/code/win32/FeelIt/FeelDamper.h +++ /dev/null @@ -1,177 +0,0 @@ -/********************************************************************** - Copyright (c) 1997,8,9 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelDamper.h - - PURPOSE: Feelit API Damper Effect Class - - STARTED: 10/14/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELDamper_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELDamper_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include -#include "FeelCondition.h" - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_DAMPER_DEFAULT_VISCOSITY 2500 -#define FEEL_DAMPER_DEFAULT_SATURATION 10000 -#define FEEL_DAMPER_DEFAULT_MIN_VELOCITY 0 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_DAMPER_DEFAULT_VISCOSITY FEEL_DAMPER_DEFAULT_VISCOSITY -#define FORCE_DAMPER_DEFAULT_SATURATION FEEL_DAMPER_DEFAULT_SATURATION -#define FORCE_DAMPER_DEFAULT_MIN_VELOCITY FEEL_DAMPER_DEFAULT_MIN_VELOCITY - - -//================================================================ -// CFeelDamper -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelDamper : public CFeelCondition -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelDamper(); - - // Destructor - virtual ~CFeelDamper(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - DWORD dwViscosity, - DWORD dwSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwMinVelocity = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionX = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionY = FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - ChangeParametersPolar( - DWORD dwViscosity, - DWORD dwSaturation, - DWORD dwMinVelocity, - LONG lAngle - ); - - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwViscosity = FEEL_DAMPER_DEFAULT_VISCOSITY, - DWORD dwSaturation = FEEL_DAMPER_DEFAULT_SATURATION, - DWORD dwMinVelocity = FEEL_DAMPER_DEFAULT_MIN_VELOCITY, - DWORD dwfAxis = FEEL_EFFECT_AXIS_BOTH, - LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y - ); - - virtual BOOL - InitializePolar( - CFeelDevice* pDevice, - DWORD dwViscosity, - DWORD dwSaturation, - DWORD dwMinVelocity, - LONG lAngle - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - // - // INTERNAL DATA - // - - protected: - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelDamper::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Damper); -} - - -#endif // !defined(AFX_FEELDamper_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelDevice.h b/code/win32/FeelIt/FeelDevice.h deleted file mode 100644 index 2016219..0000000 --- a/code/win32/FeelIt/FeelDevice.h +++ /dev/null @@ -1,196 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelDevice.h - - PURPOSE: Abstract Base Device Class for Force Foundation Classes - - STARTED: 10/10/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - 3/16/99 jrm: Made abstract. Moved functionality to CFeelMouse/CFeelDXDevice - -**********************************************************************/ - -#if !defined(AFX_FORCEDEVICE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FORCEDEVICE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#define DIRECTINPUT_VERSION 0x0800 //[ 0x0300 | 0x0500 | 0x0700 | 0x0800 ] -#include "dinput.h" -#include "FeelBaseTypes.h" - -#ifdef FFC_EFFECT_CACHING - #include "FeelEffectSuite.h" -#endif - - - -//================================================================ -// CFeelDevice -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelDevice -{ - // - // CONSTRUCTOR/DESCTRUCTOR - // - - public: - - // Constructor - CFeelDevice(); - - // Destructor - virtual - ~CFeelDevice(); - - - // - // ATTRIBUTES - // - - public: - - virtual LPIFEEL_API - GetAPI() - = 0; // pure virtual function - - virtual LPIFEEL_DEVICE // Will actually return LPDIRECTINPUTDEVICE2 if non-FEELit - GetDevice() - = 0; // pure virtual function - - DWORD - GetDeviceType() const - { return m_dwDeviceType; } - - - // - // OPERATIONS - // - - public: - - static CFeelDevice * - CreateDevice(HINSTANCE hinstApp, HWND hwndApp); - - virtual BOOL - ChangeScreenResolution( - BOOL bAutoSet, - DWORD dwXScreenSize = 0, - DWORD dwYScreenSize = 0 - ); - - // The default state is using standard Win32 Mouse messages (e.g., WM_MOUSEMOVE) - // and functions (e.g, GetCursorPos). Call only to switch to relative mode - // if not using standard Win32 Mouse services (e.g., DirectInput) for mouse - // input. - BOOL - UsesWin32MouseServices( - BOOL bWin32MouseServ - ); - - // Another syntax for SwitchToAbsoluteMode. - // The default is Absolute mode. Call only to switch to Relative mode or - // to switch back to Absolute mode. - virtual BOOL - SwitchToAbsoluteMode( - BOOL bAbsMode - ); - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // CACHING - // - -#ifdef FFC_EFFECT_CACHING - public: - - void Cache_AddEffect(CFeelEffect *pFeelEffect); - void Cache_RemoveEffect(const CFeelEffect *pFeelEffect); - void Cache_SwapOutEffect(); - - protected: - - void Cache_LoadEffectSuite(CFeelEffectSuite *pSuite, BOOL bCreateOnDevice); - void Cache_UnloadEffectSuite(CFeelEffectSuite *pSuite, BOOL bUnloadFromDevice); - - CEffectList m_Cache; // List of all effects created on device -#endif - - // - // HELPERS - // - - protected: - - // Performs device preparation by setting the device's parameters - virtual BOOL - prepare_device(); - - virtual void - reset() - = 0; // pure virtual function - - static BOOL CALLBACK - enum_didevices_proc( - LPDIDEVICEINSTANCE pForceDevInst, - LPVOID pv - ); - - static BOOL CALLBACK - enum_devices_proc( - LPFORCE_DEVICEINSTANCE pForceDevInst, - LPVOID pv - ); - - - // - // INTERNAL DATA - // - - protected: - - BOOL m_bInitialized; - DWORD m_dwDeviceType; - GUID m_guidDevice; - BOOL m_bGuidValid; - -}; - - -#endif // !defined(AFX_FORCEDEVICE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelEffect.h b/code/win32/FeelIt/FeelEffect.h deleted file mode 100644 index d7039ef..0000000 --- a/code/win32/FeelIt/FeelEffect.h +++ /dev/null @@ -1,344 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelEffect.h - - PURPOSE: Base Effect Class for Feelit API Foundation Classes - - STARTED: 10/10/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID and feel_to_DI_GUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELEFFECT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELEFFECT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelDevice.h" -class CFeelProject; - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_EFFECT_AXIS_X 1 -#define FEEL_EFFECT_AXIS_Y 2 -#define FEEL_EFFECT_AXIS_BOTH 3 -#define FEEL_EFFECT_AXIS_DIRECTIONAL 4 -#define FEEL_EFFECT_DONT_CHANGE MINLONG -#define FEEL_EFFECT_DONT_CHANGE_PTR MAXDWORD -const POINT FEEL_EFFECT_DONT_CHANGE_POINT = { 0xFFFFFFFF, 0xFFFFFFFF }; -const POINT FEEL_EFFECT_MOUSE_POS_AT_START = { MAXLONG, MAXLONG }; - -#define FEEL_EFFECT_DEFAULT_ENVELOPE NULL -#define FEEL_EFFECT_DEFAULT_DIRECTION_X 1 -#define FEEL_EFFECT_DEFAULT_DIRECTION_Y 1 -#define FEEL_EFFECT_DEFAULT_ANGLE 0 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_EFFECT_AXIS_X FEEL_EFFECT_AXIS_X -#define FORCE_EFFECT_AXIS_Y FEEL_EFFECT_AXIS_Y -#define FORCE_EFFECT_AXIS_BOTH FEEL_EFFECT_AXIS_BOTH -#define FORCE_EFFECT_AXIS_DIRECTIONAL FEEL_EFFECT_AXIS_DIRECTIONAL -#define FORCE_EFFECT_DONT_CHANGE FEEL_EFFECT_DONT_CHANGE -#define FORCE_EFFECT_DONT_CHANGE_PTR FEEL_EFFECT_DONT_CHANGE_PTR -#define FORCE_EFFECT_DONT_CHANGE_POINT FEEL_EFFECT_DONT_CHANGE_POINT -#define FORCE_EFFECT_MOUSE_POS_AT_START FEEL_EFFECT_MOUSE_POS_AT_START - -#define FORCE_EFFECT_DEFAULT_ENVELOPE FEEL_EFFECT_DEFAULT_ENVELOPE -#define FORCE_EFFECT_DEFAULT_DIRECTION_X FEEL_EFFECT_DEFAULT_DIRECTION_X -#define FORCE_EFFECT_DEFAULT_DIRECTION_Y FEEL_EFFECT_DEFAULT_DIRECTION_Y -#define FORCE_EFFECT_DEFAULT_ANGLE FEEL_EFFECT_DEFAULT_ANGLE - - - -// GENERIC_EFFECT_PTR -// This is really a pointer to a child of CFeelEffect. -typedef class CFeelEffect * GENERIC_EFFECT_PTR; - - -//================================================================ -// CFeelEffect -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelEffect -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelEffect( - const GUID& rguidEffect - ); - - // Destructor - virtual - ~CFeelEffect(); - - // - // ATTRIBUTES - // - - public: - - LPIFEEL_EFFECT - GetEffect() - { return m_piFeelitEffect; } - - BOOL - GetStatus( - DWORD* pdwStatus - ) -#if (FFC_VERSION >= 0x0110) || defined(FFC_EFFECT_CACHING) - const -#endif - ; - - GUID - GetGUID() - { return m_guidEffect; } - - virtual BOOL - GetIsCompatibleGUID( - GUID & /* guid */ - ) - { return true; } - - // Allocates an object of the correct FFC class from the given GUID - static GENERIC_EFFECT_PTR - NewObjectFromGUID( - GUID &guid - ); - - BOOL - ChangeBaseParams( - LONG lDirectionX, - LONG lDirectionY, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR, - DWORD dwSamplePeriod = FEEL_EFFECT_DONT_CHANGE, - DWORD dwGain = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTriggerButton = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTriggerRepeatInterval = FEEL_EFFECT_DONT_CHANGE -#ifdef FFC_START_DELAY - ,DWORD dwStartDelay = FEEL_EFFECT_DONT_CHANGE -#endif - ); - - BOOL - ChangeBaseParamsPolar( - LONG lAngle, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR, - DWORD dwSamplePeriod = FEEL_EFFECT_DONT_CHANGE, - DWORD dwGain = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTriggerButton = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTriggerRepeatInterval = FEEL_EFFECT_DONT_CHANGE -#ifdef FFC_START_DELAY - ,DWORD dwStartDelay = FEEL_EFFECT_DONT_CHANGE -#endif - ); - - BOOL - ChangeDirection( - LONG lDirectionX, - LONG lDirectionY - ); - - BOOL - ChangeDirection( - LONG lAngle - ); - - - BOOL - SetEnvelope( - DWORD dwAttackLevel, - DWORD dwAttackTime, - DWORD dwFadeLevel, - DWORD dwFadeTime - ); - - BOOL - SetEnvelope( - LPFEEL_ENVELOPE pEnvelope - ); - - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - const FEEL_EFFECT &effect - ); - - virtual BOOL - InitializeFromProject( - CFeelProject &project, - LPCSTR lpszEffectName, - CFeelDevice* pDevice = NULL - ); - - virtual BOOL - Start( - DWORD dwIterations = 1, - DWORD dwFlags = 0 - ); - -#ifdef FFC_START_DELAY - virtual BOOL - StartNow( - DWORD dwIterations = 1, - DWORD dwFlags = 0 - ); -#endif - - virtual BOOL - Stop(); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // CACHING - // - -#ifdef FFC_EFFECT_CACHING - - public: - - BOOL GetIsPlaying() const; - BOOL GetIsTriggered() const; - short GetPriority() const { return m_Priority; } - void SetPriority(short priority) { m_Priority = priority; } - HRESULT Unload(); - void Reload(); - - public: - - ECacheState m_CacheState; // effect's status in the cache - BOOL m_bInCurrentSuite; // is the effect in the currently loaded suite? - short m_Priority; // Priority within suite: higher number is higher priority - DWORD m_dwLastStarted; // when last started (0 = never) or when param change made on device - DWORD m_dwLastStopped; // when last stopped (0 = not since last start) - DWORD m_dwLastLoaded; // when last loaded with CFeelEffectSuite::Load or Create - - protected: - - CFeelDevice *m_pFeelDevice; // ### Use instead of m_piFeelitDevice -#endif - - // - // HELPERS - // - protected: - -#ifdef FFC_EFFECT_CACHING - public: // initalize needs to be called by CFeelDevice -#endif - BOOL - initialize( - CFeelDevice* pDevice - ); -#ifdef FFC_EFFECT_CACHING - protected: -#endif - - HRESULT - set_parameters_on_device( - DWORD dwFlags - ); - - void - feel_to_DI_GUID( - GUID &guid - ); - - void - reset(); - - void - reset_effect_struct(); - - - // - // INTERNAL DATA - // - - protected: - - FEEL_EFFECT m_Effect; - DWORD m_dwaAxes[2]; - LONG m_laDirections[2]; - - GUID m_guidEffect; - BOOL m_bIsPlaying; - DWORD m_dwDeviceType; - LPIFEEL_DEVICE m_piFeelitDevice; // Might also be holding LPDIRECTINPUTDEVICE2 - LPIFEEL_EFFECT m_piFeelitEffect; - DWORD m_cAxes; // Number of axes - -#ifdef FFC_START_DELAY - public: - // Prevents access to dangling pointer when this is deleted - // All relevent code may be removed when all hardware and drivers support start delay - CFeelEffect **m_ppTimerRef; // pointer to pointer to this. -#endif -}; - - -#if (DIRECTINPUT_VERSION >= 0x0700) - #define DIRECT_INPUT_STARTDELAY_SUPPORTED TRUE -#else - #define DIRECT_INPUT_STARTDELAY_SUPPORTED FALSE -#endif /* DIRECTINPUT_VERSION >= 0x0700 */ - -#endif // !defined(AFX_FEELEFFECT_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelEllipse.h b/code/win32/FeelIt/FeelEllipse.h deleted file mode 100644 index 0484013..0000000 --- a/code/win32/FeelIt/FeelEllipse.h +++ /dev/null @@ -1,253 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelEllipse.h - - PURPOSE: Base Ellipse Class for Feelit API Foundation Classes - - STARTED: 10/29/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELELLIPSE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELELLIPSE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_ELLIPSE_DEFAULT_STIFFNESS 5000 -#define FEEL_ELLIPSE_DEFAULT_SATURATION 10000 -#define FEEL_ELLIPSE_DEFAULT_WIDTH 10 -#define FEEL_ELLIPSE_HEIGHT_AUTO MAXDWORD -#define FEEL_ELLIPSE_DEFAULT_HEIGHT FEEL_ELLIPSE_HEIGHT_AUTO -#define FEEL_ELLIPSE_WALL_WIDTH_AUTO MAXDWORD -#define FEEL_ELLIPSE_DEFAULT_WALL_WIDTH FEEL_ELLIPSE_WALL_WIDTH_AUTO -#define FEEL_ELLIPSE_DEFAULT_STIFFNESS_MASK FEELIT_FSTIFF_ANYWALL -#define FEEL_ELLIPSE_DEFAULT_CLIPPING_MASK FEELIT_FCLIP_NONE - -#define FEEL_ELLIPSE_DEFAULT_CENTER_POINT FEEL_EFFECT_MOUSE_POS_AT_START - -// -// FEEL --> FORCE Wrappers -// -#define FORCE_ELLIPSE_DEFAULT_STIFFNESS FEEL_ELLIPSE_DEFAULT_STIFFNESS -#define FORCE_ELLIPSE_DEFAULT_SATURATION FEEL_ELLIPSE_DEFAULT_SATURATION -#define FORCE_ELLIPSE_DEFAULT_WIDTH FEEL_ELLIPSE_DEFAULT_WIDTH -#define FORCE_ELLIPSE_HEIGHT_AUTO FEEL_ELLIPSE_HEIGHT_AUTO -#define FORCE_ELLIPSE_DEFAULT_HEIGHT FEEL_ELLIPSE_DEFAULT_HEIGHT -#define FORCE_ELLIPSE_WALL_WIDTH_AUTO FEEL_ELLIPSE_WALL_WIDTH_AUTO -#define FORCE_ELLIPSE_DEFAULT_WALL_WIDTH FEEL_ELLIPSE_DEFAULT_WALL_WIDTH -#define FORCE_ELLIPSE_DEFAULT_STIFFNESS_MASK FEEL_ELLIPSE_DEFAULT_STIFFNESS_MASK -#define FORCE_ELLIPSE_DEFAULT_CLIPPING_MASK FEEL_ELLIPSE_DEFAULT_CLIPPING_MASK - -#define FORCE_ELLIPSE_DEFAULT_CENTER_POINT FEEL_ELLIPSE_DEFAULT_CENTER_POINT - - - - -//================================================================ -// CFeelEllipse -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelEllipse : public CFeelEffect -{ - // - // CONSTRUCTOR/DESCTRUCTOR - // - - public: - - // Constructor - CFeelEllipse(); - - // Destructor - virtual - ~CFeelEllipse(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - POINT pntCenter, - DWORD dwWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwHeight = FEEL_EFFECT_DONT_CHANGE, - LONG lStiffness = FEEL_EFFECT_DONT_CHANGE, - DWORD dwWallWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwStiffnessMask = FEEL_EFFECT_DONT_CHANGE, - DWORD dwClippingMask = FEEL_EFFECT_DONT_CHANGE, - CFeelEffect* pInsideEffect = (CFeelEffect*) FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - ChangeParameters( - LPCRECT pRectOutside, - LONG lStiffness = FEEL_EFFECT_DONT_CHANGE, - DWORD dwWallWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwStiffnessMask = FEEL_EFFECT_DONT_CHANGE, - DWORD dwClippingMask = FEEL_EFFECT_DONT_CHANGE, - CFeelEffect* pInsideEffect = (CFeelEffect*) FEEL_EFFECT_DONT_CHANGE - ); - - - BOOL - SetRect( - LPCRECT pRect - ); - - - BOOL - SetCenter( - POINT pntCenter - ); - - - BOOL - SetCenter( - LONG x, - LONG y - ); - - - // - // OPERATIONS - // - - public: - - BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwWidth = FEEL_ELLIPSE_DEFAULT_WIDTH, - DWORD dwHeight = FEEL_ELLIPSE_DEFAULT_HEIGHT, - LONG lStiffness = FEEL_ELLIPSE_DEFAULT_STIFFNESS, - DWORD dwWallWidth = FEEL_ELLIPSE_DEFAULT_WALL_WIDTH, - DWORD dwSaturation = FEEL_ELLIPSE_DEFAULT_SATURATION, - DWORD dwStiffnessMask = FEEL_ELLIPSE_DEFAULT_STIFFNESS_MASK, - DWORD dwClippingMask = FEEL_ELLIPSE_DEFAULT_CLIPPING_MASK, - POINT pntCenter = FEEL_ELLIPSE_DEFAULT_CENTER_POINT, - CFeelEffect* pInsideEffect = NULL - ); - - - BOOL - Initialize( - CFeelDevice* pDevice, - LPCRECT pRectOutside, - LONG lStiffness = FEEL_ELLIPSE_DEFAULT_STIFFNESS, - DWORD dwWallWidth = FEEL_ELLIPSE_DEFAULT_WALL_WIDTH, - DWORD dwSaturation = FEEL_ELLIPSE_DEFAULT_SATURATION, - DWORD dwStiffnessMask = FEEL_ELLIPSE_DEFAULT_STIFFNESS_MASK, - DWORD dwClippingMask = FEEL_ELLIPSE_DEFAULT_CLIPPING_MASK, - CFeelEffect* pInsideEffect = NULL - ); - - - virtual BOOL -#ifdef FFC_START_DELAY - StartNow( -#else - Start( -#endif - DWORD dwFlags = 0 - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - BOOL - set_parameters( - LPCRECT pRectOutside, - LONG lStiffness, - DWORD dwWallWidth, - DWORD dwSaturation, - DWORD dwStiffnessMask, - DWORD dwClippingMask, - CFeelEffect* pInsideEffect - ); - - // - // INTERNAL DATA - // - - protected: - - FEELIT_ELLIPSE m_ellipse; - BOOL m_bUseMousePosAtStart; - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelEllipse::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Ellipse); -} - -#endif // !defined(AFX_FEELELLIPSE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelEnclosure.h b/code/win32/FeelIt/FeelEnclosure.h deleted file mode 100644 index aa79a1f..0000000 --- a/code/win32/FeelIt/FeelEnclosure.h +++ /dev/null @@ -1,268 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelEnclosure.h - - PURPOSE: Base Enclosure Class for Feelit API Foundation Classes - - STARTED: 10/29/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELENCLOSURE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELENCLOSURE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - - - -//================================================================ -// Constants -//================================================================ - - -#define FEEL_ENCLOSURE_DEFAULT_STIFFNESS 5000 -#define FEEL_ENCLOSURE_DEFAULT_SATURATION 10000 -#define FEEL_ENCLOSURE_DEFAULT_WIDTH 10 -#define FEEL_ENCLOSURE_HEIGHT_AUTO MAXDWORD -#define FEEL_ENCLOSURE_DEFAULT_HEIGHT FEEL_ENCLOSURE_HEIGHT_AUTO -#define FEEL_ENCLOSURE_WALL_WIDTH_AUTO MAXDWORD -#define FEEL_ENCLOSURE_DEFAULT_WALL_WIDTH FEEL_ENCLOSURE_WALL_WIDTH_AUTO -#define FEEL_ENCLOSURE_DEFAULT_STIFFNESS_MASK FEELIT_FSTIFF_ANYWALL -#define FEEL_ENCLOSURE_DEFAULT_CLIPPING_MASK FEELIT_FCLIP_NONE - -#define FEEL_ENCLOSURE_DEFAULT_CENTER_POINT FEEL_EFFECT_MOUSE_POS_AT_START - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_ENCLOSURE_DEFAULT_STIFFNESS FEEL_ENCLOSURE_DEFAULT_STIFFNESS -#define FORCE_ENCLOSURE_DEFAULT_SATURATION FEEL_ENCLOSURE_DEFAULT_SATURATION -#define FORCE_ENCLOSURE_DEFAULT_WIDTH FEEL_ENCLOSURE_DEFAULT_WIDTH -#define FORCE_ENCLOSURE_HEIGHT_AUTO FEEL_ENCLOSURE_HEIGHT_AUTO -#define FORCE_ENCLOSURE_DEFAULT_HEIGHT FEEL_ENCLOSURE_DEFAULT_HEIGHT -#define FORCE_ENCLOSURE_WALL_WIDTH_AUTO FEEL_ENCLOSURE_WALL_WIDTH_AUTO -#define FORCE_ENCLOSURE_DEFAULT_WALL_WIDTH FEEL_ENCLOSURE_DEFAULT_WALL_WIDTH -#define FORCE_ENCLOSURE_DEFAULT_STIFFNESS_MASK FEEL_ENCLOSURE_DEFAULT_STIFFNESS_MASK -#define FORCE_ENCLOSURE_DEFAULT_CLIPPING_MASK FEEL_ENCLOSURE_DEFAULT_CLIPPING_MASK - -#define FORCE_ENCLOSURE_DEFAULT_CENTER_POINT FEEL_ENCLOSURE_DEFAULT_CENTER_POINT - - - - -//================================================================ -// CFeelEnclosure -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelEnclosure : public CFeelEffect -{ - // - // CONSTRUCTOR/DESCTRUCTOR - // - - public: - - // Constructor - CFeelEnclosure(); - - // Destructor - virtual - ~CFeelEnclosure(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - POINT pntCenter, - DWORD dwWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwHeight = FEEL_EFFECT_DONT_CHANGE, - LONG lTopAndBottomWallStiffness = FEEL_EFFECT_DONT_CHANGE, - LONG lLeftAndRightWallStiffness = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTopAndBottomWallWallWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwLeftAndRightWallWallWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTopAndBottomWallSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwLeftAndRightWallSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwStiffnessMask = FEEL_EFFECT_DONT_CHANGE, - DWORD dwClippingMask = FEEL_EFFECT_DONT_CHANGE, - CFeelEffect* pInsideEffect = (CFeelEffect*) FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - ChangeParameters( - LPCRECT pRectOutside, - LONG lTopAndBottomWallStiffness = FEEL_EFFECT_DONT_CHANGE, - LONG lLeftAndRightWallStiffness = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTopAndBottomWallWallWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwLeftAndRightWallWallWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwTopAndBottomWallSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwLeftAndRightWallSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwStiffnessMask = FEEL_EFFECT_DONT_CHANGE, - DWORD dwClippingMask = FEEL_EFFECT_DONT_CHANGE, - CFeelEffect* pInsideEffect = (CFeelEffect*) FEEL_EFFECT_DONT_CHANGE - ); - - - BOOL - SetRect( - LPCRECT pRect - ); - - - BOOL - SetCenter( - POINT pntCenter - ); - - - BOOL - SetCenter( - LONG x, - LONG y - ); - - - // - // OPERATIONS - // - - public: - - BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwWidth = FEEL_ENCLOSURE_DEFAULT_WIDTH, - DWORD dwHeight = FEEL_ENCLOSURE_DEFAULT_HEIGHT, - LONG lTopAndBottomWallStiffness = FEEL_ENCLOSURE_DEFAULT_STIFFNESS, - LONG lLeftAndRightWallStiffness = FEEL_ENCLOSURE_DEFAULT_STIFFNESS, - DWORD dwTopAndBottomWallWallWidth = FEEL_ENCLOSURE_DEFAULT_WALL_WIDTH, - DWORD dwLeftAndRightWallWallWidth = FEEL_ENCLOSURE_DEFAULT_WALL_WIDTH, - DWORD dwTopAndBottomWallSaturation = FEEL_ENCLOSURE_DEFAULT_SATURATION, - DWORD dwLeftAndRightWallSaturation = FEEL_ENCLOSURE_DEFAULT_SATURATION, - DWORD dwStiffnessMask = FEEL_ENCLOSURE_DEFAULT_STIFFNESS_MASK, - DWORD dwClippingMask = FEEL_ENCLOSURE_DEFAULT_CLIPPING_MASK, - POINT pntCenter = FEEL_ENCLOSURE_DEFAULT_CENTER_POINT, - CFeelEffect* pInsideEffect = NULL - ); - - - BOOL - Initialize( - CFeelDevice* pDevice, - LPCRECT pRectOutside, - LONG lTopAndBottomWallStiffness = FEEL_ENCLOSURE_DEFAULT_STIFFNESS, - LONG lLeftAndRightWallStiffness = FEEL_ENCLOSURE_DEFAULT_STIFFNESS, - DWORD dwTopAndBottomWallWallWidth = FEEL_ENCLOSURE_DEFAULT_WALL_WIDTH, - DWORD dwLeftAndRightWallWallWidth = FEEL_ENCLOSURE_DEFAULT_WALL_WIDTH, - DWORD dwTopAndBottomWallSaturation = FEEL_ENCLOSURE_DEFAULT_SATURATION, - DWORD dwLeftAndRightWallSaturation = FEEL_ENCLOSURE_DEFAULT_SATURATION, - DWORD dwStiffnessMask = FEEL_ENCLOSURE_DEFAULT_STIFFNESS_MASK, - DWORD dwClippingMask = FEEL_ENCLOSURE_DEFAULT_CLIPPING_MASK, - CFeelEffect* pInsideEffect = NULL - ); - - - virtual BOOL -#ifdef FFC_START_DELAY - StartNow( -#else - Start( -#endif - DWORD dwFlags = 0 - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - BOOL - set_parameters( - LPCRECT pRectOutside, - LONG lTopAndBottomWallStiffness, - LONG lLeftAndRightWallStiffness, - DWORD dwTopAndBottomWallWallWidth, - DWORD dwLeftAndRightWallWallWidth, - DWORD dwTopAndBottomWallSaturation, - DWORD dwLeftAndRightWallSaturation, - DWORD dwStiffnessMask, - DWORD dwClippingMask, - CFeelEffect* pInsideEffect - ); - - // - // INTERNAL DATA - // - - protected: - - FEELIT_ENCLOSURE m_enclosure; - BOOL m_bUseMousePosAtStart; - -}; - - -// -// INLINES -// - -inline BOOL -CFeelEnclosure::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Enclosure); -} - -#endif // !defined(AFX_FEELENCLOSURE_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelFriction.h b/code/win32/FeelIt/FeelFriction.h deleted file mode 100644 index 2548c47..0000000 --- a/code/win32/FeelIt/FeelFriction.h +++ /dev/null @@ -1,172 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelFriction.h - - PURPOSE: Feelit API Friction Effect Class - - STARTED: 12/29/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELFriction_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELFriction_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include -#include "FeelCondition.h" - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_FRICTION_DEFAULT_COEFFICIENT 2500 -#define FEEL_FRICTION_DEFAULT_MIN_VELOCITY 0 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_FRICTION_DEFAULT_COEFFICIENT FEEL_FRICTION_DEFAULT_COEFFICIENT -#define FORCE_FRICTION_DEFAULT_MIN_VELOCITY FEEL_FRICTION_DEFAULT_MIN_VELOCITY - - -//================================================================ -// CFeelFriction -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelFriction : public CFeelCondition -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelFriction(); - - // Destructor - virtual - ~CFeelFriction(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - DWORD dwCoefficient, - DWORD dwMinVelocity = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionX = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionY = FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - ChangeParametersPolar( - DWORD dwCoefficient, - DWORD dwMinVelocity, - LONG lAngle - ); - - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwCoefficient = FEEL_FRICTION_DEFAULT_COEFFICIENT, - DWORD dwMinVelocity = FEEL_FRICTION_DEFAULT_MIN_VELOCITY, - DWORD dwfAxis = FEEL_EFFECT_AXIS_BOTH, - LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y - ); - - virtual BOOL - InitializePolar( - CFeelDevice* pDevice, - DWORD dwCoefficient, - DWORD dwMinVelocity, - LONG lAngle - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - // - // INTERNAL DATA - // - - protected: - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelFriction::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Friction); -} - - -#endif // !defined(AFX_FEELFriction_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelGrid.h b/code/win32/FeelIt/FeelGrid.h deleted file mode 100644 index 807eba8..0000000 --- a/code/win32/FeelIt/FeelGrid.h +++ /dev/null @@ -1,171 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelGrid.h - - PURPOSE: Feelit API Grid Effect Class - - STARTED: 12/11/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELGrid_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELGrid_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include -#include "FeelCondition.h" - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_GRID_DEFAULT_HORIZ_OFFSET 0 -#define FEEL_GRID_DEFAULT_VERT_OFFSET 0 -#define FEEL_GRID_DEFAULT_HORIZ_SPACING 100 -#define FEEL_GRID_DEFAULT_VERT_SPACING 100 -#define FEEL_GRID_DEFAULT_NODE_STRENGTH 5000 -#define FEEL_GRID_DEFAULT_NODE_SATURATION 10000 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_GRID_DEFAULT_HORIZ_OFFSET FEEL_GRID_DEFAULT_HORIZ_OFFSET -#define FORCE_GRID_DEFAULT_VERT_OFFSET FEEL_GRID_DEFAULT_VERT_OFFSET -#define FORCE_GRID_DEFAULT_HORIZ_SPACING FEEL_GRID_DEFAULT_HORIZ_SPACING -#define FORCE_GRID_DEFAULT_VERT_SPACING FEEL_GRID_DEFAULT_VERT_SPACING -#define FORCE_GRID_DEFAULT_NODE_STRENGTH FEEL_GRID_DEFAULT_NODE_STRENGTH -#define FORCE_GRID_DEFAULT_NODE_SATURATION FEEL_GRID_DEFAULT_NODE_SATURATION - - -//================================================================ -// CFeelGrid -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelGrid : public CFeelCondition -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelGrid(); - - // Destructor - virtual - ~CFeelGrid(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - DWORD dwHorizSpacing, - DWORD dwVertSpacing, - LONG lHorizNodeStrength = FEEL_EFFECT_DONT_CHANGE, - LONG lVertNodeStrength = FEEL_EFFECT_DONT_CHANGE, - DWORD dwHorizOffset = FEEL_EFFECT_DONT_CHANGE, - DWORD dwVertOffset = FEEL_EFFECT_DONT_CHANGE, - DWORD dwHorizNodeSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwVertNodeSaturation = FEEL_EFFECT_DONT_CHANGE - ); - - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwHorizSpacing = FEEL_GRID_DEFAULT_HORIZ_SPACING, - DWORD dwVertSpacing = FEEL_GRID_DEFAULT_VERT_SPACING, - LONG lHorizNodeStrength = FEEL_GRID_DEFAULT_NODE_STRENGTH, - LONG lVertNodeStrength = FEEL_GRID_DEFAULT_NODE_STRENGTH, - DWORD dwHorizOffset = FEEL_GRID_DEFAULT_HORIZ_OFFSET, - DWORD dwVertOffset = FEEL_GRID_DEFAULT_VERT_OFFSET, - DWORD dwHorizNodeSaturation = FEEL_GRID_DEFAULT_NODE_SATURATION, - DWORD dwVertNodeSaturation = FEEL_GRID_DEFAULT_NODE_SATURATION - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - // - // INTERNAL DATA - // - - protected: - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelGrid::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Grid); -} - -#endif // !defined(AFX_FEELGrid_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelInertia.h b/code/win32/FeelIt/FeelInertia.h deleted file mode 100644 index c1a22d3..0000000 --- a/code/win32/FeelIt/FeelInertia.h +++ /dev/null @@ -1,178 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelInertia.h - - PURPOSE: Feelit API Inertia Effect Class - - STARTED: 12/29/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELInertia_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELInertia_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include -#include "FeelCondition.h" - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_INERTIA_DEFAULT_COEFFICIENT 2500 -#define FEEL_INERTIA_DEFAULT_SATURATION 10000 -#define FEEL_INERTIA_DEFAULT_MIN_ACCELERATION 0 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_INERTIA_DEFAULT_COEFFICIENT FEEL_INERTIA_DEFAULT_COEFFICIENT -#define FORCE_INERTIA_DEFAULT_SATURATION FEEL_INERTIA_DEFAULT_SATURATION -#define FORCE_INERTIA_DEFAULT_MIN_ACCELERATION FEEL_INERTIA_DEFAULT_MIN_ACCELERATION - - -//================================================================ -// CFeelInertia -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelInertia : public CFeelCondition -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelInertia(); - - // Destructor - virtual - ~CFeelInertia(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - DWORD dwCoefficient, - DWORD dwSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwMinAcceleration = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionX = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionY = FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - ChangeParametersPolar( - DWORD dwCoefficient, - DWORD dwSaturation, - DWORD dwMinAcceleration, - LONG lAngle - ); - - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwCoefficient = FEEL_INERTIA_DEFAULT_COEFFICIENT, - DWORD dwSaturation = FEEL_INERTIA_DEFAULT_SATURATION, - DWORD dwMinAcceleration = FEEL_INERTIA_DEFAULT_MIN_ACCELERATION, - DWORD dwfAxis = FEEL_EFFECT_AXIS_BOTH, - LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y - ); - - virtual BOOL - InitializePolar( - CFeelDevice* pDevice, - DWORD dwCoefficient, - DWORD dwSaturation, - DWORD dwMinAcceleration, - LONG lAngle - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - // - // INTERNAL DATA - // - - protected: - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelInertia::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Inertia); -} - - -#endif // !defined(AFX_FEELInertia_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelMouse.h b/code/win32/FeelIt/FeelMouse.h deleted file mode 100644 index b0e3989..0000000 --- a/code/win32/FeelIt/FeelMouse.h +++ /dev/null @@ -1,143 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelMouse.h - - PURPOSE: Abstraction of Feelit mouse device - - STARTED: 10/10/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - -#ifndef FeelMouse_h -#define FeelMouse_h - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelDevice.h" - - -//================================================================ -// CFeelMouse -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelMouse : public CFeelDevice -{ - - // - // CONSTRUCTOR/DESCTRUCTOR - // - - public: - - // Constructor - CFeelMouse(); - - // Destructor - virtual - ~CFeelMouse(); - - - // - // ATTRIBUTES - // - - public: - - virtual LPIFEEL_API - GetAPI() - { return m_piApi; } - - virtual LPIFEEL_DEVICE - GetDevice() - { return m_piDevice; } - - BOOL - HaveForceFeelitMouse() - { return m_piDevice != NULL; } - - - // - // OPERATIONS - // - - public: - - BOOL - Initialize( - HANDLE hinstApp, - HANDLE hwndApp, - DWORD dwCooperativeFlag = FEELIT_FCOOPLEVEL_FOREGROUND - ); - - virtual BOOL - ChangeScreenResolution( - BOOL bAutoSet, - DWORD dwXScreenSize = 0, - DWORD dwYScreenSize = 0 - ); - - // Another syntax for SwitchToAbsoluteMode. - // The default is Absolute mode. Call only to switch to Relative mode or - // to switch back to Absolute mode. - virtual BOOL - SwitchToAbsoluteMode( - BOOL bAbsMode - ); - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - virtual void - reset(); - - virtual BOOL - prepare_device(); - - - // - // INTERNAL DATA - // - - protected: - - LPIFEEL_API m_piApi; - LPIFEEL_DEVICE m_piDevice; -}; - -#endif // ForceFeelitMouse_h \ No newline at end of file diff --git a/code/win32/FeelIt/FeelPeriodic.h b/code/win32/FeelIt/FeelPeriodic.h deleted file mode 100644 index bd870fd..0000000 --- a/code/win32/FeelIt/FeelPeriodic.h +++ /dev/null @@ -1,227 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelPeriodic.h - - PURPOSE: Base Periodic Class for Feelit API Foundation Classes - - STARTED: 11/03/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELPERIODIC_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELPERIODIC_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_PERIODIC_DEFAULT_DURATION 1000 // Milliseconds -#define FEEL_PERIODIC_DEFAULT_MAGNITUDE 5000 -#define FEEL_PERIODIC_DEFAULT_PERIOD 100 // Milliseconds -#define FEEL_PERIODIC_DEFAULT_OFFSET 0 -#define FEEL_PERIODIC_DEFAULT_PHASE 0 // Degrees -#define FEEL_PERIODIC_DEFAULT_DIRECTION_X 1 // Pixels -#define FEEL_PERIODIC_DEFAULT_DIRECTION_Y 0 // Pixels -#define FEEL_PERIODIC_DEFAULT_ANGLE 9000 // 100ths of degrees - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_PERIODIC_DEFAULT_DURATION FEEL_PERIODIC_DEFAULT_DURATION -#define FORCE_PERIODIC_DEFAULT_MAGNITUDE FEEL_PERIODIC_DEFAULT_MAGNITUDE -#define FORCE_PERIODIC_DEFAULT_PERIOD FEEL_PERIODIC_DEFAULT_PERIOD -#define FORCE_PERIODIC_DEFAULT_OFFSET FEEL_PERIODIC_DEFAULT_OFFSET -#define FORCE_PERIODIC_DEFAULT_PHASE FEEL_PERIODIC_DEFAULT_PHASE -#define FORCE_PERIODIC_DEFAULT_DIRECTION_X FEEL_PERIODIC_DEFAULT_DIRECTION_X -#define FORCE_PERIODIC_DEFAULT_DIRECTION_Y FEEL_PERIODIC_DEFAULT_DIRECTION_Y -#define FORCE_PERIODIC_DEFAULT_ANGLE FEEL_PERIODIC_DEFAULT_ANGLE - - - -//================================================================ -// CFeelPeriodic -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelPeriodic : public CFeelEffect -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructors - - // You may use this form if you will immediately initialize it - // from an IFR file... - CFeelPeriodic(); - - // Otherwise use this form... - CFeelPeriodic( - const GUID& rguidEffect - ); - - // Destructor - virtual - ~CFeelPeriodic(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - DWORD dwMagnitude, - DWORD dwPeriod = FEEL_EFFECT_DONT_CHANGE, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionX = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionY = FEEL_EFFECT_DONT_CHANGE, - LONG lOffset = FEEL_EFFECT_DONT_CHANGE, - DWORD dwPhase = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR - ); - - BOOL - ChangeParametersPolar( - DWORD dwMagnitude, - DWORD dwPeriod = FEEL_EFFECT_DONT_CHANGE, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LONG lAngle = FEEL_EFFECT_DONT_CHANGE, - LONG lOffset = FEEL_EFFECT_DONT_CHANGE, - DWORD dwPhase = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR - ); - - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - DWORD dwMagnitude = FEEL_PERIODIC_DEFAULT_MAGNITUDE, - DWORD dwPeriod = FEEL_PERIODIC_DEFAULT_PERIOD, - DWORD dwDuration = FEEL_PERIODIC_DEFAULT_DURATION, - LONG lDirectionX = FEEL_PERIODIC_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_PERIODIC_DEFAULT_DIRECTION_Y, - LONG lOffset = FEEL_PERIODIC_DEFAULT_OFFSET, - DWORD dwPhase = FEEL_PERIODIC_DEFAULT_PHASE, - LPFEEL_ENVELOPE pEnvelope = NULL - ); - - virtual BOOL - InitializePolar( - CFeelDevice* pDevice, - DWORD dwMagnitude = FEEL_PERIODIC_DEFAULT_MAGNITUDE, - DWORD dwPeriod = FEEL_PERIODIC_DEFAULT_PERIOD, - DWORD dwDuration = FEEL_PERIODIC_DEFAULT_DURATION, - LONG lAngle = FEEL_PERIODIC_DEFAULT_ANGLE, - LONG lOffset = FEEL_PERIODIC_DEFAULT_OFFSET, - DWORD dwPhase = FEEL_PERIODIC_DEFAULT_PHASE, - LPFEEL_ENVELOPE pEnvelope = NULL - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - BOOL - set_parameters( - DWORD dwfCoordinates, - LONG lDirection0, - LONG lDirection1, - DWORD dwDuration, - DWORD dwMagnitude, - DWORD dwPeriod, - LONG lOffset, - DWORD dwPhase, - LPFEEL_ENVELOPE pEnvelope - ); - - - // - // INTERNAL DATA - // - - protected: - - FEEL_PERIODIC m_Periodic; - -}; - - -// -// INLINES -// - -inline BOOL -CFeelPeriodic::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Sine) || - IsEqualGUID(guid, GUID_Feel_Square) || - IsEqualGUID(guid, GUID_Feel_Triangle) || - IsEqualGUID(guid, GUID_Feel_SawtoothUp) || - IsEqualGUID(guid, GUID_Feel_SawtoothDown); -} - -#endif // !defined(AFX_FEELPERIODIC_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelProjects.h b/code/win32/FeelIt/FeelProjects.h deleted file mode 100644 index 46768dc..0000000 --- a/code/win32/FeelIt/FeelProjects.h +++ /dev/null @@ -1,302 +0,0 @@ -/********************************************************************** - Copyright (c) 1999 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelProjects.h - - PURPOSE: CFeelProject - Manages a set of forces in a project. - There will be a project for each opened IFR file. - CFeelProjects - Manages a set of projects - - STARTED: 2/22/99 by Jeff Mallett - - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - -#ifndef __FEEL_PROJECTS_H -#define __FEEL_PROJECTS_H - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - - -#include "FFCErrors.h" -#include "FeelBaseTypes.h" -#include "FeelDevice.h" -#include "FeelCompoundEffect.h" - -class CFeelProjects; - - -//================================================================ -// CFeelProject -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelProject -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - CFeelProject() : - m_hProj(NULL), m_pCreatedEffects(NULL), - m_pNext(NULL), m_pDevice(NULL) - { } - - ~CFeelProject(); - - void - Close(); - - - // - // ATTRIBUTES - // - - public: - - CFeelDevice* - GetDevice() const - { return m_pDevice; } - - BOOL - GetIsOpen() const - { return m_hProj != NULL; } - - CFeelCompoundEffect * - GetCreatedEffect( - LPCSTR lpszEffectName - ); - - - // - // OPERATIONS - // - - public: - - BOOL - Start( - LPCSTR lpszEffectName = NULL, - DWORD dwIterations = 1, - DWORD dwFlags = 0, - CFeelDevice* pDevice = NULL - ); - - BOOL - Stop( - LPCSTR lpszEffectName = NULL - ); - - BOOL - OpenFile( - LPCSTR lpszFilePath, - CFeelDevice *pDevice - ); - - LoadProjectObjectPointer( - BYTE *pMem, - CFeelDevice *pDevice - ); - - CFeelCompoundEffect * - CreateEffect( - LPCSTR lpszEffectName, - CFeelDevice* pDevice = NULL - ); - - CFeelCompoundEffect * - CreateEffectByIndex( - int nEffectIndex, - CFeelDevice* pDevice = NULL - ); - - CFeelCompoundEffect * - AddEffect( - LPCSTR lpszEffectName, - GENERIC_EFFECT_PTR pObject - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - void - set_next( - CFeelProject *pNext - ) - { m_pNext = pNext; } - - CFeelProject * - get_next() const - { return m_pNext; } - - void - append_effect_to_list( - CFeelCompoundEffect* pEffect - ); - - IFREffect ** - create_effect_structs( - LPCSTR lpszEffectName, - int &nEff - ); - - IFREffect ** - create_effect_structs_by_index( - int nEffectIndex, - int &nEff - ); - - BOOL - release_effect_structs( - IFREffect **hEffects - ); - - // - // FRIENDS - // - - public: - - friend BOOL - CFeelEffect::InitializeFromProject( - CFeelProject &project, - LPCSTR lpszEffectName, - CFeelDevice* pDevice /* = NULL */ - ); - - friend class CFeelProjects; - - // - // INTERNAL DATA - // - - protected: - - HIFRPROJECT m_hProj; - CFeelCompoundEffect* m_pCreatedEffects; - CFeelDevice* m_pDevice; - - private: - - CFeelProject* m_pNext; -}; - - - -//================================================================ -// CFeelProjects -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelProjects -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - CFeelProjects() : m_pProjects(NULL) { } - - ~CFeelProjects(); - - void - Close(); - - - // - // ATTRIBUTES - // - - public: - - CFeelProject * - GetProject( - int index = 0 - ); - - - // - // OPERATIONS - // - - public: - - BOOL - Stop(); - - long - OpenFile( - LPCSTR lpszFilePath, - CFeelDevice *pDevice - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - - // - // INTERNAL DATA - // - protected: - - CFeelProject *m_pProjects; -}; - - - -#endif // __FEEL_PROJECTS_H diff --git a/code/win32/FeelIt/FeelRamp.h b/code/win32/FeelIt/FeelRamp.h deleted file mode 100644 index 8fd98a4..0000000 --- a/code/win32/FeelIt/FeelRamp.h +++ /dev/null @@ -1,194 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelRamp.h - - PURPOSE: Base Ramp Force Class for Feelit API Foundation Classes - - STARTED: 12/11/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELRAMP_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELRAMP_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_RAMP_DEFAULT_DURATION 1000 // Milliseconds -#define FEEL_RAMP_DEFAULT_MAGNITUDE_START 0 -#define FEEL_RAMP_DEFAULT_MAGNITUDE_END 10000 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_RAMP_DEFAULT_DURATION FEEL_RAMP_DEFAULT_DURATION -#define FORCE_RAMP_DEFAULT_MAGNITUDE_START FEEL_RAMP_DEFAULT_MAGNITUDE_START -#define FORCE_RAMP_DEFAULT_MAGNITUDE_END FEEL_RAMP_DEFAULT_MAGNITUDE_END - - -//================================================================ -// CFeelRamp -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelRamp : public CFeelEffect -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelRamp(); - - // Destructor - virtual - ~CFeelRamp(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - LONG lDirectionX, - LONG lDirectionY, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LONG lMagStart = FEEL_EFFECT_DONT_CHANGE, - LONG lMagEnd = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR - ); - - BOOL - ChangeParametersPolar( - LONG lAngle, - DWORD dwDuration = FEEL_EFFECT_DONT_CHANGE, - LONG lMagStart = FEEL_EFFECT_DONT_CHANGE, - LONG lMagEnd = FEEL_EFFECT_DONT_CHANGE, - LPFEEL_ENVELOPE pEnvelope = (LPFEEL_ENVELOPE) FEEL_EFFECT_DONT_CHANGE_PTR - ); - - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y, - DWORD dwDuration = FEEL_RAMP_DEFAULT_DURATION, - LONG lMagStart = FEEL_RAMP_DEFAULT_MAGNITUDE_START, - LONG lMagEnd = FEEL_RAMP_DEFAULT_MAGNITUDE_END, - LPFEEL_ENVELOPE pEnvelope = NULL - ); - - virtual BOOL - InitializePolar( - CFeelDevice* pDevice, - LONG lAngle = FEEL_EFFECT_DEFAULT_ANGLE, - DWORD dwDuration = FEEL_RAMP_DEFAULT_DURATION, - LONG lMagStart = FEEL_RAMP_DEFAULT_MAGNITUDE_START, - LONG lMagEnd = FEEL_RAMP_DEFAULT_MAGNITUDE_END, - LPFEEL_ENVELOPE pEnvelope = NULL - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - BOOL - set_parameters( - DWORD dwfCoordinates, - LONG lDirection0, - LONG lDirection1, - DWORD dwDuration, - LONG lMagStart, - LONG lMagEnd, - LPFEEL_ENVELOPE pEnvelope - ); - - - // - // INTERNAL DATA - // - - protected: - - FEEL_RAMPFORCE m_RampForce; - -}; - - -// -// INLINES -// - -inline BOOL -CFeelRamp::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_RampForce); -} - -#endif // !defined(AFX_FEELRAMP_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelSpring.h b/code/win32/FeelIt/FeelSpring.h deleted file mode 100644 index 617ca75..0000000 --- a/code/win32/FeelIt/FeelSpring.h +++ /dev/null @@ -1,191 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelSpring.h - - PURPOSE: Feelit API Spring Class - - STARTED: 10/10/97 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FEELSPRING_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FEELSPRING_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include -#include "FeelCondition.h" - - -//================================================================ -// Constants -//================================================================ - -#define FEEL_SPRING_DEFAULT_STIFFNESS 2500 -#define FEEL_SPRING_DEFAULT_SATURATION 10000 -#define FEEL_SPRING_DEFAULT_DEADBAND 100 -#define FEEL_SPRING_DEFAULT_CENTER_POINT FEEL_EFFECT_MOUSE_POS_AT_START -#define FEEL_SPRING_DEFAULT_DIRECTION_X 1 -#define FEEL_SPRING_DEFAULT_DIRECTION_Y 0 -#define FEEL_SPRING_DEFAULT_ANGLE 0 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_SPRING_DEFAULT_STIFFNESS FEEL_SPRING_DEFAULT_STIFFNESS -#define FORCE_SPRING_DEFAULT_SATURATION FEEL_SPRING_DEFAULT_SATURATION -#define FORCE_SPRING_DEFAULT_DEADBAND FEEL_SPRING_DEFAULT_DEADBAND -#define FORCE_SPRING_DEFAULT_CENTER_POINT FEEL_SPRING_DEFAULT_CENTER_POINT -#define FORCE_SPRING_DEFAULT_DIRECTION_X FEEL_SPRING_DEFAULT_DIRECTION_X -#define FORCE_SPRING_DEFAULT_DIRECTION_Y FEEL_SPRING_DEFAULT_DIRECTION_Y -#define FORCE_SPRING_DEFAULT_ANGLE FEEL_SPRING_DEFAULT_ANGLE - - -//================================================================ -// CFeelSpring -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelSpring : public CFeelCondition -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelSpring(); - - // Destructor - virtual - ~CFeelSpring(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - BOOL - ChangeParameters( - POINT pntCenter, - LONG lStiffness = FEEL_EFFECT_DONT_CHANGE, - DWORD dwSaturation = FEEL_EFFECT_DONT_CHANGE, - DWORD dwDeadband = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionX = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionY = FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - ChangeParametersPolar( - POINT pntCenter, - LONG lStiffness, - DWORD dwSaturation, - DWORD dwDeadband, - LONG lAngle - ); - - // - // OPERATIONS - // - - public: - - virtual BOOL - Initialize( - CFeelDevice* pDevice, - LONG lStiffness = FEEL_SPRING_DEFAULT_STIFFNESS, - DWORD dwSaturation = FEEL_SPRING_DEFAULT_SATURATION, - DWORD dwDeadband = FEEL_SPRING_DEFAULT_DEADBAND, - DWORD dwfAxis = FEEL_EFFECT_AXIS_BOTH, - POINT pntCenter = FEEL_SPRING_DEFAULT_CENTER_POINT, - LONG lDirectionX = FEEL_SPRING_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_SPRING_DEFAULT_DIRECTION_Y, - BOOL bUseDeviceCoordinates = FALSE - ); - - virtual BOOL - InitializePolar( - CFeelDevice* pDevice, - LONG lStiffness, - DWORD dwSaturation, - DWORD dwDeadband, - POINT pntCenter, - LONG lAngle, - BOOL bUseDeviceCoordinates = FALSE - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - // - // INTERNAL DATA - // - - protected: - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelSpring::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Spring); -} - -#endif // !defined(AFX_FEELSPRING_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) - diff --git a/code/win32/FeelIt/FeelTexture.h b/code/win32/FeelIt/FeelTexture.h deleted file mode 100644 index b5a72c3..0000000 --- a/code/win32/FeelIt/FeelTexture.h +++ /dev/null @@ -1,287 +0,0 @@ -/********************************************************************** - Copyright (c) 1997 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelTexture.h - - PURPOSE: Texture Class for Feelit API Foundation Classes - - STARTED: 2/27/98 - - NOTES/REVISIONS: - 3/2/99 jrm (Jeff Mallett): Force-->Feel renaming - 3/2/99 jrm: Added GetIsCompatibleGUID - 3/15/99 jrm: __declspec(dllimport/dllexport) the whole class - -**********************************************************************/ - - -#if !defined(AFX_FeelTexture_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) -#define AFX_FeelTexture_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#ifndef _FFCDLL_ -#define DLLFFC __declspec(dllimport) -#else -#define DLLFFC __declspec(dllexport) -#endif - -#include -#include "FeelBaseTypes.h" -#include "FeelEffect.h" - - - -//================================================================ -// Constants -//================================================================ - -const POINT FEEL_TEXTURE_PT_NULL = { 0, 0 }; -const POINT FEEL_TEXTURE_DEFAULT_OFFSET_POINT = { 0, 0}; - -#define FEEL_TEXTURE_DEFAULT_MAGNITUDE 5000 -#define FEEL_TEXTURE_DEFAULT_WIDTH 10 -#define FEEL_TEXTURE_DEFAULT_SPACING 20 - -// -// FORCE --> FEEL Wrappers -// -#define FORCE_TEXTURE_PT_NULL FEEL_TEXTURE_PT_NULL -#define FORCE_TEXTURE_DEFAULT_OFFSET_POINT FEEL_TEXTURE_DEFAULT_OFFSET_POINT - -#define FORCE_TEXTURE_DEFAULT_MAGNITUDE FEEL_TEXTURE_DEFAULT_MAGNITUDE -#define FORCE_TEXTURE_DEFAULT_WIDTH FEEL_TEXTURE_DEFAULT_WIDTH -#define FORCE_TEXTURE_DEFAULT_SPACING FEEL_TEXTURE_DEFAULT_SPACING - - -//================================================================ -// CFeelTexture -//================================================================ - -// -// ------ PUBLIC INTERFACE ------ -// - -class DLLFFC CFeelTexture : public CFeelEffect -{ - // - // CONSTRUCTOR/DESTRUCTOR - // - - public: - - // Constructor - CFeelTexture(); - - // Destructor - virtual - ~CFeelTexture(); - - - // - // ATTRIBUTES - // - - public: - - virtual BOOL - GetIsCompatibleGUID( - GUID &guid - ); - - // Use this form for single-axis and dual-axis effects - BOOL - ChangeTextureParams( - LPCFEELIT_TEXTURE pTextureX, - LPCFEELIT_TEXTURE pTextureY - ); - - // Use this form for directional effects - BOOL - ChangeTextureParams( - LPCFEELIT_TEXTURE pTexture, - LONG lDirectionX, - LONG lDirectionY - ); - - // Use this form for directional effects - BOOL - ChangeTextureParamsPolar( - LPCFEELIT_TEXTURE pTexture, - LONG lAngle - ); - - // Use this form for single-axis, dual-axis symetrical, or directional effects - BOOL - ChangeTextureParams( - LONG lPosBumpMag = FEEL_EFFECT_DONT_CHANGE, - DWORD dwPosBumpWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwPosBumpSpacing = FEEL_EFFECT_DONT_CHANGE, - LONG lNegBumpMag = FEEL_EFFECT_DONT_CHANGE, - DWORD dwNegBumpWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwNegBumpSpacing = FEEL_EFFECT_DONT_CHANGE, - POINT pntOffset = FEEL_EFFECT_DONT_CHANGE_POINT, - LONG lDirectionX = FEEL_EFFECT_DONT_CHANGE, - LONG lDirectionY = FEEL_EFFECT_DONT_CHANGE - ); - - // Use this form for single-axis, dual-axis symetrical, or directional effects - BOOL - ChangeTextureParamsPolar( - LONG lPosBumpMag = FEEL_EFFECT_DONT_CHANGE, - DWORD dwPosBumpWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwPosBumpSpacing = FEEL_EFFECT_DONT_CHANGE, - LONG lNegBumpMag = FEEL_EFFECT_DONT_CHANGE, - DWORD dwNegBumpWidth = FEEL_EFFECT_DONT_CHANGE, - DWORD dwNegBumpSpacing = FEEL_EFFECT_DONT_CHANGE, - POINT pntOffset = FEEL_EFFECT_DONT_CHANGE_POINT, - LONG lAngle = FEEL_EFFECT_DONT_CHANGE - ); - - BOOL - SetOffset( - POINT pntOffset - ); - - // - // OPERATIONS - // - - public: - - // Use this form for single-axis and dual-axis effects - BOOL - InitTexture( - CFeelDevice* pDevice, - LPCFEELIT_TEXTURE pTextureX, - LPCFEELIT_TEXTURE pTextureY - ); - - - // Use this form for directional effects - BOOL - InitTexture( - CFeelDevice* pDevice, - LPCFEELIT_TEXTURE pTexture, - LONG lDirectionX, - LONG lDirectionY - ); - - - // Use this form for directional effects - BOOL - InitTexturePolar( - CFeelDevice* pDevice, - LPCFEELIT_TEXTURE pTexture, - LONG lAngle - ); - - - // Use this form for single-axis, dual-axis symetrical, or directional effects - BOOL - InitTexture( - CFeelDevice* pDevice, - LONG lPosBumpMag = FEEL_TEXTURE_DEFAULT_MAGNITUDE, - DWORD dwPosBumpWidth = FEEL_TEXTURE_DEFAULT_WIDTH, - DWORD dwPosBumpSpacing = FEEL_TEXTURE_DEFAULT_SPACING, - LONG lNegBumpMag = FEEL_TEXTURE_DEFAULT_MAGNITUDE, - DWORD dwNegBumpWidth = FEEL_TEXTURE_DEFAULT_WIDTH, - DWORD dwNegBumpSpacing = FEEL_TEXTURE_DEFAULT_SPACING, - DWORD dwfAxis = FEEL_EFFECT_AXIS_BOTH, - POINT pntOffset = FEEL_TEXTURE_DEFAULT_OFFSET_POINT, - LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X, - LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y - ); - - // Use this form for directional effects - BOOL - InitTexturePolar( - CFeelDevice* pDevice, - LONG lPosBumpMag = FEEL_TEXTURE_DEFAULT_MAGNITUDE, - DWORD dwPosBumpWidth = FEEL_TEXTURE_DEFAULT_WIDTH, - DWORD dwPosBumpSpacing = FEEL_TEXTURE_DEFAULT_SPACING, - LONG lNegBumpMag = FEEL_TEXTURE_DEFAULT_MAGNITUDE, - DWORD dwNegBumpWidth = FEEL_TEXTURE_DEFAULT_WIDTH, - DWORD dwNegBumpSpacing = FEEL_TEXTURE_DEFAULT_SPACING, - POINT pntOffset = FEEL_TEXTURE_DEFAULT_OFFSET_POINT, - LONG lAngle = FEEL_EFFECT_DEFAULT_ANGLE - ); - - -// -// ------ PRIVATE INTERFACE ------ -// - - // - // HELPERS - // - - protected: - - BOOL - set_parameters( - DWORD dwfAxis, - DWORD dwfCoordinates, - LONG lDirection0, - LONG lDirection1, - LPCFEELIT_TEXTURE pTextureX, - LPCFEELIT_TEXTURE pTextureY - ); - - BOOL - set_parameters( - DWORD dwfAxis, - DWORD dwfCoordinates, - LONG lDirection0, - LONG lDirection1, - LONG lPosBumpMag, - DWORD dwPosBumpWidth, - DWORD dwPosBumpSpacing, - LONG lNegBumpMag, - DWORD dwNegBumpWidth, - DWORD dwNegBumpSpacing, - POINT pntOffset - ); - - // - // INTERNAL DATA - // - - FEEL_TEXTURE m_aTexture[2]; - DWORD m_dwfAxis; - - protected: - -}; - - - -// -// INLINES -// - -inline BOOL -CFeelTexture::GetIsCompatibleGUID(GUID &guid) -{ - return IsEqualGUID(guid, GUID_Feel_Texture); -} - -#endif // !defined(AFX_FeelTexture_H__135B88C4_4175_11D1_B049_0020AF30269A__INCLUDED_) diff --git a/code/win32/FeelIt/FeelitAPI.h b/code/win32/FeelIt/FeelitAPI.h deleted file mode 100644 index d88fc4e..0000000 --- a/code/win32/FeelIt/FeelitAPI.h +++ /dev/null @@ -1,1252 +0,0 @@ -/********************************************************************** - Copyright (c) 1997, 1998, 1999 Immersion Corporation - - Permission to use, copy, modify, distribute, and sell this - software and its documentation may be granted without fee; - interested parties are encouraged to request permission from - Immersion Corporation - 2158 Paragon Drive - San Jose, CA 95131 - 408-467-1900 - - IMMERSION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. - IN NO EVENT SHALL IMMERSION BE LIABLE FOR ANY SPECIAL, INDIRECT OR - CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - FILE: FeelitAPI.h - - PURPOSE: Feelit API - - STARTED: 09/08/97 - - NOTES/REVISIONS: - -**********************************************************************/ - -#ifndef __FEELITAPI_INCLUDED__ -#define __FEELITAPI_INCLUDED__ - -#ifndef FEELIT_VERSION -#define FEELIT_VERSION 0x0103 -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if (FEELIT_VERSION >= 0x0101) -#undef IS_VXD -#endif // FEELIT_VERSION - -#ifndef IS_VXD - -#ifdef _WIN32 -#define COM_NO_WINDOWS_H -#include -#endif - -#endif // IS_VXD not defined - - -#ifndef IS_VXD - -/**************************************************************************** - * - * Class IDs - * - ****************************************************************************/ - -DEFINE_GUID(CLSID_Feelit, 0x5959df60,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(CLSID_FeelitDevice, 0x5959df61,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - - -/**************************************************************************** - * - * Interfaces - * - ****************************************************************************/ - -DEFINE_GUID(IID_IFeelit, 0x5959df62,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(IID_IFeelitDevice, 0x5959df63,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(IID_IFeelitEffect, 0x5959df64,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(IID_IFeelitConfig, 0x900c39e0,0xcc5c,0x11d2,0x8c,0x5d,0x00,0x10,0x5a,0x17,0x8a,0xd1); - - -/**************************************************************************** - * - * Predefined object types - * - ****************************************************************************/ - -DEFINE_GUID(GUID_Feelit_XAxis, 0x5959df65,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_YAxis, 0x5959df66,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_ZAxis, 0x5959df67,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_RxAxis, 0x5959df68,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_RyAxis, 0x5959df69,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_RzAxis, 0x5959df6a,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Slider, 0x5959df6b,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -DEFINE_GUID(GUID_Feelit_Button, 0x5959df6c,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Key, 0x5959df6d,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -DEFINE_GUID(GUID_Feelit_POV, 0x5959df6e,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -DEFINE_GUID(GUID_Feelit_Unknown, 0x5959df6f,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - - -/**************************************************************************** - * - * Predefined Product GUIDs - * - ****************************************************************************/ - -DEFINE_GUID(GUID_Feelit_Mouse, 0x99bb5400,0x2b94,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -/**************************************************************************** - * - * Force feedback effects - * - ****************************************************************************/ - - -/* Constant Force */ -DEFINE_GUID(GUID_Feelit_ConstantForce,0x5959df71,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -/* Ramp Force */ -DEFINE_GUID(GUID_Feelit_RampForce, 0x5959df72,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -/* Periodic Effects */ -DEFINE_GUID(GUID_Feelit_Square, 0x5959df73,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Sine, 0x5959df74,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Triangle, 0x5959df75,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_SawtoothUp, 0x5959df76,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_SawtoothDown,0x5959df77,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - - -/* Conditions */ -DEFINE_GUID(GUID_Feelit_Spring, 0x5959df78,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_DeviceSpring,0x5959df83,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Damper, 0x5959df79,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Inertia, 0x5959df7a,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Friction, 0x5959df7b,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Texture, 0x5959df7c,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Grid, 0x5959df7d,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -/* Enclosures */ -DEFINE_GUID(GUID_Feelit_Enclosure, 0x5959df7f,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); -DEFINE_GUID(GUID_Feelit_Ellipse, 0x5959df82,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -/* Custom Force */ -DEFINE_GUID(GUID_Feelit_CustomForce, 0x5959df7e,0x2911,0x11d1,0xb0,0x49,0x00,0x20,0xaf,0x30,0x26,0x9a); - -#endif // IS_VXD not defined - -/**************************************************************************** - * - * Interfaces and Structures... - * - ****************************************************************************/ - - -/**************************************************************************** - * - * IFeelitEffect - * - ****************************************************************************/ - -#define FEELIT_FEFFECTTYPE_ALL 0x00000000 - -#define FEELIT_FEFFECTTYPE_CONSTANTFORCE 0x00000001 -#define FEELIT_FEFFECTTYPE_RAMPFORCE 0x00000002 -#define FEELIT_FEFFECTTYPE_PERIODIC 0x00000003 -#define FEELIT_FEFFECTTYPE_CONDITION 0x00000004 -#define FEELIT_FEFFECTTYPE_ENCLOSURE 0x00000005 -#define FEELIT_FEFFECTTYPE_ELLIPSE 0x00000006 -#define FEELIT_FEFFECTTYPE_TEXTURE 0x00000007 -#define FEELIT_FEFFECTTYPE_CUSTOMFORCE 0x000000F0 -#define FEELIT_FEFFECTTYPE_HARDWARE 0x000000FF - -#define FEELIT_FEFFECTTYPE_FFATTACK 0x00000200 -#define FEELIT_FEFFECTTYPE_FFFADE 0x00000400 -#define FEELIT_FEFFECTTYPE_SATURATION 0x00000800 -#define FEELIT_FEFFECTTYPE_POSNEGCOEFFICIENTS 0x00001000 -#define FEELIT_FEFFECTTYPE_POSNEGSATURATION 0x00002000 -#define FEELIT_FEFFECTTYPE_DEADBAND 0x00004000 - -#define FEELIT_EFFECTTYPE_GETTYPE(n) LOBYTE(n) -#define FEELIT_EFFECTTYPE_GETFLAGS(n) ( n & 0xFFFFFF00 ) - -#define FEELIT_DEGREES 100 -#define FEELIT_FFNOMINALMAX 10000 -#define FEELIT_SECONDS 1000000 - -typedef struct FEELIT_CONSTANTFORCE { - LONG lMagnitude; /* Magnitude of the effect, in the range -10000 to 10000 */ -} FEELIT_CONSTANTFORCE, *LPFEELIT_CONSTANTFORCE; -typedef const FEELIT_CONSTANTFORCE *LPCFEELIT_CONSTANTFORCE; - -typedef struct FEELIT_RAMPFORCE { - LONG lStart; /* Magnitude at start of effect. Range -10000 to 10000 */ - LONG lEnd; /* Magnitude at end of effect. Range -10000 to 10000 */ -} FEELIT_RAMPFORCE, *LPFEELIT_RAMPFORCE; -typedef const FEELIT_RAMPFORCE *LPCFEELIT_RAMPFORCE; - -typedef struct FEELIT_PERIODIC { - DWORD dwMagnitude; /* Magnitude of the effect, in the range 0 to 10000 */ - LONG lOffset; /* Force will be gen'd in range lOffset - dwMagnitude to lOffset + dwMagnitude */ - DWORD dwPhase; /* Position in cycle at wich playback begins. Range 0 - 35,999 */ - DWORD dwPeriod; /* Period (length of one cycle) of the effect in microseconds */ -} FEELIT_PERIODIC, *LPFEELIT_PERIODIC; -typedef const FEELIT_PERIODIC *LPCFEELIT_PERIODIC; - -typedef struct FEELIT_CONDITION { - LONG lCenter; /* Center-point in screen coords. Axis depends on that in FEELIT_EFFECT */ - LONG lPositiveCoefficient; /* Coef. on pos. side of the offset. Range -10000 to 10000 */ - LONG lNegativeCoefficient; /* Coef. on neg. side of the offset. Range -10000 to 10000 */ - DWORD dwPositiveSaturation; /* Max force output on pos. side of offset. Range 0 to 10000 */ - DWORD dwNegativeSaturation; /* Max force output on neg. side of offset. Range 0 to 10000 */ - LONG lDeadBand; /* Region around lOffset where condition is not active. Range 0 to 10000 */ -} FEELIT_CONDITION, *LPFEELIT_CONDITION; -typedef const FEELIT_CONDITION *LPCFEELIT_CONDITION; - -typedef struct FEELIT_TEXTURE { - DWORD dwSize; /* sizeof(FEELIT_TEXTURE) */ - LONG lOffset; /* Offset in screen coords of first texture from left or top edge */ - LONG lPosBumpMag; /* Magnitude of bumps felt when mouse travels in positive direction */ - DWORD dwPosBumpWidth; /* Width of bumps felt when mouse travels in positive direction */ - DWORD dwPosBumpSpacing; /* Center-to-Center spacing of bumps felt when mouse travels in positive direction */ - LONG lNegBumpMag; /* Magnitude of bumps felt when mouse travels in negative direction */ - DWORD dwNegBumpWidth; /* Width of bumps felt when mouse travels in negative direction */ - DWORD dwNegBumpSpacing; /* Center-to-Center spacing of bumps felt when mouse travels in negative direction */ -} FEELIT_TEXTURE, *LPFEELIT_TEXTURE; -typedef const FEELIT_TEXTURE *LPCFEELIT_TEXTURE; - -typedef struct FEELIT_CUSTOMFORCE { - DWORD cChannels; /* No. of channels (axes) affected by this force */ - DWORD dwSamplePeriod; /* Sample period in microseconds */ - DWORD cSamples; /* Total number of samples in the rglForceData */ - LPLONG rglForceData; /* long[cSamples]. Array of force values. Channels are interleaved */ -} FEELIT_CUSTOMFORCE, *LPFEELIT_CUSTOMFORCE; -typedef const FEELIT_CUSTOMFORCE *LPCFEELIT_CUSTOMFORCE; - -typedef struct FEELIT_ENVELOPE { - DWORD dwSize; /* sizeof(FEELIT_ENVELOPE) */ - DWORD dwAttackLevel; /* Ampl. for start of env., rel. to baseline. Range 0 to 10000 */ - DWORD dwAttackTime; /* Time, in microseconds, to reach sustain level */ - DWORD dwFadeLevel; /* Ampl. for end of env., rel. to baseline. Range 0 to 10000 */ - DWORD dwFadeTime; /* Time, in microseconds, to reach fade level */ -} FEELIT_ENVELOPE, *LPFEELIT_ENVELOPE; -typedef const FEELIT_ENVELOPE *LPCFEELIT_ENVELOPE; - -typedef struct FEELIT_EFFECT { - DWORD dwSize; /* sizeof(FEELIT_EFFECT) */ - GUID guidEffect; /* Effect Identifier */ - DWORD dwFlags; /* FEELIT_FEFFECT_* */ - DWORD dwDuration; /* Microseconds */ - DWORD dwSamplePeriod; /* RESERVED */ - DWORD dwGain; /* RESERVED */ - DWORD dwTriggerButton; /* RESERVED */ - DWORD dwTriggerRepeatInterval; /* RESERVED */ - DWORD cAxes; /* Number of axes */ - LPDWORD rgdwAxes; /* Array of axes */ - LPLONG rglDirection; /* Array of directions */ - LPFEELIT_ENVELOPE lpEnvelope; /* Optional */ - DWORD cbTypeSpecificParams; /* Size of params */ - LPVOID lpvTypeSpecificParams; /* Pointer to params */ - DWORD dwStartDelay; /* Microseconds delay */ -} FEELIT_EFFECT, *LPFEELIT_EFFECT; -typedef const FEELIT_EFFECT *LPCFEELIT_EFFECT; - - -/* Effect Flags */ -#define FEELIT_FEFFECT_OBJECTIDS 0x00000001 -#define FEELIT_FEFFECT_OBJECTOFFSETS 0x00000002 -#define FEELIT_FEFFECT_CARTESIAN 0x00000010 -#define FEELIT_FEFFECT_POLAR 0x00000020 -#define FEELIT_FEFFECT_SPHERICAL 0x00000040 - -/* Parameter Flags */ -#define FEELIT_FPARAM_DURATION 0x00000001 -#define FEELIT_FPARAM_SAMPLEPERIOD 0x00000002 -#define FEELIT_FPARAM_GAIN 0x00000004 -#define FEELIT_FPARAM_TRIGGERBUTTON 0x00000008 -#define FEELIT_FPARAM_TRIGGERREPEATINTERVAL 0x00000010 -#define FEELIT_FPARAM_AXES 0x00000020 -#define FEELIT_FPARAM_DIRECTION 0x00000040 -#define FEELIT_FPARAM_ENVELOPE 0x00000080 -#define FEELIT_FPARAM_TYPESPECIFICPARAMS 0x00000100 -#define FEELIT_FPARAM_STARTDELAY 0x00000200 -#define FEELIT_FPARAM_ALLPARAMS 0x000003FF -#define FEELIT_FPARAM_START 0x20000000 -#define FEELIT_FPARAM_NORESTART 0x40000000 -#define FEELIT_FPARAM_NODOWNLOAD 0x80000000 - -#define FEELIT_PARAM_NOTRIGGER 0xFFFFFFFF - -/* Start Flags */ -#define FEELIT_FSTART_SOLO 0x00000001 -#define FEELIT_FSTART_NODOWNLOAD 0x80000000 - -/* Status Flags */ -#define FEELIT_FSTATUS_PLAYING 0x00000001 -#define FEELIT_FSTATUS_EMULATED 0x00000002 - -/* Stiffness Mask Flags */ -#define FEELIT_FSTIFF_NONE 0x00000000 -#define FEELIT_FSTIFF_OUTERLEFTWALL 0x00000001 -#define FEELIT_FSTIFF_INNERLEFTWALL 0x00000002 -#define FEELIT_FSTIFF_INNERRIGHTWALL 0x00000004 -#define FEELIT_FSTIFF_OUTERRIGHTWALL 0x00000008 -#define FEELIT_FSTIFF_OUTERTOPWALL 0x00000010 -#define FEELIT_FSTIFF_INNERTOPWALL 0x00000020 -#define FEELIT_FSTIFF_INNERBOTTOMWALL 0x00000040 -#define FEELIT_FSTIFF_OUTERBOTTOMWALL 0x00000080 -#define FEELIT_FSTIFF_OUTERANYWALL ( FEELIT_FSTIFF_OUTERTOPWALL | FEELIT_FSTIFF_OUTERBOTTOMWALL | FEELIT_FSTIFF_OUTERLEFTWALL | FEELIT_FSTIFF_OUTERRIGHTWALL ) -#define FEELIT_FSTIFF_INBOUNDANYWALL FEELIT_FSTIFF_OUTERANYWALL -#define FEELIT_FSTIFF_INNERANYWALL ( FEELIT_FSTIFF_INNERTOPWALL | FEELIT_FSTIFF_INNERBOTTOMWALL | FEELIT_FSTIFF_INNERLEFTWALL | FEELIT_FSTIFF_INNERRIGHTWALL ) -#define FEELIT_FSTIFF_OUTBOUNDANYWALL FEELIT_FSTIFF_INNERANYWALL -#define FEELIT_FSTIFF_ANYWALL ( FEELIT_FSTIFF_OUTERANYWALL | FEELIT_FSTIFF_INNERANYWALL ) - -/* Clipping Mask Flags */ -#define FEELIT_FCLIP_NONE 0x00000000 -#define FEELIT_FCLIP_OUTERLEFTWALL 0x00000001 -#define FEELIT_FCLIP_INNERLEFTWALL 0x00000002 -#define FEELIT_FCLIP_INNERRIGHTWALL 0x00000004 -#define FEELIT_FCLIP_OUTERRIGHTWALL 0x00000008 -#define FEELIT_FCLIP_OUTERTOPWALL 0x00000010 -#define FEELIT_FCLIP_INNERTOPWALL 0x00000020 -#define FEELIT_FCLIP_INNERBOTTOMWALL 0x00000040 -#define FEELIT_FCLIP_OUTERBOTTOMWALL 0x00000080 -#define FEELIT_FCLIP_OUTERANYWALL ( FEELIT_FCLIP_OUTERTOPWALL | FEELIT_FCLIP_OUTERBOTTOMWALL | FEELIT_FCLIP_OUTERLEFTWALL | FEELIT_FCLIP_OUTERRIGHTWALL ) -#define FEELIT_FCLIP_INNERANYWALL ( FEELIT_FCLIP_INNERTOPWALL | FEELIT_FCLIP_INNERBOTTOMWALL | FEELIT_FCLIP_INNERLEFTWALL | FEELIT_FCLIP_INNERRIGHTWALL ) -#define FEELIT_FCLIP_ANYWALL ( FEELIT_FCLIP_OUTERANYWALL | FEELIT_FCLIP_INNERANYWALL ) - -typedef struct FEELIT_EFFESCAPE { - DWORD dwSize; /* sizeof( FEELIT_EFFESCAPE ) */ - DWORD dwCommand; /* Driver-specific command number */ - LPVOID lpvInBuffer; /* Buffer containing data required to perform the operation */ - DWORD cbInBuffer; /* Size, in bytes, of lpvInBuffer */ - LPVOID lpvOutBuffer; /* Buffer in which the operation's output data is returned */ - DWORD cbOutBuffer; /* Size, in bytes, of lpvOutBuffer */ -} FEELIT_EFFESCAPE, *LPFEELIT_EFFESCAPE; - - -#ifndef IS_VXD - -#undef INTERFACE -#define INTERFACE IFeelitEffect - -DECLARE_INTERFACE_(IFeelitEffect, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IFeelitEffect methods ***/ - STDMETHOD(GetEffectGuid)(THIS_ LPGUID) PURE; - STDMETHOD(GetParameters)(THIS_ LPFEELIT_EFFECT,DWORD) PURE; - STDMETHOD(SetParameters)(THIS_ LPCFEELIT_EFFECT,DWORD) PURE; - STDMETHOD(Start)(THIS_ DWORD,DWORD) PURE; - STDMETHOD(Stop)(THIS) PURE; - STDMETHOD(GetEffectStatus)(THIS_ LPDWORD) PURE; - STDMETHOD(Download)(THIS) PURE; - STDMETHOD(Unload)(THIS) PURE; - STDMETHOD(Escape)(THIS_ LPFEELIT_EFFESCAPE) PURE; -}; - -typedef struct IFeelitEffect *LPIFEELIT_EFFECT; - - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IFeelitEffect_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IFeelitEffect_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IFeelitEffect_Release(p) (p)->lpVtbl->Release(p) -#define IFeelitEffect_GetEffectGuid(p,a) (p)->lpVtbl->GetEffectGuid(p,a) -#define IFeelitEffect_GetParameters(p,a,b) (p)->lpVtbl->GetParameters(p,a,b) -#define IFeelitEffect_SetParameters(p,a,b) (p)->lpVtbl->SetParameters(p,a,b) -#define IFeelitEffect_Start(p,a,b) (p)->lpVtbl->Start(p,a,b) -#define IFeelitEffect_Stop(p) (p)->lpVtbl->Stop(p) -#define IFeelitEffect_GetEffectStatus(p,a) (p)->lpVtbl->GetEffectStatus(p,a) -#define IFeelitEffect_Download(p) (p)->lpVtbl->Download(p) -#define IFeelitEffect_Unload(p) (p)->lpVtbl->Unload(p) -#define IFeelitEffect_Escape(p,a) (p)->lpVtbl->Escape(p,a) -#else -#define IFeelitEffect_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IFeelitEffect_AddRef(p) (p)->AddRef() -#define IFeelitEffect_Release(p) (p)->Release() -#define IFeelitEffect_GetEffectGuid(p,a) (p)->GetEffectGuid(a) -#define IFeelitEffect_GetParameters(p,a,b) (p)->GetParameters(a,b) -#define IFeelitEffect_SetParameters(p,a,b) (p)->SetParameters(a,b) -#define IFeelitEffect_Start(p,a,b) (p)->Start(a,b) -#define IFeelitEffect_Stop(p) (p)->Stop() -#define IFeelitEffect_GetEffectStatus(p,a) (p)->GetEffectStatus(a) -#define IFeelitEffect_Download(p) (p)->Download() -#define IFeelitEffect_Unload(p) (p)->Unload() -#define IFeelitEffect_Escape(p,a) (p)->Escape(a) -#endif - - -typedef struct FEELIT_ENCLOSURE { - DWORD dwSize; /* sizeof(FEELIT_ENCLOSURE) */ - RECT rectBoundary; /* Rectangle defining the boundaries of the effect, in screen coords */ - DWORD dwTopAndBottomWallThickness; /* Thickness (pixels) of top/bottom walls. Must be < rectOutside.Height()/2 */ - DWORD dwLeftAndRightWallThickness; /* Thickness (pixels) of left/right walls. Must be < rectOutside.Width()/2 */ - LONG lTopAndBottomWallStiffness; /* Stiffness of horizontal borders */ - LONG lLeftAndRightWallStiffness; /* Stiffness of vertical borders */ - DWORD dwStiffnessMask; /* Borders where stiffness is turned on (FEELIT_FSTIFF*) */ - DWORD dwClippingMask; /* Borders where clipping is turned on (FEELIT_FCLIP*) */ - DWORD dwTopAndBottomWallSaturation; /* Saturation level of spring effect for top/bottom borders */ - DWORD dwLeftAndRightWallSaturation; /* Saturation level of spring effect for left/right borders */ - LPIFEELIT_EFFECT piInsideEffect; /* Interface pointer to effect active in inner area of the enclosure */ -} FEELIT_ENCLOSURE, *LPFEELIT_ENCLOSURE; -typedef const FEELIT_ENCLOSURE *LPCFEELIT_ENCLOSURE; - - -typedef struct FEELIT_ELLIPSE { - DWORD dwSize; /* sizeof(FEELIT_ELLIPSE) */ - RECT rectBoundary; /* Rectangle which circumscribes the ellipse (screen coords) */ - DWORD dwWallThickness; /* Thickness (pixels) of ellipse wall at its thickest point */ - LONG lStiffness; /* Stiffness of ellipse borders */ - DWORD dwStiffnessMask; /* Borders where stiffness is turned on (FEELIT_FSTIFF*) */ - DWORD dwClippingMask; /* Borders where clipping is turned on (FEELIT_FCLIP*) */ - DWORD dwSaturation; /* Saturation level of spring effect for ellipse borders */ - LPIFEELIT_EFFECT piInsideEffect; /* Interface pointer to effect active in inner area of the ellipse */ -} FEELIT_ELLIPSE, *LPFEELIT_ELLIPSE; -typedef const FEELIT_ELLIPSE *LPCFEELIT_ELLIPSE; - -#endif // IS_VXD - -/**************************************************************************** - * - * IFeelitDevice - * - ****************************************************************************/ - -/* Device types */ -#define FEELIT_DEVICETYPE_DEVICE 1 -#define FEELIT_DEVICETYPE_MOUSE 2 -#define FEELIT_DEVICETYPE_HID 0x00010000 - -/* Device subtypes */ -#define FEELIT_DEVICETYPEMOUSE_UNKNOWN 1 -#define FEELIT_DEVICETYPEMOUSE_TRADITIONAL_FF 2 - -/* Device type macros */ -#define GET_FEELIT_DEVICE_TYPE(dwDevType) LOBYTE(dwDevType) -#define GET_FEELIT_DEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType) - -typedef struct FEELIT_DEVCAPS { - DWORD dwSize; /* sizeof( FEELIT_DEVCAPS ) */ - DWORD dwFlags; /* FEELIT_FDEVCAPS_* */ - DWORD dwDevType; /* FEELIT_DEVICETYPE* */ - DWORD dwAxes; /* No. of axes available on the device */ - DWORD dwButtons; /* No. of buttons available on the device */ - DWORD dwPOVs; /* No. of point-of-view controllers on the device */ - DWORD dwFFSamplePeriod; /* Min. time btwn playback of consec. raw force commands */ - DWORD dwFFMinTimeResolution; /* Min. time, in microseconds, the device can resolve */ - DWORD dwFirmwareRevision; /* Firmware revision number of the device */ - DWORD dwHardwareRevision; /* Hardware revision number of the device */ - DWORD dwFFDriverVersion; /* Version number of the device driver */ -} FEELIT_DEVCAPS, *LPFEELIT_DEVCAPS; -typedef const FEELIT_DEVCAPS *LPCFEELIT_DEVCAPS; - -/* Device capabilities flags */ -#define FEELIT_FDEVCAPS_ATTACHED 0x00000001 -#define FEELIT_FDEVCAPS_POLLEDDEVICE 0x00000002 -#define FEELIT_FDEVCAPS_EMULATED 0x00000004 -#define FEELIT_FDEVCAPS_POLLEDDATAFORMAT 0x00000008 -#define FEELIT_FDEVCAPS_FORCEFEEDBACK 0x00000100 -#define FEELIT_FDEVCAPS_FFATTACK 0x00000200 -#define FEELIT_FDEVCAPS_FFFADE 0x00000400 -#define FEELIT_FDEVCAPS_SATURATION 0x00000800 -#define FEELIT_FDEVCAPS_POSNEGCOEFFICIENTS 0x00001000 -#define FEELIT_FDEVCAPS_POSNEGSATURATION 0x00002000 -#define FEELIT_FDEVCAPS_DEADBAND 0x00004000 - - -/* Data Format Type Flags */ - -#define FEELIT_FOBJDATAFMT_ALL 0x00000000 - -#define FEELIT_FOBJDATAFMT_RELAXIS 0x00000001 -#define FEELIT_FOBJDATAFMT_ABSAXIS 0x00000002 -#define FEELIT_FOBJDATAFMT_AXIS 0x00000003 - -#define FEELIT_FOBJDATAFMT_PSHBUTTON 0x00000004 -#define FEELIT_FOBJDATAFMT_TGLBUTTON 0x00000008 -#define FEELIT_FOBJDATAFMT_BUTTON 0x0000000C - -#define FEELIT_FOBJDATAFMT_POV 0x00000010 - -#define FEELIT_FOBJDATAFMT_COLLECTION 0x00000040 -#define FEELIT_FOBJDATAFMT_NODATA 0x00000080 -#define FEELIT_FOBJDATAFMT_FFACTUATOR 0x01000000 -#define FEELIT_FOBJDATAFMT_FFEFFECTTRIGGER 0x02000000 -#define FEELIT_FOBJDATAFMT_NOCOLLECTION 0x00FFFF00 - -#define FEELIT_FOBJDATAFMT_ANYINSTANCE 0x00FFFF00 -#define FEELIT_FOBJDATAFMT_INSTANCEMASK FEELIT_FOBJDATAFMT_ANYINSTANCE - - -/* Data Format Type Macros */ -#define FEELIT_OBJDATAFMT_MAKEINSTANCE(n) ((WORD)(n) << 8) -#define FEELIT_OBJDATAFMT_GETTYPE(n) LOBYTE(n) -#define FEELIT_OBJDATAFMT_GETINSTANCE(n) LOWORD((n) >> 8) -#define FEELIT_OBJDATAFMT_ENUMCOLLECTION(n) ((WORD)(n) << 8) - -#ifndef IS_VXD - -typedef struct _FEELIT_OBJECTDATAFORMAT { - const GUID *pguid; /* Unique ID for the axis, button, or other input source. */ - DWORD dwOfs; /* Offset in data packet where input source data is stored */ - DWORD dwType; /* Device type describing the object. (FEELIT_FOBJDATAFMT_*) */ - DWORD dwFlags; /* Aspect flags. Zero or more of FEELIT_FDEVOBJINST_ASPECT* */ -} FEELIT_OBJECTDATAFORMAT, *LPFEELIT_OBJECTDATAFORMAT; -typedef const FEELIT_OBJECTDATAFORMAT *LPCFEELIT_OBJECTDATAFORMAT; - -typedef struct _FEELIT_DATAFORMAT { - DWORD dwSize; /* sizeof( FEELIT_DATAFORMAT ) */ - DWORD dwObjSize; /* sizeof( FEELIT_OBJECTDATAFORMAT ) */ - DWORD dwFlags; /* One of FEELIT_FDATAFORMAT_* */ - DWORD dwDataSize; /* Size, in bytes, of data packet returned by the device */ - DWORD dwNumObjs; /* Number of object in the rgodf array */ - LPFEELIT_OBJECTDATAFORMAT rgodf; /* Ptr to array of FEELIT_OBJECTDATAFORMAT */ -} FEELIT_DATAFORMAT, *LPFEELIT_DATAFORMAT; -typedef const FEELIT_DATAFORMAT *LPCFEELIT_DATAFORMAT; - -/* Data Format Flags */ -#define FEELIT_FDATAFORMAT_ABSAXIS 0x00000001 -#define FEELIT_FDATAFORMAT_RELAXIS 0x00000002 - -/* Predefined Data Formats */ -extern const FEELIT_DATAFORMAT c_dfFeelitMouse; - -typedef struct FEELIT_DEVICEOBJECTINSTANCE { - DWORD dwSize; /* sizeof( FEELIT_DEVICEOBJECTINSTANCE ) */ - GUID guidType; /* Optional unique ID indicating object type */ - DWORD dwOfs; /* Offset within data format for data from this object */ - DWORD dwType; /* Device type describing the object. (FEELIT_FOBJDATAFMT_*) */ - DWORD dwFlags; /* Zero or more of FEELIT_FDEVOBJINST_* */ - CHAR tszName[MAX_PATH]; /* Name of object (e.g. "X-Axis") */ - DWORD dwFFMaxForce; /* Mag. of max force created by actuator for this object */ - DWORD dwFFForceResolution; /* Force resolution of the actuator for this object */ - WORD wCollectionNumber; /* RESERVED */ - WORD wDesignatorIndex; /* RESERVED */ - WORD wUsagePage; /* HID usage page associated with the object */ - WORD wUsage; /* HID usage associated with the object */ - DWORD dwDimension; /* Dimensional units in which object's value is reported */ - WORD wExponent; /* Exponent to associate with the demension */ - WORD wReserved; -} FEELIT_DEVICEOBJECTINSTANCE, *LPFEELIT_DEVICEOBJECTINSTANCE; -typedef const FEELIT_DEVICEOBJECTINSTANCE *LPCFEELIT_DEVICEOBJECTINSTANCE; - -typedef BOOL (FAR PASCAL * LPFEELIT_ENUMDEVICEOBJECTSCALLBACK)(LPCFEELIT_DEVICEOBJECTINSTANCE, LPVOID); - -/* Device Object Instance Flags */ -#define FEELIT_FDEVOBJINST_FFACTUATOR 0x00000001 -#define FEELIT_FDEVOBJINST_FFEFFECTTRIGGER 0x00000002 -#define FEELIT_FDEVOBJINST_POLLED 0x00008000 -#define FEELIT_FDEVOBJINST_ASPECTPOSITION 0x00000100 -#define FEELIT_FDEVOBJINST_ASPECTVELOCITY 0x00000200 -#define FEELIT_FDEVOBJINST_ASPECTACCEL 0x00000300 -#define FEELIT_FDEVOBJINST_ASPECTFORCE 0x00000400 -#define FEELIT_FDEVOBJINST_ASPECTMASK 0x00000F00 - -#endif // IS_VXD - -typedef struct FEELIT_PROPHEADER { - DWORD dwSize; /* Size of enclosing struct, to which this struct is header */ - DWORD dwHeaderSize; /* sizeof ( FEELIT_PROPHEADER ) */ - DWORD dwObj; /* Object for which the property is to be accessed */ - DWORD dwHow; /* Specifies how dwObj is interpreted. ( FEELIT_FPROPHEADER_* ) */ -} FEELIT_PROPHEADER, *LPFEELIT_PROPHEADER; -typedef const FEELIT_PROPHEADER *LPCFEELIT_PROPHEADER; - -/* Prop header flags */ -#define FEELIT_FPROPHEADER_DEVICE 0 -#define FEELIT_FPROPHEADER_BYOFFSET 1 -#define FEELIT_FPROPHEADER_BYID 2 - -typedef struct FEELIT_PROPDWORD { - FEELIT_PROPHEADER feelitph; /* Feelit property header struct */ - DWORD dwData; /* Property-specific value being retrieved */ -} FEELIT_PROPDWORD, *LPFEELIT_PROPDWORD; -typedef const FEELIT_PROPDWORD *LPCFEELIT_PROPDWORD; - -typedef struct FEELIT_PROPRANGE { - FEELIT_PROPHEADER feelitph; /* Feelit property header struct */ - LONG lMin; /* Lower limit of range, inclusive */ - LONG lMax; /* Upper limit of range, inclusive */ -} FEELIT_PROPRANGE, *LPFEELIT_PROPRANGE; -typedef const FEELIT_PROPRANGE *LPCFEELIT_PROPRANGE; - -#define FEELIT_PROPRANGE_NOMIN ((LONG)0x80000000) -#define FEELIT_PROPRANGE_NOMAX ((LONG)0x7FFFFFFF) - -#ifdef __cplusplus -#define MAKE_FEELIT_PROP(prop) (*(const GUID *)(prop)) -#else -#define MAKE_FEELIT_PROP(prop) ((REFGUID)(prop)) -#endif - -#define FEELIT_PROP_BUFFERSIZE MAKE_FEELIT_PROP(1) - -#define FEELIT_PROP_AXISMODE MAKE_FEELIT_PROP(2) - -#define FEELIT_PROPAXISMODE_ABS 0 -#define FEELIT_PROPAXISMODE_REL 1 - -#define FEELIT_PROP_GRANULARITY MAKE_FEELIT_PROP(3) - -#define FEELIT_PROP_RANGE MAKE_FEELIT_PROP(4) - -#define FEELIT_PROP_DEADZONE MAKE_FEELIT_PROP(5) - -#define FEELIT_PROP_SATURATION MAKE_FEELIT_PROP(6) - -#define FEELIT_PROP_FFGAIN MAKE_FEELIT_PROP(7) - -#define FEELIT_PROP_FFLOAD MAKE_FEELIT_PROP(8) - -#define FEELIT_PROP_AUTOCENTER MAKE_FEELIT_PROP(9) - -#define FEELIT_PROPAUTOCENTER_OFF 0 -#define FEELIT_PROPAUTOCENTER_ON 1 - -#define FEELIT_PROP_CALIBRATIONMODE MAKE_FEELIT_PROP(10) - -#define FEELIT_PROPCALIBRATIONMODE_COOKED 0 -#define FEELIT_PROPCALIBRATIONMODE_RAW 1 - -// Device configuration/control, for use by control panels - -#define FEELIT_PROP_DEVICEGAIN MAKE_FEELIT_PROP(11) -#define FEELIT_PROP_BALLISTICS MAKE_FEELIT_PROP(12) - -typedef struct FEELIT_PROPBALLISTICS { - FEELIT_PROPHEADER feelitph; /* Feelit property header struct */ - INT Sensitivity; /* Property-specific value */ - INT LowThreshhold; /* Property-specific value */ - INT HighThreshhold; /* Property-specific value */ -} FEELIT_PROPBALLISTICS, *LPFEELIT_PROPBALLISTICS; -typedef const FEELIT_PROPBALLISTICS *LPCFEELIT_PROPBALLISTICS; - -#define FEELIT_PROP_SCREENSIZE MAKE_FEELIT_PROP(13) - -typedef struct FEELIT_PROPSCREENSIZE { - FEELIT_PROPHEADER feelitph; /* Feelit property header struct */ - DWORD dwXScreenSize; /* Max X screen coord value */ - DWORD dwYScreenSize; /* Max Y screen coord value */ -} FEELIT_PROPSCREENSIZE, *LPFEELIT_PROPSCREENSIZE; -typedef const FEELIT_PROPSCREENSIZE *LPCFEELIT_PROPSCREENSIZE; - -#define FEELIT_PROP_ABSOLUTEMODE MAKE_FEELIT_PROP(14) - -typedef struct FEELIT_PROPABSOLUTEMODE { - FEELIT_PROPHEADER feelitph; /* Feelit property header struct */ - BOOL bAbsMode; /* TRUE for Absolute mode FALSE for Relative mode */ -} FEELIT_PROPABSOLUTEMODE, *LPFEELIT_PROPABSOLUTEMODE; -typedef const FEELIT_PROPABSOLUTEMODE *LPCFEELIT_PROPABSOLUTEMODE; - - -#define FEELIT_PROP_DEVICEMODE MAKE_FEELIT_PROP(15) -#define FEELIT_PROPDEVICEMODE_MOUSE 1 -#define FEELIT_PROPDEVICEMODE_JOYSTICK 2 - - -typedef struct FEELIT_DEVICEOBJECTDATA { - DWORD dwOfs; /* Offset into current data format of this data's object */ - DWORD dwData; /* Data obtained from the device */ - DWORD dwTimeStamp; /* Tick count, in milliseconds, at which event was generated */ - DWORD dwSequence; /* Sequence number for this event */ -} FEELIT_DEVICEOBJECTDATA, *LPFEELIT_DEVICEOBJECTDATA; -typedef const FEELIT_DEVICEOBJECTDATA *LPCFEELIT_DEVICEOBJECTDATA; - -#define FEELIT_SEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \ - ((int)((dwSequence1) - (dwSequence2)) cmp 0) - -/* GetDeviceData Flags */ -#define FEELIT_FGETDEVDATA_PEEK 0x00000001 - -/* Cooperative Level Flags */ -#define FEELIT_FCOOPLEVEL_FOREGROUND 0x00000004 -#define FEELIT_FCOOPLEVEL_BACKGROUND 0x00000008 - -#ifndef IS_VXD - -typedef struct FEELIT_DEVICEINSTANCE { - DWORD dwSize; /* sizeof ( FEELIT_DEVICEINSTANCE ) */ - GUID guidInstance; /* Unique id for instance of device */ - GUID guidProduct; /* Unique id for the product */ - DWORD dwDevType; /* Device type (FEELIT_DEVICETYPE*) */ - CHAR tszInstanceName[MAX_PATH]; /* Friendly name for the instance (e.g. "Feelit Mouse 1") */ - CHAR tszProductName[MAX_PATH]; /* Friendly name for the product (e.g. "Feelit Mouse") */ - GUID guidFFDriver; /* Unique id for the driver being used for force feedback */ - WORD wUsagePage; /* HID usage page code (if the device driver is a HID device) */ - WORD wUsage; /* HID usage code (if the device driver is a HID device) */ -} FEELIT_DEVICEINSTANCE, *LPFEELIT_DEVICEINSTANCE; -typedef const FEELIT_DEVICEINSTANCE *LPCFEELIT_DEVICEINSTANCE; - -#endif // IS_VXD - -#define FEELIT_FCOMMAND_RESET 0x00000001 -#define FEELIT_FCOMMAND_STOPALL 0x00000002 -#define FEELIT_FCOMMAND_PAUSE 0x00000004 -#define FEELIT_FCOMMAND_CONTINUE 0x00000008 -#define FEELIT_FCOMMAND_SETACTUATORSON 0x00000010 -#define FEELIT_FCOMMAND_SETACTUATORSOFF 0x00000020 - -#define FEELIT_FDEVICESTATE_EMPTY 0x00000001 -#define FEELIT_FDEVICESTATE_STOPPED 0x00000002 -#define FEELIT_FDEVICESTATE_PAUSED 0x00000004 -#define FEELIT_FDEVICESTATE_ACTUATORSON 0x00000010 -#define FEELIT_FDEVICESTATE_ACTUATORSOFF 0x00000020 -#define FEELIT_FDEVICESTATE_POWERON 0x00000040 -#define FEELIT_FDEVICESTATE_POWEROFF 0x00000080 -#define FEELIT_FDEVICESTATE_SAFETYSWITCHON 0x00000100 -#define FEELIT_FDEVICESTATE_SAFETYSWITCHOFF 0x00000200 -#define FEELIT_FDEVICESTATE_USERFFSWITCHON 0x00000400 -#define FEELIT_FDEVICESTATE_USERFFSWITCHOFF 0x00000800 -#define FEELIT_FDEVICESTATE_DEVICELOST 0x80000000 - -#ifndef IS_VXD - -typedef struct FEELIT_EFFECTINFO { - DWORD dwSize; /* sizeof( FEELIT_EFFECTINFO ) */ - GUID guid; /* Unique ID of the effect */ - DWORD dwEffType; /* Zero or more of FEELIT_FEFFECTTYPE_* */ - DWORD dwStaticParams; /* All params supported. Zero or more of FEELIT_FPARAM_* */ - DWORD dwDynamicParams; /* Params modifiable while effect playing. (FEELIT_FPARAM_*) */ - CHAR tszName[MAX_PATH]; /* Name of effect (e.g. "Enclosure" ) */ -} FEELIT_EFFECTINFO, *LPFEELIT_EFFECTINFO; -typedef const FEELIT_EFFECTINFO *LPCFEELIT_EFFECTINFO; - -typedef BOOL (FAR PASCAL * LPFEELIT_ENUMEFFECTSCALLBACK)(LPCFEELIT_EFFECTINFO, LPVOID); -typedef BOOL (FAR PASCAL * LPFEELIT_ENUMCREATEDEFFECTOBJECTSCALLBACK)(LPFEELIT_EFFECT, LPVOID); - -#endif // IS_VXD - - -/* - Feelit Events - -Feelit events are defined using a FEELIT_EVENT struct. They are created by -passing the struct to CreateFeelitEvent, which returns an HFEELITEVENT handle. -Feelit notifies clients that Feelit Event has triggered by sending a message to -the window handle associated with the event. Window handles are associated with -events using the hWndEventHandler param. of the FEELIT_EVENT struct. The window -message that Feelit sends to notify of an event, contains information in the -WPARAM and LPARAM as described below. - -DURING INITIALIZATION: -const UINT g_wmFeelitEvent = RegisterWindowMessage( FEELIT_EVENT_MSG_STRING ); - -IN MESSAGE LOOP: -if ( msgID == g_wmFeelitEvent ) -{ - WORD wRef = LOWORD(wParam); // 16-bit app-defined event id - WORD wfTriggers = HIWORD(wParam); // Trigger Flags - short xForce = (short) LOWORD(lParam); // Force applied along X-axis - short yForce = (short) HIWORD(lParam); // Force applied along Y-axis -} - -*/ - -#define FEELIT_EVENT_MSG_STRING "FEELIT_EVENT_MSG" - -typedef HANDLE HFEELITEVENT, *LPHFEELITEVENT; /* Handle type used to manage Feelit Events */ - -typedef struct FEELIT_EVENT { - DWORD dwSize; /* sizeof(FEELIT_EVENT) */ - HWND hWndEventHandler; /* Handle of window to which event msgs are sent */ - WORD wRef; /* 16-bit app-defined value to identify the event to the app */ - DWORD dwEventTriggerMask; /* Mask specifying events which trigger the callback (FEELIT_FTRIG*) */ - LPIFEELIT_EFFECT piEffect; /* Effect, if any, that this event is associated with */ -} FEELIT_EVENT, *LPFEELIT_EVENT; - -typedef const FEELIT_EVENT *LPCFEELIT_EVENT; - - -/* Event Trigger Flags */ - -#define FEELIT_FTRIG_NONE 0x00000000 -#define FEELIT_FTRIG_ENTER 0x00000001 -#define FEELIT_FTRIG_EXIT 0x00000002 -#define FEELIT_FTRIG_OUTER 0x00000004 -#define FEELIT_FTRIG_INBOUND FEELIT_FTRIG_OUTER -#define FEELIT_FTRIG_INNER 0x00000008 -#define FEELIT_FTRIG_OUTBOUND FEELIT_FTRIG_INNER -#define FEELIT_FTRIG_TOPWALL 0x00000010 -#define FEELIT_FTRIG_BOTTOMWALL 0x00000020 -#define FEELIT_FTRIG_LEFTWALL 0x00000040 -#define FEELIT_FTRIG_RIGHTWALL 0x00000080 -#define FEELIT_FTRIG_ANYWALL ( FEELIT_FTRIG_TOPWALL | FEELIT_FTRIG_BOTTOMWALL | FEELIT_FTRIG_LEFTWALL | FEELIT_FTRIG_RIGHTWALL ) -#define FEELIT_FTRIG_ONENTERANY ( FEELIT_FTRIG_ENTER | FEELIT_FTRIG_ANYWALL ) -#define FEELIT_FTRIG_ONEXITANY ( FEELIT_FTRIG_EXIT | FEELIT_FTRIG_ANYWALL ) -#define FEELIT_FTRIG_ONOUTERANY ( FEELIT_FTRIG_OUTER | FEELIT_FTRIG_ANYWALL ) -#define FEELIT_FTRIG_ONINBOUNDANY FEELIT_FTRIG_ONOUTERANY -#define FEELIT_FTRIG_ONINNERANY ( FEELIT_FTRIG_INNER | FEELIT_FTRIG_ANYWALL ) -#define FEELIT_FTRIG_ONOUTBOUNDANY FEELIT_FTRIG_ONINNERANY -#define FEELIT_FTRIG_ONANYENCLOSURE ( FEELIT_FTRIG_ONENTERANY | FEELIT_FTRIG_ONEXITANY | FEELIT_FTRIG_ONOUTERANY | FEELIT_FTRIG_ONINNERANY ) - -#define FEELIT_FTRIG_ONSCROLL 0x0000100 -#define FEELIT_FTRIG_ONEFFECTCOMPLETION 0x0000200 - -#ifndef IS_VXD - -#undef INTERFACE -#define INTERFACE IFeelitDevice - -DECLARE_INTERFACE_(IFeelitDevice, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IFeelitDevice methods ***/ - STDMETHOD(GetCapabilities)(THIS_ LPFEELIT_DEVCAPS) PURE; - STDMETHOD(EnumObjects)(THIS_ LPFEELIT_ENUMDEVICEOBJECTSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(GetProperty)(THIS_ REFGUID,LPFEELIT_PROPHEADER) PURE; - STDMETHOD(SetProperty)(THIS_ REFGUID,LPCFEELIT_PROPHEADER) PURE; - STDMETHOD(Acquire)(THIS) PURE; - STDMETHOD(Unacquire)(THIS) PURE; - STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; - STDMETHOD(GetDeviceData)(THIS_ DWORD,LPFEELIT_DEVICEOBJECTDATA,LPDWORD,DWORD) PURE; - STDMETHOD(SetDataFormat)(THIS_ LPCFEELIT_DATAFORMAT) PURE; - STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; - STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; - STDMETHOD(GetObjectInfo)(THIS_ LPFEELIT_DEVICEOBJECTINSTANCE,DWORD,DWORD) PURE; - STDMETHOD(GetDeviceInfo)(THIS_ LPFEELIT_DEVICEINSTANCE) PURE; - STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; - STDMETHOD(CreateEffect)(THIS_ LPCFEELIT_EFFECT,LPIFEELIT_EFFECT *,LPUNKNOWN) PURE; - STDMETHOD(EnumEffects)(THIS_ LPFEELIT_ENUMEFFECTSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(GetEffectInfo)(THIS_ LPFEELIT_EFFECTINFO,REFGUID) PURE; - STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE; - STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE; - STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPFEELIT_ENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(Escape)(THIS_ LPFEELIT_EFFESCAPE) PURE; - STDMETHOD(Poll)(THIS) PURE; - STDMETHOD(SendDeviceData)(THIS_ DWORD,LPFEELIT_DEVICEOBJECTDATA,LPDWORD,DWORD) PURE; - STDMETHOD(CreateFeelitEvent)(THIS_ LPCFEELIT_EVENT,LPHFEELITEVENT) PURE; - STDMETHOD(DestroyFeelitEvent)(THIS_ HFEELITEVENT) PURE; - STDMETHOD(EnableFeelitEvent)(THIS_ HFEELITEVENT,BOOL) PURE; - STDMETHOD(SetEventNotificationPeriodicity)(THIS_ DWORD) PURE; -}; - -typedef struct IFeelitDevice *LPIFEELIT_DEVICE; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IFeelitDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IFeelitDevice_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IFeelitDevice_Release(p) (p)->lpVtbl->Release(p) -#define IFeelitDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) -#define IFeelitDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) -#define IFeelitDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) -#define IFeelitDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) -#define IFeelitDevice_Acquire(p) (p)->lpVtbl->Acquire(p) -#define IFeelitDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p) -#define IFeelitDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) -#define IFeelitDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) -#define IFeelitDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) -#define IFeelitDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) -#define IFeelitDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) -#define IFeelitDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) -#define IFeelitDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) -#define IFeelitDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) -#define IFeelitDevice_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d) -#define IFeelitDevice_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c) -#define IFeelitDevice_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b) -#define IFeelitDevice_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a) -#define IFeelitDevice_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a) -#define IFeelitDevice_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c) -#define IFeelitDevice_Escape(p,a) (p)->lpVtbl->Escape(p,a) -#define IFeelitDevice_Poll(p) (p)->lpVtbl->Poll(p) -#define IFeelitDevice_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d) -#define IFeelitDevice_CreateFeelitEvent(p,a,b) (p)->lpVtbl->CreateFeelitEvent(p,a,b) -#define IFeelitDevice_DestroyFeelitEvent(p,a) (p)->lpVtbl->DestroyFeelitEvent(p,a) -#define IFeelitDevice_EnableFeelitEvent(p,a,b) (p)->lpVtbl->EnableFeelitEvent(p,a,b) -#define IFeelitDevice_SetEventNotificationPeriodicity(p,a) (p)->lpVtbl->SetEventNotificationPeriodicity(p,a) -#else -#define IFeelitDevice_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IFeelitDevice_AddRef(p) (p)->AddRef() -#define IFeelitDevice_Release(p) (p)->Release() -#define IFeelitDevice_GetCapabilities(p,a) (p)->GetCapabilities(a) -#define IFeelitDevice_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) -#define IFeelitDevice_GetProperty(p,a,b) (p)->GetProperty(a,b) -#define IFeelitDevice_SetProperty(p,a,b) (p)->SetProperty(a,b) -#define IFeelitDevice_Acquire(p) (p)->Acquire() -#define IFeelitDevice_Unacquire(p) (p)->Unacquire() -#define IFeelitDevice_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) -#define IFeelitDevice_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) -#define IFeelitDevice_SetDataFormat(p,a) (p)->SetDataFormat(a) -#define IFeelitDevice_SetEventNotification(p,a) (p)->SetEventNotification(a) -#define IFeelitDevice_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) -#define IFeelitDevice_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) -#define IFeelitDevice_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) -#define IFeelitDevice_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) -#define IFeelitDevice_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d) -#define IFeelitDevice_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c) -#define IFeelitDevice_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b) -#define IFeelitDevice_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a) -#define IFeelitDevice_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a) -#define IFeelitDevice_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c) -#define IFeelitDevice_Escape(p,a) (p)->Escape(a) -#define IFeelitDevice_Poll(p) (p)->Poll() -#define IFeelitDevice_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d) -#define IFeelitDevice_CreateFeelitEvent(p,a,b) (p)->CreateFeelitEvent(a,b) -#define IFeelitDevice_DestroyFeelitEvent(p,a) (p)->DestroyFeelitEvent(a) -#define IFeelitDevice_EnableFeelitEvent(p,a,b) (p)->EnableFeelitEvent(a,b) -#define IFeelitDevice_SetEventNotificationPeriodicity(p,a) (p)->SetEventNotificationPeriodicity(a) -#endif - -#endif // IS_VXD - -/**************************************************************************** - * - * Mouse State - * - ****************************************************************************/ - -typedef struct _FEELIT_MOUSESTATE { - LONG lXpos; - LONG lYpos; - LONG lZpos; - LONG lXforce; - LONG lYforce; - LONG lZforce; - BYTE rgbButtons[4]; -} FEELIT_MOUSESTATE, *LPFEELIT_MOUSESTATE; - -#define FEELIT_MOUSEOFFSET_XAXIS FIELD_OFFSET(FEELIT_MOUSESTATE, lXpos) -#define FEELIT_MOUSEOFFSET_YAXIS FIELD_OFFSET(FEELIT_MOUSESTATE, lYpos) -#define FEELIT_MOUSEOFFSET_ZAXIS FIELD_OFFSET(FEELIT_MOUSESTATE, lZpos) -#define FEELIT_MOUSEOFFSET_XFORCE FIELD_OFFSET(FEELIT_MOUSESTATE, lXforce) -#define FEELIT_MOUSEOFFSET_YFORCE FIELD_OFFSET(FEELIT_MOUSESTATE, lYforce) -#define FEELIT_MOUSEOFFSET_ZFORCE FIELD_OFFSET(FEELIT_MOUSESTATE, lZforce) -#define FEELIT_MOUSEOFFSET_BUTTON0 (FIELD_OFFSET(FEELIT_MOUSESTATE, rgbButtons) + 0) -#define FEELIT_MOUSEOFFSET_BUTTON1 (FIELD_OFFSET(FEELIT_MOUSESTATE, rgbButtons) + 1) -#define FEELIT_MOUSEOFFSET_BUTTON2 (FIELD_OFFSET(FEELIT_MOUSESTATE, rgbButtons) + 2) -#define FEELIT_MOUSEOFFSET_BUTTON3 (FIELD_OFFSET(FEELIT_MOUSESTATE, rgbButtons) + 3) - - -/**************************************************************************** - * - * IFeelit - * - ****************************************************************************/ - -#define FEELIT_ENUM_STOP 0 -#define FEELIT_ENUM_CONTINUE 1 - -#ifndef IS_VXD -typedef BOOL (FAR PASCAL * LPFEELIT_ENUMDEVICESCALLBACK)(LPCFEELIT_DEVICEINSTANCE, LPVOID); -#endif // IS_VXD - -#define FEELIT_FENUMDEV_ALLDEVICES 0x00000000 -#define FEELIT_FENUMDEV_ATTACHEDONLY 0x00000001 -#define FEELIT_FENUMDEV_FORCEFEEDBACK 0x00000100 - -#ifndef IS_VXD - -#undef INTERFACE -#define INTERFACE IFeelit - -DECLARE_INTERFACE_(IFeelit, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IFeelit methods ***/ - STDMETHOD(CreateDevice)(THIS_ REFGUID,LPIFEELIT_DEVICE *,LPUNKNOWN) PURE; - STDMETHOD(EnumDevices)(THIS_ DWORD,LPFEELIT_ENUMDEVICESCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; - STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; - STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; -}; - -typedef struct IFeelit *LPIFEELIT; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IFeelit_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IFeelit_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IFeelit_Release(p) (p)->lpVtbl->Release(p) -#define IFeelit_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) -#define IFeelit_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) -#define IFeelit_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) -#define IFeelit_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) -#define IFeelit_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IFeelit_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) -#endif - -extern HRESULT WINAPI FeelitCreateA(HINSTANCE hinst, DWORD dwVersion, LPIFEELIT *ppFeelit, LPUNKNOWN punkOuter); -#define FeelitCreate FeelitCreateA - -#endif // IS_VXD - - -/**************************************************************************** - * - * Return Codes - * - ****************************************************************************/ - -/* - * The operation completed successfully. - */ -#define FEELIT_RESULT_OK S_OK - -/* - * The device exists but is not currently attached. - */ -#define FEELIT_RESULT_NOTATTACHED S_FALSE - -/* - * The device buffer overflowed. Some input was lost. - */ -#define FEELIT_RESULT_BUFFEROVERFLOW S_FALSE - -/* - * The change in device properties had no effect. - */ -#define FEELIT_RESULT_PROPNOEFFECT S_FALSE - -/* - * The operation had no effect. - */ -#define FEELIT_RESULT_NOEFFECT S_FALSE - -/* - * The device is a polled device. As a result, device buffering - * will not collect any data and event notifications will not be - * signalled until GetDeviceState is called. - */ -#define FEELIT_RESULT_POLLEDDEVICE ((HRESULT)0x00000002L) - -/* - * The parameters of the effect were successfully updated by - * IFeelitEffect::SetParameters, but the effect was not - * downloaded because the device is not exclusively acquired - * or because the FEELIT_FPARAM_NODOWNLOAD flag was passed. - */ -#define FEELIT_RESULT_DOWNLOADSKIPPED ((HRESULT)0x00000003L) - -/* - * The parameters of the effect were successfully updated by - * IFeelitEffect::SetParameters, but in order to change - * the parameters, the effect needed to be restarted. - */ -#define FEELIT_RESULT_EFFECTRESTARTED ((HRESULT)0x00000004L) - -/* - * The parameters of the effect were successfully updated by - * IFeelitEffect::SetParameters, but some of them were - * beyond the capabilities of the device and were truncated. - */ -#define FEELIT_RESULT_TRUNCATED ((HRESULT)0x00000008L) - -/* - * Equal to FEELIT_RESULT_EFFECTRESTARTED | FEELIT_RESULT_TRUNCATED. - */ -#define FEELIT_RESULT_TRUNCATEDANDRESTARTED ((HRESULT)0x0000000CL) - -/* - * The application requires a newer version of Feelit. - */ -#define FEELIT_ERROR_OLDFEELITVERSION \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION) - -/* - * The application was written for an unsupported prerelease version - * of Feelit. - */ -#define FEELIT_ERROR_BETAFEELITVERSION \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP) - -/* - * The object could not be created due to an incompatible driver version - * or mismatched or incomplete driver components. - */ -#define FEELIT_ERROR_BADDRIVERVER \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL) - -/* - * The device or device instance or effect is not registered with Feelit. - */ -#define FEELIT_ERROR_DEVICENOTREG REGDB_E_CLASSNOTREG - -/* - * The requested object does not exist. - */ -#define FEELIT_ERROR_NOTFOUND \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND) - -/* - * The requested object does not exist. - */ -#define FEELIT_ERROR_OBJECTNOTFOUND \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND) - -/* - * An invalid parameter was passed to the returning function, - * or the object was not in a state that admitted the function - * to be called. - */ -#define FEELIT_ERROR_INVALIDPARAM E_INVALIDARG - -/* - * The specified interface is not supported by the object - */ -#define FEELIT_ERROR_NOINTERFACE E_NOINTERFACE - -/* - * An undetermined error occured inside the Feelit subsystem - */ -#define FEELIT_ERROR_GENERIC E_FAIL - -/* - * The Feelit subsystem couldn't allocate sufficient memory to complete the - * caller's request. - */ -#define FEELIT_ERROR_OUTOFMEMORY E_OUTOFMEMORY - -/* - * The function called is not supported at this time - */ -#define FEELIT_ERROR_UNSUPPORTED E_NOTIMPL - -/* - * This object has not been initialized - */ -#define FEELIT_ERROR_NOTINITIALIZED \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY) - -/* - * This object is already initialized - */ -#define FEELIT_ERROR_ALREADYINITIALIZED \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED) - -/* - * This object does not support aggregation - */ -#define FEELIT_ERROR_NOAGGREGATION CLASS_E_NOAGGREGATION - -/* - * Another app has a higher priority level, preventing this call from - * succeeding. - */ -#define FEELIT_ERROR_OTHERAPPHASPRIO E_ACCESSDENIED - -/* - * Access to the device has been lost. It must be re-acquired. - */ -#define FEELIT_ERROR_INPUTLOST \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT) - -/* - * The operation cannot be performed while the device is acquired. - */ -#define FEELIT_ERROR_ACQUIRED \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY) - -/* - * The operation cannot be performed unless the device is acquired. - */ -#define FEELIT_ERROR_NOTACQUIRED \ - MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS) - -/* - * The specified property cannot be changed. - */ -#define FEELIT_ERROR_READONLY E_ACCESSDENIED - -/* - * The device already has an event notification associated with it. - */ -#define FEELIT_ERROR_HANDLEEXISTS E_ACCESSDENIED - -/* - * Data is not yet available. - */ -#ifndef E_PENDING -#define E_PENDING 0x80070007L -#endif - -/* - * Unable to perform the requested operation because the user - * does not have sufficient privileges. - */ -#define FEELIT_ERROR_INSUFFICIENTPRIVS 0x80040200L - -/* - * The device is full. - */ -#define FEELIT_ERROR_DEVICEFULL 0x80040201L - -/* - * Not all the requested information fit into the buffer. - */ -#define FEELIT_ERROR_MOREDATA 0x80040202L - -/* - * The effect is not downloaded. - */ -#define FEELIT_ERROR_NOTDOWNLOADED 0x80040203L - -/* - * The device cannot be reinitialized because there are still effects - * attached to it. - */ -#define FEELIT_ERROR_HASEFFECTS 0x80040204L - -/* - * The operation cannot be performed unless the device is acquired - * in FEELIT_FCOOPLEVEL_EXCLUSIVE mode. - */ -#define FEELIT_ERROR_NOTEXCLUSIVEACQUIRED 0x80040205L - -/* - * The effect could not be downloaded because essential information - * is missing. For example, no axes have been associated with the - * effect, or no type-specific information has been created. - */ -#define FEELIT_ERROR_INCOMPLETEEFFECT 0x80040206L - -/* - * Attempted to read buffered device data from a device that is - * not buffered. - */ -#define FEELIT_ERROR_NOTBUFFERED 0x80040207L - -/* - * An attempt was made to modify parameters of an effect while it is - * playing. Not all hardware devices support altering the parameters - * of an effect while it is playing. - */ -#define FEELIT_ERROR_EFFECTPLAYING 0x80040208L - -/* - * An internal error occurred (inside the API or the driver) - */ -#define FEELIT_ERROR_INTERNAL 0x80040209L - -/* - * Effect set referenced by a command is not the active set - */ -#define FEELIT_ERROR_INACTIVE 0x8004020AL - -#ifdef __cplusplus -}; -#endif - - -#endif /* __FEELITAPI_INCLUDED__ */ - diff --git a/code/win32/FeelIt/fffx.cpp b/code/win32/FeelIt/fffx.cpp deleted file mode 100644 index 74e8571..0000000 --- a/code/win32/FeelIt/fffx.cpp +++ /dev/null @@ -1,680 +0,0 @@ -// Filename:- fffx.cpp (Force-Feedback FX) -// -// (Function names with "_FF_" beginnings are my internal stuff only, "FF_" beginnings are for external stuff) -// -#define INITGUID // this will need removing if already defined in someone else's module. Only one must exist in whole game - -#include "../../client/client.h" -#include "../win_local.h" -#include "ffc.h" -#include "fffx_feel.h" - -// these now MUST default to NULL... -// -CFeelDevice *g_pFeelDevice=NULL; -CFeelProject *g_pFeelProject=NULL; -CFeelSpring *g_pFeelSpring=NULL; - - -ffFX_e ffFXLoaded[MAX_CONCURRENT_FFFXs]; - -//extern HINSTANCE global_hInstance; -//extern HWND cl_hwnd; -extern WinVars_t g_wv; - - -extern cvar_t *in_joystick; -cvar_t *use_ff; -cvar_t *ff_defaultTension; - - -void _FF_ClearUsageArray(void); -void _FF_ClearFXSlot(int i); -void _FF_ClearCreatePlayFXSlot(int iSlotNum, ffFX_e fffx); -void _FF_CreatePlayFXSlot(int iSlotNum, ffFX_e fffx); -void _FF_PlayFXSlot(int iSlotNum); - - - -// externally accessed -qboolean FF_IsAvailable(void) -{ - return g_pFeelDevice?TRUE:FALSE; -} - -qboolean FF_IsMouse(void) -{ - if (g_pFeelDevice && (g_pFeelDevice->GetDeviceType() == FEEL_DEVICETYPE_MOUSE)) - return TRUE; - - return FALSE; -} - - -// 4 semi-useful CMD functions... -void CMD_FF_UseMouse(void) -{ - FF_Init(TRUE); -} - -void CMD_FF_UseJoy(void) -{ - FF_Init(FALSE); -} - -// arg = 0..3 -// -void CMD_FF_Tension(void) -{ - if (Cmd_Argc() != 2) - { - Com_Printf ("ff_tension (default = 1)\n"); - return; - } - - int iTension = atoi(Cmd_Argv(1)); - if (iTension<0 || iTension>3) - { - Com_Printf ("ff_tension \n"); - return; - } - - if (g_pFeelSpring) - { - Com_Printf(va("Setting tension %d\n",iTension)); - Cvar_Set(ff_defaultTension->name,va("%d",iTension)); - FF_SetTension(iTension); - } - else - { - Com_Printf("No spring device\n"); - } -} - - -typedef struct -{ - char* psName; - ffFX_e eFXNum; -}FFFX_LOOKUP; - -#define FFFX_ENTRY(blah) {#blah,(ffFX_e)fffx_ ## blah} -FFFX_LOOKUP FFFX_Lookup[fffx_NUMBEROF]= -{ - FFFX_ENTRY( RandomNoise ), - FFFX_ENTRY( AircraftCarrierTakeOff ), // this one is pointless / dumb - FFFX_ENTRY( BasketballDribble ), - FFFX_ENTRY( CarEngineIdle ), - FFFX_ENTRY( ChainsawIdle ), - FFFX_ENTRY( ChainsawInAction ), - FFFX_ENTRY( DieselEngineIdle ), - FFFX_ENTRY( Jump ), - FFFX_ENTRY( Land ), - FFFX_ENTRY( MachineGun ), - FFFX_ENTRY( Punched ), - FFFX_ENTRY( RocketLaunch ), - FFFX_ENTRY( SecretDoor ), - FFFX_ENTRY( SwitchClick ), - FFFX_ENTRY( WindGust ), - FFFX_ENTRY( WindShear ), // also pretty crap - FFFX_ENTRY( Pistol ), - FFFX_ENTRY( Shotgun ), - FFFX_ENTRY( Laser1 ), - FFFX_ENTRY( Laser2 ), - FFFX_ENTRY( Laser3 ), - FFFX_ENTRY( Laser4 ), - FFFX_ENTRY( Laser5 ), - FFFX_ENTRY( Laser6 ), - FFFX_ENTRY( OutOfAmmo ), - FFFX_ENTRY( LightningGun ), - FFFX_ENTRY( Missile ), - FFFX_ENTRY( GatlingGun ), - FFFX_ENTRY( ShortPlasma ), - FFFX_ENTRY( PlasmaCannon1 ), - FFFX_ENTRY( PlasmaCannon2 ), - FFFX_ENTRY( Cannon ) -}; - -void CMD_FF_Play(void) -{ - if (Cmd_Argc() != 2 && Cmd_Argc() != 3) - { - Com_Printf ("ff_play (where n = 0..%d) || ff_play name \"fxname\"\n",fffx_NUMBEROF-1); - return; - } - - ffFX_e eFX = fffx_NULL; - - if (!Q_stricmp(Cmd_Argv(1),"name")) - { - if (Cmd_Argc() != 3) - { - Com_Printf ("ff_play (where n = 0..%d) || ff_play name \"fxname\"\n",0,fffx_NUMBEROF-1); - return; - } - - for (int i=0; i=0 && eFX\n"); - return; - } - - long lSpring = atoi(Cmd_Argv(1)); - if (lSpring<0 || lSpring>10000) - { - Com_Printf ("ff_spring <0..10000>\n"); - return; - } - - if (g_pFeelSpring) - { - Com_Printf(va("Setting spring to %d\n",lSpring)); - FF_SetSpring(lSpring); - } - else - { - Com_Printf("No spring device\n"); - } -} - - -// Called once only during .exe lifetime... -// -void FF_Init(qboolean bTryMouseFirst) -{ - FF_Shutdown(); - - Cmd_AddCommand ("ff_usemouse", CMD_FF_UseMouse); - Cmd_AddCommand ("ff_usejoy", CMD_FF_UseJoy); - Cmd_AddCommand ("ff_tension", CMD_FF_Tension); - Cmd_AddCommand ("ff_spring", CMD_FF_Spring); - Cmd_AddCommand ("ff_play", CMD_FF_Play); - - // ==================================== - - Com_Printf("\n" S_COLOR_CYAN "------- Force Feedback Initialization -------\n"); - - // for the moment default to OFF until usage tables are in... - use_ff = Cvar_Get ("use_ff", "0", CVAR_ARCHIVE); - ff_defaultTension = Cvar_Get ("ff_defaultTension", "1", CVAR_ARCHIVE); - - // don't bother initializing if user specifically turned off force feedback... - // - if (!use_ff->value) - { - Com_Printf("...inhibited, not initializing\n\n"); - return; - } - - Com_Printf("Creating feedback device:\n"); - - if ( bTryMouseFirst ) - { - CFeelMouse* m_pFeelMouse = new CFeelMouse; - if (m_pFeelMouse) - { - if (m_pFeelMouse->Initialize( g_wv.hInstance, g_wv.hWnd)) - { - g_pFeelDevice = m_pFeelMouse; - } - else - { - delete m_pFeelMouse; - m_pFeelMouse = NULL; - } - } - } - - if (!g_pFeelDevice) - { - // try a general DI FF device... - // - CFeelDXDevice* m_pFeelDXDevice = new CFeelDXDevice; - if (m_pFeelDXDevice) - { - if (m_pFeelDXDevice->Initialize( g_wv.hInstance, g_wv.hWnd)) - { - g_pFeelDevice = m_pFeelDXDevice; - } - else - { - delete m_pFeelDXDevice; - m_pFeelDXDevice = NULL; - } - } - } - - -// g_pFeelDevice = CFeelDevice::CreateDevice(g_wv.hInstance, g_wv.hWnd); - if (!g_pFeelDevice) - { - Com_Printf("...no feedback devices found\n"); - return; - } - else - { - _FeelInitEffects(); - - for (int _i=0; _iGetDeviceType() == FEEL_DEVICETYPE_MOUSE) - { - Com_Printf("...found FEELit Mouse\n"); - g_pFeelDevice->UsesWin32MouseServices(FALSE); - } - else if (g_pFeelDevice->GetDeviceType() == FEEL_DEVICETYPE_DIRECTINPUT) - { - Com_Printf("...found feedback device\n"); - g_pFeelSpring = new CFeelSpring; - if (!g_pFeelSpring->Initialize( g_pFeelDevice, - 2000, //10000, // LONG lStiffness = FEEL_SPRING_DEFAULT_STIFFNESS - 10000, //5000, // DWORD dwSaturation = FEEL_SPRING_DEFAULT_SATURATION - 1000, //0, // DWORD dwDeadband = FEEL_SPRING_DEFAULT_DEADBAND // must be 0..n..10000 - FEEL_EFFECT_AXIS_BOTH, // DWORD dwfAxis = FEEL_EFFECT_AXIS_BOTH - FEEL_SPRING_DEFAULT_CENTER_POINT, // POINT pntCenter = FEEL_SPRING_DEFAULT_CENTER_POINT - FEEL_EFFECT_DEFAULT_DIRECTION_X, // LONG lDirectionX = FEEL_EFFECT_DEFAULT_DIRECTION_X - FEEL_EFFECT_DEFAULT_DIRECTION_Y, // LONG lDirectionY = FEEL_EFFECT_DEFAULT_DIRECTION_Y - TRUE // TRUE = rel coords, else screen coords // BOOL bUseDeviceCoordinates = FALSE - ) - ) - { - Com_Printf("...(no device return spring)\n"); - delete g_pFeelSpring; - g_pFeelSpring = NULL; - } - else - { - Com_Printf("...device return spring ok\n"); - FF_SetTension(ff_defaultTension->integer); // 0..3 - } - }// if (g_pFeelDevice->GetDeviceType() == FEEL_DEVICETYPE_DIRECTINPUT) - } -} - - -// call this at app shutdown... (or when switching controllers) -// -// (also called by FF_Init in case you're switching controllers so do everything -// as if-protected) -// -void FF_Shutdown(void) -{ - // note the check first before print, since this is called from the init code - // as well, and it'd be weird to see the sutdown string first... - // - if (g_pFeelSpring || g_pFeelDevice) - { - Com_Printf("\n" S_COLOR_CYAN "------- Force Feedback Shutdown -------\n"); - } - - if (g_pFeelSpring) - { - Com_Printf("...closing return spring\n"); - delete g_pFeelSpring; - g_pFeelSpring = NULL; - } - - if (g_pFeelDevice) - { - Com_Printf("...closing feedback device\n"); - _FF_ClearUsageArray(); - delete g_pFeelDevice; - g_pFeelDevice = NULL; - } - - Cmd_RemoveCommand ("ff_usemouse"); - Cmd_RemoveCommand ("ff_usejoy"); - Cmd_RemoveCommand ("ff_tension"); - Cmd_RemoveCommand ("ff_spring"); - Cmd_RemoveCommand ("ff_play"); -} - - - - - - - - - -void FF_EnsurePlaying(ffFX_e fffx) -{ - if (fffx<0 || fffx>=fffx_NUMBEROF) - return; - - // if user has specifically turned off force feedback at command line, - // or is not using the joystick as current input method (though this can be ignored because stick has a hands-on sensor), - // then forget it... - // - if (!use_ff->value) - return; - - - if (FF_IsAvailable()) - { - // Have we already got this FF FX loaded? - // - for (int i=0; i=fffx_NUMBEROF) - return; - - // if user has specifically turned off force feedback at command line, - // or is not using the joystick as current input method (though this can be ignored because stick has a hands-on sensor), - // then forget it... - // - if (!use_ff->value) - return; - - if (FF_IsAvailable()) - { - // first, search for an instance of this FF FX that's already loaded, if found, start it off again... - // - for (i=0; iinteger); - } -} - - - - - -void _FF_ClearUsageArray(void) -{ - int i; - - for (i=0; i=fffx_NUMBEROF) - return; - - if (FF_IsAvailable()) - { - for (int i=0; iStart()) - { - return FALSE; - } - bFXPlaying = TRUE; - - static POINT p={0,0}; - g_pFeelSpring->ChangeParameters(p, lSpring); - } - else - { - if (bFXPlaying && !g_pFeelSpring->Stop()) - { - return FALSE; - } - bFXPlaying = FALSE; - } - - return TRUE; - } - } - - return FALSE; -} - -// tension is 0 (none) to 3 (max)... -// -qboolean FF_SetTension(int iTension) -{ - static long lSpringValues[4] = {0, 1000, 5000, 10000}; - - if (iTension>3) - iTension=3; - if (iTension<0) - iTension=0; - - return FF_SetSpring(lSpringValues[iTension]); -} - -///////////////////////// eof ////////////////////////////// - diff --git a/code/win32/FeelIt/fffx_feel.cpp b/code/win32/FeelIt/fffx_feel.cpp deleted file mode 100644 index bb34457..0000000 --- a/code/win32/FeelIt/fffx_feel.cpp +++ /dev/null @@ -1,689 +0,0 @@ -// Filename:- fffx_Feel.cpp (Force-Feedback FX) - -#include "../../client/client.h" -//#include "stdafx.h" -//#include "resource.h" -#include "fffx_feel.h" - -extern cvar_t* js_ffmult; - - -#define MAX_EFFECTS_IN_COMPOUND 3 // This needs to be at least 3 for now. I can add array bounds checking later - -CFeelEffect* g_pEffects[MAX_CONCURRENT_FFFXs][MAX_EFFECTS_IN_COMPOUND]; - -void _FeelInitEffects() -{ - for (int i = 0; i < MAX_CONCURRENT_FFFXs; i++) - { - for (int j = 0; j < MAX_EFFECTS_IN_COMPOUND; j++) - { - g_pEffects[i][j] = NULL; - } - } -} - -BOOL _FeelCreateEffect(int iSlotNum, ffFX_e fffx, CFeelDevice* pFeelDevice) -{ - BOOL success = TRUE; - FEELIT_ENVELOPE envelope; - envelope.dwSize = sizeof(FEELIT_ENVELOPE); - - switch (fffx) - { - case fffx_RandomNoise: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 7500 * js_ffmult->value, // magnitude - 95, // period - 10000, // duration - 0, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_SawtoothDown); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 8300 * js_ffmult->value, // magnitude - 160, // period - 10000, // duration - 9000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - g_pEffects[iSlotNum][2] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][2]))->InitializePolar(pFeelDevice, - 8300 * js_ffmult->value, // magnitude - 34, // period - 10000, // duration - 31000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - - success = FALSE; - break; - case fffx_AircraftCarrierTakeOff: - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 600000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 750000; - - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 0, // angle - 2500, // duration - 10000 * js_ffmult->value, // magnitude - &envelope))// envelope - - success = FALSE; - break; - case fffx_BasketballDribble: - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 40000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 30000; - - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 18000, // angle - 150, // duration - 5000 * js_ffmult->value, // magnitude - &envelope))// envelope - - success = FALSE; - break; - case fffx_CarEngineIdle: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 2500 * js_ffmult->value, // magnitude - 50, // period - 10000, // duration - 0, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_ChainsawIdle: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 3600 * js_ffmult->value, // magnitude - 60, // period - 1000, // duration - 9000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 4000 * js_ffmult->value, // magnitude - 100, // period - 1000, // duration - 18000, // angle - 4000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_ChainsawInAction: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 6700 * js_ffmult->value, // magnitude - 60, // period - 1000, // duration - 9000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 100, // period - 1000, // duration - 18000, // angle - 5000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - g_pEffects[iSlotNum][2] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][2]))->InitializePolar(pFeelDevice, - 10000 * js_ffmult->value, // magnitude - 340, // period - 1000, // duration - 18000, // angle - 4000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_DieselEngineIdle: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_SawtoothDown); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 2000 * js_ffmult->value, // magnitude - 250, // period - 10000, // duration - 18000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 4000 * js_ffmult->value, // magnitude - 125, // period - 10000, // duration - 18000, // angle - 1500, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Jump: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 500, // period - 300, // duration - 18000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Land: - envelope.dwAttackLevel = 6000; - envelope.dwAttackTime = 200000; - envelope.dwFadeLevel = 3000; - envelope.dwFadeTime = 50000; - - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 1000 * js_ffmult->value, // magnitude - 750, // period - 250, // duration - 0, // angle - 0, // offset - 0, // phase - &envelope)) // envelope - success = FALSE; - break; - case fffx_MachineGun: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 3500 * js_ffmult->value, // magnitude - 70, // period - 1000, // duration - 0, // angle - 2500, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Punched: - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 0; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 50000; - - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 8000 * js_ffmult->value, // magnitude - 130, // period - 70, // duration - 0, // angle - 0, // offset - 0, // phase - &envelope)) // envelope - success = FALSE; - break; - case fffx_RocketLaunch: - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 200000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 0; - - g_pEffects[iSlotNum][1] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 18000, // angle - 400, // duration - 10000 * js_ffmult->value, // magnitude - &envelope))// envelope - success = FALSE; - - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 300000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 100000; - - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 0, // angle - 1000, // duration - 10000 * js_ffmult->value, // magnitude - &envelope))// envelope - success = FALSE; - break; - case fffx_SecretDoor: - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 400000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 0; - - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 0, // angle - 400, // duration - 10000 * js_ffmult->value, // magnitude - &envelope))// envelope - - success = FALSE; - break; - case fffx_SwitchClick: - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 18000, // angle - 50, // duration - 7000 * js_ffmult->value, // magnitude - NULL))// envelope - - success = FALSE; - break; - case fffx_WindGust: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 6000 * js_ffmult->value, // magnitude - 1000, // period - 500, // duration - 18000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_WindShear: - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 1500000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 500000; - - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_SawtoothDown); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 10000 * js_ffmult->value, // magnitude - 80, // period - 2000, // duration - 0, // angle - 0, // offset - 0, // phase - &envelope)) // envelope - success = FALSE; - break; - case fffx_Pistol: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 8500 * js_ffmult->value, // magnitude - 130, // period - 50, // duration - 0, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Shotgun: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 6000 * js_ffmult->value, // magnitude - 100, // period - 100, // duration - 18000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 100000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 100000; - - g_pEffects[iSlotNum][1] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 0, // angle - 300, // duration - 7000 * js_ffmult->value, // magnitude - &envelope))// envelope - success = FALSE; - break; - case fffx_Laser1: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 6000 * js_ffmult->value, // magnitude - 25, // period - 1000, // duration - 18000, // angle - 2000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Laser2: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 25, // period - 1000, // duration - 0, // angle - 3000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Laser3: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 25, // period - 1000, // duration - 9000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Laser4: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 7000 * js_ffmult->value, // magnitude - 25, // period - 1000, // duration - 9000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Laser5: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 25, // period - 1000, // duration - 0, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Laser6: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 25, // period - 1000, // duration - 0, // angle - 2000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_OutOfAmmo: - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 18000, // angle - 10, // duration - 6000 * js_ffmult->value, // magnitude - NULL))// envelope - - success = FALSE; - break; - case fffx_LightningGun: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 1500 * js_ffmult->value, // magnitude - 250, // period - 1000, // duration - 18000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - - success = FALSE; - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 6000 * js_ffmult->value, // magnitude - 50, // period - 1000, // duration - 0, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_Missile: - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 500000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 200000; - - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 0, // angle - 250, // duration - 10000 * js_ffmult->value, // magnitude - &envelope))// envelope - - success = FALSE; - break; - case fffx_GatlingGun: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_SawtoothDown); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 6000 * js_ffmult->value, // magnitude - 100, // period - 1000, // duration - 0, // angle - 1000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - break; - case fffx_ShortPlasma: - envelope.dwAttackLevel = 7000; - envelope.dwAttackTime = 250000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 0; - - g_pEffects[iSlotNum][0] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 0, // angle - 250, // duration - 0, // magnitude - &envelope))// envelope - - success = FALSE; - - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 0; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 250000; - - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 30, // period - 250, // duration - 0, // angle - 0, // offset - 0, // phase - &envelope)) // envelope - success = FALSE; - break; - case fffx_PlasmaCannon1: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 5000 * js_ffmult->value, // magnitude - 500, // period - 400, // duration - 18000, // angle - -5000, // offset - 0, // phase - NULL)) // envelope - - success = FALSE; - - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 250000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 0; - - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 6000 * js_ffmult->value, // magnitude - 30, // period - 250, // duration - 0, // angle - 0, // offset - 0, // phase - &envelope)) // envelope - success = FALSE; - break; - case fffx_PlasmaCannon2: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 4000 * js_ffmult->value, // magnitude - 1000, // period - 800, // duration - 18000, // angle - -4000, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 500000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 0; - - g_pEffects[iSlotNum][1] = new CFeelPeriodic(GUID_Feel_Sine); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 8000 * js_ffmult->value, // magnitude - 35, // period - 500, // duration - 0, // angle - 0, // offset - 0, // phase - &envelope)) // envelope - success = FALSE; - break; - case fffx_Cannon: - g_pEffects[iSlotNum][0] = new CFeelPeriodic(GUID_Feel_Square); - if (!((CFeelPeriodic*)(g_pEffects[iSlotNum][0]))->InitializePolar(pFeelDevice, - 8000 * js_ffmult->value, // magnitude - 100, // period - 100, // duration - 18000, // angle - 0, // offset - 0, // phase - NULL)) // envelope - success = FALSE; - - envelope.dwAttackLevel = 0; - envelope.dwAttackTime = 100000; - envelope.dwFadeLevel = 0; - envelope.dwFadeTime = 100000; - - g_pEffects[iSlotNum][1] = new CFeelConstant; - if (!((CFeelConstant*)(g_pEffects[iSlotNum][1]))->InitializePolar(pFeelDevice, - 0, // angle - 300, // duration - 10000 * js_ffmult->value, // magnitude - &envelope))// envelope - success = FALSE; - break; - }// switch (fffx) - - // if any effect in the compound failed to initialize, dump the lot - if (!success) - { - for (int i = 0; i < MAX_EFFECTS_IN_COMPOUND; i++) - { - if (g_pEffects[iSlotNum][i]) - { - delete g_pEffects[iSlotNum][i]; - g_pEffects[iSlotNum][i] = NULL; - } - } - } - - return success; -} - -BOOL _FeelStartEffect(int iSlotNum, DWORD dwIterations, DWORD dwFlags) -{ - BOOL success = TRUE; - - for (int i = 0; i < MAX_EFFECTS_IN_COMPOUND; i++) - { - if (g_pEffects[iSlotNum][i]) - { - if (!g_pEffects[iSlotNum][i]->Start(dwIterations, dwFlags)) - success = FALSE; - } - } - - return success; -} - -BOOL _FeelEffectPlaying(int iSlotNum) -{ - DWORD dwFlags; - dwFlags = 0; - - // check to see if any effect within the compound is still playing - for (int i = 0; i < MAX_EFFECTS_IN_COMPOUND; i++) - { - if (g_pEffects[iSlotNum][i]) - { - g_pEffects[iSlotNum][i]->GetStatus(&dwFlags); - if (dwFlags & FEELIT_FSTATUS_PLAYING) - return TRUE; - } - } - - return FALSE; -} - -BOOL _FeelStopEffect(int iSlotNum) -{ - BOOL success = TRUE; - - for (int i = 0; i < MAX_EFFECTS_IN_COMPOUND; i++) - { - if (g_pEffects[iSlotNum][i]) - { - if (!g_pEffects[iSlotNum][i]->Stop()) - success = FALSE; - } - } - - return success; -} - -BOOL _FeelClearEffect(int iSlotNum) -{ - for (int i = 0; i < MAX_EFFECTS_IN_COMPOUND; i++) - { - if (g_pEffects[iSlotNum][i]) - { - delete g_pEffects[iSlotNum][i]; - g_pEffects[iSlotNum][i] = NULL; - } - } - - return TRUE; -} - - diff --git a/code/win32/FeelIt/fffx_feel.h b/code/win32/FeelIt/fffx_feel.h deleted file mode 100644 index 7f1661d..0000000 --- a/code/win32/FeelIt/fffx_feel.h +++ /dev/null @@ -1,29 +0,0 @@ -// Filename:- fffx_Feel.h (Force-Feedback FX) -// ADDED BY IMMRESION - -#ifndef FFFX_FEEL_H -#define FFFX_FEEL_H - -#include "../../client/fffx.h" -#include "ffc.h" - -///////////////////////////////////////////////////////////////////////// -/* These functions were created to make the code a little easier to read. - * _FeelCreateEffect is quite long since it needs to create different - * kinds of effects. When playing effects, the number of iterations - * may not act as expected. I can't use CFeelCompound effects since I - * don't have a Project (which requires an ifr file at this point). So, - * I simulate compound effects with arrays. If an effect has multiple - * CFeelEffect in it, each CFeelEffect will be started individually with - * that number of iterations. The only case where this will act strange - * is when the CFeelEffects have different durations. -*/ -///////////////////////////////////////////////////////////////////////// -void _FeelInitEffects(); -BOOL _FeelCreateEffect(int iSlotNum, ffFX_e fffx, CFeelDevice* pFeelDevice); -BOOL _FeelStartEffect(int iSlotNum, DWORD dwIterations, DWORD dwFlags); -BOOL _FeelEffectPlaying(int iSlotNum); -BOOL _FeelStopEffect(int iSlotNum); -BOOL _FeelClearEffect(int iSlotNum); - -#endif // #ifndef FFFX_FEEL_H diff --git a/code/win32/bink.h b/code/win32/bink.h deleted file mode 100644 index 4a4b273..0000000 --- a/code/win32/bink.h +++ /dev/null @@ -1,620 +0,0 @@ -#ifndef BINKH -#define BINKH - -#define BINKVERSION "1.0p" -#define BINKDATE "2000-06-26" - -#ifndef __RADRES__ - -#include "rad.h" - -RADDEFSTART - -typedef struct BINK PTR4* HBINK; - -typedef s32 (RADLINK PTR4* BINKIOOPEN) (struct BINKIO PTR4* Bnkio, const char PTR4 *name, u32 flags); -typedef u32 (RADLINK PTR4* BINKIOREADHEADER) (struct BINKIO PTR4* Bnkio, s32 Offset, void PTR4* Dest,u32 Size); -typedef u32 (RADLINK PTR4* BINKIOREADFRAME) (struct BINKIO PTR4* Bnkio, u32 Framenum,s32 origofs,void PTR4* dest,u32 size); -typedef u32 (RADLINK PTR4* BINKIOGETBUFFERSIZE)(struct BINKIO PTR4* Bnkio, u32 Size); -typedef void (RADLINK PTR4* BINKIOSETINFO) (struct BINKIO PTR4* Bnkio, void PTR4* Buf,u32 Size,u32 FileSize,u32 simulate); -typedef u32 (RADLINK PTR4* BINKIOIDLE) (struct BINKIO PTR4* Bnkio); -typedef void (RADLINK PTR4* BINKIOCLOSE) (struct BINKIO PTR4* Bnkio); - -typedef struct BINKIO { - BINKIOREADHEADER ReadHeader; - BINKIOREADFRAME ReadFrame; - BINKIOGETBUFFERSIZE GetBufferSize; - BINKIOSETINFO SetInfo; - BINKIOIDLE Idle; - BINKIOCLOSE Close; - HBINK bink; - volatile u32 ReadError; - volatile u32 DoingARead; - volatile u32 BytesRead; - volatile u32 Working; - volatile u32 TotalTime; - volatile u32 ForegroundTime; - volatile u32 IdleTime; - volatile u32 ThreadTime; - volatile u32 BufSize; - volatile u32 BufHighUsed; - volatile u32 CurBufSize; - volatile u32 CurBufUsed; - volatile u8 iodata[128]; -} BINKIO; - -typedef s32 (RADLINK PTR4* BINKSNDOPEN) (struct BINKSND PTR4* BnkSnd, u32 freq, s32 bits, s32 chans, u32 flags, HBINK bink); -typedef s32 (RADLINK PTR4* BINKSNDREADY) (struct BINKSND PTR4* BnkSnd); -typedef s32 (RADLINK PTR4* BINKSNDLOCK) (struct BINKSND PTR4* BnkSnd, u8 PTR4* PTR4* addr, u32 PTR4* len); -typedef s32 (RADLINK PTR4* BINKSNDUNLOCK) (struct BINKSND PTR4* BnkSnd, u32 filled); -typedef void (RADLINK PTR4* BINKSNDVOLUME) (struct BINKSND PTR4* BnkSnd, s32 volume); -typedef void (RADLINK PTR4* BINKSNDPAN) (struct BINKSND PTR4* BnkSnd, s32 pan); -typedef s32 (RADLINK PTR4* BINKSNDONOFF) (struct BINKSND PTR4* BnkSnd, s32 status); -typedef s32 (RADLINK PTR4* BINKSNDPAUSE) (struct BINKSND PTR4* BnkSnd, s32 status); -typedef void (RADLINK PTR4* BINKSNDCLOSE) (struct BINKSND PTR4* BnkSnd); - -typedef BINKSNDOPEN (RADLINK PTR4* BINKSNDSYSOPEN) (u32 param); - -typedef struct BINKSND { - BINKSNDREADY Ready; - BINKSNDLOCK Lock; - BINKSNDUNLOCK Unlock; - BINKSNDVOLUME Volume; - BINKSNDPAN Pan; - BINKSNDPAUSE Pause; - BINKSNDONOFF SetOnOff; - BINKSNDCLOSE Close; - u32 BestSizeIn16; - u32 SoundDroppedOut; - s32 OnOff; - u32 Latency; - u32 freq; - s32 bits,chans; - u8 snddata[128]; -} BINKSND; - -typedef struct BINKRECT { - s32 Left,Top,Width,Height; -} BINKRECT; - -#define BINKMAXDIRTYRECTS 8 - -typedef struct BUNDLEPOINTERS { - void* typeptr; - void* type16ptr; - void* colorptr; - void* bits2ptr; - void* motionXptr; - void* motionYptr; - void* dctptr; - void* mdctptr; - void* patptr; -} BUNDLEPOINTERS; - - -typedef struct BINK { - u32 Width; // Width (1 based, 640 for example) - u32 Height; // Height (1 based, 480 for example) - u32 Frames; // Number of frames (1 based, 100 = 100 frames) - u32 FrameNum; // Frame to *be* displayed (1 based) - u32 LastFrameNum; // Last frame decompressed or skipped (1 based) - - u32 FrameRate; // Frame Rate Numerator - u32 FrameRateDiv; // Frame Rate Divisor (frame rate=numerator/divisor) - - u32 ReadError; // Non-zero if a read error has ocurred - u32 OpenFlags; // flags used on open - u32 BinkType; // Bink flags - - u32 Size; // size of file - u32 FrameSize; // The current frame's size in bytes - u32 SndSize; // The current frame sound tracks' size in bytes - - BINKRECT FrameRects[BINKMAXDIRTYRECTS];// Dirty rects from BinkGetRects - s32 NumRects; - - u32 PlaneNum; // which set of planes is current - void PTR4* YPlane[2]; // pointer to the uncompressed Y (Cr and Cr follow) - void PTR4* APlane[2]; // decompressed alpha plane (if present) - u32 YWidth; // widths and heights of the video planes - u32 YHeight; - u32 UVWidth; - u32 UVHeight; - - void PTR4* MaskPlane; // pointer to the mask plane (Ywidth/16*Yheight/16) - u32 MaskPitch; // Mask Pitch - u32 MaskLength; // total length of the mask plane - - u32 LargestFrameSize; // Largest frame size - u32 InternalFrames; // how many frames were potentially compressed - - s32 NumTracks; // how many tracks - - u32 Highest1SecRate; // Highest 1 sec data rate - u32 Highest1SecFrame; // Highest 1 sec data rate starting frame - - s32 Paused; // is the bink movie paused? - - u32 BackgroundThread; // handle to background thread - - // everything below is for internal Bink use - - void PTR4* compframe; // compressed frame data - void PTR4* preloadptr; // preloaded compressed frame data - u32* frameoffsets; // offsets of each of the frames - - BINKIO bio; // IO structure - u8 PTR4* ioptr; // io buffer ptr - u32 iosize; // io buffer size - u32 decompwidth; // width not include scaling - u32 decompheight; // height not include scaling - - s32 trackindex; // track index - u32 PTR4* tracksizes; // largest single frame of track - u32 PTR4* tracktypes; // type of each sound track - s32 PTR4* trackIDs; // external track numbers - - u32 numrects; // number of rects from BinkGetRects - - u32 playedframes; // how many frames have we played - u32 firstframetime; // very first frame start - u32 startframetime; // start frame start - u32 startblittime; // start of blit period - u32 startsynctime; // start of synched time - u32 startsyncframe; // frame of startsynctime - u32 twoframestime; // two frames worth of time - u32 entireframetime; // entire frame time - - u32 slowestframetime; // slowest frame in ms - u32 slowestframe; // slowest frame number - u32 slowest2frametime; // second slowest frame in ms - u32 slowest2frame; // second slowest frame - - u32 soundon; // sound turned on? - u32 videoon; // video turned on? - - u32 totalmem; // total memory used - u32 timevdecomp; // total time decompressing video - u32 timeadecomp; // total time decompressing audio - u32 timeblit; // total time blitting - u32 timeopen; // total open time - - u32 fileframerate; // frame rate originally in the file - u32 fileframeratediv; - - volatile u32 threadcontrol; // controls the background reading thread - - u32 runtimeframes; // max frames for runtime analysis - u32 runtimemoveamt; // bytes to move each frame - u32 PTR4* rtframetimes; // start times for runtime frames - u32 PTR4* rtadecomptimes; // decompress times for runtime frames - u32 PTR4* rtvdecomptimes; // decompress times for runtime frames - u32 PTR4* rtblittimes; // blit times for runtime frames - u32 PTR4* rtreadtimes; // read times for runtime frames - u32 PTR4* rtidlereadtimes; // idle read times for runtime frames - u32 PTR4* rtthreadreadtimes;// thread read times for runtime frames - - u32 lastblitflags; // flags used on last blit - u32 lastdecompframe; // last frame number decompressed - - u32 sndbufsize; // sound buffer size - u8 PTR4* sndbuf; // sound buffer - u8 PTR4* sndend; // end of the sound buffer - u8 PTR4* sndwritepos; // current write position - u8 PTR4* sndreadpos; // current read position - u32 sndcomp; // sound compression handle - u32 sndamt; // amount of sound currently in the buffer - volatile u32 sndreenter; // re-entrancy check on the sound - u32 sndconvert8; // convert back to 8-bit sound at runtime - BINKSND bsnd; // SND structure - u32 skippedlastblit; // skipped last frame? - u32 skippedblits; // how many blits were skipped - u32 soundskips; // number of sound stops - u32 sndendframe; // frame number that the sound ends on - u32 sndprime; // amount of data to prime the playahead - u32 sndpad; // padded this much audio - - BUNDLEPOINTERS bunp; // pointers to internal temporary memory -} BINK; - - -typedef struct BINKSUMMARY { - u32 Width; // Width of frames - u32 Height; // Height of frames - u32 TotalTime; // total time (ms) - u32 FileFrameRate; // frame rate - u32 FileFrameRateDiv; // frame rate divisor - u32 FrameRate; // frame rate - u32 FrameRateDiv; // frame rate divisor - u32 TotalOpenTime; // Time to open and prepare for decompression - u32 TotalFrames; // Total Frames - u32 TotalPlayedFrames; // Total Frames played - u32 SkippedFrames; // Total number of skipped frames - u32 SkippedBlits; // Total number of skipped blits - u32 SoundSkips; // Total number of sound skips - u32 TotalBlitTime; // Total time spent blitting - u32 TotalReadTime; // Total time spent reading - u32 TotalVideoDecompTime; // Total time spent decompressing video - u32 TotalAudioDecompTime; // Total time spent decompressing audio - u32 TotalIdleReadTime; // Total time spent reading while idle - u32 TotalBackReadTime; // Total time spent reading in background - u32 TotalReadSpeed; // Total io speed (bytes/second) - u32 SlowestFrameTime; // Slowest single frame time (ms) - u32 Slowest2FrameTime; // Second slowest single frame time (ms) - u32 SlowestFrameNum; // Slowest single frame number - u32 Slowest2FrameNum; // Second slowest single frame number - u32 AverageDataRate; // Average data rate of the movie - u32 AverageFrameSize; // Average size of the frame - u32 HighestMemAmount; // Highest amount of memory allocated - u32 TotalIOMemory; // Total extra memory allocated - u32 HighestIOUsed; // Highest extra memory actually used - u32 Highest1SecRate; // Highest 1 second rate - u32 Highest1SecFrame; // Highest 1 second start frame -} BINKSUMMARY; - - -typedef struct BINKREALTIME { - u32 FrameNum; // Current frame number - u32 FrameRate; // frame rate - u32 FrameRateDiv; // frame rate divisor - u32 Frames; // frames in this sample period - u32 FramesTime; // time is ms for these frames - u32 FramesVideoDecompTime; // time decompressing these frames - u32 FramesAudioDecompTime; // time decompressing these frames - u32 FramesReadTime; // time reading these frames - u32 FramesIdleReadTime; // time reading these frames at idle - u32 FramesThreadReadTime; // time reading these frames in background - u32 FramesBlitTime; // time blitting these frames - u32 ReadBufferSize; // size of read buffer - u32 ReadBufferUsed; // amount of read buffer currently used - u32 FramesDataRate; // data rate for these frames -} BINKREALTIME; - -#define BINKMARKER1 'fKIB' -#define BINKMARKER2 'gKIB' // new Bink files use this tag -#define BINKMARKER3 'hKIB' // newer Bink files use this tag -#define BINKMARKER4 'iKIB' // even newer Bink files use this tag - -typedef struct BINKHDR { - u32 Marker; // Bink marker - u32 Size; // size of the file-8 - u32 Frames; // Number of frames (1 based, 100 = 100 frames) - u32 LargestFrameSize; // Size in bytes of largest frame - u32 InternalFrames; // Number of internal frames - - u32 Width; // Width (1 based, 640 for example) - u32 Height; // Height (1 based, 480 for example) - u32 FrameRate; // frame rate - u32 FrameRateDiv; // frame rate divisor (framerate/frameratediv=fps) - - u32 Flags; // height compression options - u32 NumTracks; // number of tracks -} BINKHDR; - - -//======================================================================= -#define BINKFRAMERATE 0x00001000L // Override fr (call BinkFrameRate first) -#define BINKPRELOADALL 0x00002000L // Preload the entire animation -#define BINKSNDTRACK 0x00004000L // Set the track number to play -#define BINKOLDFRAMEFORMAT 0x00008000L // using the old Bink frame format (internal use only) -#define BINKRBINVERT 0x00010000L // use reversed R and B planes (internal use only) -#define BINKGRAYSCALE 0x00020000L // Force Bink to use grayscale -#define BINKNOMMX 0x00040000L // Don't use MMX -#define BINKNOSKIP 0x00080000L // Don't skip frames if falling behind -#define BINKALPHA 0x00100000L // Decompress alpha plane (if present) -#define BINKNOFILLIOBUF 0x00200000L // Fill the IO buffer in SmackOpen -#define BINKSIMULATE 0x00400000L // Simulate the speed (call BinkSim first) -#define BINKFILEHANDLE 0x00800000L // Use when passing in a file handle -#define BINKIOSIZE 0x01000000L // Set an io size (call BinkIOSize first) -#define BINKIOPROCESSOR 0x02000000L // Set an io processor (call BinkIO first) -#define BINKFROMMEMORY 0x04000000L // Use when passing in a pointer to the file -#define BINKNOTHREADEDIO 0x08000000L // Don't use a background thread for IO - -#define BINKSURFACEFAST 0x00000000L -#define BINKSURFACESLOW 0x08000000L -#define BINKSURFACEDIRECT 0x04000000L - -#define BINKCOPYALL 0x80000000L // copy all pixels (not just changed) -#define BINKCOPY2XH 0x10000000L // Force doubling height scaling -#define BINKCOPY2XHI 0x20000000L // Force interleaving height scaling -#define BINKCOPY2XW 0x30000000L // copy the width zoomed by two -#define BINKCOPY2XWH 0x40000000L // copy the width and height zoomed by two -#define BINKCOPY2XWHI 0x50000000L // copy the width and height zoomed by two -#define BINKCOPY1XI 0x60000000L // copy the width and height zoomed by two -#define BINKCOPYNOSCALING 0x70000000L // Force scaling off - -//#define BINKALPHA 0x00100000L // Decompress alpha plane (if present) -//#define BINKNOSKIP 0x00080000L // don't skip the blit if behind in sound -//#define BINKNOMMX 0x00040000L // Don't skip frames if falling behind -//#define BINKGRAYSCALE 0x00020000L // force Bink to use grayscale -//#define BINKRBINVERT 0x00010000L // use reversed R and B planes - -#define BINKSURFACE8P 0 -#define BINKSURFACE24 1 -#define BINKSURFACE24R 2 -#define BINKSURFACE32 3 -#define BINKSURFACE32R 4 -#define BINKSURFACE32A 5 -#define BINKSURFACE32RA 6 -#define BINKSURFACE4444 7 -#define BINKSURFACE5551 8 -#define BINKSURFACE555 9 -#define BINKSURFACE565 10 -#define BINKSURFACE655 11 -#define BINKSURFACE664 12 -#define BINKSURFACEYUY2 13 -#define BINKSURFACEUYVY 14 -#define BINKSURFACEYV12 15 -#define BINKSURFACEMASK 15 - -#define BINKGOTOQUICK 1 - -#define BINKGETKEYPREVIOUS 0 -#define BINKGETKEYNEXT 1 -#define BINKGETKEYCLOSEST 2 -#define BINKGETKEYNOTEQUAL 128 - -//======================================================================= - -#ifdef __RADMAC__ - #include - - #pragma export on - - RADEXPFUNC HBINK RADEXPLINK BinkMacOpen(FSSpec* fsp,u32 flags); -#endif - -RADEXPFUNC void PTR4* RADEXPLINK BinkLogoAddress(void); - -RADEXPFUNC void RADEXPLINK BinkSetError(const char PTR4* err); -RADEXPFUNC char PTR4* RADEXPLINK BinkGetError(void); - -RADEXPFUNC HBINK RADEXPLINK BinkOpen(const char PTR4* name,u32 flags); - -RADEXPFUNC s32 RADEXPLINK BinkDoFrame(HBINK bnk); -RADEXPFUNC void RADEXPLINK BinkNextFrame(HBINK bnk); -RADEXPFUNC s32 RADEXPLINK BinkWait(HBINK bnk); -RADEXPFUNC void RADEXPLINK BinkClose(HBINK bnk); -RADEXPFUNC s32 RADEXPLINK BinkPause(HBINK bnk,s32 pause); -RADEXPFUNC s32 RADEXPLINK BinkCopyToBuffer(HBINK bnk,void* dest,s32 destpitch,u32 destheight,u32 destx,u32 desty,u32 flags); -RADEXPFUNC s32 RADEXPLINK BinkGetRects(HBINK bnk,u32 flags); -RADEXPFUNC void RADEXPLINK BinkGoto(HBINK bnk,u32 frame,s32 flags); // use 1 for the first frame -RADEXPFUNC u32 RADEXPLINK BinkGetKeyFrame(HBINK bnk,u32 frame,s32 flags); - -RADEXPFUNC s32 RADEXPLINK BinkSetVideoOnOff(HBINK bnk,s32 onoff); -RADEXPFUNC s32 RADEXPLINK BinkSetSoundOnOff(HBINK bnk,s32 onoff); -RADEXPFUNC void RADEXPLINK BinkSetVolume(HBINK bnk,s32 volume); -RADEXPFUNC void RADEXPLINK BinkSetPan(HBINK bnk,s32 pan); -RADEXPFUNC void RADEXPLINK BinkService(HBINK bink); - -typedef struct BINKTRACK PTR4* HBINKTRACK; - -typedef struct BINKTRACK -{ - u32 Frequency; - u32 Bits; - u32 Channels; - u32 MaxSize; - - HBINK bink; - u32 sndcomp; - s32 trackindex; -} BINKTRACK; - - -RADEXPFUNC HBINKTRACK RADEXPLINK BinkOpenTrack(HBINK bnk,u32 trackindex); -RADEXPFUNC void RADEXPLINK BinkCloseTrack(HBINKTRACK bnkt); -RADEXPFUNC u32 RADEXPLINK BinkGetTrackData(HBINKTRACK bnkt,void PTR4* dest); - -RADEXPFUNC u32 RADEXPLINK BinkGetTrackType(HBINK bnk,u32 trackindex); -RADEXPFUNC u32 RADEXPLINK BinkGetTrackMaxSize(HBINK bnk,u32 trackindex); -RADEXPFUNC u32 RADEXPLINK BinkGetTrackID(HBINK bnk,u32 trackindex); -RADEXPFUNC u32 RADEXPLINK BinkGetTrackLargest(HBINK bnk,u32 trackindex); - -RADEXPFUNC void RADEXPLINK BinkGetSummary(HBINK bnk,BINKSUMMARY PTR4* sum); -RADEXPFUNC void RADEXPLINK BinkGetRealtime(HBINK bink,BINKREALTIME PTR4* run,u32 frames); - -#define BINKNOSOUND 0xffffffff - -RADEXPFUNC void RADEXPLINK BinkSetSoundTrack(u32 track); -RADEXPFUNC void RADEXPLINK BinkSetIO(BINKIOOPEN io); -RADEXPFUNC void RADEXPLINK BinkSetFrameRate(u32 forcerate,u32 forceratediv); -RADEXPFUNC void RADEXPLINK BinkSetSimulate(u32 sim); -RADEXPFUNC void RADEXPLINK BinkSetIOSize(u32 iosize); - -RADEXPFUNC s32 RADEXPLINK BinkSetSoundSystem(BINKSNDSYSOPEN open, u32 param); - -#ifdef __RADWIN__ - - RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenDirectSound(u32 param); // don't call directly - #define BinkSoundUseDirectSound(lpDS) BinkSetSoundSystem(BinkOpenDirectSound,(u32)lpDS) - - RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenWaveOut(u32 param); // don't call directly - #define BinkSoundUseWaveOut() BinkSetSoundSystem(BinkOpenWaveOut,0) - - #define INCLUDE_MMSYSTEM_H - #include "windows.h" - #include "windowsx.h" - - #ifdef __RADNT__ // to combat WIN32_LEAN_AND_MEAN - #include "mmsystem.h" - #endif - -#endif - - -#ifndef __RADMAC__ - - RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenMiles(u32 param); // don't call directly - #define BinkSoundUseMiles(hdigdriver) BinkSetSoundSystem(BinkOpenMiles,(u32)hdigdriver) - -#endif - - -#ifdef __RADMAC__ - - RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenSoundManager(u32 param); // don't call directly - #define BinkSoundUseSoundManager() BinkSetSoundSystem(BinkOpenSoundManager,0) - -#endif - - -// The BinkBuffer API isn't currently implemented on DOS -#if !defined(__RADDOS__) - -//========================================================================= -typedef struct BINKBUFFER * HBINKBUFFER; - -#define BINKBUFFERSTRETCHXINT 0x80000000 -#define BINKBUFFERSTRETCHX 0x40000000 -#define BINKBUFFERSHRINKXINT 0x20000000 -#define BINKBUFFERSHRINKX 0x10000000 -#define BINKBUFFERSTRETCHYINT 0x08000000 -#define BINKBUFFERSTRETCHY 0x04000000 -#define BINKBUFFERSHRINKYINT 0x02000000 -#define BINKBUFFERSHRINKY 0x01000000 -#define BINKBUFFERSCALES 0xff000000 -#define BINKBUFFERRESOLUTION 0x00800000 - -#ifdef __RADMAC__ - -#include -#include -#include - -typedef struct BINKBUFFER { - u32 Width; - u32 Height; - u32 WindowWidth; - u32 WindowHeight; - u32 SurfaceType; - void* Buffer; - s32 BufferPitch; - u32 ScreenWidth; - u32 ScreenHeight; - u32 ScreenDepth; - u32 ScaleFlags; - - s32 destx,desty; - s32 wndx,wndy; - u32 wnd; - - s32 noclipping; - u32 type; - s32 issoftcur; - u32 cursorcount; - -} BINKBUFFER; - - -#define BINKBUFFERAUTO 0 -#define BINKBUFFERDIRECT 1 -#define BINKBUFFERGWORLD 2 -#define BINKBUFFERTYPEMASK 31 - -RADEXPFUNC HBINKBUFFER RADEXPLINK BinkBufferOpen( WindowPtr wnd, u32 width, u32 height, u32 bufferflags); -RADEXPFUNC s32 RADEXPLINK BinkGDSurfaceType( GDHandle gd ); -RADEXPFUNC s32 RADEXPLINK BinkIsSoftwareCursor(GDHandle gd); -RADEXPFUNC s32 RADEXPLINK BinkCheckCursor(WindowPtr wp,s32 x,s32 y,s32 w,s32 h); - -#else - -typedef struct BINKBUFFER { - u32 Width; - u32 Height; - u32 WindowWidth; - u32 WindowHeight; - u32 SurfaceType; - void* Buffer; - s32 BufferPitch; - s32 ClientOffsetX; - s32 ClientOffsetY; - u32 ScreenWidth; - u32 ScreenHeight; - u32 ScreenDepth; - u32 ExtraWindowWidth; - u32 ExtraWindowHeight; - u32 ScaleFlags; - u32 StretchWidth; - u32 StretchHeight; - - s32 surface; - void* ddsurface; - void* ddclipper; - s32 destx,desty; - s32 wndx,wndy; - u32 wnd; - s32 ddoverlay; - s32 ddoffscreen; - s32 lastovershow; - - s32 issoftcur; - u32 cursorcount; - void* buffertop; - u32 type; - s32 noclipping; - - s32 loadeddd; - s32 loadedwin; - - void* dibh; - void* dibbuffer; - s32 dibpitch; - void* dibinfo; - u32 dibdc; - u32 diboldbitmap; - -} BINKBUFFER; - - -#define BINKBUFFERAUTO 0 -#define BINKBUFFERPRIMARY 1 -#define BINKBUFFERDIBSECTION 2 -#define BINKBUFFERYV12OVERLAY 3 -#define BINKBUFFERYUY2OVERLAY 4 -#define BINKBUFFERUYVYOVERLAY 5 -#define BINKBUFFERYV12OFFSCREEN 6 -#define BINKBUFFERYUY2OFFSCREEN 7 -#define BINKBUFFERUYVYOFFSCREEN 8 -#define BINKBUFFERRGBOFFSCREENVIDEO 9 -#define BINKBUFFERRGBOFFSCREENSYSTEM 10 -#define BINKBUFFERLAST 10 -#define BINKBUFFERTYPEMASK 31 - -RADEXPFUNC HBINKBUFFER RADEXPLINK BinkBufferOpen( HWND wnd, u32 width, u32 height, u32 bufferflags); -RADEXPFUNC s32 RADEXPLINK BinkBufferSetHWND( HBINKBUFFER buf, HWND newwnd); -RADEXPFUNC s32 RADEXPLINK BinkDDSurfaceType(void PTR4* lpDDS); -RADEXPFUNC s32 RADEXPLINK BinkIsSoftwareCursor(void PTR4* lpDDSP,HCURSOR cur); -RADEXPFUNC s32 RADEXPLINK BinkCheckCursor(HWND wnd,s32 x,s32 y,s32 w,s32 h); -RADEXPFUNC s32 RADEXPLINK BinkBufferSetDirectDraw(void PTR4* lpDirectDraw, void PTR4* lpPrimary); - -#endif - -RADEXPFUNC void RADEXPLINK BinkBufferClose( HBINKBUFFER buf); -RADEXPFUNC s32 RADEXPLINK BinkBufferLock( HBINKBUFFER buf); -RADEXPFUNC s32 RADEXPLINK BinkBufferUnlock( HBINKBUFFER buf); -RADEXPFUNC void RADEXPLINK BinkBufferSetResolution( s32 w, s32 h, s32 bits); -RADEXPFUNC void RADEXPLINK BinkBufferCheckWinPos( HBINKBUFFER buf, s32 PTR4* NewWindowX, s32 PTR4* NewWindowY); -RADEXPFUNC s32 RADEXPLINK BinkBufferSetOffset( HBINKBUFFER buf, s32 destx, s32 desty); -RADEXPFUNC void RADEXPLINK BinkBufferBlit( HBINKBUFFER buf, BINKRECT PTR4* rects, u32 numrects ); -RADEXPFUNC s32 RADEXPLINK BinkBufferSetScale( HBINKBUFFER buf, u32 w, u32 h); -RADEXPFUNC char PTR4* RADEXPLINK BinkBufferGetDescription( HBINKBUFFER buf); -RADEXPFUNC char PTR4* RADEXPLINK BinkBufferGetError(); -RADEXPFUNC s32 RADEXPLINK BinkBufferClear(HBINKBUFFER buf, u32 RGB); - -RADEXPFUNC void RADEXPLINK BinkRestoreCursor(s32 checkcount); - -#endif - -#ifdef __RADMAC__ - -#pragma export off - -#endif - -RADDEFEND - -#endif - -#endif -